From e1cb7f5a051b8dc18b7237488acef261f0875ca9 Mon Sep 17 00:00:00 2001 From: Mohammed Nihal <57055998+nihal467@users.noreply.github.com> Date: Sat, 12 Oct 2024 03:55:15 +0200 Subject: [PATCH 01/31] fix the resource update width (#8757) --- src/Components/Resource/ResourceDetails.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/Resource/ResourceDetails.tsx b/src/Components/Resource/ResourceDetails.tsx index de024f46f41..50e572f5680 100644 --- a/src/Components/Resource/ResourceDetails.tsx +++ b/src/Components/Resource/ResourceDetails.tsx @@ -253,7 +253,7 @@ export default function ResourceDetails(props: { id: string }) {
{data.title || "--"}
Update Status/Details From 401514802322c6fafd56b33b802810c1f9c0b444 Mon Sep 17 00:00:00 2001 From: Mohammed Nihal <57055998+nihal467@users.noreply.github.com> Date: Sat, 12 Oct 2024 03:57:33 +0200 Subject: [PATCH 02/31] Fixed the type issue in the cypress test file (#8766) --- cypress/e2e/assets_spec/AssetHomepage.cy.ts | 4 +- cypress/e2e/assets_spec/AssetsCreation.cy.ts | 2 +- cypress/e2e/patient_spec/PatientFileUpload.ts | 5 +- .../sample_test_spec/SampleTestHomepage.cy.ts | 8 +-- cypress/pageobject/Asset/AssetCreation.ts | 20 +++---- cypress/pageobject/Asset/AssetFilters.ts | 8 +-- .../pageobject/Facility/FacilityCreation.ts | 24 ++++----- cypress/pageobject/Facility/FacilityHome.ts | 4 +- cypress/pageobject/Facility/FacilityManage.ts | 23 ++++---- .../pageobject/Patient/PatientConsultation.ts | 7 +-- cypress/pageobject/Patient/PatientCreation.ts | 34 ++++++------ cypress/pageobject/Patient/PatientHome.ts | 6 +-- .../pageobject/Patient/PatientInsurance.ts | 10 ++-- .../pageobject/Patient/PatientLogupdate.ts | 8 +-- .../Patient/PatientMedicalHistory.ts | 22 ++++---- cypress/pageobject/Resource/ResourcePage.ts | 14 ++--- cypress/pageobject/Users/ManageUserPage.ts | 26 ++++----- cypress/support/commands.ts | 54 +++++++++++-------- cypress/tsconfig.json | 6 +-- package-lock.json | 9 +++- package.json | 3 +- 21 files changed, 151 insertions(+), 146 deletions(-) diff --git a/cypress/e2e/assets_spec/AssetHomepage.cy.ts b/cypress/e2e/assets_spec/AssetHomepage.cy.ts index f462bda4327..57c315bb0c4 100644 --- a/cypress/e2e/assets_spec/AssetHomepage.cy.ts +++ b/cypress/e2e/assets_spec/AssetHomepage.cy.ts @@ -99,9 +99,9 @@ describe("Asset Tab", () => { it("Export asset", () => { assetPage.selectassetimportbutton(); cy.wait(2000); - assetPage.selectjsonexportbutton(); + assetPage.selectJsonExportButton(); assetPage.selectassetimportbutton(); - assetPage.selectcsvexportbutton(); + assetPage.selectCsvExportButton(); }); afterEach(() => { diff --git a/cypress/e2e/assets_spec/AssetsCreation.cy.ts b/cypress/e2e/assets_spec/AssetsCreation.cy.ts index 1bcd984a7a3..6d94108b362 100644 --- a/cypress/e2e/assets_spec/AssetsCreation.cy.ts +++ b/cypress/e2e/assets_spec/AssetsCreation.cy.ts @@ -129,7 +129,7 @@ describe("Asset", () => { "d5694af2-21e2-4a39-9bad-2fb98d9818bd", ); assetPage.clickConfigureAsset(); - assetPage.verifyAssetConfiguration(200); + assetPage.verifyAssetConfiguration(); }); it("Add an vital monitor asset and configure it", () => { diff --git a/cypress/e2e/patient_spec/PatientFileUpload.ts b/cypress/e2e/patient_spec/PatientFileUpload.ts index 9d6852d16e7..7e5a3073179 100644 --- a/cypress/e2e/patient_spec/PatientFileUpload.ts +++ b/cypress/e2e/patient_spec/PatientFileUpload.ts @@ -5,7 +5,10 @@ const loginPage = new LoginPage(); const patientPage = new PatientPage(); const patientFileUpload = new PatientFileUpload(); -function runTests(testDescription, visitPatientFileUploadSection) { +function runTests( + testDescription: string, + visitPatientFileUploadSection: () => void, +) { describe(testDescription, () => { const cypressAudioName = "cypress audio"; const cypressFileName = "cypress name"; diff --git a/cypress/e2e/sample_test_spec/SampleTestHomepage.cy.ts b/cypress/e2e/sample_test_spec/SampleTestHomepage.cy.ts index 1af1cfc5cb4..98d69ccff41 100644 --- a/cypress/e2e/sample_test_spec/SampleTestHomepage.cy.ts +++ b/cypress/e2e/sample_test_spec/SampleTestHomepage.cy.ts @@ -13,18 +13,14 @@ describe("Sample List", () => { it("Search by District name", () => { cy.intercept(/\/api\/v1\/test_sample/).as("test_sample"); cy.get("[name='district_name']").type("Test"); - cy.wait("@test_sample").then((interception) => { - expect(interception.response.statusCode).to.equal(200); - }); + cy.wait("@test_sample").its("response.statusCode").should("eq", 200); cy.url().should("include", "Test"); }); it("Search by Patient Name", () => { cy.intercept(/\/api\/v1\/test_sample/).as("test_sample"); cy.get("[name='patient_name']").type("Test"); - cy.wait("@test_sample").then((interception) => { - expect(interception.response.statusCode).to.equal(200); - }); + cy.wait("@test_sample").its("response.statusCode").should("eq", 200); cy.url().should("include", "Test"); }); diff --git a/cypress/pageobject/Asset/AssetCreation.ts b/cypress/pageobject/Asset/AssetCreation.ts index 41d3c4ca8d0..d6991e82ff0 100644 --- a/cypress/pageobject/Asset/AssetCreation.ts +++ b/cypress/pageobject/Asset/AssetCreation.ts @@ -149,10 +149,8 @@ export class AssetPage { cy.intercept(/\/api\/v1\/asset/).as("asset"); } - verifyAssetConfiguration(statusCode: number) { - cy.wait("@asset").then((interception) => { - expect(interception.response.statusCode).to.equal(statusCode); - }); + verifyAssetConfiguration() { + cy.wait("@asset").its("response.statusCode").should("eq", 200); } clickConfigureAsset() { @@ -222,22 +220,16 @@ export class AssetPage { cy.get("[data-testid=import-asset-button]").click(); } - selectjsonexportbutton() { + selectJsonExportButton() { cy.intercept("GET", "**/api/v1/asset/?**json=true**").as("getJsonexport"); cy.get("#export-json-option").click(); - cy.wait("@getJsonexport").then(({ request, response }) => { - expect(response.statusCode).to.eq(200); - expect(request.url).to.include("json=true"); - }); + cy.wait("@getJsonexport").its("response.statusCode").should("eq", 200); } - selectcsvexportbutton() { + selectCsvExportButton() { cy.intercept("GET", "**/api/v1/asset/?**csv=true**").as("getCsvexport"); cy.get("#export-csv-option").click(); - cy.wait("@getCsvexport").then(({ request, response }) => { - expect(response.statusCode).to.eq(200); - expect(request.url).to.include("csv=true"); - }); + cy.wait("@getCsvexport").its("response.statusCode").should("eq", 200); } selectImportOption() { diff --git a/cypress/pageobject/Asset/AssetFilters.ts b/cypress/pageobject/Asset/AssetFilters.ts index ac83ca97c0b..5a942b22f47 100644 --- a/cypress/pageobject/Asset/AssetFilters.ts +++ b/cypress/pageobject/Asset/AssetFilters.ts @@ -56,16 +56,16 @@ export class AssetFilters { cy.get("#close-slide-over").click(); } // Assertions - assertFacilityText(text) { + assertFacilityText(text: string) { cy.get("[data-testid=Facility]").should("contain", text); } - assertAssetClassText(text) { + assertAssetClassText(text: string) { cy.get("[data-testid='Asset Class']").should("contain", text); } - assertStatusText(text) { + assertStatusText(text: string) { cy.get("[data-testid=Status]").should("contain", text); } - assertLocationText(text) { + assertLocationText(text: string) { cy.get("[data-testid=Location]").should("contain", text); } } diff --git a/cypress/pageobject/Facility/FacilityCreation.ts b/cypress/pageobject/Facility/FacilityCreation.ts index a1676e625dd..26f387935ac 100644 --- a/cypress/pageobject/Facility/FacilityCreation.ts +++ b/cypress/pageobject/Facility/FacilityCreation.ts @@ -9,7 +9,7 @@ class FacilityPage { .should("eq", 200); } - typeFacilitySearch(facilityName) { + typeFacilitySearch(facilityName: string) { cy.get("#search").click().clear(); cy.get("#search").click().type(facilityName); } @@ -21,7 +21,7 @@ class FacilityPage { cy.get("#manage-facility-dropdown button").should("be.visible"); } - clickUpdateFacilityType(facilityType) { + clickUpdateFacilityType(facilityType: string) { cy.get("#facility_type") .click() .then(() => { @@ -225,11 +225,11 @@ class FacilityPage { } fillTriageEntryFields( - visited, - homeQuarantine, - isolation, - referred, - confirmedPositive, + visited: string, + homeQuarantine: string, + isolation: string, + referred: string, + confirmedPositive: string, ) { cy.get("#num_patients_visited").clear().click().type(visited); cy.get("#num_patients_home_quarantine") @@ -244,7 +244,7 @@ class FacilityPage { .type(confirmedPositive); } - fillEntryDate(date) { + fillEntryDate(date: string) { cy.get("#entry_date").click(); cy.get("#date-input").click().type(date); } @@ -253,13 +253,13 @@ class FacilityPage { cy.get("#edit-button").click(); } - clickButtonsMultipleTimes(selector) { + clickButtonsMultipleTimes(selector: string) { cy.get(selector).each(($button) => { cy.wrap($button).click(); }); } - verifyTriageTableContains(value) { + verifyTriageTableContains(value: string) { cy.get("#triage-table").contains(value); } @@ -430,7 +430,7 @@ class FacilityPage { return cy.get("#district"); } - selectStateOnPincode(stateName) { + selectStateOnPincode(stateName: string) { this.getStateElement() .scrollIntoView() .wait(2000) @@ -444,7 +444,7 @@ class FacilityPage { }); } - selectDistrictOnPincode(districtName) { + selectDistrictOnPincode(districtName: string) { this.getDistrictElement() .scrollIntoView() .wait(2000) diff --git a/cypress/pageobject/Facility/FacilityHome.ts b/cypress/pageobject/Facility/FacilityHome.ts index 956c374ada4..e021171ff0a 100644 --- a/cypress/pageobject/Facility/FacilityHome.ts +++ b/cypress/pageobject/Facility/FacilityHome.ts @@ -53,7 +53,7 @@ class FacilityHome { cy.get("#facility-detailspage-cns").click(); } - selectLocation(location) { + selectLocation(location: string) { cy.get("#location").click().type(location); cy.get("li[role=option]").contains(location).click(); } @@ -99,7 +99,7 @@ class FacilityHome { return cy.url(); } - verifyURLContains(searchText) { + verifyURLContains(searchText: string) { const encodedText = encodeURIComponent(searchText).replace(/%20/g, "+"); this.getURL().should("include", `search=${encodedText}`); } diff --git a/cypress/pageobject/Facility/FacilityManage.ts b/cypress/pageobject/Facility/FacilityManage.ts index 9e41d5d0290..52a432abe59 100644 --- a/cypress/pageobject/Facility/FacilityManage.ts +++ b/cypress/pageobject/Facility/FacilityManage.ts @@ -7,17 +7,17 @@ class FacilityManage { cy.get("#upload-cover-image").should("be.visible"); } - uploadCoverImage(fileName) { + uploadCoverImage(fileName: string) { cy.get("#upload-cover-image") .selectFile(`cypress/fixtures/${fileName}`, { force: true }) .wait(100); // Adjust the wait time as needed } - verifyTotalDoctorCapacity(expectedCapacity) { + verifyTotalDoctorCapacity(expectedCapacity: string) { cy.get("#facility-doctor-totalcapacity").contains(expectedCapacity); } - verifyFacilityBedCapacity(expectedCapacity) { + verifyFacilityBedCapacity(expectedCapacity: string) { cy.get("#facility-bed-capacity-details").contains(expectedCapacity); } @@ -51,15 +51,15 @@ class FacilityManage { cy.get("#middleware_address").should("be.visible"); } - clickButtonWithText(text) { + clickButtonWithText(text: string) { cy.get("button#submit").contains(text).click(); } - checkErrorMessageVisibility(text) { + checkErrorMessageVisibility(text: string) { cy.get(".error-text").contains(text).should("be.visible"); } - typeMiddlewareAddress(address) { + typeMiddlewareAddress(address: string) { cy.get("#middleware_address").click().clear().click().type(address); } @@ -67,11 +67,14 @@ class FacilityManage { cy.get("#hf_id").click().clear(); } - typeHfrId(address) { + typeHfrId(address: string) { cy.get("#hf_id").click().clear().click().type(address); } - verifySuccessMessageVisibilityAndContent(text, isRegex = false) { + verifySuccessMessageVisibilityAndContent( + text: string | RegExp, + isRegex = false, + ) { if (isRegex) { cy.get(".pnotify-text").should("be.visible").contains(text); } else { @@ -79,11 +82,11 @@ class FacilityManage { } } - verifyMiddlewareAddressValue(expectedValue) { + verifyMiddlewareAddressValue(expectedValue: string) { cy.get("#middleware_address").should("have.value", expectedValue); } - verifyHfrIdValue(expectedValue) { + verifyHfrIdValue(expectedValue: string) { cy.get("#hf_id").should("have.value", expectedValue); } diff --git a/cypress/pageobject/Patient/PatientConsultation.ts b/cypress/pageobject/Patient/PatientConsultation.ts index cc5b8e19465..21da5243500 100644 --- a/cypress/pageobject/Patient/PatientConsultation.ts +++ b/cypress/pageobject/Patient/PatientConsultation.ts @@ -6,9 +6,10 @@ export class PatientConsultationPage { cy.clickAndSelectOption("#route_to_facility", status); } - typeAndMultiSelectSymptoms(input, symptoms) { + typeAndMultiSelectSymptoms(input: string, symptoms: string[]) { cy.typeAndMultiSelectOption("#additional_symptoms", input, symptoms); } + selectSymptomsDate(date: string) { cy.clickAndTypeDate("#symptoms_onset_date", date); } @@ -48,7 +49,7 @@ export class PatientConsultationPage { cy.get("#death_confirmed_doctor").click().type(doctor); } - selectPatientDiagnosis(icdCode, statusId) { + selectPatientDiagnosis(icdCode: string, statusId: string) { cy.searchAndSelectOption("#icd11-search", icdCode); cy.get("#diagnosis-list") .contains("Add as") @@ -92,7 +93,7 @@ export class PatientConsultationPage { cy.clickAndSelectOption("#principal-diagnosis-select", diagnosis); } - verifyTextInConsultation(selector, text) { + verifyTextInConsultation(selector: string, text: string) { cy.get(selector).scrollIntoView(); cy.get(selector).contains(text).should("be.visible"); } diff --git a/cypress/pageobject/Patient/PatientCreation.ts b/cypress/pageobject/Patient/PatientCreation.ts index e037f0888f0..0ec505a47a0 100644 --- a/cypress/pageobject/Patient/PatientCreation.ts +++ b/cypress/pageobject/Patient/PatientCreation.ts @@ -10,7 +10,7 @@ export class PatientPage { cy.wait("@getFacilities").its("response.statusCode").should("eq", 200); } - visitPatient(patientName) { + visitPatient(patientName: string) { cy.get("#name").click().type(patientName); cy.intercept("GET", "**/api/v1/consultation/**").as("getPatient"); cy.get("#patient-name-list").contains(patientName).click(); @@ -165,16 +165,16 @@ export class PatientPage { } verifyPatientDashboardDetails( - gender, - age, - patientName, - phoneNumber, - emergencyPhoneNumber, - yearOfBirth, - bloodGroup, - occupation, - socioeconomicStatus = null, - domesticHealthcareSupport = null, + gender: string, + age: number, + patientName: string, + phoneNumber: string, + emergencyPhoneNumber: string, + yearOfBirth: string, + bloodGroup: string, + occupation: string, + socioeconomicStatus: string | null = null, + domesticHealthcareSupport: string | null = null, isAntenatal = false, isPostPartum = false, ) { @@ -202,12 +202,12 @@ export class PatientPage { } verifyPatientLocationDetails( - patientAddress, - patientPincode, - patientState, - patientDistrict, - patientLocalbody, - patientWard, + patientAddress: string, + patientPincode: number, + patientState: string, + patientDistrict: string, + patientLocalbody: string, + patientWard: string, ) { cy.get("[data-testid=patient-details]").then(($dashboard) => { cy.url().should("include", "/facility/"); diff --git a/cypress/pageobject/Patient/PatientHome.ts b/cypress/pageobject/Patient/PatientHome.ts index d2f4efdc877..4f953adf78b 100644 --- a/cypress/pageobject/Patient/PatientHome.ts +++ b/cypress/pageobject/Patient/PatientHome.ts @@ -27,11 +27,7 @@ class PatientHome { } verifyPatientExportRequest() { - cy.wait("@getPatients").then((interception) => { - expect(interception.request.url).to.include("/api/v1/patient/"); - expect(interception.request.url).to.include("&csv"); - expect(interception.response.statusCode).to.eq(200); - }); + cy.wait("@getPatients").its("response.statusCode").should("eq", 200); } typePatientModifiedBeforeDate(startDate: string) { diff --git a/cypress/pageobject/Patient/PatientInsurance.ts b/cypress/pageobject/Patient/PatientInsurance.ts index bdd571e9d0c..1b91d27b629 100644 --- a/cypress/pageobject/Patient/PatientInsurance.ts +++ b/cypress/pageobject/Patient/PatientInsurance.ts @@ -47,11 +47,11 @@ class PatientInsurance { } verifyPatientPolicyDetails( - subscriberId, - policyId, - insurerId, - insurerName, - isHcxEnabled, + subscriberId: string, + policyId: string, + insurerId: string, + insurerName: string, + isHcxEnabled: string, ) { cy.get("[data-testid=patient-details]").then(($dashboard) => { cy.url().should("include", "/facility/"); diff --git a/cypress/pageobject/Patient/PatientLogupdate.ts b/cypress/pageobject/Patient/PatientLogupdate.ts index add3fbb0590..b2822d03353 100644 --- a/cypress/pageobject/Patient/PatientLogupdate.ts +++ b/cypress/pageobject/Patient/PatientLogupdate.ts @@ -32,7 +32,7 @@ class PatientLogupdate { cy.get("#other_details").click().type(details); } - typeAndMultiSelectSymptoms(input, symptoms) { + typeAndMultiSelectSymptoms(input: string, symptoms: string[]) { cy.typeAndMultiSelectOption("#additional_symptoms", input, symptoms); } selectSymptomsDate(date: string) { @@ -74,14 +74,14 @@ class PatientLogupdate { cy.get("#rhythm_detail").click().type(rhythm); } - clickLogUpdateViewDetails(element, patientCategory) { + clickLogUpdateViewDetails(element: string, patientCategory: string) { cy.get(element).scrollIntoView(); cy.verifyContentPresence(element, [patientCategory]); cy.get(element).first().contains("View Details").click(); cy.wait(3000); } - clickLogUpdateUpdateLog(element, patientCategory) { + clickLogUpdateUpdateLog(element: string, patientCategory: string) { cy.get(element).scrollIntoView(); cy.verifyContentPresence(element, [patientCategory]); cy.get(element).first().contains("Update Log").click(); @@ -93,7 +93,7 @@ class PatientLogupdate { cy.wait(3000); } - clickClearButtonInElement(elementId) { + clickClearButtonInElement(elementId: string) { cy.get(elementId).find("#clear-button").click(); } diff --git a/cypress/pageobject/Patient/PatientMedicalHistory.ts b/cypress/pageobject/Patient/PatientMedicalHistory.ts index a0dbdd0131a..93fdd1b38b3 100644 --- a/cypress/pageobject/Patient/PatientMedicalHistory.ts +++ b/cypress/pageobject/Patient/PatientMedicalHistory.ts @@ -11,7 +11,7 @@ class PatientMedicalHistory { cy.get("#allergies").click().type(allergies); } - typeMedicalHistory(index, text) { + typeMedicalHistory(index: number, text: string) { cy.get(`#medical_history_check_${index}`).click(); cy.get(`#medical_history_${index}`).click().type(text); } @@ -22,16 +22,16 @@ class PatientMedicalHistory { } verifyPatientMedicalDetails( - patientPresentHealth, - patientOngoingMedication, - patientAllergies, - patientSymptoms1, - patientSymptoms2, - patientSymptoms3, - patientSymptoms4, - patientSymptoms5, - patientSymptoms6, - patientSymptoms7, + patientPresentHealth: string, + patientOngoingMedication: string, + patientAllergies: string, + patientSymptoms1: string, + patientSymptoms2: string, + patientSymptoms3: string, + patientSymptoms4: string, + patientSymptoms5: string, + patientSymptoms6: string, + patientSymptoms7: string, ) { cy.get("[data-testid=patient-details]").then(($dashboard) => { cy.url().should("include", "/facility/"); diff --git a/cypress/pageobject/Resource/ResourcePage.ts b/cypress/pageobject/Resource/ResourcePage.ts index e4078fcb317..730d3dd9148 100644 --- a/cypress/pageobject/Resource/ResourcePage.ts +++ b/cypress/pageobject/Resource/ResourcePage.ts @@ -4,9 +4,9 @@ class ResourcePage { cy.get("svg.care-svg-icon__baseline.care-l-export").each(($button) => { cy.intercept(/\/api\/v1\/resource/).as("resource_download"); cy.wrap($button).click({ force: true }); - cy.wait("@resource_download").then((interception) => { - expect(interception.response.statusCode).to.equal(200); - }); + cy.wait("@resource_download") + .its("response.statusCode") + .should("eq", 200); }); } @@ -19,9 +19,7 @@ class ResourcePage { } verifyCompletedResources() { - cy.wait("@resource").then((interception) => { - expect(interception.response.statusCode).to.equal(200); - }); + cy.wait("@resource").its("response.statusCode").should("eq", 200); cy.contains("button", "Active").should("have.class", "text-primary-500"); cy.contains("button", "Completed").should("have.class", "text-white"); } @@ -31,9 +29,7 @@ class ResourcePage { } verifyActiveResources() { - cy.wait("@resource").then((interception) => { - expect(interception.response.statusCode).to.equal(200); - }); + cy.wait("@resource").its("response.statusCode").should("eq", 200); cy.contains("button", "Active").should("have.class", "text-white"); cy.contains("button", "Completed").should("have.class", "text-primary-500"); } diff --git a/cypress/pageobject/Users/ManageUserPage.ts b/cypress/pageobject/Users/ManageUserPage.ts index f3e0deca53b..a9ac1374085 100644 --- a/cypress/pageobject/Users/ManageUserPage.ts +++ b/cypress/pageobject/Users/ManageUserPage.ts @@ -1,5 +1,5 @@ export class ManageUserPage { - assertHomeFacility(expectedText) { + assertHomeFacility(expectedText: string) { cy.get("#home_facility").should("contain.text", expectedText); } @@ -7,11 +7,11 @@ export class ManageUserPage { cy.get("#facilities").click(); } - selectFacilityFromDropdown(facilityName) { + selectFacilityFromDropdown(facilityName: string) { cy.searchAndSelectOption("input[name='facility']", facilityName); } - selectSkillFromDropdown(skill) { + selectSkillFromDropdown(skill: string) { cy.searchAndSelectOption("input[name='skill']", skill); } @@ -19,11 +19,11 @@ export class ManageUserPage { cy.get("#link-facility").click(); } - assertLinkedFacility(facilityName) { + assertLinkedFacility(facilityName: string) { cy.get("#linked-facility-list").should("contain.text", facilityName); } - assertnotLinkedFacility(facilityName) { + assertnotLinkedFacility(facilityName: string) { cy.get("#linked-facility-list").should("not.contain", facilityName); } @@ -31,11 +31,11 @@ export class ManageUserPage { cy.get("#linked-facility-list").should("not.exist"); } - assertHomeFacilitylink(facilityName) { + assertHomeFacilitylink(facilityName: string) { cy.get("#home-facility").should("contain.text", facilityName); } - assertFacilityNotInDropdown(facilityName) { + assertFacilityNotInDropdown(facilityName: string) { cy.get("input[name='facility']").click().type(facilityName); cy.get("[role='option']").should("not.exist"); } @@ -93,12 +93,12 @@ export class ManageUserPage { cy.visit("/facility"); } - typeFacilitySearch(facilityName) { + typeFacilitySearch(facilityName: string) { cy.get("#search").click().clear(); cy.get("#search").click().type(facilityName); } - assertFacilityInCard(facilityName) { + assertFacilityInCard(facilityName: string) { cy.get("#facility-name-card").should("contain", facilityName); } @@ -117,13 +117,13 @@ export class ManageUserPage { cy.wait("@getSkills").its("response.statusCode").should("eq", 200); } - assertSkillInAlreadyLinkedSkills(skillName) { + assertSkillInAlreadyLinkedSkills(skillName: string) { cy.get("#already-linked-skills") .contains(skillName) .should("have.length", 1); } - assertSkillIndoctorconnect(skillName) { + assertSkillIndoctorconnect(skillName: string) { cy.get("#doctor-connect-home-doctor") .contains(skillName) .should("have.length", 1); @@ -137,11 +137,11 @@ export class ManageUserPage { cy.get("#unlink-skill").click(); } - assertSkillInAddedUserSkills(skillName) { + assertSkillInAddedUserSkills(skillName: string) { cy.get("#added-user-skills").should("contain", skillName); } - assertDoctorConnectVisibility(realName) { + assertDoctorConnectVisibility(realName: string) { cy.get('*[id="doctor-connect-home-doctor"]').should( "contain.text", realName, diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 86d048e5f41..320f19d8b0e 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -38,8 +38,8 @@ Cypress.Commands.add("refreshApiLogin", (username, password) => { Cypress.Commands.add("loginByApi", (username, password) => { cy.log(`Logging in the user: ${username}:${password}`); cy.task("readFileMaybe", "cypress/fixtures/token.json").then( - (tkn: string) => { - const token = JSON.parse(tkn); + (tkn: unknown) => { + const token = JSON.parse(tkn as string); // Cast tkn to string if (tkn && token.access && token.username === username) { cy.request({ method: "POST", @@ -66,21 +66,6 @@ Cypress.Commands.add("loginByApi", (username, password) => { ); }); -Cypress.Commands.add( - "awaitUrl", - (url: string, disableLoginVerification = false) => { - cy.intercept(/getcurrentuser/).as("currentuser"); - cy.visit(url); - disableLoginVerification - ? cy.wait("@currentuser") - : cy.wait("@currentuser").its("response.statusCode").should("eq", 200); - }, -); - -Cypress.Commands.add("verifyNotification", (text) => { - return cy.get(".pnotify-container").should("exist").contains(text); -}); - Cypress.on("uncaught:exception", () => { // returning false here prevents Cypress from // failing the test @@ -94,19 +79,44 @@ Cypress.on("uncaught:exception", () => { * Waits until the selector finds an attached element, then yields it (wrapped). * selectorFn, if provided, is passed $(document). Don't use cy methods inside selectorFn. */ -Cypress.Commands.add("getAttached", (selector) => { +Cypress.Commands.add("getAttached", (selector: string) => { const getElement = - typeof selector === "function" ? selector : ($d) => $d.find(selector); - let $el = null; + typeof selector === "function" + ? selector + : ($d: JQuery) => + $d.find(selector) as unknown as JQuery; + + let $el: JQuery | null = null; + return cy .document() - .should(($d) => { + .should(($d: Document) => { $el = getElement(Cypress.$($d)); - expect(Cypress.dom.isDetached($el)).to.be.false; + // Ensure $el is an HTMLElement before checking if it is detached + if ($el.length && $el[0] instanceof HTMLElement) { + expect(Cypress.dom.isDetached($el[0])).to.be.false; // Access the first HTMLElement + } else { + throw new Error("Element is not an HTMLElement or is detached."); + } }) .then(() => cy.wrap($el)); }); +Cypress.Commands.add( + "awaitUrl", + (url: string, disableLoginVerification = false) => { + cy.intercept(/getcurrentuser/).as("currentuser"); + cy.visit(url); + disableLoginVerification + ? cy.wait("@currentuser") + : cy.wait("@currentuser").its("response.statusCode").should("eq", 200); + }, +); + +Cypress.Commands.add("verifyNotification", (text) => { + return cy.get(".pnotify-container").should("exist").contains(text); +}); + Cypress.Commands.add("clearAllFilters", () => { return cy.get("#clear-all-filters").click(); }); diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json index 9c019786170..0fd7f9e340b 100644 --- a/cypress/tsconfig.json +++ b/cypress/tsconfig.json @@ -1,11 +1,11 @@ { "compilerOptions": { - "baseUrl": "../node_modules", + "baseUrl": "./", "target": "es5", "lib": ["es5", "dom", "es2015", "es2016", "es2017", "es2018", "es2019", "es2020"], "types": ["cypress"], "typeRoots": ["./support"], "resolveJsonModule": true }, - "include": ["**/*.ts", "support/commands.js"], -} + "include": ["**/*.cy.ts", "support/commands.ts","**/*.ts"], +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 59a22853fd5..6d2da7a4750 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,10 +76,11 @@ "@types/react-csv": "^1.1.10", "@types/react-dom": "^18.3.0", "@types/react-google-recaptcha": "^2.1.9", + "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^7.18.0", "@vitejs/plugin-react-swc": "^3.6.0", "autoprefixer": "^10.4.19", - "cypress": "^13.14.2", + "cypress": "^13.15.0", "cypress-localstorage-commands": "^2.2.5", "cypress-split": "^1.23.2", "eslint-config-prettier": "^9.1.0", @@ -4709,6 +4710,12 @@ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true + }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", diff --git a/package.json b/package.json index 68de432e82e..eb1c851bc0d 100644 --- a/package.json +++ b/package.json @@ -111,10 +111,11 @@ "@types/react-csv": "^1.1.10", "@types/react-dom": "^18.3.0", "@types/react-google-recaptcha": "^2.1.9", + "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^7.18.0", "@vitejs/plugin-react-swc": "^3.6.0", "autoprefixer": "^10.4.19", - "cypress": "^13.14.2", + "cypress": "^13.15.0", "cypress-localstorage-commands": "^2.2.5", "cypress-split": "^1.23.2", "eslint-config-prettier": "^9.1.0", From 31c41ae637e1358944b329cd2cdfbe3c598c0810 Mon Sep 17 00:00:00 2001 From: Mohammed Nihal <57055998+nihal467@users.noreply.github.com> Date: Sat, 12 Oct 2024 04:10:58 +0200 Subject: [PATCH 03/31] New Cypress Test | Patient Details Advance Filters (#8750) --- .../e2e/patient_spec/PatientHomepage.cy.ts | 128 +++++++++++ .../pageobject/Patient/PatientConsultation.ts | 10 +- cypress/pageobject/Patient/PatientCreation.ts | 4 +- .../pageobject/Patient/PatientDischarge.ts | 2 +- cypress/pageobject/Patient/PatientHome.ts | 214 ++++++++++++++++++ .../pageobject/Patient/PatientLogupdate.ts | 14 +- .../pageobject/Patient/PatientPrescription.ts | 2 +- .../Patient/PatientTreatmentPlan.ts | 4 +- cypress/pageobject/Users/ManageUserPage.ts | 4 +- cypress/pageobject/Users/UserSearch.ts | 6 +- cypress/support/commands.ts | 2 +- cypress/support/index.ts | 2 +- src/Components/Patient/DiagnosesFilter.tsx | 1 + src/Components/Patient/ManagePatients.tsx | 2 +- src/Components/Patient/PatientFilter.tsx | 13 +- 15 files changed, 380 insertions(+), 28 deletions(-) diff --git a/cypress/e2e/patient_spec/PatientHomepage.cy.ts b/cypress/e2e/patient_spec/PatientHomepage.cy.ts index 0cf5936594d..188b6bc9457 100644 --- a/cypress/e2e/patient_spec/PatientHomepage.cy.ts +++ b/cypress/e2e/patient_spec/PatientHomepage.cy.ts @@ -4,6 +4,24 @@ import PatientHome from "../../pageobject/Patient/PatientHome"; describe("Patient Homepage present functionalities", () => { const loginPage = new LoginPage(); const patientHome = new PatientHome(); + const patientGender = "Male"; + const patientCategory = "Moderate"; + const patientMinimumAge = "18"; + const patientMaximumAge = "24"; + const patientLastAdmittedBed = "No bed assigned"; + const PatientLastConsentType = "No consents"; + const patientTelemedicinePerference = "No"; + const patientReviewStatus = "No"; + const patientMedicoStatus = "Non-Medico-Legal"; + const patientIcdDiagnosis = "1A00"; + const facilityName = "Dummy Facility 40"; + const facilityType = "Private Hospital"; + const facilityLsgBody = "Aikaranad Grama Panchayat, Ernakulam District"; + const facilityDistrict = "Ernakulam"; + const patientFromDate = "01122023"; + const patientToDate = "07122023"; + const patientFromDateBadge = "2023-12-01"; + const patientToDateBadge = "2023-12-07"; before(() => { loginPage.loginAsDisctrictAdmin(); @@ -16,6 +34,116 @@ describe("Patient Homepage present functionalities", () => { cy.awaitUrl("/patients"); }); + it("Date based advance filters applied in the patient tab", () => { + patientHome.clickPatientAdvanceFilters(); + patientHome.typePatientCreatedBeforeDate(patientFromDate); + patientHome.typePatientCreatedAfterDate(patientToDate); + patientHome.typePatientModifiedBeforeDate(patientFromDate); + patientHome.typePatientModifiedAfterDate(patientToDate); + patientHome.typePatientAdmitedBeforeDate(patientFromDate); + patientHome.typePatientAdmitedAfterDate(patientToDate); + patientHome.clickPatientFilterApply(); + patientHome.verifyTotalPatientCount("1"); + // verify the badge and clear the count + patientHome.verifyPatientCreatedBeforeDate(patientToDateBadge); + patientHome.verifyPatientCreatedAfterDate(patientFromDateBadge); + patientHome.verifyPatientModifiedBeforeDate(patientToDateBadge); + patientHome.verifyPatientModifiedAfterDate(patientFromDateBadge); + patientHome.verifyPatientAdmittedBeforeDate(patientToDateBadge); + patientHome.verifyPatientAdmittedAfterDate(patientFromDateBadge); + cy.clearAllFilters(); + patientHome.verifyTotalPatientCount("1"); + }); + + it("Facility Geography based advance filters applied in the patient tab", () => { + patientHome.clickPatientAdvanceFilters(); + patientHome.typeFacilityName(facilityName); + patientHome.selectFacilityType(facilityType); + patientHome.typeFacilityLsgBody(facilityLsgBody); + patientHome.typeFacilityDistrict(facilityDistrict); + patientHome.clickPatientFilterApply(); + patientHome.verifyTotalPatientCount("1"); + // Clear the badges and verify the patient count along with badges + patientHome.verifyFacilityNameBadgeContent(facilityName); + patientHome.verifyFacilityTypeBadgeContent(facilityType); + patientHome.verifyFacilityLsgBadgeContent(facilityLsgBody); + patientHome.verifyFacilityDistrictContent(facilityDistrict); + cy.clearAllFilters(); + patientHome.verifyTotalPatientCount("1"); + }); + + it("Patient diagnosis based advance filters applied in the patient tab", () => { + // Patient Filtering based on icd-11 data + patientHome.clickPatientAdvanceFilters(); + patientHome.selectAnyIcdDiagnosis(patientIcdDiagnosis, patientIcdDiagnosis); + patientHome.selectConfirmedIcdDiagnosis( + patientIcdDiagnosis, + patientIcdDiagnosis, + ); + patientHome.selectUnconfirmedIcdDiagnosis( + patientIcdDiagnosis, + patientIcdDiagnosis, + ); + patientHome.selectProvisionalIcdDiagnosis( + patientIcdDiagnosis, + patientIcdDiagnosis, + ); + patientHome.selectDifferentialIcdDiagnosis( + patientIcdDiagnosis, + patientIcdDiagnosis, + ); + patientHome.clickPatientFilterApply(); + patientHome.verifyTotalPatientCount("0"); + // verify the badges presence in the platform + patientHome.verifyAnyDiagnosisBadgeContent(patientIcdDiagnosis); + patientHome.verifyConfirmedDiagnosisBadgeContent(patientIcdDiagnosis); + patientHome.verifyUnconfirmedDiagnosisBadgeContent(patientIcdDiagnosis); + patientHome.verifyProvisionalDiagnosisBadgeContent(patientIcdDiagnosis); + patientHome.verifyDifferentialDiagnosisBadgeContent(patientIcdDiagnosis); + // Clear the badges and verify the patient count along with badges + cy.clearAllFilters(); + patientHome.verifyTotalPatientCount("1"); + // Apply Any and confirmed diagonsis to verify patient count 17 + patientHome.clickPatientAdvanceFilters(); + patientHome.selectAnyIcdDiagnosis(patientIcdDiagnosis, patientIcdDiagnosis); + patientHome.selectConfirmedIcdDiagnosis( + patientIcdDiagnosis, + patientIcdDiagnosis, + ); + patientHome.clickPatientFilterApply(); + patientHome.verifyTotalPatientCount("1"); + }); + + it("Patient Details based advance filters applied in the patient tab", () => { + // Patient Filtering based on patient details + patientHome.clickPatientAdvanceFilters(); + patientHome.selectPatientGenderfilter(patientGender); + patientHome.selectPatientCategoryfilter(patientCategory); + patientHome.typePatientMinimumAgeFilter(patientMinimumAge); + patientHome.typePatientMaximumAgeFilter(patientMaximumAge); + patientHome.selectPatientLastAdmittedBed(patientLastAdmittedBed); + patientHome.selectPatientLastConsentType(PatientLastConsentType); + patientHome.selectPatientTelemedicineFilter(patientTelemedicinePerference); + patientHome.selectPatientReviewFilter(patientReviewStatus); + patientHome.selectPatientMedicoFilter(patientMedicoStatus); + patientHome.clickPatientFilterApply(); + cy.get("a[data-cy='patient']").should("contain.text", "Dummy Patient"); + patientHome.verifyTotalPatientCount("1"); + // Verify the presence of badges + patientHome.verifyGenderBadgeContent(patientGender); + patientHome.verifyCategoryBadgeContent(patientCategory); + patientHome.verifyMinAgeBadgeContent(patientMinimumAge); + patientHome.verifyMaxAgeBadgeContent(patientMaximumAge); + patientHome.verifyLastAdmittedBedBadgeContent(patientLastAdmittedBed); + patientHome.verifyLastConsentTypeBadgeContent("No Consents"); + patientHome.verifyTelemedicineBadgeContent("false"); + patientHome.verifyReviewMissedBadgeContent("false"); + patientHome.verifyMedicoBadgeContent("false"); + // Clear the badges and verify the patient count along with badges + cy.clearAllFilters(); + patientHome.verifyTotalPatientCount("1"); + }); + it("Export the live patient list based on a date range", () => { patientHome.clickPatientExport(); cy.verifyNotification("Please select a seven day period"); diff --git a/cypress/pageobject/Patient/PatientConsultation.ts b/cypress/pageobject/Patient/PatientConsultation.ts index 21da5243500..71a0fbb3909 100644 --- a/cypress/pageobject/Patient/PatientConsultation.ts +++ b/cypress/pageobject/Patient/PatientConsultation.ts @@ -26,15 +26,15 @@ export class PatientConsultationPage { } selectPatientReferance(referance: string) { - cy.searchAndSelectOption("#referred_to", referance); + cy.typeAndSelectOption("#referred_to", referance); } selectBed(bedNo: string) { - cy.searchAndSelectOption("#bed", bedNo); + cy.typeAndSelectOption("#bed", bedNo); } selectPatientWard(ward: string) { - cy.searchAndSelectOption("#transferred_from_location", ward); + cy.typeAndSelectOption("#transferred_from_location", ward); } selectPatientSuggestion(suggestion: string) { @@ -50,7 +50,7 @@ export class PatientConsultationPage { } selectPatientDiagnosis(icdCode: string, statusId: string) { - cy.searchAndSelectOption("#icd11-search", icdCode); + cy.typeAndSelectOption("#icd11-search", icdCode); cy.get("#diagnosis-list") .contains("Add as") .scrollIntoView() @@ -99,7 +99,7 @@ export class PatientConsultationPage { } typeReferringFacility(referringFacility: string) { - cy.searchAndSelectOption("#referred_from_facility", referringFacility); + cy.typeAndSelectOption("#referred_from_facility", referringFacility); } clickEditConsultationButton() { diff --git a/cypress/pageobject/Patient/PatientCreation.ts b/cypress/pageobject/Patient/PatientCreation.ts index 0ec505a47a0..a583844a632 100644 --- a/cypress/pageobject/Patient/PatientCreation.ts +++ b/cypress/pageobject/Patient/PatientCreation.ts @@ -22,7 +22,7 @@ export class PatientPage { } selectFacility(facilityName: string) { - cy.searchAndSelectOption("input[name='facilities']", facilityName); + cy.typeAndSelectOption("input[name='facilities']", facilityName); cy.submitButton("Select"); } @@ -114,7 +114,7 @@ export class PatientPage { } selectPatientOccupation(occupation: string) { - cy.searchAndSelectOption("#occupation", occupation); + cy.typeAndSelectOption("#occupation", occupation); } selectSocioeconomicStatus(value: string) { diff --git a/cypress/pageobject/Patient/PatientDischarge.ts b/cypress/pageobject/Patient/PatientDischarge.ts index eda6a379a3f..70a6d550887 100644 --- a/cypress/pageobject/Patient/PatientDischarge.ts +++ b/cypress/pageobject/Patient/PatientDischarge.ts @@ -14,7 +14,7 @@ class PatientDischarge { } typeReferringFacility(facility: string) { - cy.searchAndSelectOption("#facility-referredto", facility); + cy.typeAndSelectOption("#facility-referredto", facility); } clickClearButton() { diff --git a/cypress/pageobject/Patient/PatientHome.ts b/cypress/pageobject/Patient/PatientHome.ts index 4f953adf78b..a69a96c3f77 100644 --- a/cypress/pageobject/Patient/PatientHome.ts +++ b/cypress/pageobject/Patient/PatientHome.ts @@ -30,6 +30,14 @@ class PatientHome { cy.wait("@getPatients").its("response.statusCode").should("eq", 200); } + typePatientCreatedBeforeDate(startDate: string) { + cy.clickAndTypeDate("input[name='created_date_start']", startDate); + } + + typePatientCreatedAfterDate(endDate: string) { + cy.clickAndTypeDate("input[name='created_date_end']", endDate); + } + typePatientModifiedBeforeDate(startDate: string) { cy.clickAndTypeDate("input[name='modified_date_start']", startDate); } @@ -37,5 +45,211 @@ class PatientHome { typePatientModifiedAfterDate(endDate: string) { cy.clickAndTypeDate("input[name='modified_date_end']", endDate); } + + typePatientAdmitedBeforeDate(startDate: string) { + cy.clickAndTypeDate( + "input[name='last_consultation_encounter_date_start']", + startDate, + ); + } + + typePatientAdmitedAfterDate(endDate: string) { + cy.clickAndTypeDate( + "input[name='last_consultation_encounter_date_end']", + endDate, + ); + } + + clickPatientAdvanceFilters() { + cy.get("#advanced-filter").click(); + } + + selectPatientGenderfilter(gender: string) { + cy.clickAndSelectOption("#gender-advancefilter", gender); + } + + selectPatientCategoryfilter(category: string) { + cy.clickAndSelectOption("#category-advancefilter", category); + } + + typePatientMinimumAgeFilter(minage: string) { + cy.get("#age_min").type(minage); + } + + typePatientMaximumAgeFilter(maxage: string) { + cy.get("#age_max").type(maxage); + } + + selectPatientLastAdmittedBed(bed: string) { + cy.clickAndMultiSelectOption( + "#last_consultation_admitted_bed_type_list", + bed, + ); + } + + selectPatientLastConsentType(consent: string) { + cy.clickAndMultiSelectOption("#last_consultation__consent_types", consent); + } + + selectPatientTelemedicineFilter(telemedicine: string) { + cy.clickAndSelectOption("#telemedicine-advancefilter", telemedicine); + } + + selectPatientReviewFilter(review: string) { + cy.clickAndSelectOption("#review-advancefilter", review); + } + + selectPatientMedicoFilter(medico: string) { + cy.clickAndSelectOption("#medico-advancefilter", medico); + } + + verifyGenderBadgeContent(expectedText: string) { + cy.get("[data-testid='Gender']").should("contain", expectedText); + } + + verifyCategoryBadgeContent(expectedText: string) { + cy.get("[data-testid='Category']").should("contain", expectedText); + } + + verifyMinAgeBadgeContent(expectedText: string) { + cy.get("[data-testid='Age min']").should("contain", expectedText); + } + + verifyMaxAgeBadgeContent(expectedText: string) { + cy.get("[data-testid='Age max']").should("contain", expectedText); + } + + verifyLastAdmittedBedBadgeContent(expectedText: string) { + cy.get("[data-testid='Bed Type']").should("contain", expectedText); + } + + verifyLastConsentTypeBadgeContent(expectedText: string) { + cy.get("[data-testid='Has Consent']").should("contain", expectedText); + } + + verifyTelemedicineBadgeContent(expectedText: string) { + cy.get("[data-testid='Telemedicine']").should("contain", expectedText); + } + + verifyReviewMissedBadgeContent(expectedText: string) { + cy.get("[data-testid='Review Missed']").should("contain", expectedText); + } + + verifyMedicoBadgeContent(expectedText: string) { + cy.get("[data-testid='Is Medico-Legal Case']").should( + "contain", + expectedText, + ); + } + + verifyTotalPatientCount(count: string) { + cy.get("#total-patientcount").should("contain", count); + } + + selectAnyIcdDiagnosis(input: string, random: string) { + cy.typeAndMultiSelectOption("#diagnoses", input, random); + } + + selectConfirmedIcdDiagnosis(input: string, confirmed: string) { + cy.typeAndMultiSelectOption("#diagnoses_confirmed", input, confirmed); + } + + selectUnconfirmedIcdDiagnosis(input: string, unconfirmed: string) { + cy.typeAndMultiSelectOption("#diagnoses_unconfirmed", input, unconfirmed); + } + + selectProvisionalIcdDiagnosis(input: string, unconfirmed: string) { + cy.typeAndMultiSelectOption("#diagnoses_provisional", input, unconfirmed); + } + + selectDifferentialIcdDiagnosis(input: string, unconfirmed: string) { + cy.typeAndMultiSelectOption("#diagnoses_differential", input, unconfirmed); + } + + typeFacilityName(facilityName: string) { + cy.typeAndSelectOption("input[name='facility']", facilityName); + } + + selectFacilityType(facilityType: string) { + cy.clickAndSelectOption("#facility-type", facilityType); + } + + typeFacilityLsgBody(lsgbody: string) { + cy.typeAndSelectOption("#facility-lsgbody", lsgbody); + } + + typeFacilityDistrict(district: string) { + cy.typeAndSelectOption("#facility-district", district); + } + + verifyAnyDiagnosisBadgeContent(expectedText: string) { + cy.get("[data-testid='Diagnoses (of any verification status)']").should( + "contain", + expectedText, + ); + } + + verifyConfirmedDiagnosisBadgeContent(expectedText: string) { + cy.get("[data-testid='Confirmed Diagnoses']").should( + "contain", + expectedText, + ); + } + + verifyUnconfirmedDiagnosisBadgeContent(expectedText: string) { + cy.get("[data-testid='Unconfirmed Diagnoses']").should( + "contain", + expectedText, + ); + } + + verifyProvisionalDiagnosisBadgeContent(expectedText: string) { + cy.get("[data-testid='Provisional Diagnoses']").should( + "contain", + expectedText, + ); + } + + verifyDifferentialDiagnosisBadgeContent(expectedText: string) { + cy.get("[data-testid='Differential Diagnoses']").should( + "contain", + expectedText, + ); + } + + verifyFacilityNameBadgeContent(expectedText: string) { + cy.get("[data-testid='Facility']").should("contain", expectedText); + } + + verifyFacilityTypeBadgeContent(expectedText: string) { + cy.get("[data-testid='Facility Type']").should("contain", expectedText); + } + + verifyFacilityLsgBadgeContent(expectedText: string) { + cy.get("[data-testid='LSG Body']").should("contain", expectedText); + } + + verifyFacilityDistrictContent(expectedText: string) { + cy.get("[data-testid='District']").should("contain", expectedText); + } + + verifyPatientCreatedAfterDate(expectedText: string) { + cy.get("[data-testid='Created after']").should("contain", expectedText); + } + verifyPatientCreatedBeforeDate(expectedText: string) { + cy.get("[data-testid='Created before']").should("contain", expectedText); + } + verifyPatientModifiedAfterDate(expectedText: string) { + cy.get("[data-testid='Modified after']").should("contain", expectedText); + } + verifyPatientModifiedBeforeDate(expectedText: string) { + cy.get("[data-testid='Modified before']").should("contain", expectedText); + } + verifyPatientAdmittedBeforeDate(expectedText: string) { + cy.get("[data-testid='Admitted before']").should("contain", expectedText); + } + verifyPatientAdmittedAfterDate(expectedText: string) { + cy.get("[data-testid='Admitted after']").should("contain", expectedText); + } } export default PatientHome; diff --git a/cypress/pageobject/Patient/PatientLogupdate.ts b/cypress/pageobject/Patient/PatientLogupdate.ts index b2822d03353..857fe7dd972 100644 --- a/cypress/pageobject/Patient/PatientLogupdate.ts +++ b/cypress/pageobject/Patient/PatientLogupdate.ts @@ -14,7 +14,7 @@ class PatientLogupdate { } selectBed(bed: string) { - cy.searchAndSelectOption("input[name='bed']", bed); + cy.typeAndSelectOption("input[name='bed']", bed); cy.get("#update-switchbed").click(); cy.wait(2000); } @@ -43,27 +43,27 @@ class PatientLogupdate { } typeSystolic(systolic: string) { - cy.searchAndSelectOption("#systolic", systolic); + cy.typeAndSelectOption("#systolic", systolic); } typeDiastolic(diastolic: string) { - cy.searchAndSelectOption("#diastolic", diastolic); + cy.typeAndSelectOption("#diastolic", diastolic); } typePulse(pulse: string) { - cy.searchAndSelectOption("#pulse", pulse); + cy.typeAndSelectOption("#pulse", pulse); } typeTemperature(temperature: string) { - cy.searchAndSelectOption("#temperature", temperature); + cy.typeAndSelectOption("#temperature", temperature); } typeRespiratory(respiratory: string) { - cy.searchAndSelectOption("#resp", respiratory); + cy.typeAndSelectOption("#resp", respiratory); } typeSpo2(spo: string) { - cy.searchAndSelectOption("#ventilator_spo2", spo); + cy.typeAndSelectOption("#ventilator_spo2", spo); } selectRhythm(rhythm: string) { diff --git a/cypress/pageobject/Patient/PatientPrescription.ts b/cypress/pageobject/Patient/PatientPrescription.ts index 403d361e55c..d801b360aba 100644 --- a/cypress/pageobject/Patient/PatientPrescription.ts +++ b/cypress/pageobject/Patient/PatientPrescription.ts @@ -16,7 +16,7 @@ export class PatientPrescription { } selectMedicine(medicine: string) { - cy.searchAndSelectOption( + cy.typeAndSelectOption( "div#medicine_object input[placeholder='Select'][role='combobox']", medicine, ); diff --git a/cypress/pageobject/Patient/PatientTreatmentPlan.ts b/cypress/pageobject/Patient/PatientTreatmentPlan.ts index 70af5604776..0bbddbf70bc 100644 --- a/cypress/pageobject/Patient/PatientTreatmentPlan.ts +++ b/cypress/pageobject/Patient/PatientTreatmentPlan.ts @@ -4,7 +4,7 @@ class PatientTreatmentPlan { } fillTreatingPhysican(doctor: string) { - cy.searchAndSelectOption("#treating_physician", doctor); + cy.typeAndSelectOption("#treating_physician", doctor); } selectReviewAfter(time: string) { @@ -20,7 +20,7 @@ class PatientTreatmentPlan { } assignTelemedicineDoctor(doctor: string) { - cy.searchAndSelectOption("#assigned_to", doctor); + cy.typeAndSelectOption("#assigned_to", doctor); } clickAddProcedure() { diff --git a/cypress/pageobject/Users/ManageUserPage.ts b/cypress/pageobject/Users/ManageUserPage.ts index a9ac1374085..efa0d90142c 100644 --- a/cypress/pageobject/Users/ManageUserPage.ts +++ b/cypress/pageobject/Users/ManageUserPage.ts @@ -8,11 +8,11 @@ export class ManageUserPage { } selectFacilityFromDropdown(facilityName: string) { - cy.searchAndSelectOption("input[name='facility']", facilityName); + cy.typeAndSelectOption("input[name='facility']", facilityName); } selectSkillFromDropdown(skill: string) { - cy.searchAndSelectOption("input[name='skill']", skill); + cy.typeAndSelectOption("input[name='skill']", skill); } clickLinkFacility() { diff --git a/cypress/pageobject/Users/UserSearch.ts b/cypress/pageobject/Users/UserSearch.ts index 0c214e92706..d72c00c0de7 100644 --- a/cypress/pageobject/Users/UserSearch.ts +++ b/cypress/pageobject/Users/UserSearch.ts @@ -53,11 +53,11 @@ export class UserPage { } selectState(state: string) { - cy.searchAndSelectOption("#state input", state); + cy.typeAndSelectOption("#state input", state); } selectDistrict(district: string) { - cy.searchAndSelectOption("#district input", district); + cy.typeAndSelectOption("#district input", district); } typeInPhoneNumber(phone: string) { @@ -69,7 +69,7 @@ export class UserPage { } selectHomeFacility(facility: string) { - cy.searchAndSelectOption("input[name='home_facility']", facility); + cy.typeAndSelectOption("input[name='home_facility']", facility); } applyFilter() { diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 320f19d8b0e..da78361f6e8 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -127,7 +127,7 @@ Cypress.Commands.add("submitButton", (buttonText = "Submit") => { }); Cypress.Commands.add( - "searchAndSelectOption", + "typeAndSelectOption", (element: string, referance: string) => { cy.get(element) .click() diff --git a/cypress/support/index.ts b/cypress/support/index.ts index d660246324f..b2895871872 100644 --- a/cypress/support/index.ts +++ b/cypress/support/index.ts @@ -15,7 +15,7 @@ declare global { getAttached(selector: string): Chainable; clearAllFilters(): Chainable; submitButton(buttonText?: string): Chainable; - searchAndSelectOption( + typeAndSelectOption( element: string, referance: string, ): Chainable; diff --git a/src/Components/Patient/DiagnosesFilter.tsx b/src/Components/Patient/DiagnosesFilter.tsx index 1217e821389..ba58a549dac 100644 --- a/src/Components/Patient/DiagnosesFilter.tsx +++ b/src/Components/Patient/DiagnosesFilter.tsx @@ -68,6 +68,7 @@ export default function DiagnosesFilter(props: Props) { return ( {
-
+
Gender o.text} @@ -304,6 +305,7 @@ export default function PatientFilter(props: any) {
Category o.text} @@ -407,6 +409,7 @@ export default function PatientFilter(props: any) {
Telemedicine o.text} @@ -423,6 +426,7 @@ export default function PatientFilter(props: any) {
Respiratory Support o.text} @@ -455,6 +459,7 @@ export default function PatientFilter(props: any) { <> Review Missed (o === "true" ? "Yes" : "No")} @@ -469,6 +474,7 @@ export default function PatientFilter(props: any) {
Is Medico-Legal Case @@ -484,6 +490,7 @@ export default function PatientFilter(props: any) { />
{!props.dischargePage && ( -
+
Facility Facility type o.text} @@ -640,6 +648,7 @@ export default function PatientFilter(props: any) { LSG Body
-
+
District Date: Sun, 13 Oct 2024 05:38:15 +0530 Subject: [PATCH 04/31] Revamped resource and shifting boards to the KanbanBoard component and removed react-dnd (#8713) --- package-lock.json | 167 ++++---- package.json | 4 +- src/Components/Facility/models.tsx | 51 ++- src/Components/Kanban/Board.tsx | 190 +++++++++ src/Components/Patient/models.tsx | 1 + src/Components/Resource/ResourceBoard.tsx | 301 ------------- src/Components/Resource/ResourceBoardView.tsx | 159 +++++-- src/Components/Shifting/BoardView.tsx | 317 +++++++++----- src/Components/Shifting/ShiftingBoard.tsx | 395 ------------------ src/Locale/en.json | 4 +- src/Routers/routes/ResourceRoutes.tsx | 8 +- src/Routers/routes/ShiftingRoutes.tsx | 8 +- 12 files changed, 667 insertions(+), 938 deletions(-) create mode 100644 src/Components/Kanban/Board.tsx delete mode 100644 src/Components/Resource/ResourceBoard.tsx delete mode 100644 src/Components/Shifting/ShiftingBoard.tsx diff --git a/package-lock.json b/package-lock.json index 6d2da7a4750..fd8cf7bde13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@googlemaps/react-wrapper": "^1.1.35", "@googlemaps/typescript-guards": "^2.0.3", "@headlessui/react": "^2.1.2", + "@hello-pangea/dnd": "^17.0.0", "@pnotify/core": "^5.2.0", "@pnotify/mobile": "^5.2.0", "@radix-ui/react-icons": "^1.3.0", @@ -42,9 +43,6 @@ "raviger": "^4.1.2", "react": "18.3.1", "react-copy-to-clipboard": "^5.1.0", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dnd-scrolling": "^1.3.8", "react-dom": "18.3.1", "react-google-recaptcha": "^3.1.0", "react-i18next": "^15.0.2", @@ -2624,6 +2622,51 @@ "react-dom": "^18" } }, + "node_modules/@hello-pangea/dnd": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-17.0.0.tgz", + "integrity": "sha512-LDDPOix/5N0j5QZxubiW9T0M0+1PR0rTDWeZF5pu1Tz91UQnuVK4qQ/EjY83Qm2QeX0eM8qDXANfDh3VVqtR4Q==", + "dependencies": { + "@babel/runtime": "^7.25.6", + "css-box-model": "^1.2.1", + "memoize-one": "^6.0.0", + "raf-schd": "^4.0.3", + "react-redux": "^9.1.2", + "redux": "^5.0.1", + "use-memo-one": "^1.1.3" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@hello-pangea/dnd/node_modules/react-redux": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "dependencies": { + "@types/use-sync-external-store": "^0.0.3", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25", + "react": "^18.0", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/@hello-pangea/dnd/node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -3579,21 +3622,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@react-dnd/asap": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", - "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==" - }, - "node_modules/@react-dnd/invariant": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", - "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==" - }, - "node_modules/@react-dnd/shallowequal": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", - "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==" - }, "node_modules/@react-stately/utils": { "version": "3.10.4", "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.4.tgz", @@ -6501,6 +6529,14 @@ "node": ">=8" } }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -7061,16 +7097,6 @@ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, - "node_modules/dnd-core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", - "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", - "dependencies": { - "@react-dnd/asap": "^5.0.1", - "@react-dnd/invariant": "^4.0.1", - "redux": "^4.2.0" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -10906,11 +10932,6 @@ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -12022,6 +12043,11 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, "node_modules/merge-refs": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz", @@ -13495,7 +13521,8 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true }, "node_modules/picocolors": { "version": "1.1.0", @@ -14088,13 +14115,10 @@ "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==", "dev": true }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dependencies": { - "performance-now": "^2.1.0" - } + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" }, "node_modules/ramda": { "version": "0.29.0", @@ -14160,59 +14184,6 @@ "react": "^15.3.0 || 16 || 17 || 18" } }, - "node_modules/react-dnd": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", - "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", - "dependencies": { - "@react-dnd/invariant": "^4.0.1", - "@react-dnd/shallowequal": "^4.0.1", - "dnd-core": "^16.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - }, - "peerDependencies": { - "@types/hoist-non-react-statics": ">= 3.3.1", - "@types/node": ">= 12", - "@types/react": ">= 16", - "react": ">= 16.14" - }, - "peerDependenciesMeta": { - "@types/hoist-non-react-statics": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-dnd-html5-backend": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", - "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", - "dependencies": { - "dnd-core": "^16.0.1" - } - }, - "node_modules/react-dnd-scrolling": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/react-dnd-scrolling/-/react-dnd-scrolling-1.3.10.tgz", - "integrity": "sha512-Vbe7tp6ZC2kgBx/8P1LXa3+3ao61Ve8HcoVzicnAuRiaV/r3lmccE9JVsa0TeZ+pzTBodb+MzQW0tMOMSRmtwg==", - "dependencies": { - "hoist-non-react-statics": "3.x", - "lodash.throttle": "^4.1.1", - "prop-types": "15.x", - "raf": "^3.4.1" - }, - "peerDependencies": { - "react": "16.x || 17.x || 18.x", - "react-dnd": "10.x || 11.x || 14.x || 15.x || 16.x", - "react-dom": "16.x || 17.x || 18.x" - } - }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -17820,6 +17791,14 @@ "react-dom": ">=16.8" } }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/use-sync-external-store": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", diff --git a/package.json b/package.json index eb1c851bc0d..c42834216d3 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@googlemaps/react-wrapper": "^1.1.35", "@googlemaps/typescript-guards": "^2.0.3", "@headlessui/react": "^2.1.2", + "@hello-pangea/dnd": "^17.0.0", "@pnotify/core": "^5.2.0", "@pnotify/mobile": "^5.2.0", "@radix-ui/react-icons": "^1.3.0", @@ -77,9 +78,6 @@ "raviger": "^4.1.2", "react": "18.3.1", "react-copy-to-clipboard": "^5.1.0", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dnd-scrolling": "^1.3.8", "react-dom": "18.3.1", "react-google-recaptcha": "^3.1.0", "react-i18next": "^15.0.2", diff --git a/src/Components/Facility/models.tsx b/src/Components/Facility/models.tsx index 56c70f2ac94..8103ebb6729 100644 --- a/src/Components/Facility/models.tsx +++ b/src/Components/Facility/models.tsx @@ -5,6 +5,7 @@ import { ConsultationSuggestionValue, DISCHARGE_REASONS, PATIENT_NOTES_THREADS, + SHIFTING_CHOICES_PEACETIME, UserRole, } from "../../Common/constants"; import { FeatureFlag } from "../../Utils/featureFlags"; @@ -15,12 +16,13 @@ import { DailyRoundsModel, FacilityNameModel, FileUploadModel, + PatientModel, } from "../Patient/models"; import { EncounterSymptom } from "../Symptoms/types"; +import { UserBareMinimum, UserModel } from "../Users/models"; import { InvestigationType } from "../Common/prescription-builder/InvestigationBuilder"; import { ProcedureType } from "../Common/prescription-builder/ProcedureBuilder"; import { RouteToFacility } from "../Common/RouteToFacilitySelect"; -import { UserBareMinimum } from "../Users/models"; export interface LocalBodyModel { id: number; @@ -676,3 +678,50 @@ export type PatientTransferResponse = { date_of_birth: string; facility_object: BaseFacilityModel; }; + +export interface ShiftingModel { + assigned_facility: string; + assigned_facility_external: string | null; + assigned_facility_object: FacilityModel; + created_date: string; + emergency: boolean; + external_id: string; + id: string; + modified_date: string; + origin_facility_object: FacilityModel; + patient: string; + patient_object: PatientModel; + shifting_approving_facility_object: FacilityModel | null; + status: (typeof SHIFTING_CHOICES_PEACETIME)[number]["text"]; + assigned_to_object?: UserModel; +} + +export interface ResourceModel { + approving_facility: string | null; + approving_facility_object: FacilityModel | null; + assigned_facility: string | null; + assigned_facility_object: FacilityModel | null; + assigned_quantity: number; + assigned_to: string | null; + assigned_to_object: UserModel | null; + category: string; + created_by: number; + created_by_object: UserModel; + created_date: string; + emergency: boolean; + id: string; + is_assigned_to_user: boolean; + last_edited_by: number; + last_edited_by_object: UserModel; + modified_date: string; + origin_facility: string; + origin_facility_object: FacilityModel; + priority: number | null; + reason: string; + refering_facility_contact_name: string; + refering_facility_contact_number: string; + requested_quantity: number; + status: string; + sub_category: string; + title: string; +} diff --git a/src/Components/Kanban/Board.tsx b/src/Components/Kanban/Board.tsx new file mode 100644 index 00000000000..d2ab5da998f --- /dev/null +++ b/src/Components/Kanban/Board.tsx @@ -0,0 +1,190 @@ +import { + DragDropContext, + Draggable, + Droppable, + OnDragEndResponder, +} from "@hello-pangea/dnd"; +import { ReactNode, RefObject, useEffect, useRef, useState } from "react"; +import { QueryRoute } from "../../Utils/request/types"; +import { QueryOptions } from "../../Utils/request/useQuery"; +import CareIcon from "../../CAREUI/icons/CareIcon"; +import request from "../../Utils/request/request"; +import { useTranslation } from "react-i18next"; + +interface KanbanBoardProps { + title?: ReactNode; + onDragEnd: OnDragEndResponder; + sections: { + id: string; + title: ReactNode; + fetchOptions: ( + id: string, + ...args: unknown[] + ) => { + route: QueryRoute; + options?: QueryOptions; + }; + }[]; + itemRender: (item: T) => ReactNode; +} + +export default function KanbanBoard( + props: KanbanBoardProps, +) { + const board = useRef(null); + + return ( +
+
+
{props.title}
+
+ {[0, 1].map((button, i) => ( + + ))} +
+
+ +
+
+ {props.sections.map((section, i) => ( + + key={i} + section={section} + itemRender={props.itemRender} + boardRef={board} + /> + ))} +
+
+
+
+ ); +} + +export function KanbanSection( + props: Omit, "sections" | "onDragEnd"> & { + section: KanbanBoardProps["sections"][number]; + boardRef: RefObject; + }, +) { + const { section } = props; + const [offset, setOffset] = useState(0); + const [pages, setPages] = useState([]); + const [fetchingNextPage, setFetchingNextPage] = useState(false); + const [hasMore, setHasMore] = useState(true); + const [totalCount, setTotalCount] = useState(); + + const options = section.fetchOptions(section.id); + const sectionRef = useRef(null); + const defaultLimit = 14; + const { t } = useTranslation(); + + // should be replaced with useInfiniteQuery when we move over to react query + + const fetchNextPage = async (refresh: boolean = false) => { + if (!refresh && (fetchingNextPage || !hasMore)) return; + if (refresh) setPages([]); + const offsetToUse = refresh ? 0 : offset; + setFetchingNextPage(true); + const res = await request(options.route, { + ...options.options, + query: { ...options.options?.query, offsetToUse, limit: defaultLimit }, + }); + const newPages = refresh ? [] : [...pages]; + const page = Math.floor(offsetToUse / defaultLimit); + if (res.error) return; + newPages[page] = (res.data as any).results; + setPages(newPages); + setHasMore(!!(res.data as any)?.next); + setTotalCount((res.data as any)?.count); + setOffset(offsetToUse + defaultLimit); + setFetchingNextPage(false); + }; + + const items = pages.flat(); + + useEffect(() => { + const onBoardReachEnd = async () => { + const sectionElementHeight = + sectionRef.current?.getBoundingClientRect().height; + const scrolled = props.boardRef.current?.scrollTop; + // if user has scrolled 3/4th of the current items + if ( + scrolled && + sectionElementHeight && + scrolled > sectionElementHeight * (3 / 4) + ) { + fetchNextPage(); + } + }; + + props.boardRef.current?.addEventListener("scroll", onBoardReachEnd); + return () => + props.boardRef.current?.removeEventListener("scroll", onBoardReachEnd); + }, [props.boardRef, fetchingNextPage, hasMore]); + + useEffect(() => { + fetchNextPage(true); + }, [props.section]); + + return ( + + {(provided) => ( +
+
+
+
{section.title}
+
+ + {typeof totalCount === "undefined" ? "..." : totalCount} + +
+
+
+
+ {!fetchingNextPage && totalCount === 0 && ( +
+ {t("no_results_found")} +
+ )} + {items + .filter((item) => item) + .map((item, i) => ( + + {(provided) => ( +
+ {props.itemRender(item)} +
+ )} +
+ ))} + {fetchingNextPage && ( +
+ )} +
+
+ )} + + ); +} diff --git a/src/Components/Patient/models.tsx b/src/Components/Patient/models.tsx index cf35680de11..d9e275fdc4a 100644 --- a/src/Components/Patient/models.tsx +++ b/src/Components/Patient/models.tsx @@ -135,6 +135,7 @@ export interface PatientModel { assigned_to?: { first_name?: string; username?: string; last_name?: string }; assigned_to_object?: AssignedToObjectModel; meta_info?: PatientMeta; + age?: string; } export interface SampleTestModel { diff --git a/src/Components/Resource/ResourceBoard.tsx b/src/Components/Resource/ResourceBoard.tsx deleted file mode 100644 index aa0b031ba0e..00000000000 --- a/src/Components/Resource/ResourceBoard.tsx +++ /dev/null @@ -1,301 +0,0 @@ -import { useState, useEffect } from "react"; -import { navigate } from "raviger"; -import { classNames, formatName } from "../../Utils/utils"; -import { useDrag, useDrop } from "react-dnd"; -import { formatDateTime } from "../../Utils/utils"; -import { ExportButton } from "../Common/Export"; -import dayjs from "../../Utils/dayjs"; -import useQuery from "../../Utils/request/useQuery"; -import routes from "../../Redux/api"; -import { PaginatedResponse } from "../../Utils/request/types"; -import { IResource } from "./models"; -import request from "../../Utils/request/request"; -import CareIcon from "../../CAREUI/icons/CareIcon"; - -interface boardProps { - board: string; - filterProp: any; - formatFilter: any; -} - -const renderBoardTitle = (board: string) => board; - -const reduceLoading = (action: string, current: any) => { - switch (action) { - case "MORE": - return { ...current, more: true }; - case "BOARD": - return { ...current, board: true }; - case "COMPLETE": - return { board: false, more: false }; - } -}; - -const ResourceCard = ({ resource }: any) => { - const [{ isDragging }, drag] = useDrag(() => ({ - type: "resource-card", - item: resource, - collect: (monitor) => ({ isDragging: !!monitor.isDragging() }), - })); - - return ( -
-
-
-
-
-
- {resource.title} -
-
- {resource.emergency && ( - - Emergency - - )} -
-
-
-
-
- -
- {(resource.origin_facility_object || {}).name} -
- -
-
-
- -
- {(resource.approving_facility_object || {}).name} -
- -
- {resource.assigned_facility_object && ( -
-
- - -
- {(resource.assigned_facility_object || {}).name || - "Yet to be decided"} -
- -
- )} -
-
- -
- {formatDateTime(resource.modified_date) || "--"} -
- -
- {resource.assigned_to_object && ( -
-
- -
- {formatName(resource.assigned_to_object)} -{" "} - {resource.assigned_to_object.user_type} -
- -
- )} -
-
-
- -
-
-
-
- ); -}; - -export default function ResourceBoard({ - board, - filterProp, - formatFilter, -}: boardProps) { - const [isLoading, setIsLoading] = useState({ board: "BOARD", more: false }); - const [{ isOver }, drop] = useDrop(() => ({ - accept: "resource-card", - drop: (item: any) => { - if (item.status !== board) { - navigate(`/resource/${item.id}/update?status=${board}`); - } - }, - collect: (monitor) => ({ isOver: !!monitor.isOver() }), - })); - const [offset, setOffSet] = useState(0); - const [data, setData] = useState>(); - - useEffect(() => { - setIsLoading((loading) => reduceLoading("BOARD", loading)); - }, [ - board, - filterProp.title, - filterProp.facility, - filterProp.origin_facility, - filterProp.approving_facility, - filterProp.assigned_facility, - filterProp.emergency, - filterProp.created_date_before, - filterProp.created_date_after, - filterProp.modified_date_before, - filterProp.modified_date_after, - filterProp.ordering, - ]); - - useQuery(routes.listResourceRequests, { - query: formatFilter({ - ...filterProp, - status: board, - }), - onResponse: ({ res, data: listResourceData }) => { - if (res?.ok && listResourceData) { - setData(listResourceData); - } - setIsLoading((loading) => reduceLoading("COMPLETE", loading)); - }, - }); - - const handlePagination = async () => { - setIsLoading((loading) => reduceLoading("MORE", loading)); - setOffSet(offset + 14); - const { res, data: newPageData } = await request( - routes.listResourceRequests, - { - query: formatFilter({ - ...filterProp, - status: board, - offset: offset, - }), - }, - ); - if (res?.ok && newPageData) { - setData((prev) => - prev - ? { ...prev, results: [...prev.results, ...newPageData.results] } - : newPageData, - ); - } - setIsLoading((loading) => reduceLoading("COMPLETE", loading)); - }; - - const boardFilter = (filter: string) => { - return data?.results - .filter(({ status }) => status === filter) - .map((resource: any) => ( - - )); - }; - - return ( -
-
-
-

- {renderBoardTitle(board)}{" "} - { - const { data } = await request( - routes.downloadResourceRequests, - { - query: { - ...formatFilter({ ...filterProp, status: board }), - csv: true, - }, - }, - ); - return data ?? null; - }} - filenamePrefix={`resource_requests_${board}`} - /> -

- - {data?.count || "0"} - -
-
-
- {isLoading.board ? ( -
-
-
-
-
-
-
-
-
-
-
-
-
- ) : data && data?.results.length > 0 ? ( - boardFilter(board) - ) : ( -

No requests to show.

- )} - {!isLoading.board && - data && - data?.results.length < (data?.count || 0) && - (isLoading.more ? ( -
- Loading -
- ) : ( - - ))} -
-
- ); -} diff --git a/src/Components/Resource/ResourceBoardView.tsx b/src/Components/Resource/ResourceBoardView.tsx index bd28cc5f5d2..ed6d63bbd77 100644 --- a/src/Components/Resource/ResourceBoardView.tsx +++ b/src/Components/Resource/ResourceBoardView.tsx @@ -1,9 +1,7 @@ import { useState } from "react"; -import { navigate } from "raviger"; +import { Link, navigate } from "raviger"; import ListFilter from "./ListFilter"; -import ResourceBoard from "./ResourceBoard"; import { RESOURCE_CHOICES } from "../../Common/constants"; -import withScrolling from "react-dnd-scrolling"; import BadgesList from "./BadgesList"; import { formatFilter } from "./Commons"; import useFilters from "../../Common/hooks/useFilters"; @@ -16,10 +14,12 @@ import SearchInput from "../Form/SearchInput"; import Tabs from "../Common/components/Tabs"; import request from "../../Utils/request/request"; import routes from "../../Redux/api"; +import KanbanBoard from "../Kanban/Board"; +import { ResourceModel } from "../Facility/models"; +import { classNames, formatDateTime, formatName } from "../../Utils/utils"; +import dayjs from "dayjs"; -import Loading from "@/Components/Common/Loading"; import PageTitle from "@/Components/Common/PageTitle"; -const ScrollingComponent = withScrolling("div"); const resourceStatusOptions = RESOURCE_CHOICES.map((obj) => obj.text); const COMPLETED = ["COMPLETED", "REJECTED"]; @@ -32,7 +32,6 @@ export default function BoardView() { }); const [boardFilter, setBoardFilter] = useState(ACTIVE); // eslint-disable-next-line - const [isLoading, setIsLoading] = useState(false); const appliedFilters = formatFilter(qParams); const { t } = useTranslation(); @@ -42,11 +41,11 @@ export default function BoardView() { }; return ( -
+
- - -
- {isLoading ? ( - - ) : ( - boardFilter.map((board) => ( - + title={} + sections={boardFilter.map((board) => ({ + id: board, + title: ( +

+ {board}{" "} + { + const { data } = await request( + routes.downloadResourceRequests, + { + query: { + ...formatFilter({ ...qParams, status: board }), + csv: true, + }, + }, + ); + return data ?? null; + }} + filenamePrefix={`resource_requests_${board}`} /> - )) - )} -

-
+ + ), + fetchOptions: (id) => ({ + route: routes.listResourceRequests, + options: { + query: formatFilter({ + ...qParams, + status: id, + }), + }, + }), + }))} + onDragEnd={(result) => { + if (result.source.droppableId !== result.destination?.droppableId) + navigate( + `/resource/${result.draggableId}/update?status=${result.destination?.droppableId}`, + ); + }} + itemRender={(resource) => ( +
+
+
+
+
+ {resource.title} +
+
+
+ {resource.emergency && ( + + {t("emergency")} + + )} +
+
+
+ {( + [ + { + title: "origin_facility", + icon: "l-plane-departure", + data: resource.origin_facility_object.name, + }, + { + title: "resource_approving_facility", + icon: "l-user-check", + data: resource.approving_facility_object?.name, + }, + { + title: "assigned_facility", + icon: "l-plane-arrival", + data: + resource.assigned_facility_object?.name || + t("yet_to_be_decided"), + }, + { + title: "last_modified", + icon: "l-stopwatch", + data: formatDateTime(resource.modified_date), + className: dayjs() + .subtract(2, "hours") + .isBefore(resource.modified_date) + ? "text-secondary-900" + : "rounded bg-red-500 border border-red-600 text-white w-full font-bold", + }, + { + title: "assigned_to", + icon: "l-user", + data: resource.assigned_to_object + ? formatName(resource.assigned_to_object) + + " - " + + resource.assigned_to_object.user_type + : undefined, + }, + ] as const + ) + .filter((d) => d.data) + .map((datapoint, i) => ( +
+
+ +
+
+ {datapoint.data} +
+
+ ))} +
+
+
+ + {t("all_details")} + +
+
+ )} + />
); diff --git a/src/Components/Shifting/BoardView.tsx b/src/Components/Shifting/BoardView.tsx index dbd911483dc..f83e0a4974e 100644 --- a/src/Components/Shifting/BoardView.tsx +++ b/src/Components/Shifting/BoardView.tsx @@ -7,25 +7,26 @@ import BadgesList from "./BadgesList"; import { ExportButton } from "../Common/Export"; import ListFilter from "./ListFilter"; import SearchInput from "../Form/SearchInput"; -import ShiftingBoard from "./ShiftingBoard"; import { formatFilter } from "./Commons"; -import { navigate } from "raviger"; +import { Link, navigate } from "raviger"; import useFilters from "../../Common/hooks/useFilters"; -import { useLayoutEffect, useRef, useState } from "react"; +import { useState } from "react"; import { useTranslation } from "react-i18next"; -import withScrolling from "react-dnd-scrolling"; import ButtonV2 from "../Common/components/ButtonV2"; import { AdvancedFilterButton } from "../../CAREUI/interactive/FiltersSlideover"; import CareIcon from "../../CAREUI/icons/CareIcon"; import Tabs from "../Common/components/Tabs"; import careConfig from "@careConfig"; +import KanbanBoard from "../Kanban/Board"; +import { classNames, formatDateTime, formatName } from "../../Utils/utils"; +import dayjs from "dayjs"; +import ConfirmDialog from "../Common/ConfirmDialog"; +import { ShiftingModel } from "../Facility/models"; +import useAuthUser from "../../Common/hooks/useAuthUser"; import request from "../../Utils/request/request"; import routes from "../../Redux/api"; - -import Loading from "@/Components/Common/Loading"; import PageTitle from "@/Components/Common/PageTitle"; -const ScrollingComponent = withScrolling("div"); export default function BoardView() { const { qParams, updateQuery, FilterBadges, advancedFilter } = useFilters({ @@ -33,6 +34,26 @@ export default function BoardView() { cacheBlacklist: ["patient_name"], }); + const [modalFor, setModalFor] = useState<{ + externalId?: string; + loading: boolean; + }>({ + externalId: undefined, + loading: false, + }); + + const authUser = useAuthUser(); + + const handleTransferComplete = async (shift: any) => { + setModalFor({ ...modalFor, loading: true }); + await request(routes.completeTransfer, { + pathParams: { externalId: shift.external_id }, + }); + navigate( + `/facility/${shift.assigned_facility}/patient/${shift.patient}/consultation`, + ); + }; + const shiftStatusOptions = careConfig.wartimeShifting ? SHIFTING_CHOICES_WARTIME : SHIFTING_CHOICES_PEACETIME; @@ -55,79 +76,10 @@ export default function BoardView() { ); const [boardFilter, setBoardFilter] = useState(activeBoards); - const [isLoading] = useState(false); const { t } = useTranslation(); - const containerRef = useRef(null); - const [containerHeight, setContainerHeight] = useState(0); - const [isLeftScrollable, setIsLeftScrollable] = useState(false); - const [isRightScrollable, setIsRightScrollable] = useState(false); - - useLayoutEffect(() => { - const container = containerRef.current; - - if (!container) return; - - const handleScroll = () => { - setIsLeftScrollable(container.scrollLeft > 0); - setIsRightScrollable( - container.scrollLeft + container.clientWidth < - container.scrollWidth - 10, - ); - }; - - container.addEventListener("scroll", handleScroll); - - handleScroll(); - - return () => { - container.removeEventListener("scroll", handleScroll); - }; - }, []); - - const handleOnClick = (direction: "right" | "left") => { - const container = containerRef.current; - if (direction === "left" ? !isLeftScrollable : !isRightScrollable) return; - - if (container) { - const scrollAmount = 300; - const currentScrollLeft = container.scrollLeft; - - if (direction === "left") { - container.scrollTo({ - left: currentScrollLeft - scrollAmount, - behavior: "smooth", - }); - } else if (direction === "right") { - container.scrollTo({ - left: currentScrollLeft + scrollAmount, - behavior: "smooth", - }); - } - } - }; - - const renderArrowIcons = (direction: "right" | "left") => { - const isIconEnable = - direction === "left" ? isLeftScrollable : isRightScrollable; - return ( - isIconEnable && ( -
- handleOnClick(direction)} - /> -
- ) - ); - }; return ( -
+
- - -
- {isLoading ? ( - - ) : ( - <> - {renderArrowIcons("left")} -
- {boardFilter.map((board) => ( - - ))} + + title={} + sections={boardFilter.map((board) => ({ + id: board.text, + title: ( +

+ {board.label || board.text}{" "} + { + const { data } = await request(routes.downloadShiftRequests, { + query: { ...formatFilter(qParams), csv: true }, + }); + return data ?? null; + }} + filenamePrefix={`shift_requests_${board.label || board.text}`} + /> +

+ ), + fetchOptions: (id) => ({ + route: routes.listShiftRequests, + options: { + query: formatFilter({ + ...qParams, + status: id, + }), + }, + }), + }))} + onDragEnd={(result) => { + if (result.source.droppableId !== result.destination?.droppableId) + navigate( + `/shifting/${result.draggableId}/update?status=${result.destination?.droppableId}`, + ); + }} + itemRender={(shift) => ( +
+
+
+
+
+ {shift.patient_object.name} +
+
+ {shift.patient_object.age} old +
+
+
+ {shift.emergency && ( + + {t("emergency")} + + )} +
- {renderArrowIcons("right")} - - )} -
- +
+ {( + [ + { + title: "phone_number", + icon: "l-mobile-android", + data: shift.patient_object.phone_number, + }, + { + title: "origin_facility", + icon: "l-plane-departure", + data: shift.origin_facility_object.name, + }, + { + title: "shifting_approving_facility", + icon: "l-user-check", + data: careConfig.wartimeShifting + ? shift.shifting_approving_facility_object?.name + : undefined, + }, + { + title: "assigned_facility", + icon: "l-plane-arrival", + data: + shift.assigned_facility_external || + shift.assigned_facility_object?.name || + t("yet_to_be_decided"), + }, + { + title: "last_modified", + icon: "l-stopwatch", + data: formatDateTime(shift.modified_date), + className: dayjs() + .subtract(2, "hours") + .isBefore(shift.modified_date) + ? "text-secondary-900" + : "rounded bg-red-500 border border-red-600 text-white w-full font-bold", + }, + { + title: "patient_address", + icon: "l-home", + data: shift.patient_object.address, + }, + { + title: "assigned_to", + icon: "l-user", + data: shift.assigned_to_object + ? formatName(shift.assigned_to_object) + + " - " + + shift.assigned_to_object.user_type + : undefined, + }, + { + title: "patient_state", + icon: "l-map-marker", + data: shift.patient_object.state_object?.name, + }, + ] as const + ) + .filter((d) => d.data) + .map((datapoint, i) => ( +
+
+ +
+
+ {datapoint.data} +
+
+ ))} +
+
+
+ + {t("all_details")} + + + {shift.status === "COMPLETED" && shift.assigned_facility && ( + <> + + + + setModalFor({ externalId: undefined, loading: false }) + } + action={t("confirm")} + onConfirm={() => handleTransferComplete(shift)} + > +

+ {t("redirected_to_create_consultation")} +

+
+ + )} +
+
+ )} + />
); diff --git a/src/Components/Shifting/ShiftingBoard.tsx b/src/Components/Shifting/ShiftingBoard.tsx deleted file mode 100644 index 6f2eb3b77a3..00000000000 --- a/src/Components/Shifting/ShiftingBoard.tsx +++ /dev/null @@ -1,395 +0,0 @@ -import { - Dispatch, - SetStateAction, - useEffect, - useLayoutEffect, - useRef, - useState, -} from "react"; -import { classNames, formatDateTime, formatName } from "../../Utils/utils"; -import { useDrag, useDrop } from "react-dnd"; -import ButtonV2 from "../Common/components/ButtonV2"; -import ConfirmDialog from "../Common/ConfirmDialog"; -import { navigate } from "raviger"; -import { useTranslation } from "react-i18next"; -import { ExportButton } from "../Common/Export"; -import dayjs from "../../Utils/dayjs"; -import useAuthUser from "../../Common/hooks/useAuthUser"; -import request from "../../Utils/request/request"; -import routes from "../../Redux/api"; -import useQuery from "../../Utils/request/useQuery"; -import { PaginatedResponse } from "../../Utils/request/types"; -import { IShift } from "./models"; -import CareIcon from "../../CAREUI/icons/CareIcon"; -import careConfig from "@careConfig"; - -interface boardProps { - board: string; - title?: string; - filterProp: any; - formatFilter: any; - setContainerHeight: Dispatch>; - containerHeight: number; -} - -const ShiftCard = ({ shift, filter }: any) => { - const [modalFor, setModalFor] = useState({ - externalId: undefined, - loading: false, - }); - const [{ isDragging }, drag] = useDrag(() => ({ - type: "shift-card", - item: shift, - collect: (monitor) => ({ isDragging: !!monitor.isDragging() }), - })); - const authUser = useAuthUser(); - const { t } = useTranslation(); - - const handleTransferComplete = async (shift: any) => { - setModalFor({ ...modalFor, loading: true }); - await request(routes.completeTransfer, { - pathParams: { externalId: shift.external_id }, - }); - navigate( - `/facility/${shift.assigned_facility}/patient/${shift.patient}/consultation`, - ); - }; - return ( -
-
-
-
-
-
- {shift.patient_object.name} - {shift.patient_object.age} -
-
- {shift.emergency && ( - - {t("emergency")} - - )} -
-
-
-
-
- -
- {shift.patient_object.phone_number || ""} -
- -
-
-
- -
- {(shift.origin_facility_object || {}).name} -
- -
- {careConfig.wartimeShifting && ( -
-
- -
- {(shift.shifting_approving_facility_object || {}).name} -
- -
- )} -
-
- - -
- {shift.assigned_facility_external || - shift.assigned_facility_object?.name || - t("yet_to_be_decided")} -
- -
- -
-
- -
- {formatDateTime(shift.modified_date) || "--"} -
- -
- -
-
- -
- {shift.patient_object.address || "--"} -
- -
- - {shift.assigned_to_object && ( -
-
- -
- {formatName(shift.assigned_to_object)} - {" - "} - {shift.assigned_to_object.user_type} -
- -
- )} - -
-
- -
- {shift.patient_object.state_object.name || "--"} -
- -
-
-
- -
- -
- {filter === "COMPLETED" && shift.assigned_facility && ( -
- setModalFor(shift.external_id)} - > - {t("transfer_to_receiving_facility")} - - - - setModalFor({ externalId: undefined, loading: false }) - } - action={t("confirm")} - onConfirm={() => handleTransferComplete(shift)} - > -

- {t("redirected_to_create_consultation")} -

-
-
- )} -
-
-
- ); -}; - -export default function ShiftingBoard({ - board, - title, - filterProp, - formatFilter, - setContainerHeight, - containerHeight, -}: boardProps) { - const containerRef = useRef(null); - const [offset, setOffSet] = useState(0); - const [pages, setPages] = useState[]>([]); - const [isLoading, setIsLoading] = useState(true); - const [{ isOver }, drop] = useDrop(() => ({ - accept: "shift-card", - drop: (item: any) => { - if (item.status !== board) { - navigate(`/shifting/${item.id}/update?status=${board}`); - } - }, - collect: (monitor) => ({ isOver: !!monitor.isOver() }), - })); - - const query = useQuery(routes.listShiftRequests, { - query: formatFilter({ - ...filterProp, - status: board, - }), - onResponse: ({ res, data: listShiftData }) => { - setIsLoading(false); - if (res?.ok && listShiftData) { - setPages((prev) => [...prev, listShiftData]); - } - }, - }); - - useEffect(() => { - setPages([]); - setIsLoading(true); - query.refetch(); - }, [ - filterProp.facility, - filterProp.origin_facility, - filterProp.shifting_approving_facility, - filterProp.assigned_facility, - filterProp.emergency, - filterProp.is_up_shift, - filterProp.patient_name, - filterProp.created_date_before, - filterProp.created_date_after, - filterProp.modified_date_before, - filterProp.modified_date_after, - filterProp.patient_phone_number, - filterProp.ordering, - filterProp.is_kasp, - filterProp.assigned_to, - filterProp.is_antenatal, - filterProp.breathlessness_level, - ]); - - const handlePagination = async () => { - setIsLoading(true); - setOffSet(offset + 14); - const { res, data: newPageData } = await request(routes.listShiftRequests, { - query: formatFilter({ - ...filterProp, - status: board, - offset: offset, - }), - }); - if (res?.ok && newPageData) { - setPages((prev) => [...prev, newPageData]); - } - setIsLoading(false); - }; - const { t } = useTranslation(); - - const patientFilter = (filter: string) => { - return pages - .flatMap((p) => p.results) - .filter(({ status }) => status === filter) - .map((shift: any) => ( - - )); - }; - - useLayoutEffect(() => { - const container = containerRef.current; - if (container) { - const { height } = container.getBoundingClientRect(); - containerHeight < height && setContainerHeight(height); - } - }, [containerRef.current, pages.flatMap((p) => p.results).length]); - - return ( -
-
-
-

- {title || board}{" "} - { - const { data } = await request(routes.downloadShiftRequests, { - query: { - ...formatFilter({ ...filterProp, status: board }), - csv: true, - }, - }); - return data ?? null; - }} - filenamePrefix={`shift_requests_${board}`} - /> -

- - {pages[0] ? pages[0].count : "..."} - -
-
-
- {pages[0]?.count > 0 - ? patientFilter(board) - : !isLoading && ( -

{t("no_patients_to_show")}

- )} - {isLoading ? ( -
-
-
-
-
-
-
-
-
-
-
-
-
- ) : ( - pages.at(-1)?.next && ( - handlePagination()} className="m-2 block"> - Load More - - ) - )} -
-
- ); -} diff --git a/src/Locale/en.json b/src/Locale/en.json index 2b47a90bd46..a953f36a6ee 100644 --- a/src/Locale/en.json +++ b/src/Locale/en.json @@ -940,7 +940,7 @@ "modified_date": "Modified Date", "no_patients_to_show": "No patients to show.", "shifting_status": "Shifting status", - "transfer_to_receiving_facility": "TRANSFER TO RECEIVING FACILITY", + "transfer_to_receiving_facility": "Transfer to receiving facility", "confirm_transfer_complete": "Confirm Transfer Complete!", "mark_transfer_complete_confirmation": "Are you sure you want to mark this transfer as complete? The Origin facility will no longer have access to this patient", "board_view": "Board View", @@ -1021,6 +1021,8 @@ "date_declared_positive": "Date of declaring positive", "date_of_result": "Covid confirmation date", "is_vaccinated": "Whether vaccinated", + "resource_origin_facility": "Origin Facility", + "resource_approving_facility" : "Resource approving facility", "consultation_not_filed": "You have not filed any consultation for this patient yet.", "consultation_not_filed_description": "Please file a consultation for this patient to continue." } diff --git a/src/Routers/routes/ResourceRoutes.tsx b/src/Routers/routes/ResourceRoutes.tsx index 8408ab4d79d..6636d0d83ea 100644 --- a/src/Routers/routes/ResourceRoutes.tsx +++ b/src/Routers/routes/ResourceRoutes.tsx @@ -1,5 +1,3 @@ -import { DndProvider } from "react-dnd"; -import { HTML5Backend } from "react-dnd-html5-backend"; import ResourceDetails from "../../Components/Resource/ResourceDetails"; import { ResourceDetailsUpdate } from "../../Components/Resource/ResourceDetailsUpdate"; import ListView from "../../Components/Resource/ListView"; @@ -12,11 +10,7 @@ const getDefaultView = () => export default { "/resource": () => , - "/resource/board": () => ( - - - - ), + "/resource/board": () => , "/resource/list": () => , "/resource/:id": ({ id }: DetailRoute) => , "/resource/:id/update": ({ id }: DetailRoute) => ( diff --git a/src/Routers/routes/ShiftingRoutes.tsx b/src/Routers/routes/ShiftingRoutes.tsx index 9b20b4a1a0b..f2e12de4f25 100644 --- a/src/Routers/routes/ShiftingRoutes.tsx +++ b/src/Routers/routes/ShiftingRoutes.tsx @@ -1,5 +1,3 @@ -import { DndProvider } from "react-dnd"; -import { HTML5Backend } from "react-dnd-html5-backend"; import { ShiftCreate } from "../../Components/Patient/ShiftCreate"; import ShiftDetails from "../../Components/Shifting/ShiftDetails"; import { ShiftDetailsUpdate } from "../../Components/Shifting/ShiftDetailsUpdate"; @@ -12,11 +10,7 @@ const getDefaultView = () => export default { "/shifting": () => , - "/shifting/board": () => ( - - - - ), + "/shifting/board": () => , "/shifting/list": () => , "/shifting/:id": ({ id }: any) => , "/shifting/:id/update": ({ id }: any) => , From 7cfd868fe3e046a27b01b875cefdcb1fd829bd5c Mon Sep 17 00:00:00 2001 From: Noufal Rahim <120470585+noufalrahim@users.noreply.github.com> Date: Sun, 13 Oct 2024 05:53:52 +0530 Subject: [PATCH 05/31] Added units for pressure-sore (#8755) --- .../LogUpdate/Sections/PressureSore/PressureSore.tsx | 7 +++++-- src/Locale/en.json | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Components/LogUpdate/Sections/PressureSore/PressureSore.tsx b/src/Components/LogUpdate/Sections/PressureSore/PressureSore.tsx index a56457ef257..63970d4c25c 100644 --- a/src/Components/LogUpdate/Sections/PressureSore/PressureSore.tsx +++ b/src/Components/LogUpdate/Sections/PressureSore/PressureSore.tsx @@ -14,6 +14,7 @@ import { IPressureSore } from "../../../Patient/models"; import { Error } from "../../../../Utils/Notifications"; import { classNames, getValueDescription } from "../../../../Utils/utils"; import { calculatePushScore } from "./utils"; +import { useTranslation } from "react-i18next"; const PressureSore = ({ log, onChange, readonly }: LogUpdateSectionProps) => { const value = log.pressure_sore ?? []; @@ -104,6 +105,8 @@ const RegionEditor = (props: RegionEditorProps) => { const isReadOnly = !props.onSave; + const { t } = useTranslation(); + return ( {
{ onChange={(e) => update({ width: parseFloat(e.value) })} /> Date: Sun, 13 Oct 2024 05:54:03 +0530 Subject: [PATCH 06/31] Added ORAL as default for all route (#8754) --- src/Components/Medicine/PrescriptionBuilder.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Components/Medicine/PrescriptionBuilder.tsx b/src/Components/Medicine/PrescriptionBuilder.tsx index a65f9dd9a62..18efa27ee08 100644 --- a/src/Components/Medicine/PrescriptionBuilder.tsx +++ b/src/Components/Medicine/PrescriptionBuilder.tsx @@ -149,5 +149,9 @@ export default function PrescriptionBuilder({ const DefaultPrescription: Partial = { dosage_type: "REGULAR", + route: "ORAL", +}; +const DefaultPRNPrescription: Partial = { + dosage_type: "PRN", + route: "ORAL", }; -const DefaultPRNPrescription: Partial = { dosage_type: "PRN" }; From a45285a8e8efb3a582417e18222c8e84563c08c1 Mon Sep 17 00:00:00 2001 From: Mohammed Nihal <57055998+nihal467@users.noreply.github.com> Date: Tue, 15 Oct 2024 02:18:29 +0200 Subject: [PATCH 07/31] Downgraded Cypress to 13.14.2 and Removed @types/cypress (#8788) --- cypress/tsconfig.json | 1 - package-lock.json | 217 +++++++----------------------------------- package.json | 3 +- 3 files changed, 36 insertions(+), 185 deletions(-) diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json index 0fd7f9e340b..114000b60f0 100644 --- a/cypress/tsconfig.json +++ b/cypress/tsconfig.json @@ -3,7 +3,6 @@ "baseUrl": "./", "target": "es5", "lib": ["es5", "dom", "es2015", "es2016", "es2017", "es2018", "es2019", "es2020"], - "types": ["cypress"], "typeRoots": ["./support"], "resolveJsonModule": true }, diff --git a/package-lock.json b/package-lock.json index fd8cf7bde13..9554674c29b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "cross-env": "^7.0.3", + "cypress": "^13.14.2", "dayjs": "^1.11.11", "echarts": "^5.5.1", "echarts-for-react": "^3.0.2", @@ -63,7 +64,6 @@ "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.13", - "@types/cypress": "^1.1.3", "@types/events": "^3.0.3", "@types/google.maps": "^3.55.8", "@types/lodash-es": "^4.17.12", @@ -78,7 +78,6 @@ "@typescript-eslint/eslint-plugin": "^7.18.0", "@vitejs/plugin-react-swc": "^3.6.0", "autoprefixer": "^10.4.19", - "cypress": "^13.15.0", "cypress-localstorage-commands": "^2.2.5", "cypress-split": "^1.23.2", "eslint-config-prettier": "^9.1.0", @@ -1979,7 +1978,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, "optional": true, "engines": { "node": ">=0.1.90" @@ -1989,7 +1987,6 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.5.tgz", "integrity": "sha512-v+XHd9XmWbufxF1/bTaVm2yhbxY+TB4YtWRqF2zaXBlDNMkls34KiATz0AVDLavL3iB6bQk9/7n3oY1EoLSWGA==", - "dev": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -2018,7 +2015,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -2027,7 +2023,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, "dependencies": { "debug": "^3.1.0", "lodash.once": "^4.1.1" @@ -2037,7 +2032,6 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, "dependencies": { "ms": "^2.1.1" } @@ -4504,16 +4498,6 @@ "@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", @@ -4706,14 +4690,12 @@ "node_modules/@types/sinonjs__fake-timers": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==" }, "node_modules/@types/sizzle": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", - "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==", - "dev": true + "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==" }, "node_modules/@types/supports-color": { "version": "8.1.3", @@ -4748,7 +4730,6 @@ "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, "optional": true, "dependencies": { "@types/node": "*" @@ -5257,7 +5238,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -5295,7 +5275,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, "engines": { "node": ">=6" } @@ -5304,7 +5283,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -5319,7 +5297,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, "engines": { "node": ">=10" }, @@ -5382,7 +5359,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true, "funding": [ { "type": "github", @@ -5573,7 +5549,6 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, "dependencies": { "safer-buffer": "~2.1.0" } @@ -5582,7 +5557,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, "engines": { "node": ">=0.8" } @@ -5600,7 +5574,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, "engines": { "node": ">=8" } @@ -5608,8 +5581,7 @@ "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -5620,7 +5592,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, "engines": { "node": ">= 4.0.0" } @@ -5681,7 +5652,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, "engines": { "node": "*" } @@ -5689,8 +5659,7 @@ "node_modules/aws4": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" }, "node_modules/axios": { "version": "1.7.7", @@ -5777,7 +5746,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -5797,7 +5765,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, "dependencies": { "tweetnacl": "^0.14.3" } @@ -5816,14 +5783,12 @@ "node_modules/blob-util": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==" }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/boolean": { "version": "3.2.0", @@ -5924,7 +5889,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -5948,7 +5912,6 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, "engines": { "node": "*" } @@ -5962,7 +5925,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", - "dev": true, "engines": { "node": ">=6" } @@ -5971,7 +5933,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -6039,8 +6000,7 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/ccount": { "version": "2.0.1", @@ -6068,7 +6028,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6084,7 +6043,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -6136,7 +6094,6 @@ "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true, "engines": { "node": ">= 0.8.0" } @@ -6197,7 +6154,6 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, "funding": [ { "type": "github", @@ -6231,7 +6187,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, "engines": { "node": ">=6" } @@ -6240,7 +6195,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -6252,7 +6206,6 @@ "version": "0.6.5", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0" }, @@ -6267,7 +6220,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" @@ -6332,8 +6284,7 @@ "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -6359,7 +6310,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, "engines": { "node": ">= 6" } @@ -6368,7 +6318,6 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, "engines": { "node": ">=4.0.0" } @@ -6451,8 +6400,7 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/cosmiconfig": { "version": "8.3.6", @@ -6554,13 +6502,12 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/cypress": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.15.0.tgz", - "integrity": "sha512-53aO7PwOfi604qzOkCSzNlWquCynLlKE/rmmpSPcziRH6LNfaDUAklQT6WJIsD8ywxlIy+uVZsnTMCCQVd2kTw==", - "dev": true, + "version": "13.14.2", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.14.2.tgz", + "integrity": "sha512-lsiQrN17vHMB2fnvxIrKLAjOr9bPwsNbPZNrWf99s4u+DVmCY6U+w7O3GGG9FvP4EUVYaDu+guWeNLiUzBrqvA==", "hasInstallScript": true, "dependencies": { - "@cypress/request": "^3.0.4", + "@cypress/request": "^3.0.1", "@cypress/xvfb": "^1.2.4", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", @@ -6645,14 +6592,12 @@ "node_modules/cypress/node_modules/proxy-from-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", - "dev": true + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==" }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -6829,7 +6774,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -7130,7 +7074,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -7192,7 +7135,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "dependencies": { "once": "^1.4.0" } @@ -7213,7 +7155,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -7312,7 +7253,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -7324,7 +7264,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -7948,8 +7887,7 @@ "node_modules/eventemitter2": { "version": "6.4.7", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", - "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", - "dev": true + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==" }, "node_modules/eventemitter3": { "version": "5.0.1", @@ -7969,7 +7907,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", @@ -7992,7 +7929,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, "dependencies": { "pify": "^2.2.0" }, @@ -8009,7 +7945,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -8029,7 +7964,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, "engines": [ "node >=0.6.0" ] @@ -8110,7 +8044,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, "dependencies": { "pend": "~1.2.0" } @@ -8119,7 +8052,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -8134,7 +8066,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -8399,7 +8330,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, "engines": { "node": "*" } @@ -8442,7 +8372,6 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -8594,7 +8523,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -8619,7 +8547,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, "dependencies": { "pump": "^3.0.0" }, @@ -8663,7 +8590,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, "dependencies": { "async": "^3.2.0" } @@ -8672,7 +8598,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, "dependencies": { "assert-plus": "^1.0.0" } @@ -8753,7 +8678,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, "dependencies": { "ini": "2.0.0" }, @@ -8835,7 +8759,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -8875,7 +8798,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -8887,7 +8809,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -8899,7 +8820,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -9219,7 +9139,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", - "dev": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^2.0.2", @@ -9246,7 +9165,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, "engines": { "node": ">=8.12.0" } @@ -9312,7 +9230,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -9382,7 +9299,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "engines": { "node": ">=8" } @@ -9408,7 +9324,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, "engines": { "node": ">=10" } @@ -9594,7 +9509,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, "dependencies": { "ci-info": "^3.2.0" }, @@ -9730,7 +9644,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" @@ -9808,7 +9721,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -9880,7 +9792,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -9936,14 +9847,12 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, "engines": { "node": ">=10" }, @@ -10023,8 +9932,7 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/iterator.prototype": { "version": "1.1.2", @@ -10135,8 +10043,7 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "node_modules/jsesc": { "version": "3.0.2", @@ -10165,8 +10072,7 @@ "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -10184,8 +10090,7 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { "version": "2.2.3", @@ -10203,7 +10108,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -10224,7 +10128,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, "engines": [ "node >=0.6.0" ], @@ -10272,7 +10175,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true, "engines": { "node": "> 0.8" } @@ -10764,7 +10666,6 @@ "version": "3.14.0", "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, "dependencies": { "cli-truncate": "^2.1.0", "colorette": "^2.0.16", @@ -10791,7 +10692,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -10888,8 +10788,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash-es": { "version": "4.17.21", @@ -10923,8 +10822,7 @@ "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "node_modules/lodash.sortby": { "version": "4.7.0", @@ -10936,7 +10834,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -10952,7 +10849,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, "dependencies": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", @@ -10970,7 +10866,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -10987,7 +10882,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12742,7 +12636,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "engines": { "node": ">=6" } @@ -12786,7 +12679,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13124,7 +13016,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -13165,7 +13056,6 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -13269,7 +13159,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, "dependencies": { "wrappy": "1" } @@ -13278,7 +13167,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -13310,8 +13198,7 @@ "node_modules/ospath": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==" }, "node_modules/p-limit": { "version": "3.1.0", @@ -13349,7 +13236,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -13515,14 +13401,12 @@ "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { "version": "1.1.0", @@ -13968,7 +13852,6 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, "engines": { "node": ">=6" }, @@ -13989,7 +13872,6 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, "engines": { "node": ">= 0.6.0" } @@ -14040,14 +13922,12 @@ "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -14073,7 +13953,6 @@ "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, "dependencies": { "side-channel": "^1.0.6" }, @@ -14087,8 +13966,7 @@ "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -15473,7 +15351,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, "dependencies": { "throttleit": "^1.0.0" } @@ -15560,8 +15437,7 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { "version": "2.0.0-next.5", @@ -15610,7 +15486,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -15640,8 +15515,7 @@ "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" }, "node_modules/rimraf": { "version": "3.0.2", @@ -15780,7 +15654,6 @@ "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, "dependencies": { "tslib": "^2.1.0" } @@ -15853,8 +15726,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass-lookup": { "version": "6.0.1", @@ -15973,7 +15845,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -16084,7 +15955,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -16101,8 +15971,7 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "devOptional": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simple-bin-help": { "version": "1.8.0", @@ -16162,7 +16031,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -16315,7 +16183,6 @@ "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -16561,7 +16428,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, "engines": { "node": ">=6" } @@ -16993,7 +16859,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -17001,8 +16866,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/tiny-invariant": { "version": "1.3.3", @@ -17052,7 +16916,6 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, "engines": { "node": ">=14.14" } @@ -17086,7 +16949,6 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -17101,7 +16963,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, "engines": { "node": ">= 4.0.0" } @@ -17198,7 +17059,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -17209,8 +17069,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/type-check": { "version": "0.4.0", @@ -17710,7 +17569,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, "engines": { "node": ">= 10.0.0" } @@ -17719,7 +17577,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, "engines": { "node": ">=8" } @@ -17776,7 +17633,6 @@ "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -17870,7 +17726,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, "engines": [ "node >=0.6.0" ], @@ -19591,8 +19446,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/xlsx": { "version": "0.18.5", @@ -19633,7 +19487,6 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" diff --git a/package.json b/package.json index c42834216d3..50711943a85 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "cross-env": "^7.0.3", + "cypress": "^13.14.2", "dayjs": "^1.11.11", "echarts": "^5.5.1", "echarts-for-react": "^3.0.2", @@ -98,7 +99,6 @@ "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.13", - "@types/cypress": "^1.1.3", "@types/events": "^3.0.3", "@types/google.maps": "^3.55.8", "@types/lodash-es": "^4.17.12", @@ -113,7 +113,6 @@ "@typescript-eslint/eslint-plugin": "^7.18.0", "@vitejs/plugin-react-swc": "^3.6.0", "autoprefixer": "^10.4.19", - "cypress": "^13.15.0", "cypress-localstorage-commands": "^2.2.5", "cypress-split": "^1.23.2", "eslint-config-prettier": "^9.1.0", From 7575c1ca7d7798274012b4361c29ad357ce9937c Mon Sep 17 00:00:00 2001 From: Mohammed Nihal <57055998+nihal467@users.noreply.github.com> Date: Tue, 15 Oct 2024 11:16:09 +0200 Subject: [PATCH 08/31] New Cypress Test to verify functionality of Doctor Connect (#8791) --- .../e2e/facility_spec/FacilityLocation.cy.ts | 8 ++- .../patient_spec/PatientDoctorConnect.cy.ts | 56 +++++++++++++++++++ .../Patient/PatientDoctorConnect.ts | 32 +++++++++++ .../Facility/ConsultationDetails/index.tsx | 1 + .../Facility/DoctorVideoSlideover.tsx | 6 +- 5 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts create mode 100644 cypress/pageobject/Patient/PatientDoctorConnect.ts diff --git a/cypress/e2e/facility_spec/FacilityLocation.cy.ts b/cypress/e2e/facility_spec/FacilityLocation.cy.ts index 113a5e3eaab..d29ee95e873 100644 --- a/cypress/e2e/facility_spec/FacilityLocation.cy.ts +++ b/cypress/e2e/facility_spec/FacilityLocation.cy.ts @@ -193,12 +193,16 @@ describe("Location Management Section", () => { facilityLocation.clickAddNewLocationButton(); facilityLocation.enterLocationName("Test Location with Beds"); facilityLocation.selectLocationType("OTHER"); - assetPage.clickassetupdatebutton(); + cy.submitButton("Add Location"); + cy.verifyNotification("Location created successfully"); + cy.closeNotification(); facilityLocation.clickManageBedButton(); facilityLocation.clickAddBedButton(); facilityLocation.enterBedName("Bed 1"); facilityLocation.selectBedType("Regular"); - assetPage.clickassetupdatebutton(); + cy.submitButton("Add Bed(s)"); + cy.verifyNotification("1 Bed created successfully"); + cy.closeNotification(); facilityLocation.loadLocationManagementPage("Dummy Shifting Center"); facilityLocation.deleteLocation("Test Location with Beds"); assetPage.clickassetupdatebutton(); diff --git a/cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts b/cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts new file mode 100644 index 00000000000..64d47db2cf1 --- /dev/null +++ b/cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts @@ -0,0 +1,56 @@ +import { DoctorConnect } from "pageobject/Patient/PatientDoctorConnect"; +import LoginPage from "../../pageobject/Login/LoginPage"; +import { PatientPage } from "../../pageobject/Patient/PatientCreation"; + +describe("Patient Doctor Connect in consultation page", () => { + const loginPage = new LoginPage(); + const patientPage = new PatientPage(); + const doctorconnect = new DoctorConnect(); + const patientName = "Dummy Patient 11"; + const doctorUser = "Dev Doctor"; + const doctorUserNumber = "+919876543219"; + const nurseUser = "Dev Staff"; + const teleIcuUser = "Dev Doctor Two"; + + before(() => { + loginPage.loginAsDisctrictAdmin(); + cy.saveLocalStorage(); + }); + + beforeEach(() => { + cy.restoreLocalStorage(); + cy.clearLocalStorage(/filters--.+/); + cy.awaitUrl("/patients"); + }); + + it("Patient Doctor connect phone redirection and sort by filter", () => { + // click on the slideover and verify icon redirection + patientPage.visitPatient(patientName); + doctorconnect.clickDoctorConnectButton(); + // verify all the users are visible under the all section + cy.verifyContentPresence("#doctor-connect-home-doctor", [doctorUser]); + cy.verifyContentPresence("#doctor-connect-home-nurse", [nurseUser]); + cy.verifyContentPresence("#doctor-connect-remote-doctor", [teleIcuUser]); + // verify copy content button functionality + doctorconnect.CopyFunctionTrigger(); + doctorconnect.clickCopyPhoneNumber( + "#doctor-connect-home-doctor", + doctorUser, + ); + doctorconnect.verifyCopiedContent(doctorUserNumber); + // verify the whatsapp and phone number icon presence + doctorconnect.verifyIconVisible("#whatsapp-icon"); + doctorconnect.verifyIconVisible("#phone-icon"); + // sort the each datas based on user type + doctorconnect.clickUsersSortBy("Doctor"); + cy.verifyContentPresence("#doctor-connect-home-doctor", [doctorUser]); + doctorconnect.clickUsersSortBy("Nurse"); + cy.verifyContentPresence("#doctor-connect-home-nurse", [nurseUser]); + doctorconnect.clickUsersSortBy("TeleICU Doctor"); + cy.verifyContentPresence("#doctor-connect-remote-doctor", [teleIcuUser]); + }); + + afterEach(() => { + cy.saveLocalStorage(); + }); +}); diff --git a/cypress/pageobject/Patient/PatientDoctorConnect.ts b/cypress/pageobject/Patient/PatientDoctorConnect.ts new file mode 100644 index 00000000000..b8c33bb4b24 --- /dev/null +++ b/cypress/pageobject/Patient/PatientDoctorConnect.ts @@ -0,0 +1,32 @@ +export class DoctorConnect { + clickDoctorConnectButton() { + cy.get("#doctor-connect-button").scrollIntoView(); + cy.get("#doctor-connect-button").click(); + } + + CopyFunctionTrigger() { + cy.window().then((win) => { + cy.stub(win.navigator.clipboard, "writeText").as("clipboardStub"); + }); + } + + verifyCopiedContent(text: string) { + cy.get("@clipboardStub").should("be.calledWith", text); + } + + verifyIconVisible(selector: string) { + cy.get(selector).should("be.visible"); + } + + clickCopyPhoneNumber(element: string, text: string) { + cy.get(element) + .contains(text) // Find the element containing "dev doctor" + .parent() // Move up to the parent element (if necessary) + .find("#copy-phoneicon") // Find the #copy-phoneicon within that context + .click(); + } + + clickUsersSortBy(text: string) { + cy.get("#doctor-connect-filter-tabs").contains(text).click(); + } +} diff --git a/src/Components/Facility/ConsultationDetails/index.tsx b/src/Components/Facility/ConsultationDetails/index.tsx index 53e137d12eb..6970898a158 100644 --- a/src/Components/Facility/ConsultationDetails/index.tsx +++ b/src/Components/Facility/ConsultationDetails/index.tsx @@ -256,6 +256,7 @@ export const ConsultationDetails = (props: any) => { {!consultationData.discharge_date && ( <>
From bf0b5df16d19455127e61b5d99846899b0d6bad0 Mon Sep 17 00:00:00 2001 From: Shivank Kacker Date: Tue, 15 Oct 2024 14:54:37 +0530 Subject: [PATCH 09/31] Removed unused packages (#8778) --- package-lock.json | 21 --------------------- package.json | 3 --- 2 files changed, 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9554674c29b..e66a3ea4ead 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,6 @@ "i18next": "^23.11.4", "i18next-browser-languagedetector": "^7.2.1", "lodash-es": "^4.17.21", - "lucide-react": "^0.446.0", "postcss-loader": "^7.3.3", "qrcode.react": "^3.1.0", "raviger": "^4.1.2", @@ -86,7 +85,6 @@ "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.35.0", "eslint-plugin-react-hooks": "^4.6.2", - "gentype": "^4.5.0", "glob": "^11.0.0", "husky": "^8.0.3", "lint-staged": "^13.2.3", @@ -94,7 +92,6 @@ "postcss": "^8.4.38", "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.5", - "prop-types": "^15.8.1", "redux-devtools-extension": "^2.13.9", "snyk": "^1.1291.0", "tailwindcss": "^3.4.3", @@ -8496,16 +8493,6 @@ "node": ">=6.9.0" } }, - "node_modules/gentype": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/gentype/-/gentype-4.5.0.tgz", - "integrity": "sha512-XqHBQPS6Qb2HSgNJAwYRXbQJ4LSvz+MgNvuWnj8bz0teSorsy2kDxA6F1eZx5ft8cnfKAls4uNEgd5uNcPbQDg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "gentype": "gentype.exe" - } - }, "node_modules/get-amd-module-type": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-6.0.0.tgz", @@ -10927,14 +10914,6 @@ "yallist": "^3.0.2" } }, - "node_modules/lucide-react": { - "version": "0.446.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.446.0.tgz", - "integrity": "sha512-BU7gy8MfBMqvEdDPH79VhOXSEgyG8TSPOKWaExWGCQVqnGH7wGgDngPbofu+KdtVjPQBWbEmnfMTq90CTiiDRg==", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" - } - }, "node_modules/magic-string": { "version": "0.30.11", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", diff --git a/package.json b/package.json index 50711943a85..850bba2edae 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,6 @@ "i18next": "^23.11.4", "i18next-browser-languagedetector": "^7.2.1", "lodash-es": "^4.17.21", - "lucide-react": "^0.446.0", "postcss-loader": "^7.3.3", "qrcode.react": "^3.1.0", "raviger": "^4.1.2", @@ -121,7 +120,6 @@ "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.35.0", "eslint-plugin-react-hooks": "^4.6.2", - "gentype": "^4.5.0", "glob": "^11.0.0", "husky": "^8.0.3", "lint-staged": "^13.2.3", @@ -129,7 +127,6 @@ "postcss": "^8.4.38", "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.5", - "prop-types": "^15.8.1", "redux-devtools-extension": "^2.13.9", "snyk": "^1.1291.0", "tailwindcss": "^3.4.3", From 7518c6b5e398c9f798855cfbe3027107346da145 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Tue, 15 Oct 2024 14:55:22 +0530 Subject: [PATCH 10/31] fix: prevent recursive redirect between session expired and root (#8777) --- src/Components/ErrorPages/SessionExpired.tsx | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/Components/ErrorPages/SessionExpired.tsx b/src/Components/ErrorPages/SessionExpired.tsx index 419c9c44dce..32036a0319d 100644 --- a/src/Components/ErrorPages/SessionExpired.tsx +++ b/src/Components/ErrorPages/SessionExpired.tsx @@ -1,23 +1,16 @@ import * as Notification from "../../Utils/Notifications"; -import { useNavigate } from "raviger"; import { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { useAuthContext } from "../../Common/hooks/useAuthUser"; export default function SessionExpired() { - const { signOut, user } = useAuthContext(); - const isAuthenticated = !!user; - const navigate = useNavigate(); + const { signOut } = useAuthContext(); const { t } = useTranslation(); useEffect(() => { Notification.closeAllNotifications(); }, []); - if (isAuthenticated) { - navigate("/"); - } - return (
From e8f898ec77be4a35aa936c0d681c884953199324 Mon Sep 17 00:00:00 2001 From: Hitish Rao P <140695309+HitishRaoP@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:38:00 +0530 Subject: [PATCH 11/31] Death report is missing patient age (#8702) Co-authored-by: Mohammed Nihal <57055998+nihal467@users.noreply.github.com> Co-authored-by: Khavin Shankar Co-authored-by: Rithvik Nishad --- src/Components/DeathReport/DeathReport.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Components/DeathReport/DeathReport.tsx b/src/Components/DeathReport/DeathReport.tsx index 9f48e348402..2424d46f607 100644 --- a/src/Components/DeathReport/DeathReport.tsx +++ b/src/Components/DeathReport/DeathReport.tsx @@ -1,6 +1,4 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { useEffect, useState } from "react"; -import { statusType, useAbortableEffect } from "../../Common/utils"; +import { useState } from "react"; import { GENDER_TYPES } from "../../Common/constants"; import TextFormField from "../Form/FormFields/TextFormField"; import TextAreaFormField from "../Form/FormFields/TextAreaFormField"; @@ -8,8 +6,8 @@ import DateFormField from "../Form/FormFields/DateFormField"; import PhoneNumberFormField from "../Form/FormFields/PhoneNumberFormField"; import { formatDateTime, + formatPatientAge, humanizeStrings, - patientAgeInYears, } from "../../Utils/utils"; import Page from "../Common/components/Page"; import Form from "../Form/Form"; @@ -111,7 +109,7 @@ export default function PrintDeathReport(props: { id: string }) { const patientComorbidities = getPatientComorbidities(res.data); const data = { ...res.data, - age: patientAgeInYears(res.data!), + age: formatPatientAge(res.data!, true), gender: patientGender, address: patientAddress, comorbidities: patientComorbidities, @@ -372,7 +370,7 @@ export default function PrintDeathReport(props: { id: string }) {
From b02062a836df8559e19870f7c7268de4a2346032 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Wed, 16 Oct 2024 15:53:11 +0530 Subject: [PATCH 12/31] Fixes multiple tiny issues (#8784) --- public/favicon-light.ico | Bin 217598 -> 0 bytes public/favicon.ico | Bin 217598 -> 6439 bytes src/App.tsx | 2 -- src/CAREUI/misc/PaginatedList.tsx | 10 ++++++- src/CAREUI/misc/ThemedFavicon.tsx | 14 ---------- src/Components/ABDM/LinkABHANumberModal.tsx | 1 - src/Components/Assets/AssetsList.tsx | 1 - src/Components/Common/Breadcrumbs.tsx | 9 +++--- src/Components/Common/Sidebar/Sidebar.tsx | 10 +++---- .../Common/Sidebar/SidebarUserCard.tsx | 8 +----- .../Facility/DischargedPatientsList.tsx | 26 +++++++++--------- src/Components/Facility/FacilityBlock.tsx | 6 ++-- src/Components/Facility/FacilityCard.tsx | 7 +---- src/Components/Facility/FacilityHome.tsx | 22 ++++++--------- .../Facility/LocationManagement.tsx | 22 +++++++-------- src/Components/Patient/ManagePatients.tsx | 9 +++--- .../Patient/PatientConsentRecordBlock.tsx | 5 +--- src/Components/Patient/PatientHome.tsx | 2 +- src/Components/Patient/PatientRegister.tsx | 6 ++-- src/Components/Users/ManageUsers.tsx | 6 ++-- src/Components/Users/SkillsSlideOver.tsx | 1 + src/Locale/en.json | 9 ++++-- src/Routers/AppRouter.tsx | 2 +- 23 files changed, 75 insertions(+), 103 deletions(-) delete mode 100644 public/favicon-light.ico delete mode 100644 src/CAREUI/misc/ThemedFavicon.tsx diff --git a/public/favicon-light.ico b/public/favicon-light.ico deleted file mode 100644 index 244b9d6c1d30aab5b36ffafc41845202059a07d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217598 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 W+mE&7plRj;>^scKcsnF+4*vt$Z=fLn diff --git a/public/favicon.ico b/public/favicon.ico index 244b9d6c1d30aab5b36ffafc41845202059a07d8..67a5686e32ffe2212a032deb9ee098827e52f887 100644 GIT binary patch literal 6439 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 Apa1{> literal 217598 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 W+mE&7plRj;>^scKcsnF+4*vt$Z=fLn diff --git a/src/App.tsx b/src/App.tsx index 98cf307f18a..c02982fd6df 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,5 @@ import { Suspense } from "react"; import Routers from "./Routers"; -import ThemedFavicon from "./CAREUI/misc/ThemedFavicon"; import Integrations from "./Integrations"; import Loading from "./Components/Common/Loading"; import HistoryAPIProvider from "./Providers/HistoryAPIProvider"; @@ -11,7 +10,6 @@ import { Toaster } from "./Components/ui/toaster"; const App = () => { return ( }> - }> diff --git a/src/CAREUI/misc/PaginatedList.tsx b/src/CAREUI/misc/PaginatedList.tsx index ec270bf8134..3b68b23bd30 100644 --- a/src/CAREUI/misc/PaginatedList.tsx +++ b/src/CAREUI/misc/PaginatedList.tsx @@ -33,6 +33,8 @@ function useContextualized() { interface Props extends QueryOptions> { route: QueryRoute>; perPage?: number; + initialPage?: number; + onPageChange?: (page: number) => void; queryCB?: ( query: ReturnType>>, ) => void; @@ -49,7 +51,13 @@ export default function PaginatedList({ queryCB, ...queryOptions }: Props) { - const [currentPage, setPage] = useState(1); + const [currentPage, _setPage] = useState(queryOptions.initialPage ?? 1); + + const setPage = (page: number) => { + _setPage(page); + queryOptions.onPageChange?.(page); + }; + const query = useQuery(route, { ...queryOptions, query: { diff --git a/src/CAREUI/misc/ThemedFavicon.tsx b/src/CAREUI/misc/ThemedFavicon.tsx deleted file mode 100644 index b908f566b89..00000000000 --- a/src/CAREUI/misc/ThemedFavicon.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { useEffect } from "react"; - -export default function ThemedFavicon() { - useEffect(() => { - const darkThemeMq = window.matchMedia("(prefers-color-scheme: dark)"); - const favicon = document.querySelector( - "link[rel~='icon']", - ) as HTMLLinkElement; - - favicon.href = darkThemeMq.matches ? "/favicon-light.ico" : "/favicon.ico"; - }, []); - - return null; -} diff --git a/src/Components/ABDM/LinkABHANumberModal.tsx b/src/Components/ABDM/LinkABHANumberModal.tsx index 8d6365387cd..c2855ae7569 100644 --- a/src/Components/ABDM/LinkABHANumberModal.tsx +++ b/src/Components/ABDM/LinkABHANumberModal.tsx @@ -225,7 +225,6 @@ const ScanABHAQRSection = ({ Notify.Error({ msg: "Linking Failed" }); } } catch (e) { - console.log(e); Notify.Error({ msg: "Invalid ABHA QR" }); } finally { setIsLoading(false); diff --git a/src/Components/Assets/AssetsList.tsx b/src/Components/Assets/AssetsList.tsx index ee27c2a484f..77961d15b0d 100644 --- a/src/Components/Assets/AssetsList.tsx +++ b/src/Components/Assets/AssetsList.tsx @@ -159,7 +159,6 @@ const AssetsList = () => { }); } } catch (err) { - console.log(err); Notification.Error({ msg: t("invalid_asset_id_msg"), }); diff --git a/src/Components/Common/Breadcrumbs.tsx b/src/Components/Common/Breadcrumbs.tsx index c092ecbbc93..aaee7ac0b64 100644 --- a/src/Components/Common/Breadcrumbs.tsx +++ b/src/Components/Common/Breadcrumbs.tsx @@ -58,8 +58,8 @@ export default function Breadcrumbs({ style: replacements[field]?.style || "", })); - const renderCrumb = (crumb: any, index: number, array: any[]) => { - const isLastItem = index === array.length - 1; + const renderCrumb = (crumb: any, index: number) => { + const isLastItem = index === crumbs!.length - 1; return (
  • )} - {crumbs && - crumbs.length > 0 && - renderCrumb(crumbs[crumbs.length - 1], crumbs.length - 1, crumbs)} + {crumbs?.length && + renderCrumb(crumbs[crumbs.length - 1], crumbs.length - 1)} ); diff --git a/src/Components/Common/Sidebar/Sidebar.tsx b/src/Components/Common/Sidebar/Sidebar.tsx index 0e9ee34b715..31efe00f1b1 100644 --- a/src/Components/Common/Sidebar/Sidebar.tsx +++ b/src/Components/Common/Sidebar/Sidebar.tsx @@ -104,11 +104,11 @@ const StatelessSidebar = ({ : "overflow-y-auto overflow-x-hidden" }`} > - {shrinked && ( + {setShrinked && shrinked && (
    setShrinked && setShrinked(!shrinked)} + toggle={() => setShrinked(!shrinked)} />
    )} @@ -123,11 +123,11 @@ const StatelessSidebar = ({ src={shrinked ? LOGO_COLLAPSE : careConfig.mainLogo?.light} /> - {!shrinked && ( + {setShrinked && !shrinked && (
    setShrinked && setShrinked(!shrinked)} + toggle={() => setShrinked(!shrinked)} />
    )} @@ -220,7 +220,7 @@ interface ToggleShrinkProps { const ToggleShrink = ({ shrinked, toggle }: ToggleShrinkProps) => (
    = ({ shrinked }) => { id="sign-out-button" className={`flex h-full items-center justify-start transition-all duration-200 ease-in-out ${shrinked ? "pl-2" : "pl-5 pr-4"}`} > -
    - -
    - + {!shrinked && (
    {t("sign_out")} diff --git a/src/Components/Facility/DischargedPatientsList.tsx b/src/Components/Facility/DischargedPatientsList.tsx index 6603f3964af..47e5cd5a68d 100644 --- a/src/Components/Facility/DischargedPatientsList.tsx +++ b/src/Components/Facility/DischargedPatientsList.tsx @@ -47,15 +47,16 @@ const DischargedPatientsList = ({ pathParams: { id: facility_external_id }, }); - const { qParams, updateQuery, advancedFilter, FilterBadges } = useFilters({ - limit: 12, - cacheBlacklist: [ - "name", - "patient_no", - "phone_number", - "emergency_phone_number", - ], - }); + const { qParams, updateQuery, advancedFilter, FilterBadges, updatePage } = + useFilters({ + limit: 12, + cacheBlacklist: [ + "name", + "patient_no", + "phone_number", + "emergency_phone_number", + ], + }); useEffect(() => { if (!qParams.phone_number && phone_number.length >= 13) { @@ -434,10 +435,9 @@ const DischargedPatientsList = ({ route={routes.listFacilityDischargedPatients} pathParams={{ facility_external_id }} query={{ ordering: "-modified_date", ...qParams }} - queryCB={(query) => { - setCount(query.data?.count || 0); - console.log(query.data?.count); - }} + queryCB={(query) => setCount(query.data?.count || 0)} + initialPage={qParams.page} + onPageChange={updatePage} > {() => (
    diff --git a/src/Components/Facility/FacilityBlock.tsx b/src/Components/Facility/FacilityBlock.tsx index 64c0a24d78d..891bb4d4e59 100644 --- a/src/Components/Facility/FacilityBlock.tsx +++ b/src/Components/Facility/FacilityBlock.tsx @@ -1,6 +1,6 @@ import { Link } from "raviger"; -import CareIcon from "../../CAREUI/icons/CareIcon"; import { FacilityModel } from "./models"; +import { Avatar } from "@/Components/Common/Avatar"; export default function FacilityBlock(props: { facility: FacilityModel }) { const { facility } = props; @@ -18,9 +18,7 @@ export default function FacilityBlock(props: { facility: FacilityModel }) { src={facility.read_cover_image_url} /> ) : ( - <> - - + )}
    diff --git a/src/Components/Facility/FacilityCard.tsx b/src/Components/Facility/FacilityCard.tsx index 0febe36e4b7..f3614d2685a 100644 --- a/src/Components/Facility/FacilityCard.tsx +++ b/src/Components/Facility/FacilityCard.tsx @@ -61,12 +61,7 @@ export const FacilityCard = (props: { facility: any; userType: any }) => { alt={facility.name} className="h-full max-h-32 w-full object-cover" /> - )) || ( - - )} + )) || }
    diff --git a/src/Components/Facility/FacilityHome.tsx b/src/Components/Facility/FacilityHome.tsx index 7edbb939b8a..6f73fee4a54 100644 --- a/src/Components/Facility/FacilityHome.tsx +++ b/src/Components/Facility/FacilityHome.tsx @@ -43,6 +43,7 @@ type Props = { }; import Loading from "@/Components/Common/Loading"; +import { Avatar } from "@/Components/Common/Avatar.js"; export const getFacilityFeatureIcon = (featureId: number) => { const feature = FACILITY_FEATURE_TYPES.find((f) => f.id === featureId); if (!feature?.icon) return null; @@ -124,7 +125,7 @@ export const FacilityHome = ({ facilityId }: Props) => { onClick={() => setEditCoverImage(true)} > - {`${hasCoverImage ? "Edit" : "Upload"}`} + {t(hasCoverImage ? "edit" : "upload")}
    ); @@ -181,11 +182,7 @@ export const FacilityHome = ({ facilityId }: Props) => { hasPermissionToEditCoverImage && setEditCoverImage(true) } > -
    )} @@ -210,13 +207,7 @@ export const FacilityHome = ({ facilityId }: Props) => { ) : (
    - - - +
    )} {editCoverImageTooltip} @@ -291,7 +282,10 @@ export const FacilityHome = ({ facilityId }: Props) => {
    {spokesQuery.data?.results.map((spoke) => ( - + ))}
    diff --git a/src/Components/Facility/LocationManagement.tsx b/src/Components/Facility/LocationManagement.tsx index 1aaf57b7233..2223aa2e8fd 100644 --- a/src/Components/Facility/LocationManagement.tsx +++ b/src/Components/Facility/LocationManagement.tsx @@ -16,6 +16,7 @@ import useAuthUser from "../../Common/hooks/useAuthUser"; import useQuery from "../../Utils/request/useQuery"; import Loading from "@/Components/Common/Loading"; +import { cn } from "@/lib/utils"; interface Props { facilityId: string; } @@ -87,14 +88,14 @@ export default function LocationManagement({ facilityId }: Props) { id="add-new-location" href={`/facility/${facilityId}/location/add`} authorizeFor={NonReadOnlyUsers} - className="mr-4 hidden lg:block" + className="hidden lg:block" > Add New Location } > -
    +
    - className="my-8 grid gap-3 @4xl:grid-cols-2 @6xl:grid-cols-3 @[100rem]:grid-cols-4 lg:mx-8"> + className="my-8 grid gap-3 @4xl:grid-cols-2 @6xl:grid-cols-3 @[100rem]:grid-cols-4"> {(item) => ( { - const { loading, data } = useQuery(routes.listFacilityBeds, { + const bedsQuery = useQuery(routes.listFacilityBeds, { query: { facility: facilityId, location: id, }, }); - const totalBeds = data?.count ?? 0; - - if (loading) { - return ; - } + const totalBeds = bedsQuery.data?.count; return (
    @@ -290,13 +287,16 @@ const Location = ({ id="manage-bed-button" variant="secondary" border - className="mt-3 flex w-full items-center justify-between" + className={cn( + "mt-3 flex w-full items-center justify-between", + totalBeds != null && "opacity-50", + )} href={`location/${id}/beds`} > Manage Beds - {totalBeds} + {totalBeds ?? "--"}
    diff --git a/src/Components/Patient/ManagePatients.tsx b/src/Components/Patient/ManagePatients.tsx index 0be6fe6b819..46dad347dd5 100644 --- a/src/Components/Patient/ManagePatients.tsx +++ b/src/Components/Patient/ManagePatients.tsx @@ -471,7 +471,7 @@ export const PatientManager = () => { let patientList: ReactNode[] = []; if (data?.count) { - patientList = data.results.map((patient: any) => { + patientList = data.results.map((patient) => { let patientUrl = ""; if ( patient.last_consultation && @@ -506,7 +506,7 @@ export const PatientManager = () => {
    -
    +
    {patient?.last_consultation?.current_bed && patient?.last_consultation?.discharge_date === null ? (
    @@ -541,9 +541,10 @@ export const PatientManager = () => {
    ) : ( -
    +
    diff --git a/src/Components/Patient/PatientConsentRecordBlock.tsx b/src/Components/Patient/PatientConsentRecordBlock.tsx index 07931380cb6..b66a6cbd8aa 100644 --- a/src/Components/Patient/PatientConsentRecordBlock.tsx +++ b/src/Components/Patient/PatientConsentRecordBlock.tsx @@ -70,10 +70,7 @@ export default function PatientConsentRecordBlockGroup(props: { { - console.log(e.value); - setPatientCodeStatus(e.value); - }} + onChange={(e) => setPatientCodeStatus(e.value)} value={ CONSENT_PATIENT_CODE_STATUS_CHOICES.find( (c) => c.id === patientCodeStatus, diff --git a/src/Components/Patient/PatientHome.tsx b/src/Components/Patient/PatientHome.tsx index f6fe4f28a72..4b88df5bd20 100644 --- a/src/Components/Patient/PatientHome.tsx +++ b/src/Components/Patient/PatientHome.tsx @@ -253,7 +253,7 @@ export const PatientHome = (props: any) => { return ( {
    {field("nationality").value === "India" && ( -
    +
    {
    )} -
    +
    {
    -
    +

    Insurance Details diff --git a/src/Components/Users/ManageUsers.tsx b/src/Components/Users/ManageUsers.tsx index 2a00a2a8305..801ffae03af 100644 --- a/src/Components/Users/ManageUsers.tsx +++ b/src/Components/Users/ManageUsers.tsx @@ -415,7 +415,7 @@ export default function ManageUsers() { }} > -

    Linked Facilities

    +

    {t("linked_facilities")}

    -

    Linked Skills

    +

    {t("linked_skills")}

    {["DistrictAdmin", "StateAdmin"].includes( @@ -781,7 +781,7 @@ export function UserFacilities(props: { user: any }) { selected={facility} setSelected={setFacility} errors="" - className="z-40" + className="z-40 w-full" /> { selected={selectedSkill} setSelected={setSelectedSkill} errors="" + className="w-full" userSkills={skills?.results || []} /> -
    +
    {pages}
    From 45a39301cc938d042f1c568940a9a697abf52140 Mon Sep 17 00:00:00 2001 From: Gigin George Date: Wed, 16 Oct 2024 16:00:22 +0530 Subject: [PATCH 13/31] WIP: Care Plugin Support (#8660) Co-authored-by: Shivank Kacker --- .cursorrules | 23 + .env.docker | 2 + .example.env | 2 + .gitignore | 4 + .nvmrc | 1 + .prettierrc.json | 7 +- README.md | 19 +- care.config.ts | 7 + cypress/e2e/users_spec/UsersHomepage.cy.ts | 2 +- .../pageobject/Facility/FacilityCreation.ts | 2 +- package-lock.json | 1090 ++++++++--------- package.json | 21 +- scripts/setup-care-apps.js | 113 ++ src/App.tsx | 26 +- src/CAREUI/display/Timeline.tsx | 4 +- src/CAREUI/icons/CareIcon.tsx | 39 +- src/CAREUI/icons/icon.js | 49 - src/CAREUI/interactive/LegendInput.tsx | 13 +- src/Common/hooks/useCareApps.ts | 35 + .../CentralLiveMonitoring/index.tsx | 2 +- src/Components/Common/ErrorBoundary.tsx | 36 + src/Components/Common/Sidebar/Sidebar.tsx | 19 +- src/Components/Common/Sidebar/SidebarItem.tsx | 22 +- src/Components/Common/SortDropdown.tsx | 1 + .../Facility/DoctorVideoSlideover.tsx | 2 + .../{HospitalList.tsx => FacilityList.tsx} | 2 +- .../Notifications/ShowPushNotification.tsx | 3 +- src/Components/Users/UserProfile.tsx | 100 +- src/Locale/en.json | 27 +- src/PluginEngine.tsx | 51 + src/Redux/api.tsx | 2 +- src/Routers/AppRouter.tsx | 37 +- src/Routers/routes/AssetRoutes.tsx | 25 +- src/Routers/routes/ConsultationRoutes.tsx | 68 +- .../routes/FacilityInventoryRoutes.tsx | 19 +- src/Routers/routes/FacilityLocationRoutes.tsx | 25 +- src/Routers/routes/FacilityRoutes.tsx | 31 +- src/Routers/routes/HCXRoutes.tsx | 17 +- src/Routers/routes/PatientRoutes.tsx | 26 +- src/Routers/routes/ResourceRoutes.tsx | 12 +- src/Routers/routes/SampleRoutes.tsx | 20 +- src/Routers/routes/ShiftingRoutes.tsx | 11 +- src/Routers/routes/UserRoutes.tsx | 5 +- src/Utils/useTimer.tsx | 2 +- src/pluginTypes.ts | 54 + src/vite-env.d.ts | 1 + tsconfig.json | 5 +- vite.config.mts | 61 +- 48 files changed, 1275 insertions(+), 870 deletions(-) create mode 100644 .cursorrules create mode 100644 .env.docker create mode 100644 .nvmrc create mode 100644 scripts/setup-care-apps.js delete mode 100644 src/CAREUI/icons/icon.js create mode 100644 src/Common/hooks/useCareApps.ts create mode 100644 src/Components/Common/ErrorBoundary.tsx rename src/Components/Facility/{HospitalList.tsx => FacilityList.tsx} (99%) create mode 100644 src/PluginEngine.tsx create mode 100644 src/pluginTypes.ts diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 00000000000..a561180ab91 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,23 @@ +Care is a React Typescript Project, built with Vite and styled with TailwindCSS. + +Care uses a Plugin Architecture. Apps are installed in /apps. + +Care uses a custom useQuery hook to fetch data from the API. APIs are defined in the api.tsx file + +Here's an example of how to use the useQuery hook to fetch data from the API: + +``` +useQuery from "@/Common/hooks/useQuery"; +const { data, loading, error } = useQuery(routes.getFacilityUsers, { + facility_id: "1", +}); + +request from "@/Common/utils/request"; +const { res } = await request(routes.partialUpdateAsset, { + pathParams: { external_id: assetId }, + body: data, +}); +``` + + + diff --git a/.env.docker b/.env.docker new file mode 100644 index 00000000000..fb5179c6c50 --- /dev/null +++ b/.env.docker @@ -0,0 +1,2 @@ +# Care API URL without the /api prefix +REACT_CARE_API_URL=http://localhost:9000 \ No newline at end of file diff --git a/.example.env b/.example.env index f3f303bc1e3..0ce9043b9a3 100644 --- a/.example.env +++ b/.example.env @@ -16,6 +16,8 @@ REACT_PLAUSIBLE_SITE_DOMAIN= # Plausible server URL (default: https://plausible.10bedicu.in) REACT_PLAUSIBLE_SERVER_URL= +# Care Apps. repo@branch seperated by commas +REACT_ENABLED_APPS="ohcnetwork/care_livekit_fe@main,ohcnetwork/care_scribe" # Main logo (JSON string with light and dark properties) REACT_HEADER_LOGO= diff --git a/.gitignore b/.gitignore index d8e2615c727..000a965c44a 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,7 @@ bun.lockb # Cypress cypress/downloads cypress/fixtures/token.json + +# Care Apps +/apps/* +src/pluginMap.ts diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000000..2edeafb09db --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +20 \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json index e3a9c2acae9..ba722afdd73 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -5,7 +5,6 @@ "semi": true, "jsxSingleQuote": false, "arrowParens": "always", - "tailwindFunctions": [ - "classNames" - ] -} \ No newline at end of file + "tailwindFunctions": ["classNames"], + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/README.md b/README.md index 73ce06815d1..7ea8fe1a221 100644 --- a/README.md +++ b/README.md @@ -8,20 +8,22 @@

    Our goal is to continuously improve the quality and accessibility of public healthcare services using digital tools.

    -

    🚀 Staging Deploy

    -

    +

    🚀 Staging Deployment

    +
    + +[![Netlify Status](https://api.netlify.com/api/v1/badges/de76351f-b1f0-4bf8-8445-d9faf6391b13/deploy-status)](https://app.netlify.com/sites/care-ohc/deploys) + +

    Auto deployed to care.ohc.network for develop branch. All pull requests have preview builds powered by Netlify.

    [![](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/images/0)](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/links/0)[![](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/images/1)](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/links/1)[![](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/images/2)](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/links/2)[![](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/images/3)](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/links/3)[![](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/images/4)](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/links/4)[![](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/images/5)](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/links/5)[![](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/images/6)](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/links/6)[![](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/images/7)](https://sourcerer.io/fame/tomahawk-pilot/ohcnetwork/care_fe/links/7) -[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=coronasafe_care_fe&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=coronasafe_care_fe) ![Code scanning - action](https://github.com/ohcnetwork/care_fe/workflows/Code%20scanning%20-%20action/badge.svg) ![OSSAR](https://github.com/ohcnetwork/care_fe/workflows/OSSAR/badge.svg) [![Cypress Tests](https://img.shields.io/endpoint?url=https://cloud.cypress.io/badge/simple/wf7d2m/develop&style=flat&logo=cypress)](https://cloud.cypress.io/projects/wf7d2m/runs) ![Staging Release](https://github.com/ohcnetwork/care_fe/workflows/CARE%20Develop%20Registry/badge.svg) ![Production Release](https://github.com/ohcnetwork/care_fe/workflows/Production%20Release/badge.svg) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/200482ab117e4b5397ff3f5ae5719aa2)](https://www.codacy.com/gh/ohcnetwork/care_fe?utm_source=github.com&utm_medium=referral&utm_content=ohcnetwork/care_fe&utm_campaign=Badge_Grade) -[![CircleCI](https://circleci.com/gh/ohcnetwork/care_fe.svg?style=svg)](https://circleci.com/gh/ohcnetwork/care_fe) [![Maintainability](https://api.codeclimate.com/v1/badges/f1438f693aa459805301/maintainability)](https://codeclimate.com/github/ohcnetwork/care_fe/maintainability) ## Getting started @@ -33,7 +35,14 @@ #### Install the required dependencies ```sh -npm install +npm run install-all +``` +#### First-time setup + +For first-time setup, run the following command to generate the pluginMap and install plugin configurations: + +```sh +npm run setup ``` #### 🏃 Run the app in development mode diff --git a/care.config.ts b/care.config.ts index c032ba613f3..ed82d69554a 100644 --- a/care.config.ts +++ b/care.config.ts @@ -103,6 +103,13 @@ const careConfig = { abdm: { enabled: (env.REACT_ENABLE_ABDM ?? "true") === "true", }, + + careApps: env.REACT_ENABLED_APPS + ? env.REACT_ENABLED_APPS.split(",").map((app) => ({ + branch: app.split("@")[1], + package: app.split("@")[0], + })) + : [], } as const; export default careConfig; diff --git a/cypress/e2e/users_spec/UsersHomepage.cy.ts b/cypress/e2e/users_spec/UsersHomepage.cy.ts index 0cf25cacfc8..634336a4ef9 100644 --- a/cypress/e2e/users_spec/UsersHomepage.cy.ts +++ b/cypress/e2e/users_spec/UsersHomepage.cy.ts @@ -14,7 +14,7 @@ describe("User Homepage", () => { const altPhoneNumber = "8878825662"; const homeFacility = "Dummy Facility 40"; const nurseUserName = "dummynurse1"; - const doctorUserName = "devdoctor"; + const doctorUserName = "devdoctor1"; before(() => { loginPage.loginAsDisctrictAdmin(); diff --git a/cypress/pageobject/Facility/FacilityCreation.ts b/cypress/pageobject/Facility/FacilityCreation.ts index 26f387935ac..fe838a88f41 100644 --- a/cypress/pageobject/Facility/FacilityCreation.ts +++ b/cypress/pageobject/Facility/FacilityCreation.ts @@ -297,7 +297,7 @@ 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.get("#facility-location-button").click(); cy.wait("@mapApi").its("response.statusCode").should("eq", 200); cy.get("input#pac-input").type(location).type("{enter}"); cy.wait(2000); diff --git a/package-lock.json b/package-lock.json index e66a3ea4ead..e5bae3c6d02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "care_fe", "version": "2.5.4", "license": "MIT", + "workspaces": [ + "apps/*" + ], "dependencies": { "@fontsource/figtree": "^5.1.0", "@googlemaps/react-wrapper": "^1.1.35", @@ -20,7 +23,7 @@ "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-toast": "^1.2.2", "@sentry/browser": "^8.33.0", - "@yudiel/react-qr-scanner": "^2.0.0-beta.3", + "@yudiel/react-qr-scanner": "^2.0.8", "axios": "^1.7.7", "bowser": "^2.11.0", "browser-image-compression": "^2.0.2", @@ -68,7 +71,7 @@ "@types/lodash-es": "^4.17.12", "@types/node": "^22.7.4", "@types/qrcode.react": "^1.0.5", - "@types/react": "18.3.2", + "@types/react": "^18.3.11", "@types/react-copy-to-clipboard": "^5.0.7", "@types/react-csv": "^1.1.10", "@types/react-dom": "^18.3.0", @@ -79,6 +82,7 @@ "autoprefixer": "^10.4.19", "cypress-localstorage-commands": "^2.2.5", "cypress-split": "^1.23.2", + "dotenv": "^16.4.5", "eslint-config-prettier": "^9.1.0", "eslint-plugin-i18next": "^6.0.9", "eslint-plugin-mdx": "^3.1.5", @@ -106,6 +110,24 @@ "node": ">=20.12.0" } }, + "apps/care_livekit_fe": { + "name": "care-livekit", + "version": "0.0.1", + "license": "ISC", + "dependencies": { + "@livekit/components-react": "^2.6.2", + "@livekit/components-styles": "^1.1.3", + "livekit-client": "^2.5.5" + }, + "devDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependencies": { + "react": "18.3.1", + "react-dom": "18.3.1" + } + }, "node_modules/@actions/core": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", @@ -178,18 +200,18 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", - "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", - "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -198,10 +220,10 @@ "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-module-transforms": "^7.25.7", "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.7", + "@babel/parser": "^7.25.8", "@babel/template": "^7.25.7", "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/types": "^7.25.8", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -636,12 +658,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "dev": true, "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -741,69 +763,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", @@ -834,30 +793,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", @@ -873,108 +808,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", @@ -1007,14 +840,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", - "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz", + "integrity": "sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.7", "@babel/helper-remap-async-to-generator": "^7.25.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/traverse": "^7.25.7" }, "engines": { @@ -1088,14 +920,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", - "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", + "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1212,13 +1043,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", - "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", + "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1244,13 +1074,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", - "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", + "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1293,13 +1122,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", - "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", + "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1324,13 +1152,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", - "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", + "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1453,13 +1280,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", - "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", + "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1469,13 +1295,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", - "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", + "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1485,14 +1310,13 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", - "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", + "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.25.7" }, "engines": { @@ -1519,13 +1343,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", - "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", + "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1535,14 +1358,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", - "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", + "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1583,15 +1405,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", - "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", + "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.7", "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1786,12 +1607,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", - "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.8.tgz", + "integrity": "sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.25.7", + "@babel/compat-data": "^7.25.8", "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", "@babel/helper-validator-option": "^7.25.7", @@ -1801,45 +1622,30 @@ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.25.7", "@babel/plugin-syntax-import-attributes": "^7.25.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.8", "@babel/plugin-transform-async-to-generator": "^7.25.7", "@babel/plugin-transform-block-scoped-functions": "^7.25.7", "@babel/plugin-transform-block-scoping": "^7.25.7", "@babel/plugin-transform-class-properties": "^7.25.7", - "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.8", "@babel/plugin-transform-classes": "^7.25.7", "@babel/plugin-transform-computed-properties": "^7.25.7", "@babel/plugin-transform-destructuring": "^7.25.7", "@babel/plugin-transform-dotall-regex": "^7.25.7", "@babel/plugin-transform-duplicate-keys": "^7.25.7", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", - "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.8", "@babel/plugin-transform-exponentiation-operator": "^7.25.7", - "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.8", "@babel/plugin-transform-for-of": "^7.25.7", "@babel/plugin-transform-function-name": "^7.25.7", - "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.8", "@babel/plugin-transform-literals": "^7.25.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.8", "@babel/plugin-transform-member-expression-literals": "^7.25.7", "@babel/plugin-transform-modules-amd": "^7.25.7", "@babel/plugin-transform-modules-commonjs": "^7.25.7", @@ -1847,15 +1653,15 @@ "@babel/plugin-transform-modules-umd": "^7.25.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", "@babel/plugin-transform-new-target": "^7.25.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", - "@babel/plugin-transform-numeric-separator": "^7.25.7", - "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.8", + "@babel/plugin-transform-numeric-separator": "^7.25.8", + "@babel/plugin-transform-object-rest-spread": "^7.25.8", "@babel/plugin-transform-object-super": "^7.25.7", - "@babel/plugin-transform-optional-catch-binding": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.8", + "@babel/plugin-transform-optional-chaining": "^7.25.8", "@babel/plugin-transform-parameters": "^7.25.7", "@babel/plugin-transform-private-methods": "^7.25.7", - "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.8", "@babel/plugin-transform-property-literals": "^7.25.7", "@babel/plugin-transform-regenerator": "^7.25.7", "@babel/plugin-transform-reserved-words": "^7.25.7", @@ -1958,9 +1764,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.25.7", @@ -1971,6 +1777,11 @@ "node": ">=6.9.0" } }, + "node_modules/@bufbuild/protobuf": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.10.0.tgz", + "integrity": "sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==" + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -2539,9 +2350,9 @@ } }, "node_modules/@floating-ui/react": { - "version": "0.26.24", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.24.tgz", - "integrity": "sha512-2ly0pCkZIGEQUq5H8bBK0XJmc1xIK/RM3tvVzY3GBER7IOD1UgmC2Y2tjj4AuS+TC+vTE1KJv2053290jua0Sw==", + "version": "0.26.25", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.25.tgz", + "integrity": "sha512-hZOmgN0NTOzOuZxI1oIrDu3Gcl8WViIkvPMpB4xdd4QD6xAMtwgwr3VPoiyH/bLtRcS1cDnhxLSD1NsMJmwh/A==", "dependencies": { "@floating-ui/react-dom": "^2.1.2", "@floating-ui/utils": "^0.2.8", @@ -2596,9 +2407,9 @@ "integrity": "sha512-3iHuO8H0jPehftsMK0kgyJzPYU/g/oiTRw+wu/yltqSZ7wJPt3vfsJHkPiuRpQjbnnWygX+T3mkRGyK/eyZ/lw==" }, "node_modules/@headlessui/react": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.1.9.tgz", - "integrity": "sha512-ckWw7vlKtnoa1fL2X0fx1a3t/Li9MIKDVXn3SgG65YlxvDAsNrY39PPCxVM7sQRA7go2fJsuHSSauKFNaJHH7A==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.1.10.tgz", + "integrity": "sha512-6mLa2fjMDAFQi+/R10B+zU3edsUk/MDtENB2zHho0lqKU1uzhAfJLUduWds4nCo8wbl3vULtC5rJfZAQ1yqIng==", "dependencies": { "@floating-ui/react": "^0.26.16", "@react-aria/focus": "^3.17.1", @@ -2834,6 +2645,64 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@livekit/components-core": { + "version": "0.11.9", + "resolved": "https://registry.npmjs.org/@livekit/components-core/-/components-core-0.11.9.tgz", + "integrity": "sha512-LPE1BZ+YTaqsVqGy/GAlpiO5rEI8XpEaf1TQcGdZN1BCBas9hTHt7/aHMbHQJ0K5xuAFQx8is6dFe451T4qXIQ==", + "dependencies": { + "@floating-ui/dom": "1.6.11", + "loglevel": "1.9.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "livekit-client": "^2.5.7", + "tslib": "^2.6.2" + } + }, + "node_modules/@livekit/components-react": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@livekit/components-react/-/components-react-2.6.5.tgz", + "integrity": "sha512-G3BpBlKy+lWTV9MH3/oBTBC17Z8CWqZ9GnjcG/xmYI0IvqmY89tVWph7cj2Bq0taniA+mD3U9EMPr68fOb1m1g==", + "dependencies": { + "@livekit/components-core": "0.11.9", + "clsx": "2.1.1", + "usehooks-ts": "3.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@livekit/krisp-noise-filter": "^0.2.12", + "livekit-client": "^2.5.7", + "react": ">=18", + "react-dom": ">=18", + "tslib": "^2.6.2" + }, + "peerDependenciesMeta": { + "@livekit/krisp-noise-filter": { + "optional": true + } + } + }, + "node_modules/@livekit/components-styles": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@livekit/components-styles/-/components-styles-1.1.4.tgz", + "integrity": "sha512-QCupn7tQ/dy/WZclrfsgtDe8peiGYS6Ied1IGkKOysaXo04l90t62SIUTKyxgd0dNDhUDC0p34qCggGZs/44lQ==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@livekit/protocol": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@livekit/protocol/-/protocol-1.24.0.tgz", + "integrity": "sha512-9dCsqnkMn7lvbI4NGh18zhLDsrXyUcpS++TEFgEk5Xv1WM3R2kT3EzqgL1P/mr3jaabM6rJ8wZA/KJLuQNpF5w==", + "dependencies": { + "@bufbuild/protobuf": "^1.10.0" + } + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -3556,11 +3425,11 @@ } }, "node_modules/@react-aria/focus": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.18.3.tgz", - "integrity": "sha512-WKUElg+5zS0D3xlVn8MntNnkzJql2J6MuzAMP8Sv5WTgFDse/XGR842dsxPTIyKKdrWVCRegCuwa4m3n/GzgJw==", + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.18.4.tgz", + "integrity": "sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA==", "dependencies": { - "@react-aria/interactions": "^3.22.3", + "@react-aria/interactions": "^3.22.4", "@react-aria/utils": "^3.25.3", "@react-types/shared": "^3.25.0", "@swc/helpers": "^0.5.0", @@ -3571,9 +3440,9 @@ } }, "node_modules/@react-aria/interactions": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.22.3.tgz", - "integrity": "sha512-RRUb/aG+P0IKTIWikY/SylB6bIbLZeztnZY2vbe7RAG5MgVaCgn5HQ45SI15GlTmhsFG8CnF6slJsUFJiNHpbQ==", + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.22.4.tgz", + "integrity": "sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww==", "dependencies": { "@react-aria/ssr": "^3.9.6", "@react-aria/utils": "^3.25.3", @@ -3926,145 +3795,145 @@ ] }, "node_modules/@sentry-internal/browser-utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.33.1.tgz", - "integrity": "sha512-TW6/r+Gl5jiXv54iK1xZ3mlVgTS/jaBp4vcQ0xGMdgiQ3WchEPcFSeYovL+YHT3tSud0GZqVtDQCz+5i76puqA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.34.0.tgz", + "integrity": "sha512-4AcYOzPzD1tL5eSRQ/GpKv5enquZf4dMVUez99/Bh3va8qiJrNP55AcM7UzZ7WZLTqKygIYruJTU5Zu2SpEAPQ==", "dependencies": { - "@sentry/core": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry/core": "8.34.0", + "@sentry/types": "8.34.0", + "@sentry/utils": "8.34.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/feedback": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.33.1.tgz", - "integrity": "sha512-qauMRTm3qDaLqZ3ibI03cj4gLF40y0ij65nj+cns6iWxGCtPrO8tjvXFWuQsE7Aye9dGMnBgmv7uN+NTUtC3RA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.34.0.tgz", + "integrity": "sha512-aYSM2KPUs0FLPxxbJCFSwCYG70VMzlT04xepD1Y/tTlPPOja/02tSv2tyOdZbv8Uw7xslZs3/8Lhj74oYcTBxw==", "dependencies": { - "@sentry/core": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry/core": "8.34.0", + "@sentry/types": "8.34.0", + "@sentry/utils": "8.34.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.33.1.tgz", - "integrity": "sha512-fm4coIOjmanU29NOVN9MyaP4fUCOYytbtFqVSKRFNZQ/xAgNeySiBIbUd6IjujMmnOk9bY0WEUMcdm3Uotjdog==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.34.0.tgz", + "integrity": "sha512-EoMh9NYljNewZK1quY23YILgtNdGgrkzJ9TPsj6jXUG0LZ0Q7N7eFWd0xOEDBvFxrmI3cSXF1i4d1sBb+eyKRw==", "dependencies": { - "@sentry-internal/browser-utils": "8.33.1", - "@sentry/core": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry-internal/browser-utils": "8.34.0", + "@sentry/core": "8.34.0", + "@sentry/types": "8.34.0", + "@sentry/utils": "8.34.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.33.1.tgz", - "integrity": "sha512-nsxTFTPCT10Ty/v6+AiST3+yotGP1sUb8xqfKB9fPnS1hZHFryp0NnEls7xFjBsBbZPU1GpFkzrk/E6JFzixDQ==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.34.0.tgz", + "integrity": "sha512-x8KhZcCDpbKHqFOykYXiamX6x0LRxv6N1OJHoH+XCrMtiDBZr4Yo30d/MaS6rjmKGMtSRij30v+Uq+YWIgxUrg==", "dependencies": { - "@sentry-internal/replay": "8.33.1", - "@sentry/core": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry-internal/replay": "8.34.0", + "@sentry/core": "8.34.0", + "@sentry/types": "8.34.0", + "@sentry/utils": "8.34.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/tracing": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.119.1.tgz", - "integrity": "sha512-cI0YraPd6qBwvUA3wQdPGTy8PzAoK0NZiaTN1LM3IczdPegehWOaEG5GVTnpGnTsmBAzn1xnBXNBhgiU4dgcrQ==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.119.2.tgz", + "integrity": "sha512-V2W+STWrafyGJhQv3ulMFXYDwWHiU6wHQAQBShsHVACiFaDrJ2kPRet38FKv4dMLlLlP2xN+ss2e5zv3tYlTiQ==", "dev": true, "dependencies": { - "@sentry/core": "7.119.1", - "@sentry/types": "7.119.1", - "@sentry/utils": "7.119.1" + "@sentry/core": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" }, "engines": { "node": ">=8" } }, "node_modules/@sentry-internal/tracing/node_modules/@sentry/core": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.1.tgz", - "integrity": "sha512-YUNnH7O7paVd+UmpArWCPH4Phlb5LwrkWVqzFWqL3xPyCcTSof2RL8UmvpkTjgYJjJ+NDfq5mPFkqv3aOEn5Sw==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.2.tgz", + "integrity": "sha512-hQr3d2yWq/2lMvoyBPOwXw1IHqTrCjOsU1vYKhAa6w9vGbJZFGhKGGE2KEi/92c3gqGn+gW/PC7cV6waCTDuVA==", "dev": true, "dependencies": { - "@sentry/types": "7.119.1", - "@sentry/utils": "7.119.1" + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" }, "engines": { "node": ">=8" } }, "node_modules/@sentry-internal/tracing/node_modules/@sentry/types": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.1.tgz", - "integrity": "sha512-4G2mcZNnYzK3pa2PuTq+M2GcwBRY/yy1rF+HfZU+LAPZr98nzq2X3+mJHNJoobeHRkvVh7YZMPi4ogXiIS5VNQ==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.2.tgz", + "integrity": "sha512-ydq1tWsdG7QW+yFaTp0gFaowMLNVikIqM70wxWNK+u98QzKnVY/3XTixxNLsUtnAB4Y+isAzFhrc6Vb5GFdFeg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@sentry-internal/tracing/node_modules/@sentry/utils": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.1.tgz", - "integrity": "sha512-ju/Cvyeu/vkfC5/XBV30UNet5kLEicZmXSyuLwZu95hEbL+foPdxN+re7pCI/eNqfe3B2vz7lvz5afLVOlQ2Hg==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.2.tgz", + "integrity": "sha512-TLdUCvcNgzKP0r9YD7tgCL1PEUp42TObISridsPJ5rhpVGQJvpr+Six0zIkfDUxerLYWZoK8QMm9KgFlPLNQzA==", "dev": true, "dependencies": { - "@sentry/types": "7.119.1" + "@sentry/types": "7.119.2" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/browser": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.33.1.tgz", - "integrity": "sha512-c6zI/igexkLwZuGk+u8Rj26ChjxGgkhe6ZbKFsXCYaKAp5ep5X7HQRkkqgbxApiqlC0LduHdd/ymzh139JLg8w==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.34.0.tgz", + "integrity": "sha512-3HHG2NXxzHq1lVmDy2uRjYjGNf9NsJsTPlOC70vbQdOb+S49EdH/XMPy+J3ruIoyv6Cu0LwvA6bMOM6rHZOgNQ==", "dependencies": { - "@sentry-internal/browser-utils": "8.33.1", - "@sentry-internal/feedback": "8.33.1", - "@sentry-internal/replay": "8.33.1", - "@sentry-internal/replay-canvas": "8.33.1", - "@sentry/core": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry-internal/browser-utils": "8.34.0", + "@sentry-internal/feedback": "8.34.0", + "@sentry-internal/replay": "8.34.0", + "@sentry-internal/replay-canvas": "8.34.0", + "@sentry/core": "8.34.0", + "@sentry/types": "8.34.0", + "@sentry/utils": "8.34.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/core": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.33.1.tgz", - "integrity": "sha512-3SS41suXLFzxL3OQvTMZ6q92ZapELVq2l2SoWlZopcamWhog2Ru0dp2vkunq97kFHb2TzKRTlFH4+4gbT8SJug==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.34.0.tgz", + "integrity": "sha512-adrXCTK/zsg5pJ67lgtZqdqHvyx6etMjQW3P82NgWdj83c8fb+zH+K79Z47pD4zQjX0ou2Ws5nwwi4wJbz4bfA==", "dependencies": { - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry/types": "8.34.0", + "@sentry/utils": "8.34.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/integrations": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.119.1.tgz", - "integrity": "sha512-CGmLEPnaBqbUleVqrmGYjRjf5/OwjUXo57I9t0KKWViq81mWnYhaUhRZWFNoCNQHns+3+GPCOMvl0zlawt+evw==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.119.2.tgz", + "integrity": "sha512-dCuXKvbUE3gXVVa696SYMjlhSP6CxpMH/gl4Jk26naEB8Xjsn98z/hqEoXLg6Nab73rjR9c/9AdKqBbwVMHyrQ==", "dev": true, "dependencies": { - "@sentry/core": "7.119.1", - "@sentry/types": "7.119.1", - "@sentry/utils": "7.119.1", + "@sentry/core": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2", "localforage": "^1.8.1" }, "engines": { @@ -4072,103 +3941,103 @@ } }, "node_modules/@sentry/integrations/node_modules/@sentry/core": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.1.tgz", - "integrity": "sha512-YUNnH7O7paVd+UmpArWCPH4Phlb5LwrkWVqzFWqL3xPyCcTSof2RL8UmvpkTjgYJjJ+NDfq5mPFkqv3aOEn5Sw==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.2.tgz", + "integrity": "sha512-hQr3d2yWq/2lMvoyBPOwXw1IHqTrCjOsU1vYKhAa6w9vGbJZFGhKGGE2KEi/92c3gqGn+gW/PC7cV6waCTDuVA==", "dev": true, "dependencies": { - "@sentry/types": "7.119.1", - "@sentry/utils": "7.119.1" + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/integrations/node_modules/@sentry/types": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.1.tgz", - "integrity": "sha512-4G2mcZNnYzK3pa2PuTq+M2GcwBRY/yy1rF+HfZU+LAPZr98nzq2X3+mJHNJoobeHRkvVh7YZMPi4ogXiIS5VNQ==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.2.tgz", + "integrity": "sha512-ydq1tWsdG7QW+yFaTp0gFaowMLNVikIqM70wxWNK+u98QzKnVY/3XTixxNLsUtnAB4Y+isAzFhrc6Vb5GFdFeg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@sentry/integrations/node_modules/@sentry/utils": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.1.tgz", - "integrity": "sha512-ju/Cvyeu/vkfC5/XBV30UNet5kLEicZmXSyuLwZu95hEbL+foPdxN+re7pCI/eNqfe3B2vz7lvz5afLVOlQ2Hg==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.2.tgz", + "integrity": "sha512-TLdUCvcNgzKP0r9YD7tgCL1PEUp42TObISridsPJ5rhpVGQJvpr+Six0zIkfDUxerLYWZoK8QMm9KgFlPLNQzA==", "dev": true, "dependencies": { - "@sentry/types": "7.119.1" + "@sentry/types": "7.119.2" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/node": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.119.1.tgz", - "integrity": "sha512-rpnoQCMxWh/ccjOe+qsmvXAdlTxQHXEWdaltSxnwj7QY+kOGKGP18WTQFLq/gdOBRw9aa6PEQGwhnLfhBXXaYg==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.119.2.tgz", + "integrity": "sha512-TPNnqxh+Myooe4jTyRiXrzrM2SH08R4+nrmBls4T7lKp2E5R/3mDSe/YTn5rRcUt1k1hPx1NgO/taG0DoS5cXA==", "dev": true, "dependencies": { - "@sentry-internal/tracing": "7.119.1", - "@sentry/core": "7.119.1", - "@sentry/integrations": "7.119.1", - "@sentry/types": "7.119.1", - "@sentry/utils": "7.119.1" + "@sentry-internal/tracing": "7.119.2", + "@sentry/core": "7.119.2", + "@sentry/integrations": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/node/node_modules/@sentry/core": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.1.tgz", - "integrity": "sha512-YUNnH7O7paVd+UmpArWCPH4Phlb5LwrkWVqzFWqL3xPyCcTSof2RL8UmvpkTjgYJjJ+NDfq5mPFkqv3aOEn5Sw==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.2.tgz", + "integrity": "sha512-hQr3d2yWq/2lMvoyBPOwXw1IHqTrCjOsU1vYKhAa6w9vGbJZFGhKGGE2KEi/92c3gqGn+gW/PC7cV6waCTDuVA==", "dev": true, "dependencies": { - "@sentry/types": "7.119.1", - "@sentry/utils": "7.119.1" + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/node/node_modules/@sentry/types": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.1.tgz", - "integrity": "sha512-4G2mcZNnYzK3pa2PuTq+M2GcwBRY/yy1rF+HfZU+LAPZr98nzq2X3+mJHNJoobeHRkvVh7YZMPi4ogXiIS5VNQ==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.2.tgz", + "integrity": "sha512-ydq1tWsdG7QW+yFaTp0gFaowMLNVikIqM70wxWNK+u98QzKnVY/3XTixxNLsUtnAB4Y+isAzFhrc6Vb5GFdFeg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@sentry/node/node_modules/@sentry/utils": { - "version": "7.119.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.1.tgz", - "integrity": "sha512-ju/Cvyeu/vkfC5/XBV30UNet5kLEicZmXSyuLwZu95hEbL+foPdxN+re7pCI/eNqfe3B2vz7lvz5afLVOlQ2Hg==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.2.tgz", + "integrity": "sha512-TLdUCvcNgzKP0r9YD7tgCL1PEUp42TObISridsPJ5rhpVGQJvpr+Six0zIkfDUxerLYWZoK8QMm9KgFlPLNQzA==", "dev": true, "dependencies": { - "@sentry/types": "7.119.1" + "@sentry/types": "7.119.2" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/types": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.33.1.tgz", - "integrity": "sha512-GjoAMvwtpIemoF/IiwZ7A60g4nQv3qwzR21GvJqDVUoKD0e8pv9OLX+HyXoUat4wEDGSuDUcUyUKD2G+od73QA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.34.0.tgz", + "integrity": "sha512-zLRc60CzohGCo6zNsNeQ9JF3SiEeRE4aDCP9fDDdIVCOKovS+mn1rtSip0qd0Vp2fidOu0+2yY0ALCz1A3PJSQ==", "engines": { "node": ">=14.18" } }, "node_modules/@sentry/utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.33.1.tgz", - "integrity": "sha512-uzuYpiiJuFY3N4WNHMBWUQX5oNv2t/TbG0OHRp3Rr7yeu+HSfD542TIp9/gMZ+G0Cxd8AmVO3wkKIFbk0TL4Qg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.34.0.tgz", + "integrity": "sha512-W1KoRlFUjprlh3t86DZPFxLfM6mzjRzshVfMY7vRlJFymBelJsnJ3A1lPeBZM9nCraOSiw6GtOWu6k5BAkiGIg==", "dependencies": { - "@sentry/types": "8.33.1" + "@sentry/types": "8.34.0" }, "engines": { "node": ">=14.18" @@ -4196,14 +4065,14 @@ } }, "node_modules/@swc/core": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.26.tgz", - "integrity": "sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==", + "version": "1.7.36", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.36.tgz", + "integrity": "sha512-bu7ymMX+LCJOSSrKank25Jaq66ymLVA9fOUuy4ck3/6rbXdLw+pIJPnIDKQ9uNcxww8KDxOuJk9Ui9pqR+aGFw==", "dev": true, "hasInstallScript": true, "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.12" + "@swc/types": "^0.1.13" }, "engines": { "node": ">=10" @@ -4213,16 +4082,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.26", - "@swc/core-darwin-x64": "1.7.26", - "@swc/core-linux-arm-gnueabihf": "1.7.26", - "@swc/core-linux-arm64-gnu": "1.7.26", - "@swc/core-linux-arm64-musl": "1.7.26", - "@swc/core-linux-x64-gnu": "1.7.26", - "@swc/core-linux-x64-musl": "1.7.26", - "@swc/core-win32-arm64-msvc": "1.7.26", - "@swc/core-win32-ia32-msvc": "1.7.26", - "@swc/core-win32-x64-msvc": "1.7.26" + "@swc/core-darwin-arm64": "1.7.36", + "@swc/core-darwin-x64": "1.7.36", + "@swc/core-linux-arm-gnueabihf": "1.7.36", + "@swc/core-linux-arm64-gnu": "1.7.36", + "@swc/core-linux-arm64-musl": "1.7.36", + "@swc/core-linux-x64-gnu": "1.7.36", + "@swc/core-linux-x64-musl": "1.7.36", + "@swc/core-win32-arm64-msvc": "1.7.36", + "@swc/core-win32-ia32-msvc": "1.7.36", + "@swc/core-win32-x64-msvc": "1.7.36" }, "peerDependencies": { "@swc/helpers": "*" @@ -4234,9 +4103,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz", - "integrity": "sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==", + "version": "1.7.36", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.36.tgz", + "integrity": "sha512-8vDczXzCgv3ceTPhEivlpGprN44YlrCK1nbfU9g2TrhV/Aiqi09W/eM5zLesdoM1Z3mJl492gc/8nlTkpDdusw==", "cpu": [ "arm64" ], @@ -4250,9 +4119,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz", - "integrity": "sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==", + "version": "1.7.36", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.36.tgz", + "integrity": "sha512-Pa2Gao7+Wf5m3SsK4abKRtd48AtoUnJInvaC3d077swBfgZjbjUbQvcpdc2dOeQtWwo49rFqUZJonMsL0jnPgQ==", "cpu": [ "x64" ], @@ -4266,9 +4135,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz", - "integrity": "sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==", + "version": "1.7.36", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.36.tgz", + "integrity": "sha512-3YsMWd7V+WZEjbfBnLkkz/olcRBa8nyoK0iIOnNARJBMcYaJxjkJSMZpmSojCnIVwvjA1N83CPAbUL+W+fCnHg==", "cpu": [ "arm" ], @@ -4282,9 +4151,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz", - "integrity": "sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==", + "version": "1.7.36", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.36.tgz", + "integrity": "sha512-lqM3aBB7kJazJYOwHeA5OGNLqXoQPZ/76b3dV+XcjN1GhD0CcXz6mW5PRYVin6OSN1eKrKBKJjtDA1mqADDEvw==", "cpu": [ "arm64" ], @@ -4298,9 +4167,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz", - "integrity": "sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==", + "version": "1.7.36", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.36.tgz", + "integrity": "sha512-bqei2YDzvUfG0pth5W2xJaj0eG4XWYk0d/NJ75vBX6bkIzK6dC8iuKQ41jOfUWonnrAs7rTDDJW0sTn/evvRdw==", "cpu": [ "arm64" ], @@ -4314,9 +4183,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz", - "integrity": "sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==", + "version": "1.7.36", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.36.tgz", + "integrity": "sha512-03maXTUyaBjeCxlDltmdzHje1ryQt1C4OWmmNgSSRXjLb+GNnAenwOJMSrcvHP/aNClD2pwsFCnYKDGy+sYE6w==", "cpu": [ "x64" ], @@ -4330,9 +4199,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz", - "integrity": "sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==", + "version": "1.7.36", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.36.tgz", + "integrity": "sha512-XXysqLkvjtQnXm1zHqLhy00UYPv/gk5OtwR732X+piNisnEbcJBqI8Qp9O7YvLWllRcoP8IMBGDWLGdGLSpViA==", "cpu": [ "x64" ], @@ -4346,9 +4215,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz", - "integrity": "sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==", + "version": "1.7.36", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.36.tgz", + "integrity": "sha512-k7+dmb13a/zPw+E4XYfPmLZFWJgcOcBRKIjYl9nQErtYsgsg3Ji6TBbsvJVETy23lNHyewZ17V5Vq6NzaG0hzg==", "cpu": [ "arm64" ], @@ -4362,9 +4231,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz", - "integrity": "sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==", + "version": "1.7.36", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.36.tgz", + "integrity": "sha512-ridD3ay6YM2PEYHZXXFN+edYEv0FOynaqOBP+NSnGNHA35azItIjoIe+KNi4WltGtAjpKCHSpjGCNfna12wdYQ==", "cpu": [ "ia32" ], @@ -4378,9 +4247,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz", - "integrity": "sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==", + "version": "1.7.36", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.36.tgz", + "integrity": "sha512-j1z2Z1Ln9d0E3dHsPkC1K9XDh0ojhRPwV+GfRTu4D61PE+aYhYLvbJC6xPvL4/204QrStRS7eDu3m+BcDp3rgQ==", "cpu": [ "x64" ], @@ -4408,9 +4277,9 @@ } }, "node_modules/@swc/types": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", - "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.13.tgz", + "integrity": "sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==", "dev": true, "dependencies": { "@swc/counter": "^0.1.3" @@ -4504,9 +4373,9 @@ } }, "node_modules/@types/dom-webcodecs": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.12.tgz", - "integrity": "sha512-vEkwKEr0xAO2xwNNkYhaltT7jMGjrgAbfpRR3qKRN7eW3B7R7O5fm1scx2OKBY6wMACgjCewhu+ljbCdudY+5A==" + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", + "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==" }, "node_modules/@types/emscripten": { "version": "1.39.13", @@ -4634,9 +4503,9 @@ } }, "node_modules/@types/react": { - "version": "18.3.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz", - "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==", + "version": "18.3.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", + "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4661,9 +4530,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "devOptional": true, "dependencies": { "@types/react": "*" @@ -4938,39 +4807,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.11.tgz", - "integrity": "sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz", + "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", "dev": true, "dependencies": { "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.11", + "@vue/shared": "3.5.12", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.11.tgz", - "integrity": "sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz", + "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/compiler-core": "3.5.12", + "@vue/shared": "3.5.12" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.11.tgz", - "integrity": "sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz", + "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==", "dev": true, "dependencies": { "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.11", - "@vue/compiler-dom": "3.5.11", - "@vue/compiler-ssr": "3.5.11", - "@vue/shared": "3.5.11", + "@vue/compiler-core": "3.5.12", + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", "postcss": "^8.4.47", @@ -4978,19 +4847,19 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.11.tgz", - "integrity": "sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz", + "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/compiler-dom": "3.5.12", + "@vue/shared": "3.5.12" } }, "node_modules/@vue/shared": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.11.tgz", - "integrity": "sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz", + "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==", "dev": true }, "node_modules/@webassemblyjs/ast": { @@ -5171,9 +5040,9 @@ "optional": true }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", "bin": { "acorn": "bin/acorn" }, @@ -5731,11 +5600,11 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/barcode-detector": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/barcode-detector/-/barcode-detector-2.2.10.tgz", - "integrity": "sha512-fB6285Ahd6PIbru+PRw/CL+T1+dtPQmfCwBAwHmw+IWLLHrKH0q37qlAEHXWxPNM6bEmxgTMgGO+MJu/Si1uJQ==", + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/barcode-detector/-/barcode-detector-2.2.11.tgz", + "integrity": "sha512-N50XZ6Rav2sxTgHXOc38/mkpVJMan11GZ8Yqi1pPMZpTJSXuZ/FpIee6OtLehZX/Vs4ZOzGbp1DgXzFCfKggWA==", "dependencies": { - "@types/dom-webcodecs": "^0.1.12", + "@types/dom-webcodecs": "^0.1.13", "zxing-wasm": "1.2.14" } }, @@ -5961,9 +5830,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001667", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", - "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", "funding": [ { "type": "opencollective", @@ -5994,6 +5863,10 @@ "node": ">=6" } }, + "node_modules/care-livekit": { + "resolved": "apps/care_livekit_fe", + "link": true + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -6499,12 +6372,12 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/cypress": { - "version": "13.14.2", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.14.2.tgz", - "integrity": "sha512-lsiQrN17vHMB2fnvxIrKLAjOr9bPwsNbPZNrWf99s4u+DVmCY6U+w7O3GGG9FvP4EUVYaDu+guWeNLiUzBrqvA==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.15.0.tgz", + "integrity": "sha512-53aO7PwOfi604qzOkCSzNlWquCynLlKE/rmmpSPcziRH6LNfaDUAklQT6WJIsD8ywxlIy+uVZsnTMCCQVd2kTw==", "hasInstallScript": true, "dependencies": { - "@cypress/request": "^3.0.1", + "@cypress/request": "^3.0.4", "@cypress/xvfb": "^1.2.4", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", @@ -6567,9 +6440,9 @@ } }, "node_modules/cypress-split": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/cypress-split/-/cypress-split-1.24.0.tgz", - "integrity": "sha512-ZEFh1m6z+HwPWpB1h9YAF1L6K/wkPBR3vD+v8Rrg8BRm50sZ7oSx6Dw+sv6zfr5Pfqv247CnobLewdFBLlPIBQ==", + "version": "1.24.4", + "resolved": "https://registry.npmjs.org/cypress-split/-/cypress-split-1.24.4.tgz", + "integrity": "sha512-sKBFQB659Ss5B08GSESeMKXBEpPD2wKNGQR1HYbKT98rnM1x5E+MugzcicqEdsK4T2Ng0feuuZQkz8XniOA18A==", "dev": true, "dependencies": { "@actions/core": "^1.10.0", @@ -6577,7 +6450,7 @@ "console.table": "^0.10.0", "debug": "^4.3.4", "fast-shuffle": "^6.1.0", - "find-cypress-specs": "1.43.4", + "find-cypress-specs": "1.45.2", "globby": "^11.1.0", "humanize-duration": "^3.28.0" }, @@ -7051,6 +6924,18 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -7119,9 +7004,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.33", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.33.tgz", - "integrity": "sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==" + "version": "1.5.39", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.39.tgz", + "integrity": "sha512-4xkpSR6CjuiaNyvwiWDI85N9AxsvbPawB8xc7yzLPonYTuP19BVgYweKyUMFtHEZgIcHWMt1ks5Cqx2m+6/Grg==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -7286,9 +7171,9 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", + "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", "dev": true, "dependencies": { "call-bind": "^1.0.7", @@ -7298,12 +7183,12 @@ "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", + "iterator.prototype": "^1.1.3", "safe-array-concat": "^1.1.2" }, "engines": { @@ -8024,9 +7909,9 @@ } }, "node_modules/fast-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", - "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", "dev": true }, "node_modules/fastq": { @@ -8164,16 +8049,16 @@ } }, "node_modules/find-cypress-specs": { - "version": "1.43.4", - "resolved": "https://registry.npmjs.org/find-cypress-specs/-/find-cypress-specs-1.43.4.tgz", - "integrity": "sha512-GAdz6lfBndbOq9OOJ3psThQ56hqgL8tZUCOLnl60d/l56bvHkC0TNwyqlLfBObiscirSZWSgyGL86jJkrpFMrA==", + "version": "1.45.2", + "resolved": "https://registry.npmjs.org/find-cypress-specs/-/find-cypress-specs-1.45.2.tgz", + "integrity": "sha512-D289NM0Dpqoz4+yl8oEtbioqm7zPKQo0hLcvwlg5Z9iBm7EioMIFiOYgluthDNPxUES/aJF+1xHRHAJpC3ejcA==", "dev": true, "dependencies": { "@actions/core": "^1.10.0", "arg": "^5.0.1", "console.table": "^0.10.0", "debug": "^4.3.3", - "find-test-names": "1.28.18", + "find-test-names": "1.28.30", "globby": "^11.1.0", "minimatch": "^3.0.4", "pluralize": "^8.0.0", @@ -8212,13 +8097,13 @@ } }, "node_modules/find-test-names": { - "version": "1.28.18", - "resolved": "https://registry.npmjs.org/find-test-names/-/find-test-names-1.28.18.tgz", - "integrity": "sha512-hhnGdkWK+qEA5Z02Tu0OqGQIUjFZNyOCE4WaJpbhW4hAF1+NZ7OCr0Bss9RCaj7BBtjoIjkU93utobQ8pg2iVg==", + "version": "1.28.30", + "resolved": "https://registry.npmjs.org/find-test-names/-/find-test-names-1.28.30.tgz", + "integrity": "sha512-b5PLJ5WnskdaYHBf+38FN/4TKh5lqwrltITkqxuARsN2bW6civrhqOXbVA+4727YNowYLt/jtIC9Dsn7eJSP6A==", "dev": true, "dependencies": { - "@babel/parser": "^7.23.0", - "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/parser": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", "acorn-walk": "^8.2.0", "debug": "^4.3.3", "globby": "^11.0.4", @@ -8332,9 +8217,9 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -9178,9 +9063,9 @@ } }, "node_modules/i18next": { - "version": "23.15.2", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.15.2.tgz", - "integrity": "sha512-zcPSWzCvw6uKnuYHIqs4W7hTuB9e3AFcSdZgvCWoPXIZsBjBd4djN2/2uOHIB+1DFFkQnMBXvhNg7J3WyCuywQ==", + "version": "23.16.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.0.tgz", + "integrity": "sha512-Ni3CG6c14teOogY19YNRl+kYaE/Rb59khy0VyHVn4uOZ97E2E/Yziyi6r3C3s9+wacjdLZiq/LLYyx+Cgd+FCw==", "funding": [ { "type": "individual", @@ -9922,9 +9807,9 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", "dev": true, "dependencies": { "define-properties": "^1.2.1", @@ -9932,6 +9817,9 @@ "has-symbols": "^1.0.3", "reflect.getprototypeof": "^1.0.4", "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/jackspeak": { @@ -10691,6 +10579,26 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/livekit-client": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/livekit-client/-/livekit-client-2.5.9.tgz", + "integrity": "sha512-oDpK6SKYB1F+mNO+25DA0bF0cD2XoOJeD8ji4YQpzDBQv2IxeyKrQhoqXAqrYgIKuiMNkImSf+yg2v7EHSl4Og==", + "dependencies": { + "@livekit/protocol": "1.24.0", + "events": "^3.3.0", + "loglevel": "^1.8.0", + "sdp-transform": "^2.14.1", + "ts-debounce": "^4.0.0", + "tslib": "2.7.0", + "typed-emitter": "^2.1.0", + "webrtc-adapter": "^9.0.0" + } + }, + "node_modules/livekit-client/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + }, "node_modules/load-plugin": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-6.0.3.tgz", @@ -10791,8 +10699,7 @@ "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", @@ -10878,6 +10785,18 @@ "node": ">=8" } }, + "node_modules/loglevel": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", + "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", @@ -10915,9 +10834,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -12823,9 +12742,9 @@ } }, "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", "optional": true }, "node_modules/nanoid": { @@ -13572,9 +13491,9 @@ } }, "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", "bin": { "yaml": "bin.mjs" }, @@ -14066,9 +13985,9 @@ } }, "node_modules/react-i18next": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.0.2.tgz", - "integrity": "sha512-z0W3/RES9Idv3MmJUcf0mDNeeMOUXe+xoL0kPfQPbDoZHmni/XsIoq5zgT2MCFUiau283GuBUK578uD/mkAbLQ==", + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.0.3.tgz", + "integrity": "sha512-BlO1P+oLKjjIxDBQ0GkAIMacgjfMbnvops+3Y5nZXF7UJ99v4KCWr0Na1azJXC8AMiNWp4kgUcFCJM7U9ZsUDg==", "dependencies": { "@babel/runtime": "^7.25.0", "html-parse-stringify": "^3.0.1" @@ -15762,6 +15681,14 @@ "resolved": "https://registry.npmjs.org/sdp/-/sdp-3.2.0.tgz", "integrity": "sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==" }, + "node_modules/sdp-transform": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.2.tgz", + "integrity": "sha512-icY6jVao7MfKCieyo1AyxFYm1baiM+fA00qW/KrNNVlkxHAd34riEKuEkUe4bBb3gJwLJZM+xT60Yj1QL8rHiA==", + "bin": { + "sdp-verify": "checker.js" + } + }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -16585,18 +16512,18 @@ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" }, "node_modules/tailwind-merge": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.3.tgz", - "integrity": "sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.4.tgz", + "integrity": "sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==", "funding": { "type": "github", "url": "https://github.com/sponsors/dcastil" } }, "node_modules/tailwindcss": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", - "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz", + "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -16982,6 +16909,11 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-debounce": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ts-debounce/-/ts-debounce-4.0.0.tgz", + "integrity": "sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==" + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -17002,9 +16934,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" }, "node_modules/tsx": { "version": "4.19.1", @@ -17149,6 +17081,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", + "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", + "optionalDependencies": { + "rxjs": "*" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -17156,9 +17096,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -17642,6 +17582,20 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/usehooks-ts": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-3.1.0.tgz", + "integrity": "sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw==", + "dependencies": { + "lodash.debounce": "^4.0.8" + }, + "engines": { + "node": ">=16.15.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -17937,9 +17891,9 @@ } }, "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", "dev": true, "dependencies": { "esbuild": "^0.21.3", diff --git a/package.json b/package.json index 850bba2edae..7749374be44 100644 --- a/package.json +++ b/package.json @@ -26,12 +26,19 @@ ], "author": "Open Healthcare Network Contributors", "license": "MIT", + "workspaces": [ + "apps/*" + ], "scripts": { - "build:react": "cross-env NODE_ENV=production vite build", - "build": "npm run generate-build-meta && npm run supported-browsers && npm run build:react", "dev": "npm run supported-browsers && vite", + "local": "npm run supported-browsers && vite --mode docker", "preview": "cross-env NODE_ENV=production vite preview", - "generate-build-meta": "node ./scripts/generate-build-version.js", + "build:meta": "node ./scripts/generate-build-version.js", + "build:react": "cross-env NODE_ENV=production vite build", + "supported-browsers": "node ./scripts/generate-supported-browsers.mjs", + "build": "npm run install-all && npm run build:meta && npm run supported-browsers && npm run build:react", + "setup": "node scripts/setup-care-apps.js", + "install-all": "npm install && npm run setup && npm install", "test": "snyk test", "cypress:open": "cross-env NODE_ENV=development cypress open", "cypress:run": "cross-env NODE_ENV=development cypress run", @@ -40,8 +47,7 @@ "prepare": "husky install", "lint": "eslint ./src", "lint-fix": "eslint ./src --fix", - "format": "prettier ./src --write", - "supported-browsers": "node ./scripts/generate-supported-browsers.mjs" + "format": "prettier ./src --write" }, "dependencies": { "@fontsource/figtree": "^5.1.0", @@ -55,7 +61,7 @@ "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-toast": "^1.2.2", "@sentry/browser": "^8.33.0", - "@yudiel/react-qr-scanner": "^2.0.0-beta.3", + "@yudiel/react-qr-scanner": "^2.0.8", "axios": "^1.7.7", "bowser": "^2.11.0", "browser-image-compression": "^2.0.2", @@ -103,7 +109,7 @@ "@types/lodash-es": "^4.17.12", "@types/node": "^22.7.4", "@types/qrcode.react": "^1.0.5", - "@types/react": "18.3.2", + "@types/react": "^18.3.11", "@types/react-copy-to-clipboard": "^5.0.7", "@types/react-csv": "^1.1.10", "@types/react-dom": "^18.3.0", @@ -114,6 +120,7 @@ "autoprefixer": "^10.4.19", "cypress-localstorage-commands": "^2.2.5", "cypress-split": "^1.23.2", + "dotenv": "^16.4.5", "eslint-config-prettier": "^9.1.0", "eslint-plugin-i18next": "^6.0.9", "eslint-plugin-mdx": "^3.1.5", diff --git a/scripts/setup-care-apps.js b/scripts/setup-care-apps.js new file mode 100644 index 00000000000..4106775e63e --- /dev/null +++ b/scripts/setup-care-apps.js @@ -0,0 +1,113 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const { execSync } = require("child_process"); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const fs = require("fs"); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const path = require("path"); +// eslint-disable-next-line @typescript-eslint/no-var-requires +require("dotenv").config({ path: [".env.local", ".env"] }); + +console.log("Preinstall script running"); + +// Function to read apps.json or return an empty array if it doesn't exist +function readAppsConfig() { + const appsConfig = process.env.REACT_ENABLED_APPS + ? process.env.REACT_ENABLED_APPS.split(",").map((app) => ({ + branch: app.split("@")[1], + package: app.split("@")[0], + })) + : []; + console.log("Found apps: ", appsConfig); + return appsConfig; +} + +const appsConfig = readAppsConfig(); +const appsDir = path.join(__dirname, "..", "apps"); + +// Create apps directory if it doesn't exist +if (!fs.existsSync(appsDir)) { + fs.mkdirSync(appsDir); +} + +const installApp = (app) => { + const appDir = path.join(appsDir, app.package.split("/")[1]); + + console.log(`Cloning ${app.package}...`); + execSync( + `npx -y gitget ${app.package}${app.branch ? `#${app.branch}` : ""} apps/${app.package.split("/")[1]} `, + { + stdio: "inherit", + }, + ); + // Create a care-package.lock file + fs.writeFileSync( + path.join(appDir, "care-package.lock"), + JSON.stringify( + { + package: app.package, + branch: app.branch, + }, + null, + 2, + ), + ); +}; + +// Clone or pull care apps +appsConfig.forEach((app) => { + const appDir = path.join(appsDir, app.package.split("/")[1]); + if (fs.existsSync(appDir)) { + if (fs.existsSync(path.join(appDir, "care-package.lock"))) { + // verify if the branch and package match with the care-package.lock file + const lockFile = JSON.parse( + fs.readFileSync(path.join(appDir, "care-package.lock"), "utf8"), + ); + if (lockFile.package === app.package && lockFile.branch === app.branch) { + console.log(`Package already exists. Pulling latest changes...`); + execSync(`git -C "${appDir}" pull`, { stdio: "inherit" }); + return; + } else { + console.log(`Branch/package does not match. Recreating...`); + fs.rmSync(appDir, { recursive: true, force: true }); + } + } else { + console.log( + `Package already exists but care-package.lock file does not exist. Recreating...`, + ); + fs.rmSync(appDir, { recursive: true, force: true }); + } + } + + installApp(app); +}); + +console.log("All apps have been cloned or updated in apps directory."); + +const importApps = appsConfig.map((app) => ({ + ...app, + camelCaseName: app.package + .split("/")[1] + .replace(/[-_]/g, "") + .replace(/\b\w/g, (char, index) => + index === 0 ? char.toLowerCase() : char.toUpperCase(), + ), +})); + +// Generate pluginMap.ts +const pluginMapPath = path.join(__dirname, "..", "src", "pluginMap.ts"); +const pluginMapContent = `import { PluginManifest } from "./pluginTypes"; + +${importApps + .map( + (app) => + `import ${app.camelCaseName}Manifest from "@app-manifest/${app.package.split("/")[1]}";`, + ) + .join("\n")} + +export const pluginMap: PluginManifest[] = [ +${importApps.map((app) => ` ${app.camelCaseName}Manifest`).join(",\n")} +]; +`; + +fs.writeFileSync(pluginMapPath, pluginMapContent); +console.log("Generated pluginMap.ts"); diff --git a/src/App.tsx b/src/App.tsx index c02982fd6df..180bd92839c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,24 +4,28 @@ import Integrations from "./Integrations"; import Loading from "./Components/Common/Loading"; import HistoryAPIProvider from "./Providers/HistoryAPIProvider"; import AuthUserProvider from "./Providers/AuthUserProvider"; +import PluginEngine from "./PluginEngine"; import { FeatureFlagsProvider } from "./Utils/featureFlags"; import { Toaster } from "./Components/ui/toaster"; const App = () => { return ( }> - - }> - - - - + + + + }> + + + + - {/* Integrations */} - - - - + {/* Integrations */} + + + + + ); }; diff --git a/src/CAREUI/display/Timeline.tsx b/src/CAREUI/display/Timeline.tsx index ee21b337724..6701d9a7511 100644 --- a/src/CAREUI/display/Timeline.tsx +++ b/src/CAREUI/display/Timeline.tsx @@ -55,7 +55,7 @@ export const TimelineNode = (props: TimelineNodeProps) => { const { t } = useTranslation(); return ( -
  • +
    { {props.children}
    -
  • +
    ); }; diff --git a/src/CAREUI/icons/CareIcon.tsx b/src/CAREUI/icons/CareIcon.tsx index 3bb67629bc2..a45117cc675 100644 --- a/src/CAREUI/icons/CareIcon.tsx +++ b/src/CAREUI/icons/CareIcon.tsx @@ -1,13 +1,12 @@ import iconData from "./UniconPaths.json"; -import { transformIcons } from "./icon"; -import { useEffect } from "react"; +import "./icon.css"; export type IconName = keyof typeof iconData; export interface CareIconProps { icon: IconName; - className?: string | undefined; - onClick?: React.MouseEventHandler | undefined; + className?: string; + onClick?: React.MouseEventHandler; id?: string; } @@ -25,14 +24,32 @@ export default function CareIcon({ className, onClick, }: CareIconProps) { - const effectiveClassName = icon - ? `care-${icon} ${className ?? ""}` - : className; + // TODO: fill & strokeWidth are defined for only one icon + // Rethink Implementation + const [viewBox, path, fill, strokeWidth] = iconData[icon] as [ + number, + string, + boolean | undefined, + number | undefined, + ]; + + const svgClassName = `care-svg-icon__baseline ${className || ""}`.trim(); - useEffect(() => transformIcons(), [effectiveClassName]); return ( - - - + + + ); } diff --git a/src/CAREUI/icons/icon.js b/src/CAREUI/icons/icon.js deleted file mode 100644 index c917e664351..00000000000 --- a/src/CAREUI/icons/icon.js +++ /dev/null @@ -1,49 +0,0 @@ -import "./icon.css"; -import iconData from "./UniconPaths.json"; - -const xmlns = "http://www.w3.org/2000/svg"; - -const findIconName = (className) => { - const iconName = className.match(/care-([a-zA-Z0-9-]+)/); - return iconName ? iconName[1] : "default"; -}; - -const getIconData = (className) => { - const data = iconData[findIconName(className)]; - return typeof data === "undefined" ? iconData["default"] : data; -}; - -const createSvg = (className) => { - const icon = getIconData(className); - const el = document.createElementNS(xmlns, "svg"); - el.setAttribute( - "class", - className.replace("care", "care-svg-icon__baseline"), - ); - el.setAttribute("role", "img"); - el.setAttribute("xmlns", xmlns); - el.setAttribute("viewBox", `0 0 ${icon[0]} ${icon[0]}`); - - const path = document.createElementNS(xmlns, "path"); - if (icon[2] === false) { - path.setAttribute("stroke", "currentColor"); - path.setAttribute("stroke-width", `${icon[3]}`); - } - path.setAttribute("fill", icon[2] === false ? "none" : "currentColor"); - path.setAttribute("d", icon[1]); - el.appendChild(path); - return el; -}; - -export const transformIcons = () => { - const elements = Array.from(document.getElementsByClassName("care")); - elements.forEach((element) => { - if (element.tagName == "I") { - element.parentNode.replaceChild(createSvg(element.className), element); - } - }); -}; - -export const addListener = () => { - window.addEventListener("load", transformIcons); -}; diff --git a/src/CAREUI/interactive/LegendInput.tsx b/src/CAREUI/interactive/LegendInput.tsx index e164e4d1b4e..83486095f7a 100644 --- a/src/CAREUI/interactive/LegendInput.tsx +++ b/src/CAREUI/interactive/LegendInput.tsx @@ -2,6 +2,7 @@ import CareIcon from "../icons/CareIcon"; import { classNames } from "../../Utils/utils"; import { RefObject, useRef, useState, useEffect } from "react"; import { useTranslation } from "react-i18next"; + type InputProps = { id?: string; name: string; @@ -12,12 +13,12 @@ type InputProps = { required?: boolean; placeholder?: string; value?: string; - onChange?: (e: any) => void; - onFocus?: (e: any) => void; - onBlur?: (e: any) => void; - onKeyUp?: (e: any) => void; - onKeyDown?: (e: any) => void; - onKeyPress?: (e: any) => void; + onChange?: (e: React.ChangeEvent) => void; + onFocus?: (e: React.FocusEvent) => void; + onBlur?: (e: React.FocusEvent) => void; + onKeyUp?: (e: React.KeyboardEvent) => void; + onKeyDown?: (e: React.KeyboardEvent) => void; + onKeyPress?: (e: React.KeyboardEvent) => void; disabled?: boolean; error?: string; className?: string; diff --git a/src/Common/hooks/useCareApps.ts b/src/Common/hooks/useCareApps.ts new file mode 100644 index 00000000000..77b5489052e --- /dev/null +++ b/src/Common/hooks/useCareApps.ts @@ -0,0 +1,35 @@ +import { createContext, useContext } from "react"; +import { INavItem } from "@/Components/Common/Sidebar/Sidebar"; +import { PluginManifest } from "@/pluginTypes"; + +export const CareAppsContext = createContext([]); + +export const useCareApps = () => { + const ctx = useContext(CareAppsContext); + if (!ctx) { + throw new Error( + "'useCareApps' must be used within 'CareAppsProvider' only", + ); + } + return ctx; +}; + +export const useCareAppNavItems = () => { + const careApps = useCareApps(); + const navItems = careApps.reduce((acc, plugin) => { + return [...acc, ...(plugin.navItems || [])]; + }, []); + return navItems; +}; + +// If required; Reduce plugin.routes to a single pluginRoutes object of type Record JSX.Element> +export function usePluginRoutes() { + const careApps = useCareApps(); + const routes = careApps.reduce((acc, plugin) => { + return { ...acc, ...plugin.routes }; + }, {}); + if (!routes) { + throw new Error("'usePluginRoutes' must be used within 'AppRouter' only"); + } + return routes; +} diff --git a/src/Components/CameraFeed/CentralLiveMonitoring/index.tsx b/src/Components/CameraFeed/CentralLiveMonitoring/index.tsx index 3cca4c00ec4..95e3b98c818 100644 --- a/src/Components/CameraFeed/CentralLiveMonitoring/index.tsx +++ b/src/Components/CameraFeed/CentralLiveMonitoring/index.tsx @@ -66,7 +66,7 @@ export default function CentralLiveMonitoring(props: { facilityId: string }) { fullscreen={isFullscreen} onExit={() => setFullscreen(false)} > -
    +
    {data.results.map((asset) => (
    diff --git a/src/Components/Common/ErrorBoundary.tsx b/src/Components/Common/ErrorBoundary.tsx new file mode 100644 index 00000000000..47172a240ef --- /dev/null +++ b/src/Components/Common/ErrorBoundary.tsx @@ -0,0 +1,36 @@ +import React, { Component, ErrorInfo, ReactNode } from "react"; + +interface Props { + children: ReactNode; + fallback?: ReactNode; +} + +interface State { + hasError: boolean; +} + +class ErrorBoundary extends Component { + public state: State = { + hasError: false, + }; + + public static getDerivedStateFromError(_: Error): State { + // Update state so the next render will show the fallback UI. + return { hasError: true }; + } + + public componentDidCatch(error: Error, errorInfo: ErrorInfo) { + console.error("Uncaught error:", error, errorInfo); + } + + public render() { + if (this.state.hasError) { + // You can render any custom fallback UI + return this.props.fallback ||

    Sorry.. there was an error

    ; + } + + return this.props.children; + } +} + +export default ErrorBoundary; diff --git a/src/Components/Common/Sidebar/Sidebar.tsx b/src/Components/Common/Sidebar/Sidebar.tsx index 31efe00f1b1..4e3929b187f 100644 --- a/src/Components/Common/Sidebar/Sidebar.tsx +++ b/src/Components/Common/Sidebar/Sidebar.tsx @@ -8,11 +8,18 @@ import SlideOver from "../../../CAREUI/interactive/SlideOver"; import { classNames } from "../../../Utils/utils"; import { Link } from "raviger"; import careConfig from "@careConfig"; +import { useCareAppNavItems } from "@/Common/hooks/useCareApps"; export const SIDEBAR_SHRINK_PREFERENCE_KEY = "sidebarShrinkPreference"; const LOGO_COLLAPSE = "/images/care_logo_mark.svg"; +export interface INavItem { + text: string; + to?: string; + icon: IconName; +} + type StatelessSidebarProps = | { shrinkable: true; @@ -32,11 +39,7 @@ const StatelessSidebar = ({ setShrinked, onItemClick, }: StatelessSidebarProps) => { - const NavItems: { - text: string; - to: string; - icon: IconName; - }[] = [ + const BaseNavItems: INavItem[] = [ { text: "Facilities", to: "/facility", icon: "l-hospital" }, { text: "Patients", to: "/patients", icon: "l-user-injured" }, { text: "Assets", to: "/assets", icon: "l-shopping-cart-alt" }, @@ -47,6 +50,10 @@ const StatelessSidebar = ({ { text: "Notice Board", to: "/notice_board", icon: "l-meeting-board" }, ]; + const PluginNavItems = useCareAppNavItems(); + + const NavItems = [...BaseNavItems, ...PluginNavItems]; + const activeLink = useActiveLink(); const Item = shrinked ? ShrinkedSidebarItem : SidebarItem; @@ -151,7 +158,7 @@ const StatelessSidebar = ({ {...i} icon={} selected={i.to === activeLink} - do={() => onItemClick && onItemClick(false)} + onItemClick={() => onItemClick && onItemClick(false)} handleOverflow={handleOverflow} /> ); diff --git a/src/Components/Common/Sidebar/SidebarItem.tsx b/src/Components/Common/Sidebar/SidebarItem.tsx index 265119f936e..eeee4284e2f 100644 --- a/src/Components/Common/Sidebar/SidebarItem.tsx +++ b/src/Components/Common/Sidebar/SidebarItem.tsx @@ -10,37 +10,39 @@ type SidebarItemProps = { ref?: React.Ref; text: string; icon: SidebarIcon; + onItemClick?: () => void; external?: true | undefined; badgeCount?: number | undefined; selected?: boolean | undefined; handleOverflow?: any; -} & ({ to: string; do?: undefined } | { to?: string; do: () => void }); +} & ({ to?: string; do?: undefined } | { to?: string; do: () => void }); type SidebarItemBaseProps = SidebarItemProps & { shrinked?: boolean; - ref: Ref; }; -const SidebarItemBase = forwardRef( - ( - { shrinked, external, ...props }: SidebarItemBaseProps, - ref: Ref, - ) => { +const SidebarItemBase = forwardRef( + ({ shrinked, external, ...props }, ref) => { const { t } = useTranslation(); const { resetHistory } = useAppHistory(); return ( { + // On Review: Check if resetHistory is working as intended. + props.do?.(); + props.onItemClick?.(); + resetHistory(); + }} onMouseEnter={() => { props.handleOverflow(true); }} diff --git a/src/Components/Common/SortDropdown.tsx b/src/Components/Common/SortDropdown.tsx index b54edffa595..0c4fddec58c 100644 --- a/src/Components/Common/SortDropdown.tsx +++ b/src/Components/Common/SortDropdown.tsx @@ -29,6 +29,7 @@ export default function SortDropdownMenu(props: Props) { > {props.options.map(({ isAscending, value }) => (
    +
    ); } diff --git a/src/Components/Facility/HospitalList.tsx b/src/Components/Facility/FacilityList.tsx similarity index 99% rename from src/Components/Facility/HospitalList.tsx rename to src/Components/Facility/FacilityList.tsx index e7949440307..503f0fde34d 100644 --- a/src/Components/Facility/HospitalList.tsx +++ b/src/Components/Facility/FacilityList.tsx @@ -18,7 +18,7 @@ import routes from "../../Redux/api"; import CareIcon from "../../CAREUI/icons/CareIcon"; import Loading from "@/Components/Common/Loading"; -export const HospitalList = () => { +export const FacilityList = () => { const { qParams, updateQuery, diff --git a/src/Components/Notifications/ShowPushNotification.tsx b/src/Components/Notifications/ShowPushNotification.tsx index 2d2faa5ff5f..ca465f98df7 100644 --- a/src/Components/Notifications/ShowPushNotification.tsx +++ b/src/Components/Notifications/ShowPushNotification.tsx @@ -1,9 +1,8 @@ -import { DetailRoute } from "../../Routers/types"; import useQuery from "../../Utils/request/useQuery"; import routes from "../../Redux/api"; import { NotificationData } from "./models"; -export default function ShowPushNotification({ id }: DetailRoute) { +export default function ShowPushNotification({ id }: { id: string }) { useQuery(routes.getNotificationData, { pathParams: { id }, onResponse(res) { diff --git a/src/Components/Users/UserProfile.tsx b/src/Components/Users/UserProfile.tsx index b9af5b98f65..22f2a0e2607 100644 --- a/src/Components/Users/UserProfile.tsx +++ b/src/Components/Users/UserProfile.tsx @@ -469,10 +469,11 @@ export default function UserProfile() {

    - Personal Information + {t("personal_information")}

    - Local Body, District and State are Non Editable Settings. + {t("local_body")}, {t("district")}, {t("state")}{" "} + {t("are_non_editable_fields")}.

    - {showEdit ? "Cancel" : "Edit User Profile"} + {showEdit ? t("cancel") : t("edit_user_profile")} - Sign out + {t("sign_out")}
    @@ -498,7 +499,7 @@ export default function UserProfile() { id="username-profile-details" >
    - Username + {t("username")}
    {userData?.username || "-"} @@ -509,7 +510,7 @@ export default function UserProfile() { id="contactno-profile-details" >
    - Contact No + {t("phone_number")}
    {userData?.phone_number || "-"} @@ -521,7 +522,7 @@ export default function UserProfile() { id="whatsapp-profile-details" >
    - Whatsapp No + {t("whatsapp_number")}
    {userData?.alt_phone_number || "-"} @@ -532,7 +533,7 @@ export default function UserProfile() { id="emailid-profile-details" >
    - Email address + {t("email")}
    {userData?.email || "-"} @@ -543,7 +544,7 @@ export default function UserProfile() { id="firstname-profile-details" >
    - First Name + {t("first_name")}
    {userData?.first_name || "-"} @@ -554,7 +555,7 @@ export default function UserProfile() { id="lastname-profile-details" >
    - Last Name + {t("last_name")}
    {userData?.last_name || "-"} @@ -565,7 +566,7 @@ export default function UserProfile() { id="date_of_birth-profile-details" >
    - Date of Birth + {t("date_of_birth")}
    {userData?.date_of_birth @@ -575,7 +576,7 @@ export default function UserProfile() {
    - Access Level + {t("access_level")}
    {" "} @@ -587,7 +588,7 @@ export default function UserProfile() { id="gender-profile-details" >
    - Gender + {t("gender")}
    {userData?.gender || "-"} @@ -595,7 +596,7 @@ export default function UserProfile() {
    - Local Body + {t("local_body")}
    {userData?.local_body_object?.name || "-"} @@ -603,7 +604,7 @@ export default function UserProfile() {
    - District + {t("district")}
    {userData?.district_object?.name || "-"} @@ -611,7 +612,7 @@ export default function UserProfile() {
    - State + {t("state")}
    {userData?.state_object?.name || "-"} @@ -619,7 +620,7 @@ export default function UserProfile() {
    - Skills + {t("skills")}
    - Average weekly working hours + {t("average_weekly_working_hours")}
    {userData?.weekly_working_hours ?? "-"} @@ -656,7 +657,7 @@ export default function UserProfile() { id="videoconnectlink-profile-details" >
    - Video Connect Link + {t("video_conference_link")}
    {userData?.video_connect_link ? ( @@ -685,18 +686,18 @@ export default function UserProfile() { o.text} optionValue={(o) => o.text} - optionIcon={(o) => ( - {o.icon} - )} options={GENDER_TYPES} /> )}
    - +
    @@ -796,7 +798,7 @@ export default function UserProfile() {
    @@ -888,10 +890,10 @@ export default function UserProfile() {

    - Language Selection + {t("language_selection")}

    - Set your local language + {t("set_your_local_language")}

    @@ -903,10 +905,10 @@ export default function UserProfile() {

    - Software Update + {t("software_update")}

    - Check for an available update + {t("check_for_available_update")}

    @@ -915,7 +917,7 @@ export default function UserProfile() {
    - Update available + {t("update_available")}
    @@ -936,8 +938,8 @@ export default function UserProfile() { )} /> {updateStatus.isChecking - ? "Checking for update" - : "Check for update"} + ? t("checking_for_update") + : t("check_for_update")}
    )} diff --git a/src/Locale/en.json b/src/Locale/en.json index b4c18b685a9..0df3c961e10 100644 --- a/src/Locale/en.json +++ b/src/Locale/en.json @@ -25,6 +25,7 @@ "last_name": "Last Name", "email": "Email Address", "phone_number": "Phone Number", + "whatsapp_number": "Whatsapp Number", "district": "District", "gender": "Gender", "age": "Age", @@ -277,6 +278,29 @@ "unsupported_browser": "Unsupported Browser", "unsupported_browser_description": "Your browser ({{name}} version {{version}}) is not supported. Please update your browser to the latest version or switch to a supported browser for the best experience.", "add_remarks": "Add remarks", + "middleware_hostname": "Middleware Hostname", + "local_ipaddress": "Local IP Address", + "personal_information": "Personal Information", + "are_non_editable_fields": "are non-editable fields", + "edit_user_profile": "Edit Profile", + "skills": "Skills", + "access_level": "Access Level", + "qualification": "Qualification", + "years_of_experience": "Years of Experience", + "years_of_experience_of_the_doctor": "Years of Experience of the Doctor", + "medical_council_registration": "Medical Council Registration", + "doctor_s_medical_council_registration": "Doctor's Medical Council Registration", + "video_conference_link": "Video Conference Link", + "new_password_confirmation": "Confirm New Password", + "current_password": "Current Password", + "change_password": "Change Password", + "language_selection": "Language Selection", + "set_your_local_language": "Set your local language", + "software_update": "Software Update", + "check_for_available_update": "Check for available update", + "update_available": "Update Available", + "checking_for_update": "Checking for update", + "check_for_update": "Check for Update", "SORT_OPTIONS__-created_date": "Latest created date first", "SORT_OPTIONS__created_date": "Oldest created date first", "SORT_OPTIONS__-category_severity": "Highest Severity category first", @@ -293,9 +317,6 @@ "SORT_OPTIONS__-name": "Patient name Z-A", "SORT_OPTIONS__bed__name": "Bed No. 1-N", "SORT_OPTIONS__-bed__name": "Bed No. N-1", - "middleware_hostname": "Middleware Hostname", - "local_ipaddress": "Local IP Address", - "qualification": "Qualification", "CONSULTATION_TAB__UPDATES": "Overview", "CONSULTATION_TAB__FEED": "Feed", "CONSULTATION_TAB__SUMMARY": "Vitals", diff --git a/src/PluginEngine.tsx b/src/PluginEngine.tsx new file mode 100644 index 00000000000..3d47dba4d81 --- /dev/null +++ b/src/PluginEngine.tsx @@ -0,0 +1,51 @@ +/* eslint-disable i18next/no-literal-string */ +import React, { Suspense } from "react"; +import { CareAppsContext, useCareApps } from "./Common/hooks/useCareApps"; +import { pluginMap } from "./pluginTypes"; +import { UserAssignedModel } from "./Components/Users/models"; +import ErrorBoundary from "./Components/Common/ErrorBoundary"; + +export default function PluginEngine({ + children, +}: { + children: React.ReactNode; +}) { + return ( + Loading plugins...
    }> + + Error loading plugins +
    + } + > + + {children} + + + + ); +} + +export function PLUGIN_DoctorConnectButtons({ + user, +}: { + user: UserAssignedModel; +}) { + const plugins = useCareApps(); + return ( +
    + {plugins.map((plugin, index) => { + const DoctorConnectButtons = plugin.components.DoctorConnectButtons; + if (!DoctorConnectButtons) { + return null; + } + return ( +
    + +
    + ); + })} +
    + ); +} diff --git a/src/Redux/api.tsx b/src/Redux/api.tsx index 4775674084e..f1130345f46 100644 --- a/src/Redux/api.tsx +++ b/src/Redux/api.tsx @@ -1129,7 +1129,7 @@ const routes = { path: "/api/v1/notification/notify/", method: "POST", TRes: Type(), - Tbody: Type(), + TBody: Type(), }, // FileUpload Create diff --git a/src/Routers/AppRouter.tsx b/src/Routers/AppRouter.tsx index 9d411d11950..df154ee7a5e 100644 --- a/src/Routers/AppRouter.tsx +++ b/src/Routers/AppRouter.tsx @@ -24,11 +24,26 @@ import HCXRoutes from "./routes/HCXRoutes"; import ShiftingRoutes from "./routes/ShiftingRoutes"; import AssetRoutes from "./routes/AssetRoutes"; import ResourceRoutes from "./routes/ResourceRoutes"; -import { DetailRoute } from "./types"; +import { usePluginRoutes } from "@/Common/hooks/useCareApps"; import careConfig from "@careConfig"; import IconIndex from "../CAREUI/icons/Index"; -const Routes = { +export type RouteParams = + T extends `${string}:${infer Param}/${infer Rest}` + ? { [K in Param | keyof RouteParams]: string } + : T extends `${string}:${infer Param}` + ? { [K in Param]: string } + : Record; + +export type RouteFunction = ( + params: RouteParams, +) => JSX.Element; + +export type AppRoutes = { + [K in string]: RouteFunction; +}; + +const Routes: AppRoutes = { "/": () => , ...AssetRoutes, @@ -40,15 +55,13 @@ const Routes = { ...ShiftingRoutes, ...UserRoutes, - "/notifications/:id": ({ id }: DetailRoute) => ( - - ), + "/notifications/:id": ({ id }) => , "/notice_board": () => , - "/abdm/health-information/:id": ({ id }: { id: string }) => ( + "/abdm/health-information/:id": ({ id }) => ( ), - "/facility/:facilityId/abdm": ({ facilityId }: any) => ( + "/facility/:facilityId/abdm": ({ facilityId }) => ( ), @@ -61,6 +74,8 @@ const Routes = { }; export default function AppRouter() { + const pluginRoutes = usePluginRoutes(); + let routes = Routes; if (careConfig.hcx.enabled) { @@ -68,7 +83,15 @@ export default function AppRouter() { } useRedirect("/user", "/users"); + + // Merge in Plugin Routes + routes = { + ...routes, + ...pluginRoutes, + }; + const pages = useRoutes(routes) || ; + const path = usePath(); const [sidebarOpen, setSidebarOpen] = useState(false); diff --git a/src/Routers/routes/AssetRoutes.tsx b/src/Routers/routes/AssetRoutes.tsx index d3bd96ca437..ee0537d6c58 100644 --- a/src/Routers/routes/AssetRoutes.tsx +++ b/src/Routers/routes/AssetRoutes.tsx @@ -2,20 +2,23 @@ import AssetConfigure from "../../Components/Assets/AssetConfigure"; import AssetManage from "../../Components/Assets/AssetManage"; import AssetsList from "../../Components/Assets/AssetsList"; import AssetCreate from "../../Components/Facility/AssetCreate"; +import { AppRoutes } from "../AppRouter"; -export default { +const AssetRoutes: AppRoutes = { "/assets": () => , - - "/facility/:facilityId/assets/new": (params: any) => ( - - ), - "/facility/:facilityId/assets/:assetId/update": (params: any) => ( - + "/facility/:facilityId/assets/new": ({ facilityId }) => ( + ), - "/facility/:facilityId/assets/:assetId": (params: any) => ( - + "/facility/:facilityId/assets/:assetId/update": ({ facilityId, assetId }) => ( + ), - "/facility/:facilityId/assets/:assetId/configure": (params: any) => ( - + "/facility/:facilityId/assets/:assetId": ({ facilityId, assetId }) => ( + ), + "/facility/:facilityId/assets/:assetId/configure": ({ + facilityId, + assetId, + }) => , }; + +export default AssetRoutes; diff --git a/src/Routers/routes/ConsultationRoutes.tsx b/src/Routers/routes/ConsultationRoutes.tsx index 598fd06adc3..77efe1081bc 100644 --- a/src/Routers/routes/ConsultationRoutes.tsx +++ b/src/Routers/routes/ConsultationRoutes.tsx @@ -5,30 +5,29 @@ import ManagePrescriptions from "../../Components/Medicine/ManagePrescriptions"; import { DailyRoundListDetails } from "../../Components/Patient/DailyRoundListDetails"; import { DailyRounds } from "../../Components/Patient/DailyRounds"; import { ConsultationDetails } from "../../Components/Facility/ConsultationDetails"; -import TreatmentSummary, { - ITreatmentSummaryProps, -} from "../../Components/Facility/TreatmentSummary"; +import TreatmentSummary from "../../Components/Facility/TreatmentSummary"; import ConsultationDoctorNotes from "../../Components/Facility/ConsultationDoctorNotes"; import PatientConsentRecords from "../../Components/Patient/PatientConsentRecords"; import CriticalCareEditor from "../../Components/LogUpdate/CriticalCareEditor"; import PrescriptionsPrintPreview from "../../Components/Medicine/PrintPreview"; import CriticalCarePreview from "../../Components/LogUpdate/CriticalCarePreview"; import FileUploadPage from "../../Components/Patient/FileUploadPage"; +import { AppRoutes } from "../AppRouter"; -export default { +const consultationRoutes: AppRoutes = { "/facility/:facilityId/patient/:patientId/consultation": ({ facilityId, patientId, - }: any) => , + }) => , "/facility/:facilityId/patient/:patientId/consultation/:id/update": ({ facilityId, patientId, id, - }: any) => ( + }) => ( ), "/facility/:facilityId/patient/:patientId/consultation/:id/consent-records": - ({ facilityId, patientId, id }: any) => ( + ({ facilityId, patientId, id }) => ( ( + }) => ( ), "/facility/:facilityId/patient/:patientId/consultation/:consultationId/prescriptions": - (path: any) => , + (path) => , "/facility/:facilityId/patient/:patientId/consultation/:consultationId/prescriptions/print": () => , "/facility/:facilityId/patient/:patientId/consultation/:id/investigation": ({ facilityId, patientId, id, - }: any) => ( + }) => ( ), "/facility/:facilityId/patient/:patientId/consultation/:id/investigation/:sessionId": - ({ facilityId, patientId, id, sessionId }: any) => ( + ({ facilityId, patientId, id, sessionId }) => ( ( + }) => ( ), "/facility/:facilityId/patient/:patientId/consultation/:consultationId/daily-rounds/:id/update": - ({ facilityId, patientId, consultationId, id }: any) => ( + ({ facilityId, patientId, consultationId, id }) => ( ), "/facility/:facilityId/patient/:patientId/consultation/:consultationId/daily-rounds/:id": - ({ facilityId, patientId, consultationId, id }: any) => ( + ({ facilityId, patientId, consultationId, id }) => ( ), - "/facility/:facilityId/patient/:patientId/consultation/:consultationId/daily_rounds/:id": - (params: { - facilityId: string; - patientId: string; - consultationId: string; - id: string; - }) => , + ({ facilityId, patientId, consultationId, id }) => ( + + ), "/facility/:facilityId/patient/:patientId/consultation/:consultationId/daily_rounds/:id/update": - (params: { - facilityId: string; - patientId: string; - consultationId: string; - id: string; - }) => , + ({ facilityId, patientId, consultationId, id }) => ( + + ), "/facility/:facilityId/patient/:patientId/consultation/:consultationId": ({ facilityId, patientId, consultationId, - }: any) => ( + }) => ( ), - "/consultation/:consultationId": ({ consultationId }: any) => ( + "/consultation/:consultationId": ({ consultationId }) => ( ), "/facility/:facilityId/patient/:patientId/consultation/:consultationId/treatment-summary": - ({ facilityId, patientId, consultationId }: ITreatmentSummaryProps) => ( + ({ facilityId, patientId, consultationId }) => ( ), "/facility/:facilityId/patient/:patientId/consultation/:consultationId/notes": - ({ facilityId, patientId, consultationId }: any) => ( + ({ facilityId, patientId, consultationId }) => ( ), "/facility/:facilityId/patient/:patientId/consultation/:consultationId/:tab": - ({ facilityId, patientId, consultationId, tab }: any) => ( + ({ facilityId, patientId, consultationId, tab }) => ( ), }; + +export default consultationRoutes; diff --git a/src/Routers/routes/FacilityInventoryRoutes.tsx b/src/Routers/routes/FacilityInventoryRoutes.tsx index 17e93b2bc60..99123d8f737 100644 --- a/src/Routers/routes/FacilityInventoryRoutes.tsx +++ b/src/Routers/routes/FacilityInventoryRoutes.tsx @@ -3,22 +3,25 @@ import InventoryList from "../../Components/Facility/InventoryList"; import InventoryLog from "../../Components/Facility/InventoryLog"; import MinQuantityList from "../../Components/Facility/MinQuantityList"; import { SetInventoryForm } from "../../Components/Facility/SetInventoryForm"; +import { AppRoutes } from "../AppRouter"; -export default { - "/facility/:facilityId/inventory": ({ facilityId }: any) => ( +const FacilityInventoryRoutes: AppRoutes = { + "/facility/:facilityId/inventory": ({ facilityId }) => ( ), - "/facility/:facilityId/inventory/min_quantity/set": ({ facilityId }: any) => ( + "/facility/:facilityId/inventory/min_quantity/set": ({ facilityId }) => ( ), - "/facility/:facilityId/inventory/min_quantity/list": ({ - facilityId, - }: any) => , - "/facility/:facilityId/inventory/min_quantity": ({ facilityId }: any) => ( + "/facility/:facilityId/inventory/min_quantity/list": ({ facilityId }) => ( + + ), + "/facility/:facilityId/inventory/min_quantity": ({ facilityId }) => ( ), "/facility/:facilityId/inventory/:inventoryId": ({ facilityId, inventoryId, - }: any) => , + }) => , }; + +export default FacilityInventoryRoutes; diff --git a/src/Routers/routes/FacilityLocationRoutes.tsx b/src/Routers/routes/FacilityLocationRoutes.tsx index 5d547ebd466..c2e1add4b10 100644 --- a/src/Routers/routes/FacilityLocationRoutes.tsx +++ b/src/Routers/routes/FacilityLocationRoutes.tsx @@ -6,41 +6,42 @@ import LocationManagement from "../../Components/Facility/LocationManagement"; import CentralLiveMonitoring from "../../Components/CameraFeed/CentralLiveMonitoring"; import { AuthorizeUserRoute } from "../../Utils/AuthorizeFor"; import { CameraFeedPermittedUserTypes } from "../../Utils/permissions"; +import { AppRoutes } from "../AppRouter"; -export default { - "/facility/:facilityId/location": ({ facilityId }: any) => ( +const FacilityLocationRoutes: AppRoutes = { + "/facility/:facilityId/location": ({ facilityId }) => ( ), "/facility/:facilityId/location/:locationId/beds": ({ facilityId, locationId, - }: any) => , - "/facility/:facilityId/inventory/add": ({ facilityId }: any) => ( + }) => , + "/facility/:facilityId/inventory/add": ({ facilityId }) => ( ), - "/facility/:facilityId/location/add": ({ facilityId }: any) => ( + "/facility/:facilityId/location/add": ({ facilityId }) => ( ), "/facility/:facilityId/location/:locationId/update": ({ facilityId, locationId, - }: any) => ( - - ), + }) => , "/facility/:facilityId/location/:locationId/beds/add": ({ facilityId, locationId, - }: any) => , + }) => , "/facility/:facilityId/location/:locationId/beds/:bedId/update": ({ facilityId, locationId, bedId, - }: any) => ( + }) => ( ), - "/facility/:facilityId/live-monitoring": (props: any) => ( + "/facility/:facilityId/live-monitoring": ({ facilityId }) => ( - + ), }; + +export default FacilityLocationRoutes; diff --git a/src/Routers/routes/FacilityRoutes.tsx b/src/Routers/routes/FacilityRoutes.tsx index 2c711cf48cb..16b202ae0ce 100644 --- a/src/Routers/routes/FacilityRoutes.tsx +++ b/src/Routers/routes/FacilityRoutes.tsx @@ -2,48 +2,47 @@ import { FacilityConfigure } from "../../Components/Facility/FacilityConfigure"; import { FacilityCreate } from "../../Components/Facility/FacilityCreate"; import { FacilityHome } from "../../Components/Facility/FacilityHome"; import FacilityUsers from "../../Components/Facility/FacilityUsers"; -import { HospitalList } from "../../Components/Facility/HospitalList"; +import { FacilityList } from "../../Components/Facility/FacilityList"; import { TriageForm } from "../../Components/Facility/TriageForm"; import ResourceCreate from "../../Components/Resource/ResourceCreate"; import CentralNursingStation from "../../Components/Facility/CentralNursingStation"; import FacilityLocationRoutes from "./FacilityLocationRoutes"; import FacilityInventoryRoutes from "./FacilityInventoryRoutes"; import DischargedPatientsList from "../../Components/Facility/DischargedPatientsList"; +import { AppRoutes } from "../AppRouter"; -export default { - "/facility": () => , +const FacilityRoutes: AppRoutes = { + "/facility": () => , "/facility/create": () => , - "/facility/:facilityId/update": ({ facilityId }: any) => ( + "/facility/:facilityId/update": ({ facilityId }) => ( ), - "/facility/:facilityId/configure": ({ facilityId }: any) => ( + "/facility/:facilityId/configure": ({ facilityId }) => ( ), - "/facility/:facilityId/cns": ({ facilityId }: any) => ( + "/facility/:facilityId/cns": ({ facilityId }) => ( ), - "/facility/:facilityId": ({ facilityId }: any) => ( + "/facility/:facilityId": ({ facilityId }) => ( ), - "/facility/:id/discharged-patients": ({ id }: any) => ( + "/facility/:id/discharged-patients": ({ id }) => ( ), - - "/facility/:facilityId/users": ({ facilityId }: any) => ( + "/facility/:facilityId/users": ({ facilityId }) => ( ), - "/facility/:facilityId/resource/new": ({ facilityId }: any) => ( + "/facility/:facilityId/resource/new": ({ facilityId }) => ( ), - - // Triage related routes - "/facility/:facilityId/triage": ({ facilityId }: any) => ( + "/facility/:facilityId/triage": ({ facilityId }) => ( ), - "/facility/:facilityId/triage/:id": ({ facilityId, id }: any) => ( + "/facility/:facilityId/triage/:id": ({ facilityId, id }) => ( ), - ...FacilityLocationRoutes, ...FacilityInventoryRoutes, }; + +export default FacilityRoutes; diff --git a/src/Routers/routes/HCXRoutes.tsx b/src/Routers/routes/HCXRoutes.tsx index 80378b24621..929cc3f12bb 100644 --- a/src/Routers/routes/HCXRoutes.tsx +++ b/src/Routers/routes/HCXRoutes.tsx @@ -1,10 +1,15 @@ -import ConsultationClaims, { - IConsultationClaimsProps, -} from "../../Components/Facility/ConsultationClaims"; +import ConsultationClaims from "../../Components/Facility/ConsultationClaims"; +import { AppRoutes } from "../AppRouter"; -export default { +const HCXRoutes: AppRoutes = { "/facility/:facilityId/patient/:patientId/consultation/:consultationId/claims": - (pathParams: IConsultationClaimsProps) => ( - + ({ facilityId, patientId, consultationId }) => ( + ), }; + +export default HCXRoutes; diff --git a/src/Routers/routes/PatientRoutes.tsx b/src/Routers/routes/PatientRoutes.tsx index fcfc9b04e37..45ff044e4d2 100644 --- a/src/Routers/routes/PatientRoutes.tsx +++ b/src/Routers/routes/PatientRoutes.tsx @@ -3,44 +3,44 @@ import { PatientManager } from "../../Components/Patient/ManagePatients"; import { PatientHome } from "../../Components/Patient/PatientHome"; import PatientNotes from "../../Components/Patient/PatientNotes"; import { PatientRegister } from "../../Components/Patient/PatientRegister"; -import { DetailRoute } from "../types"; import DeathReport from "../../Components/DeathReport/DeathReport"; import { InsuranceDetails } from "../../Components/Patient/InsuranceDetails"; import FileUploadPage from "../../Components/Patient/FileUploadPage"; +import { AppRoutes } from "../AppRouter"; -export default { +const PatientRoutes: AppRoutes = { "/patients": () => , - "/patient/:id": ({ id }: DetailRoute) => , - "/patient/:id/investigation_reports": ({ id }: DetailRoute) => ( + "/patient/:id": ({ id }) => , + "/patient/:id/investigation_reports": ({ id }) => ( ), - - // Facility Scoped Routes - "/facility/:facilityId/patient": ({ facilityId }: any) => ( + "/facility/:facilityId/patient": ({ facilityId }) => ( ), - "/facility/:facilityId/patient/:id": ({ facilityId, id }: any) => ( + "/facility/:facilityId/patient/:id": ({ facilityId, id }) => ( ), - "/facility/:facilityId/patient/:id/insurance": ({ facilityId, id }: any) => ( + "/facility/:facilityId/patient/:id/insurance": ({ facilityId, id }) => ( ), - "/facility/:facilityId/patient/:id/update": ({ facilityId, id }: any) => ( + "/facility/:facilityId/patient/:id/update": ({ facilityId, id }) => ( ), "/facility/:facilityId/patient/:patientId/notes": ({ facilityId, patientId, - }: any) => , + }) => , "/facility/:facilityId/patient/:patientId/files": ({ facilityId, patientId, - }: any) => ( + }) => ( ), - "/death_report/:id": ({ id }: any) => , + "/death_report/:id": ({ id }) => , }; + +export default PatientRoutes; diff --git a/src/Routers/routes/ResourceRoutes.tsx b/src/Routers/routes/ResourceRoutes.tsx index 6636d0d83ea..d75c933f760 100644 --- a/src/Routers/routes/ResourceRoutes.tsx +++ b/src/Routers/routes/ResourceRoutes.tsx @@ -3,17 +3,17 @@ import { ResourceDetailsUpdate } from "../../Components/Resource/ResourceDetails import ListView from "../../Components/Resource/ListView"; import BoardView from "../../Components/Resource/ResourceBoardView"; import { Redirect } from "raviger"; -import { DetailRoute } from "../types"; +import { AppRoutes } from "../AppRouter"; const getDefaultView = () => localStorage.getItem("defaultResourceView") === "list" ? "list" : "board"; -export default { +const ResourceRoutes: AppRoutes = { "/resource": () => , "/resource/board": () => , "/resource/list": () => , - "/resource/:id": ({ id }: DetailRoute) => , - "/resource/:id/update": ({ id }: DetailRoute) => ( - - ), + "/resource/:id": ({ id }) => , + "/resource/:id/update": ({ id }) => , }; + +export default ResourceRoutes; diff --git a/src/Routers/routes/SampleRoutes.tsx b/src/Routers/routes/SampleRoutes.tsx index 290a34fd4eb..cf296790a81 100644 --- a/src/Routers/routes/SampleRoutes.tsx +++ b/src/Routers/routes/SampleRoutes.tsx @@ -2,24 +2,22 @@ import { SampleDetails } from "../../Components/Patient/SampleDetails"; import SampleReport from "../../Components/Patient/SamplePreview"; import { SampleTest } from "../../Components/Patient/SampleTest"; import SampleViewAdmin from "../../Components/Patient/SampleViewAdmin"; -import { DetailRoute, RouteParams } from "../types"; +import { AppRoutes } from "../AppRouter"; -export default { +const SampleRoutes: AppRoutes = { "/sample": () => , - "/sample/:id": ({ id }: DetailRoute) => , + "/sample/:id": ({ id }) => , "/patient/:patientId/test_sample/:sampleId/icmr_sample": ({ patientId, sampleId, - }: RouteParams<"patientId" | "sampleId">) => ( - - ), + }) => , "/facility/:facilityId/patient/:patientId/sample-test": ({ facilityId, patientId, - }: RouteParams<"facilityId" | "patientId">) => ( - + }) => , + "/facility/:facilityId/patient/:patientId/sample/:id": ({ id }) => ( + ), - "/facility/:facilityId/patient/:patientId/sample/:id": ({ - id, - }: DetailRoute) => , }; + +export default SampleRoutes; diff --git a/src/Routers/routes/ShiftingRoutes.tsx b/src/Routers/routes/ShiftingRoutes.tsx index f2e12de4f25..dc11ff2b8ee 100644 --- a/src/Routers/routes/ShiftingRoutes.tsx +++ b/src/Routers/routes/ShiftingRoutes.tsx @@ -4,18 +4,21 @@ import { ShiftDetailsUpdate } from "../../Components/Shifting/ShiftDetailsUpdate import ListView from "../../Components/Shifting/ListView"; import BoardView from "../../Components/Shifting/BoardView"; import { Redirect } from "raviger"; +import { AppRoutes } from "../AppRouter"; const getDefaultView = () => localStorage.getItem("defaultShiftView") === "list" ? "list" : "board"; -export default { +const ShiftingRoutes: AppRoutes = { "/shifting": () => , "/shifting/board": () => , "/shifting/list": () => , - "/shifting/:id": ({ id }: any) => , - "/shifting/:id/update": ({ id }: any) => , + "/shifting/:id": ({ id }) => , + "/shifting/:id/update": ({ id }) => , "/facility/:facilityId/patient/:patientId/shift/new": ({ facilityId, patientId, - }: any) => , + }) => , }; + +export default ShiftingRoutes; diff --git a/src/Routers/routes/UserRoutes.tsx b/src/Routers/routes/UserRoutes.tsx index 56877ca4c78..24f355b201b 100644 --- a/src/Routers/routes/UserRoutes.tsx +++ b/src/Routers/routes/UserRoutes.tsx @@ -1,9 +1,12 @@ import ManageUsers from "../../Components/Users/ManageUsers"; import { UserAdd } from "../../Components/Users/UserAdd"; import UserProfile from "../../Components/Users/UserProfile"; +import { AppRoutes } from "../AppRouter"; -export default { +const UserRoutes: AppRoutes = { "/users": () => , "/users/add": () => , "/user/profile": () => , }; + +export default UserRoutes; diff --git a/src/Utils/useTimer.tsx b/src/Utils/useTimer.tsx index 6a8d8320c5e..f7a03ffefa0 100644 --- a/src/Utils/useTimer.tsx +++ b/src/Utils/useTimer.tsx @@ -27,7 +27,7 @@ export const useTimer = (autoStart = false) => { const [time, setTime] = useState(0); useEffect(() => { - let interval: number; + let interval: ReturnType; if (running) { interval = setInterval(() => { setTime((prevTime) => prevTime + 1); diff --git a/src/pluginTypes.ts b/src/pluginTypes.ts new file mode 100644 index 00000000000..26a07e4f141 --- /dev/null +++ b/src/pluginTypes.ts @@ -0,0 +1,54 @@ +import { LazyExoticComponent } from "react"; +import { UserAssignedModel } from "./Components/Users/models"; +import { AppRoutes } from "./Routers/AppRouter"; +import { INavItem } from "./Components/Common/Sidebar/Sidebar"; +import { pluginMap } from "./pluginMap"; + +// Define the available plugins +export type AvailablePlugin = "@apps/care_livekit_fe"; + +export type AvailablePluginManifest = "@app-manifest/care_livekit_fe"; + +export type DoctorConnectButtonComponentType = React.FC<{ + user: UserAssignedModel; +}>; + +// Define supported plugin components +export type SupportedPluginComponents = { + DoctorConnectButtons: DoctorConnectButtonComponentType; +}; + +// Create a type for lazy-loaded components +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type LazyComponent> = LazyExoticComponent; + +// Define PluginComponentMap with lazy-loaded components +export type PluginComponentMap = { + [K in keyof SupportedPluginComponents]?: LazyComponent< + SupportedPluginComponents[K] + >; +}; + +type SupportedPluginExtensions = + | "DoctorConnectButtons" + | "PatientExternalRegistration"; + +export type PluginManifest = { + plugin: string; + routes: AppRoutes; + extends: SupportedPluginExtensions[]; + components: PluginComponentMap; + navItems: INavItem[]; +}; + +// Create a type that ensures only available plugins can be used +export type EnabledPluginConfig = { + plugin: string; + manifestPath: AvailablePluginManifest; + path: AvailablePlugin; + manifest: Promise; + // Components are a dictionary, with the key being the component name, and the value being the component type + components: PluginComponentMap; +}; + +export { pluginMap }; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 7657f7da19e..f339922bfae 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -31,6 +31,7 @@ interface ImportMetaEnv { readonly REACT_JWT_TOKEN_REFRESH_INTERVAL?: string; readonly REACT_MIN_ENCOUNTER_DATE?: string; readonly REACT_ALLOWED_LOCALES?: string; + readonly REACT_ENABLED_APPS?: string; // Plugins related envs... readonly REACT_PLAUSIBLE_SERVER_URL?: string; diff --git a/tsconfig.json b/tsconfig.json index 531d6f800e1..51ffeb4a0ae 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,9 +19,12 @@ "baseUrl": ".", "paths": { "@/*": ["./src/*"], + "@core/*": ["src/*"], + "@apps/*": ["apps/*/src"], + "@app-manifest/*": ["apps/*/src/manifest.ts"], "@careConfig": ["./care.config.ts"] } }, - "include": ["src", "care.config.ts"], + "include": ["src/**/*", "apps/**/*", "care.config.ts"], "exclude": ["src/**/*.gen.tsx"] } diff --git a/vite.config.mts b/vite.config.mts index acb0cdf727b..905374eb923 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -1,10 +1,12 @@ -import path from "node:path"; +import path from "path"; import { createRequire } from "node:module"; import { VitePWA } from "vite-plugin-pwa"; import react from "@vitejs/plugin-react-swc"; import checker from "vite-plugin-checker"; import { viteStaticCopy } from "vite-plugin-static-copy"; import { treeShakeCareIcons } from "./plugins/treeShakeCareIcons"; +import fs from "fs"; +import { defineConfig } from "vite"; const pdfWorkerPath = path.join( path.dirname( @@ -22,8 +24,56 @@ const cdnUrls = "http://localhost:4566", ].join(" "); +function getPluginAliases() { + const pluginsDir = path.resolve(__dirname, "apps"); + // Make sure the `apps` folder exists + if (!fs.existsSync(pluginsDir)) { + return {}; + } + const pluginFolders = fs.readdirSync(pluginsDir); + + const aliases = {}; + + pluginFolders.forEach((pluginFolder) => { + const pluginSrcPath = path.join(pluginsDir, pluginFolder, "src"); + if (fs.existsSync(pluginSrcPath)) { + aliases[`@apps/${pluginFolder}`] = pluginSrcPath; + aliases[`@app-manifest/${pluginFolder}`] = path.join( + pluginSrcPath, + "manifest.ts", + ); + } + }); + + return aliases; +} + +function getPluginDependencies() { + const pluginsDir = path.resolve(__dirname, "apps"); + // Make sure the `apps` folder exists + if (!fs.existsSync(pluginsDir)) { + return []; + } + const pluginFolders = fs.readdirSync(pluginsDir); + + const dependencies = new Set(); + + pluginFolders.forEach((pluginFolder) => { + const packageJsonPath = path.join(pluginsDir, pluginFolder, "package.json"); + if (fs.existsSync(packageJsonPath)) { + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8")); + const pluginDependencies = packageJson.dependencies + ? Object.keys(packageJson.dependencies) + : []; + pluginDependencies.forEach((dep) => dependencies.add(dep)); + } + }); + + return Array.from(dependencies); +} + /** @type {import('vite').UserConfig} */ -export default { +export default defineConfig({ envPrefix: "REACT_", plugins: [ viteStaticCopy({ @@ -86,10 +136,15 @@ export default { ], resolve: { alias: { + ...getPluginAliases(), "@": path.resolve(__dirname, "./src"), "@careConfig": path.resolve(__dirname, "./care.config.ts"), + "@core": path.resolve(__dirname, "src/"), }, }, + optimizeDeps: { + include: getPluginDependencies(), + }, build: { outDir: "build", assetsDir: "bundle", @@ -118,4 +173,4 @@ export default { }, port: 4000, }, -}; +}); From 2993e5a5dae22129de63df8bc15e9c12ab313100 Mon Sep 17 00:00:00 2001 From: Gigin George Date: Wed, 16 Oct 2024 16:25:34 +0530 Subject: [PATCH 14/31] Remove ThemedFavIcon --- src/App.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index 180bd92839c..0b2d20e805a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -11,7 +11,6 @@ import { Toaster } from "./Components/ui/toaster"; const App = () => { return ( }> - }> From 5a37ff1a2eaa2316f2fef4e640af5ecb9ca31f4d Mon Sep 17 00:00:00 2001 From: Shivank Kacker Date: Wed, 16 Oct 2024 16:46:50 +0530 Subject: [PATCH 15/31] Updated README: updated CARE logo (#8801) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7ea8fe1a221..2504bf47fb7 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@

    - - CARE Logo + + CARE Logo

    From bbb7503279395d6c18e1e88b8ab96ac278963545 Mon Sep 17 00:00:00 2001 From: Vinu Date: Wed, 16 Oct 2024 16:52:57 +0530 Subject: [PATCH 16/31] Update styling for the side nav (#8789) Co-authored-by: Mohammed Nihal <57055998+nihal467@users.noreply.github.com> --- cypress/e2e/auth_spec/auth.cy.ts | 1 + .../patient_spec/PatientBedManagement.cy.ts | 2 +- .../patient_spec/PatientDoctorConnect.cy.ts | 3 +- .../e2e/patient_spec/PatientDoctorNotes.cy.ts | 2 +- cypress/e2e/users_spec/UsersCreation.cy.ts | 2 + cypress/pageobject/Login/LoginPage.ts | 2 + .../Patient/PatientDoctorConnect.ts | 4 +- .../pageobject/Patient/PatientDoctorNotes.ts | 6 + cypress/pageobject/Users/ManageUserPage.ts | 1 + package-lock.json | 461 ++++++++++++++++++ package.json | 2 + public/favicon.ico | Bin 6439 -> 15086 bytes src/CAREUI/icons/UniconPaths.json | 12 + src/Components/Common/Breadcrumbs.tsx | 4 +- src/Components/Common/Sidebar/Sidebar.tsx | 111 +++-- src/Components/Common/Sidebar/SidebarItem.tsx | 6 +- .../Common/Sidebar/SidebarUserCard.tsx | 93 ++-- src/Components/Facility/FacilityList.tsx | 2 +- src/Components/Notifications/NoticeBoard.tsx | 2 +- src/Components/Patient/ManagePatients.tsx | 2 +- src/Components/Resource/ResourceBoardView.tsx | 2 +- src/Components/ui/dropdown-menu.tsx | 203 ++++++++ src/Components/ui/tooltip.tsx | 28 ++ src/Locale/en.json | 18 +- 24 files changed, 863 insertions(+), 106 deletions(-) create mode 100644 src/Components/ui/dropdown-menu.tsx create mode 100644 src/Components/ui/tooltip.tsx diff --git a/cypress/e2e/auth_spec/auth.cy.ts b/cypress/e2e/auth_spec/auth.cy.ts index a535668ef01..b2bd7b634c0 100644 --- a/cypress/e2e/auth_spec/auth.cy.ts +++ b/cypress/e2e/auth_spec/auth.cy.ts @@ -6,6 +6,7 @@ describe("Authorisation/Authentication", () => { it("Try login as admin with correct password", () => { cy.loginByApi("devdistrictadmin", "Coronasafe@123"); cy.awaitUrl("/facility"); + cy.get("#user-profile-name").click(); cy.get("#sign-out-button").contains("Sign Out").click(); cy.url().should("include", "/"); }); diff --git a/cypress/e2e/patient_spec/PatientBedManagement.cy.ts b/cypress/e2e/patient_spec/PatientBedManagement.cy.ts index d9453806c9f..1964f913a03 100644 --- a/cypress/e2e/patient_spec/PatientBedManagement.cy.ts +++ b/cypress/e2e/patient_spec/PatientBedManagement.cy.ts @@ -10,7 +10,7 @@ describe("Patient swtich bed functionality", () => { const patientConsultationPage = new PatientConsultationPage(); const switchBedOne = "Dummy Bed 4"; const switchBedTwo = "Dummy Bed 1"; - const switchBedThree = "Dummy Bed 3"; + const switchBedThree = "Dummy Bed 7"; const switchPatientOne = "Dummy Patient 6"; const switchPatientTwo = "Dummy Patient 7"; diff --git a/cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts b/cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts index 64d47db2cf1..c1362c328c0 100644 --- a/cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts +++ b/cypress/e2e/patient_spec/PatientDoctorConnect.cy.ts @@ -8,7 +8,6 @@ describe("Patient Doctor Connect in consultation page", () => { const doctorconnect = new DoctorConnect(); const patientName = "Dummy Patient 11"; const doctorUser = "Dev Doctor"; - const doctorUserNumber = "+919876543219"; const nurseUser = "Dev Staff"; const teleIcuUser = "Dev Doctor Two"; @@ -37,7 +36,7 @@ describe("Patient Doctor Connect in consultation page", () => { "#doctor-connect-home-doctor", doctorUser, ); - doctorconnect.verifyCopiedContent(doctorUserNumber); + doctorconnect.verifyCopiedContent(); // verify the whatsapp and phone number icon presence doctorconnect.verifyIconVisible("#whatsapp-icon"); doctorconnect.verifyIconVisible("#phone-icon"); diff --git a/cypress/e2e/patient_spec/PatientDoctorNotes.cy.ts b/cypress/e2e/patient_spec/PatientDoctorNotes.cy.ts index 94300cdb5c6..9a21eaea51f 100644 --- a/cypress/e2e/patient_spec/PatientDoctorNotes.cy.ts +++ b/cypress/e2e/patient_spec/PatientDoctorNotes.cy.ts @@ -37,7 +37,7 @@ describe("Patient Discussion notes in the consultation page", () => { cy.verifyNotification(discussionNotesSuccessMessage); cy.closeNotification(); // verify the auto-switching of tab to nurse notes if the user is a nurse - cy.get("#sign-out-button").contains("Sign Out").click(); + patientDoctorNotes.signout(); loginPage.loginManuallyAsNurse(); loginPage.ensureLoggedIn(); cy.visit("/patients"); diff --git a/cypress/e2e/users_spec/UsersCreation.cy.ts b/cypress/e2e/users_spec/UsersCreation.cy.ts index 0f592318888..2c5797fefa7 100644 --- a/cypress/e2e/users_spec/UsersCreation.cy.ts +++ b/cypress/e2e/users_spec/UsersCreation.cy.ts @@ -67,6 +67,7 @@ describe("User Creation", () => { it("Update the existing user profile and verify its reflection", () => { userCreationPage.clickElementById("user-profile-name"); + userCreationPage.clickElementById("profile-button"); userCreationPage.verifyElementContainsText( "username-profile-details", "devdistrictadmin", @@ -129,6 +130,7 @@ describe("User Creation", () => { it("Update the existing user profile Form Mandatory File Error", () => { userCreationPage.clickElementById("user-profile-name"); + userCreationPage.clickElementById("profile-button"); userCreationPage.clickElementById("edit-cancel-profile-button"); userCreationPage.clearIntoElementById("firstName"); userCreationPage.clearIntoElementById("lastName"); diff --git a/cypress/pageobject/Login/LoginPage.ts b/cypress/pageobject/Login/LoginPage.ts index 7ea94d54737..06bd165c9ac 100644 --- a/cypress/pageobject/Login/LoginPage.ts +++ b/cypress/pageobject/Login/LoginPage.ts @@ -30,6 +30,8 @@ class LoginPage { } ensureLoggedIn(): void { + cy.get("#user-profile-name").click(); + cy.get("#sign-out-button").scrollIntoView(); cy.get("#sign-out-button").contains("Sign Out").should("exist"); } } diff --git a/cypress/pageobject/Patient/PatientDoctorConnect.ts b/cypress/pageobject/Patient/PatientDoctorConnect.ts index b8c33bb4b24..9933c3a1dec 100644 --- a/cypress/pageobject/Patient/PatientDoctorConnect.ts +++ b/cypress/pageobject/Patient/PatientDoctorConnect.ts @@ -10,8 +10,8 @@ export class DoctorConnect { }); } - verifyCopiedContent(text: string) { - cy.get("@clipboardStub").should("be.calledWith", text); + verifyCopiedContent() { + cy.get("@clipboardStub").should("be.calledWithMatch", /^\+91\d{10}$/); } verifyIconVisible(selector: string) { diff --git a/cypress/pageobject/Patient/PatientDoctorNotes.ts b/cypress/pageobject/Patient/PatientDoctorNotes.ts index 9538b0eed3b..157f35d47d9 100644 --- a/cypress/pageobject/Patient/PatientDoctorNotes.ts +++ b/cypress/pageobject/Patient/PatientDoctorNotes.ts @@ -26,4 +26,10 @@ export class PatientDoctorNotes { .its("response.statusCode") .should("eq", 201); } + + signout() { + cy.get("#user-profile-name").click(); + cy.get("#sign-out-button").scrollIntoView(); + cy.get("#sign-out-button").contains("Sign Out").click(); + } } diff --git a/cypress/pageobject/Users/ManageUserPage.ts b/cypress/pageobject/Users/ManageUserPage.ts index efa0d90142c..470862693a8 100644 --- a/cypress/pageobject/Users/ManageUserPage.ts +++ b/cypress/pageobject/Users/ManageUserPage.ts @@ -75,6 +75,7 @@ export class ManageUserPage { navigateToProfile() { cy.intercept("GET", "**/api/v1/users/**").as("getUsers"); cy.get("#user-profile-name").click(); + cy.get("#profile-button").click(); cy.wait("@getUsers").its("response.statusCode").should("eq", 200); } diff --git a/package-lock.json b/package-lock.json index e5bae3c6d02..aa99337d8d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,9 +19,11 @@ "@hello-pangea/dnd": "^17.0.0", "@pnotify/core": "^5.2.0", "@pnotify/mobile": "^5.2.0", + "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-toast": "^1.2.2", + "@radix-ui/react-tooltip": "^1.1.3", "@sentry/browser": "^8.33.0", "@yudiel/react-qr-scanner": "^2.0.8", "axios": "^1.7.7", @@ -3121,6 +3123,28 @@ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-collection": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", @@ -3188,6 +3212,20 @@ } } }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-dismissable-layer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz", @@ -3214,6 +3252,72 @@ } } }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz", + "integrity": "sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.2", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-icons": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz", @@ -3222,6 +3326,107 @@ "react": "^16.x || ^17.x || ^18.x" } }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.2.tgz", + "integrity": "sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-portal": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz", @@ -3290,6 +3495,50 @@ } } }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", @@ -3340,6 +3589,39 @@ } } }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.3.tgz", + "integrity": "sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", @@ -3402,6 +3684,40 @@ } } }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-visually-hidden": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", @@ -3424,6 +3740,11 @@ } } }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + }, "node_modules/@react-aria/focus": { "version": "3.18.4", "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.18.4.tgz", @@ -5272,6 +5593,17 @@ "node": ">=14.0.0" } }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -6737,6 +7069,11 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "node_modules/detective-amd": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-6.0.0.tgz", @@ -8409,6 +8746,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -9228,6 +9573,14 @@ "node": ">= 0.10" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", @@ -14672,6 +15025,73 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, + "node_modules/react-remove-scroll": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz", + "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.6", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-webcam": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/react-webcam/-/react-webcam-7.2.0.tgz", @@ -17557,6 +17977,26 @@ "requires-port": "^1.0.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-keyboard-shortcut": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/use-keyboard-shortcut/-/use-keyboard-shortcut-1.1.6.tgz", @@ -17574,6 +18014,27 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-sync-external-store": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", diff --git a/package.json b/package.json index 7749374be44..4c57b3e0ee1 100644 --- a/package.json +++ b/package.json @@ -57,9 +57,11 @@ "@hello-pangea/dnd": "^17.0.0", "@pnotify/core": "^5.2.0", "@pnotify/mobile": "^5.2.0", + "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-toast": "^1.2.2", + "@radix-ui/react-tooltip": "^1.1.3", "@sentry/browser": "^8.33.0", "@yudiel/react-qr-scanner": "^2.0.8", "axios": "^1.7.7", diff --git a/public/favicon.ico b/public/favicon.ico index 67a5686e32ffe2212a032deb9ee098827e52f887..d712ea36545e74e1b50e9097c54194bf8e17a6a4 100644 GIT binary patch literal 15086 zcmeHOTW=dh6dpTCn~UwlP8;XaII&#^=T=e@r%4m%QYvyms?<;rNL0`?5f!LFq9P>d zLxHLf`~nd0&VMNMHvny_KJgFQ7odQkI-GC4>x}K0b=GlQn{K6(SJxBaED zquToqa(CPD7CJiGs+8zLn9?7ND02^T5_GW9`L`unoQ@BU`VY7xhtFOeR*D^WE2qLn z=a1OHaFAae@oyjU)7*#p_O&>cT4LO5A9gf8xcoI^Z7I*dZGZdm!|ng-d7ahQp7s6{ zne3po&t_=tbG6KEj!+=lME<@;rF2iW7ahM~qw_~>VCe9{4IHKMAt!%MUmT>(?^d+3 zv^`FBt@`h${mviiczg$j9S3l9`K$Ak+x~93ca05qO{yEfMPod*J3MKqX8CdM0SH75~ z3pdrWaODKG#+u0&X;cbyu+jM=_Q07QCAPtdxq+jOzf>>VWUu>9bP`SGBGjjoSwaBN`Y``P@?8NY1ojF>KexBc__h}(ap`ChfZzrCrWwEoqSHh-*K zOHqB$tIZ$K!A6&Vkl%rk*GKGrJL*5ky~(q^lzJ_pl#ZbQ@!qQ*k9Dxo`6G5-e%Hs! ztou3Q@1R|Z;g(DPf8dWjuyVCWrQ?7*_8=>bTQ0o2!Y4khRsPKVI`-h1|NR=ghx^9) z0i1ydh*jqQpoZ?@0ds!YIKPoOgpxTwlj%!1hl0HHca;e^?V!KQ=Vxw!zbA7O?%&F_ zzzslgyW^ZzKg$A3_M8@<;Zpqb@L8c#{0wjN9O1VE?^_v++rTuaWw4*dS(C@iVT$kf z2bOZ>eW!7LWb8kj;$y!Ob52=GJbwc0f1KcBofhX^VrM!j_M$0#jXJwETnz@W9pU?W z8)^7_U%_51>Y&r$=<1#0^BRg4pLH(2qj$-+{n5Vzyfzga@MWcIJV;}2#0s82>Y$Tt zv95&}HqXQs-^cqY6PFTn`rVqWMS{i+6Qx5!neq| zF5CNe@hj8*$ld+Z9dvRno+BsDMJcw}Nzuh{Rt8pjD78LN&?is_oopLrU&P3d3oLWI zFrI%suTP)7da_{s;@tHq&gr@D57v7nSUrS^#kv1m(mfWU#*T)9n5cu!vO@`9#3&UXemJ{; zTxp5j92+{z4kdhTu%Sc$cl`ZPBxW&8Sr2S{1IcxjyuQQVfYXfsw7x&5&2M0ExWi(7 zk6C%?AWC2u_ibP+76d9;g>?%4uV%(tMRuJ+wQkfR-elenS^jk>4@HZ(X!@4gw}AVE zrNAHGy%TRG48gU^#`IPCcc((xxg4%5<&WWC$3QkT^;2L$%Dg5yc Zh#^Q7L4uE7Qa})CA{G#kqCTZaF(M!( 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 Apa1{> diff --git a/src/CAREUI/icons/UniconPaths.json b/src/CAREUI/icons/UniconPaths.json index 1a76c51570d..64f97d72d65 100644 --- a/src/CAREUI/icons/UniconPaths.json +++ b/src/CAREUI/icons/UniconPaths.json @@ -247,6 +247,10 @@ 24, "M7,11H17a1,1,0,0,0,0-2H13V5.41l.79.8a1,1,0,0,0,1.42,0,1,1,0,0,0,0-1.42l-2.5-2.5a1,1,0,0,0-.33-.21,1,1,0,0,0-.76,0,1,1,0,0,0-.33.21l-2.5,2.5a1,1,0,0,0,1.42,1.42l.79-.8V9H7a1,1,0,0,0,0,2Zm10,2H7a1,1,0,0,0,0,2h4v3.59l-.79-.8a1,1,0,0,0-1.42,1.42l2.5,2.5a1,1,0,0,0,.33.21.94.94,0,0,0,.76,0,1,1,0,0,0,.33-.21l2.5-2.5a1,1,0,0,0-1.42-1.42l-.79.8V15h4a1,1,0,0,0,0-2Z" ], + "l-arrow-bar-right": [ + 24, + "M8.4 12c0 .4.3.7.7.7h8.3l-3.1 3.1c-.3.3-.3.7 0 1s.7.3 1 0l4.3-4.3c.3-.3.3-.7 0-1 0 0 0 0 0 0l-4.3-4.3c-.3-.3-.7-.3-1 0s-.3.7 0 1l3.1 3.1h-8.3c-.4 0-.7.3-.7.7M4.9 22c-.4 0-.7-.3-.7-.7V2.7c0-.4.3-.7.7-.7s.7.3.7.7v18.6c0 .4-.3.7-.7.7" + ], "l-arrow-circle-down": [ 24, "M11.29,15.71a1,1,0,0,0,.33.21,1,1,0,0,0,.76,0,1,1,0,0,0,.33-.21l3-3a1,1,0,0,0-1.42-1.42L13,12.59V9a1,1,0,0,0-2,0v3.59l-1.29-1.3a1,1,0,0,0-1.42,0,1,1,0,0,0,0,1.42ZM12,22A10,10,0,1,0,2,12,10,10,0,0,0,12,22ZM12,4a8,8,0,1,1-8,8A8,8,0,0,1,12,4Z" @@ -2795,6 +2799,14 @@ 24, "M2.5,10.56l9,5.2a1,1,0,0,0,1,0l9-5.2a1,1,0,0,0,0-1.73l-9-5.2a1,1,0,0,0-1,0l-9,5.2a1,1,0,0,0,0,1.73ZM12,5.65l7,4-7,4.05L5,9.69Zm8.5,7.79L12,18.35,3.5,13.44a1,1,0,0,0-1.37.36,1,1,0,0,0,.37,1.37l9,5.2a1,1,0,0,0,1,0l9-5.2a1,1,0,0,0,.37-1.37A1,1,0,0,0,20.5,13.44Z" ], + "l-layout-sidebar": [ + 24, + "M0 4.5C0 2.8 1.3 1.5 3 1.5h18c1.7 0 3 1.3 3 3v15c0 1.7-1.3 3-3 3H3c-1.7 0-3-1.3-3-3V4.5ZM7.5 3v18h13.5c.8 0 1.5-.7 1.5-1.5V4.5c0-.8-.7-1.5-1.5-1.5H7.5ZM6 3h-3c-.8 0-1.5.7-1.5 1.5v15c0 .8.7 1.5 1.5 1.5h3V3Z" + ], + "l-layout-sidebar-alt": [ + 24, + "M21 1.5H3C1.3 1.5 0 2.8 0 4.5v15c0 1.7 1.3 3 3 3h18c1.7 0 3-1.3 3-3V4.5c0-1.7-1.3-3-3-3ZM22.5 19.5c0 .8-.7 1.5-1.5 1.5H3c-.8 0-1.5-.7-1.5-1.5V4.5c0-.8.7-1.5 1.5-1.5h18c.8 0 1.5.7 1.5 1.5v15ZM10.5 6v12c0 .8-.7 1.5-1.5 1.5h-3c-.8 0-1.5-.7-1.5-1.5V6c0-.8.7-1.5 1.5-1.5h3c.8 0 1.5.7 1.5 1.5Z" + ], "l-left-arrow-from-left": [ 24, "M17,11H5.41l2.3-2.29A1,1,0,1,0,6.29,7.29l-4,4a1,1,0,0,0-.21.33,1,1,0,0,0,0,.76,1,1,0,0,0,.21.33l4,4a1,1,0,0,0,1.42,0,1,1,0,0,0,0-1.42L5.41,13H17a1,1,0,0,0,0-2Zm4-7a1,1,0,0,0-1,1V19a1,1,0,0,0,2,0V5A1,1,0,0,0,21,4Z" diff --git a/src/Components/Common/Breadcrumbs.tsx b/src/Components/Common/Breadcrumbs.tsx index aaee7ac0b64..be35cf6862d 100644 --- a/src/Components/Common/Breadcrumbs.tsx +++ b/src/Components/Common/Breadcrumbs.tsx @@ -63,7 +63,7 @@ export default function Breadcrumbs({ return (
  • @@ -90,7 +90,7 @@ export default function Breadcrumbs({
  • )}
    -
    {/* flexible spacing */} -
    +
    {NavItems.map((i) => { @@ -225,18 +232,28 @@ interface ToggleShrinkProps { toggle: () => void; } -const ToggleShrink = ({ shrinked, toggle }: ToggleShrinkProps) => ( -
    - -
    -); +const ToggleShrink = ({ shrinked, toggle }: ToggleShrinkProps) => { + const { t } = useTranslation(); + return ( + + + + + + +

    {shrinked ? t("expand_sidebar") : t("collapse_sidebar")}

    +
    +
    +
    + ); +}; diff --git a/src/Components/Common/Sidebar/SidebarItem.tsx b/src/Components/Common/Sidebar/SidebarItem.tsx index eeee4284e2f..6db51bbac3a 100644 --- a/src/Components/Common/Sidebar/SidebarItem.tsx +++ b/src/Components/Common/Sidebar/SidebarItem.tsx @@ -29,9 +29,9 @@ const SidebarItemBase = forwardRef( return ( ( {t(props.text)} diff --git a/src/Components/Common/Sidebar/SidebarUserCard.tsx b/src/Components/Common/Sidebar/SidebarUserCard.tsx index 4630438ab70..825507ffb25 100644 --- a/src/Components/Common/Sidebar/SidebarUserCard.tsx +++ b/src/Components/Common/Sidebar/SidebarUserCard.tsx @@ -5,6 +5,13 @@ import CareIcon from "../../../CAREUI/icons/CareIcon"; import { formatName, formatDisplayName } from "../../../Utils/utils"; import useAuthUser, { useAuthContext } from "../../../Common/hooks/useAuthUser"; import { Avatar } from "@/Components/Common/Avatar"; +import { Button } from "@/Components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/Components/ui/dropdown-menu"; interface SidebarUserCardProps { shrinked: boolean; @@ -16,41 +23,59 @@ const SidebarUserCard: React.FC = ({ shrinked }) => { const { signOut } = useAuthContext(); return ( -
    - -
    -
    - -
    - {!shrinked && ( - - {formatName(user)} - - )} -
    - -
    -
    - - {!shrinked && ( -
    - {t("sign_out")} +
    + + +
    -
    +
    + +
    +
    + + + +
    {t("profile")}
    +
    + + +
    {t("sign_out")}
    +
    +
    +
    + + +
    ); }; diff --git a/src/Components/Facility/FacilityList.tsx b/src/Components/Facility/FacilityList.tsx index 503f0fde34d..9143ec29355 100644 --- a/src/Components/Facility/FacilityList.tsx +++ b/src/Components/Facility/FacilityList.tsx @@ -145,7 +145,7 @@ export const FacilityList = () => { return ( { if (loading) return ; return ( - +
    {notices}
    ); diff --git a/src/Components/Patient/ManagePatients.tsx b/src/Components/Patient/ManagePatients.tsx index 46dad347dd5..5259909bebe 100644 --- a/src/Components/Patient/ManagePatients.tsx +++ b/src/Components/Patient/ManagePatients.tsx @@ -786,7 +786,7 @@ export const PatientManager = () => { return (
    , + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +}; diff --git a/src/Components/ui/tooltip.tsx b/src/Components/ui/tooltip.tsx new file mode 100644 index 00000000000..be192b1fb66 --- /dev/null +++ b/src/Components/ui/tooltip.tsx @@ -0,0 +1,28 @@ +import * as React from "react"; +import * as TooltipPrimitive from "@radix-ui/react-tooltip"; + +import { cn } from "@/lib/utils"; + +const TooltipProvider = TooltipPrimitive.Provider; + +const Tooltip = TooltipPrimitive.Root; + +const TooltipTrigger = TooltipPrimitive.Trigger; + +const TooltipContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + +)); +TooltipContent.displayName = TooltipPrimitive.Content.displayName; + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }; diff --git a/src/Locale/en.json b/src/Locale/en.json index 0df3c961e10..94e9bd0f3a9 100644 --- a/src/Locale/en.json +++ b/src/Locale/en.json @@ -88,8 +88,8 @@ "state": "State", "location": "Location", "ward": "Ward", - "Notice Board": "Notice Board", - "Assets": "Assets", + "notice_board": "Notice Board", + "assets": "Assets", "Notifications": "Notifications", "Submit": "Submit", "Cancel": "Cancel", @@ -416,14 +416,10 @@ "help_entered-in-error": "The statement was entered in error and is not valid.", "search_icd11_placeholder": "Search for ICD-11 Diagnoses", "icd11_as_recommended": "As per ICD-11 recommended by WHO", - "Facilities": "Facilities", - "Patients": "Patients", - "Sample Test": "Sample Test", - "Shifting": "Shifting", - "Resource": "Resource", - "Users": "Users", - "Profile": "Profile", - "Dashboard": "Dashboard", + "patients": "Patients", + "sample_test": "Sample Test", + "resource": "Resource", + "profile": "Profile", "return_to_care": "Return to CARE", "404_message": "It appears that you have stumbled upon a page that either does not exist or has been moved to another URL. Make sure you have entered the correct link!", "error_404": "Error 404", @@ -1050,5 +1046,7 @@ "patient_details": "Patient Details", "width": "Width ({{unit}})", "length": "Length ({{unit}})", + "expand_sidebar": "Expand Sidebar", + "collapse_sidebar": "Collapse Sidebar", "linked_skills": "Linked Skills" } \ No newline at end of file From 1c1db13c63337df7e5f2585023e00cf230b2e1b9 Mon Sep 17 00:00:00 2001 From: Aditya Jindal Date: Wed, 16 Oct 2024 17:39:46 +0530 Subject: [PATCH 17/31] Fixing: Switch Blood Pressure and temperature dropdown to use TextFormField with type="number" instead of a dropdown #8644 (#8728) --- .../e2e/patient_spec/PatientLogUpdate.cy.ts | 4 +- .../pageobject/Patient/PatientLogupdate.ts | 10 +- .../Common/BloodPressureFormField.tsx | 87 ++++------ .../Common/TemperatureFormField.tsx | 155 ++++++++++-------- src/Components/Patient/DailyRounds.tsx | 24 ++- src/Locale/en.json | 6 + 6 files changed, 155 insertions(+), 131 deletions(-) diff --git a/cypress/e2e/patient_spec/PatientLogUpdate.cy.ts b/cypress/e2e/patient_spec/PatientLogUpdate.cy.ts index 7faaeed5a9f..3907784b4b7 100644 --- a/cypress/e2e/patient_spec/PatientLogUpdate.cy.ts +++ b/cypress/e2e/patient_spec/PatientLogUpdate.cy.ts @@ -302,9 +302,9 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => { patientRhythm, ]); patientLogupdate.clickUpdateDetail(); - patientLogupdate.clickClearButtonInElement("#systolic"); + patientLogupdate.clearIntoElementById("#systolic"); patientLogupdate.typeSystolic(patientModifiedSystolic); - patientLogupdate.clickClearButtonInElement("#diastolic"); + patientLogupdate.clearIntoElementById("#diastolic"); patientLogupdate.typeDiastolic(patientModifiedDiastolic); cy.submitButton("Continue"); cy.verifyNotification("Brief Update updated successfully"); diff --git a/cypress/pageobject/Patient/PatientLogupdate.ts b/cypress/pageobject/Patient/PatientLogupdate.ts index 857fe7dd972..d7b49fde05e 100644 --- a/cypress/pageobject/Patient/PatientLogupdate.ts +++ b/cypress/pageobject/Patient/PatientLogupdate.ts @@ -43,11 +43,11 @@ class PatientLogupdate { } typeSystolic(systolic: string) { - cy.typeAndSelectOption("#systolic", systolic); + cy.get("#systolic").click().type(systolic); } typeDiastolic(diastolic: string) { - cy.typeAndSelectOption("#diastolic", diastolic); + cy.get("#diastolic").click().type(diastolic); } typePulse(pulse: string) { @@ -55,7 +55,7 @@ class PatientLogupdate { } typeTemperature(temperature: string) { - cy.typeAndSelectOption("#temperature", temperature); + cy.get("#temperature").click().type(temperature); } typeRespiratory(respiratory: string) { @@ -93,8 +93,8 @@ class PatientLogupdate { cy.wait(3000); } - clickClearButtonInElement(elementId: string) { - cy.get(elementId).find("#clear-button").click(); + clearIntoElementById(elementId) { + cy.get(elementId).click().clear(); } clickVitals() { diff --git a/src/Components/Common/BloodPressureFormField.tsx b/src/Components/Common/BloodPressureFormField.tsx index e6fff756d0f..beddd34cf38 100644 --- a/src/Components/Common/BloodPressureFormField.tsx +++ b/src/Components/Common/BloodPressureFormField.tsx @@ -1,13 +1,13 @@ import { useTranslation } from "react-i18next"; import { FieldValidator } from "../Form/FieldValidators"; import FormField from "../Form/FormFields/FormField"; -import RangeAutocompleteFormField from "../Form/FormFields/RangeAutocompleteFormField"; import { FieldChangeEvent, FormFieldBaseProps, useFormFieldPropsResolver, } from "../Form/FormFields/Utils"; import { BloodPressure } from "../Patient/models"; +import TextFormField from "../Form/FormFields/TextFormField"; type Props = FormFieldBaseProps; @@ -16,12 +16,13 @@ export default function BloodPressureFormField(props: Props) { const field = useFormFieldPropsResolver(props); const map = meanArterialPressure(props.value)?.toFixed(); - const handleChange = (event: FieldChangeEvent) => { + const handleChange = (event: FieldChangeEvent) => { + const value = event.value ? parseInt(event.value, 10) : ""; const bp = { systolic: field.value?.systolic, diastolic: field.value?.diastolic, }; - bp[event.name as keyof BloodPressure] = event.value; + bp[event.name as keyof BloodPressure] = value || undefined; field.handleChange(Object.values(bp).filter(Boolean).length ? bp : null); }; @@ -32,63 +33,35 @@ export default function BloodPressureFormField(props: Props) { labelSuffix: map && MAP: {map}, }} > -
    - + - / - / +
    @@ -102,14 +75,20 @@ export const meanArterialPressure = (bp?: BloodPressure | null) => { return (2 * bp.diastolic + bp.systolic) / 3; }; -export const BloodPressureValidator: FieldValidator = (bp) => { +export const BloodPressureValidator: FieldValidator = ( + bp, + t, +) => { if (Object.values(bp).every((v) => v == null)) { return; } - if (bp.diastolic == null) { - return "Diastolic is missing. Either specify both or clear both."; + if (bp.systolic == null || bp.diastolic == null) { + return t("blood_pressure_error.missing"); + } + if (bp.systolic > 250 || bp.diastolic > 250) { + return t("blood_pressure_error.exceed"); } - if (bp.systolic == null) { - return "Systolic is missing. Either specify both or clear both."; + if (bp.systolic < bp.diastolic) { + return t("blood_pressure_error.systolic_less_than_diastolic"); } }; diff --git a/src/Components/Common/TemperatureFormField.tsx b/src/Components/Common/TemperatureFormField.tsx index 236d87826e9..7b2d7124f09 100644 --- a/src/Components/Common/TemperatureFormField.tsx +++ b/src/Components/Common/TemperatureFormField.tsx @@ -1,77 +1,100 @@ -import { useState } from "react"; -import { FormFieldBaseProps } from "../Form/FormFields/Utils"; -import RangeAutocompleteFormField from "../Form/FormFields/RangeAutocompleteFormField"; +import { useState, useEffect } from "react"; +import { FieldChangeEvent, FormFieldBaseProps } from "../Form/FormFields/Utils"; +import { fahrenheitToCelsius, celsiusToFahrenheit } from "@/Utils/utils"; import CareIcon from "../../CAREUI/icons/CareIcon"; import ButtonV2 from "./components/ButtonV2"; -import { fahrenheitToCelsius } from "../../Utils/utils"; +import TextFormField from "../Form/FormFields/TextFormField"; type TemperatureUnit = "celsius" | "fahrenheit"; -type Props = FormFieldBaseProps & { - placeholder?: string; -}; +type TemperatureFormFieldProps = FormFieldBaseProps; -export default function TemperatureFormField(props: Props) { +export default function TemperatureFormField({ + onChange, + id, + label, + error, + value, + name, +}: TemperatureFormFieldProps) { const [unit, setUnit] = useState("fahrenheit"); + const [inputValue, setInputValue] = useState(value || ""); + + useEffect(() => { + if (value) { + const initialTemperature = + unit === "celsius" + ? fahrenheitToCelsius(parseFloat(value)).toFixed(1) + : value; + setInputValue(initialTemperature); + } + }, [value, unit]); + + const handleUnitChange = () => { + setUnit(unit === "celsius" ? "fahrenheit" : "celsius"); + if (inputValue) { + const convertedValue = + unit === "celsius" + ? celsiusToFahrenheit(parseFloat(inputValue)).toFixed(1) + : fahrenheitToCelsius(parseFloat(inputValue)).toFixed(1); + setInputValue(convertedValue); + } + }; + + const handleInputChange = (e: FieldChangeEvent) => { + const newValue = e.value; + + const regex = /^-?\d*\.?\d{0,1}$/; + if (regex.test(newValue)) { + setInputValue(newValue); + } + }; + + const handleBlur = () => { + if (!inputValue) return; + const parsedValue = parseFloat(inputValue); + if (isNaN(parsedValue)) return; + + const finalValue = + unit === "celsius" + ? celsiusToFahrenheit(parsedValue).toString() + : parsedValue.toString(); + + setInputValue(finalValue); + onChange({ name, value: finalValue }); + }; return ( - , - className: "text-danger-500", - }, - { - value: 96.6, - label: "Low", - icon: , - className: "text-warning-500", - }, - { - value: 97.6, - label: "Normal", - icon: , - className: "text-primary-500", - }, - { - value: 99.6, - label: "High", - icon: , - className: "text-warning-500", - }, - { - value: 101.6, - label: "High", - icon: , - className: "text-danger-500", - }, - ]} - optionLabel={(value) => { - const val = unit === "celsius" ? fahrenheitToCelsius(value) : value; - return val.toFixed(1); - }} - labelSuffix={ - setUnit(unit === "celsius" ? "fahrenheit" : "celsius")} - > - - - } - /> +
    + + + + + +
    ); } diff --git a/src/Components/Patient/DailyRounds.tsx b/src/Components/Patient/DailyRounds.tsx index bf25d48f6bf..3e10383e78a 100644 --- a/src/Components/Patient/DailyRounds.tsx +++ b/src/Components/Patient/DailyRounds.tsx @@ -1,5 +1,4 @@ import { navigate } from "raviger"; - import dayjs from "dayjs"; import { useCallback, useEffect, useState } from "react"; import { @@ -126,7 +125,6 @@ export const DailyRounds = (props: any) => { return state; } }; - const [state, dispatch] = useAutoSaveReducer( DailyRoundsFormReducer, initialState, @@ -249,7 +247,9 @@ export const DailyRounds = (props: any) => { } return; case "bp": { - const error = state.form.bp && BloodPressureValidator(state.form.bp); + const error = + state.form.bp && BloodPressureValidator(state.form.bp, t); + if (error) { errors.bp = error; invalidForm = true; @@ -258,6 +258,23 @@ export const DailyRounds = (props: any) => { return; } + case "temperature": { + const temperatureInputValue = state.form["temperature"]; + + if ( + temperatureInputValue && + (temperatureInputValue < 95 || temperatureInputValue > 106) + ) { + errors[field] = t("out_of_range_error", { + start: "95°F (35°C)", + end: "106°F (41.1°C)", + }); + invalidForm = true; + scrollTo("temperature"); + } + return; + } + case "investigations": { for (const investigation of state.form.investigations) { if (!investigation.type?.length) { @@ -773,7 +790,6 @@ export const DailyRounds = (props: any) => { /> )} - {["NORMAL", "TELEMEDICINE", "DOCTORS_LOG"].includes( state.form.rounds_type, ) && ( diff --git a/src/Locale/en.json b/src/Locale/en.json index 94e9bd0f3a9..5f2652fa91b 100644 --- a/src/Locale/en.json +++ b/src/Locale/en.json @@ -813,6 +813,12 @@ "map_acronym": "M.A.P.", "systolic": "Systolic", "diastolic": "Diastolic", + "blood_pressure_error": { + "missing": "Field is required. Either specify both or clear both.", + "exceed": "Value cannot exceed 250 mmHg.", + "systolic_less_than_diastolic": "Systolic must be greater than diastolic." + }, + "out_of_range_error": "Value must be between {{ start }} and {{ end }}.", "pain": "Pain", "pain_chart_description": "Mark region and intensity of pain", "bradycardia": "Bradycardia", From 7491447557fdf9ab43842005b56c49a20df2f351 Mon Sep 17 00:00:00 2001 From: Jacob John Jeevan <40040905+Jacobjeevan@users.noreply.github.com> Date: Wed, 16 Oct 2024 17:40:46 +0530 Subject: [PATCH 18/31] Map mobile view fix (#8793) --- src/Components/Common/GLocationPicker.tsx | 2 +- src/Components/Facility/FacilityCreate.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Components/Common/GLocationPicker.tsx b/src/Components/Common/GLocationPicker.tsx index 0b03d2775ce..1c9c8f963b6 100644 --- a/src/Components/Common/GLocationPicker.tsx +++ b/src/Components/Common/GLocationPicker.tsx @@ -83,7 +83,7 @@ const GLocationPicker = ({ }; return ( -
    +
    { leaveFrom="opacity-100 translate-y-0" leaveTo="opacity-0 translate-y-1" > - + Date: Wed, 16 Oct 2024 17:44:44 +0530 Subject: [PATCH 19/31] Added Infinite Scrolling and Previous Item Persistence in Notifications (#8771) --- .../Notifications/NotificationsList.tsx | 54 ++++++++++++------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/Components/Notifications/NotificationsList.tsx b/src/Components/Notifications/NotificationsList.tsx index de9618809b4..30c380fe9a6 100644 --- a/src/Components/Notifications/NotificationsList.tsx +++ b/src/Components/Notifications/NotificationsList.tsx @@ -1,5 +1,5 @@ import { navigate } from "raviger"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import Spinner from "../Common/Spinner"; import { NOTIFICATION_EVENTS } from "../../Common/constants"; import { Error, Success, Warn } from "../../Utils/Notifications.js"; @@ -183,6 +183,7 @@ export default function NotificationsList({ const [isSubscribed, setIsSubscribed] = useState(""); const [isSubscribing, setIsSubscribing] = useState(false); const [showUnread, setShowUnread] = useState(false); + const observerRef = useRef(null); const { t } = useTranslation(); useEffect(() => { @@ -194,6 +195,26 @@ export default function NotificationsList({ if (open) document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [open]); + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + if (entries[0].isIntersecting && data.length < totalCount) { + setOffset((prevOffset) => prevOffset + RESULT_LIMIT); + } + }, + { threshold: 1.0 }, + ); + + if (observerRef.current) { + observer.observe(observerRef.current); + } + + return () => { + if (observerRef.current) { + observer.unobserve(observerRef.current); + } + }; + }, [data, totalCount]); useEffect(() => { let intervalId: ReturnType; if (isSubscribing) { @@ -374,7 +395,15 @@ export default function NotificationsList({ }) .then((res) => { if (res && res.data) { - setData(res.data.results); + setData((prev) => { + const newNotifications = res?.data?.results || []; + const allNotifications = + offset === 0 ? newNotifications : [...prev, ...newNotifications]; + const uniqueNotifications = Array.from( + new Set(allNotifications.map((n) => n.id)), + ).map((id) => allNotifications.find((n) => n.id === id)); + return uniqueNotifications; + }); setUnreadCount( res.data.results?.reduce( (acc: number, result: any) => acc + (result.read_at ? 0 : 1), @@ -391,7 +420,9 @@ export default function NotificationsList({ }); intialSubscriptionState(); }, [reload, open, offset, eventFilter, isSubscribed]); - + useEffect(() => { + setOffset(0); + }, [eventFilter, showUnread]); if (!offset && isLoading) { manageResults = (
    @@ -414,27 +445,12 @@ export default function NotificationsList({ setShowNotifications={setOpen} /> ))} +
    {isLoading && (
    )} - {!showUnread && - totalCount > RESULT_LIMIT && - offset < totalCount - RESULT_LIMIT && ( -
    - setOffset((prev) => prev + RESULT_LIMIT)} - > - {isLoading ? t("loading") : t("load_more")} - -
    - )} ); } else if (data && data.length === 0) { From 7e25fc6a5b7baf1156b8db8aaf394752d0c1303b Mon Sep 17 00:00:00 2001 From: Mohammed Nihal <57055998+nihal467@users.noreply.github.com> Date: Wed, 16 Oct 2024 14:24:53 +0200 Subject: [PATCH 20/31] fixed the favicon (#8803) --- public/favicon.ico | Bin 15086 -> 161630 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.ico b/public/favicon.ico index d712ea36545e74e1b50e9097c54194bf8e17a6a4..51fe5064a91773fc5c8e5001cb20f61ac00b4bca 100644 GIT binary patch literal 161630 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 literal 15086 zcmeHOTW=dh6dpTCn~UwlP8;XaII&#^=T=e@r%4m%QYvyms?<;rNL0`?5f!LFq9P>d zLxHLf`~nd0&VMNMHvny_KJgFQ7odQkI-GC4>x}K0b=GlQn{K6(SJxBaED zquToqa(CPD7CJiGs+8zLn9?7ND02^T5_GW9`L`unoQ@BU`VY7xhtFOeR*D^WE2qLn z=a1OHaFAae@oyjU)7*#p_O&>cT4LO5A9gf8xcoI^Z7I*dZGZdm!|ng-d7ahQp7s6{ zne3po&t_=tbG6KEj!+=lME<@;rF2iW7ahM~qw_~>VCe9{4IHKMAt!%MUmT>(?^d+3 zv^`FBt@`h${mviiczg$j9S3l9`K$Ak+x~93ca05qO{yEfMPod*J3MKqX8CdM0SH75~ z3pdrWaODKG#+u0&X;cbyu+jM=_Q07QCAPtdxq+jOzf>>VWUu>9bP`SGBGjjoSwaBN`Y``P@?8NY1ojF>KexBc__h}(ap`ChfZzrCrWwEoqSHh-*K zOHqB$tIZ$K!A6&Vkl%rk*GKGrJL*5ky~(q^lzJ_pl#ZbQ@!qQ*k9Dxo`6G5-e%Hs! ztou3Q@1R|Z;g(DPf8dWjuyVCWrQ?7*_8=>bTQ0o2!Y4khRsPKVI`-h1|NR=ghx^9) z0i1ydh*jqQpoZ?@0ds!YIKPoOgpxTwlj%!1hl0HHca;e^?V!KQ=Vxw!zbA7O?%&F_ zzzslgyW^ZzKg$A3_M8@<;Zpqb@L8c#{0wjN9O1VE?^_v++rTuaWw4*dS(C@iVT$kf z2bOZ>eW!7LWb8kj;$y!Ob52=GJbwc0f1KcBofhX^VrM!j_M$0#jXJwETnz@W9pU?W z8)^7_U%_51>Y&r$=<1#0^BRg4pLH(2qj$-+{n5Vzyfzga@MWcIJV;}2#0s82>Y$Tt zv95&}HqXQs-^cqY6PFTn`rVqWMS{i+6Qx5!neq| zF5CNe@hj8*$ld+Z9dvRno+BsDMJcw}Nzuh{Rt8pjD78LN&?is_oopLrU&P3d3oLWI zFrI%suTP)7da_{s;@tHq&gr@D57v7nSUrS^#kv1m(mfWU#*T)9n5cu!vO@`9#3&UXemJ{; zTxp5j92+{z4kdhTu%Sc$cl`ZPBxW&8Sr2S{1IcxjyuQQVfYXfsw7x&5&2M0ExWi(7 zk6C%?AWC2u_ibP+76d9;g>?%4uV%(tMRuJ+wQkfR-elenS^jk>4@HZ(X!@4gw}AVE zrNAHGy%TRG48gU^#`IPCcc((xxg4%5<&WWC$3QkT^;2L$%Dg5yc Z Date: Wed, 16 Oct 2024 18:00:24 +0530 Subject: [PATCH 21/31] Investigations Print Preview Page (#8679) --- .../Investigations/InvestigationTable.tsx | 198 +++++++++++------- .../InvestigationsPrintPreview.tsx | 138 ++++++++++++ .../Investigations/ShowInvestigation.tsx | 62 ++++-- .../Investigations/ViewInvestigations.tsx | 37 +++- src/Locale/en.json | 2 + src/Routers/routes/ConsultationRoutes.tsx | 10 + 6 files changed, 338 insertions(+), 109 deletions(-) create mode 100644 src/Components/Facility/Investigations/InvestigationsPrintPreview.tsx diff --git a/src/Components/Facility/Investigations/InvestigationTable.tsx b/src/Components/Facility/Investigations/InvestigationTable.tsx index 18c64108b6f..84198eea50c 100644 --- a/src/Components/Facility/Investigations/InvestigationTable.tsx +++ b/src/Components/Facility/Investigations/InvestigationTable.tsx @@ -5,8 +5,10 @@ import TextFormField from "../../Form/FormFields/TextFormField"; import { classNames } from "../../../Utils/utils"; import { useState } from "react"; import { useTranslation } from "react-i18next"; +import { navigate } from "raviger"; const TestRow = ({ data, i, onChange, showForm, value, isChanged }: any) => { + const { t } = useTranslation(); return ( { )} x-description="Even row" > - - {data?.investigation_object?.name || "---"} + +

    + {data?.investigation_object.name || "---"} +

    +

    + + {t("investigations__range")}:{" "} + {data?.investigation_object.min_value || ""} + {data?.investigation_object.min_value ? " - " : ""} + {data?.investigation_object.max_value || ""} + +

    +

    + {t("investigations__unit")}:{" "} + {data?.investigation_object.unit || "---"} +

    - + {showForm ? ( data?.investigation_object?.investigation_type === "Choice" ? ( { value || "---" )} - - {data.investigation_object.unit || "---"} - - - {data.investigation_object.min_value || "---"} - - - {data.investigation_object.max_value || "---"} - - + {data.investigation_object.ideal_value || "---"} ); }; +const HeadingRow = () => { + const { t } = useTranslation(); + const commonClass = + "px-6 py-3 text-xs font-semibold uppercase tracking-wider text-secondary-800"; + return ( + + + {t("investigations__name")} + + + {t("investigations__result")} + + + {t("investigations__ideal_value")} + + + ); +}; + export const InvestigationTable = ({ title, data, @@ -70,6 +108,10 @@ export const InvestigationTable = ({ changedFields, handleUpdateCancel, handleSave, + facilityId, + patientId, + consultationId, + sessionId, }: any) => { const { t } = useTranslation(); const [searchFilter, setSearchFilter] = useState(""); @@ -85,11 +127,9 @@ export const InvestigationTable = ({ return (
    -
    - {title && ( -
    {title}
    - )} -
    +
    + {title &&
    {title}
    } +
    handleSave()} + onClick={() => { + handleSave(); + setShowForm((prev) => !prev); + }} className="my-2 mr-2" > - Save + {t("save")} )} + + navigate( + `/facility/${facilityId}/patient/${patientId}/consultation/${consultationId}/investigation/${sessionId}/print`, + ) + } + > + + {t("print")} +
    setSearchFilter(e.value)} />
    -
    -
    - - - - {["Name", "Value", "Unit", "Min", "Max", "Ideal"].map( - (heading) => ( - - ), - )} +
    +
    - {heading} -
    + + + + + {filterTests.length > 0 ? ( + filterTests.map((t: any, i) => { + const value = + changedFields[t.id]?.notes ?? + changedFields[t.id]?.value ?? + null; + const isChanged = changedFields[t.id]?.initialValue !== value; + return ( + { + const { target, value } = + t?.investigation_object?.investigation_type === "Float" + ? { + target: `${t.id}.value`, + value: Number(e.value) || null, + } + : { + target: `${t.id}.notes`, + value: e.value, + }; + handleValueChange(value, target); + }} + /> + ); + }) + ) : ( + + - - - {filterTests.length > 0 ? ( - filterTests.map((t: any, i) => { - const value = - changedFields[t.id]?.notes ?? - changedFields[t.id]?.value ?? - null; - const isChanged = changedFields[t.id]?.initialValue !== value; - return ( - { - const { target, value } = - t?.investigation_object?.investigation_type === - "Float" - ? { - target: `${t.id}.value`, - value: Number(e.value) || null, - } - : { - target: `${t.id}.notes`, - value: e.value, - }; - handleValueChange(value, target); - }} - className="print:text-black" - /> - ); - }) - ) : ( - - - - )} - -
    {t("no_tests_taken")}
    {t("no_tests_taken")}
    -
    + )} + +
    ); diff --git a/src/Components/Facility/Investigations/InvestigationsPrintPreview.tsx b/src/Components/Facility/Investigations/InvestigationsPrintPreview.tsx new file mode 100644 index 00000000000..97a5375fa28 --- /dev/null +++ b/src/Components/Facility/Investigations/InvestigationsPrintPreview.tsx @@ -0,0 +1,138 @@ +import * as _ from "lodash-es"; +import { lazy } from "react"; +import routes from "../../../Redux/api"; +import useQuery from "../../../Utils/request/useQuery"; +import PrintPreview from "../../../CAREUI/misc/PrintPreview"; +import { useTranslation } from "react-i18next"; +const Loading = lazy(() => import("../../Common/Loading")); +import { Investigation } from "./Reports/types"; +import careConfig from "@careConfig"; + +const InvestigationEntry = ({ + investigation, +}: { + investigation: Investigation; +}) => { + const { t } = useTranslation(); + return ( + + +

    + {investigation.investigation_object.name || "---"} +

    +

    + + {t("investigations__range")}:{" "} + {investigation.investigation_object.min_value || ""} + {investigation.investigation_object.min_value ? " - " : ""} + {investigation.investigation_object.max_value || ""} + +

    +

    + {t("investigations__unit")}:{" "} + {investigation.investigation_object.unit || "---"} +

    + + + {investigation.value || "---"} + + + {investigation.investigation_object.ideal_value || "---"} + + + ); +}; + +const InvestigationsPreviewTable = ({ + investigations, +}: { + investigations?: Investigation[]; +}) => { + const { t } = useTranslation(); + if (!investigations) { + return ( + + {t("no_tests_taken")} + + ); + } + + return ( + + + + + + + + + + + {investigations.map((item) => ( + + ))} + +
    + {t("investigations")} +
    + {t("investigations__name")} + {t("investigations__result")} {t("investigations__ideal_value")}
    + ); +}; + +interface InvestigationPrintPreviewProps { + consultationId: string; + patientId: string; + sessionId: string; + facilityId: string; +} +export default function InvestigationPrintPreview( + props: InvestigationPrintPreviewProps, +) { + const { consultationId, patientId, sessionId } = props; + const { t } = useTranslation(); + const { loading: investigationLoading, data: investigations } = useQuery( + routes.getInvestigation, + { + pathParams: { + consultation_external_id: consultationId, + }, + query: { + session: sessionId, + }, + }, + ); + + const { data: patient, loading: patientLoading } = useQuery( + routes.getPatient, + { + pathParams: { id: patientId }, + }, + ); + + const { data: consultation } = useQuery(routes.getConsultation, { + pathParams: { id: consultationId }, + prefetch: !!consultationId, + }); + + if (patientLoading || investigationLoading) { + return ; + } + return ( + +
    +

    {consultation?.facility_name}

    + care logo +
    + +
    + ); +} diff --git a/src/Components/Facility/Investigations/ShowInvestigation.tsx b/src/Components/Facility/Investigations/ShowInvestigation.tsx index bc0621af7d9..85f2fb1fd7d 100644 --- a/src/Components/Facility/Investigations/ShowInvestigation.tsx +++ b/src/Components/Facility/Investigations/ShowInvestigation.tsx @@ -1,13 +1,12 @@ import * as _ from "lodash-es"; -import { navigate } from "raviger"; import { useCallback, useReducer } from "react"; import routes from "../../../Redux/api"; import * as Notification from "../../../Utils/Notifications.js"; import request from "../../../Utils/request/request"; import useQuery from "../../../Utils/request/useQuery"; import InvestigationTable from "./InvestigationTable"; -import PrintPreview from "../../../CAREUI/misc/PrintPreview"; import { useTranslation } from "react-i18next"; +import Page from "../../Common/components/Page"; import Loading from "@/Components/Common/Loading"; const initialState = { changedFields: {}, @@ -40,7 +39,7 @@ interface ShowInvestigationProps { facilityId: string; } export default function ShowInvestigation(props: ShowInvestigationProps) { - const { consultationId, patientId, sessionId } = props; + const { consultationId, patientId, sessionId, facilityId } = props; const { t } = useTranslation(); const [state, dispatch] = useReducer(updateFormReducer, initialState); const { loading: investigationLoading } = useQuery(routes.getInvestigation, { @@ -116,9 +115,28 @@ export default function ShowInvestigation(props: ShowInvestigationProps) { Notification.Success({ msg: "Investigation Updated successfully!", }); - navigate( - `/facility/${props.facilityId}/patient/${props.patientId}/consultation/${props.consultationId}`, + const changedDict: any = {}; + Object.values(state.changedFields).forEach( + (field: any) => + (changedDict[field.id] = { + id: field.id, + value: field?.value || null, + notes: field?.notes || null, + }), ); + const changedInitialValues: any = {}; + Object.values(state.initialValues).forEach( + (field: any) => + (changedInitialValues[field.id] = { + ...field, + value: changedDict[field.id].value, + notes: changedDict[field.id].notes, + }), + ); + dispatch({ + type: "set_initial_values", + initialValues: changedInitialValues, + }); } return; } else { @@ -145,22 +163,28 @@ export default function ShowInvestigation(props: ShowInvestigationProps) { return ; } return ( - - - +
    + +
    + ); } diff --git a/src/Components/Facility/Investigations/ViewInvestigations.tsx b/src/Components/Facility/Investigations/ViewInvestigations.tsx index 22c811f41fa..e889fac4c01 100644 --- a/src/Components/Facility/Investigations/ViewInvestigations.tsx +++ b/src/Components/Facility/Investigations/ViewInvestigations.tsx @@ -5,6 +5,8 @@ import { useTranslation } from "react-i18next"; import { formatDateTime } from "../../../Utils/utils"; import { InvestigationResponse } from "./Reports/types"; import { InvestigationSessionType } from "./investigationsTab"; +import ButtonV2 from "../../Common/components/ButtonV2"; +import CareIcon from "../../../CAREUI/icons/CareIcon"; import Loading from "@/Components/Common/Loading"; export default function ViewInvestigations(props: { @@ -56,16 +58,31 @@ export default function ViewInvestigations(props: {
    {formatDateTime(investigationSession.session_created_date)}
    - +
    + + navigate( + `/facility/${facilityId}/patient/${patientId}/consultation/${consultationId}/investigation/${investigationSession.session_external_id}`, + ) + } + ghost + border + > + {t("view")} + + + navigate( + `/facility/${facilityId}/patient/${patientId}/consultation/${consultationId}/investigation/${investigationSession.session_external_id}/print`, + ) + } + ghost + border + > + + {t("print")} + +
    ); })} diff --git a/src/Locale/en.json b/src/Locale/en.json index 5f2652fa91b..ceb022d1f02 100644 --- a/src/Locale/en.json +++ b/src/Locale/en.json @@ -1052,6 +1052,8 @@ "patient_details": "Patient Details", "width": "Width ({{unit}})", "length": "Length ({{unit}})", + "years": "years", + "investigation_report": "Investigation Report", "expand_sidebar": "Expand Sidebar", "collapse_sidebar": "Collapse Sidebar", "linked_skills": "Linked Skills" diff --git a/src/Routers/routes/ConsultationRoutes.tsx b/src/Routers/routes/ConsultationRoutes.tsx index 77efe1081bc..7f1a7fecfb8 100644 --- a/src/Routers/routes/ConsultationRoutes.tsx +++ b/src/Routers/routes/ConsultationRoutes.tsx @@ -12,6 +12,7 @@ import CriticalCareEditor from "../../Components/LogUpdate/CriticalCareEditor"; import PrescriptionsPrintPreview from "../../Components/Medicine/PrintPreview"; import CriticalCarePreview from "../../Components/LogUpdate/CriticalCarePreview"; import FileUploadPage from "../../Components/Patient/FileUploadPage"; +import InvestigationPrintPreview from "../../Components/Facility/Investigations/InvestigationsPrintPreview"; import { AppRoutes } from "../AppRouter"; const consultationRoutes: AppRoutes = { @@ -70,6 +71,15 @@ const consultationRoutes: AppRoutes = { sessionId={sessionId} /> ), + "/facility/:facilityId/patient/:patientId/consultation/:id/investigation/:sessionId/print": + ({ facilityId, patientId, id, sessionId }: any) => ( + + ), "/facility/:facilityId/patient/:patientId/consultation/:id/daily-rounds": ({ facilityId, patientId, From d199132c34e2a2fcffdc428ab257679043d77fa0 Mon Sep 17 00:00:00 2001 From: Shivank Kacker Date: Wed, 16 Oct 2024 18:35:14 +0530 Subject: [PATCH 22/31] Added listing of Hub Facilities in Facility Home (#8729) --- src/Components/Facility/FacilityBlock.tsx | 29 +++++++++++----- src/Components/Facility/FacilityCard.tsx | 26 +++++++++----- src/Components/Facility/FacilityHome.tsx | 41 ++++++++++++++++++----- src/Components/Facility/models.tsx | 4 +-- src/Redux/api.tsx | 6 ++++ 5 files changed, 80 insertions(+), 26 deletions(-) diff --git a/src/Components/Facility/FacilityBlock.tsx b/src/Components/Facility/FacilityBlock.tsx index 891bb4d4e59..3232321637f 100644 --- a/src/Components/Facility/FacilityBlock.tsx +++ b/src/Components/Facility/FacilityBlock.tsx @@ -1,16 +1,29 @@ import { Link } from "raviger"; import { FacilityModel } from "./models"; +import { ReactNode } from "react"; import { Avatar } from "@/Components/Common/Avatar"; -export default function FacilityBlock(props: { facility: FacilityModel }) { - const { facility } = props; +export default function FacilityBlock(props: { + facility: FacilityModel; + redirect?: boolean; +}) { + const { facility, redirect = true } = props; + + const Element = (props: { children: ReactNode; className?: string }) => + redirect ? ( + + {props.children} + + ) : ( + + ); return ( - +
    {facility.read_cover_image_url ? (
    - +
    ); } diff --git a/src/Components/Facility/FacilityCard.tsx b/src/Components/Facility/FacilityCard.tsx index f3614d2685a..69b5b9d421e 100644 --- a/src/Components/Facility/FacilityCard.tsx +++ b/src/Components/Facility/FacilityCard.tsx @@ -13,13 +13,17 @@ import { classNames } from "../../Utils/utils"; import request from "../../Utils/request/request"; import routes from "../../Redux/api"; import careConfig from "@careConfig"; +import { FacilityModel } from "./models"; import { Avatar } from "../Common/Avatar"; -export const FacilityCard = (props: { facility: any; userType: any }) => { +export const FacilityCard = (props: { + facility: FacilityModel; + userType: string; +}) => { const { facility, userType } = props; const { t } = useTranslation(); - const [notifyModalFor, setNotifyModalFor] = useState(undefined); + const [notifyModalFor, setNotifyModalFor] = useState(); const [notifyMessage, setNotifyMessage] = useState(""); const [notifyError, setNotifyError] = useState(""); @@ -61,7 +65,7 @@ export const FacilityCard = (props: { facility: any; userType: any }) => { alt={facility.name} className="h-full max-h-32 w-full object-cover" /> - )) || } + )) || }
    @@ -79,7 +83,7 @@ export const FacilityCard = (props: { facility: any; userType: any }) => { /> )) || ( @@ -117,7 +121,7 @@ export const FacilityCard = (props: { facility: any; userType: any }) => {
    {
    0.85 + (facility.patient_count || 0) / + (facility.bed_count || 0) > + 0.85 ? "button-danger-border bg-red-500" : "button-primary-border bg-primary-100" }`} @@ -185,14 +191,18 @@ export const FacilityCard = (props: { facility: any; userType: any }) => { icon="l-bed" className={classNames( "mr-2", - facility.patient_count / facility.bed_count > 0.85 + (facility.patient_count || 0) / + (facility.bed_count || 0) > + 0.85 ? "text-white" : "text-primary-600", )} />{" "}
    0.85 + (facility.patient_count || 0) / + (facility.bed_count || 0) > + 0.85 ? "text-white" : "text-secondary-700" }`} diff --git a/src/Components/Facility/FacilityHome.tsx b/src/Components/Facility/FacilityHome.tsx index 6f73fee4a54..a50b1e09390 100644 --- a/src/Components/Facility/FacilityHome.tsx +++ b/src/Components/Facility/FacilityHome.tsx @@ -75,6 +75,20 @@ export const FacilityHome = ({ facilityId }: Props) => { }, }); + const spokesQuery = useQuery(routes.getFacilitySpokes, { + pathParams: { + id: facilityId, + }, + silent: true, + }); + + const hubsQuery = useQuery(routes.getFacilityHubs, { + pathParams: { + id: facilityId, + }, + silent: true, + }); + const handleDeleteClose = () => { setOpenDeleteDialog(false); }; @@ -93,13 +107,6 @@ export const FacilityHome = ({ facilityId }: Props) => { }); }; - const spokesQuery = useQuery(routes.getFacilitySpokes, { - pathParams: { - id: facilityId, - }, - silent: true, - }); - if (isLoading) { return ; } @@ -274,7 +281,7 @@ export const FacilityHome = ({ facilityId }: Props) => { />
    - {!!spokesQuery.data?.results.length && ( + {!!spokesQuery.data?.results?.length && (

    @@ -291,6 +298,24 @@ export const FacilityHome = ({ facilityId }: Props) => {

    )} + + {!!hubsQuery.data?.results?.length && ( +
    +
    +

    + {t("hubs")} +

    +
    + {hubsQuery.data.results.map((hub) => ( + + ))} +
    +
    +
    + )}
    diff --git a/src/Components/Facility/models.tsx b/src/Components/Facility/models.tsx index 8103ebb6729..1be0472c1c3 100644 --- a/src/Components/Facility/models.tsx +++ b/src/Components/Facility/models.tsx @@ -87,8 +87,8 @@ export interface FacilityModel { latitude?: string; longitude?: string; kasp_empanelled?: boolean; - patient_count?: string; - bed_count?: string; + patient_count?: number; + bed_count?: number; } export enum SpokeRelationship { diff --git a/src/Redux/api.tsx b/src/Redux/api.tsx index f1130345f46..ea728d7f53c 100644 --- a/src/Redux/api.tsx +++ b/src/Redux/api.tsx @@ -387,6 +387,12 @@ const routes = { TBody: Type>(), }, + getFacilityHubs: { + path: "/api/v1/facility/{id}/hubs", + method: "GET", + TRes: Type>(), + }, + getFacilitySpokes: { path: "/api/v1/facility/{id}/spokes/", method: "GET", From 5455e97d273c3feee8440a7b1109510234dd2cb6 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Wed, 16 Oct 2024 18:42:55 +0530 Subject: [PATCH 23/31] Adds support for sorting locale file keys in pre-commit (#8806) --- package.json | 8 +- scripts/sort-locales.js | 26 + src/Locale/en.json | 1992 +++++++++++++++++++-------------------- src/Locale/hi.json | 1512 ++++++++++++++--------------- src/Locale/kn.json | 1512 ++++++++++++++--------------- src/Locale/ml.json | 1512 ++++++++++++++--------------- src/Locale/mr.json | 106 +-- src/Locale/ta.json | 1512 ++++++++++++++--------------- 8 files changed, 4105 insertions(+), 4075 deletions(-) create mode 100644 scripts/sort-locales.js diff --git a/package.json b/package.json index 4c57b3e0ee1..57d0c3d3405 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,8 @@ "prepare": "husky install", "lint": "eslint ./src", "lint-fix": "eslint ./src --fix", - "format": "prettier ./src --write" + "format": "prettier ./src --write", + "sort-locales": "node ./scripts/sort-locales.js" }, "dependencies": { "@fontsource/figtree": "^5.1.0", @@ -163,10 +164,13 @@ "prettier --write --ignore-unknown --plugin prettier-plugin-tailwindcss", "eslint --fix", "git update-index --again" + ], + "src/Locale/*.json": [ + "npm run sort-locales" ] }, "engines": { "node": ">=20.12.0" }, "packageManager": "npm@10.5.0" -} +} \ No newline at end of file diff --git a/scripts/sort-locales.js b/scripts/sort-locales.js new file mode 100644 index 00000000000..cf365a41d09 --- /dev/null +++ b/scripts/sort-locales.js @@ -0,0 +1,26 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const fs = require("fs"); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const path = require("path"); + +const directory = "src/Locale"; + +fs.readdir(directory, (err, files) => { + if (err) throw err; + + files.forEach((file) => { + if (file.endsWith(".json")) { + const filePath = path.join(directory, file); + const data = JSON.parse(fs.readFileSync(filePath, "utf8")); + + const sortedData = Object.keys(data) + .sort() + .reduce((acc, key) => { + acc[key] = data[key]; + return acc; + }, {}); + + fs.writeFileSync(filePath, JSON.stringify(sortedData, null, 2) + "\n"); + } + }); +}); diff --git a/src/Locale/en.json b/src/Locale/en.json index ceb022d1f02..a7c2d1a0c21 100644 --- a/src/Locale/en.json +++ b/src/Locale/en.json @@ -1,1060 +1,1060 @@ { - "create_asset": "Create Asset", - "edit_history": "Edit History", - "update_record_for_asset": "Update record for asset", - "edited_on": "Edited On", - "edited_by": "Edited By", - "serviced_on": "Serviced On", - "notes": "Notes", - "back": "Back", - "close": "Close", - "update_asset_service_record": "Update Asset Service Record", - "eg_details_on_functionality_service_etc": "Eg. Details on functionality, service, etc.", - "updating": "Updating", - "update": "Update", - "are_you_still_watching": "Are you still watching?", - "stream_stop_due_to_inativity": "The live feed will stop streaming due to inactivity", - "stream_stopped_due_to_inativity": "The live feed has stopped streaming due to inactivity", - "continue_watching": "Continue watching", - "resume": "Resume", - "username": "Username", - "password": "Password", - "new_password": "New Password", - "confirm_password": "Confirm Password", - "first_name": "First Name", - "last_name": "Last Name", - "email": "Email Address", - "phone_number": "Phone Number", - "whatsapp_number": "Whatsapp Number", - "district": "District", - "gender": "Gender", - "age": "Age", - "login": "Login", - "password_mismatch": "Password and confirm password must be same.", - "enter_valid_age": "Please Enter Valid Age", - "invalid_username": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", - "invalid_password": "Password doesn't meet the requirements", - "invalid_email": "Please Enter a Valid Email Address", - "invalid_phone": "Please enter valid phone number", - "register_hospital": "Register Hospital", - "register_page_title": "Register As Hospital Administrator", - "auth_login_title": "Authorized Login", - "forget_password": "Forgot password?", - "forget_password_instruction": "Enter your username, and if it exists, we will send you a link to reset your password.", - "send_reset_link": "Send Reset Link", - "already_a_member": "Already a member?", - "password_sent": "Password Reset Email Sent", - "password_reset_success": "Password Reset successfully", - "password_reset_failure": "Password Reset Failed", - "reset_password": "Reset Password", - "available_in": "Available in", - "sign_out": "Sign Out", - "back_to_login": "Back to login", - "min_password_len_8": "Minimum password length 8", - "req_atleast_one_digit": "Require at least one digit", - "req_atleast_one_uppercase": "Require at least one upper case", - "req_atleast_one_lowercase": "Require at least one lower case letter", - "req_atleast_one_symbol": "Require at least one symbol", - "bed_search_placeholder": "Search by beds name", + "404_message": "It appears that you have stumbled upon a page that either does not exist or has been moved to another URL. Make sure you have entered the correct link!", + "APPETITE__CANNOT_BE_ASSESSED": "Cannot be assessed", + "APPETITE__INCREASED": "Increased", + "APPETITE__NO_TASTE_FOR_FOOD": "No taste for food", + "APPETITE__REDUCED": "Reduced", + "APPETITE__SATISFACTORY": "Satisfactory", + "AUTOMATED": "Automated", "BED_WITH_OXYGEN_SUPPORT": "Bed with Oxygen Support", - "REGULAR": "Regular", + "BLADDER_DRAINAGE__CONDOM_CATHETER": "Condom Catheter", + "BLADDER_DRAINAGE__CONTINUOUS_INDWELLING_CATHETER": "Continuous Indwelling Catheter", + "BLADDER_DRAINAGE__CONTINUOUS_SUPRAPUBIC_CATHETER": "Continuous Suprapubic Catheter", + "BLADDER_DRAINAGE__DIAPER": "Diaper", + "BLADDER_DRAINAGE__INTERMITTENT_CATHETER": "Intermittent Catheter", + "BLADDER_DRAINAGE__NORMAL": "Normal", + "BLADDER_DRAINAGE__UROSTOMY": "Urostomy", + "BLADDER_ISSUE__HESITANCY": "Hesitancy", + "BLADDER_ISSUE__INCONTINENCE": "Incontinence", + "BLADDER_ISSUE__NO_ISSUES": "No issues", + "BLADDER_ISSUE__RETENTION": "Retention", + "BOWEL_ISSUE__CONSTIPATION": "Constipation", + "BOWEL_ISSUE__DIARRHOEA": "Diarrhoea", + "BOWEL_ISSUE__NO_DIFFICULTY": "No difficulty", + "CONSCIOUSNESS_LEVEL__AGITATED_OR_CONFUSED": "Agitated or Confused", + "CONSCIOUSNESS_LEVEL__ALERT": "Alert", + "CONSCIOUSNESS_LEVEL__ONSET_OF_AGITATION_AND_CONFUSION": "Onset of Agitation and Confusion", + "CONSCIOUSNESS_LEVEL__RESPONDS_TO_PAIN": "Responds to Pain", + "CONSCIOUSNESS_LEVEL__RESPONDS_TO_VOICE": "Responds to Voice", + "CONSCIOUSNESS_LEVEL__UNRESPONSIVE": "Unresponsive", + "CONSULTATION_TAB__ABDM": "ABDM Records", + "CONSULTATION_TAB__ABG": "ABG", + "CONSULTATION_TAB__DIALYSIS": "Dialysis", + "CONSULTATION_TAB__FEED": "Feed", + "CONSULTATION_TAB__FILES": "Files", + "CONSULTATION_TAB__INVESTIGATIONS": "Investigations", + "CONSULTATION_TAB__MEDICINES": "Medicines", + "CONSULTATION_TAB__NEUROLOGICAL_MONITORING": "Neuro", + "CONSULTATION_TAB__NURSING": "Nursing", + "CONSULTATION_TAB__NUTRITION": "Nutrition", + "CONSULTATION_TAB__PRESSURE_SORE": "Pressure Sore", + "CONSULTATION_TAB__SUMMARY": "Vitals", + "CONSULTATION_TAB__UPDATES": "Overview", + "CONSULTATION_TAB__VENTILATOR": "Ventilation", + "Cancel": "Cancel", + "DD/MM/YYYY": "DD/MM/YYYY", + "DOCTORS_LOG": "Progress Note", + "DOMESTIC_HEALTHCARE_SUPPORT__FAMILY_MEMBER": "Family member", + "DOMESTIC_HEALTHCARE_SUPPORT__NO_SUPPORT": "No support", + "DOMESTIC_HEALTHCARE_SUPPORT__PAID_CAREGIVER": "Paid caregiver", + "GENDER__1": "Male", + "GENDER__2": "Female", + "GENDER__3": "Non-binary", + "HEARTBEAT_RHYTHM__IRREGULAR": "Irregular", + "HEARTBEAT_RHYTHM__REGULAR": "Regular", + "HEARTBEAT_RHYTHM__UNKNOWN": "Unknown", "ICU": "ICU", + "INSULIN_INTAKE_FREQUENCY__BD": "Twice a day (BD)", + "INSULIN_INTAKE_FREQUENCY__OD": "Once a day (OD)", + "INSULIN_INTAKE_FREQUENCY__TD": "Thrice a day (TD)", + "INSULIN_INTAKE_FREQUENCY__UNKNOWN": "Unknown", "ISOLATION": "Isolation", - "add_beds": "Add Bed(s)", - "update_bed": "Update Bed", - "bed_type": "Bed Type", - "make_multiple_beds_label": "Do you want to make multiple beds?", - "number_of_beds": "Number of beds", - "number_of_beds_out_of_range_error": "Number of beds cannot be greater than 100", - "bed_created_notification_one": "{{count}} Bed created successfully", - "bed_created_notification_other": "{{count}} Beds created successfully", - "goal": "Our goal is to continuously improve the quality and accessibility of public healthcare services using digital tools.", - "something_wrong": "Something went wrong! Try again later!", - "try_again_later": "Try again later!", - "contribute_github": "Contribute on Github", - "footer_body": "Open Healthcare Network is an open-source public utility designed by a multi-disciplinary team of innovators and volunteers. Open Healthcare Network CARE is a Digital Public Good recognised by the United Nations.", - "reset": "Reset", - "download": "Download", - "downloads": "Downloads", - "downloading": "Downloading", - "generating": "Generating", - "send_email": "Send Email", - "email_address": "Email Address", - "email_success": "We will be sending an email shortly. Please check your inbox.", - "disclaimer": "Disclaimer", - "category": "Category", - "sub_category": "Sub Category", - "download_type": "Download Type", - "state": "State", - "location": "Location", - "ward": "Ward", - "notice_board": "Notice Board", - "assets": "Assets", + "KASP Empanelled": "KASP Empanelled", + "LIMB_RESPONSE__EXTENSION": "Extension", + "LIMB_RESPONSE__FLEXION": "Flexion", + "LIMB_RESPONSE__MODERATE": "Moderate", + "LIMB_RESPONSE__NONE": "None", + "LIMB_RESPONSE__STRONG": "Strong", + "LIMB_RESPONSE__UNKNOWN": "Unknown", + "LIMB_RESPONSE__WEAK": "Weak", + "LOG_UPDATE_CREATED_NOTIFICATION": "{{ roundType }} created successfully", + "LOG_UPDATE_FIELD_LABEL__action": "Action", + "LOG_UPDATE_FIELD_LABEL__appetite": "Appetite", + "LOG_UPDATE_FIELD_LABEL__bladder_drainage": "Drainage", + "LOG_UPDATE_FIELD_LABEL__bladder_issue": "Issues", + "LOG_UPDATE_FIELD_LABEL__blood_sugar_level": "Blood Sugar Level", + "LOG_UPDATE_FIELD_LABEL__bowel_issue": "Bowel", + "LOG_UPDATE_FIELD_LABEL__bp": "Blood Pressure", + "LOG_UPDATE_FIELD_LABEL__consciousness_level": "Level of Consciousness", + "LOG_UPDATE_FIELD_LABEL__is_experiencing_dysuria": "Experiences Dysuria?", + "LOG_UPDATE_FIELD_LABEL__nutrition_route": "Nutrition Route", + "LOG_UPDATE_FIELD_LABEL__oral_issue": "Oral issues", + "LOG_UPDATE_FIELD_LABEL__other_details": "Other details", + "LOG_UPDATE_FIELD_LABEL__patient_category": "Category", + "LOG_UPDATE_FIELD_LABEL__physical_examination_info": "Physical Examination Info", + "LOG_UPDATE_FIELD_LABEL__pulse": "Pulse", + "LOG_UPDATE_FIELD_LABEL__resp": "Respiratory Rate", + "LOG_UPDATE_FIELD_LABEL__review_interval": "Review after", + "LOG_UPDATE_FIELD_LABEL__rhythm": "Heartbeat Rhythm", + "LOG_UPDATE_FIELD_LABEL__rhythm_detail": "Rhythm Description", + "LOG_UPDATE_FIELD_LABEL__rounds_type": "Rounds Type", + "LOG_UPDATE_FIELD_LABEL__sleep": "Sleep", + "LOG_UPDATE_FIELD_LABEL__temperature": "Temperature", + "LOG_UPDATE_FIELD_LABEL__urination_frequency": "Frequency of Urination", + "LOG_UPDATE_FIELD_LABEL__ventilator_spo2": "SpO₂", + "LOG_UPDATE_UPDATED_NOTIFICATION": "{{ roundType }} updated successfully", + "NORMAL": "Brief Update", + "NURSING_CARE_PROCEDURE__ascitic_tapping": "Ascitic Tapping", + "NURSING_CARE_PROCEDURE__bed_bath": "Bed Bath", + "NURSING_CARE_PROCEDURE__catheter_care": "Catheter Care", + "NURSING_CARE_PROCEDURE__catheter_change": "Catheter Change", + "NURSING_CARE_PROCEDURE__chest_tube_care": "Chest Tube Care", + "NURSING_CARE_PROCEDURE__colostomy_care": "Colostomy Care", + "NURSING_CARE_PROCEDURE__colostomy_change": "Colostomy Change", + "NURSING_CARE_PROCEDURE__dressing": "Dressing", + "NURSING_CARE_PROCEDURE__dvt_pump_stocking": "DVT Pump Stocking", + "NURSING_CARE_PROCEDURE__eye_care": "Eye Care", + "NURSING_CARE_PROCEDURE__hair_care": "Hair Care", + "NURSING_CARE_PROCEDURE__iv_sitecare": "IV Site Care", + "NURSING_CARE_PROCEDURE__lymphedema_care": "Lymphedema Care", + "NURSING_CARE_PROCEDURE__nubulisation": "Nubulisation", + "NURSING_CARE_PROCEDURE__oral_care": "Oral Care", + "NURSING_CARE_PROCEDURE__perineal_care": "Perineal Care", + "NURSING_CARE_PROCEDURE__personal_hygiene": "Other Personal Hygiene", + "NURSING_CARE_PROCEDURE__positioning": "Positioning", + "NURSING_CARE_PROCEDURE__pre_enema": "P.R.E. Enema", + "NURSING_CARE_PROCEDURE__restrain": "Restrain", + "NURSING_CARE_PROCEDURE__ryles_tube_care": "Ryle’s Tube Care", + "NURSING_CARE_PROCEDURE__ryles_tube_change": "Ryle’s Tube Change", + "NURSING_CARE_PROCEDURE__skin_care": "Skin Care", + "NURSING_CARE_PROCEDURE__stoma_care": "Stoma Care", + "NURSING_CARE_PROCEDURE__suctioning": "Suctioning", + "NURSING_CARE_PROCEDURE__tracheostomy_care": "Tracheostomy Care", + "NURSING_CARE_PROCEDURE__tracheostomy_tube_change": "Tracheostomy Tube Change", + "NURSING_CARE_PROCEDURE__wound_dressing": "Wound Dressing", + "NUTRITION_ROUTE__GASTROSTOMY_OR_JEJUNOSTOMY": "Gastrostomy / Jejunostomy", + "NUTRITION_ROUTE__ORAL": "Oral", + "NUTRITION_ROUTE__PARENTERAL_TUBING_FLUID": "Parenteral Tubing (Fluid)", + "NUTRITION_ROUTE__PARENTERAL_TUBING_TPN": "Parenteral Tubing (TPN)", + "NUTRITION_ROUTE__PEG": "PEG", + "NUTRITION_ROUTE__RYLES_TUBE": "Ryle's Tube", "Notifications": "Notifications", - "Submit": "Submit", - "Cancel": "Cancel", - "powered_by": "Powered By", - "care": "CARE", - "something_went_wrong": "Something went wrong..!", - "stop": "Stop", - "record": "Record Audio", - "recording": "Recording", - "yes": "Yes", - "no": "No", - "status": "Status", - "created": "Created", - "modified": "Modified", - "updated": "Updated", - "configure": "Configure", - "assigned_to": "Assigned to", - "cancel": "Cancel", - "clear": "Clear", - "apply": "Apply", - "filter_by": "Filter By", - "filter": "Filter", - "settings_and_filters": "Settings and Filters", - "ordering": "Ordering", - "international_mobile": "International Mobile", - "indian_mobile": "Indian Mobile", - "mobile": "Mobile", - "landline": "Indian landline", - "support": "Support", - "emergency_contact_number": "Emergency Contact Number", - "last_modified": "Last Modified", - "patient_address": "Patient Address", - "all_details": "All Details", - "confirm": "Confirm", - "refresh_list": "Refresh List", - "last_edited": "Last Edited", - "audit_log": "Audit Log", - "comments": "Comments", - "contact_person_number": "Contact person number", - "referral_letter": "Referral Letter", - "print": "Print", - "print_referral_letter": "Print Referral Letter", - "date_of_positive_covid_19_swab": "Date of Positive Covid 19 Swab", - "patient_no": "OP/IP No", - "date_of_admission": "Date of Admission", - "unique_id": "Unique Id", - "date_and_time": "Date and Time", - "facility_type": "Facility Type", - "number_of_chronic_diseased_dependents": "Number Of Chronic Diseased Dependents", - "number_of_aged_dependents_above_60": "Number Of Aged Dependents (Above 60)", - "ongoing_medications": "Ongoing Medications", - "countries_travelled": "Countries travelled", - "travel_within_last_28_days": "Domestic/international Travel (within last 28 days)", - "estimated_contact_date": "Estimated contact date", - "blood_group": "Blood Group", - "date_of_birth": "Date of birth", - "date_of_test": "Date of sample collection for Covid testing", - "srf_id": "SRF ID", - "contact_number": "Contact Number", - "diagnosis": "Diagnosis", - "copied_to_clipboard": "Copied to clipboard", - "is": "Is", - "reason": "Reason", - "description": "Description", - "name": "Name", - "address": "Address", - "phone": "Phone", - "nationality": "Nationality", - "allergies": "Allergies", - "type_your_comment": "Type your comment", - "any_other_comments": "Any other comments", - "loading": "Loading...", - "facility": "Facility", - "local_body": "Local body", - "filters": "Filters", - "unknown": "Unknown", + "ORAL_ISSUE__DYSPHAGIA": "Dysphagia", + "ORAL_ISSUE__NO_ISSUE": "No issues", + "ORAL_ISSUE__ODYNOPHAGIA": "Odynophagia", + "OXYGEN_MODALITY__HIGH_FLOW_NASAL_CANNULA": "High Flow Nasal Cannula", + "OXYGEN_MODALITY__NASAL_PRONGS": "Nasal Prongs", + "OXYGEN_MODALITY__NON_REBREATHING_MASK": "Non Rebreathing Mask", + "OXYGEN_MODALITY__SIMPLE_FACE_MASK": "Simple Face Mask", + "PRESCRIPTION_FREQUENCY_BD": "Twice daily", + "PRESCRIPTION_FREQUENCY_HS": "Night only", + "PRESCRIPTION_FREQUENCY_OD": "Once daily", + "PRESCRIPTION_FREQUENCY_Q4H": "4th hourly", + "PRESCRIPTION_FREQUENCY_QID": "6th hourly", + "PRESCRIPTION_FREQUENCY_QOD": "Alternate day", + "PRESCRIPTION_FREQUENCY_QWK": "Once a week", + "PRESCRIPTION_FREQUENCY_STAT": "Imediately", + "PRESCRIPTION_FREQUENCY_TID": "8th hourly", + "PRESCRIPTION_ROUTE_IM": "IM", + "PRESCRIPTION_ROUTE_INHALATION": "Inhalation", + "PRESCRIPTION_ROUTE_INTRATHECAL": "intrathecal injection", + "PRESCRIPTION_ROUTE_IV": "IV", + "PRESCRIPTION_ROUTE_NASOGASTRIC": "Nasogastric / Gastrostomy tube", + "PRESCRIPTION_ROUTE_ORAL": "Oral", + "PRESCRIPTION_ROUTE_RECTAL": "Rectal", + "PRESCRIPTION_ROUTE_SC": "S/C", + "PRESCRIPTION_ROUTE_SUBLINGUAL": "Sublingual", + "PRESCRIPTION_ROUTE_TRANSDERMAL": "Transdermal", + "PUPIL_REACTION__BRISK": "Brisk", + "PUPIL_REACTION__CANNOT_BE_ASSESSED": "Cannot be assessed", + "PUPIL_REACTION__FIXED": "Fixed", + "PUPIL_REACTION__SLUGGISH": "Sluggish", + "PUPIL_REACTION__UNKNOWN": "Unknown", + "REGULAR": "Regular", + "RESPIRATORY_SUPPORT_SHORT__INVASIVE": "IV", + "RESPIRATORY_SUPPORT_SHORT__NON_INVASIVE": "NIV", + "RESPIRATORY_SUPPORT_SHORT__OXYGEN_SUPPORT": "O₂ Support", + "RESPIRATORY_SUPPORT_SHORT__UNKNOWN": "None", + "RESPIRATORY_SUPPORT__INVASIVE": "Invasive ventilator (IV)", + "RESPIRATORY_SUPPORT__NON_INVASIVE": "Non-Invasive ventilator (NIV)", + "RESPIRATORY_SUPPORT__OXYGEN_SUPPORT": "Oxygen Support", + "RESPIRATORY_SUPPORT__UNKNOWN": "None", + "ROUNDS_TYPE__AUTOMATED": "Virtual Nursing Assistant", + "ROUNDS_TYPE__COMMUNITY_NURSES_LOG": "Community Nurse's Log", + "ROUNDS_TYPE__DOCTORS_LOG": "Progress Note", + "ROUNDS_TYPE__NORMAL": "Brief Update", + "ROUNDS_TYPE__TELEMEDICINE": "Tele-medicine Log", + "ROUNDS_TYPE__VENTILATOR": "Detailed Update", + "SLEEP__EXCESSIVE": "Excessive", + "SLEEP__NO_SLEEP": "No sleep", + "SLEEP__SATISFACTORY": "Satisfactory", + "SLEEP__UNSATISFACTORY": "Unsatisfactory", + "SOCIOECONOMIC_STATUS__MIDDLE_CLASS": "Middle Class", + "SOCIOECONOMIC_STATUS__POOR": "Poor", + "SOCIOECONOMIC_STATUS__VERY_POOR": "Very Poor", + "SOCIOECONOMIC_STATUS__WELL_OFF": "Well Off", + "SORT_OPTIONS__-bed__name": "Bed No. N-1", + "SORT_OPTIONS__-category_severity": "Highest Severity category first", + "SORT_OPTIONS__-created_date": "Latest created date first", + "SORT_OPTIONS__-modified_date": "Latest updated date first", + "SORT_OPTIONS__-name": "Patient name Z-A", + "SORT_OPTIONS__-review_time": "Latest review date first", + "SORT_OPTIONS__-taken_at": "Latest taken date first", + "SORT_OPTIONS__bed__name": "Bed No. 1-N", + "SORT_OPTIONS__category_severity": "Lowest Severity category first", + "SORT_OPTIONS__created_date": "Oldest created date first", + "SORT_OPTIONS__facility__name,-last_consultation__current_bed__bed__name": "Bed No. N-1", + "SORT_OPTIONS__facility__name,last_consultation__current_bed__bed__name": "Bed No. 1-N", + "SORT_OPTIONS__modified_date": "Oldest updated date first", + "SORT_OPTIONS__name": "Patient name A-Z", + "SORT_OPTIONS__review_time": "Oldest review date first", + "SORT_OPTIONS__taken_at": "Oldest taken date first", + "Submit": "Submit", + "TELEMEDICINE": "Telemedicine", + "URINATION_FREQUENCY__DECREASED": "Decreased", + "URINATION_FREQUENCY__INCREASED": "Increased", + "URINATION_FREQUENCY__NORMAL": "Normal", + "VENTILATOR": "Detailed Update", + "VENTILATOR_MODE__CMV": "Control Mechanical Ventilation (CMV)", + "VENTILATOR_MODE__PCV": "Pressure Control Ventilation (PCV)", + "VENTILATOR_MODE__PC_SIMV": "Pressure Controlled SIMV (PC-SIMV)", + "VENTILATOR_MODE__PSV": "C-PAP / Pressure Support Ventilation (PSV)", + "VENTILATOR_MODE__SIMV": "Synchronised Intermittent Mandatory Ventilation (SIMV)", + "VENTILATOR_MODE__VCV": "Volume Control Ventilation (VCV)", + "VENTILATOR_MODE__VC_SIMV": "Volume Controlled SIMV (VC-SIMV)", + "View Facility": "View Facility", + "abha_number_linked_successfully": "ABHA number linked successfully", + "access_level": "Access Level", + "action_irreversible": "This action is irreversible", "active": "Active", - "completed": "Completed", - "on": "On", - "open": "Open", - "features": "Features", - "pincode": "Pincode", - "required": "Required", - "field_required": "This field is required", - "litres": "Litres", - "litres_per_day": "Litres/day", - "invalid_pincode": "Invalid Pincode", - "invalid_phone_number": "Invalid Phone Number", - "latitude_invalid": "Latitude must be between -90 and 90", - "longitude_invalid": "Longitude must be between -180 and 180", - "save": "Save", - "continue": "Continue", - "save_and_continue": "Save and Continue", - "select": "Select", - "lsg": "Lsg", - "delete": "Delete", - "remove": "Remove", - "max_size_for_image_uploaded_should_be": "Max size for image uploaded should be", - "allowed_formats_are": "Allowed formats are", - "recommended_aspect_ratio_for": "Recommended aspect ratio for", - "drag_drop_image_to_upload": "Drag & drop image to upload", - "upload_an_image": "Upload an image", - "upload": "Upload", - "uploading": "Uploading", - "switch": "Switch", - "capture": "Capture", - "retake": "Retake", - "submit": "Submit", - "camera": "Camera", - "camera_permission_denied": "Camera Permission denied", - "submitting": "Submitting", - "view_details": "View Details", - "type_to_search": "Type to search", - "show_all": "Show all", - "hide": "Hide", - "select_skills": "Select and add some skills", - "contact_your_admin_to_add_skills": "Contact your admin to add skills", + "active_prescriptions": "Active Prescriptions", "add": "Add", "add_as": "Add as", - "sort_by": "Sort By", - "none": "None", - "choose_file": "Upload From Device", - "open_camera": "Open Camera", - "file_preview": "File Preview", - "file_preview_not_supported": "Can't preview this file. Try downloading it.", - "view_faciliy": "View Facility", - "view_patients": "View Patients", - "frequency": "Frequency", - "days": "Days", - "never": "never", + "add_attachments": "Add Attachments", + "add_beds": "Add Bed(s)", + "add_details_of_patient": "Add Details of Patient", + "add_location": "Add Location", + "add_new_user": "Add New User", "add_notes": "Add notes", - "notes_placeholder": "Type your Notes", - "optional": "Optional", - "discontinue": "Discontinue", - "discontinued": "Discontinued", - "not_specified": "Not Specified", - "all_changes_have_been_saved": "All changes have been saved", - "no_data_found": "No data found", - "other_details": "Other details", - "no_remarks": "No remarks", - "edit": "Edit", - "clear_selection": "Clear selection", - "select_date": "Select date", - "DD/MM/YYYY": "DD/MM/YYYY", - "clear_all_filters": "Clear All Filters", - "summary": "Summary", - "report": "Report", - "treating_doctor": "Treating Doctor", - "hubs": "Hub Facilities", - "spokes": "Spoke Facilities", + "add_policy": "Add Insurance Policy", + "add_prescription_medication": "Add Prescription Medication", + "add_prescription_to_consultation_note": "Add a new prescription to this consultation.", + "add_prn_prescription": "Add PRN Prescription", + "add_remarks": "Add remarks", "add_spoke": "Add Spoke Facility", - "ration_card__NO_CARD": "Non-card holder", - "ration_card__BPL": "BPL", - "ration_card__APL": "APL", - "empty_date_time": "--:-- --; --/--/----", - "caution": "Caution", - "feed_optimal_experience_for_phones": "For optimal viewing experience, consider rotating your device.", - "feed_optimal_experience_for_apple_phones": "For optimal viewing experience, consider rotating your device. Ensure auto-rotate is enabled in your device settings.", - "action_irreversible": "This action is irreversible", - "send_message": "Send Message", - "enter_message": "Start typing...", - "see_attachments": "See Attachments", - "no_attachments_found": "This communication has no attachments.", - "fetching": "Fetching", - "GENDER__1": "Male", - "GENDER__2": "Female", - "GENDER__3": "Non-binary", - "normal": "Normal", - "done": "Done", - "view": "View", - "rename": "Rename", - "more_info": "More Info", + "address": "Address", + "administer": "Administer", + "administer_medicine": "Administer Medicine", + "administer_medicines": "Administer Medicines", + "administer_selected_medicines": "Administer Selected Medicines", + "administered_on": "Administered on", + "administration_dosage_range_error": "Dosage should be between start and target dosage", + "administration_notes": "Administration Notes", + "advanced_filters": "Advanced Filters", + "age": "Age", + "all_changes_have_been_saved": "All changes have been saved", + "all_details": "All Details", + "allergies": "Allergies", + "allowed_formats_are": "Allowed formats are", + "already_a_member": "Already a member?", + "ambulance_driver_name": "Name of ambulance driver", + "ambulance_number": "Ambulance No", + "ambulance_phone_number": "Phone number of Ambulance", + "antenatal": "Antenatal", + "any_other_comments": "Any other comments", + "apply": "Apply", + "approved_by_district_covid_control_room": "Approved by District COVID Control Room", + "approving_facility": "Name of Approving Facility", "archive": "Archive", - "discard": "Discard", - "live": "Live", - "discharged": "Discharged", "archived": "Archived", - "created_on": "Created On", - "no_changes_made": "No changes made", - "user_deleted_successfuly": "User Deleted Successfuly", - "users": "Users", + "are_non_editable_fields": "are non-editable fields", + "are_you_still_watching": "Are you still watching?", "are_you_sure_want_to_delete": "Are you sure you want to delete {{name}}?", - "oxygen_information": "Oxygen Information", - "deleted_successfully": "{{name}} deleted successfully", - "delete_item": "Delete {{name}}", - "unsupported_browser": "Unsupported Browser", - "unsupported_browser_description": "Your browser ({{name}} version {{version}}) is not supported. Please update your browser to the latest version or switch to a supported browser for the best experience.", - "add_remarks": "Add remarks", - "middleware_hostname": "Middleware Hostname", - "local_ipaddress": "Local IP Address", - "personal_information": "Personal Information", - "are_non_editable_fields": "are non-editable fields", - "edit_user_profile": "Edit Profile", - "skills": "Skills", - "access_level": "Access Level", - "qualification": "Qualification", - "years_of_experience": "Years of Experience", - "years_of_experience_of_the_doctor": "Years of Experience of the Doctor", - "medical_council_registration": "Medical Council Registration", - "doctor_s_medical_council_registration": "Doctor's Medical Council Registration", - "video_conference_link": "Video Conference Link", - "new_password_confirmation": "Confirm New Password", - "current_password": "Current Password", + "are_you_sure_want_to_delete_this_record": "Are you sure want to delete this record?", + "asset_class": "Asset Class", + "asset_location": "Asset Location", + "asset_name": "Asset Name", + "asset_not_found_msg": "Oops! The asset you are looking for does not exist. Please check the asset id.", + "asset_qr_id": "Asset QR ID", + "asset_type": "Asset Type", + "assets": "Assets", + "assigned_facility": "Facility assigned", + "assigned_to": "Assigned to", + "audio__allow_permission": "Please allow microphone permission in site settings", + "audio__allow_permission_button": "Click here to know how to allow", + "audio__allow_permission_helper": "You might have denied microphone access in the past.", + "audio__record": "Record Audio", + "audio__record_helper": "Click the button to start recording", + "audio__recorded": "Audio Recorded", + "audio__recording": "Recording", + "audio__recording_helper": "Please speak into your microphone.", + "audio__recording_helper_2": "Click on the button to stop recording.", + "audio__start_again": "Start Again", + "audit_log": "Audit Log", + "auth_login_title": "Authorized Login", + "authorize_shift_delete": "Authorize shift delete", + "auto_generated_for_care": "Auto Generated for Care", + "available_features": "Available Features", + "available_in": "Available in", + "average_weekly_working_hours": "Average weekly working hours", + "awaiting_destination_approval": "AWAITING DESTINATION APPROVAL", + "back": "Back", + "back_dated_encounter_date_caution": "You are creating an encounter for", + "back_to_consultation": "Go back to Consultation", + "back_to_login": "Back to login", + "base_dosage": "Dosage", + "bed_capacity": "Bed Capacity", + "bed_created_notification_one": "{{count}} Bed created successfully", + "bed_created_notification_other": "{{count}} Beds created successfully", + "bed_search_placeholder": "Search by beds name", + "bed_type": "Bed Type", + "bed_type__100": "ICU Bed", + "bed_type__200": "Ordinary Bed", + "bed_type__300": "Oxygen Supported Bed", + "bed_type__400": "Isolation Bed", + "bed_type__500": "Others", + "bladder": "Bladder", + "blood_group": "Blood Group", + "blood_pressure_error": { + "missing": "Field is required. Either specify both or clear both.", + "exceed": "Value cannot exceed 250 mmHg.", + "systolic_less_than_diastolic": "Systolic must be greater than diastolic." + }, + "board_view": "Board View", + "bradycardia": "Bradycardia", + "breathlessness_level": "Breathlessness level", + "camera": "Camera", + "camera_permission_denied": "Camera Permission denied", + "cancel": "Cancel", + "capture": "Capture", + "capture_cover_photo": "Capture Cover Photo", + "care": "CARE", + "category": "Category", + "caution": "Caution", + "central_nursing_station": "Central Nursing Station", + "change_file": "Change File", "change_password": "Change Password", - "language_selection": "Language Selection", - "set_your_local_language": "Set your local language", - "software_update": "Software Update", + "check_eligibility": "Check Eligibility", "check_for_available_update": "Check for available update", - "update_available": "Update Available", - "checking_for_update": "Checking for update", "check_for_update": "Check for Update", - "SORT_OPTIONS__-created_date": "Latest created date first", - "SORT_OPTIONS__created_date": "Oldest created date first", - "SORT_OPTIONS__-category_severity": "Highest Severity category first", - "SORT_OPTIONS__category_severity": "Lowest Severity category first", - "SORT_OPTIONS__-modified_date": "Latest updated date first", - "SORT_OPTIONS__modified_date": "Oldest updated date first", - "SORT_OPTIONS__facility__name,last_consultation__current_bed__bed__name": "Bed No. 1-N", - "SORT_OPTIONS__facility__name,-last_consultation__current_bed__bed__name": "Bed No. N-1", - "SORT_OPTIONS__-review_time": "Latest review date first", - "SORT_OPTIONS__review_time": "Oldest review date first", - "SORT_OPTIONS__taken_at": "Oldest taken date first", - "SORT_OPTIONS__-taken_at": "Latest taken date first", - "SORT_OPTIONS__name": "Patient name A-Z", - "SORT_OPTIONS__-name": "Patient name Z-A", - "SORT_OPTIONS__bed__name": "Bed No. 1-N", - "SORT_OPTIONS__-bed__name": "Bed No. N-1", - "CONSULTATION_TAB__UPDATES": "Overview", - "CONSULTATION_TAB__FEED": "Feed", - "CONSULTATION_TAB__SUMMARY": "Vitals", - "CONSULTATION_TAB__ABG": "ABG", - "CONSULTATION_TAB__MEDICINES": "Medicines", - "CONSULTATION_TAB__FILES": "Files", - "CONSULTATION_TAB__INVESTIGATIONS": "Investigations", - "CONSULTATION_TAB__NEUROLOGICAL_MONITORING": "Neuro", - "CONSULTATION_TAB__VENTILATOR": "Ventilation", - "CONSULTATION_TAB__NUTRITION": "Nutrition", - "CONSULTATION_TAB__PRESSURE_SORE": "Pressure Sore", - "CONSULTATION_TAB__NURSING": "Nursing", - "CONSULTATION_TAB__DIALYSIS": "Dialysis", - "CONSULTATION_TAB__ABDM": "ABDM Records", - "nursing_information": "Nursing Information", - "no_consultation_updates": "No consultation updates", + "check_policy_eligibility": "Check Policy Eligibility", + "checking_eligibility": "Checking Eligibility", + "checking_for_update": "Checking for update", + "checking_policy_eligibility": "Checking Policy Eligibility", + "choose_file": "Upload From Device", + "choose_location": "Choose Location", + "claim__add_item": "Add Item", + "claim__create_claim": "Create Claim", + "claim__create_preauthorization": "Create Pre Authorization", + "claim__creating_claim": "Creating Claim", + "claim__creating_preauthorization": "Creating Pre Authorization", + "claim__error_fetching_claim_approval_results": "Error Fetching Claim Approval Results", + "claim__failed_to_create_claim": "Failed to create Claim", + "claim__failed_to_create_preauthorization": "Failed to create Pre Authorization", + "claim__fetched_claim_approval_results": "Fetched Claim Approval Results", + "claim__item": "Item", + "claim__item__add_at_least_one": "Add at least one item", + "claim__item__category": "Category", + "claim__item__fill_all_details": "Fill all the item details", + "claim__item__id": "ID", + "claim__item__id__example": "PROC001", + "claim__item__name": "Name", + "claim__item__name__example": "Knee Replacement", + "claim__item__price": "Price", + "claim__item__price__example": "100.00", + "claim__item__procedure": "Procedure", + "claim__items": "Items", + "claim__request_claim": "Request Claim", + "claim__requesting_claim": "Requesting Claim", + "claim__status__approved": "Approved", + "claim__status__pending": "Pending", + "claim__status__rejected": "Rejected", + "claim__total_approved_amount": "Total Approved Amount", + "claim__total_claim_amount": "Total Claim Amount", + "claim__use": "Use", + "claim__use__claim": "Claim", + "claim__use__preauthorization": "Pre Authorization", + "claims": "Claims", + "clear": "Clear", + "clear_all_filters": "Clear All Filters", + "clear_home_facility": "Clear Home Facility", + "clear_selection": "Clear selection", + "close": "Close", + "close_scanner": "Close Scanner", + "collapse_sidebar": "Collapse Sidebar", + "comment_added_successfully": "Comment added successfully", + "comment_min_length": "Comment Should Contain At Least 1 Character", + "comments": "Comments", + "communication__sent_to_hcx": "Sent communication to HCX", + "completed": "Completed", + "configure": "Configure", + "configure_facility": "Configure Facility", + "confirm": "Confirm", + "confirm_delete": "Confirm Delete", + "confirm_discontinue": "Confirm Discontinue", + "confirm_password": "Confirm Password", + "confirm_transfer_complete": "Confirm Transfer Complete!", + "confirmed": "Confirmed", + "consultation_not_filed": "You have not filed any consultation for this patient yet.", + "consultation_not_filed_description": "Please file a consultation for this patient to continue.", + "consultation_notes": "General Instructions (Advice)", "consultation_updates": "Consultation updates", - "update_log": "Update Log", - "record_updates": "Record Updates", - "log_lab_results": "Log Lab Results", - "no_log_update_delta": "No changes since previous log update", - "virtual_nursing_assistant": "Virtual Nursing Assistant", + "contact_number": "Contact Number", + "contact_person": "Name of Contact Person at Facility", + "contact_person_at_the_facility": "Contact person at the current facility", + "contact_person_number": "Contact person number", + "contact_phone": "Contact Person Number", + "contact_your_admin_to_add_skills": "Contact your admin to add skills", + "continue": "Continue", + "continue_watching": "Continue watching", + "contribute_github": "Contribute on Github", + "copied_to_clipboard": "Copied to clipboard", + "countries_travelled": "Countries travelled", + "covid_19_cat_gov": "Covid_19 Clinical Category as per Govt. of Kerala guideline (A/B/C)", + "covid_19_death_reporting_form_1": "Covid-19 Death Reporting : Form 1", + "create": "Create", + "create_add_more": "Create & Add More", + "create_asset": "Create Asset", + "create_consultation": "Create Consultation", + "create_facility": "Create a new facility", + "create_new_asset": "Create New Asset", + "create_resource_request": "Create Resource Request", + "created": "Created", + "created_date": "Created Date", + "created_on": "Created On", + "csv_file_in_the_specified_format": "Select a CSV file in the specified format", + "current_password": "Current Password", + "customer_support_email": "Customer Support Email", + "customer_support_name": "Customer Support Name", + "customer_support_number": "Customer support number", + "cylinders": "Cylinders", + "cylinders_per_day": "Cylinders/day", + "date_and_time": "Date and Time", + "date_declared_positive": "Date of declaring positive", + "date_of_admission": "Date of Admission", + "date_of_birth": "Date of birth", + "date_of_positive_covid_19_swab": "Date of Positive Covid 19 Swab", + "date_of_result": "Covid confirmation date", + "date_of_test": "Date of sample collection for Covid testing", + "days": "Days", + "delete": "Delete", + "delete_facility": "Delete Facility", + "delete_item": "Delete {{name}}", + "delete_record": "Delete Record", + "deleted_successfully": "{{name}} deleted successfully", + "describe_why_the_asset_is_not_working": "Describe why the asset is not working", + "description": "Description", + "details_about_the_equipment": "Details about the equipment", + "details_of_assigned_facility": "Details of assigned facility", + "details_of_origin_facility": "Details of origin facility", + "details_of_patient": "Details of patient", + "details_of_shifting_approving_facility": "Details of shifting approving facility", + "diagnoses": "Diagnoses", + "diagnosis": "Diagnosis", + "diagnosis__confirmed": "Confirmed", + "diagnosis__differential": "Differential", + "diagnosis__principal": "Principal", + "diagnosis__provisional": "Provisional", + "diagnosis__unconfirmed": "Unconfirmed", + "diagnosis_already_added": "This diagnosis was already added", + "diagnosis_at_discharge": "Diagnosis at Discharge", + "diastolic": "Diastolic", + "differential": "Differential", + "discard": "Discard", "discharge": "Discharge", - "discharge_summary": "Discharge Summary", "discharge_from_care": "Discharge from CARE", - "generating_discharge_summary": "Generating discharge summary", + "discharge_prescription": "Discharge Prescription", + "discharge_summary": "Discharge Summary", "discharge_summary_not_ready": "Discharge summary is not ready yet.", - "download_discharge_summary": "Download discharge summary", - "email_discharge_summary_description": "Enter your valid email address to receive the discharge summary", - "generated_summary_caution": "This is a computer generated summary using the information captured in the CARE system.", - "NORMAL": "Brief Update", - "VENTILATOR": "Detailed Update", - "DOCTORS_LOG": "Progress Note", - "AUTOMATED": "Automated", - "TELEMEDICINE": "Telemedicine", - "investigations": "Investigations", - "search_investigation_placeholder": "Search Investigation & Groups", - "save_investigation": "Save Investigation", - "investigation_report_for_{{name}}": "Investigation Report for {{name}}", - "investigation_report_of_{{name}}": "Investigation Report of : {{name}}", - "investigation_reports": "Investigation Reports", - "no_investigation": "No investigation Reports found", - "investigations_suggested": "Investigations Suggested", - "no_tests_taken": "No tests taken", - "to_be_conducted": "To be conducted", - "log_report": "Log Report", - "no_investigation_suggestions": "No Investigation Suggestions", - "select_investigation": "Select Investigations (all investigations will be selected by default)", - "select_investigations": "Select Investigations", - "get_tests": "Get Tests", - "select_investigation_groups": "Select Investigation Groups", - "select_groups": "Select Groups", - "generate_report": "Generate Report", - "prev_sessions": "Prev Sessions", - "next_sessions": "Next Sessions", - "no_changes": "No changes", - "back_to_consultation": "Go back to Consultation", - "no_treating_physicians_available": "This facility does not have any home facility doctors. Please contact your admin.", - "encounter_suggestion_edit_disallowed": "Not allowed to switch to this option in edit consultation", - "encounter_suggestion__A": "Admission", - "encounter_suggestion__DC": "Domiciliary Care", - "encounter_suggestion__OP": "Out-patient visit", - "encounter_suggestion__DD": "Consultation", - "encounter_suggestion__HI": "Consultation", - "encounter_suggestion__R": "Consultation", + "discharged": "Discharged", + "discharged_patients": "Discharged Patients", + "discharged_patients_empty": "No discharged patients present in this facility", + "disclaimer": "Disclaimer", + "discontinue": "Discontinue", + "discontinue_caution_note": "Are you sure you want to discontinue this prescription?", + "discontinued": "Discontinued", + "disease_status": "Disease status", + "district": "District", + "district_program_management_supporting_unit": "District Program Management Supporting Unit", + "doctor_s_medical_council_registration": "Doctor's Medical Council Registration", + "domestic_healthcare_support": "Domestic healthcare support", + "done": "Done", + "dosage": "Dosage", + "down": "Down", + "download": "Download", + "download_discharge_summary": "Download discharge summary", + "download_type": "Download Type", + "downloading": "Downloading", + "downloads": "Downloads", + "drag_drop_image_to_upload": "Drag & drop image to upload", + "duplicate_patient_record_birth_unknown": "Please contact your district care coordinator, the shifting facility or the patient themselves if you are not sure about the patient's year of birth.", + "duplicate_patient_record_confirmation": "Admit the patient record to your facility by adding the year of birth", + "duplicate_patient_record_rejection": "I confirm that the suspect / patient I want to create is not on the list.", + "edit": "Edit", + "edit_caution_note": "A new prescription will be added to the consultation with the edited details and the current prescription will be discontinued.", + "edit_cover_photo": "Edit Cover Photo", + "edit_history": "Edit History", + "edit_policy": "Edit Insurance Policy", + "edit_policy_description": "Add or edit patient's insurance details", + "edit_prescriptions": "Edit Prescriptions", + "edit_user_profile": "Edit Profile", + "edited_by": "Edited by", + "edited_on": "Edited on", + "eg_abc": "Eg. ABC", + "eg_details_on_functionality_service_etc": "Eg. Details on functionality, service, etc.", + "eg_mail_example_com": "Eg. mail@example.com", + "eg_xyz": "Eg. XYZ", + "eligible": "Eligible", + "email": "Email Address", + "email_address": "Email Address", + "email_discharge_summary_description": "Enter your valid email address to receive the discharge summary", + "email_success": "We will be sending an email shortly. Please check your inbox.", + "emergency": "Emergency", + "emergency_contact_number": "Emergency Contact Number", + "empty_date_time": "--:-- --; --/--/----", "encounter_date_field_label__A": "Date & Time of Admission to the Facility", "encounter_date_field_label__DC": "Date & Time of Domiciliary Care commencement", - "encounter_date_field_label__OP": "Date & Time of Out-patient visit", "encounter_date_field_label__DD": "Date & Time of Consultation", "encounter_date_field_label__HI": "Date & Time of Consultation", + "encounter_date_field_label__OP": "Date & Time of Out-patient visit", "encounter_date_field_label__R": "Date & Time of Consultation", - "back_dated_encounter_date_caution": "You are creating an encounter for", "encounter_duration_confirmation": "The duration of this encounter would be", - "consultation_notes": "General Instructions (Advice)", - "diagnosis_at_discharge": "Diagnosis at Discharge", - "procedure_suggestions": "Procedure Suggestions", - "patient_notes_thread__Doctors": "Doctor's Discussions", - "patient_notes_thread__Nurses": "Nurse's Discussions", - "edit_cover_photo": "Edit Cover Photo", - "no_cover_photo_uploaded_for_this_facility": "No cover photo uploaded for this facility", - "capture_cover_photo": "Capture Cover Photo", - "diagnoses": "Diagnoses", - "diagnosis_already_added": "This diagnosis was already added", - "principal": "Principal", - "principal_diagnosis": "Principal diagnosis", - "unconfirmed": "Unconfirmed", - "provisional": "Provisional", - "differential": "Differential", - "confirmed": "Confirmed", - "refuted": "Refuted", + "encounter_suggestion__A": "Admission", + "encounter_suggestion__DC": "Domiciliary Care", + "encounter_suggestion__DD": "Consultation", + "encounter_suggestion__HI": "Consultation", + "encounter_suggestion__OP": "Out-patient visit", + "encounter_suggestion__R": "Consultation", + "encounter_suggestion_edit_disallowed": "Not allowed to switch to this option in edit consultation", + "enter_file_name": "Enter File Name", + "enter_message": "Start typing...", + "enter_valid_age": "Please Enter Valid Age", "entered-in-error": "Entered in error", - "help_unconfirmed": "There is not sufficient diagnostic and/or clinical evidence to treat this as a confirmed condition.", - "help_provisional": "This is a tentative diagnosis - still a candidate that is under consideration.", - "help_differential": "One of a set of potential (and typically mutually exclusive) diagnoses asserted to further guide the diagnostic process and preliminary treatment.", + "error_404": "Error 404", + "error_deleting_shifting": "Error while deleting Shifting record", + "error_while_deleting_record": "Error while deleting record", + "escape": "Escape", + "estimated_contact_date": "Estimated contact date", + "expand_sidebar": "Expand Sidebar", + "expected_burn_rate": "Expected Burn Rate", + "facilities": "Facilities", + "facility": "Facility", + "facility_name": "Facility Name", + "facility_preference": "Facility preference", + "facility_search_placeholder": "Search by Facility / District Name", + "facility_type": "Facility Type", + "failed_to_link_abha_number": "Failed to link ABHA number", + "features": "Features", + "feed_is_currently_not_live": "Feed is currently not live", + "feed_optimal_experience_for_apple_phones": "For optimal viewing experience, consider rotating your device. Ensure auto-rotate is enabled in your device settings.", + "feed_optimal_experience_for_phones": "For optimal viewing experience, consider rotating your device.", + "fetched_attachments_successfully": "Fetched attachments successfully", + "fetching": "Fetching", + "field_required": "This field is required", + "file_error__choose_file": "Please choose a file to upload", + "file_error__dynamic": "Error Uploading File: {{statusText}}", + "file_error__file_name": "Please give a name for all files!", + "file_error__file_size": "Maximum size of files is 100 MB", + "file_error__file_type": "Invalid file type \".{{extension}}\" Allowed types: {{allowedExtensions}}", + "file_error__network": "Error Uploading File: Network Error", + "file_error__single_file_name": "Please give a name for the file", + "file_list_headings__consultation": "Consultation Files", + "file_list_headings__patient": "Patient Files", + "file_list_headings__sample_report": "Sample Report", + "file_list_headings__supporting_info": "Supporting Info", + "file_preview": "File Preview", + "file_preview_not_supported": "Can't preview this file. Try downloading it.", + "file_uploaded": "File Uploaded Successfully", + "filter": "Filter", + "filter_by": "Filter By", + "filter_by_category": "Filter by category", + "filters": "Filters", + "first_name": "First Name", + "footer_body": "Open Healthcare Network is an open-source public utility designed by a multi-disciplinary team of innovators and volunteers. Open Healthcare Network CARE is a Digital Public Good recognised by the United Nations.", + "forget_password": "Forgot password?", + "forget_password_instruction": "Enter your username, and if it exists, we will send you a link to reset your password.", + "frequency": "Frequency", + "full_screen": "Full Screen", + "gender": "Gender", + "generate_report": "Generate Report", + "generated_summary_caution": "This is a computer generated summary using the information captured in the CARE system.", + "generating": "Generating", + "generating_discharge_summary": "Generating discharge summary", + "get_tests": "Get Tests", + "goal": "Our goal is to continuously improve the quality and accessibility of public healthcare services using digital tools.", + "has_domestic_healthcare_support": "Has domestic healthcare support?", "help_confirmed": "There is sufficient diagnostic and/or clinical evidence to treat this as a confirmed condition.", - "help_refuted": "This condition has been ruled out by subsequent diagnostic and clinical evidence.", + "help_differential": "One of a set of potential (and typically mutually exclusive) diagnoses asserted to further guide the diagnostic process and preliminary treatment.", "help_entered-in-error": "The statement was entered in error and is not valid.", - "search_icd11_placeholder": "Search for ICD-11 Diagnoses", + "help_provisional": "This is a tentative diagnosis - still a candidate that is under consideration.", + "help_refuted": "This condition has been ruled out by subsequent diagnostic and clinical evidence.", + "help_unconfirmed": "There is not sufficient diagnostic and/or clinical evidence to treat this as a confirmed condition.", + "hide": "Hide", + "home_facility": "Home Facility", + "hubs": "Hub Facilities", "icd11_as_recommended": "As per ICD-11 recommended by WHO", - "patients": "Patients", - "sample_test": "Sample Test", - "resource": "Resource", - "profile": "Profile", - "return_to_care": "Return to CARE", - "404_message": "It appears that you have stumbled upon a page that either does not exist or has been moved to another URL. Make sure you have entered the correct link!", - "error_404": "Error 404", - "page_not_found": "Page Not Found", - "session_expired": "Session Expired", - "invalid_password_reset_link": "Invalid password reset link", + "inconsistent_dosage_units_error": "Dosage units must be same", + "indian_mobile": "Indian Mobile", + "indicator": "Indicator", + "inidcator_event": "Indicator Event", + "instruction_on_titration": "Instruction on titration", + "international_mobile": "International Mobile", + "invalid_asset_id_msg": "Oops! The asset ID you entered does not appear to be valid.", + "invalid_email": "Please Enter a Valid Email Address", "invalid_link_msg": "It appears that the password reset link you have used is either invalid or expired. Please request a new password reset link.", - "return_to_password_reset": "Return to Password Reset", - "return_to_login": "Return to Login", - "session_expired_msg": "It appears that your session has expired. This could be due to inactivity. Please login again to continue.", + "invalid_password": "Password doesn't meet the requirements", + "invalid_password_reset_link": "Invalid password reset link", + "invalid_phone": "Please enter valid phone number", + "invalid_phone_number": "Invalid Phone Number", + "invalid_pincode": "Invalid Pincode", "invalid_reset": "Invalid Reset", - "please_upload_a_csv_file": "Please Upload A CSV file", - "csv_file_in_the_specified_format": "Select a CSV file in the specified format", - "sample_format": "Sample Format", - "search_for_facility": "Search for Facility", - "select_local_body": "Select Local Body", - "select_wards": "Select wards", - "result_date": "Result Date", - "sample_collection_date": "Sample Collection Date", - "record_has_been_deleted_successfully": "Record has been deleted successfully.", - "error_while_deleting_record": "Error while deleting record", - "result_details": "Result details", - "confirm_delete": "Confirm Delete", - "are_you_sure_want_to_delete_this_record": "Are you sure want to delete this record?", - "patient_category": "Patient Category", - "source": "Source", - "result": "Result", - "sample_type": "Sample Type", - "patient_status": "Patient Status", - "mobile_number": "Mobile Number", - "patient_created": "Patient Created", - "update_record": "Update Record", - "facility_search_placeholder": "Search by Facility / District Name", - "advanced_filters": "Advanced Filters", - "facility_name": "Facility Name", - "KASP Empanelled": "KASP Empanelled", - "View Facility": "View Facility", - "no_duplicate_facility": "You should not create duplicate facilities", - "no_facilities": "No Facilities found", - "no_staff": "No staff found", - "no_bed_types_found": "No Bed Types found", - "total_beds": "Total Beds", - "create_facility": "Create a new facility", - "staff_list": "Staff List", - "bed_capacity": "Bed Capacity", - "cylinders": "Cylinders", - "cylinders_per_day": "Cylinders/day", - "liquid_oxygen_capacity": "Liquid Oxygen Capacity", - "expected_burn_rate": "Expected Burn Rate", - "type_b_cylinders": "B Type Cylinders", - "type_c_cylinders": "C Type Cylinders", - "type_d_cylinders": "D Type Cylinders", - "update_asset": "Update Asset", - "create_new_asset": "Create New Asset", - "you_need_at_least_a_location_to_create_an_assest": "You need at least a location to create an assest.", - "add_location": "Add Location", - "close_scanner": "Close Scanner", - "scan_asset_qr": "Scan Asset QR!", - "create": "Create", - "asset_name": "Asset Name", - "asset_location": "Asset Location", - "asset_type": "Asset Type", - "asset_class": "Asset Class", - "details_about_the_equipment": "Details about the equipment", - "working_status": "Working Status", - "why_the_asset_is_not_working": "Why the asset is not working?", - "describe_why_the_asset_is_not_working": "Describe why the asset is not working", - "asset_qr_id": "Asset QR ID", - "manufacturer": "Manufacturer", - "eg_xyz": "Eg. XYZ", - "eg_abc": "Eg. ABC", - "warranty_amc_expiry": "Warranty / AMC Expiry", - "customer_support_name": "Customer Support Name", - "customer_support_number": "Customer support number", - "customer_support_email": "Customer Support Email", - "eg_mail_example_com": "Eg. mail@example.com", - "vendor_name": "Vendor Name", - "serial_number": "Serial Number", - "last_serviced_on": "Last Serviced On", - "create_add_more": "Create & Add More", - "discharged_patients": "Discharged Patients", - "discharged_patients_empty": "No discharged patients present in this facility", - "update_facility_middleware_success": "Facility middleware updated successfully", - "treatment_summary__head_title": "Treatment Summary", - "treatment_summary__print": "Print Treatment Summary", - "treatment_summary__heading": "INTERIM TREATMENT SUMMARY", - "patient_registration__name": "Name", - "patient_registration__address": "Address", - "patient_registration__age": "Age", - "patient_consultation__op": "OP", - "patient_consultation__ip": "IP", - "patient_consultation__dc_admission": "Date of domiciliary care commenced", - "patient_consultation__admission": "Date of admission", - "patient_registration__gender": "Gender", - "patient_registration__contact": "Emergency Contact", - "patient_registration__comorbidities": "Comorbidities", - "patient_registration__comorbidities__disease": "Disease", - "patient_registration__comorbidities__details": "Details", - "patient_consultation__consultation_notes": "General Instructions", - "patient_consultation__special_instruction": "Special Instructions", - "suggested_investigations": "Suggested Investigations", + "invalid_username": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + "inventory_management": "Inventory Management", + "investigation_report": "Investigation Report", + "investigation_report_for_{{name}}": "Investigation Report for {{name}}", + "investigation_report_of_{{name}}": "Investigation Report of : {{name}}", + "investigation_reports": "Investigation Reports", + "investigations": "Investigations", "investigations__date": "Date", - "investigations__name": "Name", - "investigations__result": "Result", "investigations__ideal_value": "Ideal Value", + "investigations__name": "Name", "investigations__range": "Value Range", + "investigations__result": "Result", "investigations__unit": "Unit", - "patient_consultation__treatment__plan": "Plan", - "patient_consultation__treatment__summary": "Summary", - "patient_consultation__treatment__summary__date": "Date", - "patient_consultation__treatment__summary__spo2": "SpO2", - "patient_consultation__treatment__summary__temperature": "Temperature", - "diagnosis__principal": "Principal", - "diagnosis__confirmed": "Confirmed", - "diagnosis__provisional": "Provisional", - "diagnosis__unconfirmed": "Unconfirmed", - "diagnosis__differential": "Differential", - "active_prescriptions": "Active Prescriptions", - "prescriptions__medicine": "Medicine", - "prescriptions__route": "Route", - "prescriptions__dosage_frequency": "Dosage & Frequency", - "prescriptions__start_date": "Prescribed On", - "select_facility_for_discharged_patients_warning": "Facility needs to be selected to view discharged patients.", - "duplicate_patient_record_confirmation": "Admit the patient record to your facility by adding the year of birth", - "duplicate_patient_record_rejection": "I confirm that the suspect / patient I want to create is not on the list.", - "duplicate_patient_record_birth_unknown": "Please contact your district care coordinator, the shifting facility or the patient themselves if you are not sure about the patient's year of birth.", - "patient_transfer_birth_match_note": "Note: Year of birth must match the patient to process the transfer request.", - "bed_type__100": "ICU Bed", - "bed_type__200": "Ordinary Bed", - "bed_type__300": "Oxygen Supported Bed", - "bed_type__400": "Isolation Bed", - "bed_type__500": "Others", - "available_features": "Available Features", - "update_facility": "Update Facility", - "configure_facility": "Configure Facility", - "inventory_management": "Inventory Management", - "location_management": "Location Management", - "resource_request": "Resource Request", - "view_asset": "View Assets", - "view_users": "View Users", - "view_abdm_records": "View ABDM Records", - "delete_facility": "Delete Facility", - "central_nursing_station": "Central Nursing Station", - "add_details_of_patient": "Add Details of Patient", - "choose_location": "Choose Location", + "investigations_suggested": "Investigations Suggested", + "is": "Is", + "is_antenatal": "Is Antenatal", + "is_declared_positive": "Whether declared positive", + "is_emergency": "Is emergency", + "is_emergency_case": "Is emergency case", + "is_it_upshift": "is it upshift", + "is_this_an_emergency": "Is this an emergency?", + "is_this_an_upshift": "Is this an upshift?", + "is_up_shift": "Is up shift", + "is_upshift_case": "Is upshift case", + "is_vaccinated": "Whether vaccinated", + "landline": "Indian landline", + "language_selection": "Language Selection", + "last_administered": "Last administered", + "last_edited": "Last Edited", + "last_modified": "Last Modified", + "last_name": "Last Name", + "last_online": "Last Online", + "last_serviced_on": "Last Serviced On", + "latitude_invalid": "Latitude must be between -90 and 90", + "left": "Left", + "length": "Length ({{unit}})", + "linked_facilities": "Linked Facilities", + "linked_skills": "Linked Skills", + "liquid_oxygen_capacity": "Liquid Oxygen Capacity", + "list_view": "List View", + "litres": "Litres", + "litres_per_day": "Litres/day", + "live": "Live", "live_monitoring": "Live Monitoring", - "open_live_monitoring": "Open Live Monitoring", - "abha_number_linked_successfully": "ABHA number linked successfully", - "failed_to_link_abha_number": "Failed to link ABHA number", - "audio__allow_permission": "Please allow microphone permission in site settings", - "audio__allow_permission_helper": "You might have denied microphone access in the past.", - "audio__allow_permission_button": "Click here to know how to allow", - "audio__record": "Record Audio", - "audio__record_helper": "Click the button to start recording", - "audio__recording": "Recording", - "audio__recording_helper": "Please speak into your microphone.", - "audio__recording_helper_2": "Click on the button to stop recording.", - "audio__recorded": "Audio Recorded", - "audio__start_again": "Start Again", - "enter_file_name": "Enter File Name", + "load_more": "Load More", + "loading": "Loading...", + "local_body": "Local body", + "local_ipaddress": "Local IP Address", + "location": "Location", + "location_management": "Location Management", + "log_lab_results": "Log Lab Results", + "log_report": "Log Report", + "login": "Login", + "longitude_invalid": "Longitude must be between -180 and 180", + "lsg": "Lsg", + "make_multiple_beds_label": "Do you want to make multiple beds?", + "manage_prescriptions": "Manage Prescriptions", + "manufacturer": "Manufacturer", + "map_acronym": "M.A.P.", + "mark_all_as_read": "Mark all as Read", + "mark_as_read": "Mark as Read", + "mark_as_unread": "Mark as Unread", + "mark_this_transfer_as_complete_question": "Are you sure you want to mark this transfer as complete? The Origin facility will no longer have access to this patient", + "mark_transfer_complete_confirmation": "Are you sure you want to mark this transfer as complete? The Origin facility will no longer have access to this patient", + "max_dosage_24_hrs": "Max. dosage in 24 hrs.", + "max_dosage_in_24hrs_gte_base_dosage_error": "Max. dosage in 24 hours must be greater than or equal to base dosage", + "max_size_for_image_uploaded_should_be": "Max size for image uploaded should be", + "medical_council_registration": "Medical Council Registration", + "medical_worker": "Medical Worker", + "medicine": "Medicine", + "medicine_administration_history": "Medicine Administration History", + "medicines_administered": "Medicine(s) administered", + "medicines_administered_error": "Error administering medicine(s)", + "middleware_hostname": "Middleware Hostname", + "min_password_len_8": "Minimum password length 8", + "min_time_bw_doses": "Min. time b/w doses", + "mobile": "Mobile", + "mobile_number": "Mobile Number", + "modification_caution_note": "No modifications possible once added", + "modified": "Modified", + "modified_date": "Modified Date", + "monitor": "Monitor", + "more_info": "More Info", + "moving_camera": "Moving Camera", + "name": "Name", + "name_of_hospital": "Name of Hospital", + "name_of_shifting_approving_facility": "Name of shifting approving facility", + "nationality": "Nationality", + "never": "never", + "new_password": "New Password", + "new_password_confirmation": "Confirm New Password", + "next_sessions": "Next Sessions", + "no": "No", + "no_attachments_found": "This communication has no attachments.", + "no_bed_types_found": "No Bed Types found", + "no_changes": "No changes", + "no_changes_made": "No changes made", + "no_consultation_updates": "No consultation updates", + "no_cover_photo_uploaded_for_this_facility": "No cover photo uploaded for this facility", + "no_data_found": "No data found", + "no_duplicate_facility": "You should not create duplicate facilities", + "no_facilities": "No Facilities found", "no_files_found": "No {{type}} files found", - "upload_headings__patient": "Upload New Patient File", - "upload_headings__consultation": "Upload New Consultation File", - "upload_headings__sample_report": "Upload Sample Report", - "upload_headings__supporting_info": "Upload Supporting Info", - "file_list_headings__patient": "Patient Files", - "file_list_headings__consultation": "Consultation Files", - "file_list_headings__sample_report": "Sample Report", - "file_list_headings__supporting_info": "Supporting Info", - "file_error__choose_file": "Please choose a file to upload", - "file_error__file_name": "Please give a name for all files!", - "file_error__single_file_name": "Please give a name for the file", - "change_file": "Change File", - "file_error__file_size": "Maximum size of files is 100 MB", - "file_error__file_type": "Invalid file type \".{{extension}}\" Allowed types: {{allowedExtensions}}", - "file_uploaded": "File Uploaded Successfully", - "file_error__dynamic": "Error Uploading File: {{statusText}}", - "file_error__network": "Error Uploading File: Network Error", - "checking_policy_eligibility": "Checking Policy Eligibility", - "check_policy_eligibility": "Check Policy Eligibility", - "add_policy": "Add Insurance Policy", - "edit_policy": "Edit Insurance Policy", - "edit_policy_description": "Add or edit patient's insurance details", - "select_policy": "Select an Insurance Policy", - "select_eligible_policy": "Select an Eligible Insurance Policy", - "no_policy_found": "No Insurance Policy Found for this Patient", + "no_home_facility": "No home facility assigned", + "no_investigation": "No investigation Reports found", + "no_investigation_suggestions": "No Investigation Suggestions", + "no_linked_facilities": "No Linked Facilities", + "no_log_update_delta": "No changes since previous log update", + "no_notices_for_you": "No notices for you.", + "no_patients_to_show": "No patients to show.", "no_policy_added": "No Insurance Policy Added", - "checking_eligibility": "Checking Eligibility", - "check_eligibility": "Check Eligibility", - "eligible": "Eligible", + "no_policy_found": "No Insurance Policy Found for this Patient", + "no_remarks": "No remarks", + "no_results_found": "No Results Found", + "no_staff": "No staff found", + "no_tests_taken": "No tests taken", + "no_treating_physicians_available": "This facility does not have any home facility doctors. Please contact your admin.", + "no_users_found": "No Users Found", + "none": "None", + "normal": "Normal", "not_eligible": "Not Eligible", - "policy": "Policy", - "policy__subscriber_id": "Member ID", - "policy__subscriber_id__example": "SUB001", - "policy__policy_id": "Policy ID / Policy Name", - "policy__policy_id__example": "POL001", - "policy__insurer": "Insurer", - "policy__insurer__example": "GICOFINDIA", - "policy__insurer_id": "Insurer ID", - "policy__insurer_id__example": "GICOFINDIA", - "policy__insurer_name": "Insurer Name", - "policy__insurer_name__example": "GIC OF INDIA", - "claims": "Claims", - "claim__item": "Item", - "claim__items": "Items", - "claim__add_item": "Add Item", - "claim__item__add_at_least_one": "Add at least one item", - "claim__item__fill_all_details": "Fill all the item details", - "claim__item__category": "Category", - "claim__item__procedure": "Procedure", - "claim__item__id": "ID", - "claim__item__id__example": "PROC001", - "claim__item__name": "Name", - "claim__item__name__example": "Knee Replacement", - "claim__item__price": "Price", - "claim__item__price__example": "100.00", - "claim__failed_to_create_preauthorization": "Failed to create Pre Authorization", - "claim__failed_to_create_claim": "Failed to create Claim", - "claim__creating_preauthorization": "Creating Pre Authorization", - "claim__creating_claim": "Creating Claim", - "claim__create_preauthorization": "Create Pre Authorization", - "claim__create_claim": "Create Claim", - "claim__use": "Use", - "claim__use__preauthorization": "Pre Authorization", - "claim__use__claim": "Claim", - "select_policy_to_add_items": "Select a Policy to Add Items", - "total_amount": "Total Amount", - "claim__status__rejected": "Rejected", - "claim__status__approved": "Approved", - "claim__status__pending": "Pending", - "claim__total_claim_amount": "Total Claim Amount", - "claim__total_approved_amount": "Total Approved Amount", - "communication__sent_to_hcx": "Sent communication to HCX", - "fetched_attachments_successfully": "Fetched attachments successfully", - "add_attachments": "Add Attachments", - "claim__request_claim": "Request Claim", - "claim__requesting_claim": "Requesting Claim", - "claim__fetched_claim_approval_results": "Fetched Claim Approval Results", - "claim__error_fetching_claim_approval_results": "Error Fetching Claim Approval Results", - "monitor": "Monitor", - "show_default_presets": "Show Default Presets", - "show_patient_presets": "Show Patient Presets", - "moving_camera": "Moving Camera", - "full_screen": "Full Screen", - "feed_is_currently_not_live": "Feed is currently not live", - "zoom_out": "Zoom Out", - "zoom_in": "Zoom In", - "right": "Right", - "left": "Left", - "down": "Down", - "up": "Up", - "LOG_UPDATE_CREATED_NOTIFICATION": "{{ roundType }} created successfully", - "LOG_UPDATE_UPDATED_NOTIFICATION": "{{ roundType }} updated successfully", - "LOG_UPDATE_FIELD_LABEL__rounds_type": "Rounds Type", - "LOG_UPDATE_FIELD_LABEL__patient_category": "Category", - "LOG_UPDATE_FIELD_LABEL__consciousness_level": "Level of Consciousness", - "LOG_UPDATE_FIELD_LABEL__sleep": "Sleep", - "LOG_UPDATE_FIELD_LABEL__bowel_issue": "Bowel", - "LOG_UPDATE_FIELD_LABEL__bladder_drainage": "Drainage", - "LOG_UPDATE_FIELD_LABEL__bladder_issue": "Issues", - "LOG_UPDATE_FIELD_LABEL__is_experiencing_dysuria": "Experiences Dysuria?", - "LOG_UPDATE_FIELD_LABEL__urination_frequency": "Frequency of Urination", - "LOG_UPDATE_FIELD_LABEL__nutrition_route": "Nutrition Route", - "LOG_UPDATE_FIELD_LABEL__oral_issue": "Oral issues", - "LOG_UPDATE_FIELD_LABEL__appetite": "Appetite", - "LOG_UPDATE_FIELD_LABEL__physical_examination_info": "Physical Examination Info", - "LOG_UPDATE_FIELD_LABEL__bp": "Blood Pressure", - "LOG_UPDATE_FIELD_LABEL__blood_sugar_level": "Blood Sugar Level", - "LOG_UPDATE_FIELD_LABEL__action": "Action", - "LOG_UPDATE_FIELD_LABEL__review_interval": "Review after", - "LOG_UPDATE_FIELD_LABEL__rhythm": "Heartbeat Rhythm", - "LOG_UPDATE_FIELD_LABEL__rhythm_detail": "Rhythm Description", - "LOG_UPDATE_FIELD_LABEL__ventilator_spo2": "SpO₂", - "LOG_UPDATE_FIELD_LABEL__resp": "Respiratory Rate", - "LOG_UPDATE_FIELD_LABEL__temperature": "Temperature", - "LOG_UPDATE_FIELD_LABEL__other_details": "Other details", - "LOG_UPDATE_FIELD_LABEL__pulse": "Pulse", - "ROUNDS_TYPE__NORMAL": "Brief Update", - "ROUNDS_TYPE__COMMUNITY_NURSES_LOG": "Community Nurse's Log", - "ROUNDS_TYPE__VENTILATOR": "Detailed Update", - "ROUNDS_TYPE__DOCTORS_LOG": "Progress Note", - "ROUNDS_TYPE__AUTOMATED": "Virtual Nursing Assistant", - "ROUNDS_TYPE__TELEMEDICINE": "Tele-medicine Log", - "RESPIRATORY_SUPPORT_SHORT__UNKNOWN": "None", - "RESPIRATORY_SUPPORT_SHORT__OXYGEN_SUPPORT": "O₂ Support", - "RESPIRATORY_SUPPORT_SHORT__NON_INVASIVE": "NIV", - "RESPIRATORY_SUPPORT_SHORT__INVASIVE": "IV", - "RESPIRATORY_SUPPORT__UNKNOWN": "None", - "RESPIRATORY_SUPPORT__OXYGEN_SUPPORT": "Oxygen Support", - "RESPIRATORY_SUPPORT__NON_INVASIVE": "Non-Invasive ventilator (NIV)", - "RESPIRATORY_SUPPORT__INVASIVE": "Invasive ventilator (IV)", - "VENTILATOR_MODE__CMV": "Control Mechanical Ventilation (CMV)", - "VENTILATOR_MODE__VCV": "Volume Control Ventilation (VCV)", - "VENTILATOR_MODE__PCV": "Pressure Control Ventilation (PCV)", - "VENTILATOR_MODE__SIMV": "Synchronised Intermittent Mandatory Ventilation (SIMV)", - "VENTILATOR_MODE__VC_SIMV": "Volume Controlled SIMV (VC-SIMV)", - "VENTILATOR_MODE__PC_SIMV": "Pressure Controlled SIMV (PC-SIMV)", - "VENTILATOR_MODE__PSV": "C-PAP / Pressure Support Ventilation (PSV)", - "CONSCIOUSNESS_LEVEL__UNRESPONSIVE": "Unresponsive", - "CONSCIOUSNESS_LEVEL__RESPONDS_TO_PAIN": "Responds to Pain", - "CONSCIOUSNESS_LEVEL__RESPONDS_TO_VOICE": "Responds to Voice", - "CONSCIOUSNESS_LEVEL__ALERT": "Alert", - "CONSCIOUSNESS_LEVEL__AGITATED_OR_CONFUSED": "Agitated or Confused", - "CONSCIOUSNESS_LEVEL__ONSET_OF_AGITATION_AND_CONFUSION": "Onset of Agitation and Confusion", - "BOWEL_ISSUE__NO_DIFFICULTY": "No difficulty", - "BOWEL_ISSUE__CONSTIPATION": "Constipation", - "BOWEL_ISSUE__DIARRHOEA": "Diarrhoea", - "BLADDER_DRAINAGE__NORMAL": "Normal", - "BLADDER_DRAINAGE__CONDOM_CATHETER": "Condom Catheter", - "BLADDER_DRAINAGE__DIAPER": "Diaper", - "BLADDER_DRAINAGE__INTERMITTENT_CATHETER": "Intermittent Catheter", - "BLADDER_DRAINAGE__CONTINUOUS_INDWELLING_CATHETER": "Continuous Indwelling Catheter", - "BLADDER_DRAINAGE__CONTINUOUS_SUPRAPUBIC_CATHETER": "Continuous Suprapubic Catheter", - "BLADDER_DRAINAGE__UROSTOMY": "Urostomy", - "BLADDER_ISSUE__NO_ISSUES": "No issues", - "BLADDER_ISSUE__INCONTINENCE": "Incontinence", - "BLADDER_ISSUE__RETENTION": "Retention", - "BLADDER_ISSUE__HESITANCY": "Hesitancy", - "URINATION_FREQUENCY__NORMAL": "Normal", - "URINATION_FREQUENCY__DECREASED": "Decreased", - "URINATION_FREQUENCY__INCREASED": "Increased", - "SLEEP__EXCESSIVE": "Excessive", - "SLEEP__SATISFACTORY": "Satisfactory", - "SLEEP__UNSATISFACTORY": "Unsatisfactory", - "SLEEP__NO_SLEEP": "No sleep", - "NUTRITION_ROUTE__ORAL": "Oral", - "NUTRITION_ROUTE__RYLES_TUBE": "Ryle's Tube", - "NUTRITION_ROUTE__GASTROSTOMY_OR_JEJUNOSTOMY": "Gastrostomy / Jejunostomy", - "NUTRITION_ROUTE__PEG": "PEG", - "NUTRITION_ROUTE__PARENTERAL_TUBING_FLUID": "Parenteral Tubing (Fluid)", - "NUTRITION_ROUTE__PARENTERAL_TUBING_TPN": "Parenteral Tubing (TPN)", - "ORAL_ISSUE__NO_ISSUE": "No issues", - "ORAL_ISSUE__DYSPHAGIA": "Dysphagia", - "ORAL_ISSUE__ODYNOPHAGIA": "Odynophagia", - "APPETITE__INCREASED": "Increased", - "APPETITE__SATISFACTORY": "Satisfactory", - "APPETITE__REDUCED": "Reduced", - "APPETITE__NO_TASTE_FOR_FOOD": "No taste for food", - "APPETITE__CANNOT_BE_ASSESSED": "Cannot be assessed", - "PUPIL_REACTION__UNKNOWN": "Unknown", - "PUPIL_REACTION__BRISK": "Brisk", - "PUPIL_REACTION__SLUGGISH": "Sluggish", - "PUPIL_REACTION__FIXED": "Fixed", - "PUPIL_REACTION__CANNOT_BE_ASSESSED": "Cannot be assessed", - "LIMB_RESPONSE__UNKNOWN": "Unknown", - "LIMB_RESPONSE__STRONG": "Strong", - "LIMB_RESPONSE__MODERATE": "Moderate", - "LIMB_RESPONSE__WEAK": "Weak", - "LIMB_RESPONSE__FLEXION": "Flexion", - "LIMB_RESPONSE__EXTENSION": "Extension", - "LIMB_RESPONSE__NONE": "None", - "OXYGEN_MODALITY__NASAL_PRONGS": "Nasal Prongs", - "OXYGEN_MODALITY__SIMPLE_FACE_MASK": "Simple Face Mask", - "OXYGEN_MODALITY__NON_REBREATHING_MASK": "Non Rebreathing Mask", - "OXYGEN_MODALITY__HIGH_FLOW_NASAL_CANNULA": "High Flow Nasal Cannula", - "INSULIN_INTAKE_FREQUENCY__UNKNOWN": "Unknown", - "INSULIN_INTAKE_FREQUENCY__OD": "Once a day (OD)", - "INSULIN_INTAKE_FREQUENCY__BD": "Twice a day (BD)", - "INSULIN_INTAKE_FREQUENCY__TD": "Thrice a day (TD)", - "NURSING_CARE_PROCEDURE__oral_care": "Oral Care", - "NURSING_CARE_PROCEDURE__hair_care": "Hair Care", - "NURSING_CARE_PROCEDURE__bed_bath": "Bed Bath", - "NURSING_CARE_PROCEDURE__eye_care": "Eye Care", - "NURSING_CARE_PROCEDURE__perineal_care": "Perineal Care", - "NURSING_CARE_PROCEDURE__skin_care": "Skin Care", - "NURSING_CARE_PROCEDURE__pre_enema": "P.R.E. Enema", - "NURSING_CARE_PROCEDURE__wound_dressing": "Wound Dressing", - "NURSING_CARE_PROCEDURE__lymphedema_care": "Lymphedema Care", - "NURSING_CARE_PROCEDURE__ascitic_tapping": "Ascitic Tapping", - "NURSING_CARE_PROCEDURE__colostomy_care": "Colostomy Care", - "NURSING_CARE_PROCEDURE__colostomy_change": "Colostomy Change", - "NURSING_CARE_PROCEDURE__personal_hygiene": "Other Personal Hygiene", - "NURSING_CARE_PROCEDURE__positioning": "Positioning", - "NURSING_CARE_PROCEDURE__suctioning": "Suctioning", - "NURSING_CARE_PROCEDURE__ryles_tube_care": "Ryle’s Tube Care", - "NURSING_CARE_PROCEDURE__ryles_tube_change": "Ryle’s Tube Change", - "NURSING_CARE_PROCEDURE__iv_sitecare": "IV Site Care", - "NURSING_CARE_PROCEDURE__nubulisation": "Nubulisation", - "NURSING_CARE_PROCEDURE__dressing": "Dressing", - "NURSING_CARE_PROCEDURE__dvt_pump_stocking": "DVT Pump Stocking", - "NURSING_CARE_PROCEDURE__restrain": "Restrain", - "NURSING_CARE_PROCEDURE__chest_tube_care": "Chest Tube Care", - "NURSING_CARE_PROCEDURE__tracheostomy_care": "Tracheostomy Care", - "NURSING_CARE_PROCEDURE__tracheostomy_tube_change": "Tracheostomy Tube Change", - "NURSING_CARE_PROCEDURE__stoma_care": "Stoma Care", - "NURSING_CARE_PROCEDURE__catheter_care": "Catheter Care", - "NURSING_CARE_PROCEDURE__catheter_change": "Catheter Change", - "HEARTBEAT_RHYTHM__REGULAR": "Regular", - "HEARTBEAT_RHYTHM__IRREGULAR": "Irregular", - "HEARTBEAT_RHYTHM__UNKNOWN": "Unknown", - "map_acronym": "M.A.P.", - "systolic": "Systolic", - "diastolic": "Diastolic", - "blood_pressure_error": { - "missing": "Field is required. Either specify both or clear both.", - "exceed": "Value cannot exceed 250 mmHg.", - "systolic_less_than_diastolic": "Systolic must be greater than diastolic." - }, + "not_specified": "Not Specified", + "notes": "Notes", + "notes_placeholder": "Type your Notes", + "notice_board": "Notice Board", + "notification_permission_denied": "Notification permission denied", + "notification_permission_granted": "Notification permission granted", + "number_of_aged_dependents_above_60": "Number Of Aged Dependents (Above 60)", + "number_of_beds": "Number of beds", + "number_of_beds_out_of_range_error": "Number of beds cannot be greater than 100", + "number_of_chronic_diseased_dependents": "Number Of Chronic Diseased Dependents", + "nursing_care": "Nursing Care", + "nursing_information": "Nursing Information", + "nutrition": "Nutrition", + "occupation": "Occupation", + "on": "On", + "ongoing_medications": "Ongoing Medications", + "open": "Open", + "open_camera": "Open Camera", + "open_live_monitoring": "Open Live Monitoring", + "optional": "Optional", + "oral_issue_for_non_oral_nutrition_route_error": "Can be specified only if nutrition route is set to Oral", + "ordering": "Ordering", + "origin_facility": "Current facility", + "other_details": "Other details", "out_of_range_error": "Value must be between {{ start }} and {{ end }}.", + "oxygen_information": "Oxygen Information", + "page_not_found": "Page Not Found", "pain": "Pain", "pain_chart_description": "Mark region and intensity of pain", - "bradycardia": "Bradycardia", - "tachycardia": "Tachycardia", - "vitals": "Vitals", - "procedures_select_placeholder": "Select procedures to add details", - "oral_issue_for_non_oral_nutrition_route_error": "Can be specified only if nutrition route is set to Oral", - "routine": "Routine", - "bladder": "Bladder", - "nutrition": "Nutrition", - "nursing_care": "Nursing Care", - "medicine": "Medicine", - "route": "Route", - "dosage": "Dosage", - "base_dosage": "Dosage", - "start_dosage": "Start Dosage", - "target_dosage": "Target Dosage", - "instruction_on_titration": "Instruction on titration", - "titrate_dosage": "Titrate Dosage", - "indicator": "Indicator", - "inidcator_event": "Indicator Event", - "max_dosage_24_hrs": "Max. dosage in 24 hrs.", - "min_time_bw_doses": "Min. time b/w doses", - "manage_prescriptions": "Manage Prescriptions", - "prescription_details": "Prescription Details", - "prescription_medications": "Prescription Medications", - "prn_prescriptions": "PRN Prescriptions", + "passport_number": "Passport Number", + "password": "Password", + "password_mismatch": "Password and confirm password must be same.", + "password_reset_failure": "Password Reset Failed", + "password_reset_success": "Password Reset successfully", + "password_sent": "Password Reset Email Sent", + "patient_address": "Patient Address", + "patient_category": "Patient Category", + "patient_consultation__admission": "Date of admission", + "patient_consultation__consultation_notes": "General Instructions", + "patient_consultation__dc_admission": "Date of domiciliary care commenced", + "patient_consultation__ip": "IP", + "patient_consultation__op": "OP", + "patient_consultation__special_instruction": "Special Instructions", + "patient_consultation__treatment__plan": "Plan", + "patient_consultation__treatment__summary": "Summary", + "patient_consultation__treatment__summary__date": "Date", + "patient_consultation__treatment__summary__spo2": "SpO2", + "patient_consultation__treatment__summary__temperature": "Temperature", + "patient_created": "Patient Created", + "patient_details": "Patient Details", + "patient_name": "Patient name", + "patient_no": "OP/IP No", + "patient_notes_thread__Doctors": "Doctor's Discussions", + "patient_notes_thread__Nurses": "Nurse's Discussions", + "patient_phone_number": "Patient Phone Number", + "patient_registration__address": "Address", + "patient_registration__age": "Age", + "patient_registration__comorbidities": "Comorbidities", + "patient_registration__comorbidities__details": "Details", + "patient_registration__comorbidities__disease": "Disease", + "patient_registration__contact": "Emergency Contact", + "patient_registration__gender": "Gender", + "patient_registration__name": "Name", + "patient_state": "Patient State", + "patient_status": "Patient Status", + "patient_transfer_birth_match_note": "Note: Year of birth must match the patient to process the transfer request.", + "patients": "Patients", + "personal_information": "Personal Information", + "phone": "Phone", + "phone_no": "Phone no.", + "phone_number": "Phone Number", + "phone_number_at_current_facility": "Phone Number of Contact person at current Facility", + "pincode": "Pincode", + "please_enter_a_reason_for_the_shift": "Please enter a reason for the shift.", + "please_select_a_facility": "Please select a facility", + "please_select_breathlessness_level": "Please select Breathlessness Level", + "please_select_facility_type": "Please select Facility Type", + "please_select_patient_category": "Please select Patient Category", + "please_select_preferred_vehicle_type": "Please select Preferred Vehicle Type", + "please_select_status": "Please select Status", + "please_upload_a_csv_file": "Please Upload A CSV file", + "policy": "Policy", + "policy__insurer": "Insurer", + "policy__insurer__example": "GICOFINDIA", + "policy__insurer_id": "Insurer ID", + "policy__insurer_id__example": "GICOFINDIA", + "policy__insurer_name": "Insurer Name", + "policy__insurer_name__example": "GIC OF INDIA", + "policy__policy_id": "Policy ID / Policy Name", + "policy__policy_id__example": "POL001", + "policy__subscriber_id": "Member ID", + "policy__subscriber_id__example": "SUB001", + "post_your_comment": "Post Your Comment", + "powered_by": "Powered By", + "preferred_facility_type": "Preferred Facility Type", + "preferred_vehicle": "Preferred Vehicle", "prescription": "Prescription", - "discharge_prescription": "Discharge Prescription", - "edit_prescriptions": "Edit Prescriptions", - "prescription_medication": "Prescription Medication", - "add_prescription_medication": "Add Prescription Medication", - "prn_prescription": "PRN Prescription", - "add_prn_prescription": "Add PRN Prescription", - "add_prescription_to_consultation_note": "Add a new prescription to this consultation.", - "medicine_administration_history": "Medicine Administration History", - "return_to_patient_dashboard": "Return to Patient Dashboard", - "administered_on": "Administered on", - "administer": "Administer", - "administer_medicine": "Administer Medicine", - "administer_medicines": "Administer Medicines", - "administer_selected_medicines": "Administer Selected Medicines", - "select_for_administration": "Select for Administration", - "medicines_administered": "Medicine(s) administered", - "medicines_administered_error": "Error administering medicine(s)", + "prescription_details": "Prescription Details", "prescription_discontinued": "Prescription discontinued", - "administration_notes": "Administration Notes", - "last_administered": "Last administered", "prescription_logs": "Prescription Logs", - "modification_caution_note": "No modifications possible once added", - "discontinue_caution_note": "Are you sure you want to discontinue this prescription?", - "confirm_discontinue": "Confirm Discontinue", - "edit_caution_note": "A new prescription will be added to the consultation with the edited details and the current prescription will be discontinued.", + "prescription_medication": "Prescription Medication", + "prescription_medications": "Prescription Medications", + "prescriptions__dosage_frequency": "Dosage & Frequency", + "prescriptions__medicine": "Medicine", + "prescriptions__route": "Route", + "prescriptions__start_date": "Prescribed On", + "prev_sessions": "Prev Sessions", + "principal": "Principal", + "principal_diagnosis": "Principal diagnosis", + "print": "Print", + "print_referral_letter": "Print Referral Letter", + "prn_prescription": "PRN Prescription", + "prn_prescriptions": "PRN Prescriptions", + "procedure_suggestions": "Procedure Suggestions", + "procedures_select_placeholder": "Select procedures to add details", + "profile": "Profile", + "provisional": "Provisional", + "qualification": "Qualification", + "ration_card__APL": "APL", + "ration_card__BPL": "BPL", + "ration_card__NO_CARD": "Non-card holder", + "ration_card_category": "Ration Card Category", + "reason": "Reason", "reason_for_discontinuation": "Reason for discontinuation", "reason_for_edit": "Reason for edit", - "PRESCRIPTION_ROUTE_ORAL": "Oral", - "PRESCRIPTION_ROUTE_IV": "IV", - "PRESCRIPTION_ROUTE_IM": "IM", - "PRESCRIPTION_ROUTE_SC": "S/C", - "PRESCRIPTION_ROUTE_INHALATION": "Inhalation", - "PRESCRIPTION_ROUTE_NASOGASTRIC": "Nasogastric / Gastrostomy tube", - "PRESCRIPTION_ROUTE_INTRATHECAL": "intrathecal injection", - "PRESCRIPTION_ROUTE_TRANSDERMAL": "Transdermal", - "PRESCRIPTION_ROUTE_RECTAL": "Rectal", - "PRESCRIPTION_ROUTE_SUBLINGUAL": "Sublingual", - "PRESCRIPTION_FREQUENCY_STAT": "Imediately", - "PRESCRIPTION_FREQUENCY_OD": "Once daily", - "PRESCRIPTION_FREQUENCY_HS": "Night only", - "PRESCRIPTION_FREQUENCY_BD": "Twice daily", - "PRESCRIPTION_FREQUENCY_TID": "8th hourly", - "PRESCRIPTION_FREQUENCY_QID": "6th hourly", - "PRESCRIPTION_FREQUENCY_Q4H": "4th hourly", - "PRESCRIPTION_FREQUENCY_QOD": "Alternate day", - "PRESCRIPTION_FREQUENCY_QWK": "Once a week", - "inconsistent_dosage_units_error": "Dosage units must be same", - "max_dosage_in_24hrs_gte_base_dosage_error": "Max. dosage in 24 hours must be greater than or equal to base dosage", - "administration_dosage_range_error": "Dosage should be between start and target dosage", - "no_notices_for_you": "No notices for you.", - "mark_as_read": "Mark as Read", - "mark_as_unread": "Mark as Unread", - "subscribe": "Subscribe", - "subscribe_on_this_device": "Subscribe on this device", - "notification_permission_denied": "Notification permission denied", - "notification_permission_granted": "Notification permission granted", - "show_unread_notifications": "Show Unread", - "show_all_notifications": "Show All", - "filter_by_category": "Filter by category", - "mark_all_as_read": "Mark all as Read", + "reason_for_referral": "Reason for referral", + "reason_for_shift": "Reason for shift", + "recommended_aspect_ratio_for": "Recommended aspect ratio for", + "record": "Record Audio", + "record_delete_confirm": "Are you sure you want to delete this record?", + "record_has_been_deleted_successfully": "Record has been deleted successfully.", + "record_updates": "Record Updates", + "recording": "Recording", + "redirected_to_create_consultation": "Note: You will be redirected to create consultation form. Please complete the form to finish the transfer process", + "referral_letter": "Referral Letter", + "referred_to": "Referred to", + "refresh_list": "Refresh List", + "refuted": "Refuted", + "register_hospital": "Register Hospital", + "register_page_title": "Register As Hospital Administrator", "reload": "Reload", - "no_results_found": "No Results Found", - "load_more": "Load More", - "subscription_error": "Subscription Error", - "unsubscribe_failed": "Unsubscribe failed.", - "unsubscribe": "Unsubscribe", - "escape": "Escape", - "invalid_asset_id_msg": "Oops! The asset ID you entered does not appear to be valid.", - "asset_not_found_msg": "Oops! The asset you are looking for does not exist. Please check the asset id.", - "occupation": "Occupation", - "ration_card_category": "Ration Card Category", - "socioeconomic_status": "Socioeconomic status", - "domestic_healthcare_support": "Domestic healthcare support", - "has_domestic_healthcare_support": "Has domestic healthcare support?", - "SOCIOECONOMIC_STATUS__MIDDLE_CLASS": "Middle Class", - "SOCIOECONOMIC_STATUS__POOR": "Poor", - "SOCIOECONOMIC_STATUS__VERY_POOR": "Very Poor", - "SOCIOECONOMIC_STATUS__WELL_OFF": "Well Off", - "DOMESTIC_HEALTHCARE_SUPPORT__FAMILY_MEMBER": "Family member", - "DOMESTIC_HEALTHCARE_SUPPORT__PAID_CAREGIVER": "Paid caregiver", - "DOMESTIC_HEALTHCARE_SUPPORT__NO_SUPPORT": "No support", - "create_resource_request": "Create Resource Request", - "contact_person": "Name of Contact Person at Facility", - "approving_facility": "Name of Approving Facility", - "contact_phone": "Contact Person Number", + "remove": "Remove", + "rename": "Rename", + "report": "Report", + "req_atleast_one_digit": "Require at least one digit", + "req_atleast_one_lowercase": "Require at least one lower case letter", + "req_atleast_one_symbol": "Require at least one symbol", + "req_atleast_one_uppercase": "Require at least one upper case", + "request_description": "Description of Request", + "request_description_placeholder": "Type your description here", "request_title": "Request Title", "request_title_placeholder": "Type your title here", + "required": "Required", "required_quantity": "Required Quantity", - "request_description": "Description of Request", - "request_description_placeholder": "Type your description here", + "reset": "Reset", + "reset_password": "Reset Password", + "resource": "Resource", + "resource_approving_facility": "Resource approving facility", + "resource_origin_facility": "Origin Facility", + "resource_request": "Resource Request", + "result": "Result", + "result_date": "Result Date", + "result_details": "Result details", + "resume": "Resume", + "retake": "Retake", + "return_to_care": "Return to CARE", + "return_to_login": "Return to Login", + "return_to_password_reset": "Return to Password Reset", + "return_to_patient_dashboard": "Return to Patient Dashboard", + "right": "Right", + "route": "Route", + "routine": "Routine", + "sample_collection_date": "Sample Collection Date", + "sample_format": "Sample Format", + "sample_test": "Sample Test", + "sample_type": "Sample Type", + "save": "Save", + "save_and_continue": "Save and Continue", + "save_investigation": "Save Investigation", + "scan_asset_qr": "Scan Asset QR!", + "search_by_username": "Search by username", + "search_for_facility": "Search for Facility", + "search_icd11_placeholder": "Search for ICD-11 Diagnoses", + "search_investigation_placeholder": "Search Investigation & Groups", + "search_patient": "Search Patient", "search_resource": "Search Resource", - "emergency": "Emergency", - "up_shift": "Up Shift", - "antenatal": "Antenatal", - "phone_no": "Phone no.", - "patient_name": "Patient name", - "disease_status": "Disease status", - "breathlessness_level": "Breathlessness level", - "assigned_facility": "Facility assigned", - "origin_facility": "Current facility", - "shifting_approval_facility": "Shifting approval facility", + "see_attachments": "See Attachments", + "select": "Select", + "select_date": "Select date", + "select_eligible_policy": "Select an Eligible Insurance Policy", + "select_facility_for_discharged_patients_warning": "Facility needs to be selected to view discharged patients.", + "select_for_administration": "Select for Administration", + "select_groups": "Select Groups", + "select_investigation": "Select Investigations (all investigations will be selected by default)", + "select_investigation_groups": "Select Investigation Groups", + "select_investigations": "Select Investigations", + "select_local_body": "Select Local Body", + "select_policy": "Select an Insurance Policy", + "select_policy_to_add_items": "Select a Policy to Add Items", + "select_skills": "Select and add some skills", + "select_wards": "Select wards", + "send_email": "Send Email", + "send_message": "Send Message", + "send_reset_link": "Send Reset Link", + "serial_number": "Serial Number", + "serviced_on": "Serviced on", + "session_expired": "Session Expired", + "session_expired_msg": "It appears that your session has expired. This could be due to inactivity. Please login again to continue.", + "set_average_weekly_working_hours_for": "Set Average weekly working hours for", + "set_your_local_language": "Set your local language", + "settings_and_filters": "Settings and Filters", + "severity_of_breathlessness": "Severity of Breathlessness", + "shift_request_updated_successfully": "Shift request updated successfully", "shifting": "Shifting", - "search_patient": "Search Patient", - "list_view": "List View", - "comment_min_length": "Comment Should Contain At Least 1 Character", - "comment_added_successfully": "Comment added successfully", - "post_your_comment": "Post Your Comment", + "shifting_approval_facility": "Shifting approval facility", "shifting_approving_facility": "Shifting approving facility", - "is_emergency_case": "Is emergency case", - "is_upshift_case": "Is upshift case", - "is_antenatal": "Is Antenatal", - "patient_phone_number": "Patient Phone Number", - "created_date": "Created Date", - "modified_date": "Modified Date", - "no_patients_to_show": "No patients to show.", - "shifting_status": "Shifting status", - "transfer_to_receiving_facility": "Transfer to receiving facility", - "confirm_transfer_complete": "Confirm Transfer Complete!", - "mark_transfer_complete_confirmation": "Are you sure you want to mark this transfer as complete? The Origin facility will no longer have access to this patient", - "board_view": "Board View", + "shifting_approving_facility_can_not_be_empty": "Shifting approving facility can not be empty.", "shifting_deleted": "Shifting record has been deleted successfully.", - "details_of_shifting_approving_facility": "Details of shifting approving facility", - "details_of_assigned_facility": "Details of assigned facility", - "details_of_origin_facility": "Details of origin facility", - "details_of_patient": "Details of patient", - "record_delete_confirm": "Are you sure you want to delete this record?", - "phone_number_at_current_facility": "Phone Number of Contact person at current Facility", - "authorize_shift_delete": "Authorize shift delete", - "delete_record": "Delete Record", - "severity_of_breathlessness": "Severity of Breathlessness", - "facility_preference": "Facility preference", - "vehicle_preference": "Vehicle preference", - "is_up_shift": "Is up shift", - "ambulance_driver_name": "Name of ambulance driver", - "ambulance_phone_number": "Phone number of Ambulance", - "ambulance_number": "Ambulance No", - "is_emergency": "Is emergency", - "contact_person_at_the_facility": "Contact person at the current facility", - "update_status_details": "Update Status/Details", "shifting_details": "Shifting details", - "auto_generated_for_care": "Auto Generated for Care", - "approved_by_district_covid_control_room": "Approved by District COVID Control Room", - "treatment_summary": "Treatment Summary", - "reason_for_referral": "Reason for referral", - "referred_to": "Referred to", - "covid_19_cat_gov": "Covid_19 Clinical Category as per Govt. of Kerala guideline (A/B/C)", - "district_program_management_supporting_unit": "District Program Management Supporting Unit", - "name_of_hospital": "Name of Hospital", - "passport_number": "Passport Number", + "shifting_status": "Shifting status", + "show_all": "Show all", + "show_all_notifications": "Show All", + "show_default_presets": "Show Default Presets", + "show_patient_presets": "Show Patient Presets", + "show_unread_notifications": "Show Unread", + "sign_out": "Sign Out", + "skills": "Skills", + "socioeconomic_status": "Socioeconomic status", + "software_update": "Software Update", + "something_went_wrong": "Something went wrong..!", + "something_wrong": "Something went wrong! Try again later!", + "sort_by": "Sort By", + "source": "Source", + "spokes": "Spoke Facilities", + "srf_id": "SRF ID", + "staff_list": "Staff List", + "start_dosage": "Start Dosage", + "state": "State", + "status": "Status", + "stop": "Stop", + "stream_stop_due_to_inativity": "The live feed will stop streaming due to inactivity", + "stream_stopped_due_to_inativity": "The live feed has stopped streaming due to inactivity", + "sub_category": "Sub Category", + "submit": "Submit", + "submitting": "Submitting", + "subscribe": "Subscribe", + "subscribe_on_this_device": "Subscribe on this device", + "subscription_error": "Subscription Error", + "suggested_investigations": "Suggested Investigations", + "summary": "Summary", + "support": "Support", + "switch": "Switch", + "systolic": "Systolic", + "tachycardia": "Tachycardia", + "target_dosage": "Target Dosage", "test_type": "Type of test done", - "medical_worker": "Medical Worker", - "error_deleting_shifting": "Error while deleting Shifting record", + "titrate_dosage": "Titrate Dosage", + "to_be_conducted": "To be conducted", + "total_amount": "Total Amount", + "total_beds": "Total Beds", + "total_users": "Total Users", + "transfer_in_progress": "TRANSFER IN PROGRESS", + "transfer_to_receiving_facility": "Transfer to receiving facility", + "travel_within_last_28_days": "Domestic/international Travel (within last 28 days)", + "treating_doctor": "Treating Doctor", + "treatment_summary": "Treatment Summary", + "treatment_summary__head_title": "Treatment Summary", + "treatment_summary__heading": "INTERIM TREATMENT SUMMARY", + "treatment_summary__print": "Print Treatment Summary", + "try_again_later": "Try again later!", "type_any_extra_comments_here": "type any extra comments here", + "type_b_cylinders": "B Type Cylinders", + "type_c_cylinders": "C Type Cylinders", + "type_d_cylinders": "D Type Cylinders", + "type_to_search": "Type to search", + "type_your_comment": "Type your comment", "type_your_reason_here": "Type your reason here", - "reason_for_shift": "Reason for shift", - "preferred_facility_type": "Preferred Facility Type", - "preferred_vehicle": "Preferred Vehicle", - "is_it_upshift": "is it upshift", - "is_this_an_upshift": "Is this an upshift?", - "is_this_an_emergency": "Is this an emergency?", - "what_facility_assign_the_patient_to": "What facility would you like to assign the patient to", - "name_of_shifting_approving_facility": "Name of shifting approving facility", + "unconfirmed": "Unconfirmed", + "unique_id": "Unique Id", + "unknown": "Unknown", + "unsubscribe": "Unsubscribe", + "unsubscribe_failed": "Unsubscribe failed.", + "unsupported_browser": "Unsupported Browser", + "unsupported_browser_description": "Your browser ({{name}} version {{version}}) is not supported. Please update your browser to the latest version or switch to a supported browser for the best experience.", + "up": "Up", + "up_shift": "Up Shift", + "update": "Update", + "update_asset": "Update Asset", + "update_asset_service_record": "Update Asset Service Record", + "update_available": "Update Available", + "update_bed": "Update Bed", + "update_facility": "Update Facility", + "update_facility_middleware_success": "Facility middleware updated successfully", + "update_log": "Update Log", + "update_record": "Update Record", + "update_record_for_asset": "Update record for asset", "update_shift_request": "Update Shift Request", - "shift_request_updated_successfully": "Shift request updated successfully", - "please_enter_a_reason_for_the_shift": "Please enter a reason for the shift.", - "please_select_preferred_vehicle_type": "Please select Preferred Vehicle Type", - "please_select_facility_type": "Please select Facility Type", - "please_select_breathlessness_level": "Please select Breathlessness Level", - "please_select_a_facility": "Please select a facility", - "please_select_status": "Please select Status", - "please_select_patient_category": "Please select Patient Category", - "shifting_approving_facility_can_not_be_empty": "Shifting approving facility can not be empty.", - "redirected_to_create_consultation": "Note: You will be redirected to create consultation form. Please complete the form to finish the transfer process", - "mark_this_transfer_as_complete_question": "Are you sure you want to mark this transfer as complete? The Origin facility will no longer have access to this patient", - "transfer_in_progress": "TRANSFER IN PROGRESS", - "patient_state": "Patient State", - "yet_to_be_decided": "Yet to be decided", - "awaiting_destination_approval": "AWAITING DESTINATION APPROVAL", + "update_status_details": "Update Status/Details", + "updated": "Updated", + "updating": "Updating", + "upload": "Upload", + "upload_an_image": "Upload an image", + "upload_headings__consultation": "Upload New Consultation File", + "upload_headings__patient": "Upload New Patient File", + "upload_headings__sample_report": "Upload Sample Report", + "upload_headings__supporting_info": "Upload Supporting Info", + "uploading": "Uploading", + "user_deleted_successfuly": "User Deleted Successfuly", "user_management": "User Management", - "facilities": "Facilities", - "add_new_user": "Add New User", - "no_users_found": "No Users Found", - "home_facility": "Home Facility", - "no_home_facility": "No home facility assigned", - "clear_home_facility": "Clear Home Facility", - "linked_facilities": "Linked Facilities", - "no_linked_facilities": "No Linked Facilities", - "average_weekly_working_hours": "Average weekly working hours", - "set_average_weekly_working_hours_for": "Set Average weekly working hours for", - "search_by_username": "Search by username", - "last_online": "Last Online", - "total_users": "Total Users", - "covid_19_death_reporting_form_1": "Covid-19 Death Reporting : Form 1", - "is_declared_positive": "Whether declared positive", - "date_declared_positive": "Date of declaring positive", - "date_of_result": "Covid confirmation date", - "is_vaccinated": "Whether vaccinated", - "resource_origin_facility": "Origin Facility", - "resource_approving_facility": "Resource approving facility", - "consultation_not_filed": "You have not filed any consultation for this patient yet.", - "consultation_not_filed_description": "Please file a consultation for this patient to continue.", - "create_consultation": "Create Consultation", - "patient_details": "Patient Details", + "username": "Username", + "users": "Users", + "vehicle_preference": "Vehicle preference", + "vendor_name": "Vendor Name", + "video_conference_link": "Video Conference Link", + "view": "View", + "view_abdm_records": "View ABDM Records", + "view_asset": "View Assets", + "view_details": "View Details", + "view_faciliy": "View Facility", + "view_patients": "View Patients", + "view_users": "View Users", + "virtual_nursing_assistant": "Virtual Nursing Assistant", + "vitals": "Vitals", + "ward": "Ward", + "warranty_amc_expiry": "Warranty / AMC Expiry", + "what_facility_assign_the_patient_to": "What facility would you like to assign the patient to", + "whatsapp_number": "Whatsapp Number", + "why_the_asset_is_not_working": "Why the asset is not working?", "width": "Width ({{unit}})", - "length": "Length ({{unit}})", + "working_status": "Working Status", "years": "years", - "investigation_report": "Investigation Report", - "expand_sidebar": "Expand Sidebar", - "collapse_sidebar": "Collapse Sidebar", - "linked_skills": "Linked Skills" -} \ No newline at end of file + "years_of_experience": "Years of Experience", + "years_of_experience_of_the_doctor": "Years of Experience of the Doctor", + "yes": "Yes", + "yet_to_be_decided": "Yet to be decided", + "you_need_at_least_a_location_to_create_an_assest": "You need at least a location to create an assest.", + "zoom_in": "Zoom In", + "zoom_out": "Zoom Out" +} diff --git a/src/Locale/hi.json b/src/Locale/hi.json index 4844a2d787d..93d9ef32f34 100644 --- a/src/Locale/hi.json +++ b/src/Locale/hi.json @@ -1,813 +1,813 @@ { - "create_asset": "संपत्ति बनाएं", - "edit_history": "इतिहास संपादित करें", - "update_record_for_asset": "संपत्ति के लिए रिकॉर्ड अपडेट करें", - "edited_on": "संपादित किया गया", - "edited_by": "द्वारा संपादित", - "serviced_on": "सेवा पर", - "notes": "नोट्स", - "back": "पीछे", - "close": "बंद करना", - "update_asset_service_record": "एसेट सेवा रिकॉर्ड अपडेट करें", - "eg_details_on_functionality_service_etc": "उदाहरणार्थ, कार्यक्षमता, सेवा आदि का विवरण।", - "updating": "अद्यतन करने", - "update": "अद्यतन", - "are_you_still_watching": "क्या आप अभी भी देख रहे हैं?", - "stream_stop_due_to_inativity": "निष्क्रियता के कारण लाइव फ़ीड स्ट्रीमिंग बंद हो जाएगी", - "stream_stopped_due_to_inativity": "निष्क्रियता के कारण लाइव फ़ीड की स्ट्रीमिंग बंद हो गई है", - "continue_watching": "देखना जारी रखें", - "resume": "फिर शुरू करना", - "username": "उपयोगकर्ता नाम", - "password": "पासवर्ड", - "new_password": "नया पासवर्ड", - "confirm_password": "पासवर्ड की पुष्टि कीजिये", - "first_name": "पहला नाम", - "last_name": "उपनाम", - "email": "मेल पता", - "phone_number": "फ़ोन नंबर", - "district": "ज़िला", - "gender": "लिंग", - "age": "आयु", - "login": "लॉग इन करें", - "password_mismatch": "पासवर्ड और पुष्टि पासवर्ड एक ही होना चाहिए.", - "enter_valid_age": "कृपया वैध आयु दर्ज करें", - "invalid_username": "आवश्यक। 150 अक्षर या उससे कम। केवल अक्षर, अंक और @/./+/-/_।", - "invalid_password": "पासवर्ड आवश्यकताओं को पूरा नहीं करता है", - "invalid_email": "कृपया एक मान्य ईमेल पता प्रविष्ट करें", - "invalid_phone": "कृपया एक वैध नंबर डालें", - "register_hospital": "अस्पताल रजिस्टर करें", - "register_page_title": "अस्पताल प्रशासक के रूप में पंजीकरण करें", - "auth_login_title": "अधिकृत लॉगिन", - "forget_password": "पासवर्ड भूल गए?", - "forget_password_instruction": "अपना उपयोगकर्ता नाम दर्ज करें, और यदि यह मौजूद है, तो हम आपको अपना पासवर्ड रीसेट करने के लिए एक लिंक भेजेंगे।", - "send_reset_link": "रीसेट लिंक भेजें", - "already_a_member": "क्या पहले से ही सदस्य हैं?", - "password_sent": "पासवर्ड रीसेट ईमेल भेजा गया", - "password_reset_success": "पासवर्ड सफलतापूर्वक रीसेट हो गया", - "password_reset_failure": "पासवर्ड रीसेट विफल", - "reset_password": "पासवर्ड रीसेट", - "available_in": "में उपलब्ध", - "sign_out": "साइन आउट", - "back_to_login": "लॉगिन पर वापस जाएं", - "min_password_len_8": "न्यूनतम पासवर्ड लंबाई 8", - "req_atleast_one_digit": "कम से कम एक अंक की आवश्यकता है", - "req_atleast_one_uppercase": "कम से कम एक अपर केस की आवश्यकता है", - "req_atleast_one_lowercase": "कम से कम एक लोअर केस अक्षर की आवश्यकता है", - "req_atleast_one_symbol": "कम से कम एक प्रतीक की आवश्यकता है", - "bed_search_placeholder": "बिस्तर के नाम से खोजें", + "404_message": "ऐसा लगता है कि आप किसी ऐसे पेज पर आ गए हैं जो या तो मौजूद नहीं है या उसे किसी दूसरे URL पर ले जाया गया है। सुनिश्चित करें कि आपने सही लिंक डाला है!", + "AUTOMATED": "स्वचालित", + "Assets": "संपत्ति", "BED_WITH_OXYGEN_SUPPORT": "ऑक्सीजन सपोर्ट वाला बिस्तर", - "REGULAR": "नियमित", + "CONSCIOUSNESS_LEVEL__AGITATED_OR_CONFUSED": "उत्तेजित या भ्रमित", + "CONSCIOUSNESS_LEVEL__ALERT": "चेतावनी", + "CONSCIOUSNESS_LEVEL__ONSET_OF_AGITATION_AND_CONFUSION": "उत्तेजना और भ्रम की शुरुआत", + "CONSCIOUSNESS_LEVEL__RESPONDS_TO_PAIN": "दर्द का जवाब देता है", + "CONSCIOUSNESS_LEVEL__RESPONDS_TO_VOICE": "आवाज़ का जवाब देता है", + "CONSCIOUSNESS_LEVEL__UNRESPONSIVE": "अनुत्तरदायी", + "Cancel": "रद्द करना", + "DD/MM/YYYY": "दिनांक/माह/वर्ष", + "DOCTORS_LOG": "प्रगति नोट", + "Dashboard": "डैशबोर्ड", + "Facilities": "सुविधाएँ", + "GENDER__1": "पुरुष", + "GENDER__2": "महिला", + "GENDER__3": "नॉन-बाइनरी", + "HEARTBEAT_RHYTHM__IRREGULAR": "अनियमित", + "HEARTBEAT_RHYTHM__REGULAR": "नियमित", + "HEARTBEAT_RHYTHM__UNKNOWN": "अज्ञात", "ICU": "आईसीयू", + "INSULIN_INTAKE_FREQUENCY__BD": "दिन में दो बार (बीडी)", + "INSULIN_INTAKE_FREQUENCY__OD": "दिन में एक बार (OD)", + "INSULIN_INTAKE_FREQUENCY__TD": "दिन में तीन बार (टीडी)", + "INSULIN_INTAKE_FREQUENCY__UNKNOWN": "अज्ञात", "ISOLATION": "एकांत", - "add_beds": "बिस्तर(बिस्तर) जोड़ें", - "update_bed": "बिस्तर अपडेट करें", - "bed_type": "बिस्तर का प्रकार", - "make_multiple_beds_label": "क्या आप कई बिस्तर बनाना चाहते हैं?", - "number_of_beds": "बिस्तरों की संख्या", - "number_of_beds_out_of_range_error": "बिस्तरों की संख्या 100 से अधिक नहीं हो सकती", - "goal": "हमारा लक्ष्य डिजिटल उपकरणों का उपयोग करके सार्वजनिक स्वास्थ्य सेवाओं की गुणवत्ता और पहुंच में निरंतर सुधार करना है।", - "something_wrong": "कुछ ग़लत हुआ! बाद में पुनः प्रयास करें!", - "try_again_later": "बाद में पुन: प्रयास!", - "contribute_github": "गिटहब पर योगदान दें", - "footer_body": "ओपन हेल्थकेयर नेटवर्क एक ओपन-सोर्स पब्लिक यूटिलिटी है जिसे इनोवेटर्स और स्वयंसेवकों की एक बहु-विषयक टीम द्वारा डिज़ाइन किया गया है। ओपन हेल्थकेयर नेटवर्क केयर एक डिजिटल पब्लिक गुड है जिसे संयुक्त राष्ट्र द्वारा मान्यता प्राप्त है।", - "reset": "रीसेट करें", - "download": "डाउनलोड करना", - "downloads": "डाउनलोड", - "downloading": "डाउनलोड", - "generating": "उत्पादक", - "send_email": "ईमेल भेजें", - "email_address": "मेल पता", - "email_success": "हम जल्द ही आपको ईमेल भेजेंगे। कृपया अपना इनबॉक्स देखें।", - "disclaimer": "अस्वीकरण", - "category": "वर्ग", - "sub_category": "उप श्रेणी", - "download_type": "डाउनलोड प्रकार", - "state": "राज्य", - "location": "जगह", - "ward": "वार्ड", + "KASP Empanelled": "KASP पैनलबद्ध", + "LIMB_RESPONSE__EXTENSION": "विस्तार", + "LIMB_RESPONSE__FLEXION": "मोड़", + "LIMB_RESPONSE__MODERATE": "मध्यम", + "LIMB_RESPONSE__NONE": "कोई नहीं", + "LIMB_RESPONSE__STRONG": "मज़बूत", + "LIMB_RESPONSE__UNKNOWN": "अज्ञात", + "LIMB_RESPONSE__WEAK": "कमज़ोर", + "NORMAL": "संक्षिप्त अद्यतन", + "NURSING_CARE_PROCEDURE__catheter_care": "कैथेटर देखभाल", + "NURSING_CARE_PROCEDURE__chest_tube_care": "चेस्ट ट्यूब की देखभाल", + "NURSING_CARE_PROCEDURE__dressing": "ड्रेसिंग", + "NURSING_CARE_PROCEDURE__dvt_pump_stocking": "डीवीटी पंप स्टॉकिंग", + "NURSING_CARE_PROCEDURE__iv_sitecare": "IV साइट देखभाल", + "NURSING_CARE_PROCEDURE__nubulisation": "नूबुलाइज़ेशन", + "NURSING_CARE_PROCEDURE__personal_hygiene": "व्यक्तिगत स्वच्छता", + "NURSING_CARE_PROCEDURE__positioning": "पोजिशनिंग", + "NURSING_CARE_PROCEDURE__restrain": "नियंत्रित करना", + "NURSING_CARE_PROCEDURE__ryles_tube_care": "राइल्स ट्यूब केयर", + "NURSING_CARE_PROCEDURE__stoma_care": "स्टोमा देखभाल", + "NURSING_CARE_PROCEDURE__suctioning": "सक्शनिंग", + "NURSING_CARE_PROCEDURE__tracheostomy_care": "ट्रैकियोस्टोमी देखभाल", "Notice Board": "सूचना पट्ट", - "Assets": "संपत्ति", "Notifications": "सूचनाएं", + "OXYGEN_MODALITY__HIGH_FLOW_NASAL_CANNULA": "उच्च प्रवाह नाक प्रवेशनी", + "OXYGEN_MODALITY__NASAL_PRONGS": "नाक के कांटे", + "OXYGEN_MODALITY__NON_REBREATHING_MASK": "नॉन रीब्रीदिंग मास्क", + "OXYGEN_MODALITY__SIMPLE_FACE_MASK": "सरल फेस मास्क", + "PRESCRIPTION_FREQUENCY_BD": "दो बार दैनिक लें", + "PRESCRIPTION_FREQUENCY_HS": "केवल रात्रि", + "PRESCRIPTION_FREQUENCY_OD": "एक बार दैनिक", + "PRESCRIPTION_FREQUENCY_Q4H": "4 घंटे प्रति घंटा", + "PRESCRIPTION_FREQUENCY_QID": "6वाँ प्रति घंटा", + "PRESCRIPTION_FREQUENCY_QOD": "वैकल्पिक दिन", + "PRESCRIPTION_FREQUENCY_QWK": "एक सप्ताह में एक बार", + "PRESCRIPTION_FREQUENCY_STAT": "तुरन्त", + "PRESCRIPTION_FREQUENCY_TID": "8वाँ प्रति घंटा", + "PRESCRIPTION_ROUTE_IM": "मैं हूँ", + "PRESCRIPTION_ROUTE_INHALATION": "साँस लेना", + "PRESCRIPTION_ROUTE_INTRATHECAL": "अंतःकपाल इंजेक्शन", + "PRESCRIPTION_ROUTE_IV": "चतुर्थ", + "PRESCRIPTION_ROUTE_NASOGASTRIC": "नासोगैस्ट्रिक / गैस्ट्रोस्टोमी ट्यूब", + "PRESCRIPTION_ROUTE_ORAL": "मौखिक", + "PRESCRIPTION_ROUTE_RECTAL": "रेक्टल", + "PRESCRIPTION_ROUTE_SC": "अनुसूचित जाति", + "PRESCRIPTION_ROUTE_SUBLINGUAL": "सबलिंगुअल", + "PRESCRIPTION_ROUTE_TRANSDERMAL": "ट्रांसडर्मल", + "PUPIL_REACTION__BRISK": "तेज", + "PUPIL_REACTION__CANNOT_BE_ASSESSED": "मूल्यांकन नहीं किया जा सकता", + "PUPIL_REACTION__FIXED": "तय", + "PUPIL_REACTION__SLUGGISH": "सुस्त", + "PUPIL_REACTION__UNKNOWN": "अज्ञात", + "Patients": "मरीजों", + "Profile": "प्रोफ़ाइल", + "REGULAR": "नियमित", + "RESPIRATORY_SUPPORT_SHORT__INVASIVE": "चतुर्थ", + "RESPIRATORY_SUPPORT_SHORT__NON_INVASIVE": "एनआईवी", + "RESPIRATORY_SUPPORT_SHORT__OXYGEN_SUPPORT": "O2 समर्थन", + "RESPIRATORY_SUPPORT_SHORT__UNKNOWN": "कोई नहीं", + "RESPIRATORY_SUPPORT__INVASIVE": "इनवेसिव वेंटिलेटर (IV)", + "RESPIRATORY_SUPPORT__NON_INVASIVE": "नॉन-इनवेसिव वेंटिलेटर (एनआईवी)", + "RESPIRATORY_SUPPORT__OXYGEN_SUPPORT": "ऑक्सीजन सहायता", + "RESPIRATORY_SUPPORT__UNKNOWN": "कोई नहीं", + "Resource": "संसाधन", + "SORT_OPTIONS__-bed__name": "बिस्तर संख्या एन-1", + "SORT_OPTIONS__-category_severity": "सर्वोच्च गंभीरता श्रेणी पहले", + "SORT_OPTIONS__-created_date": "नवीनतम निर्माण तिथि पहले", + "SORT_OPTIONS__-modified_date": "नवीनतम अद्यतन तिथि पहले", + "SORT_OPTIONS__-name": "मरीज का नाम ZA", + "SORT_OPTIONS__-review_time": "नवीनतम समीक्षा तिथि पहले", + "SORT_OPTIONS__-taken_at": "नवीनतम ली गई तिथि पहले", + "SORT_OPTIONS__bed__name": "बिस्तर नं. 1-एन", + "SORT_OPTIONS__category_severity": "सबसे कम गंभीरता वाली श्रेणी पहले", + "SORT_OPTIONS__created_date": "सबसे पुरानी निर्माण तिथि पहले", + "SORT_OPTIONS__facility__name,-last_consultation__current_bed__bed__name": "बिस्तर संख्या एन-1", + "SORT_OPTIONS__facility__name,last_consultation__current_bed__bed__name": "बिस्तर नं. 1-एन", + "SORT_OPTIONS__modified_date": "सबसे पुरानी अद्यतन तिथि पहले", + "SORT_OPTIONS__name": "मरीज़ का नाम AZ", + "SORT_OPTIONS__review_time": "सबसे पुरानी समीक्षा तिथि पहले", + "SORT_OPTIONS__taken_at": "सबसे पुरानी ली गई तारीख पहले", + "Sample Test": "नमूना परीक्षण", + "Shifting": "स्थानांतरण", "Submit": "जमा करना", - "Cancel": "रद्द करना", - "powered_by": "द्वारा संचालित", - "care": "देखभाल", - "something_went_wrong": "कुछ गलत हो गया..!", - "stop": "रुकना", - "record": "ऑडियो रिकॉर्ड करें", - "recording": "रिकॉर्डिंग", - "yes": "हाँ", - "no": "नहीं", - "status": "स्थिति", - "created": "बनाया था", - "modified": "संशोधित", - "updated": "अद्यतन", - "configure": "कॉन्फ़िगर", - "assigned_to": "को सौंपना", - "cancel": "रद्द करना", - "clear": "स्पष्ट", - "apply": "आवेदन करना", - "filter_by": "फिल्टर के द्वारा", - "filter": "फ़िल्टर", - "settings_and_filters": "सेटिंग्स और फ़िल्टर", - "ordering": "आदेश", - "international_mobile": "अंतर्राष्ट्रीय मोबाइल", - "indian_mobile": "भारतीय मोबाइल", - "mobile": "गतिमान", - "landline": "भारतीय लैंडलाइन", - "support": "सहायता", - "emergency_contact_number": "आपातकालीन संपर्क नंबर", - "last_modified": "अंतिम संशोधित", - "patient_address": "मरीज का पता", - "all_details": "सभी विवरण", - "confirm": "पुष्टि करना", - "refresh_list": "सूची रीफ़्रेश करें", - "last_edited": "अंतिम बार संपादित", - "audit_log": "ऑडिट लॉग", - "comments": "टिप्पणियाँ", - "contact_person_number": "संपर्क व्यक्ति संख्या", - "referral_letter": "रेफरल पत्र", - "print": "छाप", - "print_referral_letter": "रेफरल पत्र प्रिंट करें", - "date_of_positive_covid_19_swab": "कोविड 19 स्वैब पॉजिटिव होने की तिथि", - "patient_no": "ओपी/आईपी संख्या", - "date_of_admission": "प्रवेश की तिथि", - "india_1": "भारत", - "unique_id": "अनोखा ID", - "date_and_time": "तिथि और समय", - "facility_type": "सुविधा का प्रकार", - "number_of_chronic_diseased_dependents": "दीर्घकालिक रोग से पीड़ित आश्रितों की संख्या", - "number_of_aged_dependents_above_60": "वृद्ध आश्रितों की संख्या (60 से अधिक)", - "ongoing_medications": "चल रही दवाएँ", - "countries_travelled": "यात्रा किये गए देश", - "travel_within_last_28_days": "घरेलू/अंतर्राष्ट्रीय यात्रा (पिछले 28 दिनों के भीतर)", - "estimated_contact_date": "अनुमानित संपर्क तिथि", - "blood_group": "ब्लड ग्रुप", - "date_of_birth": "जन्म तिथि", - "date_of_test": "परीक्षण की तिथि", - "srf_id": "एसआरएफ आईडी", - "contact_number": "संपर्क संख्या", - "diagnosis": "निदान", - "copied_to_clipboard": "क्लिपबोर्ड पर कॉपी किया गया", - "is": "है", - "reason": "कारण", - "description": "विवरण", - "name": "नाम", - "address": "पता", - "phone": "फ़ोन", - "nationality": "राष्ट्रीयता", - "allergies": "एलर्जी", - "type_your_comment": "अपनी टिप्पणी लिखें", - "any_other_comments": "कोई अन्य टिप्पणी", - "loading": "लोड हो रहा है...", - "facility": "सुविधा", - "local_body": "स्थानीय निकाय", - "filters": "फिल्टर", - "unknown": "अज्ञात", + "TELEMEDICINE": "सुदूर", + "Users": "उपयोगकर्ताओं", + "VENTILATOR": "विस्तृत अद्यतन", + "VENTILATOR_MODE__CMV": "मैकेनिकल वेंटिलेशन (CMV) को नियंत्रित करें", + "VENTILATOR_MODE__PCV": "दबाव नियंत्रण वेंटिलेशन (पीसीवी)", + "VENTILATOR_MODE__PC_SIMV": "दबाव नियंत्रित SIMV (PC-SIMV)", + "VENTILATOR_MODE__PSV": "सी-पीएपी / प्रेशर सपोर्ट वेंटिलेशन (पीएसवी)", + "VENTILATOR_MODE__SIMV": "समकालिक आंतरायिक अनिवार्य वेंटिलेशन (एसआईएमवी)", + "VENTILATOR_MODE__VCV": "वॉल्यूम नियंत्रण वेंटिलेशन (VCV)", + "VENTILATOR_MODE__VC_SIMV": "वॉल्यूम नियंत्रित SIMV (VC-SIMV)", + "View Facility": "सुविधा देखें", + "action_irreversible": "यह क्रिया अपरिवर्तनीय है", "active": "सक्रिय", - "completed": "पुरा होना।", - "on": "पर", - "open": "खुला", - "features": "विशेषताएँ", - "pincode": "पिनकोड", - "required": "आवश्यक", - "field_required": "यह फ़ील्ड आवश्यक है", - "litres": "लीटर", - "litres_per_day": "लीटर/दिन", - "invalid_pincode": "अमान्य पिनकोड", - "invalid_phone_number": "अमान्य फ़ोन नंबर", - "latitude_invalid": "अक्षांश -90 और 90 के बीच होना चाहिए", - "longitude_invalid": "देशांतर -180 और 180 के बीच होना चाहिए", - "save": "बचाना", - "continue": "जारी रखना", - "save_and_continue": "सहेजें और जारी रखें", - "select": "चुनना", - "lsg": "एलएसजी", - "delete": "मिटाना", - "remove": "निकालना", - "max_size_for_image_uploaded_should_be": "अपलोड की गई छवि का अधिकतम आकार होना चाहिए", - "allowed_formats_are": "स्वीकृत प्रारूप हैं", - "recommended_aspect_ratio_for": "इसके लिए अनुशंसित पहलू अनुपात", - "drag_drop_image_to_upload": "अपलोड करने के लिए छवि को खींचें और छोड़ें", - "upload_an_image": "एक छवि अपलोड करें", - "upload": "अपलोड करें", - "uploading": "अपलोड हो रहा है", - "switch": "बदलना", - "capture": "कब्जा", - "retake": "फिर से लेना", - "submit": "जमा करना", - "camera": "कैमरा", - "camera_permission_denied": "कैमरा अनुमति नहीं दी गई", - "submitting": "भेजने से", - "view_details": "विवरण देखें", - "type_to_search": "खोजने के लिए टाइप करें", - "show_all": "सब दिखाएं", - "hide": "छिपाना", - "select_skills": "कुछ कौशल चुनें और जोड़ें", - "contact_your_admin_to_add_skills": "कौशल जोड़ने के लिए अपने व्यवस्थापक से संपर्क करें", + "active_prescriptions": "सक्रिय नुस्खे", "add": "जोड़ना", "add_as": "के रूप में जोड़ें", - "sort_by": "इसके अनुसार क्रमबद्ध करें", - "none": "कोई नहीं", - "choose_file": "डिवाइस से अपलोड करें", - "open_camera": "कैमरा खोलें", - "file_preview": "फ़ाइल पूर्वावलोकन", - "file_preview_not_supported": "इस फ़ाइल का पूर्वावलोकन नहीं किया जा सकता। इसे डाउनलोड करने का प्रयास करें।", - "view_faciliy": "सुविधा देखें", - "view_patients": "मरीज़ देखें", - "frequency": "आवृत्ति", - "days": "दिन", - "never": "कभी नहीं", + "add_beds": "बिस्तर(बिस्तर) जोड़ें", + "add_details_of_patient": "मरीज़ का विवरण जोड़ें", + "add_location": "स्थान जोड़ना", + "add_new_user": "नई उपयोगकर्ता को जोड़ना", "add_notes": "नोट्स जोड़ें", - "notes_placeholder": "अपने नोट्स लिखें", - "optional": "वैकल्पिक", - "discontinue": "बंद", - "discontinued": "बंद", - "not_specified": "निर्दिष्ट नहीं है", + "add_prescription_medication": "प्रिस्क्रिप्शन दवा जोड़ें", + "add_prescription_to_consultation_note": "इस परामर्श में एक नया नुस्खा जोड़ें।", + "add_prn_prescription": "PRN प्रिस्क्रिप्शन जोड़ें", + "address": "पता", + "administer": "प्रशासन", + "administer_medicine": "दवाई देना", + "administer_medicines": "दवाइयाँ दें", + "administer_selected_medicines": "चयनित दवाएँ दें", + "administered_on": "प्रशासित", + "administration_dosage_range_error": "खुराक प्रारंभिक और लक्ष्य खुराक के बीच होनी चाहिए", + "administration_notes": "प्रशासन नोट्स", + "advanced_filters": "उन्नत फ़िल्टर", + "age": "आयु", "all_changes_have_been_saved": "सभी परिवर्तन सहेज लिए गए हैं", - "no_data_found": "डाटा प्राप्त नहीं हुआ", - "edit": "संपादन करना", - "clear_selection": "चयन साफ़ करें", - "select_date": "तारीख़ चुनें", - "DD/MM/YYYY": "दिनांक/माह/वर्ष", - "clear_all_filters": "सभी फ़िल्टर साफ़ करें", - "summary": "सारांश", - "report": "प्रतिवेदन", - "treating_doctor": "इलाज करने वाला डॉक्टर", - "ration_card__NO_CARD": "गैर-कार्ड धारक", - "ration_card__BPL": "गरीबी रेखा से नीचे", - "ration_card__APL": "एपीएल", - "empty_date_time": "--:-- --; --/--/----", - "caution": "सावधानी", - "feed_optimal_experience_for_phones": "सर्वोत्तम दृश्य अनुभव के लिए, अपने डिवाइस को घुमाने पर विचार करें।", - "feed_optimal_experience_for_apple_phones": "बेहतरीन दृश्य अनुभव के लिए, अपने डिवाइस को घुमाने पर विचार करें। सुनिश्चित करें कि आपके डिवाइस की सेटिंग में ऑटो-रोटेट सक्षम है।", - "action_irreversible": "यह क्रिया अपरिवर्तनीय है", - "GENDER__1": "पुरुष", - "GENDER__2": "महिला", - "GENDER__3": "नॉन-बाइनरी", - "normal": "सामान्य", - "done": "हो गया", - "view": "देखना", - "rename": "नाम बदलें", - "more_info": "और जानकारी", + "all_details": "सभी विवरण", + "allergies": "एलर्जी", + "allowed_formats_are": "स्वीकृत प्रारूप हैं", + "already_a_member": "क्या पहले से ही सदस्य हैं?", + "ambulance_driver_name": "एम्बुलेंस चालक का नाम", + "ambulance_number": "एम्बुलेंस नं.", + "ambulance_phone_number": "एम्बुलेंस का फ़ोन नंबर", + "antenatal": "उत्पत्ति के पूर्व का", + "any_other_comments": "कोई अन्य टिप्पणी", + "apply": "आवेदन करना", + "approved_by_district_covid_control_room": "जिला कोविड नियंत्रण कक्ष द्वारा अनुमोदित", + "approving_facility": "अनुमोदन सुविधा का नाम", "archive": "पुरालेख", - "discard": "खारिज करना", - "live": "रहना", - "discharged": "छुट्टी दे दी गई", "archived": "संग्रहीत", - "no_changes_made": "कोई परिवर्तन नहीं किया गया", - "user_deleted_successfuly": "उपयोगकर्ता सफलतापूर्वक हटा दिया गया", - "users": "उपयोगकर्ताओं", + "are_you_still_watching": "क्या आप अभी भी देख रहे हैं?", "are_you_sure_want_to_delete": "क्या आप वाकई {{name}}को हटाना चाहते हैं?", - "oxygen_information": "ऑक्सीजन की जानकारी", - "deleted_successfully": "{{name}} सफलतापूर्वक हटा दिया गया", - "delete_item": "{{name}}मिटाएँ", - "unsupported_browser": "असमर्थित ब्राउज़र", - "unsupported_browser_description": "आपका ब्राउज़र ({{name}} संस्करण {{version}}) समर्थित नहीं है। कृपया अपने ब्राउज़र को नवीनतम संस्करण में अपडेट करें या सर्वोत्तम अनुभव के लिए समर्थित ब्राउज़र पर स्विच करें।", - "SORT_OPTIONS__-created_date": "नवीनतम निर्माण तिथि पहले", - "SORT_OPTIONS__created_date": "सबसे पुरानी निर्माण तिथि पहले", - "SORT_OPTIONS__-category_severity": "सर्वोच्च गंभीरता श्रेणी पहले", - "SORT_OPTIONS__category_severity": "सबसे कम गंभीरता वाली श्रेणी पहले", - "SORT_OPTIONS__-modified_date": "नवीनतम अद्यतन तिथि पहले", - "SORT_OPTIONS__modified_date": "सबसे पुरानी अद्यतन तिथि पहले", - "SORT_OPTIONS__facility__name,last_consultation__current_bed__bed__name": "बिस्तर नं. 1-एन", - "SORT_OPTIONS__facility__name,-last_consultation__current_bed__bed__name": "बिस्तर संख्या एन-1", - "SORT_OPTIONS__-review_time": "नवीनतम समीक्षा तिथि पहले", - "SORT_OPTIONS__review_time": "सबसे पुरानी समीक्षा तिथि पहले", - "SORT_OPTIONS__taken_at": "सबसे पुरानी ली गई तारीख पहले", - "SORT_OPTIONS__-taken_at": "नवीनतम ली गई तिथि पहले", - "SORT_OPTIONS__name": "मरीज़ का नाम AZ", - "SORT_OPTIONS__-name": "मरीज का नाम ZA", - "SORT_OPTIONS__bed__name": "बिस्तर नं. 1-एन", - "SORT_OPTIONS__-bed__name": "बिस्तर संख्या एन-1", - "middleware_hostname": "मिडलवेयर होस्टनाम", - "local_ipaddress": "स्थानीय आईपी पता", - "no_consultation_updates": "कोई परामर्श अपडेट नहीं", - "consultation_updates": "परामर्श अद्यतन", - "update_log": "लॉग अपडेट करें", - "record_updates": "रिकॉर्ड अपडेट", - "log_lab_results": "लॉग लैब परिणाम", - "no_log_update_delta": "पिछले लॉग अद्यतन के बाद से कोई परिवर्तन नहीं", - "virtual_nursing_assistant": "वर्चुअल नर्सिंग सहायक", - "discharge": "स्राव होना", - "discharge_summary": "डिस्चार्ज सारांश", - "discharge_from_care": "CARE से छुट्टी", - "generating_discharge_summary": "डिस्चार्ज सारांश तैयार करना", - "discharge_summary_not_ready": "डिस्चार्ज सारांश अभी तैयार नहीं है.", - "download_discharge_summary": "डिस्चार्ज सारांश डाउनलोड करें", - "email_discharge_summary_description": "डिस्चार्ज सारांश प्राप्त करने के लिए अपना वैध ईमेल पता दर्ज करें", - "generated_summary_caution": "यह CARE प्रणाली में प्राप्त जानकारी का उपयोग करके कंप्यूटर द्वारा तैयार किया गया सारांश है।", - "NORMAL": "संक्षिप्त अद्यतन", - "VENTILATOR": "विस्तृत अद्यतन", - "DOCTORS_LOG": "प्रगति नोट", - "AUTOMATED": "स्वचालित", - "TELEMEDICINE": "सुदूर", - "investigations": "जांच", - "search_investigation_placeholder": "खोज जांच और समूह", - "save_investigation": "जांच सहेजें", - "investigation_reports": "जांच रिपोर्ट", - "no_investigation": "कोई जांच रिपोर्ट नहीं मिली", - "investigations_suggested": "सुझाए गए जांच", - "to_be_conducted": "संचालित किया जाना है", - "log_report": "लॉग रिपोर्ट", - "no_investigation_suggestions": "कोई जांच सुझाव नहीं", - "select_investigation": "जांच का चयन करें (सभी जांच डिफ़ॉल्ट रूप से चयनित होंगी)", - "select_investigations": "जांच का चयन करें", - "get_tests": "टेस्ट प्राप्त करें", - "select_investigation_groups": "जांच समूह चुनें", - "select_groups": "समूह चुनें", - "generate_report": "रिपोर्ट तैयार करें", - "prev_sessions": "पिछले सत्र", - "next_sessions": "अगले सत्र", - "no_changes": "कोई परिवर्तन नहीं", - "back_to_consultation": "परामर्श पर वापस जाएँ", - "no_treating_physicians_available": "इस सुविधा में कोई होम फैसिलिटी डॉक्टर नहीं है। कृपया अपने एडमिन से संपर्क करें।", - "encounter_suggestion_edit_disallowed": "संपादन परामर्श में इस विकल्प पर स्विच करने की अनुमति नहीं है", - "encounter_suggestion__A": "प्रवेश", - "encounter_suggestion__DC": "घरेलू देखभाल", - "encounter_suggestion__OP": "बाह्य-रोगी दौरा", - "encounter_suggestion__DD": "परामर्श", - "encounter_suggestion__HI": "परामर्श", - "encounter_suggestion__R": "परामर्श", - "encounter_date_field_label__A": "सुविधा में प्रवेश की तिथि और समय", - "encounter_date_field_label__DC": "घरेलू देखभाल प्रारंभ की तिथि और समय", - "encounter_date_field_label__OP": "बाह्य-रोगी दौरे की तिथि और समय", - "encounter_date_field_label__DD": "परामर्श की तिथि एवं समय", - "encounter_date_field_label__HI": "परामर्श की तिथि एवं समय", - "encounter_date_field_label__R": "परामर्श की तिथि एवं समय", + "are_you_sure_want_to_delete_this_record": "क्या आप वाकई इस रिकॉर्ड को हटाना चाहते हैं?", + "asset_class": "परिसंपत्ति वर्ग", + "asset_location": "परिसंपत्ति स्थान", + "asset_name": "संपत्ति का नाम", + "asset_not_found_msg": "ओह! आप जिस संपत्ति की तलाश कर रहे हैं वह मौजूद नहीं है। कृपया संपत्ति आईडी की जाँच करें।", + "asset_qr_id": "एसेट क्यूआर आईडी", + "asset_type": "संपदा प्रकार", + "assigned_facility": "सुविधा सौंपी गई", + "assigned_to": "को सौंपना", + "audio__allow_permission": "कृपया साइट सेटिंग में माइक्रोफ़ोन की अनुमति दें", + "audio__allow_permission_button": "अनुमति देने का तरीका जानने के लिए यहां क्लिक करें", + "audio__allow_permission_helper": "हो सकता है कि आपने पहले भी माइक्रोफ़ोन तक पहुंच से इनकार किया हो.", + "audio__record": "ऑडियो रिकॉर्ड करें", + "audio__record_helper": "रिकॉर्डिंग शुरू करने के लिए बटन पर क्लिक करें", + "audio__recorded": "ऑडियो रिकॉर्ड किया गया", + "audio__recording": "रिकॉर्डिंग", + "audio__recording_helper": "कृपया अपने माइक्रोफ़ोन में बोलें.", + "audio__recording_helper_2": "रिकॉर्डिंग रोकने के लिए बटन पर क्लिक करें।", + "audio__start_again": "फिर से शुरू करें", + "audit_log": "ऑडिट लॉग", + "auth_login_title": "अधिकृत लॉगिन", + "authorize_shift_delete": "शिफ़्ट डिलीट को अधिकृत करें", + "auto_generated_for_care": "देखभाल के लिए स्वचालित रूप से उत्पन्न", + "available_features": "उपलब्ध सुविधाएँ", + "available_in": "में उपलब्ध", + "average_weekly_working_hours": "औसत साप्ताहिक कार्य घंटे", + "awaiting_destination_approval": "गंतव्य अनुमोदन की प्रतीक्षा में", + "back": "पीछे", "back_dated_encounter_date_caution": "आप एक मुठभेड़ बना रहे हैं", - "encounter_duration_confirmation": "इस मुठभेड़ की अवधि होगी", - "consultation_notes": "सामान्य निर्देश (सलाह)", - "procedure_suggestions": "प्रक्रिया सुझाव", - "edit_cover_photo": "कवर फ़ोटो संपादित करें", - "no_cover_photo_uploaded_for_this_facility": "इस सुविधा के लिए कोई कवर फ़ोटो अपलोड नहीं किया गया", + "back_to_consultation": "परामर्श पर वापस जाएँ", + "back_to_login": "लॉगिन पर वापस जाएं", + "base_dosage": "मात्रा बनाने की विधि", + "bed_capacity": "बिस्तर क्षमता", + "bed_search_placeholder": "बिस्तर के नाम से खोजें", + "bed_type": "बिस्तर का प्रकार", + "blood_group": "ब्लड ग्रुप", + "board_view": "बोर्ड दृश्य", + "bradycardia": "मंदनाड़ी", + "breathlessness_level": "सांस फूलने का स्तर", + "camera": "कैमरा", + "camera_permission_denied": "कैमरा अनुमति नहीं दी गई", + "cancel": "रद्द करना", + "capture": "कब्जा", "capture_cover_photo": "कवर फ़ोटो कैप्चर करें", - "diagnoses": "निदान", - "diagnosis_already_added": "यह निदान पहले ही जोड़ दिया गया था", - "principal": "प्रधानाचार्य", - "principal_diagnosis": "मुख्य निदान", - "unconfirmed": "अपुष्ट", - "provisional": "अनंतिम", - "differential": "अंतर", - "confirmed": "की पुष्टि", - "refuted": "का खंडन किया", - "entered-in-error": "त्रुटिवश प्रविष्ट हुआ", - "help_unconfirmed": "इसे एक पुष्ट स्थिति मानने के लिए पर्याप्त नैदानिक और/या नैदानिक साक्ष्य उपलब्ध नहीं हैं।", - "help_provisional": "यह एक अस्थायी निदान है - अभी भी इस पर विचार किया जा रहा है।", - "help_differential": "संभावित (और आमतौर पर परस्पर अनन्य) निदानों के एक समूह में से एक, जो निदान प्रक्रिया और प्रारंभिक उपचार को आगे बढ़ाने के लिए निर्देशित किया जाता है।", - "help_confirmed": "इस स्थिति को पुष्ट मानने के लिए पर्याप्त नैदानिक और/या नैदानिक साक्ष्य मौजूद हैं।", - "help_refuted": "बाद के निदानात्मक और नैदानिक साक्ष्यों से इस स्थिति को खारिज कर दिया गया है।", - "help_entered-in-error": "यह कथन गलती से दर्ज किया गया है और मान्य नहीं है।", - "search_icd11_placeholder": "ICD-11 निदान खोजें", - "icd11_as_recommended": "विश्व स्वास्थ्य संगठन द्वारा अनुशंसित ICD-11 के अनुसार", - "Facilities": "सुविधाएँ", - "Patients": "मरीजों", - "Sample Test": "नमूना परीक्षण", - "Shifting": "स्थानांतरण", - "Resource": "संसाधन", - "Users": "उपयोगकर्ताओं", - "Profile": "प्रोफ़ाइल", - "Dashboard": "डैशबोर्ड", - "return_to_care": "CARE पर वापस लौटें", - "404_message": "ऐसा लगता है कि आप किसी ऐसे पेज पर आ गए हैं जो या तो मौजूद नहीं है या उसे किसी दूसरे URL पर ले जाया गया है। सुनिश्चित करें कि आपने सही लिंक डाला है!", - "error_404": "त्रुटि 404", - "page_not_found": "पृष्ठ नहीं मिला", - "session_expired": "सत्र समाप्त हुआ", - "invalid_password_reset_link": "अमान्य पासवर्ड रीसेट लिंक", - "invalid_link_msg": "ऐसा प्रतीत होता है कि आपने जो पासवर्ड रीसेट लिंक इस्तेमाल किया है वह या तो अमान्य है या उसकी समय-सीमा समाप्त हो चुकी है। कृपया नया पासवर्ड रीसेट लिंक अनुरोध करें।", - "return_to_password_reset": "पासवर्ड रीसेट पर वापस लौटें", - "return_to_login": "लॉगिन पर वापस लौटें", - "session_expired_msg": "ऐसा लगता है कि आपका सत्र समाप्त हो गया है। यह निष्क्रियता के कारण हो सकता है। कृपया जारी रखने के लिए फिर से लॉगिन करें।", - "invalid_reset": "अमान्य रीसेट", - "please_upload_a_csv_file": "कृपया एक CSV फ़ाइल अपलोड करें", - "csv_file_in_the_specified_format": "निर्दिष्ट प्रारूप में CSV फ़ाइल चुनें", - "sample_format": "नमूना प्रारूप", - "search_for_facility": "सुविधा खोजें", - "select_local_body": "स्थानीय निकाय का चयन करें", - "select_wards": "वार्ड चुनें", - "result_date": "परिणाम दिनांक", - "sample_collection_date": "नमूना संग्रहण तिथि", - "record_has_been_deleted_successfully": "रिकार्ड सफलतापूर्वक हटा दिया गया है.", - "error_while_deleting_record": "रिकॉर्ड हटाते समय त्रुटि हुई", - "result_details": "परिणाम विवरण", + "care": "देखभाल", + "category": "वर्ग", + "caution": "सावधानी", + "central_nursing_station": "सेंट्रल नर्सिंग स्टेशन", + "choose_file": "डिवाइस से अपलोड करें", + "choose_location": "स्थान का चयन", + "clear": "स्पष्ट", + "clear_all_filters": "सभी फ़िल्टर साफ़ करें", + "clear_home_facility": "क्लियर होम सुविधा", + "clear_selection": "चयन साफ़ करें", + "close": "बंद करना", + "close_scanner": "स्कैनर बंद करें", + "comment_added_successfully": "टिप्पणी सफलतापूर्वक जोड़ी गई", + "comment_min_length": "टिप्पणी में कम से कम 1 अक्षर होना चाहिए", + "comments": "टिप्पणियाँ", + "completed": "पुरा होना।", + "configure": "कॉन्फ़िगर", + "configure_facility": "सुविधा कॉन्फ़िगर करें", + "confirm": "पुष्टि करना", "confirm_delete": "मिटाने की पुष्टि करें", - "are_you_sure_want_to_delete_this_record": "क्या आप वाकई इस रिकॉर्ड को हटाना चाहते हैं?", - "patient_category": "रोगी श्रेणी", - "source": "स्रोत", - "result": "परिणाम", - "sample_type": "नमूना प्रकार", - "patient_status": "रोगी की स्थिति", - "mobile_number": "मोबाइल नंबर", - "patient_created": "रोगी बनाया गया", - "update_record": "रिकॉर्ड अपडेट करें", - "facility_search_placeholder": "सुविधा / जिला नाम से खोजें", - "advanced_filters": "उन्नत फ़िल्टर", - "facility_name": "सुविधा का नाम", - "KASP Empanelled": "KASP पैनलबद्ध", - "View Facility": "सुविधा देखें", - "no_duplicate_facility": "आपको डुप्लिकेट सुविधाएं नहीं बनानी चाहिए", - "no_facilities": "कोई सुविधा नहीं मिली", - "no_staff": "कोई कर्मचारी नहीं मिला", - "no_bed_types_found": "कोई बिस्तर प्रकार नहीं मिला", - "total_beds": "कुल बिस्तर", + "confirm_discontinue": "बंद करने की पुष्टि करें", + "confirm_password": "पासवर्ड की पुष्टि कीजिये", + "confirm_transfer_complete": "स्थानांतरण पूर्ण होने की पुष्टि करें!", + "confirmed": "की पुष्टि", + "consultation_notes": "सामान्य निर्देश (सलाह)", + "consultation_updates": "परामर्श अद्यतन", + "contact_number": "संपर्क संख्या", + "contact_person": "सुविधा केंद्र पर संपर्क व्यक्ति का नाम", + "contact_person_at_the_facility": "वर्तमान सुविधा पर संपर्क व्यक्ति", + "contact_person_number": "संपर्क व्यक्ति संख्या", + "contact_phone": "संपर्क व्यक्ति संख्या", + "contact_your_admin_to_add_skills": "कौशल जोड़ने के लिए अपने व्यवस्थापक से संपर्क करें", + "continue": "जारी रखना", + "continue_watching": "देखना जारी रखें", + "contribute_github": "गिटहब पर योगदान दें", + "copied_to_clipboard": "क्लिपबोर्ड पर कॉपी किया गया", + "countries_travelled": "यात्रा किये गए देश", + "covid_19_cat_gov": "केरल सरकार के दिशानिर्देश के अनुसार कोविड_19 क्लिनिकल श्रेणी (ए/बी/सी)", + "create": "बनाएं", + "create_add_more": "और अधिक बनाएं और जोड़ें", + "create_asset": "संपत्ति बनाएं", "create_facility": "एक नई सुविधा बनाएं", - "staff_list": "स्टाफ सूची", - "bed_capacity": "बिस्तर क्षमता", - "cylinders": "सिलेंडर", - "cylinders_per_day": "सिलेंडर/दिन", - "liquid_oxygen_capacity": "द्रव ऑक्सीजन क्षमता", - "expected_burn_rate": "अपेक्षित बर्न दर", - "type_b_cylinders": "बी प्रकार सिलेंडर", - "type_c_cylinders": "सी प्रकार सिलेंडर", - "type_d_cylinders": "डी प्रकार सिलेंडर", - "update_asset": "संपत्ति अपडेट करें", "create_new_asset": "नई संपत्ति बनाएं", - "you_need_at_least_a_location_to_create_an_assest": "संपत्ति बनाने के लिए आपको कम से कम एक स्थान की आवश्यकता होगी।", - "add_location": "स्थान जोड़ना", - "close_scanner": "स्कैनर बंद करें", - "scan_asset_qr": "एसेट क्यूआर स्कैन करें!", - "create": "बनाएं", - "asset_name": "संपत्ति का नाम", - "asset_location": "परिसंपत्ति स्थान", - "asset_type": "संपदा प्रकार", - "asset_class": "परिसंपत्ति वर्ग", - "details_about_the_equipment": "उपकरण के बारे में विवरण", - "working_status": "कामकाजी स्थिति", - "why_the_asset_is_not_working": "परिसंपत्ति काम क्यों नहीं कर रही है?", - "describe_why_the_asset_is_not_working": "बताएं कि परिसंपत्ति काम क्यों नहीं कर रही है", - "asset_qr_id": "एसेट क्यूआर आईडी", - "manufacturer": "उत्पादक", - "eg_xyz": "उदाहरण: XYZ", - "eg_abc": "उदाहरण: एबीसी", - "warranty_amc_expiry": "वारंटी / एएमसी समाप्ति", + "create_resource_request": "संसाधन अनुरोध बनाएँ", + "created": "बनाया था", + "created_date": "सृजित दिनांक", + "csv_file_in_the_specified_format": "निर्दिष्ट प्रारूप में CSV फ़ाइल चुनें", + "customer_support_email": "ग्राहक सहायता ईमेल", "customer_support_name": "ग्राहक सहायता नाम", "customer_support_number": "ग्राहक सहायता नंबर", - "customer_support_email": "ग्राहक सहायता ईमेल", - "eg_mail_example_com": "उदाहरण: mail@example.com", - "vendor_name": "विक्रेता का नाम", - "serial_number": "क्रम संख्या", - "last_serviced_on": "अंतिम सेवा कब दी गई", - "create_add_more": "और अधिक बनाएं और जोड़ें", - "discharged_patients": "छुट्टी दिए गए मरीज़", - "discharged_patients_empty": "इस सुविधा में कोई भी डिस्चार्ज मरीज़ मौजूद नहीं है", - "update_facility_middleware_success": "सुविधा मिडलवेयर सफलतापूर्वक अपडेट किया गया", - "treatment_summary__head_title": "उपचार सारांश", - "treatment_summary__print": "प्रिंट उपचार सारांश", - "treatment_summary__heading": "अंतरिम उपचार सारांश", - "patient_registration__name": "नाम", - "patient_registration__address": "पता", - "patient_registration__age": "आयु", - "patient_consultation__op": "सेशन", - "patient_consultation__ip": "आई पी", - "patient_consultation__dc_admission": "घरेलू देखभाल शुरू होने की तिथि", - "patient_consultation__admission": "प्रवेश की तिथि", - "patient_registration__gender": "लिंग", - "patient_registration__contact": "आपातकालीन संपर्क", - "patient_registration__comorbidities": "comorbidities", - "patient_registration__comorbidities__disease": "बीमारी", - "patient_registration__comorbidities__details": "विवरण", - "patient_consultation__consultation_notes": "सामान्य निर्देश", - "patient_consultation__special_instruction": "विशेष निर्देश", - "suggested_investigations": "सुझाए गए जांच", - "investigations__date": "तारीख", - "investigations__name": "नाम", - "investigations__result": "परिणाम", - "investigations__ideal_value": "आदर्श मूल्य", - "investigations__range": "मूल्य पहुंच", - "investigations__unit": "इकाई", - "patient_consultation__treatment__plan": "योजना", - "patient_consultation__treatment__summary": "सारांश", - "patient_consultation__treatment__summary__date": "तारीख", - "patient_consultation__treatment__summary__spo2": "एसपीओ2", - "patient_consultation__treatment__summary__temperature": "तापमान", - "diagnosis__principal": "प्रधानाचार्य", + "cylinders": "सिलेंडर", + "cylinders_per_day": "सिलेंडर/दिन", + "date_and_time": "तिथि और समय", + "date_of_admission": "प्रवेश की तिथि", + "date_of_birth": "जन्म तिथि", + "date_of_positive_covid_19_swab": "कोविड 19 स्वैब पॉजिटिव होने की तिथि", + "date_of_test": "परीक्षण की तिथि", + "days": "दिन", + "delete": "मिटाना", + "delete_facility": "सुविधा हटाएं", + "delete_item": "{{name}}मिटाएँ", + "delete_record": "रिकॉर्ड मिटाएँ", + "deleted_successfully": "{{name}} सफलतापूर्वक हटा दिया गया", + "describe_why_the_asset_is_not_working": "बताएं कि परिसंपत्ति काम क्यों नहीं कर रही है", + "description": "विवरण", + "details_about_the_equipment": "उपकरण के बारे में विवरण", + "details_of_assigned_facility": "निर्दिष्ट सुविधा का विवरण", + "details_of_origin_facility": "मूल सुविधा का विवरण", + "details_of_patient": "मरीज का विवरण", + "details_of_shifting_approving_facility": "स्थानांतरण अनुमोदन सुविधा का विवरण", + "diagnoses": "निदान", + "diagnosis": "निदान", "diagnosis__confirmed": "की पुष्टि", + "diagnosis__differential": "अंतर", + "diagnosis__principal": "प्रधानाचार्य", "diagnosis__provisional": "अनंतिम", "diagnosis__unconfirmed": "अपुष्ट", - "diagnosis__differential": "अंतर", - "active_prescriptions": "सक्रिय नुस्खे", - "prescriptions__medicine": "दवा", - "prescriptions__route": "मार्ग", - "prescriptions__dosage_frequency": "खुराक और आवृत्ति", - "prescriptions__start_date": "निर्धारित", - "select_facility_for_discharged_patients_warning": "छुट्टी दिए गए मरीजों को देखने के लिए सुविधा का चयन किया जाना आवश्यक है।", + "diagnosis_already_added": "यह निदान पहले ही जोड़ दिया गया था", + "diastolic": "डायस्टोलिक", + "differential": "अंतर", + "discard": "खारिज करना", + "discharge": "स्राव होना", + "discharge_from_care": "CARE से छुट्टी", + "discharge_prescription": "डिस्चार्ज प्रिस्क्रिप्शन", + "discharge_summary": "डिस्चार्ज सारांश", + "discharge_summary_not_ready": "डिस्चार्ज सारांश अभी तैयार नहीं है.", + "discharged": "छुट्टी दे दी गई", + "discharged_patients": "छुट्टी दिए गए मरीज़", + "discharged_patients_empty": "इस सुविधा में कोई भी डिस्चार्ज मरीज़ मौजूद नहीं है", + "disclaimer": "अस्वीकरण", + "discontinue": "बंद", + "discontinue_caution_note": "क्या आप वाकई इस नुस्खे को बंद करना चाहते हैं?", + "discontinued": "बंद", + "disease_status": "रोग की स्थिति", + "district": "ज़िला", + "district_program_management_supporting_unit": "जिला कार्यक्रम प्रबंधन सहायक इकाई", + "done": "हो गया", + "dosage": "मात्रा बनाने की विधि", + "down": "नीचे", + "download": "डाउनलोड करना", + "download_discharge_summary": "डिस्चार्ज सारांश डाउनलोड करें", + "download_type": "डाउनलोड प्रकार", + "downloading": "डाउनलोड", + "downloads": "डाउनलोड", + "drag_drop_image_to_upload": "अपलोड करने के लिए छवि को खींचें और छोड़ें", + "duplicate_patient_record_birth_unknown": "यदि आप रोगी के जन्म वर्ष के बारे में निश्चित नहीं हैं तो कृपया अपने जिला देखभाल समन्वयक, स्थानांतरण सुविधा या रोगी से संपर्क करें।", "duplicate_patient_record_confirmation": "जन्म का वर्ष जोड़कर मरीज का रिकॉर्ड अपने अस्पताल में भर्ती करें", "duplicate_patient_record_rejection": "मैं पुष्टि करता हूं कि जिस संदिग्ध/रोगी की सूची मैं बनाना चाहता हूं वह सूची में नहीं है।", - "duplicate_patient_record_birth_unknown": "यदि आप रोगी के जन्म वर्ष के बारे में निश्चित नहीं हैं तो कृपया अपने जिला देखभाल समन्वयक, स्थानांतरण सुविधा या रोगी से संपर्क करें।", - "patient_transfer_birth_match_note": "ध्यान दें: स्थानांतरण अनुरोध पर कार्रवाई करने के लिए जन्म का वर्ष मरीज से मेल खाना चाहिए।", - "available_features": "उपलब्ध सुविधाएँ", - "update_facility": "अद्यतन सुविधा", - "configure_facility": "सुविधा कॉन्फ़िगर करें", - "inventory_management": "सूची प्रबंधन", - "location_management": "स्थान प्रबंधन", - "resource_request": "संसाधन अनुरोध", - "view_asset": "संपत्तियां देखें", - "view_users": "उपयोगकर्ता देखें", - "view_abdm_records": "ABDM रिकॉर्ड देखें", - "delete_facility": "सुविधा हटाएं", - "central_nursing_station": "सेंट्रल नर्सिंग स्टेशन", - "add_details_of_patient": "मरीज़ का विवरण जोड़ें", - "choose_location": "स्थान का चयन", - "live_monitoring": "लाइव मॉनिटरिंग", - "open_live_monitoring": "लाइव मॉनिटरिंग खोलें", - "audio__allow_permission": "कृपया साइट सेटिंग में माइक्रोफ़ोन की अनुमति दें", - "audio__allow_permission_helper": "हो सकता है कि आपने पहले भी माइक्रोफ़ोन तक पहुंच से इनकार किया हो.", - "audio__allow_permission_button": "अनुमति देने का तरीका जानने के लिए यहां क्लिक करें", - "audio__record": "ऑडियो रिकॉर्ड करें", - "audio__record_helper": "रिकॉर्डिंग शुरू करने के लिए बटन पर क्लिक करें", - "audio__recording": "रिकॉर्डिंग", - "audio__recording_helper": "कृपया अपने माइक्रोफ़ोन में बोलें.", - "audio__recording_helper_2": "रिकॉर्डिंग रोकने के लिए बटन पर क्लिक करें।", - "audio__recorded": "ऑडियो रिकॉर्ड किया गया", - "audio__start_again": "फिर से शुरू करें", + "edit": "संपादन करना", + "edit_caution_note": "परामर्श में संपादित विवरण के साथ एक नया नुस्खा जोड़ा जाएगा तथा वर्तमान नुस्खा बंद कर दिया जाएगा।", + "edit_cover_photo": "कवर फ़ोटो संपादित करें", + "edit_history": "इतिहास संपादित करें", + "edit_prescriptions": "नुस्खे संपादित करें", + "edited_by": "द्वारा संपादित", + "edited_on": "संपादित किया गया", + "eg_abc": "उदाहरण: एबीसी", + "eg_details_on_functionality_service_etc": "उदाहरणार्थ, कार्यक्षमता, सेवा आदि का विवरण।", + "eg_mail_example_com": "उदाहरण: mail@example.com", + "eg_xyz": "उदाहरण: XYZ", + "email": "मेल पता", + "email_address": "मेल पता", + "email_discharge_summary_description": "डिस्चार्ज सारांश प्राप्त करने के लिए अपना वैध ईमेल पता दर्ज करें", + "email_success": "हम जल्द ही आपको ईमेल भेजेंगे। कृपया अपना इनबॉक्स देखें।", + "emergency": "आपातकाल", + "emergency_contact_number": "आपातकालीन संपर्क नंबर", + "empty_date_time": "--:-- --; --/--/----", + "encounter_date_field_label__A": "सुविधा में प्रवेश की तिथि और समय", + "encounter_date_field_label__DC": "घरेलू देखभाल प्रारंभ की तिथि और समय", + "encounter_date_field_label__DD": "परामर्श की तिथि एवं समय", + "encounter_date_field_label__HI": "परामर्श की तिथि एवं समय", + "encounter_date_field_label__OP": "बाह्य-रोगी दौरे की तिथि और समय", + "encounter_date_field_label__R": "परामर्श की तिथि एवं समय", + "encounter_duration_confirmation": "इस मुठभेड़ की अवधि होगी", + "encounter_suggestion__A": "प्रवेश", + "encounter_suggestion__DC": "घरेलू देखभाल", + "encounter_suggestion__DD": "परामर्श", + "encounter_suggestion__HI": "परामर्श", + "encounter_suggestion__OP": "बाह्य-रोगी दौरा", + "encounter_suggestion__R": "परामर्श", + "encounter_suggestion_edit_disallowed": "संपादन परामर्श में इस विकल्प पर स्विच करने की अनुमति नहीं है", "enter_file_name": "फ़ाइल का नाम दर्ज करें", - "no_files_found": "कोई {{type}} फ़ाइल नहीं मिली", - "upload_headings__patient": "नई रोगी फ़ाइल अपलोड करें", - "upload_headings__consultation": "नई परामर्श फ़ाइल अपलोड करें", - "upload_headings__sample_report": "नमूना रिपोर्ट अपलोड करें", - "upload_headings__supporting_info": "सहायक जानकारी अपलोड करें", - "file_list_headings__patient": "रोगी फ़ाइलें", - "file_list_headings__consultation": "परामर्श फ़ाइलें", - "file_list_headings__sample_report": "नमूना रिपोर्ट", - "file_list_headings__supporting_info": "सहायक जानकारी", + "enter_valid_age": "कृपया वैध आयु दर्ज करें", + "entered-in-error": "त्रुटिवश प्रविष्ट हुआ", + "error_404": "त्रुटि 404", + "error_deleting_shifting": "शिफ्टिंग रिकॉर्ड हटाते समय त्रुटि", + "error_while_deleting_record": "रिकॉर्ड हटाते समय त्रुटि हुई", + "escape": "पलायन", + "estimated_contact_date": "अनुमानित संपर्क तिथि", + "expected_burn_rate": "अपेक्षित बर्न दर", + "facilities": "सुविधाएँ", + "facility": "सुविधा", + "facility_name": "सुविधा का नाम", + "facility_preference": "सुविधा वरीयता", + "facility_search_placeholder": "सुविधा / जिला नाम से खोजें", + "facility_type": "सुविधा का प्रकार", + "features": "विशेषताएँ", + "feed_is_currently_not_live": "फ़ीड वर्तमान में लाइव नहीं है", + "feed_optimal_experience_for_apple_phones": "बेहतरीन दृश्य अनुभव के लिए, अपने डिवाइस को घुमाने पर विचार करें। सुनिश्चित करें कि आपके डिवाइस की सेटिंग में ऑटो-रोटेट सक्षम है।", + "feed_optimal_experience_for_phones": "सर्वोत्तम दृश्य अनुभव के लिए, अपने डिवाइस को घुमाने पर विचार करें।", + "field_required": "यह फ़ील्ड आवश्यक है", "file_error__choose_file": "कृपया अपलोड करने के लिए कोई फ़ाइल चुनें", + "file_error__dynamic": "फ़ाइल अपलोड करते समय त्रुटि: {{statusText}}", "file_error__file_name": "कृपया फ़ाइल का नाम दर्ज करें", "file_error__file_size": "फ़ाइलों का अधिकतम आकार 100 एमबी है", "file_error__file_type": "अमान्य फ़ाइल प्रकार \".{{extension}}\" स्वीकृत प्रकार: {{allowedExtensions}}", - "file_uploaded": "फ़ाइल सफलतापूर्वक अपलोड की गई", - "file_error__dynamic": "फ़ाइल अपलोड करते समय त्रुटि: {{statusText}}", "file_error__network": "फ़ाइल अपलोड करते समय त्रुटि: नेटवर्क त्रुटि", - "monitor": "निगरानी करना", - "show_default_presets": "डिफ़ॉल्ट प्रीसेट दिखाएं", - "show_patient_presets": "मरीज़ प्रीसेट दिखाएँ", - "moving_camera": "चलता कैमरा", + "file_list_headings__consultation": "परामर्श फ़ाइलें", + "file_list_headings__patient": "रोगी फ़ाइलें", + "file_list_headings__sample_report": "नमूना रिपोर्ट", + "file_list_headings__supporting_info": "सहायक जानकारी", + "file_preview": "फ़ाइल पूर्वावलोकन", + "file_preview_not_supported": "इस फ़ाइल का पूर्वावलोकन नहीं किया जा सकता। इसे डाउनलोड करने का प्रयास करें।", + "file_uploaded": "फ़ाइल सफलतापूर्वक अपलोड की गई", + "filter": "फ़िल्टर", + "filter_by": "फिल्टर के द्वारा", + "filter_by_category": "श्रेणी के अनुसार फ़िल्टर करें", + "filters": "फिल्टर", + "first_name": "पहला नाम", + "footer_body": "ओपन हेल्थकेयर नेटवर्क एक ओपन-सोर्स पब्लिक यूटिलिटी है जिसे इनोवेटर्स और स्वयंसेवकों की एक बहु-विषयक टीम द्वारा डिज़ाइन किया गया है। ओपन हेल्थकेयर नेटवर्क केयर एक डिजिटल पब्लिक गुड है जिसे संयुक्त राष्ट्र द्वारा मान्यता प्राप्त है।", + "forget_password": "पासवर्ड भूल गए?", + "forget_password_instruction": "अपना उपयोगकर्ता नाम दर्ज करें, और यदि यह मौजूद है, तो हम आपको अपना पासवर्ड रीसेट करने के लिए एक लिंक भेजेंगे।", + "frequency": "आवृत्ति", "full_screen": "पूर्ण स्क्रीन", - "feed_is_currently_not_live": "फ़ीड वर्तमान में लाइव नहीं है", - "zoom_out": "ज़ूम आउट", - "zoom_in": "ज़ूम इन", - "right": "सही", + "gender": "लिंग", + "generate_report": "रिपोर्ट तैयार करें", + "generated_summary_caution": "यह CARE प्रणाली में प्राप्त जानकारी का उपयोग करके कंप्यूटर द्वारा तैयार किया गया सारांश है।", + "generating": "उत्पादक", + "generating_discharge_summary": "डिस्चार्ज सारांश तैयार करना", + "get_tests": "टेस्ट प्राप्त करें", + "goal": "हमारा लक्ष्य डिजिटल उपकरणों का उपयोग करके सार्वजनिक स्वास्थ्य सेवाओं की गुणवत्ता और पहुंच में निरंतर सुधार करना है।", + "help_confirmed": "इस स्थिति को पुष्ट मानने के लिए पर्याप्त नैदानिक और/या नैदानिक साक्ष्य मौजूद हैं।", + "help_differential": "संभावित (और आमतौर पर परस्पर अनन्य) निदानों के एक समूह में से एक, जो निदान प्रक्रिया और प्रारंभिक उपचार को आगे बढ़ाने के लिए निर्देशित किया जाता है।", + "help_entered-in-error": "यह कथन गलती से दर्ज किया गया है और मान्य नहीं है।", + "help_provisional": "यह एक अस्थायी निदान है - अभी भी इस पर विचार किया जा रहा है।", + "help_refuted": "बाद के निदानात्मक और नैदानिक साक्ष्यों से इस स्थिति को खारिज कर दिया गया है।", + "help_unconfirmed": "इसे एक पुष्ट स्थिति मानने के लिए पर्याप्त नैदानिक और/या नैदानिक साक्ष्य उपलब्ध नहीं हैं।", + "hide": "छिपाना", + "home_facility": "घर की सुविधा", + "icd11_as_recommended": "विश्व स्वास्थ्य संगठन द्वारा अनुशंसित ICD-11 के अनुसार", + "inconsistent_dosage_units_error": "खुराक इकाइयाँ समान होनी चाहिए", + "india_1": "भारत", + "indian_mobile": "भारतीय मोबाइल", + "indicator": "सूचक", + "inidcator_event": "संकेतक घटना", + "instruction_on_titration": "अनुमापन पर निर्देश", + "international_mobile": "अंतर्राष्ट्रीय मोबाइल", + "invalid_asset_id_msg": "ओह! आपके द्वारा दर्ज की गई संपत्ति आईडी वैध नहीं लगती।", + "invalid_email": "कृपया एक मान्य ईमेल पता प्रविष्ट करें", + "invalid_link_msg": "ऐसा प्रतीत होता है कि आपने जो पासवर्ड रीसेट लिंक इस्तेमाल किया है वह या तो अमान्य है या उसकी समय-सीमा समाप्त हो चुकी है। कृपया नया पासवर्ड रीसेट लिंक अनुरोध करें।", + "invalid_password": "पासवर्ड आवश्यकताओं को पूरा नहीं करता है", + "invalid_password_reset_link": "अमान्य पासवर्ड रीसेट लिंक", + "invalid_phone": "कृपया एक वैध नंबर डालें", + "invalid_phone_number": "अमान्य फ़ोन नंबर", + "invalid_pincode": "अमान्य पिनकोड", + "invalid_reset": "अमान्य रीसेट", + "invalid_username": "आवश्यक। 150 अक्षर या उससे कम। केवल अक्षर, अंक और @/./+/-/_।", + "inventory_management": "सूची प्रबंधन", + "investigation_reports": "जांच रिपोर्ट", + "investigations": "जांच", + "investigations__date": "तारीख", + "investigations__ideal_value": "आदर्श मूल्य", + "investigations__name": "नाम", + "investigations__range": "मूल्य पहुंच", + "investigations__result": "परिणाम", + "investigations__unit": "इकाई", + "investigations_suggested": "सुझाए गए जांच", + "is": "है", + "is_antenatal": "क्या यह प्रसवपूर्व है?", + "is_emergency": "क्या आपातकाल है?", + "is_emergency_case": "क्या यह आपातकालीन मामला है?", + "is_it_upshift": "क्या यह अपशिफ्ट है", + "is_this_an_emergency": "क्या यह आपातकाल है?", + "is_this_an_upshift": "क्या यह एक उन्नति है?", + "is_up_shift": "क्या शिफ्ट चालू है", + "is_upshift_case": "क्या अपशिफ्ट मामला है?", + "landline": "भारतीय लैंडलाइन", + "last_administered": "अंतिम प्रशासित", + "last_edited": "अंतिम बार संपादित", + "last_modified": "अंतिम संशोधित", + "last_name": "उपनाम", + "last_online": "अंतिम ऑनलाइन", + "last_serviced_on": "अंतिम सेवा कब दी गई", + "latitude_invalid": "अक्षांश -90 और 90 के बीच होना चाहिए", "left": "बाएं", - "down": "नीचे", - "up": "ऊपर", - "RESPIRATORY_SUPPORT_SHORT__UNKNOWN": "कोई नहीं", - "RESPIRATORY_SUPPORT_SHORT__OXYGEN_SUPPORT": "O2 समर्थन", - "RESPIRATORY_SUPPORT_SHORT__NON_INVASIVE": "एनआईवी", - "RESPIRATORY_SUPPORT_SHORT__INVASIVE": "चतुर्थ", - "RESPIRATORY_SUPPORT__UNKNOWN": "कोई नहीं", - "RESPIRATORY_SUPPORT__OXYGEN_SUPPORT": "ऑक्सीजन सहायता", - "RESPIRATORY_SUPPORT__NON_INVASIVE": "नॉन-इनवेसिव वेंटिलेटर (एनआईवी)", - "RESPIRATORY_SUPPORT__INVASIVE": "इनवेसिव वेंटिलेटर (IV)", - "VENTILATOR_MODE__CMV": "मैकेनिकल वेंटिलेशन (CMV) को नियंत्रित करें", - "VENTILATOR_MODE__VCV": "वॉल्यूम नियंत्रण वेंटिलेशन (VCV)", - "VENTILATOR_MODE__PCV": "दबाव नियंत्रण वेंटिलेशन (पीसीवी)", - "VENTILATOR_MODE__SIMV": "समकालिक आंतरायिक अनिवार्य वेंटिलेशन (एसआईएमवी)", - "VENTILATOR_MODE__VC_SIMV": "वॉल्यूम नियंत्रित SIMV (VC-SIMV)", - "VENTILATOR_MODE__PC_SIMV": "दबाव नियंत्रित SIMV (PC-SIMV)", - "VENTILATOR_MODE__PSV": "सी-पीएपी / प्रेशर सपोर्ट वेंटिलेशन (पीएसवी)", - "CONSCIOUSNESS_LEVEL__UNRESPONSIVE": "अनुत्तरदायी", - "CONSCIOUSNESS_LEVEL__RESPONDS_TO_PAIN": "दर्द का जवाब देता है", - "CONSCIOUSNESS_LEVEL__RESPONDS_TO_VOICE": "आवाज़ का जवाब देता है", - "CONSCIOUSNESS_LEVEL__ALERT": "चेतावनी", - "CONSCIOUSNESS_LEVEL__AGITATED_OR_CONFUSED": "उत्तेजित या भ्रमित", - "CONSCIOUSNESS_LEVEL__ONSET_OF_AGITATION_AND_CONFUSION": "उत्तेजना और भ्रम की शुरुआत", - "PUPIL_REACTION__UNKNOWN": "अज्ञात", - "PUPIL_REACTION__BRISK": "तेज", - "PUPIL_REACTION__SLUGGISH": "सुस्त", - "PUPIL_REACTION__FIXED": "तय", - "PUPIL_REACTION__CANNOT_BE_ASSESSED": "मूल्यांकन नहीं किया जा सकता", - "LIMB_RESPONSE__UNKNOWN": "अज्ञात", - "LIMB_RESPONSE__STRONG": "मज़बूत", - "LIMB_RESPONSE__MODERATE": "मध्यम", - "LIMB_RESPONSE__WEAK": "कमज़ोर", - "LIMB_RESPONSE__FLEXION": "मोड़", - "LIMB_RESPONSE__EXTENSION": "विस्तार", - "LIMB_RESPONSE__NONE": "कोई नहीं", - "OXYGEN_MODALITY__NASAL_PRONGS": "नाक के कांटे", - "OXYGEN_MODALITY__SIMPLE_FACE_MASK": "सरल फेस मास्क", - "OXYGEN_MODALITY__NON_REBREATHING_MASK": "नॉन रीब्रीदिंग मास्क", - "OXYGEN_MODALITY__HIGH_FLOW_NASAL_CANNULA": "उच्च प्रवाह नाक प्रवेशनी", - "INSULIN_INTAKE_FREQUENCY__UNKNOWN": "अज्ञात", - "INSULIN_INTAKE_FREQUENCY__OD": "दिन में एक बार (OD)", - "INSULIN_INTAKE_FREQUENCY__BD": "दिन में दो बार (बीडी)", - "INSULIN_INTAKE_FREQUENCY__TD": "दिन में तीन बार (टीडी)", - "NURSING_CARE_PROCEDURE__personal_hygiene": "व्यक्तिगत स्वच्छता", - "NURSING_CARE_PROCEDURE__positioning": "पोजिशनिंग", - "NURSING_CARE_PROCEDURE__suctioning": "सक्शनिंग", - "NURSING_CARE_PROCEDURE__ryles_tube_care": "राइल्स ट्यूब केयर", - "NURSING_CARE_PROCEDURE__iv_sitecare": "IV साइट देखभाल", - "NURSING_CARE_PROCEDURE__nubulisation": "नूबुलाइज़ेशन", - "NURSING_CARE_PROCEDURE__dressing": "ड्रेसिंग", - "NURSING_CARE_PROCEDURE__dvt_pump_stocking": "डीवीटी पंप स्टॉकिंग", - "NURSING_CARE_PROCEDURE__restrain": "नियंत्रित करना", - "NURSING_CARE_PROCEDURE__chest_tube_care": "चेस्ट ट्यूब की देखभाल", - "NURSING_CARE_PROCEDURE__tracheostomy_care": "ट्रैकियोस्टोमी देखभाल", - "NURSING_CARE_PROCEDURE__stoma_care": "स्टोमा देखभाल", - "NURSING_CARE_PROCEDURE__catheter_care": "कैथेटर देखभाल", - "HEARTBEAT_RHYTHM__REGULAR": "नियमित", - "HEARTBEAT_RHYTHM__IRREGULAR": "अनियमित", - "HEARTBEAT_RHYTHM__UNKNOWN": "अज्ञात", + "linked_facilities": "लिंक्ड सुविधाएं", + "liquid_oxygen_capacity": "द्रव ऑक्सीजन क्षमता", + "list_view": "लिस्ट व्यू", + "litres": "लीटर", + "litres_per_day": "लीटर/दिन", + "live": "रहना", + "live_monitoring": "लाइव मॉनिटरिंग", + "load_more": "और लोड करें", + "loading": "लोड हो रहा है...", + "local_body": "स्थानीय निकाय", + "local_ipaddress": "स्थानीय आईपी पता", + "location": "जगह", + "location_management": "स्थान प्रबंधन", + "log_lab_results": "लॉग लैब परिणाम", + "log_report": "लॉग रिपोर्ट", + "login": "लॉग इन करें", + "longitude_invalid": "देशांतर -180 और 180 के बीच होना चाहिए", + "lsg": "एलएसजी", + "make_multiple_beds_label": "क्या आप कई बिस्तर बनाना चाहते हैं?", + "manage_prescriptions": "नुस्खे प्रबंधित करें", + "manufacturer": "उत्पादक", "map_acronym": "मानचित्र", - "systolic": "सिस्टोलिक", - "diastolic": "डायस्टोलिक", - "pain": "दर्द", - "pain_chart_description": "दर्द का क्षेत्र और तीव्रता चिह्नित करें", - "bradycardia": "मंदनाड़ी", - "tachycardia": "tachycardia", - "medicine": "दवा", - "route": "मार्ग", - "dosage": "मात्रा बनाने की विधि", - "base_dosage": "मात्रा बनाने की विधि", - "start_dosage": "प्रारंभिक खुराक", - "target_dosage": "लक्ष्य खुराक", - "instruction_on_titration": "अनुमापन पर निर्देश", - "titrate_dosage": "टाइट्रेट खुराक", - "indicator": "सूचक", - "inidcator_event": "संकेतक घटना", + "mark_all_as_read": "सभी को पढ़ा हुआ मार्क करें", + "mark_as_read": "पढ़े हुए का चिह्न", + "mark_as_unread": "अपठित के रूप में चिह्नित करें", + "mark_this_transfer_as_complete_question": "क्या आप वाकई इस स्थानांतरण को पूर्ण के रूप में चिह्नित करना चाहते हैं? ओरिजिन सुविधा अब इस रोगी तक पहुँच नहीं पाएगी", + "mark_transfer_complete_confirmation": "क्या आप वाकई इस स्थानांतरण को पूर्ण के रूप में चिह्नित करना चाहते हैं? ओरिजिन सुविधा अब इस रोगी तक पहुँच नहीं पाएगी", "max_dosage_24_hrs": "अधिकतम खुराक 24 घंटे में.", - "min_time_bw_doses": "खुराकों के बीच न्यूनतम समय", - "manage_prescriptions": "नुस्खे प्रबंधित करें", - "prescription_details": "प्रिस्क्रिप्शन विवरण", - "prescription_medications": "प्रिस्क्रिप्शन दवाएं", - "prn_prescriptions": "पीआरएन प्रिस्क्रिप्शन", - "prescription": "नुस्खा", - "discharge_prescription": "डिस्चार्ज प्रिस्क्रिप्शन", - "edit_prescriptions": "नुस्खे संपादित करें", - "prescription_medication": "दवा का पर्चा", - "add_prescription_medication": "प्रिस्क्रिप्शन दवा जोड़ें", - "prn_prescription": "पीआरएन प्रिस्क्रिप्शन", - "add_prn_prescription": "PRN प्रिस्क्रिप्शन जोड़ें", - "add_prescription_to_consultation_note": "इस परामर्श में एक नया नुस्खा जोड़ें।", + "max_dosage_in_24hrs_gte_base_dosage_error": "24 घंटे में अधिकतम खुराक आधार खुराक से अधिक या उसके बराबर होनी चाहिए", + "max_size_for_image_uploaded_should_be": "अपलोड की गई छवि का अधिकतम आकार होना चाहिए", + "medical_worker": "चिकित्साकर्मी", + "medicine": "दवा", "medicine_administration_history": "औषधि प्रशासन इतिहास", - "return_to_patient_dashboard": "मरीज़ डैशबोर्ड पर वापस जाएँ", - "administered_on": "प्रशासित", - "administer": "प्रशासन", - "administer_medicine": "दवाई देना", - "administer_medicines": "दवाइयाँ दें", - "administer_selected_medicines": "चयनित दवाएँ दें", - "select_for_administration": "प्रशासन के लिए चयन करें", "medicines_administered": "दी जाने वाली दवा(एँ)", "medicines_administered_error": "दवा(एँ) देने में त्रुटि", - "prescription_discontinued": "प्रिस्क्रिप्शन बंद कर दिया गया", - "administration_notes": "प्रशासन नोट्स", - "last_administered": "अंतिम प्रशासित", - "prescription_logs": "प्रिस्क्रिप्शन लॉग", + "middleware_hostname": "मिडलवेयर होस्टनाम", + "min_password_len_8": "न्यूनतम पासवर्ड लंबाई 8", + "min_time_bw_doses": "खुराकों के बीच न्यूनतम समय", + "mobile": "गतिमान", + "mobile_number": "मोबाइल नंबर", "modification_caution_note": "एक बार जोड़ देने के बाद कोई संशोधन संभव नहीं", - "discontinue_caution_note": "क्या आप वाकई इस नुस्खे को बंद करना चाहते हैं?", - "confirm_discontinue": "बंद करने की पुष्टि करें", - "edit_caution_note": "परामर्श में संपादित विवरण के साथ एक नया नुस्खा जोड़ा जाएगा तथा वर्तमान नुस्खा बंद कर दिया जाएगा।", - "reason_for_discontinuation": "बंद करने का कारण", - "reason_for_edit": "संपादन का कारण", - "PRESCRIPTION_ROUTE_ORAL": "मौखिक", - "PRESCRIPTION_ROUTE_IV": "चतुर्थ", - "PRESCRIPTION_ROUTE_IM": "मैं हूँ", - "PRESCRIPTION_ROUTE_SC": "अनुसूचित जाति", - "PRESCRIPTION_ROUTE_INHALATION": "साँस लेना", - "PRESCRIPTION_ROUTE_NASOGASTRIC": "नासोगैस्ट्रिक / गैस्ट्रोस्टोमी ट्यूब", - "PRESCRIPTION_ROUTE_INTRATHECAL": "अंतःकपाल इंजेक्शन", - "PRESCRIPTION_ROUTE_TRANSDERMAL": "ट्रांसडर्मल", - "PRESCRIPTION_ROUTE_RECTAL": "रेक्टल", - "PRESCRIPTION_ROUTE_SUBLINGUAL": "सबलिंगुअल", - "PRESCRIPTION_FREQUENCY_STAT": "तुरन्त", - "PRESCRIPTION_FREQUENCY_OD": "एक बार दैनिक", - "PRESCRIPTION_FREQUENCY_HS": "केवल रात्रि", - "PRESCRIPTION_FREQUENCY_BD": "दो बार दैनिक लें", - "PRESCRIPTION_FREQUENCY_TID": "8वाँ प्रति घंटा", - "PRESCRIPTION_FREQUENCY_QID": "6वाँ प्रति घंटा", - "PRESCRIPTION_FREQUENCY_Q4H": "4 घंटे प्रति घंटा", - "PRESCRIPTION_FREQUENCY_QOD": "वैकल्पिक दिन", - "PRESCRIPTION_FREQUENCY_QWK": "एक सप्ताह में एक बार", - "inconsistent_dosage_units_error": "खुराक इकाइयाँ समान होनी चाहिए", - "max_dosage_in_24hrs_gte_base_dosage_error": "24 घंटे में अधिकतम खुराक आधार खुराक से अधिक या उसके बराबर होनी चाहिए", - "administration_dosage_range_error": "खुराक प्रारंभिक और लक्ष्य खुराक के बीच होनी चाहिए", + "modified": "संशोधित", + "modified_date": "संशोधित तिथि", + "monitor": "निगरानी करना", + "more_info": "और जानकारी", + "moving_camera": "चलता कैमरा", + "name": "नाम", + "name_of_hospital": "अस्पताल का नाम", + "name_of_shifting_approving_facility": "स्थानांतरण अनुमोदन सुविधा का नाम", + "nationality": "राष्ट्रीयता", + "never": "कभी नहीं", + "new_password": "नया पासवर्ड", + "next_sessions": "अगले सत्र", + "no": "नहीं", + "no_bed_types_found": "कोई बिस्तर प्रकार नहीं मिला", + "no_changes": "कोई परिवर्तन नहीं", + "no_changes_made": "कोई परिवर्तन नहीं किया गया", + "no_consultation_updates": "कोई परामर्श अपडेट नहीं", + "no_cover_photo_uploaded_for_this_facility": "इस सुविधा के लिए कोई कवर फ़ोटो अपलोड नहीं किया गया", + "no_data_found": "डाटा प्राप्त नहीं हुआ", + "no_duplicate_facility": "आपको डुप्लिकेट सुविधाएं नहीं बनानी चाहिए", + "no_facilities": "कोई सुविधा नहीं मिली", + "no_files_found": "कोई {{type}} फ़ाइल नहीं मिली", + "no_home_facility": "कोई गृह सुविधा निर्दिष्ट नहीं की गई", + "no_investigation": "कोई जांच रिपोर्ट नहीं मिली", + "no_investigation_suggestions": "कोई जांच सुझाव नहीं", + "no_linked_facilities": "कोई लिंक्ड सुविधा नहीं", + "no_log_update_delta": "पिछले लॉग अद्यतन के बाद से कोई परिवर्तन नहीं", "no_notices_for_you": "आपके लिए कोई नोटिस नहीं.", - "mark_as_read": "पढ़े हुए का चिह्न", - "mark_as_unread": "अपठित के रूप में चिह्नित करें", - "subscribe": "सदस्यता लें", - "subscribe_on_this_device": "इस डिवाइस पर सदस्यता लें", + "no_patients_to_show": "दिखाने के लिए कोई मरीज़ नहीं.", + "no_results_found": "कोई परिणाम नहीं मिला", + "no_staff": "कोई कर्मचारी नहीं मिला", + "no_treating_physicians_available": "इस सुविधा में कोई होम फैसिलिटी डॉक्टर नहीं है। कृपया अपने एडमिन से संपर्क करें।", + "no_users_found": "कोई उपयोगकर्ता नहीं मिला", + "none": "कोई नहीं", + "normal": "सामान्य", + "not_specified": "निर्दिष्ट नहीं है", + "notes": "नोट्स", + "notes_placeholder": "अपने नोट्स लिखें", "notification_permission_denied": "सूचना अनुमति नामंजूर", "notification_permission_granted": "सूचना अनुमति प्रदान की गई", - "show_unread_notifications": "अपठित दिखाएँ", - "show_all_notifications": "सब दिखाएं", - "filter_by_category": "श्रेणी के अनुसार फ़िल्टर करें", - "mark_all_as_read": "सभी को पढ़ा हुआ मार्क करें", - "reload": "पुनः लोड करें", - "no_results_found": "कोई परिणाम नहीं मिला", - "load_more": "और लोड करें", - "subscription_error": "सदस्यता त्रुटि", - "unsubscribe_failed": "सदस्यता रद्द करना विफल हुआ.", - "unsubscribe": "सदस्यता रद्द", - "escape": "पलायन", - "invalid_asset_id_msg": "ओह! आपके द्वारा दर्ज की गई संपत्ति आईडी वैध नहीं लगती।", - "asset_not_found_msg": "ओह! आप जिस संपत्ति की तलाश कर रहे हैं वह मौजूद नहीं है। कृपया संपत्ति आईडी की जाँच करें।", - "create_resource_request": "संसाधन अनुरोध बनाएँ", - "contact_person": "सुविधा केंद्र पर संपर्क व्यक्ति का नाम", - "approving_facility": "अनुमोदन सुविधा का नाम", - "contact_phone": "संपर्क व्यक्ति संख्या", + "number_of_aged_dependents_above_60": "वृद्ध आश्रितों की संख्या (60 से अधिक)", + "number_of_beds": "बिस्तरों की संख्या", + "number_of_beds_out_of_range_error": "बिस्तरों की संख्या 100 से अधिक नहीं हो सकती", + "number_of_chronic_diseased_dependents": "दीर्घकालिक रोग से पीड़ित आश्रितों की संख्या", + "on": "पर", + "ongoing_medications": "चल रही दवाएँ", + "open": "खुला", + "open_camera": "कैमरा खोलें", + "open_live_monitoring": "लाइव मॉनिटरिंग खोलें", + "optional": "वैकल्पिक", + "ordering": "आदेश", + "origin_facility": "वर्तमान सुविधा", + "oxygen_information": "ऑक्सीजन की जानकारी", + "page_not_found": "पृष्ठ नहीं मिला", + "pain": "दर्द", + "pain_chart_description": "दर्द का क्षेत्र और तीव्रता चिह्नित करें", + "passport_number": "पासपोर्ट नंबर", + "password": "पासवर्ड", + "password_mismatch": "पासवर्ड और पुष्टि पासवर्ड एक ही होना चाहिए.", + "password_reset_failure": "पासवर्ड रीसेट विफल", + "password_reset_success": "पासवर्ड सफलतापूर्वक रीसेट हो गया", + "password_sent": "पासवर्ड रीसेट ईमेल भेजा गया", + "patient_address": "मरीज का पता", + "patient_category": "रोगी श्रेणी", + "patient_consultation__admission": "प्रवेश की तिथि", + "patient_consultation__consultation_notes": "सामान्य निर्देश", + "patient_consultation__dc_admission": "घरेलू देखभाल शुरू होने की तिथि", + "patient_consultation__ip": "आई पी", + "patient_consultation__op": "सेशन", + "patient_consultation__special_instruction": "विशेष निर्देश", + "patient_consultation__treatment__plan": "योजना", + "patient_consultation__treatment__summary": "सारांश", + "patient_consultation__treatment__summary__date": "तारीख", + "patient_consultation__treatment__summary__spo2": "एसपीओ2", + "patient_consultation__treatment__summary__temperature": "तापमान", + "patient_created": "रोगी बनाया गया", + "patient_name": "मरीज का नाम", + "patient_no": "ओपी/आईपी संख्या", + "patient_phone_number": "मरीज़ का फ़ोन नंबर", + "patient_registration__address": "पता", + "patient_registration__age": "आयु", + "patient_registration__comorbidities": "comorbidities", + "patient_registration__comorbidities__details": "विवरण", + "patient_registration__comorbidities__disease": "बीमारी", + "patient_registration__contact": "आपातकालीन संपर्क", + "patient_registration__gender": "लिंग", + "patient_registration__name": "नाम", + "patient_state": "मरीज की स्थिति", + "patient_status": "रोगी की स्थिति", + "patient_transfer_birth_match_note": "ध्यान दें: स्थानांतरण अनुरोध पर कार्रवाई करने के लिए जन्म का वर्ष मरीज से मेल खाना चाहिए।", + "phone": "फ़ोन", + "phone_no": "फोन नंबर।", + "phone_number": "फ़ोन नंबर", + "phone_number_at_current_facility": "वर्तमान सुविधा पर संपर्क व्यक्ति का फ़ोन नंबर", + "pincode": "पिनकोड", + "please_enter_a_reason_for_the_shift": "कृपया बदलाव का कारण बताएं.", + "please_select_a_facility": "कृपया एक सुविधा चुनें", + "please_select_breathlessness_level": "कृपया सांस फूलने का स्तर चुनें", + "please_select_facility_type": "कृपया सुविधा प्रकार चुनें", + "please_select_patient_category": "कृपया रोगी श्रेणी का चयन करें", + "please_select_preferred_vehicle_type": "कृपया पसंदीदा वाहन प्रकार चुनें", + "please_select_status": "कृपया स्थिति चुनें", + "please_upload_a_csv_file": "कृपया एक CSV फ़ाइल अपलोड करें", + "post_your_comment": "अपनी टिप्पणी पोस्ट करें", + "powered_by": "द्वारा संचालित", + "preferred_facility_type": "पसंदीदा सुविधा प्रकार", + "preferred_vehicle": "पसंदीदा वाहन", + "prescription": "नुस्खा", + "prescription_details": "प्रिस्क्रिप्शन विवरण", + "prescription_discontinued": "प्रिस्क्रिप्शन बंद कर दिया गया", + "prescription_logs": "प्रिस्क्रिप्शन लॉग", + "prescription_medication": "दवा का पर्चा", + "prescription_medications": "प्रिस्क्रिप्शन दवाएं", + "prescriptions__dosage_frequency": "खुराक और आवृत्ति", + "prescriptions__medicine": "दवा", + "prescriptions__route": "मार्ग", + "prescriptions__start_date": "निर्धारित", + "prev_sessions": "पिछले सत्र", + "principal": "प्रधानाचार्य", + "principal_diagnosis": "मुख्य निदान", + "print": "छाप", + "print_referral_letter": "रेफरल पत्र प्रिंट करें", + "prn_prescription": "पीआरएन प्रिस्क्रिप्शन", + "prn_prescriptions": "पीआरएन प्रिस्क्रिप्शन", + "procedure_suggestions": "प्रक्रिया सुझाव", + "provisional": "अनंतिम", + "ration_card__APL": "एपीएल", + "ration_card__BPL": "गरीबी रेखा से नीचे", + "ration_card__NO_CARD": "गैर-कार्ड धारक", + "reason": "कारण", + "reason_for_discontinuation": "बंद करने का कारण", + "reason_for_edit": "संपादन का कारण", + "reason_for_referral": "निर्दिष्ट करने की वजह", + "reason_for_shift": "बदलाव का कारण", + "recommended_aspect_ratio_for": "इसके लिए अनुशंसित पहलू अनुपात", + "record": "ऑडियो रिकॉर्ड करें", + "record_delete_confirm": "क्या आप वाकई इस रिकॉर्ड को हटाना चाहते हैं?", + "record_has_been_deleted_successfully": "रिकार्ड सफलतापूर्वक हटा दिया गया है.", + "record_updates": "रिकॉर्ड अपडेट", + "recording": "रिकॉर्डिंग", + "redirected_to_create_consultation": "नोट: आपको परामर्श फ़ॉर्म बनाने के लिए पुनः निर्देशित किया जाएगा। कृपया स्थानांतरण प्रक्रिया समाप्त करने के लिए फ़ॉर्म पूरा करें", + "referral_letter": "रेफरल पत्र", + "referred_to": "करने के लिए भेजा", + "refresh_list": "सूची रीफ़्रेश करें", + "refuted": "का खंडन किया", + "register_hospital": "अस्पताल रजिस्टर करें", + "register_page_title": "अस्पताल प्रशासक के रूप में पंजीकरण करें", + "reload": "पुनः लोड करें", + "remove": "निकालना", + "rename": "नाम बदलें", + "report": "प्रतिवेदन", + "req_atleast_one_digit": "कम से कम एक अंक की आवश्यकता है", + "req_atleast_one_lowercase": "कम से कम एक लोअर केस अक्षर की आवश्यकता है", + "req_atleast_one_symbol": "कम से कम एक प्रतीक की आवश्यकता है", + "req_atleast_one_uppercase": "कम से कम एक अपर केस की आवश्यकता है", + "request_description": "अनुरोध का विवरण", + "request_description_placeholder": "अपना विवरण यहाँ लिखें", "request_title": "शीर्षक का अनुरोध करें", "request_title_placeholder": "अपना शीर्षक यहाँ लिखें", + "required": "आवश्यक", "required_quantity": "आवश्यक मात्रा", - "request_description": "अनुरोध का विवरण", - "request_description_placeholder": "अपना विवरण यहाँ लिखें", + "reset": "रीसेट करें", + "reset_password": "पासवर्ड रीसेट", + "resource_request": "संसाधन अनुरोध", + "result": "परिणाम", + "result_date": "परिणाम दिनांक", + "result_details": "परिणाम विवरण", + "resume": "फिर शुरू करना", + "retake": "फिर से लेना", + "return_to_care": "CARE पर वापस लौटें", + "return_to_login": "लॉगिन पर वापस लौटें", + "return_to_password_reset": "पासवर्ड रीसेट पर वापस लौटें", + "return_to_patient_dashboard": "मरीज़ डैशबोर्ड पर वापस जाएँ", + "right": "सही", + "route": "मार्ग", + "sample_collection_date": "नमूना संग्रहण तिथि", + "sample_format": "नमूना प्रारूप", + "sample_type": "नमूना प्रकार", + "save": "बचाना", + "save_and_continue": "सहेजें और जारी रखें", + "save_investigation": "जांच सहेजें", + "scan_asset_qr": "एसेट क्यूआर स्कैन करें!", + "search_by_username": "उपयोगकर्ता नाम से खोजें", + "search_for_facility": "सुविधा खोजें", + "search_icd11_placeholder": "ICD-11 निदान खोजें", + "search_investigation_placeholder": "खोज जांच और समूह", + "search_patient": "मरीज खोजें", "search_resource": "संसाधन खोजें", - "emergency": "आपातकाल", - "up_shift": "अप शिफ्ट", - "antenatal": "उत्पत्ति के पूर्व का", - "phone_no": "फोन नंबर।", - "patient_name": "मरीज का नाम", - "disease_status": "रोग की स्थिति", - "breathlessness_level": "सांस फूलने का स्तर", - "assigned_facility": "सुविधा सौंपी गई", - "origin_facility": "वर्तमान सुविधा", - "shifting_approval_facility": "स्थानांतरण अनुमोदन सुविधा", + "select": "चुनना", + "select_date": "तारीख़ चुनें", + "select_facility_for_discharged_patients_warning": "छुट्टी दिए गए मरीजों को देखने के लिए सुविधा का चयन किया जाना आवश्यक है।", + "select_for_administration": "प्रशासन के लिए चयन करें", + "select_groups": "समूह चुनें", + "select_investigation": "जांच का चयन करें (सभी जांच डिफ़ॉल्ट रूप से चयनित होंगी)", + "select_investigation_groups": "जांच समूह चुनें", + "select_investigations": "जांच का चयन करें", + "select_local_body": "स्थानीय निकाय का चयन करें", + "select_skills": "कुछ कौशल चुनें और जोड़ें", + "select_wards": "वार्ड चुनें", + "send_email": "ईमेल भेजें", + "send_reset_link": "रीसेट लिंक भेजें", + "serial_number": "क्रम संख्या", + "serviced_on": "सेवा पर", + "session_expired": "सत्र समाप्त हुआ", + "session_expired_msg": "ऐसा लगता है कि आपका सत्र समाप्त हो गया है। यह निष्क्रियता के कारण हो सकता है। कृपया जारी रखने के लिए फिर से लॉगिन करें।", + "set_average_weekly_working_hours_for": "औसत साप्ताहिक कार्य घंटे निर्धारित करें", + "settings_and_filters": "सेटिंग्स और फ़िल्टर", + "severity_of_breathlessness": "सांस फूलने की गंभीरता", + "shift_request_updated_successfully": "शिफ़्ट अनुरोध सफलतापूर्वक अपडेट किया गया", "shifting": "स्थानांतरण", - "search_patient": "मरीज खोजें", - "list_view": "लिस्ट व्यू", - "comment_min_length": "टिप्पणी में कम से कम 1 अक्षर होना चाहिए", - "comment_added_successfully": "टिप्पणी सफलतापूर्वक जोड़ी गई", - "post_your_comment": "अपनी टिप्पणी पोस्ट करें", + "shifting_approval_facility": "स्थानांतरण अनुमोदन सुविधा", "shifting_approving_facility": "स्थानांतरण अनुमोदन सुविधा", - "is_emergency_case": "क्या यह आपातकालीन मामला है?", - "is_upshift_case": "क्या अपशिफ्ट मामला है?", - "is_antenatal": "क्या यह प्रसवपूर्व है?", - "patient_phone_number": "मरीज़ का फ़ोन नंबर", - "created_date": "सृजित दिनांक", - "modified_date": "संशोधित तिथि", - "no_patients_to_show": "दिखाने के लिए कोई मरीज़ नहीं.", - "shifting_status": "बदलती स्थिति", - "transfer_to_receiving_facility": "प्राप्ति सुविधा में स्थानांतरण", - "confirm_transfer_complete": "स्थानांतरण पूर्ण होने की पुष्टि करें!", - "mark_transfer_complete_confirmation": "क्या आप वाकई इस स्थानांतरण को पूर्ण के रूप में चिह्नित करना चाहते हैं? ओरिजिन सुविधा अब इस रोगी तक पहुँच नहीं पाएगी", - "board_view": "बोर्ड दृश्य", + "shifting_approving_facility_can_not_be_empty": "स्थानांतरण अनुमोदन सुविधा खाली नहीं हो सकती।", "shifting_deleted": "स्थानांतरण रिकॉर्ड सफलतापूर्वक हटा दिया गया है.", - "details_of_shifting_approving_facility": "स्थानांतरण अनुमोदन सुविधा का विवरण", - "details_of_assigned_facility": "निर्दिष्ट सुविधा का विवरण", - "details_of_origin_facility": "मूल सुविधा का विवरण", - "details_of_patient": "मरीज का विवरण", - "record_delete_confirm": "क्या आप वाकई इस रिकॉर्ड को हटाना चाहते हैं?", - "phone_number_at_current_facility": "वर्तमान सुविधा पर संपर्क व्यक्ति का फ़ोन नंबर", - "authorize_shift_delete": "शिफ़्ट डिलीट को अधिकृत करें", - "delete_record": "रिकॉर्ड मिटाएँ", - "severity_of_breathlessness": "सांस फूलने की गंभीरता", - "facility_preference": "सुविधा वरीयता", - "vehicle_preference": "वाहन वरीयता", - "is_up_shift": "क्या शिफ्ट चालू है", - "ambulance_driver_name": "एम्बुलेंस चालक का नाम", - "ambulance_phone_number": "एम्बुलेंस का फ़ोन नंबर", - "ambulance_number": "एम्बुलेंस नं.", - "is_emergency": "क्या आपातकाल है?", - "contact_person_at_the_facility": "वर्तमान सुविधा पर संपर्क व्यक्ति", - "update_status_details": "स्थिति/विवरण अपडेट करें", "shifting_details": "स्थानांतरण विवरण", - "auto_generated_for_care": "देखभाल के लिए स्वचालित रूप से उत्पन्न", - "approved_by_district_covid_control_room": "जिला कोविड नियंत्रण कक्ष द्वारा अनुमोदित", - "treatment_summary": "उपचार सारांश", - "reason_for_referral": "निर्दिष्ट करने की वजह", - "referred_to": "करने के लिए भेजा", - "covid_19_cat_gov": "केरल सरकार के दिशानिर्देश के अनुसार कोविड_19 क्लिनिकल श्रेणी (ए/बी/सी)", - "district_program_management_supporting_unit": "जिला कार्यक्रम प्रबंधन सहायक इकाई", - "name_of_hospital": "अस्पताल का नाम", - "passport_number": "पासपोर्ट नंबर", + "shifting_status": "बदलती स्थिति", + "show_all": "सब दिखाएं", + "show_all_notifications": "सब दिखाएं", + "show_default_presets": "डिफ़ॉल्ट प्रीसेट दिखाएं", + "show_patient_presets": "मरीज़ प्रीसेट दिखाएँ", + "show_unread_notifications": "अपठित दिखाएँ", + "sign_out": "साइन आउट", + "something_went_wrong": "कुछ गलत हो गया..!", + "something_wrong": "कुछ ग़लत हुआ! बाद में पुनः प्रयास करें!", + "sort_by": "इसके अनुसार क्रमबद्ध करें", + "source": "स्रोत", + "srf_id": "एसआरएफ आईडी", + "staff_list": "स्टाफ सूची", + "start_dosage": "प्रारंभिक खुराक", + "state": "राज्य", + "status": "स्थिति", + "stop": "रुकना", + "stream_stop_due_to_inativity": "निष्क्रियता के कारण लाइव फ़ीड स्ट्रीमिंग बंद हो जाएगी", + "stream_stopped_due_to_inativity": "निष्क्रियता के कारण लाइव फ़ीड की स्ट्रीमिंग बंद हो गई है", + "sub_category": "उप श्रेणी", + "submit": "जमा करना", + "submitting": "भेजने से", + "subscribe": "सदस्यता लें", + "subscribe_on_this_device": "इस डिवाइस पर सदस्यता लें", + "subscription_error": "सदस्यता त्रुटि", + "suggested_investigations": "सुझाए गए जांच", + "summary": "सारांश", + "support": "सहायता", + "switch": "बदलना", + "systolic": "सिस्टोलिक", + "tachycardia": "tachycardia", + "target_dosage": "लक्ष्य खुराक", "test_type": "परीक्षण प्रकार", - "medical_worker": "चिकित्साकर्मी", - "error_deleting_shifting": "शिफ्टिंग रिकॉर्ड हटाते समय त्रुटि", + "titrate_dosage": "टाइट्रेट खुराक", + "to_be_conducted": "संचालित किया जाना है", + "total_beds": "कुल बिस्तर", + "total_users": "कुल उपयोगकर्ता", + "transfer_in_progress": "स्थानांतरण प्रगति पर है", + "transfer_to_receiving_facility": "प्राप्ति सुविधा में स्थानांतरण", + "travel_within_last_28_days": "घरेलू/अंतर्राष्ट्रीय यात्रा (पिछले 28 दिनों के भीतर)", + "treating_doctor": "इलाज करने वाला डॉक्टर", + "treatment_summary": "उपचार सारांश", + "treatment_summary__head_title": "उपचार सारांश", + "treatment_summary__heading": "अंतरिम उपचार सारांश", + "treatment_summary__print": "प्रिंट उपचार सारांश", + "try_again_later": "बाद में पुन: प्रयास!", "type_any_extra_comments_here": "कोई भी अतिरिक्त टिप्पणी यहाँ लिखें", + "type_b_cylinders": "बी प्रकार सिलेंडर", + "type_c_cylinders": "सी प्रकार सिलेंडर", + "type_d_cylinders": "डी प्रकार सिलेंडर", + "type_to_search": "खोजने के लिए टाइप करें", + "type_your_comment": "अपनी टिप्पणी लिखें", "type_your_reason_here": "अपना कारण यहाँ लिखें", - "reason_for_shift": "बदलाव का कारण", - "preferred_facility_type": "पसंदीदा सुविधा प्रकार", - "preferred_vehicle": "पसंदीदा वाहन", - "is_it_upshift": "क्या यह अपशिफ्ट है", - "is_this_an_upshift": "क्या यह एक उन्नति है?", - "is_this_an_emergency": "क्या यह आपातकाल है?", - "what_facility_assign_the_patient_to": "आप मरीज़ को कौन सी सुविधा देना चाहेंगे?", - "name_of_shifting_approving_facility": "स्थानांतरण अनुमोदन सुविधा का नाम", + "unconfirmed": "अपुष्ट", + "unique_id": "अनोखा ID", + "unknown": "अज्ञात", + "unsubscribe": "सदस्यता रद्द", + "unsubscribe_failed": "सदस्यता रद्द करना विफल हुआ.", + "unsupported_browser": "असमर्थित ब्राउज़र", + "unsupported_browser_description": "आपका ब्राउज़र ({{name}} संस्करण {{version}}) समर्थित नहीं है। कृपया अपने ब्राउज़र को नवीनतम संस्करण में अपडेट करें या सर्वोत्तम अनुभव के लिए समर्थित ब्राउज़र पर स्विच करें।", + "up": "ऊपर", + "up_shift": "अप शिफ्ट", + "update": "अद्यतन", + "update_asset": "संपत्ति अपडेट करें", + "update_asset_service_record": "एसेट सेवा रिकॉर्ड अपडेट करें", + "update_bed": "बिस्तर अपडेट करें", + "update_facility": "अद्यतन सुविधा", + "update_facility_middleware_success": "सुविधा मिडलवेयर सफलतापूर्वक अपडेट किया गया", + "update_log": "लॉग अपडेट करें", + "update_record": "रिकॉर्ड अपडेट करें", + "update_record_for_asset": "संपत्ति के लिए रिकॉर्ड अपडेट करें", "update_shift_request": "शिफ्ट अनुरोध अपडेट करें", - "shift_request_updated_successfully": "शिफ़्ट अनुरोध सफलतापूर्वक अपडेट किया गया", - "please_enter_a_reason_for_the_shift": "कृपया बदलाव का कारण बताएं.", - "please_select_preferred_vehicle_type": "कृपया पसंदीदा वाहन प्रकार चुनें", - "please_select_facility_type": "कृपया सुविधा प्रकार चुनें", - "please_select_breathlessness_level": "कृपया सांस फूलने का स्तर चुनें", - "please_select_a_facility": "कृपया एक सुविधा चुनें", - "please_select_status": "कृपया स्थिति चुनें", - "please_select_patient_category": "कृपया रोगी श्रेणी का चयन करें", - "shifting_approving_facility_can_not_be_empty": "स्थानांतरण अनुमोदन सुविधा खाली नहीं हो सकती।", - "redirected_to_create_consultation": "नोट: आपको परामर्श फ़ॉर्म बनाने के लिए पुनः निर्देशित किया जाएगा। कृपया स्थानांतरण प्रक्रिया समाप्त करने के लिए फ़ॉर्म पूरा करें", - "mark_this_transfer_as_complete_question": "क्या आप वाकई इस स्थानांतरण को पूर्ण के रूप में चिह्नित करना चाहते हैं? ओरिजिन सुविधा अब इस रोगी तक पहुँच नहीं पाएगी", - "transfer_in_progress": "स्थानांतरण प्रगति पर है", - "patient_state": "मरीज की स्थिति", - "yet_to_be_decided": "अभी निर्णय होना बाकी", - "awaiting_destination_approval": "गंतव्य अनुमोदन की प्रतीक्षा में", + "update_status_details": "स्थिति/विवरण अपडेट करें", + "updated": "अद्यतन", + "updating": "अद्यतन करने", + "upload": "अपलोड करें", + "upload_an_image": "एक छवि अपलोड करें", + "upload_headings__consultation": "नई परामर्श फ़ाइल अपलोड करें", + "upload_headings__patient": "नई रोगी फ़ाइल अपलोड करें", + "upload_headings__sample_report": "नमूना रिपोर्ट अपलोड करें", + "upload_headings__supporting_info": "सहायक जानकारी अपलोड करें", + "uploading": "अपलोड हो रहा है", + "user_deleted_successfuly": "उपयोगकर्ता सफलतापूर्वक हटा दिया गया", "user_management": "प्रयोक्ता प्रबंधन", - "facilities": "सुविधाएँ", - "add_new_user": "नई उपयोगकर्ता को जोड़ना", - "no_users_found": "कोई उपयोगकर्ता नहीं मिला", - "home_facility": "घर की सुविधा", - "no_home_facility": "कोई गृह सुविधा निर्दिष्ट नहीं की गई", - "clear_home_facility": "क्लियर होम सुविधा", - "linked_facilities": "लिंक्ड सुविधाएं", - "no_linked_facilities": "कोई लिंक्ड सुविधा नहीं", - "average_weekly_working_hours": "औसत साप्ताहिक कार्य घंटे", - "set_average_weekly_working_hours_for": "औसत साप्ताहिक कार्य घंटे निर्धारित करें", - "search_by_username": "उपयोगकर्ता नाम से खोजें", - "last_online": "अंतिम ऑनलाइन", - "total_users": "कुल उपयोगकर्ता" -} \ No newline at end of file + "username": "उपयोगकर्ता नाम", + "users": "उपयोगकर्ताओं", + "vehicle_preference": "वाहन वरीयता", + "vendor_name": "विक्रेता का नाम", + "view": "देखना", + "view_abdm_records": "ABDM रिकॉर्ड देखें", + "view_asset": "संपत्तियां देखें", + "view_details": "विवरण देखें", + "view_faciliy": "सुविधा देखें", + "view_patients": "मरीज़ देखें", + "view_users": "उपयोगकर्ता देखें", + "virtual_nursing_assistant": "वर्चुअल नर्सिंग सहायक", + "ward": "वार्ड", + "warranty_amc_expiry": "वारंटी / एएमसी समाप्ति", + "what_facility_assign_the_patient_to": "आप मरीज़ को कौन सी सुविधा देना चाहेंगे?", + "why_the_asset_is_not_working": "परिसंपत्ति काम क्यों नहीं कर रही है?", + "working_status": "कामकाजी स्थिति", + "yes": "हाँ", + "yet_to_be_decided": "अभी निर्णय होना बाकी", + "you_need_at_least_a_location_to_create_an_assest": "संपत्ति बनाने के लिए आपको कम से कम एक स्थान की आवश्यकता होगी।", + "zoom_in": "ज़ूम इन", + "zoom_out": "ज़ूम आउट" +} diff --git a/src/Locale/kn.json b/src/Locale/kn.json index a2738edd9e9..acaebe8e421 100644 --- a/src/Locale/kn.json +++ b/src/Locale/kn.json @@ -1,813 +1,813 @@ { - "create_asset": "ಆಸ್ತಿಯನ್ನು ರಚಿಸಿ", - "edit_history": "ಇತಿಹಾಸವನ್ನು ಸಂಪಾದಿಸಿ", - "update_record_for_asset": "ಆಸ್ತಿಗಾಗಿ ದಾಖಲೆಯನ್ನು ನವೀಕರಿಸಿ", - "edited_on": "ರಂದು ಸಂಪಾದಿಸಲಾಗಿದೆ", - "edited_by": "ಸಂಪಾದಿಸಿದವರು", - "serviced_on": "ಸೇವೆ ಸಲ್ಲಿಸಲಾಗಿದೆ", - "notes": "ಟಿಪ್ಪಣಿಗಳು", - "back": "ಹಿಂದೆ", - "close": "ಮುಚ್ಚಿ", - "update_asset_service_record": "ಸ್ವತ್ತು ಸೇವಾ ದಾಖಲೆಯನ್ನು ನವೀಕರಿಸಿ", - "eg_details_on_functionality_service_etc": "ಉದಾ. ಕಾರ್ಯನಿರ್ವಹಣೆ, ಸೇವೆ ಇತ್ಯಾದಿಗಳ ವಿವರಗಳು.", - "updating": "ನವೀಕರಿಸಲಾಗುತ್ತಿದೆ", - "update": "ನವೀಕರಿಸಿ", - "are_you_still_watching": "ನೀವು ಇನ್ನೂ ನೋಡುತ್ತಿದ್ದೀರಾ?", - "stream_stop_due_to_inativity": "ನಿಷ್ಕ್ರಿಯತೆಯ ಕಾರಣ ಲೈವ್ ಫೀಡ್ ಸ್ಟ್ರೀಮಿಂಗ್ ಅನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ", - "stream_stopped_due_to_inativity": "ನಿಷ್ಕ್ರಿಯತೆಯಿಂದಾಗಿ ಲೈವ್ ಫೀಡ್ ಸ್ಟ್ರೀಮಿಂಗ್ ಅನ್ನು ನಿಲ್ಲಿಸಿದೆ", - "continue_watching": "ನೋಡುವುದನ್ನು ಮುಂದುವರಿಸಿ", - "resume": "ಪುನರಾರಂಭಿಸಿ", - "username": "ಬಳಕೆದಾರ ಹೆಸರು", - "password": "ಪಾಸ್ವರ್ಡ್", - "new_password": "ಹೊಸ ಪಾಸ್ವರ್ಡ್", - "confirm_password": "ಪಾಸ್ವರ್ಡ್ ದೃಢೀಕರಿಸಿ", - "first_name": "ಮೊದಲ ಹೆಸರು", - "last_name": "ಕೊನೆಯ ಹೆಸರು", - "email": "ಇಮೇಲ್ ವಿಳಾಸ", - "phone_number": "ದೂರವಾಣಿ ಸಂಖ್ಯೆ", - "district": "ಜಿಲ್ಲೆ", - "gender": "ಲಿಂಗ", - "age": "ವಯಸ್ಸು", - "login": "ಲಾಗಿನ್", - "password_mismatch": "ಪಾಸ್ವರ್ಡ್ ಮತ್ತು ದೃಢೀಕರಣ ಪಾಸ್ವರ್ಡ್ ಒಂದೇ ಆಗಿರಬೇಕು.", - "enter_valid_age": "ದಯವಿಟ್ಟು ಮಾನ್ಯವಾದ ವಯಸ್ಸನ್ನು ನಮೂದಿಸಿ", - "invalid_username": "ಅಗತ್ಯವಿದೆ. 150 ಅಕ್ಷರಗಳು ಅಥವಾ ಕಡಿಮೆ. ಅಕ್ಷರಗಳು, ಅಂಕೆಗಳು ಮತ್ತು @/./+/-/_ ಮಾತ್ರ.", - "invalid_password": "ಪಾಸ್ವರ್ಡ್ ಅವಶ್ಯಕತೆಗಳನ್ನು ಪೂರೈಸುವುದಿಲ್ಲ", - "invalid_email": "ದಯವಿಟ್ಟು ಸರಿಯಾದ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ", - "invalid_phone": "ದಯವಿಟ್ಟು ಮಾನ್ಯವಾದ ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ", - "register_hospital": "ಆಸ್ಪತ್ರೆಯನ್ನು ನೋಂದಾಯಿಸಿ", - "register_page_title": "ಆಸ್ಪತ್ರೆ ನಿರ್ವಾಹಕರಾಗಿ ನೋಂದಾಯಿಸಿ", - "auth_login_title": "ಅಧಿಕೃತ ಲಾಗಿನ್", - "forget_password": "ಪಾಸ್ವರ್ಡ್ ಮರೆತಿರಾ?", - "forget_password_instruction": "ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರನ್ನು ನಮೂದಿಸಿ ಮತ್ತು ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಮರುಹೊಂದಿಸಲು ನಾವು ನಿಮಗೆ ಲಿಂಕ್ ಅನ್ನು ಕಳುಹಿಸುತ್ತೇವೆ.", - "send_reset_link": "ಮರುಹೊಂದಿಸುವ ಲಿಂಕ್ ಕಳುಹಿಸಿ", - "already_a_member": "ಈಗಾಗಲೇ ಸದಸ್ಯರೇ?", - "password_sent": "ಪಾಸ್ವರ್ಡ್ ಮರುಹೊಂದಿಸುವ ಇಮೇಲ್ ಕಳುಹಿಸಲಾಗಿದೆ", - "password_reset_success": "ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಮರುಹೊಂದಿಸಲಾಗಿದೆ", - "password_reset_failure": "ಪಾಸ್ವರ್ಡ್ ಮರುಹೊಂದಿಸಲು ವಿಫಲವಾಗಿದೆ", - "reset_password": "ಪಾಸ್ವರ್ಡ್ ಮರುಹೊಂದಿಸಿ", - "available_in": "ಲಭ್ಯವಿರುವ ಭಾಷೆಗಳು", - "sign_out": "ಸೈನ್ ಔಟ್ ಮಾಡಿ", - "back_to_login": "ಲಾಗಿನ್ ಪುಟಕ್ಕೆ ಹಿಂತಿರುಗಿ", - "min_password_len_8": "ಕನಿಷ್ಠ ಪಾಸ್‌ವರ್ಡ್ ಉದ್ದ 8", - "req_atleast_one_digit": "ಕನಿಷ್ಠ ಒಂದು ಅಂಕಿ ಅಗತ್ಯವಿದೆ", - "req_atleast_one_uppercase": "ಕನಿಷ್ಠ ಒಂದು ದೊಡ್ಡ ಪ್ರಕರಣದ ಅಗತ್ಯವಿದೆ", - "req_atleast_one_lowercase": "ಕನಿಷ್ಠ ಒಂದು ಸಣ್ಣ ಅಕ್ಷರದ ಅಗತ್ಯವಿದೆ", - "req_atleast_one_symbol": "ಕನಿಷ್ಠ ಒಂದು ಚಿಹ್ನೆಯ ಅಗತ್ಯವಿದೆ", - "bed_search_placeholder": "ಹಾಸಿಗೆಗಳ ಹೆಸರಿನ ಮೂಲಕ ಹುಡುಕಿ", + "404_message": "ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲದ ಅಥವಾ ಇನ್ನೊಂದು URL ಗೆ ಸರಿಸಿದ ಪುಟದಲ್ಲಿ ನೀವು ಎಡವಿ ಬಿದ್ದಿರುವಂತೆ ತೋರುತ್ತಿದೆ. ನೀವು ಸರಿಯಾದ ಲಿಂಕ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ!", + "AUTOMATED": "ಸ್ವಯಂಚಾಲಿತ", + "Assets": "ಸ್ವತ್ತುಗಳು", "BED_WITH_OXYGEN_SUPPORT": "ಆಮ್ಲಜನಕ ಬೆಂಬಲದೊಂದಿಗೆ ಬೆಡ್", - "REGULAR": "ನಿಯಮಿತ", + "CONSCIOUSNESS_LEVEL__AGITATED_OR_CONFUSED": "ಕ್ಷೋಭೆ ಅಥವಾ ಗೊಂದಲ", + "CONSCIOUSNESS_LEVEL__ALERT": "ಎಚ್ಚರಿಕೆ", + "CONSCIOUSNESS_LEVEL__ONSET_OF_AGITATION_AND_CONFUSION": "ಆಂದೋಲನ ಮತ್ತು ಗೊಂದಲದ ಆರಂಭ", + "CONSCIOUSNESS_LEVEL__RESPONDS_TO_PAIN": "ನೋವಿಗೆ ಸ್ಪಂದಿಸುತ್ತದೆ", + "CONSCIOUSNESS_LEVEL__RESPONDS_TO_VOICE": "ಧ್ವನಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತದೆ", + "CONSCIOUSNESS_LEVEL__UNRESPONSIVE": "ಪ್ರತಿಕ್ರಿಯಿಸದ", + "Cancel": "ರದ್ದುಮಾಡಿ", + "DD/MM/YYYY": "DD/MM/YYYY", + "DOCTORS_LOG": "ಪ್ರಗತಿ ಟಿಪ್ಪಣಿ", + "Dashboard": "ಡ್ಯಾಶ್‌ಬೋರ್ಡ್", + "Facilities": "ಸೌಲಭ್ಯಗಳು", + "GENDER__1": "ಪುರುಷ", + "GENDER__2": "ಹೆಣ್ಣು", + "GENDER__3": "ಬೈನರಿ ಅಲ್ಲದ", + "HEARTBEAT_RHYTHM__IRREGULAR": "ಅನಿಯಮಿತ", + "HEARTBEAT_RHYTHM__REGULAR": "ನಿಯಮಿತ", + "HEARTBEAT_RHYTHM__UNKNOWN": "ಅಜ್ಞಾತ", "ICU": "ಐಸಿಯು", + "INSULIN_INTAKE_FREQUENCY__BD": "ದಿನಕ್ಕೆ ಎರಡು ಬಾರಿ (BD)", + "INSULIN_INTAKE_FREQUENCY__OD": "ದಿನಕ್ಕೆ ಒಮ್ಮೆ (OD)", + "INSULIN_INTAKE_FREQUENCY__TD": "ದಿನಕ್ಕೆ ಮೂರು ಬಾರಿ (ಟಿಡಿ)", + "INSULIN_INTAKE_FREQUENCY__UNKNOWN": "ಅಜ್ಞಾತ", "ISOLATION": "ಪ್ರತ್ಯೇಕತೆ", - "add_beds": "ಬೆಡ್(ಗಳು) ಸೇರಿಸಿ", - "update_bed": "ಹಾಸಿಗೆಯನ್ನು ನವೀಕರಿಸಿ", - "bed_type": "ಹಾಸಿಗೆಯ ಪ್ರಕಾರ", - "make_multiple_beds_label": "ನೀವು ಬಹು ಹಾಸಿಗೆಗಳನ್ನು ಮಾಡಲು ಬಯಸುವಿರಾ?", - "number_of_beds": "ಹಾಸಿಗೆಗಳ ಸಂಖ್ಯೆ", - "number_of_beds_out_of_range_error": "ಹಾಸಿಗೆಗಳ ಸಂಖ್ಯೆ 100 ಕ್ಕಿಂತ ಹೆಚ್ಚಿರಬಾರದು", - "goal": "ಡಿಜಿಟಲ್ ಉಪಕರಣಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಸಾರ್ವಜನಿಕ ಆರೋಗ್ಯ ಸೇವೆಗಳ ಗುಣಮಟ್ಟ ಮತ್ತು ಪ್ರವೇಶವನ್ನು ನಿರಂತರವಾಗಿ ಸುಧಾರಿಸುವುದು ನಮ್ಮ ಗುರಿಯಾಗಿದೆ", - "something_wrong": "ಏನೋ ತಪ್ಪಾಗಿದೆ! ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ!", - "try_again_later": "ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ!", - "contribute_github": "GitHub ನಲ್ಲಿ ಕೊಡುಗೆ ನೀಡಿ", - "footer_body": "ಕೊರೊನಾಸೇಫ್ ನೆಟ್‌ವರ್ಕ್ ಎಂಬುದು ತೆರೆದ ಮೂಲ ಸಾರ್ವಜನಿಕ ಉಪಯುಕ್ತತೆಯಾಗಿದ್ದು, ನಾವೀನ್ಯಕಾರರು ಮತ್ತು ಸ್ವಯಂಸೇವಕರ ಬಹು-ಶಿಸ್ತಿನ ತಂಡದಿಂದ ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ. ಕರೋನಾ ಸೇಫ್ ಕೇರ್ ವಿಶ್ವಸಂಸ್ಥೆಯಿಂದ ಗುರುತಿಸಲ್ಪಟ್ಟ ಡಿಜಿಟಲ್ ಸಾರ್ವಜನಿಕ ಸೇವೆಯಾಗಿದೆ.", - "reset": "ಮರುಹೊಂದಿಸಿ", - "download": "ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ", - "downloads": "ಡೌನ್‌ಲೋಡ್‌ಗಳು", - "downloading": "ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ", - "generating": "ಉತ್ಪಾದಿಸುತ್ತಿದೆ", - "send_email": "ಇಮೇಲ್ ಕಳುಹಿಸಿ", - "email_address": "ಇಮೇಲ್ ವಿಳಾಸ", - "email_success": "ನಾವು ಶೀಘ್ರದಲ್ಲೇ ಇಮೇಲ್ ಕಳುಹಿಸುತ್ತೇವೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಇನ್‌ಬಾಕ್ಸ್ ಪರಿಶೀಲಿಸಿ.", - "disclaimer": "ಹಕ್ಕು ನಿರಾಕರಣೆ", - "category": "ವರ್ಗ", - "sub_category": "ಉಪ ವರ್ಗ", - "download_type": "ಡೌನ್‌ಲೋಡ್ ಪ್ರಕಾರ", - "state": "ರಾಜ್ಯ", - "location": "ಸ್ಥಳ", - "ward": "ವಾರ್ಡ್", + "KASP Empanelled": "ಕೆಎಎಸ್ಪಿ ಎಂಪನೇಲ್ಡ್", + "LIMB_RESPONSE__EXTENSION": "ವಿಸ್ತರಣೆ", + "LIMB_RESPONSE__FLEXION": "ಬಾಗುವಿಕೆ", + "LIMB_RESPONSE__MODERATE": "ಮಧ್ಯಮ", + "LIMB_RESPONSE__NONE": "ಯಾವುದೂ ಇಲ್ಲ", + "LIMB_RESPONSE__STRONG": "ಬಲಶಾಲಿ", + "LIMB_RESPONSE__UNKNOWN": "ಅಜ್ಞಾತ", + "LIMB_RESPONSE__WEAK": "ದುರ್ಬಲ", + "NORMAL": "ಸಂಕ್ಷಿಪ್ತ ನವೀಕರಣ", + "NURSING_CARE_PROCEDURE__catheter_care": "ಕ್ಯಾತಿಟರ್ ಕೇರ್", + "NURSING_CARE_PROCEDURE__chest_tube_care": "ಚೆಸ್ಟ್ ಟ್ಯೂಬ್ ಕೇರ್", + "NURSING_CARE_PROCEDURE__dressing": "ಡ್ರೆಸ್ಸಿಂಗ್", + "NURSING_CARE_PROCEDURE__dvt_pump_stocking": "DVT ಪಂಪ್ ಸ್ಟಾಕಿಂಗ್", + "NURSING_CARE_PROCEDURE__iv_sitecare": "IV ಸೈಟ್ ಕೇರ್", + "NURSING_CARE_PROCEDURE__nubulisation": "ನೂಬುಲೈಸೇಶನ್", + "NURSING_CARE_PROCEDURE__personal_hygiene": "ವೈಯಕ್ತಿಕ ನೈರ್ಮಲ್ಯ", + "NURSING_CARE_PROCEDURE__positioning": "ಸ್ಥಾನೀಕರಣ", + "NURSING_CARE_PROCEDURE__restrain": "ನಿಗ್ರಹಿಸಿ", + "NURSING_CARE_PROCEDURE__ryles_tube_care": "ರೈಲ್ಸ್ ಟ್ಯೂಬ್ ಕೇರ್", + "NURSING_CARE_PROCEDURE__stoma_care": "ಸ್ಟೊಮಾ ಕೇರ್", + "NURSING_CARE_PROCEDURE__suctioning": "ಹೀರುವುದು", + "NURSING_CARE_PROCEDURE__tracheostomy_care": "ಟ್ರಾಕಿಯೊಸ್ಟೊಮಿ ಕೇರ್", "Notice Board": "ಸೂಚನಾ ಫಲಕ", - "Assets": "ಸ್ವತ್ತುಗಳು", "Notifications": "ಅಧಿಸೂಚನೆಗಳು", + "OXYGEN_MODALITY__HIGH_FLOW_NASAL_CANNULA": "ಹೈ ಫ್ಲೋ ನಾಸಲ್ ಕ್ಯಾನುಲಾ", + "OXYGEN_MODALITY__NASAL_PRONGS": "ಮೂಗಿನ ಪ್ರಾಂಗ್ಸ್", + "OXYGEN_MODALITY__NON_REBREATHING_MASK": "ನಾನ್ ರಿಬ್ರೆಥಿಂಗ್ ಮಾಸ್ಕ್", + "OXYGEN_MODALITY__SIMPLE_FACE_MASK": "ಸರಳ ಫೇಸ್ ಮಾಸ್ಕ್", + "PRESCRIPTION_FREQUENCY_BD": "ದಿನಕ್ಕೆ ಎರಡು ಬಾರಿ", + "PRESCRIPTION_FREQUENCY_HS": "ರಾತ್ರಿ ಮಾತ್ರ", + "PRESCRIPTION_FREQUENCY_OD": "ದಿನಕ್ಕೆ ಒಮ್ಮೆ", + "PRESCRIPTION_FREQUENCY_Q4H": "4 ನೇ ಗಂಟೆಗೆ", + "PRESCRIPTION_FREQUENCY_QID": "6 ನೇ ಗಂಟೆಗೆ", + "PRESCRIPTION_FREQUENCY_QOD": "ಪರ್ಯಾಯ ದಿನ", + "PRESCRIPTION_FREQUENCY_QWK": "ವಾರಕ್ಕೊಮ್ಮೆ", + "PRESCRIPTION_FREQUENCY_STAT": "ತಕ್ಷಣವೇ", + "PRESCRIPTION_FREQUENCY_TID": "8 ನೇ ಗಂಟೆಗೆ", + "PRESCRIPTION_ROUTE_IM": "IM", + "PRESCRIPTION_ROUTE_INHALATION": "ಇನ್ಹಲೇಷನ್", + "PRESCRIPTION_ROUTE_INTRATHECAL": "ಇಂಟ್ರಾಥೆಕಲ್ ಇಂಜೆಕ್ಷನ್", + "PRESCRIPTION_ROUTE_IV": "IV", + "PRESCRIPTION_ROUTE_NASOGASTRIC": "ನಾಸೊಗ್ಯಾಸ್ಟ್ರಿಕ್ / ಗ್ಯಾಸ್ಟ್ರೋಸ್ಟೊಮಿ ಟ್ಯೂಬ್", + "PRESCRIPTION_ROUTE_ORAL": "ಮೌಖಿಕ", + "PRESCRIPTION_ROUTE_RECTAL": "ಗುದನಾಳ", + "PRESCRIPTION_ROUTE_SC": "ಎಸ್/ಸಿ", + "PRESCRIPTION_ROUTE_SUBLINGUAL": "ಉಪಭಾಷೆ", + "PRESCRIPTION_ROUTE_TRANSDERMAL": "ಟ್ರಾನ್ಸ್ಡರ್ಮಲ್", + "PUPIL_REACTION__BRISK": "ಚುರುಕಾದ", + "PUPIL_REACTION__CANNOT_BE_ASSESSED": "ಮೌಲ್ಯಮಾಪನ ಮಾಡಲಾಗುವುದಿಲ್ಲ", + "PUPIL_REACTION__FIXED": "ನಿವಾರಿಸಲಾಗಿದೆ", + "PUPIL_REACTION__SLUGGISH": "ಜಡ", + "PUPIL_REACTION__UNKNOWN": "ಅಜ್ಞಾತ", + "Patients": "ರೋಗಿಗಳು", + "Profile": "ಪ್ರೊಫೈಲ್", + "REGULAR": "ನಿಯಮಿತ", + "RESPIRATORY_SUPPORT_SHORT__INVASIVE": "IV", + "RESPIRATORY_SUPPORT_SHORT__NON_INVASIVE": "NIV", + "RESPIRATORY_SUPPORT_SHORT__OXYGEN_SUPPORT": "O2 ಬೆಂಬಲ", + "RESPIRATORY_SUPPORT_SHORT__UNKNOWN": "ಯಾವುದೂ ಇಲ್ಲ", + "RESPIRATORY_SUPPORT__INVASIVE": "ಆಕ್ರಮಣಕಾರಿ ವೆಂಟಿಲೇಟರ್ (IV)", + "RESPIRATORY_SUPPORT__NON_INVASIVE": "ನಾನ್-ಇನ್ವೇಸಿವ್ ವೆಂಟಿಲೇಟರ್ (NIV)", + "RESPIRATORY_SUPPORT__OXYGEN_SUPPORT": "ಆಮ್ಲಜನಕ ಬೆಂಬಲ", + "RESPIRATORY_SUPPORT__UNKNOWN": "ಯಾವುದೂ ಇಲ್ಲ", + "Resource": "ಸಂಪನ್ಮೂಲ", + "SORT_OPTIONS__-bed__name": "ಹಾಸಿಗೆ ಸಂಖ್ಯೆ N-1", + "SORT_OPTIONS__-category_severity": "ಅತ್ಯಧಿಕ ತೀವ್ರತೆಯ ವಿಭಾಗ ಮೊದಲು", + "SORT_OPTIONS__-created_date": "ಇತ್ತೀಚಿಗೆ ರಚಿಸಿದ ದಿನಾಂಕ ಮೊದಲು", + "SORT_OPTIONS__-modified_date": "ಮೊದಲು ಇತ್ತೀಚಿನ ನವೀಕರಿಸಿದ ದಿನಾಂಕ", + "SORT_OPTIONS__-name": "ರೋಗಿಯ ಹೆಸರು ZA", + "SORT_OPTIONS__-review_time": "ಇತ್ತೀಚಿನ ವಿಮರ್ಶೆ ದಿನಾಂಕ ಮೊದಲು", + "SORT_OPTIONS__-taken_at": "ಇತ್ತೀಚೆಗೆ ತೆಗೆದುಕೊಂಡ ದಿನಾಂಕ ಮೊದಲು", + "SORT_OPTIONS__bed__name": "ಹಾಸಿಗೆ ಸಂಖ್ಯೆ 1-N", + "SORT_OPTIONS__category_severity": "ಕಡಿಮೆ ತೀವ್ರತೆಯ ವರ್ಗ ಮೊದಲು", + "SORT_OPTIONS__created_date": "ಮೊದಲು ರಚಿಸಿದ ಹಳೆಯ ದಿನಾಂಕ", + "SORT_OPTIONS__facility__name,-last_consultation__current_bed__bed__name": "ಹಾಸಿಗೆ ಸಂಖ್ಯೆ N-1", + "SORT_OPTIONS__facility__name,last_consultation__current_bed__bed__name": "ಹಾಸಿಗೆ ಸಂಖ್ಯೆ 1-N", + "SORT_OPTIONS__modified_date": "ಹಳೆಯ ನವೀಕರಿಸಿದ ದಿನಾಂಕ ಮೊದಲು", + "SORT_OPTIONS__name": "ರೋಗಿಯ ಹೆಸರು AZ", + "SORT_OPTIONS__review_time": "ಹಳೆಯ ವಿಮರ್ಶೆ ದಿನಾಂಕ ಮೊದಲು", + "SORT_OPTIONS__taken_at": "ಹಳೆಯ ತೆಗೆದ ದಿನಾಂಕ ಮೊದಲು", + "SORT_OPTIONS__unsupported_browser_description": "ನಿಮ್ಮ ಬ್ರೌಸರ್ ({{name}} ಆವೃತ್ತಿ {{version}}) ಬೆಂಬಲಿತವಾಗಿಲ್ಲ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಗೆ ನವೀಕರಿಸಿ ಅಥವಾ ಉತ್ತಮ ಅನುಭವಕ್ಕಾಗಿ ಬೆಂಬಲಿತ ಬ್ರೌಸರ್‌ಗೆ ಬದಲಿಸಿ.", + "Sample Test": "ಮಾದರಿ ಪರೀಕ್ಷೆ", + "Shifting": "ಸ್ಥಳಾಂತರ", "Submit": "ಸಲ್ಲಿಸಿ", - "Cancel": "ರದ್ದುಮಾಡಿ", - "powered_by": "ನಡೆಸಲ್ಪಡುತ್ತಿದೆ", - "care": "ಕಾಳಜಿ", - "something_went_wrong": "ಏನೋ ತಪ್ಪಾಗಿದೆ..!", - "stop": "ನಿಲ್ಲಿಸು", - "record": "ರೆಕಾರ್ಡ್ ಆಡಿಯೋ", - "recording": "ರೆಕಾರ್ಡಿಂಗ್", - "yes": "ಹೌದು", - "no": "ಸಂ", - "status": "ಸ್ಥಿತಿ", - "created": "ರಚಿಸಲಾಗಿದೆ", - "modified": "ಮಾರ್ಪಡಿಸಲಾಗಿದೆ", - "updated": "ನವೀಕರಿಸಲಾಗಿದೆ", - "configure": "ಕಾನ್ಫಿಗರ್ ಮಾಡಿ", - "assigned_to": "ಗೆ ನಿಯೋಜಿಸಲಾಗಿದೆ", - "cancel": "ರದ್ದುಮಾಡಿ", - "clear": "ತೆರವುಗೊಳಿಸಿ", - "apply": "ಅನ್ವಯಿಸು", - "filter_by": "ಮೂಲಕ ಫಿಲ್ಟರ್ ಮಾಡಿ", - "filter": "ಫಿಲ್ಟರ್", - "settings_and_filters": "ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಫಿಲ್ಟರ್‌ಗಳು", - "ordering": "ಆರ್ಡರ್ ಮಾಡಲಾಗುತ್ತಿದೆ", - "international_mobile": "ಅಂತಾರಾಷ್ಟ್ರೀಯ ಮೊಬೈಲ್", - "indian_mobile": "ಭಾರತೀಯ ಮೊಬೈಲ್", - "mobile": "ಮೊಬೈಲ್", - "landline": "ಭಾರತೀಯ ಸ್ಥಿರ ದೂರವಾಣಿ", - "support": "ಬೆಂಬಲ", - "emergency_contact_number": "ತುರ್ತು ಸಂಪರ್ಕ ಸಂಖ್ಯೆ", - "last_modified": "ಕೊನೆಯದಾಗಿ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ", - "patient_address": "ರೋಗಿಯ ವಿಳಾಸ", - "all_details": "ಎಲ್ಲಾ ವಿವರಗಳು", - "confirm": "ದೃಢೀಕರಿಸಿ", - "refresh_list": "ಪಟ್ಟಿಯನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ", - "last_edited": "ಕೊನೆಯದಾಗಿ ಸಂಪಾದಿಸಲಾಗಿದೆ", - "audit_log": "ಆಡಿಟ್ ಲಾಗ್", - "comments": "ಕಾಮೆಂಟ್‌ಗಳು", - "contact_person_number": "ಸಂಪರ್ಕ ವ್ಯಕ್ತಿಯ ಸಂಖ್ಯೆ", - "referral_letter": "ಉಲ್ಲೇಖ ಪತ್ರ", - "print": "ಮುದ್ರಿಸು", - "print_referral_letter": "ರೆಫರಲ್ ಲೆಟರ್ ಅನ್ನು ಮುದ್ರಿಸಿ", - "date_of_positive_covid_19_swab": "ಧನಾತ್ಮಕ ಕೋವಿಡ್ 19 ಸ್ವ್ಯಾಬ್ ದಿನಾಂಕ", - "patient_no": "OP/IP ಸಂ", - "date_of_admission": "ಪ್ರವೇಶ ದಿನಾಂಕ", - "india_1": "ಭಾರತ", - "unique_id": "ವಿಶಿಷ್ಟ ಐಡಿ", - "date_and_time": "ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", - "facility_type": "ಸೌಲಭ್ಯದ ಪ್ರಕಾರ", - "number_of_chronic_diseased_dependents": "ದೀರ್ಘಕಾಲದ ರೋಗಗಳ ಅವಲಂಬಿತರ ಸಂಖ್ಯೆ", - "number_of_aged_dependents_above_60": "ವಯಸ್ಸಾದ ಅವಲಂಬಿತರ ಸಂಖ್ಯೆ (60 ಕ್ಕಿಂತ ಹೆಚ್ಚು)", - "ongoing_medications": "ನಡೆಯುತ್ತಿರುವ ಔಷಧಿಗಳು", - "countries_travelled": "ದೇಶಗಳು ಸಂಚರಿಸಿದವು", - "travel_within_last_28_days": "ದೇಶೀಯ/ಅಂತರರಾಷ್ಟ್ರೀಯ ಪ್ರಯಾಣ (ಕಳೆದ 28 ದಿನಗಳಲ್ಲಿ)", - "estimated_contact_date": "ಅಂದಾಜು ಸಂಪರ್ಕ ದಿನಾಂಕ", - "blood_group": "ರಕ್ತದ ಗುಂಪು", - "date_of_birth": "ಹುಟ್ಟಿದ ದಿನಾಂಕ", - "date_of_test": "ಪರೀಕ್ಷೆಯ ದಿನಾಂಕ", - "srf_id": "SRF ID", - "contact_number": "ಸಂಪರ್ಕ ಸಂಖ್ಯೆ", - "diagnosis": "ರೋಗನಿರ್ಣಯ", - "copied_to_clipboard": "ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಲಾಗಿದೆ", - "is": "ಆಗಿದೆ", - "reason": "ಕಾರಣ", - "description": "ವಿವರಣೆ", - "name": "ಹೆಸರು", - "address": "ವಿಳಾಸ", - "phone": "ಫೋನ್", - "nationality": "ರಾಷ್ಟ್ರೀಯತೆ", - "allergies": "ಅಲರ್ಜಿಗಳು", - "type_your_comment": "ನಿಮ್ಮ ಕಾಮೆಂಟ್ ಅನ್ನು ಟೈಪ್ ಮಾಡಿ", - "any_other_comments": "ಯಾವುದೇ ಇತರ ಕಾಮೆಂಟ್‌ಗಳು", - "loading": "ಲೋಡ್ ಆಗುತ್ತಿದೆ...", - "facility": "ಸೌಲಭ್ಯ", - "local_body": "ಸ್ಥಳೀಯ ಸಂಸ್ಥೆ", - "filters": "ಶೋಧಕಗಳು", - "unknown": "ಅಜ್ಞಾತ", + "TELEMEDICINE": "ಟೆಲಿಮೆಡಿಸಿನ್", + "Users": "ಬಳಕೆದಾರರು", + "VENTILATOR": "ವಿವರವಾದ ನವೀಕರಣ", + "VENTILATOR_MODE__CMV": "ಕಂಟ್ರೋಲ್ ಮೆಕ್ಯಾನಿಕಲ್ ವೆಂಟಿಲೇಷನ್ (CMV)", + "VENTILATOR_MODE__PCV": "ಪ್ರೆಶರ್ ಕಂಟ್ರೋಲ್ ವೆಂಟಿಲೇಷನ್ (PCV)", + "VENTILATOR_MODE__PC_SIMV": "ಒತ್ತಡ ನಿಯಂತ್ರಿತ SIMV (PC-SIMV)", + "VENTILATOR_MODE__PSV": "C-PAP / ಪ್ರೆಶರ್ ಸಪೋರ್ಟ್ ವೆಂಟಿಲೇಷನ್ (PSV)", + "VENTILATOR_MODE__SIMV": "ಸಿಂಕ್ರೊನೈಸ್ ಮಾಡಿದ ಮಧ್ಯಂತರ ಕಡ್ಡಾಯ ವಾತಾಯನ (SIMV)", + "VENTILATOR_MODE__VCV": "ವಾಲ್ಯೂಮ್ ಕಂಟ್ರೋಲ್ ವೆಂಟಿಲೇಶನ್ (VCV)", + "VENTILATOR_MODE__VC_SIMV": "ವಾಲ್ಯೂಮ್ ಕಂಟ್ರೋಲ್ಡ್ SIMV (VC-SIMV)", + "View Facility": "ವೀಕ್ಷಣೆ ಸೌಲಭ್ಯ", + "action_irreversible": "ಈ ಕ್ರಿಯೆಯು ಬದಲಾಯಿಸಲಾಗದು", "active": "ಸಕ್ರಿಯ", - "completed": "ಪೂರ್ಣಗೊಂಡಿದೆ", - "on": "ಆನ್", - "open": "ತೆರೆಯಿರಿ", - "features": "ವೈಶಿಷ್ಟ್ಯಗಳು", - "pincode": "ಪಿನ್‌ಕೋಡ್", - "required": "ಅಗತ್ಯವಿದೆ", - "field_required": "ಈ ಕ್ಷೇತ್ರದ ಅಗತ್ಯವಿದೆ", - "litres": "ಲೀಟರ್", - "litres_per_day": "ಲೀಟರ್ / ದಿನ", - "invalid_pincode": "ಅಮಾನ್ಯವಾದ ಪಿನ್‌ಕೋಡ್", - "invalid_phone_number": "ಅಮಾನ್ಯವಾದ ಫೋನ್ ಸಂಖ್ಯೆ", - "latitude_invalid": "ಅಕ್ಷಾಂಶವು -90 ಮತ್ತು 90 ರ ನಡುವೆ ಇರಬೇಕು", - "longitude_invalid": "ರೇಖಾಂಶವು -180 ಮತ್ತು 180 ರ ನಡುವೆ ಇರಬೇಕು", - "save": "ಉಳಿಸಿ", - "continue": "ಮುಂದುವರಿಸಿ", - "save_and_continue": "ಉಳಿಸಿ ಮತ್ತು ಮುಂದುವರಿಸಿ", - "select": "ಆಯ್ಕೆ ಮಾಡಿ", - "lsg": "Lsg", - "delete": "ಅಳಿಸಿ", - "remove": "ತೆಗೆದುಹಾಕಿ", - "max_size_for_image_uploaded_should_be": "ಅಪ್‌ಲೋಡ್ ಮಾಡಿದ ಚಿತ್ರಕ್ಕೆ ಗರಿಷ್ಠ ಗಾತ್ರ ಇರಬೇಕು", - "allowed_formats_are": "ಅನುಮತಿಸಲಾದ ಸ್ವರೂಪಗಳು", - "recommended_aspect_ratio_for": "ಇದಕ್ಕಾಗಿ ಶಿಫಾರಸು ಮಾಡಲಾದ ಆಕಾರ ಅನುಪಾತ", - "drag_drop_image_to_upload": "ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಚಿತ್ರವನ್ನು ಎಳೆಯಿರಿ ಮತ್ತು ಬಿಡಿ", - "upload_an_image": "ಚಿತ್ರವನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿ", - "upload": "ಅಪ್ಲೋಡ್ ಮಾಡಿ", - "uploading": "ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ", - "switch": "ಬದಲಿಸಿ", - "capture": "ಸೆರೆಹಿಡಿಯಿರಿ", - "retake": "ಮರುಪಡೆಯಿರಿ", - "submit": "ಸಲ್ಲಿಸಿ", - "camera": "ಕ್ಯಾಮೆರಾ", - "camera_permission_denied": "ಕ್ಯಾಮೆರಾ ಅನುಮತಿ ನಿರಾಕರಿಸಲಾಗಿದೆ", - "submitting": "ಸಲ್ಲಿಸಲಾಗುತ್ತಿದೆ", - "view_details": "ವಿವರಗಳನ್ನು ವೀಕ್ಷಿಸಿ", - "type_to_search": "ಹುಡುಕಲು ಟೈಪ್ ಮಾಡಿ", - "show_all": "ಎಲ್ಲವನ್ನೂ ತೋರಿಸು", - "hide": "ಮರೆಮಾಡಿ", - "select_skills": "ಕೆಲವು ಕೌಶಲ್ಯಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ ಮತ್ತು ಸೇರಿಸಿ", - "contact_your_admin_to_add_skills": "ಕೌಶಲ್ಯಗಳನ್ನು ಸೇರಿಸಲು ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ", + "active_prescriptions": "ಸಕ್ರಿಯ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ಗಳು", "add": "ಸೇರಿಸಿ", "add_as": "ಎಂದು ಸೇರಿಸಿ", - "sort_by": "ವಿಂಗಡಿಸಿ", - "none": "ಯಾವುದೂ ಇಲ್ಲ", - "choose_file": "ಸಾಧನದಿಂದ ಅಪ್ಲೋಡ್ ಮಾಡಿ", - "open_camera": "ಕ್ಯಾಮರಾ ತೆರೆಯಿರಿ", - "file_preview": "ಫೈಲ್ ಪೂರ್ವವೀಕ್ಷಣೆ", - "file_preview_not_supported": "ಈ ಫೈಲ್ ಅನ್ನು ಪೂರ್ವವೀಕ್ಷಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಅದನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ.", - "view_faciliy": "ವೀಕ್ಷಣೆ ಸೌಲಭ್ಯ", - "view_patients": "ರೋಗಿಗಳನ್ನು ವೀಕ್ಷಿಸಿ", - "frequency": "ಆವರ್ತನ", - "days": "ದಿನಗಳು", - "never": "ಎಂದಿಗೂ", + "add_beds": "ಬೆಡ್(ಗಳು) ಸೇರಿಸಿ", + "add_details_of_patient": "ರೋಗಿಯ ವಿವರಗಳನ್ನು ಸೇರಿಸಿ", + "add_location": "ಸ್ಥಳವನ್ನು ಸೇರಿಸಿ", + "add_new_user": "ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ", "add_notes": "ಟಿಪ್ಪಣಿಗಳನ್ನು ಸೇರಿಸಿ", - "notes_placeholder": "ನಿಮ್ಮ ಟಿಪ್ಪಣಿಗಳನ್ನು ಟೈಪ್ ಮಾಡಿ", - "optional": "ಐಚ್ಛಿಕ", - "discontinue": "ಸ್ಥಗಿತಗೊಳಿಸಿ", - "discontinued": "ಸ್ಥಗಿತಗೊಳಿಸಲಾಗಿದೆ", - "not_specified": "ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿಲ್ಲ", + "add_prescription_medication": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಔಷಧಿಗಳನ್ನು ಸೇರಿಸಿ", + "add_prescription_to_consultation_note": "ಈ ಸಮಾಲೋಚನೆಗೆ ಹೊಸ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಸೇರಿಸಿ.", + "add_prn_prescription": "PRN ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಸೇರಿಸಿ", + "address": "ವಿಳಾಸ", + "administer": "ನಿರ್ವಹಿಸು", + "administer_medicine": "ಔಷಧವನ್ನು ನಿರ್ವಹಿಸಿ", + "administer_medicines": "ಔಷಧಗಳನ್ನು ನಿರ್ವಹಿಸಿ", + "administer_selected_medicines": "ಆಯ್ದ ಔಷಧಗಳನ್ನು ನಿರ್ವಹಿಸಿ", + "administered_on": "ರಂದು ನಿರ್ವಹಿಸಲಾಗಿದೆ", + "administration_dosage_range_error": "ಡೋಸೇಜ್ ಪ್ರಾರಂಭ ಮತ್ತು ಗುರಿ ಡೋಸೇಜ್ ನಡುವೆ ಇರಬೇಕು", + "administration_notes": "ಆಡಳಿತ ಟಿಪ್ಪಣಿಗಳು", + "advanced_filters": "ಸುಧಾರಿತ ಫಿಲ್ಟರ್‌ಗಳು", + "age": "ವಯಸ್ಸು", "all_changes_have_been_saved": "ಎಲ್ಲಾ ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಲಾಗಿದೆ", - "no_data_found": "ಯಾವುದೇ ಡೇಟಾ ಕಂಡುಬಂದಿಲ್ಲ", - "edit": "ಸಂಪಾದಿಸು", - "clear_selection": "ಆಯ್ಕೆಯನ್ನು ತೆರವುಗೊಳಿಸಿ", - "select_date": "ದಿನಾಂಕವನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "DD/MM/YYYY": "DD/MM/YYYY", - "clear_all_filters": "ಎಲ್ಲಾ ಫಿಲ್ಟರ್‌ಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ", - "summary": "ಸಾರಾಂಶ", - "report": "ವರದಿ", - "treating_doctor": "ಚಿಕಿತ್ಸೆ ನೀಡುತ್ತಿರುವ ವೈದ್ಯರು", - "ration_card__NO_CARD": "ಕಾರ್ಡ್ ಅಲ್ಲದ ಹೋಲ್ಡರ್", - "ration_card__BPL": "ಬಿಪಿಎಲ್", - "ration_card__APL": "ಎಪಿಎಲ್", - "empty_date_time": "--:-- --; ------------", - "caution": "ಎಚ್ಚರಿಕೆ", - "feed_optimal_experience_for_phones": "ಅತ್ಯುತ್ತಮ ವೀಕ್ಷಣೆಯ ಅನುಭವಕ್ಕಾಗಿ, ನಿಮ್ಮ ಸಾಧನವನ್ನು ತಿರುಗಿಸಲು ಪರಿಗಣಿಸಿ.", - "feed_optimal_experience_for_apple_phones": "ಅತ್ಯುತ್ತಮ ವೀಕ್ಷಣೆಯ ಅನುಭವಕ್ಕಾಗಿ, ನಿಮ್ಮ ಸಾಧನವನ್ನು ತಿರುಗಿಸಲು ಪರಿಗಣಿಸಿ. ನಿಮ್ಮ ಸಾಧನದ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಸ್ವಯಂ-ತಿರುಗುವಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.", - "action_irreversible": "ಈ ಕ್ರಿಯೆಯು ಬದಲಾಯಿಸಲಾಗದು", - "GENDER__1": "ಪುರುಷ", - "GENDER__2": "ಹೆಣ್ಣು", - "GENDER__3": "ಬೈನರಿ ಅಲ್ಲದ", - "normal": "ಸಾಮಾನ್ಯ", - "done": "ಮುಗಿದಿದೆ", - "view": "ವೀಕ್ಷಿಸಿ", - "rename": "ಮರುಹೆಸರಿಸು", - "more_info": "ಹೆಚ್ಚಿನ ಮಾಹಿತಿ", + "all_details": "ಎಲ್ಲಾ ವಿವರಗಳು", + "allergies": "ಅಲರ್ಜಿಗಳು", + "allowed_formats_are": "ಅನುಮತಿಸಲಾದ ಸ್ವರೂಪಗಳು", + "already_a_member": "ಈಗಾಗಲೇ ಸದಸ್ಯರೇ?", + "ambulance_driver_name": "ಆಂಬ್ಯುಲೆನ್ಸ್ ಚಾಲಕನ ಹೆಸರು", + "ambulance_number": "ಆಂಬ್ಯುಲೆನ್ಸ್ ನಂ", + "ambulance_phone_number": "ಆಂಬ್ಯುಲೆನ್ಸ್‌ನ ದೂರವಾಣಿ ಸಂಖ್ಯೆ", + "antenatal": "ಪ್ರಸವಪೂರ್ವ", + "any_other_comments": "ಯಾವುದೇ ಇತರ ಕಾಮೆಂಟ್‌ಗಳು", + "apply": "ಅನ್ವಯಿಸು", + "approved_by_district_covid_control_room": "ಜಿಲ್ಲಾ COVID ನಿಯಂತ್ರಣ ಕೊಠಡಿಯಿಂದ ಅನುಮೋದಿಸಲಾಗಿದೆ", + "approving_facility": "ಅನುಮೋದಿಸುವ ಸೌಲಭ್ಯದ ಹೆಸರು", "archive": "ಆರ್ಕೈವ್", - "discard": "ತಿರಸ್ಕರಿಸು", - "live": "ಲೈವ್", - "discharged": "ಡಿಸ್ಚಾರ್ಜ್ ಮಾಡಲಾಗಿದೆ", "archived": "ಆರ್ಕೈವ್ ಮಾಡಲಾಗಿದೆ", - "no_changes_made": "ಯಾವುದೇ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲಾಗಿಲ್ಲ", - "user_deleted_successfuly": "ಬಳಕೆದಾರರನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅಳಿಸಲಾಗಿದೆ", - "users": "ಬಳಕೆದಾರರು", + "are_you_still_watching": "ನೀವು ಇನ್ನೂ ನೋಡುತ್ತಿದ್ದೀರಾ?", "are_you_sure_want_to_delete": "{{name}}ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?", - "oxygen_information": "ಆಮ್ಲಜನಕ ಮಾಹಿತಿ", - "deleted_successfully": "{{name}} ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅಳಿಸಲಾಗಿದೆ", - "delete_item": "{{name}}ಅಳಿಸಿ", - "unsupported_browser": "ಬೆಂಬಲಿತವಲ್ಲದ ಬ್ರೌಸರ್", - "SORT_OPTIONS__unsupported_browser_description": "ನಿಮ್ಮ ಬ್ರೌಸರ್ ({{name}} ಆವೃತ್ತಿ {{version}}) ಬೆಂಬಲಿತವಾಗಿಲ್ಲ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಗೆ ನವೀಕರಿಸಿ ಅಥವಾ ಉತ್ತಮ ಅನುಭವಕ್ಕಾಗಿ ಬೆಂಬಲಿತ ಬ್ರೌಸರ್‌ಗೆ ಬದಲಿಸಿ.", - "SORT_OPTIONS__-created_date": "ಇತ್ತೀಚಿಗೆ ರಚಿಸಿದ ದಿನಾಂಕ ಮೊದಲು", - "SORT_OPTIONS__created_date": "ಮೊದಲು ರಚಿಸಿದ ಹಳೆಯ ದಿನಾಂಕ", - "SORT_OPTIONS__-category_severity": "ಅತ್ಯಧಿಕ ತೀವ್ರತೆಯ ವಿಭಾಗ ಮೊದಲು", - "SORT_OPTIONS__category_severity": "ಕಡಿಮೆ ತೀವ್ರತೆಯ ವರ್ಗ ಮೊದಲು", - "SORT_OPTIONS__-modified_date": "ಮೊದಲು ಇತ್ತೀಚಿನ ನವೀಕರಿಸಿದ ದಿನಾಂಕ", - "SORT_OPTIONS__modified_date": "ಹಳೆಯ ನವೀಕರಿಸಿದ ದಿನಾಂಕ ಮೊದಲು", - "SORT_OPTIONS__facility__name,last_consultation__current_bed__bed__name": "ಹಾಸಿಗೆ ಸಂಖ್ಯೆ 1-N", - "SORT_OPTIONS__facility__name,-last_consultation__current_bed__bed__name": "ಹಾಸಿಗೆ ಸಂಖ್ಯೆ N-1", - "SORT_OPTIONS__-review_time": "ಇತ್ತೀಚಿನ ವಿಮರ್ಶೆ ದಿನಾಂಕ ಮೊದಲು", - "SORT_OPTIONS__review_time": "ಹಳೆಯ ವಿಮರ್ಶೆ ದಿನಾಂಕ ಮೊದಲು", - "SORT_OPTIONS__taken_at": "ಹಳೆಯ ತೆಗೆದ ದಿನಾಂಕ ಮೊದಲು", - "SORT_OPTIONS__-taken_at": "ಇತ್ತೀಚೆಗೆ ತೆಗೆದುಕೊಂಡ ದಿನಾಂಕ ಮೊದಲು", - "SORT_OPTIONS__name": "ರೋಗಿಯ ಹೆಸರು AZ", - "SORT_OPTIONS__-name": "ರೋಗಿಯ ಹೆಸರು ZA", - "SORT_OPTIONS__bed__name": "ಹಾಸಿಗೆ ಸಂಖ್ಯೆ 1-N", - "SORT_OPTIONS__-bed__name": "ಹಾಸಿಗೆ ಸಂಖ್ಯೆ N-1", - "middleware_hostname": "ಮಿಡಲ್ವೇರ್ ಹೋಸ್ಟ್ ಹೆಸರು", - "local_ipaddress": "ಸ್ಥಳೀಯ IP ವಿಳಾಸ", - "no_consultation_updates": "ಸಮಾಲೋಚನೆಯ ನವೀಕರಣಗಳಿಲ್ಲ", - "consultation_updates": "ಸಮಾಲೋಚನೆ ನವೀಕರಣಗಳು", - "update_log": "ಲಾಗ್ ಅನ್ನು ನವೀಕರಿಸಿ", - "record_updates": "ರೆಕಾರ್ಡ್ ನವೀಕರಣಗಳು", - "log_lab_results": "ಲಾಗ್ ಲ್ಯಾಬ್ ಫಲಿತಾಂಶಗಳು", - "no_log_update_delta": "ಹಿಂದಿನ ಲಾಗ್ ನವೀಕರಣದ ನಂತರ ಯಾವುದೇ ಬದಲಾವಣೆಗಳಿಲ್ಲ", - "virtual_nursing_assistant": "ವರ್ಚುವಲ್ ನರ್ಸಿಂಗ್ ಸಹಾಯಕ", - "discharge": "ವಿಸರ್ಜನೆ", - "discharge_summary": "ಡಿಸ್ಚಾರ್ಜ್ ಸಾರಾಂಶ", - "discharge_from_care": "CARE ನಿಂದ ಬಿಡುಗಡೆ", - "generating_discharge_summary": "ಡಿಸ್ಚಾರ್ಜ್ ಸಾರಾಂಶವನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ", - "discharge_summary_not_ready": "ಡಿಸ್ಚಾರ್ಜ್ ಸಾರಾಂಶ ಇನ್ನೂ ಸಿದ್ಧವಾಗಿಲ್ಲ.", - "download_discharge_summary": "ಡಿಸ್ಚಾರ್ಜ್ ಸಾರಾಂಶವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ", - "email_discharge_summary_description": "ಡಿಸ್ಚಾರ್ಜ್ ಸಾರಾಂಶವನ್ನು ಸ್ವೀಕರಿಸಲು ನಿಮ್ಮ ಮಾನ್ಯ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ", - "generated_summary_caution": "ಇದು CARE ವ್ಯವಸ್ಥೆಯಲ್ಲಿ ಸೆರೆಹಿಡಿಯಲಾದ ಮಾಹಿತಿಯನ್ನು ಬಳಸಿಕೊಂಡು ಕಂಪ್ಯೂಟರ್ ರಚಿಸಿದ ಸಾರಾಂಶವಾಗಿದೆ.", - "NORMAL": "ಸಂಕ್ಷಿಪ್ತ ನವೀಕರಣ", - "VENTILATOR": "ವಿವರವಾದ ನವೀಕರಣ", - "DOCTORS_LOG": "ಪ್ರಗತಿ ಟಿಪ್ಪಣಿ", - "AUTOMATED": "ಸ್ವಯಂಚಾಲಿತ", - "TELEMEDICINE": "ಟೆಲಿಮೆಡಿಸಿನ್", - "investigations": "ತನಿಖೆಗಳು", - "search_investigation_placeholder": "ಹುಡುಕಾಟ ತನಿಖೆ ಮತ್ತು ಗುಂಪುಗಳು", - "save_investigation": "ತನಿಖೆಯನ್ನು ಉಳಿಸಿ", - "investigation_reports": "ತನಿಖಾ ವರದಿಗಳು", - "no_investigation": "ಯಾವುದೇ ತನಿಖಾ ವರದಿಗಳು ಕಂಡುಬಂದಿಲ್ಲ", - "investigations_suggested": "ತನಿಖೆಗಳನ್ನು ಸೂಚಿಸಲಾಗಿದೆ", - "to_be_conducted": "ನಡೆಸಲಾಗುವುದು", - "log_report": "ಲಾಗ್ ವರದಿ", - "no_investigation_suggestions": "ಯಾವುದೇ ತನಿಖೆಯ ಸಲಹೆಗಳಿಲ್ಲ", - "select_investigation": "ತನಿಖೆಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಎಲ್ಲಾ ತನಿಖೆಗಳನ್ನು ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಆಯ್ಕೆ ಮಾಡಲಾಗುತ್ತದೆ)", - "select_investigations": "ತನಿಖೆಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "get_tests": "ಪರೀಕ್ಷೆಗಳನ್ನು ಪಡೆಯಿರಿ", - "select_investigation_groups": "ತನಿಖಾ ಗುಂಪುಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "select_groups": "ಗುಂಪುಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "generate_report": "ವರದಿಯನ್ನು ರಚಿಸಿ", - "prev_sessions": "ಹಿಂದಿನ ಅವಧಿಗಳು", - "next_sessions": "ಮುಂದಿನ ಸೆಷನ್‌ಗಳು", - "no_changes": "ಯಾವುದೇ ಬದಲಾವಣೆಗಳಿಲ್ಲ", - "back_to_consultation": "ಸಮಾಲೋಚನೆಗೆ ಹಿಂತಿರುಗಿ", - "no_treating_physicians_available": "ಈ ಸೌಲಭ್ಯವು ಯಾವುದೇ ಮನೆ ಸೌಲಭ್ಯ ವೈದ್ಯರನ್ನು ಹೊಂದಿಲ್ಲ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.", - "encounter_suggestion_edit_disallowed": "ಸಂಪಾದನೆ ಸಮಾಲೋಚನೆಯಲ್ಲಿ ಈ ಆಯ್ಕೆಗೆ ಬದಲಾಯಿಸಲು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ", - "encounter_suggestion__A": "ಪ್ರವೇಶ", - "encounter_suggestion__DC": "ಡೊಮಿಸಿಲಿಯರಿ ಕೇರ್", - "encounter_suggestion__OP": "ಹೊರರೋಗಿಗಳ ಭೇಟಿ", - "encounter_suggestion__DD": "ಸಮಾಲೋಚನೆ", - "encounter_suggestion__HI": "ಸಮಾಲೋಚನೆ", - "encounter_suggestion__R": "ಸಮಾಲೋಚನೆ", - "encounter_date_field_label__A": "ಸೌಲಭ್ಯಕ್ಕೆ ಪ್ರವೇಶದ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", - "encounter_date_field_label__DC": "ಡೊಮಿಸಿಲಿಯರಿ ಕೇರ್ ಪ್ರಾರಂಭದ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", - "encounter_date_field_label__OP": "ಹೊರರೋಗಿ ಭೇಟಿಯ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", - "encounter_date_field_label__DD": "ಸಮಾಲೋಚನೆಯ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", - "encounter_date_field_label__HI": "ಸಮಾಲೋಚನೆಯ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", - "encounter_date_field_label__R": "ಸಮಾಲೋಚನೆಯ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", + "are_you_sure_want_to_delete_this_record": "ಈ ದಾಖಲೆಯನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?", + "asset_class": "ಆಸ್ತಿ ವರ್ಗ", + "asset_location": "ಆಸ್ತಿಯ ಸ್ಥಳ", + "asset_name": "ಆಸ್ತಿ ಹೆಸರು", + "asset_not_found_msg": "ಓಹ್! ನೀವು ಹುಡುಕುತ್ತಿರುವ ಸ್ವತ್ತು ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಸ್ವತ್ತಿನ ಐಡಿಯನ್ನು ಪರಿಶೀಲಿಸಿ.", + "asset_qr_id": "ಆಸ್ತಿ QR ID", + "asset_type": "ಆಸ್ತಿ ಪ್ರಕಾರ", + "assigned_facility": "ಸೌಲಭ್ಯವನ್ನು ನಿಯೋಜಿಸಲಾಗಿದೆ", + "assigned_to": "ಗೆ ನಿಯೋಜಿಸಲಾಗಿದೆ", + "audio__allow_permission": "ದಯವಿಟ್ಟು ಸೈಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಮೈಕ್ರೊಫೋನ್ ಅನುಮತಿಯನ್ನು ಅನುಮತಿಸಿ", + "audio__allow_permission_button": "ಹೇಗೆ ಅನುಮತಿಸಬೇಕೆಂದು ತಿಳಿಯಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ", + "audio__allow_permission_helper": "ನೀವು ಹಿಂದೆ ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶವನ್ನು ನಿರಾಕರಿಸಿರಬಹುದು.", + "audio__record": "ರೆಕಾರ್ಡ್ ಆಡಿಯೋ", + "audio__record_helper": "ರೆಕಾರ್ಡಿಂಗ್ ಪ್ರಾರಂಭಿಸಲು ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿ", + "audio__recorded": "ಆಡಿಯೋ ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗಿದೆ", + "audio__recording": "ರೆಕಾರ್ಡಿಂಗ್", + "audio__recording_helper": "ದಯವಿಟ್ಟು ನಿಮ್ಮ ಮೈಕ್ರೋಫೋನ್‌ನಲ್ಲಿ ಮಾತನಾಡಿ.", + "audio__recording_helper_2": "ರೆಕಾರ್ಡಿಂಗ್ ನಿಲ್ಲಿಸಲು ಬಟನ್ ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡಿ.", + "audio__start_again": "ಮತ್ತೆ ಪ್ರಾರಂಭಿಸಿ", + "audit_log": "ಆಡಿಟ್ ಲಾಗ್", + "auth_login_title": "ಅಧಿಕೃತ ಲಾಗಿನ್", + "authorize_shift_delete": "ಶಿಫ್ಟ್ ಅಳಿಸುವಿಕೆಯನ್ನು ಅಧಿಕೃತಗೊಳಿಸಿ", + "auto_generated_for_care": "ಆರೈಕೆಗಾಗಿ ಸ್ವಯಂ ರಚಿಸಲಾಗಿದೆ", + "available_features": "ಲಭ್ಯವಿರುವ ವೈಶಿಷ್ಟ್ಯಗಳು", + "available_in": "ಲಭ್ಯವಿರುವ ಭಾಷೆಗಳು", + "average_weekly_working_hours": "ಸರಾಸರಿ ವಾರದ ಕೆಲಸದ ಸಮಯ", + "awaiting_destination_approval": "ಗಮ್ಯಸ್ಥಾನದ ಅನುಮೋದನೆಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ", + "back": "ಹಿಂದೆ", "back_dated_encounter_date_caution": "ಇದಕ್ಕಾಗಿ ನೀವು ಎನ್‌ಕೌಂಟರ್ ಅನ್ನು ರಚಿಸುತ್ತಿದ್ದೀರಿ", - "encounter_duration_confirmation": "ಈ ಎನ್ಕೌಂಟರ್ನ ಅವಧಿಯು ಇರುತ್ತದೆ", - "consultation_notes": "ಸಾಮಾನ್ಯ ಸೂಚನೆಗಳು (ಸಲಹೆ)", - "procedure_suggestions": "ಕಾರ್ಯವಿಧಾನದ ಸಲಹೆಗಳು", - "edit_cover_photo": "ಕವರ್ ಫೋಟೋ ಸಂಪಾದಿಸಿ", - "no_cover_photo_uploaded_for_this_facility": "ಈ ಸೌಲಭ್ಯಕ್ಕಾಗಿ ಯಾವುದೇ ಕವರ್ ಫೋಟೋ ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗಿಲ್ಲ", + "back_to_consultation": "ಸಮಾಲೋಚನೆಗೆ ಹಿಂತಿರುಗಿ", + "back_to_login": "ಲಾಗಿನ್ ಪುಟಕ್ಕೆ ಹಿಂತಿರುಗಿ", + "base_dosage": "ಡೋಸೇಜ್", + "bed_capacity": "ಹಾಸಿಗೆ ಸಾಮರ್ಥ್ಯ", + "bed_search_placeholder": "ಹಾಸಿಗೆಗಳ ಹೆಸರಿನ ಮೂಲಕ ಹುಡುಕಿ", + "bed_type": "ಹಾಸಿಗೆಯ ಪ್ರಕಾರ", + "blood_group": "ರಕ್ತದ ಗುಂಪು", + "board_view": "ಬೋರ್ಡ್ ವೀಕ್ಷಣೆ", + "bradycardia": "ಬ್ರಾಡಿಕಾರ್ಡಿಯಾ", + "breathlessness_level": "ಉಸಿರಾಟದ ಮಟ್ಟ", + "camera": "ಕ್ಯಾಮೆರಾ", + "camera_permission_denied": "ಕ್ಯಾಮೆರಾ ಅನುಮತಿ ನಿರಾಕರಿಸಲಾಗಿದೆ", + "cancel": "ರದ್ದುಮಾಡಿ", + "capture": "ಸೆರೆಹಿಡಿಯಿರಿ", "capture_cover_photo": "ಕವರ್ ಫೋಟೋ ಸೆರೆಹಿಡಿಯಿರಿ", - "diagnoses": "ರೋಗನಿರ್ಣಯಗಳು", - "diagnosis_already_added": "ಈ ರೋಗನಿರ್ಣಯವನ್ನು ಈಗಾಗಲೇ ಸೇರಿಸಲಾಗಿದೆ", - "principal": "ಪ್ರಿನ್ಸಿಪಾಲ್", - "principal_diagnosis": "ಮುಖ್ಯ ರೋಗನಿರ್ಣಯ", - "unconfirmed": "ದೃಢೀಕರಿಸಲಾಗಿಲ್ಲ", - "provisional": "ತಾತ್ಕಾಲಿಕ", - "differential": "ಭೇದಾತ್ಮಕ", - "confirmed": "ದೃಢಪಡಿಸಿದೆ", - "refuted": "ನಿರಾಕರಿಸಲಾಗಿದೆ", - "entered-in-error": "ತಪ್ಪಾಗಿ ನಮೂದಿಸಲಾಗಿದೆ", - "help_unconfirmed": "ಇದನ್ನು ದೃಢಪಡಿಸಿದ ಸ್ಥಿತಿ ಎಂದು ಪರಿಗಣಿಸಲು ಸಾಕಷ್ಟು ರೋಗನಿರ್ಣಯ ಮತ್ತು/ಅಥವಾ ವೈದ್ಯಕೀಯ ಪುರಾವೆಗಳಿಲ್ಲ.", - "help_provisional": "ಇದು ತಾತ್ಕಾಲಿಕ ರೋಗನಿರ್ಣಯ - ಇನ್ನೂ ಪರಿಗಣನೆಯಲ್ಲಿರುವ ಅಭ್ಯರ್ಥಿ.", - "help_differential": "ರೋಗನಿರ್ಣಯ ಪ್ರಕ್ರಿಯೆ ಮತ್ತು ಪ್ರಾಥಮಿಕ ಚಿಕಿತ್ಸೆಯನ್ನು ಮತ್ತಷ್ಟು ಮಾರ್ಗದರ್ಶನ ಮಾಡಲು ಸಮರ್ಥಿಸಲಾದ ಸಂಭಾವ್ಯ (ಮತ್ತು ಸಾಮಾನ್ಯವಾಗಿ ಪರಸ್ಪರ ಪ್ರತ್ಯೇಕವಾದ) ರೋಗನಿರ್ಣಯಗಳ ಒಂದು ಸೆಟ್.", - "help_confirmed": "ಇದನ್ನು ದೃಢಪಡಿಸಿದ ಸ್ಥಿತಿ ಎಂದು ಪರಿಗಣಿಸಲು ಸಾಕಷ್ಟು ರೋಗನಿರ್ಣಯ ಮತ್ತು/ಅಥವಾ ಕ್ಲಿನಿಕಲ್ ಪುರಾವೆಗಳಿವೆ.", - "help_refuted": "ನಂತರದ ರೋಗನಿರ್ಣಯ ಮತ್ತು ಕ್ಲಿನಿಕಲ್ ಪುರಾವೆಗಳಿಂದ ಈ ಸ್ಥಿತಿಯನ್ನು ತಳ್ಳಿಹಾಕಲಾಗಿದೆ.", - "help_entered-in-error": "ಹೇಳಿಕೆಯನ್ನು ತಪ್ಪಾಗಿ ನಮೂದಿಸಲಾಗಿದೆ ಮತ್ತು ಮಾನ್ಯವಾಗಿಲ್ಲ.", - "search_icd11_placeholder": "ICD-11 ರೋಗನಿರ್ಣಯಗಳಿಗಾಗಿ ಹುಡುಕಿ", - "icd11_as_recommended": "WHO ಶಿಫಾರಸು ಮಾಡಿದ ICD-11 ಪ್ರಕಾರ", - "Facilities": "ಸೌಲಭ್ಯಗಳು", - "Patients": "ರೋಗಿಗಳು", - "Sample Test": "ಮಾದರಿ ಪರೀಕ್ಷೆ", - "Shifting": "ಸ್ಥಳಾಂತರ", - "Resource": "ಸಂಪನ್ಮೂಲ", - "Users": "ಬಳಕೆದಾರರು", - "Profile": "ಪ್ರೊಫೈಲ್", - "Dashboard": "ಡ್ಯಾಶ್‌ಬೋರ್ಡ್", - "return_to_care": "CARE ಗೆ ಹಿಂತಿರುಗಿ", - "404_message": "ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲದ ಅಥವಾ ಇನ್ನೊಂದು URL ಗೆ ಸರಿಸಿದ ಪುಟದಲ್ಲಿ ನೀವು ಎಡವಿ ಬಿದ್ದಿರುವಂತೆ ತೋರುತ್ತಿದೆ. ನೀವು ಸರಿಯಾದ ಲಿಂಕ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ!", - "error_404": "ದೋಷ 404", - "page_not_found": "ಪುಟ ಕಂಡುಬಂದಿಲ್ಲ", - "session_expired": "ಅವಧಿ ಮುಗಿದಿದೆ", - "invalid_password_reset_link": "ಅಮಾನ್ಯವಾದ ಪಾಸ್‌ವರ್ಡ್ ಮರುಹೊಂದಿಸುವ ಲಿಂಕ್", - "invalid_link_msg": "ನೀವು ಬಳಸಿದ ಪಾಸ್‌ವರ್ಡ್ ಮರುಹೊಂದಿಸುವ ಲಿಂಕ್ ಅಮಾನ್ಯವಾಗಿದೆ ಅಥವಾ ಅವಧಿ ಮೀರಿದೆ ಎಂದು ತೋರುತ್ತಿದೆ. ದಯವಿಟ್ಟು ಹೊಸ ಪಾಸ್‌ವರ್ಡ್ ಮರುಹೊಂದಿಸುವ ಲಿಂಕ್ ಅನ್ನು ವಿನಂತಿಸಿ.", - "return_to_password_reset": "ಪಾಸ್ವರ್ಡ್ ಮರುಹೊಂದಿಸಲು ಹಿಂತಿರುಗಿ", - "return_to_login": "ಲಾಗಿನ್‌ಗೆ ಹಿಂತಿರುಗಿ", - "session_expired_msg": "ನಿಮ್ಮ ಅವಧಿ ಮುಗಿದಿದೆ ಎಂದು ತೋರುತ್ತಿದೆ. ಇದು ನಿಷ್ಕ್ರಿಯತೆಯ ಕಾರಣದಿಂದಾಗಿರಬಹುದು. ಮುಂದುವರಿಸಲು ದಯವಿಟ್ಟು ಮತ್ತೆ ಲಾಗಿನ್ ಮಾಡಿ.", - "invalid_reset": "ಅಮಾನ್ಯ ಮರುಹೊಂದಿಸಿ", - "please_upload_a_csv_file": "ದಯವಿಟ್ಟು CSV ಫೈಲ್ ಅನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿ", - "csv_file_in_the_specified_format": "ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಸ್ವರೂಪದಲ್ಲಿ CSV ಫೈಲ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "sample_format": "ಮಾದರಿ ಸ್ವರೂಪ", - "search_for_facility": "ಸೌಲಭ್ಯಕ್ಕಾಗಿ ಹುಡುಕಿ", - "select_local_body": "ಸ್ಥಳೀಯ ಸಂಸ್ಥೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "select_wards": "ವಾರ್ಡ್‌ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "result_date": "ಫಲಿತಾಂಶ ದಿನಾಂಕ", - "sample_collection_date": "ಮಾದರಿ ಸಂಗ್ರಹ ದಿನಾಂಕ", - "record_has_been_deleted_successfully": "ದಾಖಲೆಯನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅಳಿಸಲಾಗಿದೆ.", - "error_while_deleting_record": "ದಾಖಲೆಯನ್ನು ಅಳಿಸುವಾಗ ದೋಷ", - "result_details": "ಫಲಿತಾಂಶದ ವಿವರಗಳು", + "care": "ಕಾಳಜಿ", + "category": "ವರ್ಗ", + "caution": "ಎಚ್ಚರಿಕೆ", + "central_nursing_station": "ಕೇಂದ್ರ ನರ್ಸಿಂಗ್ ಸ್ಟೇಷನ್", + "choose_file": "ಸಾಧನದಿಂದ ಅಪ್ಲೋಡ್ ಮಾಡಿ", + "choose_location": "ಸ್ಥಳವನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "clear": "ತೆರವುಗೊಳಿಸಿ", + "clear_all_filters": "ಎಲ್ಲಾ ಫಿಲ್ಟರ್‌ಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ", + "clear_home_facility": "ಮನೆ ಸೌಲಭ್ಯವನ್ನು ತೆರವುಗೊಳಿಸಿ", + "clear_selection": "ಆಯ್ಕೆಯನ್ನು ತೆರವುಗೊಳಿಸಿ", + "close": "ಮುಚ್ಚಿ", + "close_scanner": "ಸ್ಕ್ಯಾನರ್ ಅನ್ನು ಮುಚ್ಚಿ", + "comment_added_successfully": "ಕಾಮೆಂಟ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಸೇರಿಸಲಾಗಿದೆ", + "comment_min_length": "ಕಾಮೆಂಟ್ ಕನಿಷ್ಠ 1 ಅಕ್ಷರವನ್ನು ಹೊಂದಿರಬೇಕು", + "comments": "ಕಾಮೆಂಟ್‌ಗಳು", + "completed": "ಪೂರ್ಣಗೊಂಡಿದೆ", + "configure": "ಕಾನ್ಫಿಗರ್ ಮಾಡಿ", + "configure_facility": "ಸೌಲಭ್ಯವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ", + "confirm": "ದೃಢೀಕರಿಸಿ", "confirm_delete": "ಅಳಿಸುವುದನ್ನು ದೃಢೀಕರಿಸಿ", - "are_you_sure_want_to_delete_this_record": "ಈ ದಾಖಲೆಯನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?", - "patient_category": "ರೋಗಿಗಳ ವರ್ಗ", - "source": "ಮೂಲ", - "result": "ಫಲಿತಾಂಶ", - "sample_type": "ಮಾದರಿ ಪ್ರಕಾರ", - "patient_status": "ರೋಗಿಯ ಸ್ಥಿತಿ", - "mobile_number": "ಮೊಬೈಲ್ ಸಂಖ್ಯೆ", - "patient_created": "ರೋಗಿಯನ್ನು ರಚಿಸಲಾಗಿದೆ", - "update_record": "ದಾಖಲೆಯನ್ನು ನವೀಕರಿಸಿ", - "facility_search_placeholder": "ಸೌಲಭ್ಯ / ಜಿಲ್ಲೆಯ ಹೆಸರಿನ ಮೂಲಕ ಹುಡುಕಿ", - "advanced_filters": "ಸುಧಾರಿತ ಫಿಲ್ಟರ್‌ಗಳು", - "facility_name": "ಸೌಲಭ್ಯದ ಹೆಸರು", - "KASP Empanelled": "ಕೆಎಎಸ್ಪಿ ಎಂಪನೇಲ್ಡ್", - "View Facility": "ವೀಕ್ಷಣೆ ಸೌಲಭ್ಯ", - "no_duplicate_facility": "ನೀವು ನಕಲಿ ಸೌಲಭ್ಯಗಳನ್ನು ರಚಿಸಬಾರದು", - "no_facilities": "ಯಾವುದೇ ಸೌಲಭ್ಯಗಳು ಕಂಡುಬಂದಿಲ್ಲ", - "no_staff": "ಸಿಬ್ಬಂದಿ ಪತ್ತೆಯಾಗಿಲ್ಲ", - "no_bed_types_found": "ಯಾವುದೇ ಹಾಸಿಗೆಯ ಪ್ರಕಾರಗಳು ಕಂಡುಬಂದಿಲ್ಲ", - "total_beds": "ಒಟ್ಟು ಹಾಸಿಗೆಗಳು", + "confirm_discontinue": "ಸ್ಥಗಿತಗೊಳಿಸುವುದನ್ನು ದೃಢೀಕರಿಸಿ", + "confirm_password": "ಪಾಸ್ವರ್ಡ್ ದೃಢೀಕರಿಸಿ", + "confirm_transfer_complete": "ವರ್ಗಾವಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿ!", + "confirmed": "ದೃಢಪಡಿಸಿದೆ", + "consultation_notes": "ಸಾಮಾನ್ಯ ಸೂಚನೆಗಳು (ಸಲಹೆ)", + "consultation_updates": "ಸಮಾಲೋಚನೆ ನವೀಕರಣಗಳು", + "contact_number": "ಸಂಪರ್ಕ ಸಂಖ್ಯೆ", + "contact_person": "ಸೌಲಭ್ಯದಲ್ಲಿರುವ ಸಂಪರ್ಕ ವ್ಯಕ್ತಿಯ ಹೆಸರು", + "contact_person_at_the_facility": "ಪ್ರಸ್ತುತ ಸೌಲಭ್ಯದಲ್ಲಿರುವ ವ್ಯಕ್ತಿಯನ್ನು ಸಂಪರ್ಕಿಸಿ", + "contact_person_number": "ಸಂಪರ್ಕ ವ್ಯಕ್ತಿಯ ಸಂಖ್ಯೆ", + "contact_phone": "ಸಂಪರ್ಕ ವ್ಯಕ್ತಿ ಸಂಖ್ಯೆ", + "contact_your_admin_to_add_skills": "ಕೌಶಲ್ಯಗಳನ್ನು ಸೇರಿಸಲು ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ", + "continue": "ಮುಂದುವರಿಸಿ", + "continue_watching": "ನೋಡುವುದನ್ನು ಮುಂದುವರಿಸಿ", + "contribute_github": "GitHub ನಲ್ಲಿ ಕೊಡುಗೆ ನೀಡಿ", + "copied_to_clipboard": "ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಲಾಗಿದೆ", + "countries_travelled": "ದೇಶಗಳು ಸಂಚರಿಸಿದವು", + "covid_19_cat_gov": "ಸರ್ಕಾರದ ಪ್ರಕಾರ ಕೋವಿಡ್_19 ಕ್ಲಿನಿಕಲ್ ವರ್ಗ. ಕೇರಳ ಮಾರ್ಗಸೂಚಿ (A/B/C)", + "create": "ರಚಿಸಿ", + "create_add_more": "ರಚಿಸಿ ಮತ್ತು ಇನ್ನಷ್ಟು ಸೇರಿಸಿ", + "create_asset": "ಆಸ್ತಿಯನ್ನು ರಚಿಸಿ", "create_facility": "ಹೊಸ ಸೌಲಭ್ಯವನ್ನು ರಚಿಸಿ", - "staff_list": "ಸಿಬ್ಬಂದಿ ಪಟ್ಟಿ", - "bed_capacity": "ಹಾಸಿಗೆ ಸಾಮರ್ಥ್ಯ", - "cylinders": "ಸಿಲಿಂಡರ್ಗಳು", - "cylinders_per_day": "ಸಿಲಿಂಡರ್ಗಳು / ದಿನ", - "liquid_oxygen_capacity": "ದ್ರವ ಆಮ್ಲಜನಕದ ಸಾಮರ್ಥ್ಯ", - "expected_burn_rate": "ನಿರೀಕ್ಷಿತ ಬರ್ನ್ ದರ", - "type_b_cylinders": "ಬಿ ಮಾದರಿಯ ಸಿಲಿಂಡರ್‌ಗಳು", - "type_c_cylinders": "ಸಿ ಮಾದರಿಯ ಸಿಲಿಂಡರ್‌ಗಳು", - "type_d_cylinders": "ಡಿ ಮಾದರಿಯ ಸಿಲಿಂಡರ್‌ಗಳು", - "update_asset": "ಆಸ್ತಿಯನ್ನು ನವೀಕರಿಸಿ", "create_new_asset": "ಹೊಸ ಆಸ್ತಿಯನ್ನು ರಚಿಸಿ", - "you_need_at_least_a_location_to_create_an_assest": "ಆಸ್ತಿಯನ್ನು ರಚಿಸಲು ನಿಮಗೆ ಕನಿಷ್ಠ ಸ್ಥಳದ ಅಗತ್ಯವಿದೆ.", - "add_location": "ಸ್ಥಳವನ್ನು ಸೇರಿಸಿ", - "close_scanner": "ಸ್ಕ್ಯಾನರ್ ಅನ್ನು ಮುಚ್ಚಿ", - "scan_asset_qr": "ಸ್ವತ್ತು QR ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ!", - "create": "ರಚಿಸಿ", - "asset_name": "ಆಸ್ತಿ ಹೆಸರು", - "asset_location": "ಆಸ್ತಿಯ ಸ್ಥಳ", - "asset_type": "ಆಸ್ತಿ ಪ್ರಕಾರ", - "asset_class": "ಆಸ್ತಿ ವರ್ಗ", - "details_about_the_equipment": "ಸಲಕರಣೆಗಳ ಬಗ್ಗೆ ವಿವರಗಳು", - "working_status": "ಕೆಲಸದ ಸ್ಥಿತಿ", - "why_the_asset_is_not_working": "ಸ್ವತ್ತು ಏಕೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿಲ್ಲ?", - "describe_why_the_asset_is_not_working": "ಸ್ವತ್ತು ಏಕೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿಲ್ಲ ಎಂಬುದನ್ನು ವಿವರಿಸಿ", - "asset_qr_id": "ಆಸ್ತಿ QR ID", - "manufacturer": "ತಯಾರಕ", - "eg_xyz": "ಉದಾ. XYZ", - "eg_abc": "ಉದಾ. ಎಬಿಸಿ", - "warranty_amc_expiry": "ವಾರಂಟಿ / AMC ಮುಕ್ತಾಯ", + "create_resource_request": "ಸಂಪನ್ಮೂಲ ವಿನಂತಿಯನ್ನು ರಚಿಸಿ", + "created": "ರಚಿಸಲಾಗಿದೆ", + "created_date": "ರಚಿಸಿದ ದಿನಾಂಕ", + "csv_file_in_the_specified_format": "ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಸ್ವರೂಪದಲ್ಲಿ CSV ಫೈಲ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "customer_support_email": "ಗ್ರಾಹಕ ಬೆಂಬಲ ಇಮೇಲ್", "customer_support_name": "ಗ್ರಾಹಕ ಬೆಂಬಲ ಹೆಸರು", "customer_support_number": "ಗ್ರಾಹಕ ಬೆಂಬಲ ಸಂಖ್ಯೆ", - "customer_support_email": "ಗ್ರಾಹಕ ಬೆಂಬಲ ಇಮೇಲ್", - "eg_mail_example_com": "ಉದಾ. mail@example.com", - "vendor_name": "ಮಾರಾಟಗಾರರ ಹೆಸರು", - "serial_number": "ಸರಣಿ ಸಂಖ್ಯೆ", - "last_serviced_on": "ಕೊನೆಯದಾಗಿ ಸೇವೆ ಸಲ್ಲಿಸಲಾಗಿದೆ", - "create_add_more": "ರಚಿಸಿ ಮತ್ತು ಇನ್ನಷ್ಟು ಸೇರಿಸಿ", - "discharged_patients": "ಬಿಡುಗಡೆಯಾದ ರೋಗಿಗಳು", - "discharged_patients_empty": "ಈ ಸೌಲಭ್ಯದಲ್ಲಿ ಬಿಡುಗಡೆಯಾದ ಯಾವುದೇ ರೋಗಿಗಳು ಇರುವುದಿಲ್ಲ", - "update_facility_middleware_success": "ಸೌಲಭ್ಯ ಮಿಡಲ್‌ವೇರ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ನವೀಕರಿಸಲಾಗಿದೆ", - "treatment_summary__head_title": "ಚಿಕಿತ್ಸೆಯ ಸಾರಾಂಶ", - "treatment_summary__print": "ಪ್ರಿಂಟ್ ಟ್ರೀಟ್ಮೆಂಟ್ ಸಾರಾಂಶ", - "treatment_summary__heading": "ಮಧ್ಯಂತರ ಚಿಕಿತ್ಸೆಯ ಸಾರಾಂಶ", - "patient_registration__name": "ಹೆಸರು", - "patient_registration__address": "ವಿಳಾಸ", - "patient_registration__age": "ವಯಸ್ಸು", - "patient_consultation__op": "OP", - "patient_consultation__ip": "IP", - "patient_consultation__dc_admission": "ಮನೆಯ ಆರೈಕೆಯ ದಿನಾಂಕ ಪ್ರಾರಂಭವಾಗಿದೆ", - "patient_consultation__admission": "ಪ್ರವೇಶ ದಿನಾಂಕ", - "patient_registration__gender": "ಲಿಂಗ", - "patient_registration__contact": "ತುರ್ತು ಸಂಪರ್ಕ", - "patient_registration__comorbidities": "ಸಹವರ್ತಿ ರೋಗಗಳು", - "patient_registration__comorbidities__disease": "ರೋಗ", - "patient_registration__comorbidities__details": "ವಿವರಗಳು", - "patient_consultation__consultation_notes": "ಸಾಮಾನ್ಯ ಸೂಚನೆಗಳು", - "patient_consultation__special_instruction": "ವಿಶೇಷ ಸೂಚನೆಗಳು", - "suggested_investigations": "ಸೂಚಿಸಿದ ತನಿಖೆಗಳು", - "investigations__date": "ದಿನಾಂಕ", - "investigations__name": "ಹೆಸರು", - "investigations__result": "ಫಲಿತಾಂಶ", - "investigations__ideal_value": "ಆದರ್ಶ ಮೌಲ್ಯ", - "investigations__range": "ಮೌಲ್ಯ ಶ್ರೇಣಿ", - "investigations__unit": "ಘಟಕ", - "patient_consultation__treatment__plan": "ಯೋಜನೆ", - "patient_consultation__treatment__summary": "ಸಾರಾಂಶ", - "patient_consultation__treatment__summary__date": "ದಿನಾಂಕ", - "patient_consultation__treatment__summary__spo2": "SpO2", - "patient_consultation__treatment__summary__temperature": "ತಾಪಮಾನ", - "diagnosis__principal": "ಪ್ರಿನ್ಸಿಪಾಲ್", + "cylinders": "ಸಿಲಿಂಡರ್ಗಳು", + "cylinders_per_day": "ಸಿಲಿಂಡರ್ಗಳು / ದಿನ", + "date_and_time": "ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", + "date_of_admission": "ಪ್ರವೇಶ ದಿನಾಂಕ", + "date_of_birth": "ಹುಟ್ಟಿದ ದಿನಾಂಕ", + "date_of_positive_covid_19_swab": "ಧನಾತ್ಮಕ ಕೋವಿಡ್ 19 ಸ್ವ್ಯಾಬ್ ದಿನಾಂಕ", + "date_of_test": "ಪರೀಕ್ಷೆಯ ದಿನಾಂಕ", + "days": "ದಿನಗಳು", + "delete": "ಅಳಿಸಿ", + "delete_facility": "ಸೌಲಭ್ಯವನ್ನು ಅಳಿಸಿ", + "delete_item": "{{name}}ಅಳಿಸಿ", + "delete_record": "ದಾಖಲೆ ಅಳಿಸಿ", + "deleted_successfully": "{{name}} ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅಳಿಸಲಾಗಿದೆ", + "describe_why_the_asset_is_not_working": "ಸ್ವತ್ತು ಏಕೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿಲ್ಲ ಎಂಬುದನ್ನು ವಿವರಿಸಿ", + "description": "ವಿವರಣೆ", + "details_about_the_equipment": "ಸಲಕರಣೆಗಳ ಬಗ್ಗೆ ವಿವರಗಳು", + "details_of_assigned_facility": "ನಿಯೋಜಿಸಲಾದ ಸೌಲಭ್ಯದ ವಿವರಗಳು", + "details_of_origin_facility": "ಮೂಲ ಸೌಲಭ್ಯದ ವಿವರಗಳು", + "details_of_patient": "ರೋಗಿಯ ವಿವರಗಳು", + "details_of_shifting_approving_facility": "ಅನುಮೋದಿಸುವ ಸೌಲಭ್ಯವನ್ನು ಬದಲಾಯಿಸುವ ವಿವರಗಳು", + "diagnoses": "ರೋಗನಿರ್ಣಯಗಳು", + "diagnosis": "ರೋಗನಿರ್ಣಯ", "diagnosis__confirmed": "ದೃಢಪಡಿಸಿದೆ", + "diagnosis__differential": "ಭೇದಾತ್ಮಕ", + "diagnosis__principal": "ಪ್ರಿನ್ಸಿಪಾಲ್", "diagnosis__provisional": "ತಾತ್ಕಾಲಿಕ", "diagnosis__unconfirmed": "ದೃಢೀಕರಿಸಲಾಗಿಲ್ಲ", - "diagnosis__differential": "ಭೇದಾತ್ಮಕ", - "active_prescriptions": "ಸಕ್ರಿಯ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ಗಳು", - "prescriptions__medicine": "ಔಷಧಿ", - "prescriptions__route": "ಮಾರ್ಗ", - "prescriptions__dosage_frequency": "ಡೋಸೇಜ್ ಮತ್ತು ಆವರ್ತನ", - "prescriptions__start_date": "ರಂದು ಸೂಚಿಸಲಾಗಿದೆ", - "select_facility_for_discharged_patients_warning": "ಬಿಡುಗಡೆಯಾದ ರೋಗಿಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಸೌಲಭ್ಯವನ್ನು ಆಯ್ಕೆ ಮಾಡಬೇಕಾಗಿದೆ.", + "diagnosis_already_added": "ಈ ರೋಗನಿರ್ಣಯವನ್ನು ಈಗಾಗಲೇ ಸೇರಿಸಲಾಗಿದೆ", + "diastolic": "ಡಯಾಸ್ಟೊಲಿಕ್", + "differential": "ಭೇದಾತ್ಮಕ", + "discard": "ತಿರಸ್ಕರಿಸು", + "discharge": "ವಿಸರ್ಜನೆ", + "discharge_from_care": "CARE ನಿಂದ ಬಿಡುಗಡೆ", + "discharge_prescription": "ಡಿಸ್ಚಾರ್ಜ್ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್", + "discharge_summary": "ಡಿಸ್ಚಾರ್ಜ್ ಸಾರಾಂಶ", + "discharge_summary_not_ready": "ಡಿಸ್ಚಾರ್ಜ್ ಸಾರಾಂಶ ಇನ್ನೂ ಸಿದ್ಧವಾಗಿಲ್ಲ.", + "discharged": "ಡಿಸ್ಚಾರ್ಜ್ ಮಾಡಲಾಗಿದೆ", + "discharged_patients": "ಬಿಡುಗಡೆಯಾದ ರೋಗಿಗಳು", + "discharged_patients_empty": "ಈ ಸೌಲಭ್ಯದಲ್ಲಿ ಬಿಡುಗಡೆಯಾದ ಯಾವುದೇ ರೋಗಿಗಳು ಇರುವುದಿಲ್ಲ", + "disclaimer": "ಹಕ್ಕು ನಿರಾಕರಣೆ", + "discontinue": "ಸ್ಥಗಿತಗೊಳಿಸಿ", + "discontinue_caution_note": "ಈ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಅನ್ನು ನಿಲ್ಲಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?", + "discontinued": "ಸ್ಥಗಿತಗೊಳಿಸಲಾಗಿದೆ", + "disease_status": "ರೋಗದ ಸ್ಥಿತಿ", + "district": "ಜಿಲ್ಲೆ", + "district_program_management_supporting_unit": "ಜಿಲ್ಲಾ ಕಾರ್ಯಕ್ರಮ ನಿರ್ವಹಣಾ ಪೋಷಕ ಘಟಕ", + "done": "ಮುಗಿದಿದೆ", + "dosage": "ಡೋಸೇಜ್", + "down": "ಕೆಳಗೆ", + "download": "ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ", + "download_discharge_summary": "ಡಿಸ್ಚಾರ್ಜ್ ಸಾರಾಂಶವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ", + "download_type": "ಡೌನ್‌ಲೋಡ್ ಪ್ರಕಾರ", + "downloading": "ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ", + "downloads": "ಡೌನ್‌ಲೋಡ್‌ಗಳು", + "drag_drop_image_to_upload": "ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಚಿತ್ರವನ್ನು ಎಳೆಯಿರಿ ಮತ್ತು ಬಿಡಿ", + "duplicate_patient_record_birth_unknown": "ರೋಗಿಯ ಜನ್ಮ ವರ್ಷದ ಬಗ್ಗೆ ನಿಮಗೆ ಖಚಿತವಿಲ್ಲದಿದ್ದರೆ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಜಿಲ್ಲಾ ಆರೈಕೆ ಸಂಯೋಜಕರು, ಸ್ಥಳಾಂತರ ಸೌಲಭ್ಯ ಅಥವಾ ರೋಗಿಯನ್ನು ಸಂಪರ್ಕಿಸಿ.", "duplicate_patient_record_confirmation": "ಹುಟ್ಟಿದ ವರ್ಷವನ್ನು ಸೇರಿಸುವ ಮೂಲಕ ನಿಮ್ಮ ಸೌಲಭ್ಯಕ್ಕೆ ರೋಗಿಯ ದಾಖಲೆಯನ್ನು ಒಪ್ಪಿಕೊಳ್ಳಿ", "duplicate_patient_record_rejection": "ನಾನು ರಚಿಸಲು ಬಯಸುವ ಶಂಕಿತ / ರೋಗಿಯು ಪಟ್ಟಿಯಲ್ಲಿಲ್ಲ ಎಂದು ನಾನು ದೃಢೀಕರಿಸುತ್ತೇನೆ.", - "duplicate_patient_record_birth_unknown": "ರೋಗಿಯ ಜನ್ಮ ವರ್ಷದ ಬಗ್ಗೆ ನಿಮಗೆ ಖಚಿತವಿಲ್ಲದಿದ್ದರೆ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಜಿಲ್ಲಾ ಆರೈಕೆ ಸಂಯೋಜಕರು, ಸ್ಥಳಾಂತರ ಸೌಲಭ್ಯ ಅಥವಾ ರೋಗಿಯನ್ನು ಸಂಪರ್ಕಿಸಿ.", - "patient_transfer_birth_match_note": "ಗಮನಿಸಿ: ವರ್ಗಾವಣೆ ವಿನಂತಿಯನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಹುಟ್ಟಿದ ವರ್ಷವು ರೋಗಿಗೆ ಹೊಂದಿಕೆಯಾಗಬೇಕು.", - "available_features": "ಲಭ್ಯವಿರುವ ವೈಶಿಷ್ಟ್ಯಗಳು", - "update_facility": "ನವೀಕರಣ ಸೌಲಭ್ಯ", - "configure_facility": "ಸೌಲಭ್ಯವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ", - "inventory_management": "ದಾಸ್ತಾನು ನಿರ್ವಹಣೆ", - "location_management": "ಸ್ಥಳ ನಿರ್ವಹಣೆ", - "resource_request": "ಸಂಪನ್ಮೂಲ ವಿನಂತಿ", - "view_asset": "ಸ್ವತ್ತುಗಳನ್ನು ವೀಕ್ಷಿಸಿ", - "view_users": "ಬಳಕೆದಾರರನ್ನು ವೀಕ್ಷಿಸಿ", - "view_abdm_records": "ABDM ದಾಖಲೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ", - "delete_facility": "ಸೌಲಭ್ಯವನ್ನು ಅಳಿಸಿ", - "central_nursing_station": "ಕೇಂದ್ರ ನರ್ಸಿಂಗ್ ಸ್ಟೇಷನ್", - "add_details_of_patient": "ರೋಗಿಯ ವಿವರಗಳನ್ನು ಸೇರಿಸಿ", - "choose_location": "ಸ್ಥಳವನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "live_monitoring": "ಲೈವ್ ಮಾನಿಟರಿಂಗ್", - "open_live_monitoring": "ಲೈವ್ ಮಾನಿಟರಿಂಗ್ ತೆರೆಯಿರಿ", - "audio__allow_permission": "ದಯವಿಟ್ಟು ಸೈಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಮೈಕ್ರೊಫೋನ್ ಅನುಮತಿಯನ್ನು ಅನುಮತಿಸಿ", - "audio__allow_permission_helper": "ನೀವು ಹಿಂದೆ ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶವನ್ನು ನಿರಾಕರಿಸಿರಬಹುದು.", - "audio__allow_permission_button": "ಹೇಗೆ ಅನುಮತಿಸಬೇಕೆಂದು ತಿಳಿಯಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ", - "audio__record": "ರೆಕಾರ್ಡ್ ಆಡಿಯೋ", - "audio__record_helper": "ರೆಕಾರ್ಡಿಂಗ್ ಪ್ರಾರಂಭಿಸಲು ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿ", - "audio__recording": "ರೆಕಾರ್ಡಿಂಗ್", - "audio__recording_helper": "ದಯವಿಟ್ಟು ನಿಮ್ಮ ಮೈಕ್ರೋಫೋನ್‌ನಲ್ಲಿ ಮಾತನಾಡಿ.", - "audio__recording_helper_2": "ರೆಕಾರ್ಡಿಂಗ್ ನಿಲ್ಲಿಸಲು ಬಟನ್ ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡಿ.", - "audio__recorded": "ಆಡಿಯೋ ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗಿದೆ", - "audio__start_again": "ಮತ್ತೆ ಪ್ರಾರಂಭಿಸಿ", + "edit": "ಸಂಪಾದಿಸು", + "edit_caution_note": "ಸಂಪಾದಿತ ವಿವರಗಳೊಂದಿಗೆ ಹೊಸ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಅನ್ನು ಸಮಾಲೋಚನೆಗೆ ಸೇರಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಪ್ರಸ್ತುತ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಅನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಲಾಗುತ್ತದೆ.", + "edit_cover_photo": "ಕವರ್ ಫೋಟೋ ಸಂಪಾದಿಸಿ", + "edit_history": "ಇತಿಹಾಸವನ್ನು ಸಂಪಾದಿಸಿ", + "edit_prescriptions": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್‌ಗಳನ್ನು ಸಂಪಾದಿಸಿ", + "edited_by": "ಸಂಪಾದಿಸಿದವರು", + "edited_on": "ರಂದು ಸಂಪಾದಿಸಲಾಗಿದೆ", + "eg_abc": "ಉದಾ. ಎಬಿಸಿ", + "eg_details_on_functionality_service_etc": "ಉದಾ. ಕಾರ್ಯನಿರ್ವಹಣೆ, ಸೇವೆ ಇತ್ಯಾದಿಗಳ ವಿವರಗಳು.", + "eg_mail_example_com": "ಉದಾ. mail@example.com", + "eg_xyz": "ಉದಾ. XYZ", + "email": "ಇಮೇಲ್ ವಿಳಾಸ", + "email_address": "ಇಮೇಲ್ ವಿಳಾಸ", + "email_discharge_summary_description": "ಡಿಸ್ಚಾರ್ಜ್ ಸಾರಾಂಶವನ್ನು ಸ್ವೀಕರಿಸಲು ನಿಮ್ಮ ಮಾನ್ಯ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ", + "email_success": "ನಾವು ಶೀಘ್ರದಲ್ಲೇ ಇಮೇಲ್ ಕಳುಹಿಸುತ್ತೇವೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಇನ್‌ಬಾಕ್ಸ್ ಪರಿಶೀಲಿಸಿ.", + "emergency": "ತುರ್ತು ಪರಿಸ್ಥಿತಿ", + "emergency_contact_number": "ತುರ್ತು ಸಂಪರ್ಕ ಸಂಖ್ಯೆ", + "empty_date_time": "--:-- --; ------------", + "encounter_date_field_label__A": "ಸೌಲಭ್ಯಕ್ಕೆ ಪ್ರವೇಶದ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", + "encounter_date_field_label__DC": "ಡೊಮಿಸಿಲಿಯರಿ ಕೇರ್ ಪ್ರಾರಂಭದ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", + "encounter_date_field_label__DD": "ಸಮಾಲೋಚನೆಯ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", + "encounter_date_field_label__HI": "ಸಮಾಲೋಚನೆಯ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", + "encounter_date_field_label__OP": "ಹೊರರೋಗಿ ಭೇಟಿಯ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", + "encounter_date_field_label__R": "ಸಮಾಲೋಚನೆಯ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ", + "encounter_duration_confirmation": "ಈ ಎನ್ಕೌಂಟರ್ನ ಅವಧಿಯು ಇರುತ್ತದೆ", + "encounter_suggestion__A": "ಪ್ರವೇಶ", + "encounter_suggestion__DC": "ಡೊಮಿಸಿಲಿಯರಿ ಕೇರ್", + "encounter_suggestion__DD": "ಸಮಾಲೋಚನೆ", + "encounter_suggestion__HI": "ಸಮಾಲೋಚನೆ", + "encounter_suggestion__OP": "ಹೊರರೋಗಿಗಳ ಭೇಟಿ", + "encounter_suggestion__R": "ಸಮಾಲೋಚನೆ", + "encounter_suggestion_edit_disallowed": "ಸಂಪಾದನೆ ಸಮಾಲೋಚನೆಯಲ್ಲಿ ಈ ಆಯ್ಕೆಗೆ ಬದಲಾಯಿಸಲು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ", "enter_file_name": "ಫೈಲ್ ಹೆಸರನ್ನು ನಮೂದಿಸಿ", - "no_files_found": "ಯಾವುದೇ {{type}} ಫೈಲ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ", - "upload_headings__patient": "ಹೊಸ ರೋಗಿಯ ಫೈಲ್ ಅನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿ", - "upload_headings__consultation": "ಹೊಸ ಸಮಾಲೋಚನೆ ಫೈಲ್ ಅನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ", - "upload_headings__sample_report": "ಮಾದರಿ ವರದಿಯನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ", - "upload_headings__supporting_info": "ಪೋಷಕ ಮಾಹಿತಿಯನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ", - "file_list_headings__patient": "ರೋಗಿಯ ಫೈಲ್ಗಳು", - "file_list_headings__consultation": "ಸಮಾಲೋಚನೆ ಫೈಲ್ಗಳು", - "file_list_headings__sample_report": "ಮಾದರಿ ವರದಿ", - "file_list_headings__supporting_info": "ಪೋಷಕ ಮಾಹಿತಿ", + "enter_valid_age": "ದಯವಿಟ್ಟು ಮಾನ್ಯವಾದ ವಯಸ್ಸನ್ನು ನಮೂದಿಸಿ", + "entered-in-error": "ತಪ್ಪಾಗಿ ನಮೂದಿಸಲಾಗಿದೆ", + "error_404": "ದೋಷ 404", + "error_deleting_shifting": "ಶಿಫ್ಟಿಂಗ್ ರೆಕಾರ್ಡ್ ಅನ್ನು ಅಳಿಸುವಾಗ ದೋಷ", + "error_while_deleting_record": "ದಾಖಲೆಯನ್ನು ಅಳಿಸುವಾಗ ದೋಷ", + "escape": "ಎಸ್ಕೇಪ್", + "estimated_contact_date": "ಅಂದಾಜು ಸಂಪರ್ಕ ದಿನಾಂಕ", + "expected_burn_rate": "ನಿರೀಕ್ಷಿತ ಬರ್ನ್ ದರ", + "facilities": "ಸೌಲಭ್ಯಗಳು", + "facility": "ಸೌಲಭ್ಯ", + "facility_name": "ಸೌಲಭ್ಯದ ಹೆಸರು", + "facility_preference": "ಸೌಲಭ್ಯ ಆದ್ಯತೆ", + "facility_search_placeholder": "ಸೌಲಭ್ಯ / ಜಿಲ್ಲೆಯ ಹೆಸರಿನ ಮೂಲಕ ಹುಡುಕಿ", + "facility_type": "ಸೌಲಭ್ಯದ ಪ್ರಕಾರ", + "features": "ವೈಶಿಷ್ಟ್ಯಗಳು", + "feed_is_currently_not_live": "ಫೀಡ್ ಪ್ರಸ್ತುತ ಲೈವ್ ಆಗಿಲ್ಲ", + "feed_optimal_experience_for_apple_phones": "ಅತ್ಯುತ್ತಮ ವೀಕ್ಷಣೆಯ ಅನುಭವಕ್ಕಾಗಿ, ನಿಮ್ಮ ಸಾಧನವನ್ನು ತಿರುಗಿಸಲು ಪರಿಗಣಿಸಿ. ನಿಮ್ಮ ಸಾಧನದ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಸ್ವಯಂ-ತಿರುಗುವಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.", + "feed_optimal_experience_for_phones": "ಅತ್ಯುತ್ತಮ ವೀಕ್ಷಣೆಯ ಅನುಭವಕ್ಕಾಗಿ, ನಿಮ್ಮ ಸಾಧನವನ್ನು ತಿರುಗಿಸಲು ಪರಿಗಣಿಸಿ.", + "field_required": "ಈ ಕ್ಷೇತ್ರದ ಅಗತ್ಯವಿದೆ", "file_error__choose_file": "ದಯವಿಟ್ಟು ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಫೈಲ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "file_error__dynamic": "ಫೈಲ್ ಅಪ್‌ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ: {{statusText}}", "file_error__file_name": "ದಯವಿಟ್ಟು ಫೈಲ್ ಹೆಸರನ್ನು ನಮೂದಿಸಿ", "file_error__file_size": "ಫೈಲ್‌ಗಳ ಗರಿಷ್ಠ ಗಾತ್ರ 100 MB", "file_error__file_type": "ಅಮಾನ್ಯವಾದ ಫೈಲ್ ಪ್ರಕಾರ \".{{extension}}\" ಅನುಮತಿಸಲಾದ ಪ್ರಕಾರಗಳು: {{allowedExtensions}}", - "file_uploaded": "ಫೈಲ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗಿದೆ", - "file_error__dynamic": "ಫೈಲ್ ಅಪ್‌ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ: {{statusText}}", "file_error__network": "ಫೈಲ್ ಅಪ್‌ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ: ನೆಟ್‌ವರ್ಕ್ ದೋಷ", - "monitor": "ಮಾನಿಟರ್", - "show_default_presets": "ಡೀಫಾಲ್ಟ್ ಪೂರ್ವನಿಗದಿಗಳನ್ನು ತೋರಿಸಿ", - "show_patient_presets": "ರೋಗಿಯ ಪೂರ್ವನಿಗದಿಗಳನ್ನು ತೋರಿಸಿ", - "moving_camera": "ಮೂವಿಂಗ್ ಕ್ಯಾಮೆರಾ", + "file_list_headings__consultation": "ಸಮಾಲೋಚನೆ ಫೈಲ್ಗಳು", + "file_list_headings__patient": "ರೋಗಿಯ ಫೈಲ್ಗಳು", + "file_list_headings__sample_report": "ಮಾದರಿ ವರದಿ", + "file_list_headings__supporting_info": "ಪೋಷಕ ಮಾಹಿತಿ", + "file_preview": "ಫೈಲ್ ಪೂರ್ವವೀಕ್ಷಣೆ", + "file_preview_not_supported": "ಈ ಫೈಲ್ ಅನ್ನು ಪೂರ್ವವೀಕ್ಷಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಅದನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ.", + "file_uploaded": "ಫೈಲ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗಿದೆ", + "filter": "ಫಿಲ್ಟರ್", + "filter_by": "ಮೂಲಕ ಫಿಲ್ಟರ್ ಮಾಡಿ", + "filter_by_category": "ವರ್ಗದ ಪ್ರಕಾರ ಫಿಲ್ಟರ್ ಮಾಡಿ", + "filters": "ಶೋಧಕಗಳು", + "first_name": "ಮೊದಲ ಹೆಸರು", + "footer_body": "ಕೊರೊನಾಸೇಫ್ ನೆಟ್‌ವರ್ಕ್ ಎಂಬುದು ತೆರೆದ ಮೂಲ ಸಾರ್ವಜನಿಕ ಉಪಯುಕ್ತತೆಯಾಗಿದ್ದು, ನಾವೀನ್ಯಕಾರರು ಮತ್ತು ಸ್ವಯಂಸೇವಕರ ಬಹು-ಶಿಸ್ತಿನ ತಂಡದಿಂದ ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ. ಕರೋನಾ ಸೇಫ್ ಕೇರ್ ವಿಶ್ವಸಂಸ್ಥೆಯಿಂದ ಗುರುತಿಸಲ್ಪಟ್ಟ ಡಿಜಿಟಲ್ ಸಾರ್ವಜನಿಕ ಸೇವೆಯಾಗಿದೆ.", + "forget_password": "ಪಾಸ್ವರ್ಡ್ ಮರೆತಿರಾ?", + "forget_password_instruction": "ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರನ್ನು ನಮೂದಿಸಿ ಮತ್ತು ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಮರುಹೊಂದಿಸಲು ನಾವು ನಿಮಗೆ ಲಿಂಕ್ ಅನ್ನು ಕಳುಹಿಸುತ್ತೇವೆ.", + "frequency": "ಆವರ್ತನ", "full_screen": "ಪೂರ್ಣ ಪರದೆ", - "feed_is_currently_not_live": "ಫೀಡ್ ಪ್ರಸ್ತುತ ಲೈವ್ ಆಗಿಲ್ಲ", - "zoom_out": "ಜೂಮ್ ಔಟ್", - "zoom_in": "ಜೂಮ್ ಇನ್", - "right": "ಸರಿ", + "gender": "ಲಿಂಗ", + "generate_report": "ವರದಿಯನ್ನು ರಚಿಸಿ", + "generated_summary_caution": "ಇದು CARE ವ್ಯವಸ್ಥೆಯಲ್ಲಿ ಸೆರೆಹಿಡಿಯಲಾದ ಮಾಹಿತಿಯನ್ನು ಬಳಸಿಕೊಂಡು ಕಂಪ್ಯೂಟರ್ ರಚಿಸಿದ ಸಾರಾಂಶವಾಗಿದೆ.", + "generating": "ಉತ್ಪಾದಿಸುತ್ತಿದೆ", + "generating_discharge_summary": "ಡಿಸ್ಚಾರ್ಜ್ ಸಾರಾಂಶವನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ", + "get_tests": "ಪರೀಕ್ಷೆಗಳನ್ನು ಪಡೆಯಿರಿ", + "goal": "ಡಿಜಿಟಲ್ ಉಪಕರಣಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಸಾರ್ವಜನಿಕ ಆರೋಗ್ಯ ಸೇವೆಗಳ ಗುಣಮಟ್ಟ ಮತ್ತು ಪ್ರವೇಶವನ್ನು ನಿರಂತರವಾಗಿ ಸುಧಾರಿಸುವುದು ನಮ್ಮ ಗುರಿಯಾಗಿದೆ", + "help_confirmed": "ಇದನ್ನು ದೃಢಪಡಿಸಿದ ಸ್ಥಿತಿ ಎಂದು ಪರಿಗಣಿಸಲು ಸಾಕಷ್ಟು ರೋಗನಿರ್ಣಯ ಮತ್ತು/ಅಥವಾ ಕ್ಲಿನಿಕಲ್ ಪುರಾವೆಗಳಿವೆ.", + "help_differential": "ರೋಗನಿರ್ಣಯ ಪ್ರಕ್ರಿಯೆ ಮತ್ತು ಪ್ರಾಥಮಿಕ ಚಿಕಿತ್ಸೆಯನ್ನು ಮತ್ತಷ್ಟು ಮಾರ್ಗದರ್ಶನ ಮಾಡಲು ಸಮರ್ಥಿಸಲಾದ ಸಂಭಾವ್ಯ (ಮತ್ತು ಸಾಮಾನ್ಯವಾಗಿ ಪರಸ್ಪರ ಪ್ರತ್ಯೇಕವಾದ) ರೋಗನಿರ್ಣಯಗಳ ಒಂದು ಸೆಟ್.", + "help_entered-in-error": "ಹೇಳಿಕೆಯನ್ನು ತಪ್ಪಾಗಿ ನಮೂದಿಸಲಾಗಿದೆ ಮತ್ತು ಮಾನ್ಯವಾಗಿಲ್ಲ.", + "help_provisional": "ಇದು ತಾತ್ಕಾಲಿಕ ರೋಗನಿರ್ಣಯ - ಇನ್ನೂ ಪರಿಗಣನೆಯಲ್ಲಿರುವ ಅಭ್ಯರ್ಥಿ.", + "help_refuted": "ನಂತರದ ರೋಗನಿರ್ಣಯ ಮತ್ತು ಕ್ಲಿನಿಕಲ್ ಪುರಾವೆಗಳಿಂದ ಈ ಸ್ಥಿತಿಯನ್ನು ತಳ್ಳಿಹಾಕಲಾಗಿದೆ.", + "help_unconfirmed": "ಇದನ್ನು ದೃಢಪಡಿಸಿದ ಸ್ಥಿತಿ ಎಂದು ಪರಿಗಣಿಸಲು ಸಾಕಷ್ಟು ರೋಗನಿರ್ಣಯ ಮತ್ತು/ಅಥವಾ ವೈದ್ಯಕೀಯ ಪುರಾವೆಗಳಿಲ್ಲ.", + "hide": "ಮರೆಮಾಡಿ", + "home_facility": "ಮನೆ ಸೌಲಭ್ಯ", + "icd11_as_recommended": "WHO ಶಿಫಾರಸು ಮಾಡಿದ ICD-11 ಪ್ರಕಾರ", + "inconsistent_dosage_units_error": "ಡೋಸೇಜ್ ಘಟಕಗಳು ಒಂದೇ ಆಗಿರಬೇಕು", + "india_1": "ಭಾರತ", + "indian_mobile": "ಭಾರತೀಯ ಮೊಬೈಲ್", + "indicator": "ಸೂಚಕ", + "inidcator_event": "ಸೂಚಕ ಈವೆಂಟ್", + "instruction_on_titration": "ಟೈಟರೇಶನ್ ಕುರಿತು ಸೂಚನೆ", + "international_mobile": "ಅಂತಾರಾಷ್ಟ್ರೀಯ ಮೊಬೈಲ್", + "invalid_asset_id_msg": "ಓಹ್! ನೀವು ನಮೂದಿಸಿದ ಸ್ವತ್ತು ಐಡಿ ಮಾನ್ಯವಾಗಿರುವಂತೆ ತೋರುತ್ತಿಲ್ಲ.", + "invalid_email": "ದಯವಿಟ್ಟು ಸರಿಯಾದ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ", + "invalid_link_msg": "ನೀವು ಬಳಸಿದ ಪಾಸ್‌ವರ್ಡ್ ಮರುಹೊಂದಿಸುವ ಲಿಂಕ್ ಅಮಾನ್ಯವಾಗಿದೆ ಅಥವಾ ಅವಧಿ ಮೀರಿದೆ ಎಂದು ತೋರುತ್ತಿದೆ. ದಯವಿಟ್ಟು ಹೊಸ ಪಾಸ್‌ವರ್ಡ್ ಮರುಹೊಂದಿಸುವ ಲಿಂಕ್ ಅನ್ನು ವಿನಂತಿಸಿ.", + "invalid_password": "ಪಾಸ್ವರ್ಡ್ ಅವಶ್ಯಕತೆಗಳನ್ನು ಪೂರೈಸುವುದಿಲ್ಲ", + "invalid_password_reset_link": "ಅಮಾನ್ಯವಾದ ಪಾಸ್‌ವರ್ಡ್ ಮರುಹೊಂದಿಸುವ ಲಿಂಕ್", + "invalid_phone": "ದಯವಿಟ್ಟು ಮಾನ್ಯವಾದ ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ", + "invalid_phone_number": "ಅಮಾನ್ಯವಾದ ಫೋನ್ ಸಂಖ್ಯೆ", + "invalid_pincode": "ಅಮಾನ್ಯವಾದ ಪಿನ್‌ಕೋಡ್", + "invalid_reset": "ಅಮಾನ್ಯ ಮರುಹೊಂದಿಸಿ", + "invalid_username": "ಅಗತ್ಯವಿದೆ. 150 ಅಕ್ಷರಗಳು ಅಥವಾ ಕಡಿಮೆ. ಅಕ್ಷರಗಳು, ಅಂಕೆಗಳು ಮತ್ತು @/./+/-/_ ಮಾತ್ರ.", + "inventory_management": "ದಾಸ್ತಾನು ನಿರ್ವಹಣೆ", + "investigation_reports": "ತನಿಖಾ ವರದಿಗಳು", + "investigations": "ತನಿಖೆಗಳು", + "investigations__date": "ದಿನಾಂಕ", + "investigations__ideal_value": "ಆದರ್ಶ ಮೌಲ್ಯ", + "investigations__name": "ಹೆಸರು", + "investigations__range": "ಮೌಲ್ಯ ಶ್ರೇಣಿ", + "investigations__result": "ಫಲಿತಾಂಶ", + "investigations__unit": "ಘಟಕ", + "investigations_suggested": "ತನಿಖೆಗಳನ್ನು ಸೂಚಿಸಲಾಗಿದೆ", + "is": "ಆಗಿದೆ", + "is_antenatal": "ಪ್ರಸವಪೂರ್ವವಾಗಿದೆ", + "is_emergency": "ತುರ್ತು ಆಗಿದೆ", + "is_emergency_case": "ತುರ್ತು ಪ್ರಕರಣವಾಗಿದೆ", + "is_it_upshift": "ಇದು ಮೇಲ್ಮುಖವಾಗಿದೆಯೇ", + "is_this_an_emergency": "ಇದು ತುರ್ತು ಪರಿಸ್ಥಿತಿಯೇ?", + "is_this_an_upshift": "ಇದು ಉನ್ನತಿಯೇ?", + "is_up_shift": "ಶಿಫ್ಟ್ ಆಗಿದೆ", + "is_upshift_case": "ಅಪ್ ಶಿಫ್ಟ್ ಕೇಸ್ ಆಗಿದೆ", + "landline": "ಭಾರತೀಯ ಸ್ಥಿರ ದೂರವಾಣಿ", + "last_administered": "ಕೊನೆಯದಾಗಿ ನಿರ್ವಹಿಸಲಾಗಿದೆ", + "last_edited": "ಕೊನೆಯದಾಗಿ ಸಂಪಾದಿಸಲಾಗಿದೆ", + "last_modified": "ಕೊನೆಯದಾಗಿ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ", + "last_name": "ಕೊನೆಯ ಹೆಸರು", + "last_online": "ಕೊನೆಯ ಆನ್‌ಲೈನ್", + "last_serviced_on": "ಕೊನೆಯದಾಗಿ ಸೇವೆ ಸಲ್ಲಿಸಲಾಗಿದೆ", + "latitude_invalid": "ಅಕ್ಷಾಂಶವು -90 ಮತ್ತು 90 ರ ನಡುವೆ ಇರಬೇಕು", "left": "ಎಡಕ್ಕೆ", - "down": "ಕೆಳಗೆ", - "up": "ಮೇಲಕ್ಕೆ", - "RESPIRATORY_SUPPORT_SHORT__UNKNOWN": "ಯಾವುದೂ ಇಲ್ಲ", - "RESPIRATORY_SUPPORT_SHORT__OXYGEN_SUPPORT": "O2 ಬೆಂಬಲ", - "RESPIRATORY_SUPPORT_SHORT__NON_INVASIVE": "NIV", - "RESPIRATORY_SUPPORT_SHORT__INVASIVE": "IV", - "RESPIRATORY_SUPPORT__UNKNOWN": "ಯಾವುದೂ ಇಲ್ಲ", - "RESPIRATORY_SUPPORT__OXYGEN_SUPPORT": "ಆಮ್ಲಜನಕ ಬೆಂಬಲ", - "RESPIRATORY_SUPPORT__NON_INVASIVE": "ನಾನ್-ಇನ್ವೇಸಿವ್ ವೆಂಟಿಲೇಟರ್ (NIV)", - "RESPIRATORY_SUPPORT__INVASIVE": "ಆಕ್ರಮಣಕಾರಿ ವೆಂಟಿಲೇಟರ್ (IV)", - "VENTILATOR_MODE__CMV": "ಕಂಟ್ರೋಲ್ ಮೆಕ್ಯಾನಿಕಲ್ ವೆಂಟಿಲೇಷನ್ (CMV)", - "VENTILATOR_MODE__VCV": "ವಾಲ್ಯೂಮ್ ಕಂಟ್ರೋಲ್ ವೆಂಟಿಲೇಶನ್ (VCV)", - "VENTILATOR_MODE__PCV": "ಪ್ರೆಶರ್ ಕಂಟ್ರೋಲ್ ವೆಂಟಿಲೇಷನ್ (PCV)", - "VENTILATOR_MODE__SIMV": "ಸಿಂಕ್ರೊನೈಸ್ ಮಾಡಿದ ಮಧ್ಯಂತರ ಕಡ್ಡಾಯ ವಾತಾಯನ (SIMV)", - "VENTILATOR_MODE__VC_SIMV": "ವಾಲ್ಯೂಮ್ ಕಂಟ್ರೋಲ್ಡ್ SIMV (VC-SIMV)", - "VENTILATOR_MODE__PC_SIMV": "ಒತ್ತಡ ನಿಯಂತ್ರಿತ SIMV (PC-SIMV)", - "VENTILATOR_MODE__PSV": "C-PAP / ಪ್ರೆಶರ್ ಸಪೋರ್ಟ್ ವೆಂಟಿಲೇಷನ್ (PSV)", - "CONSCIOUSNESS_LEVEL__UNRESPONSIVE": "ಪ್ರತಿಕ್ರಿಯಿಸದ", - "CONSCIOUSNESS_LEVEL__RESPONDS_TO_PAIN": "ನೋವಿಗೆ ಸ್ಪಂದಿಸುತ್ತದೆ", - "CONSCIOUSNESS_LEVEL__RESPONDS_TO_VOICE": "ಧ್ವನಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತದೆ", - "CONSCIOUSNESS_LEVEL__ALERT": "ಎಚ್ಚರಿಕೆ", - "CONSCIOUSNESS_LEVEL__AGITATED_OR_CONFUSED": "ಕ್ಷೋಭೆ ಅಥವಾ ಗೊಂದಲ", - "CONSCIOUSNESS_LEVEL__ONSET_OF_AGITATION_AND_CONFUSION": "ಆಂದೋಲನ ಮತ್ತು ಗೊಂದಲದ ಆರಂಭ", - "PUPIL_REACTION__UNKNOWN": "ಅಜ್ಞಾತ", - "PUPIL_REACTION__BRISK": "ಚುರುಕಾದ", - "PUPIL_REACTION__SLUGGISH": "ಜಡ", - "PUPIL_REACTION__FIXED": "ನಿವಾರಿಸಲಾಗಿದೆ", - "PUPIL_REACTION__CANNOT_BE_ASSESSED": "ಮೌಲ್ಯಮಾಪನ ಮಾಡಲಾಗುವುದಿಲ್ಲ", - "LIMB_RESPONSE__UNKNOWN": "ಅಜ್ಞಾತ", - "LIMB_RESPONSE__STRONG": "ಬಲಶಾಲಿ", - "LIMB_RESPONSE__MODERATE": "ಮಧ್ಯಮ", - "LIMB_RESPONSE__WEAK": "ದುರ್ಬಲ", - "LIMB_RESPONSE__FLEXION": "ಬಾಗುವಿಕೆ", - "LIMB_RESPONSE__EXTENSION": "ವಿಸ್ತರಣೆ", - "LIMB_RESPONSE__NONE": "ಯಾವುದೂ ಇಲ್ಲ", - "OXYGEN_MODALITY__NASAL_PRONGS": "ಮೂಗಿನ ಪ್ರಾಂಗ್ಸ್", - "OXYGEN_MODALITY__SIMPLE_FACE_MASK": "ಸರಳ ಫೇಸ್ ಮಾಸ್ಕ್", - "OXYGEN_MODALITY__NON_REBREATHING_MASK": "ನಾನ್ ರಿಬ್ರೆಥಿಂಗ್ ಮಾಸ್ಕ್", - "OXYGEN_MODALITY__HIGH_FLOW_NASAL_CANNULA": "ಹೈ ಫ್ಲೋ ನಾಸಲ್ ಕ್ಯಾನುಲಾ", - "INSULIN_INTAKE_FREQUENCY__UNKNOWN": "ಅಜ್ಞಾತ", - "INSULIN_INTAKE_FREQUENCY__OD": "ದಿನಕ್ಕೆ ಒಮ್ಮೆ (OD)", - "INSULIN_INTAKE_FREQUENCY__BD": "ದಿನಕ್ಕೆ ಎರಡು ಬಾರಿ (BD)", - "INSULIN_INTAKE_FREQUENCY__TD": "ದಿನಕ್ಕೆ ಮೂರು ಬಾರಿ (ಟಿಡಿ)", - "NURSING_CARE_PROCEDURE__personal_hygiene": "ವೈಯಕ್ತಿಕ ನೈರ್ಮಲ್ಯ", - "NURSING_CARE_PROCEDURE__positioning": "ಸ್ಥಾನೀಕರಣ", - "NURSING_CARE_PROCEDURE__suctioning": "ಹೀರುವುದು", - "NURSING_CARE_PROCEDURE__ryles_tube_care": "ರೈಲ್ಸ್ ಟ್ಯೂಬ್ ಕೇರ್", - "NURSING_CARE_PROCEDURE__iv_sitecare": "IV ಸೈಟ್ ಕೇರ್", - "NURSING_CARE_PROCEDURE__nubulisation": "ನೂಬುಲೈಸೇಶನ್", - "NURSING_CARE_PROCEDURE__dressing": "ಡ್ರೆಸ್ಸಿಂಗ್", - "NURSING_CARE_PROCEDURE__dvt_pump_stocking": "DVT ಪಂಪ್ ಸ್ಟಾಕಿಂಗ್", - "NURSING_CARE_PROCEDURE__restrain": "ನಿಗ್ರಹಿಸಿ", - "NURSING_CARE_PROCEDURE__chest_tube_care": "ಚೆಸ್ಟ್ ಟ್ಯೂಬ್ ಕೇರ್", - "NURSING_CARE_PROCEDURE__tracheostomy_care": "ಟ್ರಾಕಿಯೊಸ್ಟೊಮಿ ಕೇರ್", - "NURSING_CARE_PROCEDURE__stoma_care": "ಸ್ಟೊಮಾ ಕೇರ್", - "NURSING_CARE_PROCEDURE__catheter_care": "ಕ್ಯಾತಿಟರ್ ಕೇರ್", - "HEARTBEAT_RHYTHM__REGULAR": "ನಿಯಮಿತ", - "HEARTBEAT_RHYTHM__IRREGULAR": "ಅನಿಯಮಿತ", - "HEARTBEAT_RHYTHM__UNKNOWN": "ಅಜ್ಞಾತ", + "linked_facilities": "ಲಿಂಕ್ಡ್ ಸೌಲಭ್ಯಗಳು", + "liquid_oxygen_capacity": "ದ್ರವ ಆಮ್ಲಜನಕದ ಸಾಮರ್ಥ್ಯ", + "list_view": "ಪಟ್ಟಿ ವೀಕ್ಷಣೆ", + "litres": "ಲೀಟರ್", + "litres_per_day": "ಲೀಟರ್ / ದಿನ", + "live": "ಲೈವ್", + "live_monitoring": "ಲೈವ್ ಮಾನಿಟರಿಂಗ್", + "load_more": "ಇನ್ನಷ್ಟು ಲೋಡ್ ಮಾಡಿ", + "loading": "ಲೋಡ್ ಆಗುತ್ತಿದೆ...", + "local_body": "ಸ್ಥಳೀಯ ಸಂಸ್ಥೆ", + "local_ipaddress": "ಸ್ಥಳೀಯ IP ವಿಳಾಸ", + "location": "ಸ್ಥಳ", + "location_management": "ಸ್ಥಳ ನಿರ್ವಹಣೆ", + "log_lab_results": "ಲಾಗ್ ಲ್ಯಾಬ್ ಫಲಿತಾಂಶಗಳು", + "log_report": "ಲಾಗ್ ವರದಿ", + "login": "ಲಾಗಿನ್", + "longitude_invalid": "ರೇಖಾಂಶವು -180 ಮತ್ತು 180 ರ ನಡುವೆ ಇರಬೇಕು", + "lsg": "Lsg", + "make_multiple_beds_label": "ನೀವು ಬಹು ಹಾಸಿಗೆಗಳನ್ನು ಮಾಡಲು ಬಯಸುವಿರಾ?", + "manage_prescriptions": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ", + "manufacturer": "ತಯಾರಕ", "map_acronym": "ನಕ್ಷೆ", - "systolic": "ಸಿಸ್ಟೊಲಿಕ್", - "diastolic": "ಡಯಾಸ್ಟೊಲಿಕ್", - "pain": "ನೋವು", - "pain_chart_description": "ನೋವಿನ ಪ್ರದೇಶ ಮತ್ತು ತೀವ್ರತೆಯನ್ನು ಗುರುತಿಸಿ", - "bradycardia": "ಬ್ರಾಡಿಕಾರ್ಡಿಯಾ", - "tachycardia": "ಟಾಕಿಕಾರ್ಡಿಯಾ", - "medicine": "ಔಷಧಿ", - "route": "ಮಾರ್ಗ", - "dosage": "ಡೋಸೇಜ್", - "base_dosage": "ಡೋಸೇಜ್", - "start_dosage": "ಡೋಸೇಜ್ ಪ್ರಾರಂಭಿಸಿ", - "target_dosage": "ಗುರಿ ಡೋಸೇಜ್", - "instruction_on_titration": "ಟೈಟರೇಶನ್ ಕುರಿತು ಸೂಚನೆ", - "titrate_dosage": "ಟೈಟ್ರೇಟ್ ಡೋಸೇಜ್", - "indicator": "ಸೂಚಕ", - "inidcator_event": "ಸೂಚಕ ಈವೆಂಟ್", + "mark_all_as_read": "ಎಲ್ಲವನ್ನೂ ಓದಿ ಎಂದು ಗುರುತಿಸಿ", + "mark_as_read": "ಓದಿದಂತೆ ಗುರುತಿಸಿ", + "mark_as_unread": "ಓದದಿರುವಂತೆ ಗುರುತಿಸಿ", + "mark_this_transfer_as_complete_question": "ಈ ವರ್ಗಾವಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ ಎಂದು ಗುರುತಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? ಮೂಲ ಸೌಲಭ್ಯವು ಇನ್ನು ಮುಂದೆ ಈ ರೋಗಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುವುದಿಲ್ಲ", + "mark_transfer_complete_confirmation": "ಈ ವರ್ಗಾವಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ ಎಂದು ಗುರುತಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? ಮೂಲ ಸೌಲಭ್ಯವು ಇನ್ನು ಮುಂದೆ ಈ ರೋಗಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುವುದಿಲ್ಲ", "max_dosage_24_hrs": "ಗರಿಷ್ಠ 24 ಗಂಟೆಗಳಲ್ಲಿ ಡೋಸೇಜ್", - "min_time_bw_doses": "ಕನಿಷ್ಠ ಸಮಯ b/w ಪ್ರಮಾಣಗಳು", - "manage_prescriptions": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ", - "prescription_details": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ವಿವರಗಳು", - "prescription_medications": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಔಷಧಿಗಳು", - "prn_prescriptions": "PRN ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್‌ಗಳು", - "prescription": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್", - "discharge_prescription": "ಡಿಸ್ಚಾರ್ಜ್ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್", - "edit_prescriptions": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್‌ಗಳನ್ನು ಸಂಪಾದಿಸಿ", - "prescription_medication": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಔಷಧಿ", - "add_prescription_medication": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಔಷಧಿಗಳನ್ನು ಸೇರಿಸಿ", - "prn_prescription": "PRN ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್", - "add_prn_prescription": "PRN ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಸೇರಿಸಿ", - "add_prescription_to_consultation_note": "ಈ ಸಮಾಲೋಚನೆಗೆ ಹೊಸ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಸೇರಿಸಿ.", + "max_dosage_in_24hrs_gte_base_dosage_error": "ಗರಿಷ್ಠ 24 ಗಂಟೆಗಳಲ್ಲಿ ಡೋಸೇಜ್ ಬೇಸ್ ಡೋಸೇಜ್‌ಗಿಂತ ಹೆಚ್ಚಾಗಿರಬೇಕು ಅಥವಾ ಸಮನಾಗಿರಬೇಕು", + "max_size_for_image_uploaded_should_be": "ಅಪ್‌ಲೋಡ್ ಮಾಡಿದ ಚಿತ್ರಕ್ಕೆ ಗರಿಷ್ಠ ಗಾತ್ರ ಇರಬೇಕು", + "medical_worker": "ವೈದ್ಯಕೀಯ ಕೆಲಸಗಾರ", + "medicine": "ಔಷಧಿ", "medicine_administration_history": "ಮೆಡಿಸಿನ್ ಅಡ್ಮಿನಿಸ್ಟ್ರೇಷನ್ ಇತಿಹಾಸ", - "return_to_patient_dashboard": "ರೋಗಿಯ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್‌ಗೆ ಹಿಂತಿರುಗಿ", - "administered_on": "ರಂದು ನಿರ್ವಹಿಸಲಾಗಿದೆ", - "administer": "ನಿರ್ವಹಿಸು", - "administer_medicine": "ಔಷಧವನ್ನು ನಿರ್ವಹಿಸಿ", - "administer_medicines": "ಔಷಧಗಳನ್ನು ನಿರ್ವಹಿಸಿ", - "administer_selected_medicines": "ಆಯ್ದ ಔಷಧಗಳನ್ನು ನಿರ್ವಹಿಸಿ", - "select_for_administration": "ಆಡಳಿತಕ್ಕಾಗಿ ಆಯ್ಕೆಮಾಡಿ", "medicines_administered": "ಔಷಧ(ಗಳು) ನಿರ್ವಹಿಸಲಾಗಿದೆ", "medicines_administered_error": "ಔಷಧ(ಗಳನ್ನು) ನಿರ್ವಹಿಸುವಲ್ಲಿ ದೋಷ", - "prescription_discontinued": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಸ್ಥಗಿತಗೊಂಡಿದೆ", - "administration_notes": "ಆಡಳಿತ ಟಿಪ್ಪಣಿಗಳು", - "last_administered": "ಕೊನೆಯದಾಗಿ ನಿರ್ವಹಿಸಲಾಗಿದೆ", - "prescription_logs": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ದಾಖಲೆಗಳು", + "middleware_hostname": "ಮಿಡಲ್ವೇರ್ ಹೋಸ್ಟ್ ಹೆಸರು", + "min_password_len_8": "ಕನಿಷ್ಠ ಪಾಸ್‌ವರ್ಡ್ ಉದ್ದ 8", + "min_time_bw_doses": "ಕನಿಷ್ಠ ಸಮಯ b/w ಪ್ರಮಾಣಗಳು", + "mobile": "ಮೊಬೈಲ್", + "mobile_number": "ಮೊಬೈಲ್ ಸಂಖ್ಯೆ", "modification_caution_note": "ಒಮ್ಮೆ ಸೇರಿಸಿದ ನಂತರ ಯಾವುದೇ ಮಾರ್ಪಾಡುಗಳು ಸಾಧ್ಯವಿಲ್ಲ", - "discontinue_caution_note": "ಈ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಅನ್ನು ನಿಲ್ಲಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?", - "confirm_discontinue": "ಸ್ಥಗಿತಗೊಳಿಸುವುದನ್ನು ದೃಢೀಕರಿಸಿ", - "edit_caution_note": "ಸಂಪಾದಿತ ವಿವರಗಳೊಂದಿಗೆ ಹೊಸ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಅನ್ನು ಸಮಾಲೋಚನೆಗೆ ಸೇರಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಪ್ರಸ್ತುತ ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಅನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಲಾಗುತ್ತದೆ.", - "reason_for_discontinuation": "ಸ್ಥಗಿತಗೊಳ್ಳಲು ಕಾರಣ", - "reason_for_edit": "ಸಂಪಾದನೆಗೆ ಕಾರಣ", - "PRESCRIPTION_ROUTE_ORAL": "ಮೌಖಿಕ", - "PRESCRIPTION_ROUTE_IV": "IV", - "PRESCRIPTION_ROUTE_IM": "IM", - "PRESCRIPTION_ROUTE_SC": "ಎಸ್/ಸಿ", - "PRESCRIPTION_ROUTE_INHALATION": "ಇನ್ಹಲೇಷನ್", - "PRESCRIPTION_ROUTE_NASOGASTRIC": "ನಾಸೊಗ್ಯಾಸ್ಟ್ರಿಕ್ / ಗ್ಯಾಸ್ಟ್ರೋಸ್ಟೊಮಿ ಟ್ಯೂಬ್", - "PRESCRIPTION_ROUTE_INTRATHECAL": "ಇಂಟ್ರಾಥೆಕಲ್ ಇಂಜೆಕ್ಷನ್", - "PRESCRIPTION_ROUTE_TRANSDERMAL": "ಟ್ರಾನ್ಸ್ಡರ್ಮಲ್", - "PRESCRIPTION_ROUTE_RECTAL": "ಗುದನಾಳ", - "PRESCRIPTION_ROUTE_SUBLINGUAL": "ಉಪಭಾಷೆ", - "PRESCRIPTION_FREQUENCY_STAT": "ತಕ್ಷಣವೇ", - "PRESCRIPTION_FREQUENCY_OD": "ದಿನಕ್ಕೆ ಒಮ್ಮೆ", - "PRESCRIPTION_FREQUENCY_HS": "ರಾತ್ರಿ ಮಾತ್ರ", - "PRESCRIPTION_FREQUENCY_BD": "ದಿನಕ್ಕೆ ಎರಡು ಬಾರಿ", - "PRESCRIPTION_FREQUENCY_TID": "8 ನೇ ಗಂಟೆಗೆ", - "PRESCRIPTION_FREQUENCY_QID": "6 ನೇ ಗಂಟೆಗೆ", - "PRESCRIPTION_FREQUENCY_Q4H": "4 ನೇ ಗಂಟೆಗೆ", - "PRESCRIPTION_FREQUENCY_QOD": "ಪರ್ಯಾಯ ದಿನ", - "PRESCRIPTION_FREQUENCY_QWK": "ವಾರಕ್ಕೊಮ್ಮೆ", - "inconsistent_dosage_units_error": "ಡೋಸೇಜ್ ಘಟಕಗಳು ಒಂದೇ ಆಗಿರಬೇಕು", - "max_dosage_in_24hrs_gte_base_dosage_error": "ಗರಿಷ್ಠ 24 ಗಂಟೆಗಳಲ್ಲಿ ಡೋಸೇಜ್ ಬೇಸ್ ಡೋಸೇಜ್‌ಗಿಂತ ಹೆಚ್ಚಾಗಿರಬೇಕು ಅಥವಾ ಸಮನಾಗಿರಬೇಕು", - "administration_dosage_range_error": "ಡೋಸೇಜ್ ಪ್ರಾರಂಭ ಮತ್ತು ಗುರಿ ಡೋಸೇಜ್ ನಡುವೆ ಇರಬೇಕು", + "modified": "ಮಾರ್ಪಡಿಸಲಾಗಿದೆ", + "modified_date": "ಮಾರ್ಪಡಿಸಿದ ದಿನಾಂಕ", + "monitor": "ಮಾನಿಟರ್", + "more_info": "ಹೆಚ್ಚಿನ ಮಾಹಿತಿ", + "moving_camera": "ಮೂವಿಂಗ್ ಕ್ಯಾಮೆರಾ", + "name": "ಹೆಸರು", + "name_of_hospital": "ಆಸ್ಪತ್ರೆಯ ಹೆಸರು", + "name_of_shifting_approving_facility": "ಶಿಫ್ಟಿಂಗ್ ಅನುಮೋದಿಸುವ ಸೌಲಭ್ಯದ ಹೆಸರು", + "nationality": "ರಾಷ್ಟ್ರೀಯತೆ", + "never": "ಎಂದಿಗೂ", + "new_password": "ಹೊಸ ಪಾಸ್ವರ್ಡ್", + "next_sessions": "ಮುಂದಿನ ಸೆಷನ್‌ಗಳು", + "no": "ಸಂ", + "no_bed_types_found": "ಯಾವುದೇ ಹಾಸಿಗೆಯ ಪ್ರಕಾರಗಳು ಕಂಡುಬಂದಿಲ್ಲ", + "no_changes": "ಯಾವುದೇ ಬದಲಾವಣೆಗಳಿಲ್ಲ", + "no_changes_made": "ಯಾವುದೇ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲಾಗಿಲ್ಲ", + "no_consultation_updates": "ಸಮಾಲೋಚನೆಯ ನವೀಕರಣಗಳಿಲ್ಲ", + "no_cover_photo_uploaded_for_this_facility": "ಈ ಸೌಲಭ್ಯಕ್ಕಾಗಿ ಯಾವುದೇ ಕವರ್ ಫೋಟೋ ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗಿಲ್ಲ", + "no_data_found": "ಯಾವುದೇ ಡೇಟಾ ಕಂಡುಬಂದಿಲ್ಲ", + "no_duplicate_facility": "ನೀವು ನಕಲಿ ಸೌಲಭ್ಯಗಳನ್ನು ರಚಿಸಬಾರದು", + "no_facilities": "ಯಾವುದೇ ಸೌಲಭ್ಯಗಳು ಕಂಡುಬಂದಿಲ್ಲ", + "no_files_found": "ಯಾವುದೇ {{type}} ಫೈಲ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ", + "no_home_facility": "ಮನೆ ಸೌಲಭ್ಯ ನೀಡಿಲ್ಲ", + "no_investigation": "ಯಾವುದೇ ತನಿಖಾ ವರದಿಗಳು ಕಂಡುಬಂದಿಲ್ಲ", + "no_investigation_suggestions": "ಯಾವುದೇ ತನಿಖೆಯ ಸಲಹೆಗಳಿಲ್ಲ", + "no_linked_facilities": "ಯಾವುದೇ ಲಿಂಕ್ ಮಾಡಲಾದ ಸೌಲಭ್ಯಗಳಿಲ್ಲ", + "no_log_update_delta": "ಹಿಂದಿನ ಲಾಗ್ ನವೀಕರಣದ ನಂತರ ಯಾವುದೇ ಬದಲಾವಣೆಗಳಿಲ್ಲ", "no_notices_for_you": "ನಿಮಗಾಗಿ ಯಾವುದೇ ಸೂಚನೆಗಳಿಲ್ಲ.", - "mark_as_read": "ಓದಿದಂತೆ ಗುರುತಿಸಿ", - "mark_as_unread": "ಓದದಿರುವಂತೆ ಗುರುತಿಸಿ", - "subscribe": "ಚಂದಾದಾರರಾಗಿ", - "subscribe_on_this_device": "ಈ ಸಾಧನದಲ್ಲಿ ಚಂದಾದಾರರಾಗಿ", + "no_patients_to_show": "ತೋರಿಸಲು ರೋಗಿಗಳಿಲ್ಲ.", + "no_results_found": "ಯಾವುದೇ ಫಲಿತಾಂಶಗಳು ಕಂಡುಬಂದಿಲ್ಲ", + "no_staff": "ಸಿಬ್ಬಂದಿ ಪತ್ತೆಯಾಗಿಲ್ಲ", + "no_treating_physicians_available": "ಈ ಸೌಲಭ್ಯವು ಯಾವುದೇ ಮನೆ ಸೌಲಭ್ಯ ವೈದ್ಯರನ್ನು ಹೊಂದಿಲ್ಲ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.", + "no_users_found": "ಯಾವುದೇ ಬಳಕೆದಾರರು ಕಂಡುಬಂದಿಲ್ಲ", + "none": "ಯಾವುದೂ ಇಲ್ಲ", + "normal": "ಸಾಮಾನ್ಯ", + "not_specified": "ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿಲ್ಲ", + "notes": "ಟಿಪ್ಪಣಿಗಳು", + "notes_placeholder": "ನಿಮ್ಮ ಟಿಪ್ಪಣಿಗಳನ್ನು ಟೈಪ್ ಮಾಡಿ", "notification_permission_denied": "ಅಧಿಸೂಚನೆ ಅನುಮತಿ ನಿರಾಕರಿಸಲಾಗಿದೆ", "notification_permission_granted": "ಅಧಿಸೂಚನೆ ಅನುಮತಿ ನೀಡಲಾಗಿದೆ", - "show_unread_notifications": "ಓದದಿರುವುದನ್ನು ತೋರಿಸಿ", - "show_all_notifications": "ಎಲ್ಲವನ್ನೂ ತೋರಿಸು", - "filter_by_category": "ವರ್ಗದ ಪ್ರಕಾರ ಫಿಲ್ಟರ್ ಮಾಡಿ", - "mark_all_as_read": "ಎಲ್ಲವನ್ನೂ ಓದಿ ಎಂದು ಗುರುತಿಸಿ", - "reload": "ಮರುಲೋಡ್ ಮಾಡಿ", - "no_results_found": "ಯಾವುದೇ ಫಲಿತಾಂಶಗಳು ಕಂಡುಬಂದಿಲ್ಲ", - "load_more": "ಇನ್ನಷ್ಟು ಲೋಡ್ ಮಾಡಿ", - "subscription_error": "ಚಂದಾದಾರಿಕೆ ದೋಷ", - "unsubscribe_failed": "ಅನ್‌ಸಬ್‌ಸ್ಕ್ರೈಬ್ ವಿಫಲವಾಗಿದೆ.", - "unsubscribe": "ಅನ್‌ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಿ", - "escape": "ಎಸ್ಕೇಪ್", - "invalid_asset_id_msg": "ಓಹ್! ನೀವು ನಮೂದಿಸಿದ ಸ್ವತ್ತು ಐಡಿ ಮಾನ್ಯವಾಗಿರುವಂತೆ ತೋರುತ್ತಿಲ್ಲ.", - "asset_not_found_msg": "ಓಹ್! ನೀವು ಹುಡುಕುತ್ತಿರುವ ಸ್ವತ್ತು ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಸ್ವತ್ತಿನ ಐಡಿಯನ್ನು ಪರಿಶೀಲಿಸಿ.", - "create_resource_request": "ಸಂಪನ್ಮೂಲ ವಿನಂತಿಯನ್ನು ರಚಿಸಿ", - "contact_person": "ಸೌಲಭ್ಯದಲ್ಲಿರುವ ಸಂಪರ್ಕ ವ್ಯಕ್ತಿಯ ಹೆಸರು", - "approving_facility": "ಅನುಮೋದಿಸುವ ಸೌಲಭ್ಯದ ಹೆಸರು", - "contact_phone": "ಸಂಪರ್ಕ ವ್ಯಕ್ತಿ ಸಂಖ್ಯೆ", + "number_of_aged_dependents_above_60": "ವಯಸ್ಸಾದ ಅವಲಂಬಿತರ ಸಂಖ್ಯೆ (60 ಕ್ಕಿಂತ ಹೆಚ್ಚು)", + "number_of_beds": "ಹಾಸಿಗೆಗಳ ಸಂಖ್ಯೆ", + "number_of_beds_out_of_range_error": "ಹಾಸಿಗೆಗಳ ಸಂಖ್ಯೆ 100 ಕ್ಕಿಂತ ಹೆಚ್ಚಿರಬಾರದು", + "number_of_chronic_diseased_dependents": "ದೀರ್ಘಕಾಲದ ರೋಗಗಳ ಅವಲಂಬಿತರ ಸಂಖ್ಯೆ", + "on": "ಆನ್", + "ongoing_medications": "ನಡೆಯುತ್ತಿರುವ ಔಷಧಿಗಳು", + "open": "ತೆರೆಯಿರಿ", + "open_camera": "ಕ್ಯಾಮರಾ ತೆರೆಯಿರಿ", + "open_live_monitoring": "ಲೈವ್ ಮಾನಿಟರಿಂಗ್ ತೆರೆಯಿರಿ", + "optional": "ಐಚ್ಛಿಕ", + "ordering": "ಆರ್ಡರ್ ಮಾಡಲಾಗುತ್ತಿದೆ", + "origin_facility": "ಪ್ರಸ್ತುತ ಸೌಲಭ್ಯ", + "oxygen_information": "ಆಮ್ಲಜನಕ ಮಾಹಿತಿ", + "page_not_found": "ಪುಟ ಕಂಡುಬಂದಿಲ್ಲ", + "pain": "ನೋವು", + "pain_chart_description": "ನೋವಿನ ಪ್ರದೇಶ ಮತ್ತು ತೀವ್ರತೆಯನ್ನು ಗುರುತಿಸಿ", + "passport_number": "ಪಾಸ್ಪೋರ್ಟ್ ಸಂಖ್ಯೆ", + "password": "ಪಾಸ್ವರ್ಡ್", + "password_mismatch": "ಪಾಸ್ವರ್ಡ್ ಮತ್ತು ದೃಢೀಕರಣ ಪಾಸ್ವರ್ಡ್ ಒಂದೇ ಆಗಿರಬೇಕು.", + "password_reset_failure": "ಪಾಸ್ವರ್ಡ್ ಮರುಹೊಂದಿಸಲು ವಿಫಲವಾಗಿದೆ", + "password_reset_success": "ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಮರುಹೊಂದಿಸಲಾಗಿದೆ", + "password_sent": "ಪಾಸ್ವರ್ಡ್ ಮರುಹೊಂದಿಸುವ ಇಮೇಲ್ ಕಳುಹಿಸಲಾಗಿದೆ", + "patient_address": "ರೋಗಿಯ ವಿಳಾಸ", + "patient_category": "ರೋಗಿಗಳ ವರ್ಗ", + "patient_consultation__admission": "ಪ್ರವೇಶ ದಿನಾಂಕ", + "patient_consultation__consultation_notes": "ಸಾಮಾನ್ಯ ಸೂಚನೆಗಳು", + "patient_consultation__dc_admission": "ಮನೆಯ ಆರೈಕೆಯ ದಿನಾಂಕ ಪ್ರಾರಂಭವಾಗಿದೆ", + "patient_consultation__ip": "IP", + "patient_consultation__op": "OP", + "patient_consultation__special_instruction": "ವಿಶೇಷ ಸೂಚನೆಗಳು", + "patient_consultation__treatment__plan": "ಯೋಜನೆ", + "patient_consultation__treatment__summary": "ಸಾರಾಂಶ", + "patient_consultation__treatment__summary__date": "ದಿನಾಂಕ", + "patient_consultation__treatment__summary__spo2": "SpO2", + "patient_consultation__treatment__summary__temperature": "ತಾಪಮಾನ", + "patient_created": "ರೋಗಿಯನ್ನು ರಚಿಸಲಾಗಿದೆ", + "patient_name": "ರೋಗಿಯ ಹೆಸರು", + "patient_no": "OP/IP ಸಂ", + "patient_phone_number": "ರೋಗಿಯ ಫೋನ್ ಸಂಖ್ಯೆ", + "patient_registration__address": "ವಿಳಾಸ", + "patient_registration__age": "ವಯಸ್ಸು", + "patient_registration__comorbidities": "ಸಹವರ್ತಿ ರೋಗಗಳು", + "patient_registration__comorbidities__details": "ವಿವರಗಳು", + "patient_registration__comorbidities__disease": "ರೋಗ", + "patient_registration__contact": "ತುರ್ತು ಸಂಪರ್ಕ", + "patient_registration__gender": "ಲಿಂಗ", + "patient_registration__name": "ಹೆಸರು", + "patient_state": "ರೋಗಿಯ ಸ್ಥಿತಿ", + "patient_status": "ರೋಗಿಯ ಸ್ಥಿತಿ", + "patient_transfer_birth_match_note": "ಗಮನಿಸಿ: ವರ್ಗಾವಣೆ ವಿನಂತಿಯನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಹುಟ್ಟಿದ ವರ್ಷವು ರೋಗಿಗೆ ಹೊಂದಿಕೆಯಾಗಬೇಕು.", + "phone": "ಫೋನ್", + "phone_no": "ದೂರವಾಣಿ ಸಂಖ್ಯೆ.", + "phone_number": "ದೂರವಾಣಿ ಸಂಖ್ಯೆ", + "phone_number_at_current_facility": "ಪ್ರಸ್ತುತ ಸೌಲಭ್ಯದಲ್ಲಿರುವ ವ್ಯಕ್ತಿಯ ಸಂಪರ್ಕದ ಫೋನ್ ಸಂಖ್ಯೆ", + "pincode": "ಪಿನ್‌ಕೋಡ್", + "please_enter_a_reason_for_the_shift": "ದಯವಿಟ್ಟು ಶಿಫ್ಟ್‌ಗೆ ಕಾರಣವನ್ನು ನಮೂದಿಸಿ.", + "please_select_a_facility": "ದಯವಿಟ್ಟು ಸೌಲಭ್ಯವನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "please_select_breathlessness_level": "ದಯವಿಟ್ಟು ಉಸಿರಾಟದ ಮಟ್ಟವನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "please_select_facility_type": "ದಯವಿಟ್ಟು ಸೌಲಭ್ಯದ ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "please_select_patient_category": "ದಯವಿಟ್ಟು ರೋಗಿಯ ವರ್ಗವನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "please_select_preferred_vehicle_type": "ದಯವಿಟ್ಟು ಆದ್ಯತೆಯ ವಾಹನದ ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "please_select_status": "ದಯವಿಟ್ಟು ಸ್ಥಿತಿಯನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "please_upload_a_csv_file": "ದಯವಿಟ್ಟು CSV ಫೈಲ್ ಅನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿ", + "post_your_comment": "ನಿಮ್ಮ ಕಾಮೆಂಟ್ ಅನ್ನು ಪೋಸ್ಟ್ ಮಾಡಿ", + "powered_by": "ನಡೆಸಲ್ಪಡುತ್ತಿದೆ", + "preferred_facility_type": "ಆದ್ಯತೆಯ ಸೌಲಭ್ಯದ ಪ್ರಕಾರ", + "preferred_vehicle": "ಆದ್ಯತೆಯ ವಾಹನ", + "prescription": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್", + "prescription_details": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ವಿವರಗಳು", + "prescription_discontinued": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಸ್ಥಗಿತಗೊಂಡಿದೆ", + "prescription_logs": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ದಾಖಲೆಗಳು", + "prescription_medication": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಔಷಧಿ", + "prescription_medications": "ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್ ಔಷಧಿಗಳು", + "prescriptions__dosage_frequency": "ಡೋಸೇಜ್ ಮತ್ತು ಆವರ್ತನ", + "prescriptions__medicine": "ಔಷಧಿ", + "prescriptions__route": "ಮಾರ್ಗ", + "prescriptions__start_date": "ರಂದು ಸೂಚಿಸಲಾಗಿದೆ", + "prev_sessions": "ಹಿಂದಿನ ಅವಧಿಗಳು", + "principal": "ಪ್ರಿನ್ಸಿಪಾಲ್", + "principal_diagnosis": "ಮುಖ್ಯ ರೋಗನಿರ್ಣಯ", + "print": "ಮುದ್ರಿಸು", + "print_referral_letter": "ರೆಫರಲ್ ಲೆಟರ್ ಅನ್ನು ಮುದ್ರಿಸಿ", + "prn_prescription": "PRN ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್", + "prn_prescriptions": "PRN ಪ್ರಿಸ್ಕ್ರಿಪ್ಷನ್‌ಗಳು", + "procedure_suggestions": "ಕಾರ್ಯವಿಧಾನದ ಸಲಹೆಗಳು", + "provisional": "ತಾತ್ಕಾಲಿಕ", + "ration_card__APL": "ಎಪಿಎಲ್", + "ration_card__BPL": "ಬಿಪಿಎಲ್", + "ration_card__NO_CARD": "ಕಾರ್ಡ್ ಅಲ್ಲದ ಹೋಲ್ಡರ್", + "reason": "ಕಾರಣ", + "reason_for_discontinuation": "ಸ್ಥಗಿತಗೊಳ್ಳಲು ಕಾರಣ", + "reason_for_edit": "ಸಂಪಾದನೆಗೆ ಕಾರಣ", + "reason_for_referral": "ಉಲ್ಲೇಖಕ್ಕೆ ಕಾರಣ", + "reason_for_shift": "ಸ್ಥಳಾಂತರಕ್ಕೆ ಕಾರಣ", + "recommended_aspect_ratio_for": "ಇದಕ್ಕಾಗಿ ಶಿಫಾರಸು ಮಾಡಲಾದ ಆಕಾರ ಅನುಪಾತ", + "record": "ರೆಕಾರ್ಡ್ ಆಡಿಯೋ", + "record_delete_confirm": "ಈ ದಾಖಲೆಯನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?", + "record_has_been_deleted_successfully": "ದಾಖಲೆಯನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅಳಿಸಲಾಗಿದೆ.", + "record_updates": "ರೆಕಾರ್ಡ್ ನವೀಕರಣಗಳು", + "recording": "ರೆಕಾರ್ಡಿಂಗ್", + "redirected_to_create_consultation": "ಗಮನಿಸಿ: ಸಮಾಲೋಚನೆ ಫಾರ್ಮ್ ರಚಿಸಲು ನಿಮ್ಮನ್ನು ಮರುನಿರ್ದೇಶಿಸಲಾಗುತ್ತದೆ. ವರ್ಗಾವಣೆ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ದಯವಿಟ್ಟು ಫಾರ್ಮ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ", + "referral_letter": "ಉಲ್ಲೇಖ ಪತ್ರ", + "referred_to": "ಉಲ್ಲೇಖಿಸಲಾಗಿದೆ", + "refresh_list": "ಪಟ್ಟಿಯನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ", + "refuted": "ನಿರಾಕರಿಸಲಾಗಿದೆ", + "register_hospital": "ಆಸ್ಪತ್ರೆಯನ್ನು ನೋಂದಾಯಿಸಿ", + "register_page_title": "ಆಸ್ಪತ್ರೆ ನಿರ್ವಾಹಕರಾಗಿ ನೋಂದಾಯಿಸಿ", + "reload": "ಮರುಲೋಡ್ ಮಾಡಿ", + "remove": "ತೆಗೆದುಹಾಕಿ", + "rename": "ಮರುಹೆಸರಿಸು", + "report": "ವರದಿ", + "req_atleast_one_digit": "ಕನಿಷ್ಠ ಒಂದು ಅಂಕಿ ಅಗತ್ಯವಿದೆ", + "req_atleast_one_lowercase": "ಕನಿಷ್ಠ ಒಂದು ಸಣ್ಣ ಅಕ್ಷರದ ಅಗತ್ಯವಿದೆ", + "req_atleast_one_symbol": "ಕನಿಷ್ಠ ಒಂದು ಚಿಹ್ನೆಯ ಅಗತ್ಯವಿದೆ", + "req_atleast_one_uppercase": "ಕನಿಷ್ಠ ಒಂದು ದೊಡ್ಡ ಪ್ರಕರಣದ ಅಗತ್ಯವಿದೆ", + "request_description": "ವಿನಂತಿಯ ವಿವರಣೆ", + "request_description_placeholder": "ನಿಮ್ಮ ವಿವರಣೆಯನ್ನು ಇಲ್ಲಿ ಟೈಪ್ ಮಾಡಿ", "request_title": "ವಿನಂತಿ ಶೀರ್ಷಿಕೆ", "request_title_placeholder": "ನಿಮ್ಮ ಶೀರ್ಷಿಕೆಯನ್ನು ಇಲ್ಲಿ ಟೈಪ್ ಮಾಡಿ", + "required": "ಅಗತ್ಯವಿದೆ", "required_quantity": "ಅಗತ್ಯವಿರುವ ಪ್ರಮಾಣ", - "request_description": "ವಿನಂತಿಯ ವಿವರಣೆ", - "request_description_placeholder": "ನಿಮ್ಮ ವಿವರಣೆಯನ್ನು ಇಲ್ಲಿ ಟೈಪ್ ಮಾಡಿ", + "reset": "ಮರುಹೊಂದಿಸಿ", + "reset_password": "ಪಾಸ್ವರ್ಡ್ ಮರುಹೊಂದಿಸಿ", + "resource_request": "ಸಂಪನ್ಮೂಲ ವಿನಂತಿ", + "result": "ಫಲಿತಾಂಶ", + "result_date": "ಫಲಿತಾಂಶ ದಿನಾಂಕ", + "result_details": "ಫಲಿತಾಂಶದ ವಿವರಗಳು", + "resume": "ಪುನರಾರಂಭಿಸಿ", + "retake": "ಮರುಪಡೆಯಿರಿ", + "return_to_care": "CARE ಗೆ ಹಿಂತಿರುಗಿ", + "return_to_login": "ಲಾಗಿನ್‌ಗೆ ಹಿಂತಿರುಗಿ", + "return_to_password_reset": "ಪಾಸ್ವರ್ಡ್ ಮರುಹೊಂದಿಸಲು ಹಿಂತಿರುಗಿ", + "return_to_patient_dashboard": "ರೋಗಿಯ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್‌ಗೆ ಹಿಂತಿರುಗಿ", + "right": "ಸರಿ", + "route": "ಮಾರ್ಗ", + "sample_collection_date": "ಮಾದರಿ ಸಂಗ್ರಹ ದಿನಾಂಕ", + "sample_format": "ಮಾದರಿ ಸ್ವರೂಪ", + "sample_type": "ಮಾದರಿ ಪ್ರಕಾರ", + "save": "ಉಳಿಸಿ", + "save_and_continue": "ಉಳಿಸಿ ಮತ್ತು ಮುಂದುವರಿಸಿ", + "save_investigation": "ತನಿಖೆಯನ್ನು ಉಳಿಸಿ", + "scan_asset_qr": "ಸ್ವತ್ತು QR ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ!", + "search_by_username": "ಬಳಕೆದಾರ ಹೆಸರಿನ ಮೂಲಕ ಹುಡುಕಿ", + "search_for_facility": "ಸೌಲಭ್ಯಕ್ಕಾಗಿ ಹುಡುಕಿ", + "search_icd11_placeholder": "ICD-11 ರೋಗನಿರ್ಣಯಗಳಿಗಾಗಿ ಹುಡುಕಿ", + "search_investigation_placeholder": "ಹುಡುಕಾಟ ತನಿಖೆ ಮತ್ತು ಗುಂಪುಗಳು", + "search_patient": "ರೋಗಿಯನ್ನು ಹುಡುಕಿ", "search_resource": "ಹುಡುಕಾಟ ಸಂಪನ್ಮೂಲ", - "emergency": "ತುರ್ತು ಪರಿಸ್ಥಿತಿ", - "up_shift": "ಅಪ್ ಶಿಫ್ಟ್", - "antenatal": "ಪ್ರಸವಪೂರ್ವ", - "phone_no": "ದೂರವಾಣಿ ಸಂಖ್ಯೆ.", - "patient_name": "ರೋಗಿಯ ಹೆಸರು", - "disease_status": "ರೋಗದ ಸ್ಥಿತಿ", - "breathlessness_level": "ಉಸಿರಾಟದ ಮಟ್ಟ", - "assigned_facility": "ಸೌಲಭ್ಯವನ್ನು ನಿಯೋಜಿಸಲಾಗಿದೆ", - "origin_facility": "ಪ್ರಸ್ತುತ ಸೌಲಭ್ಯ", - "shifting_approval_facility": "ಶಿಫ್ಟಿಂಗ್ ಅನುಮೋದನೆ ಸೌಲಭ್ಯ", + "select": "ಆಯ್ಕೆ ಮಾಡಿ", + "select_date": "ದಿನಾಂಕವನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "select_facility_for_discharged_patients_warning": "ಬಿಡುಗಡೆಯಾದ ರೋಗಿಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಸೌಲಭ್ಯವನ್ನು ಆಯ್ಕೆ ಮಾಡಬೇಕಾಗಿದೆ.", + "select_for_administration": "ಆಡಳಿತಕ್ಕಾಗಿ ಆಯ್ಕೆಮಾಡಿ", + "select_groups": "ಗುಂಪುಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "select_investigation": "ತನಿಖೆಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಎಲ್ಲಾ ತನಿಖೆಗಳನ್ನು ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಆಯ್ಕೆ ಮಾಡಲಾಗುತ್ತದೆ)", + "select_investigation_groups": "ತನಿಖಾ ಗುಂಪುಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "select_investigations": "ತನಿಖೆಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "select_local_body": "ಸ್ಥಳೀಯ ಸಂಸ್ಥೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "select_skills": "ಕೆಲವು ಕೌಶಲ್ಯಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ ಮತ್ತು ಸೇರಿಸಿ", + "select_wards": "ವಾರ್ಡ್‌ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ", + "send_email": "ಇಮೇಲ್ ಕಳುಹಿಸಿ", + "send_reset_link": "ಮರುಹೊಂದಿಸುವ ಲಿಂಕ್ ಕಳುಹಿಸಿ", + "serial_number": "ಸರಣಿ ಸಂಖ್ಯೆ", + "serviced_on": "ಸೇವೆ ಸಲ್ಲಿಸಲಾಗಿದೆ", + "session_expired": "ಅವಧಿ ಮುಗಿದಿದೆ", + "session_expired_msg": "ನಿಮ್ಮ ಅವಧಿ ಮುಗಿದಿದೆ ಎಂದು ತೋರುತ್ತಿದೆ. ಇದು ನಿಷ್ಕ್ರಿಯತೆಯ ಕಾರಣದಿಂದಾಗಿರಬಹುದು. ಮುಂದುವರಿಸಲು ದಯವಿಟ್ಟು ಮತ್ತೆ ಲಾಗಿನ್ ಮಾಡಿ.", + "set_average_weekly_working_hours_for": "ಸರಾಸರಿ ಸಾಪ್ತಾಹಿಕ ಕೆಲಸದ ಸಮಯವನ್ನು ಹೊಂದಿಸಿ", + "settings_and_filters": "ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಫಿಲ್ಟರ್‌ಗಳು", + "severity_of_breathlessness": "ಉಸಿರಾಟದ ತೀವ್ರತೆ", + "shift_request_updated_successfully": "ಶಿಫ್ಟ್ ವಿನಂತಿಯನ್ನು ಯಶಸ್ವಿಯಾಗಿ ನವೀಕರಿಸಲಾಗಿದೆ", "shifting": "ಶಿಫ್ಟಿಂಗ್", - "search_patient": "ರೋಗಿಯನ್ನು ಹುಡುಕಿ", - "list_view": "ಪಟ್ಟಿ ವೀಕ್ಷಣೆ", - "comment_min_length": "ಕಾಮೆಂಟ್ ಕನಿಷ್ಠ 1 ಅಕ್ಷರವನ್ನು ಹೊಂದಿರಬೇಕು", - "comment_added_successfully": "ಕಾಮೆಂಟ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಸೇರಿಸಲಾಗಿದೆ", - "post_your_comment": "ನಿಮ್ಮ ಕಾಮೆಂಟ್ ಅನ್ನು ಪೋಸ್ಟ್ ಮಾಡಿ", + "shifting_approval_facility": "ಶಿಫ್ಟಿಂಗ್ ಅನುಮೋದನೆ ಸೌಲಭ್ಯ", "shifting_approving_facility": "ಅನುಮೋದಿಸುವ ಸೌಲಭ್ಯವನ್ನು ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ", - "is_emergency_case": "ತುರ್ತು ಪ್ರಕರಣವಾಗಿದೆ", - "is_upshift_case": "ಅಪ್ ಶಿಫ್ಟ್ ಕೇಸ್ ಆಗಿದೆ", - "is_antenatal": "ಪ್ರಸವಪೂರ್ವವಾಗಿದೆ", - "patient_phone_number": "ರೋಗಿಯ ಫೋನ್ ಸಂಖ್ಯೆ", - "created_date": "ರಚಿಸಿದ ದಿನಾಂಕ", - "modified_date": "ಮಾರ್ಪಡಿಸಿದ ದಿನಾಂಕ", - "no_patients_to_show": "ತೋರಿಸಲು ರೋಗಿಗಳಿಲ್ಲ.", - "shifting_status": "ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ", - "transfer_to_receiving_facility": "ಸ್ವೀಕರಿಸುವ ಸೌಲಭ್ಯಕ್ಕೆ ವರ್ಗಾಯಿಸಿ", - "confirm_transfer_complete": "ವರ್ಗಾವಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿ!", - "mark_transfer_complete_confirmation": "ಈ ವರ್ಗಾವಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ ಎಂದು ಗುರುತಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? ಮೂಲ ಸೌಲಭ್ಯವು ಇನ್ನು ಮುಂದೆ ಈ ರೋಗಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುವುದಿಲ್ಲ", - "board_view": "ಬೋರ್ಡ್ ವೀಕ್ಷಣೆ", + "shifting_approving_facility_can_not_be_empty": "ಶಿಫ್ಟಿಂಗ್ ಅನುಮೋದಿಸುವ ಸೌಲಭ್ಯ ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.", "shifting_deleted": "ಶಿಫ್ಟಿಂಗ್ ದಾಖಲೆಯನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅಳಿಸಲಾಗಿದೆ.", - "details_of_shifting_approving_facility": "ಅನುಮೋದಿಸುವ ಸೌಲಭ್ಯವನ್ನು ಬದಲಾಯಿಸುವ ವಿವರಗಳು", - "details_of_assigned_facility": "ನಿಯೋಜಿಸಲಾದ ಸೌಲಭ್ಯದ ವಿವರಗಳು", - "details_of_origin_facility": "ಮೂಲ ಸೌಲಭ್ಯದ ವಿವರಗಳು", - "details_of_patient": "ರೋಗಿಯ ವಿವರಗಳು", - "record_delete_confirm": "ಈ ದಾಖಲೆಯನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?", - "phone_number_at_current_facility": "ಪ್ರಸ್ತುತ ಸೌಲಭ್ಯದಲ್ಲಿರುವ ವ್ಯಕ್ತಿಯ ಸಂಪರ್ಕದ ಫೋನ್ ಸಂಖ್ಯೆ", - "authorize_shift_delete": "ಶಿಫ್ಟ್ ಅಳಿಸುವಿಕೆಯನ್ನು ಅಧಿಕೃತಗೊಳಿಸಿ", - "delete_record": "ದಾಖಲೆ ಅಳಿಸಿ", - "severity_of_breathlessness": "ಉಸಿರಾಟದ ತೀವ್ರತೆ", - "facility_preference": "ಸೌಲಭ್ಯ ಆದ್ಯತೆ", - "vehicle_preference": "ವಾಹನ ಆದ್ಯತೆ", - "is_up_shift": "ಶಿಫ್ಟ್ ಆಗಿದೆ", - "ambulance_driver_name": "ಆಂಬ್ಯುಲೆನ್ಸ್ ಚಾಲಕನ ಹೆಸರು", - "ambulance_phone_number": "ಆಂಬ್ಯುಲೆನ್ಸ್‌ನ ದೂರವಾಣಿ ಸಂಖ್ಯೆ", - "ambulance_number": "ಆಂಬ್ಯುಲೆನ್ಸ್ ನಂ", - "is_emergency": "ತುರ್ತು ಆಗಿದೆ", - "contact_person_at_the_facility": "ಪ್ರಸ್ತುತ ಸೌಲಭ್ಯದಲ್ಲಿರುವ ವ್ಯಕ್ತಿಯನ್ನು ಸಂಪರ್ಕಿಸಿ", - "update_status_details": "ಸ್ಥಿತಿ/ವಿವರಗಳನ್ನು ನವೀಕರಿಸಿ", "shifting_details": "ವಿವರಗಳನ್ನು ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ", - "auto_generated_for_care": "ಆರೈಕೆಗಾಗಿ ಸ್ವಯಂ ರಚಿಸಲಾಗಿದೆ", - "approved_by_district_covid_control_room": "ಜಿಲ್ಲಾ COVID ನಿಯಂತ್ರಣ ಕೊಠಡಿಯಿಂದ ಅನುಮೋದಿಸಲಾಗಿದೆ", - "treatment_summary": "ಚಿಕಿತ್ಸೆಯ ಸಾರಾಂಶ", - "reason_for_referral": "ಉಲ್ಲೇಖಕ್ಕೆ ಕಾರಣ", - "referred_to": "ಉಲ್ಲೇಖಿಸಲಾಗಿದೆ", - "covid_19_cat_gov": "ಸರ್ಕಾರದ ಪ್ರಕಾರ ಕೋವಿಡ್_19 ಕ್ಲಿನಿಕಲ್ ವರ್ಗ. ಕೇರಳ ಮಾರ್ಗಸೂಚಿ (A/B/C)", - "district_program_management_supporting_unit": "ಜಿಲ್ಲಾ ಕಾರ್ಯಕ್ರಮ ನಿರ್ವಹಣಾ ಪೋಷಕ ಘಟಕ", - "name_of_hospital": "ಆಸ್ಪತ್ರೆಯ ಹೆಸರು", - "passport_number": "ಪಾಸ್ಪೋರ್ಟ್ ಸಂಖ್ಯೆ", + "shifting_status": "ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ", + "show_all": "ಎಲ್ಲವನ್ನೂ ತೋರಿಸು", + "show_all_notifications": "ಎಲ್ಲವನ್ನೂ ತೋರಿಸು", + "show_default_presets": "ಡೀಫಾಲ್ಟ್ ಪೂರ್ವನಿಗದಿಗಳನ್ನು ತೋರಿಸಿ", + "show_patient_presets": "ರೋಗಿಯ ಪೂರ್ವನಿಗದಿಗಳನ್ನು ತೋರಿಸಿ", + "show_unread_notifications": "ಓದದಿರುವುದನ್ನು ತೋರಿಸಿ", + "sign_out": "ಸೈನ್ ಔಟ್ ಮಾಡಿ", + "something_went_wrong": "ಏನೋ ತಪ್ಪಾಗಿದೆ..!", + "something_wrong": "ಏನೋ ತಪ್ಪಾಗಿದೆ! ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ!", + "sort_by": "ವಿಂಗಡಿಸಿ", + "source": "ಮೂಲ", + "srf_id": "SRF ID", + "staff_list": "ಸಿಬ್ಬಂದಿ ಪಟ್ಟಿ", + "start_dosage": "ಡೋಸೇಜ್ ಪ್ರಾರಂಭಿಸಿ", + "state": "ರಾಜ್ಯ", + "status": "ಸ್ಥಿತಿ", + "stop": "ನಿಲ್ಲಿಸು", + "stream_stop_due_to_inativity": "ನಿಷ್ಕ್ರಿಯತೆಯ ಕಾರಣ ಲೈವ್ ಫೀಡ್ ಸ್ಟ್ರೀಮಿಂಗ್ ಅನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ", + "stream_stopped_due_to_inativity": "ನಿಷ್ಕ್ರಿಯತೆಯಿಂದಾಗಿ ಲೈವ್ ಫೀಡ್ ಸ್ಟ್ರೀಮಿಂಗ್ ಅನ್ನು ನಿಲ್ಲಿಸಿದೆ", + "sub_category": "ಉಪ ವರ್ಗ", + "submit": "ಸಲ್ಲಿಸಿ", + "submitting": "ಸಲ್ಲಿಸಲಾಗುತ್ತಿದೆ", + "subscribe": "ಚಂದಾದಾರರಾಗಿ", + "subscribe_on_this_device": "ಈ ಸಾಧನದಲ್ಲಿ ಚಂದಾದಾರರಾಗಿ", + "subscription_error": "ಚಂದಾದಾರಿಕೆ ದೋಷ", + "suggested_investigations": "ಸೂಚಿಸಿದ ತನಿಖೆಗಳು", + "summary": "ಸಾರಾಂಶ", + "support": "ಬೆಂಬಲ", + "switch": "ಬದಲಿಸಿ", + "systolic": "ಸಿಸ್ಟೊಲಿಕ್", + "tachycardia": "ಟಾಕಿಕಾರ್ಡಿಯಾ", + "target_dosage": "ಗುರಿ ಡೋಸೇಜ್", "test_type": "ಪರೀಕ್ಷಾ ಪ್ರಕಾರ", - "medical_worker": "ವೈದ್ಯಕೀಯ ಕೆಲಸಗಾರ", - "error_deleting_shifting": "ಶಿಫ್ಟಿಂಗ್ ರೆಕಾರ್ಡ್ ಅನ್ನು ಅಳಿಸುವಾಗ ದೋಷ", + "titrate_dosage": "ಟೈಟ್ರೇಟ್ ಡೋಸೇಜ್", + "to_be_conducted": "ನಡೆಸಲಾಗುವುದು", + "total_beds": "ಒಟ್ಟು ಹಾಸಿಗೆಗಳು", + "total_users": "ಒಟ್ಟು ಬಳಕೆದಾರರು", + "transfer_in_progress": "ವರ್ಗಾವಣೆ ಪ್ರಗತಿಯಲ್ಲಿದೆ", + "transfer_to_receiving_facility": "ಸ್ವೀಕರಿಸುವ ಸೌಲಭ್ಯಕ್ಕೆ ವರ್ಗಾಯಿಸಿ", + "travel_within_last_28_days": "ದೇಶೀಯ/ಅಂತರರಾಷ್ಟ್ರೀಯ ಪ್ರಯಾಣ (ಕಳೆದ 28 ದಿನಗಳಲ್ಲಿ)", + "treating_doctor": "ಚಿಕಿತ್ಸೆ ನೀಡುತ್ತಿರುವ ವೈದ್ಯರು", + "treatment_summary": "ಚಿಕಿತ್ಸೆಯ ಸಾರಾಂಶ", + "treatment_summary__head_title": "ಚಿಕಿತ್ಸೆಯ ಸಾರಾಂಶ", + "treatment_summary__heading": "ಮಧ್ಯಂತರ ಚಿಕಿತ್ಸೆಯ ಸಾರಾಂಶ", + "treatment_summary__print": "ಪ್ರಿಂಟ್ ಟ್ರೀಟ್ಮೆಂಟ್ ಸಾರಾಂಶ", + "try_again_later": "ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ!", "type_any_extra_comments_here": "ಯಾವುದೇ ಹೆಚ್ಚುವರಿ ಕಾಮೆಂಟ್‌ಗಳನ್ನು ಇಲ್ಲಿ ಟೈಪ್ ಮಾಡಿ", + "type_b_cylinders": "ಬಿ ಮಾದರಿಯ ಸಿಲಿಂಡರ್‌ಗಳು", + "type_c_cylinders": "ಸಿ ಮಾದರಿಯ ಸಿಲಿಂಡರ್‌ಗಳು", + "type_d_cylinders": "ಡಿ ಮಾದರಿಯ ಸಿಲಿಂಡರ್‌ಗಳು", + "type_to_search": "ಹುಡುಕಲು ಟೈಪ್ ಮಾಡಿ", + "type_your_comment": "ನಿಮ್ಮ ಕಾಮೆಂಟ್ ಅನ್ನು ಟೈಪ್ ಮಾಡಿ", "type_your_reason_here": "ನಿಮ್ಮ ಕಾರಣವನ್ನು ಇಲ್ಲಿ ಟೈಪ್ ಮಾಡಿ", - "reason_for_shift": "ಸ್ಥಳಾಂತರಕ್ಕೆ ಕಾರಣ", - "preferred_facility_type": "ಆದ್ಯತೆಯ ಸೌಲಭ್ಯದ ಪ್ರಕಾರ", - "preferred_vehicle": "ಆದ್ಯತೆಯ ವಾಹನ", - "is_it_upshift": "ಇದು ಮೇಲ್ಮುಖವಾಗಿದೆಯೇ", - "is_this_an_upshift": "ಇದು ಉನ್ನತಿಯೇ?", - "is_this_an_emergency": "ಇದು ತುರ್ತು ಪರಿಸ್ಥಿತಿಯೇ?", - "what_facility_assign_the_patient_to": "ರೋಗಿಯನ್ನು ಯಾವ ಸೌಲಭ್ಯಕ್ಕೆ ನಿಯೋಜಿಸಲು ನೀವು ಬಯಸುತ್ತೀರಿ", - "name_of_shifting_approving_facility": "ಶಿಫ್ಟಿಂಗ್ ಅನುಮೋದಿಸುವ ಸೌಲಭ್ಯದ ಹೆಸರು", + "unconfirmed": "ದೃಢೀಕರಿಸಲಾಗಿಲ್ಲ", + "unique_id": "ವಿಶಿಷ್ಟ ಐಡಿ", + "unknown": "ಅಜ್ಞಾತ", + "unsubscribe": "ಅನ್‌ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಿ", + "unsubscribe_failed": "ಅನ್‌ಸಬ್‌ಸ್ಕ್ರೈಬ್ ವಿಫಲವಾಗಿದೆ.", + "unsupported_browser": "ಬೆಂಬಲಿತವಲ್ಲದ ಬ್ರೌಸರ್", + "up": "ಮೇಲಕ್ಕೆ", + "up_shift": "ಅಪ್ ಶಿಫ್ಟ್", + "update": "ನವೀಕರಿಸಿ", + "update_asset": "ಆಸ್ತಿಯನ್ನು ನವೀಕರಿಸಿ", + "update_asset_service_record": "ಸ್ವತ್ತು ಸೇವಾ ದಾಖಲೆಯನ್ನು ನವೀಕರಿಸಿ", + "update_bed": "ಹಾಸಿಗೆಯನ್ನು ನವೀಕರಿಸಿ", + "update_facility": "ನವೀಕರಣ ಸೌಲಭ್ಯ", + "update_facility_middleware_success": "ಸೌಲಭ್ಯ ಮಿಡಲ್‌ವೇರ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ನವೀಕರಿಸಲಾಗಿದೆ", + "update_log": "ಲಾಗ್ ಅನ್ನು ನವೀಕರಿಸಿ", + "update_record": "ದಾಖಲೆಯನ್ನು ನವೀಕರಿಸಿ", + "update_record_for_asset": "ಆಸ್ತಿಗಾಗಿ ದಾಖಲೆಯನ್ನು ನವೀಕರಿಸಿ", "update_shift_request": "ಶಿಫ್ಟ್ ವಿನಂತಿಯನ್ನು ನವೀಕರಿಸಿ", - "shift_request_updated_successfully": "ಶಿಫ್ಟ್ ವಿನಂತಿಯನ್ನು ಯಶಸ್ವಿಯಾಗಿ ನವೀಕರಿಸಲಾಗಿದೆ", - "please_enter_a_reason_for_the_shift": "ದಯವಿಟ್ಟು ಶಿಫ್ಟ್‌ಗೆ ಕಾರಣವನ್ನು ನಮೂದಿಸಿ.", - "please_select_preferred_vehicle_type": "ದಯವಿಟ್ಟು ಆದ್ಯತೆಯ ವಾಹನದ ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "please_select_facility_type": "ದಯವಿಟ್ಟು ಸೌಲಭ್ಯದ ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "please_select_breathlessness_level": "ದಯವಿಟ್ಟು ಉಸಿರಾಟದ ಮಟ್ಟವನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "please_select_a_facility": "ದಯವಿಟ್ಟು ಸೌಲಭ್ಯವನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "please_select_status": "ದಯವಿಟ್ಟು ಸ್ಥಿತಿಯನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "please_select_patient_category": "ದಯವಿಟ್ಟು ರೋಗಿಯ ವರ್ಗವನ್ನು ಆಯ್ಕೆಮಾಡಿ", - "shifting_approving_facility_can_not_be_empty": "ಶಿಫ್ಟಿಂಗ್ ಅನುಮೋದಿಸುವ ಸೌಲಭ್ಯ ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.", - "redirected_to_create_consultation": "ಗಮನಿಸಿ: ಸಮಾಲೋಚನೆ ಫಾರ್ಮ್ ರಚಿಸಲು ನಿಮ್ಮನ್ನು ಮರುನಿರ್ದೇಶಿಸಲಾಗುತ್ತದೆ. ವರ್ಗಾವಣೆ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ದಯವಿಟ್ಟು ಫಾರ್ಮ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ", - "mark_this_transfer_as_complete_question": "ಈ ವರ್ಗಾವಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ ಎಂದು ಗುರುತಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? ಮೂಲ ಸೌಲಭ್ಯವು ಇನ್ನು ಮುಂದೆ ಈ ರೋಗಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುವುದಿಲ್ಲ", - "transfer_in_progress": "ವರ್ಗಾವಣೆ ಪ್ರಗತಿಯಲ್ಲಿದೆ", - "patient_state": "ರೋಗಿಯ ಸ್ಥಿತಿ", - "yet_to_be_decided": "ಇನ್ನೂ ನಿರ್ಧರಿಸಬೇಕಿದೆ", - "awaiting_destination_approval": "ಗಮ್ಯಸ್ಥಾನದ ಅನುಮೋದನೆಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ", + "update_status_details": "ಸ್ಥಿತಿ/ವಿವರಗಳನ್ನು ನವೀಕರಿಸಿ", + "updated": "ನವೀಕರಿಸಲಾಗಿದೆ", + "updating": "ನವೀಕರಿಸಲಾಗುತ್ತಿದೆ", + "upload": "ಅಪ್ಲೋಡ್ ಮಾಡಿ", + "upload_an_image": "ಚಿತ್ರವನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿ", + "upload_headings__consultation": "ಹೊಸ ಸಮಾಲೋಚನೆ ಫೈಲ್ ಅನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ", + "upload_headings__patient": "ಹೊಸ ರೋಗಿಯ ಫೈಲ್ ಅನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿ", + "upload_headings__sample_report": "ಮಾದರಿ ವರದಿಯನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ", + "upload_headings__supporting_info": "ಪೋಷಕ ಮಾಹಿತಿಯನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ", + "uploading": "ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ", + "user_deleted_successfuly": "ಬಳಕೆದಾರರನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅಳಿಸಲಾಗಿದೆ", "user_management": "ಬಳಕೆದಾರ ನಿರ್ವಹಣೆ", - "facilities": "ಸೌಲಭ್ಯಗಳು", - "add_new_user": "ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ", - "no_users_found": "ಯಾವುದೇ ಬಳಕೆದಾರರು ಕಂಡುಬಂದಿಲ್ಲ", - "home_facility": "ಮನೆ ಸೌಲಭ್ಯ", - "no_home_facility": "ಮನೆ ಸೌಲಭ್ಯ ನೀಡಿಲ್ಲ", - "clear_home_facility": "ಮನೆ ಸೌಲಭ್ಯವನ್ನು ತೆರವುಗೊಳಿಸಿ", - "linked_facilities": "ಲಿಂಕ್ಡ್ ಸೌಲಭ್ಯಗಳು", - "no_linked_facilities": "ಯಾವುದೇ ಲಿಂಕ್ ಮಾಡಲಾದ ಸೌಲಭ್ಯಗಳಿಲ್ಲ", - "average_weekly_working_hours": "ಸರಾಸರಿ ವಾರದ ಕೆಲಸದ ಸಮಯ", - "set_average_weekly_working_hours_for": "ಸರಾಸರಿ ಸಾಪ್ತಾಹಿಕ ಕೆಲಸದ ಸಮಯವನ್ನು ಹೊಂದಿಸಿ", - "search_by_username": "ಬಳಕೆದಾರ ಹೆಸರಿನ ಮೂಲಕ ಹುಡುಕಿ", - "last_online": "ಕೊನೆಯ ಆನ್‌ಲೈನ್", - "total_users": "ಒಟ್ಟು ಬಳಕೆದಾರರು" -} \ No newline at end of file + "username": "ಬಳಕೆದಾರ ಹೆಸರು", + "users": "ಬಳಕೆದಾರರು", + "vehicle_preference": "ವಾಹನ ಆದ್ಯತೆ", + "vendor_name": "ಮಾರಾಟಗಾರರ ಹೆಸರು", + "view": "ವೀಕ್ಷಿಸಿ", + "view_abdm_records": "ABDM ದಾಖಲೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ", + "view_asset": "ಸ್ವತ್ತುಗಳನ್ನು ವೀಕ್ಷಿಸಿ", + "view_details": "ವಿವರಗಳನ್ನು ವೀಕ್ಷಿಸಿ", + "view_faciliy": "ವೀಕ್ಷಣೆ ಸೌಲಭ್ಯ", + "view_patients": "ರೋಗಿಗಳನ್ನು ವೀಕ್ಷಿಸಿ", + "view_users": "ಬಳಕೆದಾರರನ್ನು ವೀಕ್ಷಿಸಿ", + "virtual_nursing_assistant": "ವರ್ಚುವಲ್ ನರ್ಸಿಂಗ್ ಸಹಾಯಕ", + "ward": "ವಾರ್ಡ್", + "warranty_amc_expiry": "ವಾರಂಟಿ / AMC ಮುಕ್ತಾಯ", + "what_facility_assign_the_patient_to": "ರೋಗಿಯನ್ನು ಯಾವ ಸೌಲಭ್ಯಕ್ಕೆ ನಿಯೋಜಿಸಲು ನೀವು ಬಯಸುತ್ತೀರಿ", + "why_the_asset_is_not_working": "ಸ್ವತ್ತು ಏಕೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿಲ್ಲ?", + "working_status": "ಕೆಲಸದ ಸ್ಥಿತಿ", + "yes": "ಹೌದು", + "yet_to_be_decided": "ಇನ್ನೂ ನಿರ್ಧರಿಸಬೇಕಿದೆ", + "you_need_at_least_a_location_to_create_an_assest": "ಆಸ್ತಿಯನ್ನು ರಚಿಸಲು ನಿಮಗೆ ಕನಿಷ್ಠ ಸ್ಥಳದ ಅಗತ್ಯವಿದೆ.", + "zoom_in": "ಜೂಮ್ ಇನ್", + "zoom_out": "ಜೂಮ್ ಔಟ್" +} diff --git a/src/Locale/ml.json b/src/Locale/ml.json index 614a4005ef9..8460b6f8b7c 100644 --- a/src/Locale/ml.json +++ b/src/Locale/ml.json @@ -1,813 +1,813 @@ { - "create_asset": "അസറ്റ് സൃഷ്ടിക്കുക", - "edit_history": "ചരിത്രം തിരുത്തുക", - "update_record_for_asset": "അസറ്റിൻ്റെ റെക്കോർഡ് അപ്ഡേറ്റ് ചെയ്യുക", - "edited_on": "എഡിറ്റ് ചെയ്തത്", - "edited_by": "എഡിറ്റ് ചെയ്തത്", - "serviced_on": "സർവീസ് ചെയ്തു", - "notes": "കുറിപ്പുകൾ", - "back": "തിരികെ", - "close": "അടയ്ക്കുക", - "update_asset_service_record": "അസറ്റ് സർവീസ് റെക്കോർഡ് അപ്ഡേറ്റ് ചെയ്യുക", - "eg_details_on_functionality_service_etc": "ഉദാ. പ്രവർത്തനം, സേവനം മുതലായവയെക്കുറിച്ചുള്ള വിശദാംശങ്ങൾ.", - "updating": "അപ്ഡേറ്റ് ചെയ്യുന്നു", - "update": "അപ്ഡേറ്റ്", - "are_you_still_watching": "നിങ്ങൾ ഇപ്പോഴും കാണുന്നുണ്ടോ?", - "stream_stop_due_to_inativity": "സജീവമല്ലാത്തതിനാൽ തത്സമയ ഫീഡ് സ്ട്രീമിംഗ് നിർത്തും", - "stream_stopped_due_to_inativity": "സജീവമല്ലാത്തതിനാൽ തത്സമയ ഫീഡ് സ്ട്രീമിംഗ് നിർത്തി", - "continue_watching": "കാണുന്നത് തുടരുക", - "resume": "പുനരാരംഭിക്കുക", - "username": "യൂസർനെയിം/ഉപയോക്തൃനാമം", - "password": "പാസ്‌വേഡ്", - "new_password": "പുതിയ പാസ്‌വേഡ്", - "confirm_password": "പാസ്‌വേഡ് ഉറപ്പാക്കുക", - "first_name": "പേരിന്‍റെ ആദ്യഭാഗം", - "last_name": "പേരിന്‍റെ അവസാന ഭാഗം", - "email": "ഇമെയിൽ വിലാസം", - "phone_number": "ഫോൺ നമ്പർ", - "district": "ജില്ല", - "gender": "ലിംഗഭേദം", - "age": "പ്രായം", - "login": "ലോഗിൻ ചെയ്യുക/അകത്തു പ്രവേശിക്കുക", - "password_mismatch": "പാസ്‌വേഡും ഉറപ്പാക്കിയ പാസ്‌വേഡും സമാനമായിരിക്കണം", - "enter_valid_age": "ദയവായി പ്രാമാണികമായ വയസ്സ് നൽകുക", - "invalid_username": "അനിവാര്യം. 150 ചിഹ്നമോ, അക്ഷരമോ, സംഖ്യയോ അതിൽ കുറവോ. അക്ഷരങ്ങൾ, അക്കങ്ങൾ, @/./+/-/_ മാത്രം ഉപയോഗിക്കുക.", - "invalid_password": "പാസ്‌വേഡ് ആവശ്യകതകൾ പാലിക്കുന്നില്ല", - "invalid_email": "ദയവായി പ്രാമാണികമായ ഇമെയിൽ വിലാസം നൽകുക", - "invalid_phone": "ദയവായി പ്രാമാണികമായ ഫോൺ നമ്പർ നൽകുക", - "register_hospital": "ആശുപത്രി രജിസ്റ്റർ ചെയ്യുക", - "register_page_title": "ആശുപത്രി അഡ്മിനിസ്ട്രേറ്ററായി രജിസ്റ്റർ ചെയ്യുക", - "auth_login_title": "അംഗീകൃത ലോഗിൻ", - "forget_password": "പാസ്‌വേഡ് മറന്നോ?", - "forget_password_instruction": "നിങ്ങളുടെ യൂസർനെയിം/ഉപയോക്തൃനാമം നൽകുക. പാസ്‌വേഡ് പുന: സജ്ജമാക്കാൻ ഞങ്ങൾ ഒരു ലിങ്ക് അയയ്‌ക്കുന്നതായിരിക്കും.", - "send_reset_link": "പുന: സജ്ജീകരണ ലിങ്ക് അയയ്‌ക്കുക", - "already_a_member": "ഇതിനകം തന്നെ ഒരു അംഗമാണോ?", - "password_sent": "പാസ്‌വേഡ് പുന: സജ്ജീകരണ ലിങ്ക് അയച്ചിട്ടുണ്ട്", - "password_reset_success": "പാസ്‌വേഡ് പുന: സജ്ജീകരണം വിജയിച്ചു", - "password_reset_failure": "പാസ്‌വേഡ് പുന: സജ്ജീകരണം പരാജയപ്പെട്ടു", - "reset_password": "പാസ്‌വേഡ് പുന: സജ്ജമാക്കുക", - "available_in": "ലഭ്യമായ ഭാഷകൾ", - "sign_out": "ലോഗ് ഔട്ട് ചെയ്യുക/പുറത്തിറങ്ങുക", - "back_to_login": "ലോഗിൻ പേജിലേക്ക് മടങ്ങുക", - "min_password_len_8": "ഏറ്റവും കുറഞ്ഞ പാസ്‌വേഡ് ദൈർഘ്യം 8", - "req_atleast_one_digit": "കുറഞ്ഞത് ഒരു അക്കമെങ്കിലും ആവശ്യമാണ്", - "req_atleast_one_uppercase": "കുറഞ്ഞത് ഒരു വലിയ കേസെങ്കിലും ആവശ്യമാണ്", - "req_atleast_one_lowercase": "കുറഞ്ഞത് ഒരു ചെറിയ അക്ഷരമെങ്കിലും ആവശ്യമാണ്", - "req_atleast_one_symbol": "കുറഞ്ഞത് ഒരു ചിഹ്നമെങ്കിലും ആവശ്യമാണ്", - "bed_search_placeholder": "കിടക്കകളുടെ പേര് ഉപയോഗിച്ച് തിരയുക", + "404_message": "നിലവിലില്ലാത്തതോ മറ്റൊരു URL-ലേക്ക് നീക്കിയതോ ആയ ഒരു പേജിൽ നിങ്ങൾ ഇടറിവീണതായി തോന്നുന്നു. നിങ്ങൾ ശരിയായ ലിങ്ക് നൽകിയിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക!", + "AUTOMATED": "ഓട്ടോമേറ്റഡ്", + "Assets": "ആസ്തികൾ", "BED_WITH_OXYGEN_SUPPORT": "ഓക്സിജൻ പിന്തുണയുള്ള കിടക്ക", - "REGULAR": "പതിവ്", + "CONSCIOUSNESS_LEVEL__AGITATED_OR_CONFUSED": "അസ്വസ്ഥതയോ ആശയക്കുഴപ്പത്തിലോ", + "CONSCIOUSNESS_LEVEL__ALERT": "മുന്നറിയിപ്പ്", + "CONSCIOUSNESS_LEVEL__ONSET_OF_AGITATION_AND_CONFUSION": "പ്രക്ഷോഭത്തിൻ്റെയും ആശയക്കുഴപ്പത്തിൻ്റെയും തുടക്കം", + "CONSCIOUSNESS_LEVEL__RESPONDS_TO_PAIN": "വേദനയോട് പ്രതികരിക്കുന്നു", + "CONSCIOUSNESS_LEVEL__RESPONDS_TO_VOICE": "ശബ്ദത്തോട് പ്രതികരിക്കുന്നു", + "CONSCIOUSNESS_LEVEL__UNRESPONSIVE": "പ്രതികരിക്കുന്നില്ല", + "Cancel": "റദ്ദാക്കുക", + "DD/MM/YYYY": "DD/MM/YYYY", + "DOCTORS_LOG": "പുരോഗതി കുറിപ്പ്", + "Dashboard": "ഡാഷ്ബോർഡ്", + "Facilities": "ഫെസിലിറ്റികള്‍", + "GENDER__1": "പുരുഷൻ", + "GENDER__2": "സ്ത്രീ", + "GENDER__3": "നോൺ-ബൈനറി", + "HEARTBEAT_RHYTHM__IRREGULAR": "ക്രമരഹിതം", + "HEARTBEAT_RHYTHM__REGULAR": "പതിവ്", + "HEARTBEAT_RHYTHM__UNKNOWN": "അജ്ഞാതം", "ICU": "ഐ.സി.യു", + "INSULIN_INTAKE_FREQUENCY__BD": "ദിവസത്തിൽ രണ്ടുതവണ (BD)", + "INSULIN_INTAKE_FREQUENCY__OD": "ദിവസത്തിൽ ഒരിക്കൽ (OD)", + "INSULIN_INTAKE_FREQUENCY__TD": "ദിവസത്തിൽ മൂന്ന് തവണ (ടിഡി)", + "INSULIN_INTAKE_FREQUENCY__UNKNOWN": "അജ്ഞാതം", "ISOLATION": "ഐസൊലേഷൻ", - "add_beds": "കിടക്ക(കൾ) ചേർക്കുക", - "update_bed": "കിടക്ക അപ്ഡേറ്റ് ചെയ്യുക", - "bed_type": "കിടക്കയുടെ തരം", - "make_multiple_beds_label": "നിങ്ങൾക്ക് ഒന്നിലധികം കിടക്കകൾ നിർമ്മിക്കണോ?", - "number_of_beds": "കിടക്കകളുടെ എണ്ണം", - "number_of_beds_out_of_range_error": "കിടക്കകളുടെ എണ്ണം 100-ൽ കൂടരുത്", - "goal": "ഡിജിറ്റൽ ടൂളുകൾ ഉപയോഗിച്ച് പൊതുജനാരോഗ്യ സേവനങ്ങളുടെ ഗുണനിലവാരവും പ്രവേശനക്ഷമതയും തുടർച്ചയായി മെച്ചപ്പെടുത്തുകയാണ് ഞങ്ങളുടെ ലക്ഷ്യം.", - "something_wrong": "എന്തോ കുഴപ്പം സംഭവിച്ചു! കുറച്ചു കഴിഞ്ഞു വീണ്ടും ശ്രമിക്കുക!", - "try_again_later": "പിന്നീട് വീണ്ടും ശ്രമിക്കുക!", - "contribute_github": "GitHubൽ സംഭാവന ചെയ്യുക", - "footer_body": "കേരള സർക്കാറിന്‍റെ പൂർണ്ണമായ ധാരണയോടും പിന്തുണയോടും കൂടി സർക്കാർ ശ്രമങ്ങളെ പിന്തുണയ്ക്കുന്നതിനായി നൂതന പ്രവർത്തകരുടെയും സന്നദ്ധപ്രവർത്തകരുടെയും ഒരു മൾട്ടി-ഡിസിപ്ലിനറി ടീം രൂപകൽപ്പന ചെയ്ത മാതൃകാപരമായ ഒരു ഓപ്പൺ സോഴ്‌സ് പബ്ലിക് യൂട്ടിലിറ്റിയാണ് കൊറോണ സേഫ് നെറ്റ്‌വർക്ക്.", - "reset": "പുന: സജ്ജമാക്കുക ", - "download": "ഡൗൺലോഡ് ചെയ്യുക", - "downloads": "ഡൗൺലോഡുകൾ", - "downloading": "ഡൗൺലോഡ് ചെയ്യുന്നു", - "generating": "സൃഷ്ടിക്കുന്നു", - "send_email": "ഇമെയിൽ അയയ്ക്കുക", - "email_address": "ഇമെയിൽ വിലാസം", - "email_success": "ഞങ്ങൾ ഉടൻ ഒരു ഇമെയിൽ അയയ്ക്കും. ദയവായി നിങ്ങളുടെ ഇൻബോക്സ് പരിശോധിക്കുക.", - "disclaimer": "നിരാകരണം", - "category": "വിഭാഗം", - "sub_category": "ഉപവിഭാഗം", - "download_type": "ഡൗൺലോഡുകളുടെ തരം", - "state": "സംസ്ഥാനം", - "location": "സ്ഥാനം", - "ward": "വാർഡ്", + "KASP Empanelled": "കെ. എ. എസ്. പി. എംപാനല്‍ ചെയ്യപ്പെട്ടത്", + "LIMB_RESPONSE__EXTENSION": "വിപുലീകരണം", + "LIMB_RESPONSE__FLEXION": "ഫ്ലെക്സിഷൻ", + "LIMB_RESPONSE__MODERATE": "മിതത്വം", + "LIMB_RESPONSE__NONE": "ഒന്നുമില്ല", + "LIMB_RESPONSE__STRONG": "ശക്തമായ", + "LIMB_RESPONSE__UNKNOWN": "അജ്ഞാതം", + "LIMB_RESPONSE__WEAK": "ദുർബലമായ", + "NORMAL": "സംക്ഷിപ്ത അപ്ഡേറ്റ്", + "NURSING_CARE_PROCEDURE__catheter_care": "കത്തീറ്റർ കെയർ", + "NURSING_CARE_PROCEDURE__chest_tube_care": "ചെസ്റ്റ് ട്യൂബ് കെയർ", + "NURSING_CARE_PROCEDURE__dressing": "വസ്ത്രധാരണം", + "NURSING_CARE_PROCEDURE__dvt_pump_stocking": "ഡിവിടി പമ്പ് സ്റ്റോക്കിംഗ്", + "NURSING_CARE_PROCEDURE__iv_sitecare": "IV സൈറ്റ് കെയർ", + "NURSING_CARE_PROCEDURE__nubulisation": "നുബുലൈസേഷൻ", + "NURSING_CARE_PROCEDURE__personal_hygiene": "വ്യക്തിഗത ശുചിത്വം", + "NURSING_CARE_PROCEDURE__positioning": "സ്ഥാനനിർണ്ണയം", + "NURSING_CARE_PROCEDURE__restrain": "നിയന്ത്രിക്കുക", + "NURSING_CARE_PROCEDURE__ryles_tube_care": "റൈൽസ് ട്യൂബ് കെയർ", + "NURSING_CARE_PROCEDURE__stoma_care": "സ്റ്റോമ കെയർ", + "NURSING_CARE_PROCEDURE__suctioning": "സക്ഷനിംഗ്", + "NURSING_CARE_PROCEDURE__tracheostomy_care": "ട്രാക്കിയോസ്റ്റമി കെയർ", "Notice Board": "നോട്ടീസ് ബോർഡ്", - "Assets": "ആസ്തികൾ", "Notifications": "അറിയിപ്പുകൾ", + "OXYGEN_MODALITY__HIGH_FLOW_NASAL_CANNULA": "ഉയർന്ന ഒഴുക്ക് നാസൽ കാനുല", + "OXYGEN_MODALITY__NASAL_PRONGS": "നാസൽ പ്രോംഗ്സ്", + "OXYGEN_MODALITY__NON_REBREATHING_MASK": "നോൺ റീബ്രീത്തിംഗ് മാസ്ക്", + "OXYGEN_MODALITY__SIMPLE_FACE_MASK": "ലളിതമായ മുഖംമൂടി", + "PRESCRIPTION_FREQUENCY_BD": "ദിവസേന രണ്ടുതവണ", + "PRESCRIPTION_FREQUENCY_HS": "രാത്രി മാത്രം", + "PRESCRIPTION_FREQUENCY_OD": "ദിവസത്തിൽ ഒരിക്കൽ", + "PRESCRIPTION_FREQUENCY_Q4H": "നാലാമത്തെ മണിക്കൂർ", + "PRESCRIPTION_FREQUENCY_QID": "ആറാം മണിക്കൂർ", + "PRESCRIPTION_FREQUENCY_QOD": "ഇതര ദിവസം", + "PRESCRIPTION_FREQUENCY_QWK": "ആഴ്ചയിൽ ഒരിക്കൽ", + "PRESCRIPTION_FREQUENCY_STAT": "ഉടനെ", + "PRESCRIPTION_FREQUENCY_TID": "എട്ടാം മണിക്കൂർ", + "PRESCRIPTION_ROUTE_IM": "ഐ.എം", + "PRESCRIPTION_ROUTE_INHALATION": "ഇൻഹാലേഷൻ", + "PRESCRIPTION_ROUTE_INTRATHECAL": "ഇൻട്രാതെക്കൽ കുത്തിവയ്പ്പ്", + "PRESCRIPTION_ROUTE_IV": "IV", + "PRESCRIPTION_ROUTE_NASOGASTRIC": "നാസോഗാസ്ട്രിക് / ഗ്യാസ്ട്രോസ്റ്റമി ട്യൂബ്", + "PRESCRIPTION_ROUTE_ORAL": "വാമൊഴി", + "PRESCRIPTION_ROUTE_RECTAL": "മലദ്വാരം", + "PRESCRIPTION_ROUTE_SC": "എസ്/സി", + "PRESCRIPTION_ROUTE_SUBLINGUAL": "ഉപഭാഷാപരമായ", + "PRESCRIPTION_ROUTE_TRANSDERMAL": "ട്രാൻസ്ഡെർമൽ", + "PUPIL_REACTION__BRISK": "ചടുലമായ", + "PUPIL_REACTION__CANNOT_BE_ASSESSED": "വിലയിരുത്താൻ കഴിയില്ല", + "PUPIL_REACTION__FIXED": "പരിഹരിച്ചു", + "PUPIL_REACTION__SLUGGISH": "ആലസ്യം", + "PUPIL_REACTION__UNKNOWN": "അജ്ഞാതം", + "Patients": "രോഗികൾ", + "Profile": "പ്രൊഫൈൽ", + "REGULAR": "പതിവ്", + "RESPIRATORY_SUPPORT_SHORT__INVASIVE": "IV", + "RESPIRATORY_SUPPORT_SHORT__NON_INVASIVE": "എൻ.ഐ.വി", + "RESPIRATORY_SUPPORT_SHORT__OXYGEN_SUPPORT": "O2 പിന്തുണ", + "RESPIRATORY_SUPPORT_SHORT__UNKNOWN": "ഒന്നുമില്ല", + "RESPIRATORY_SUPPORT__INVASIVE": "ആക്രമണാത്മക വെൻ്റിലേറ്റർ (IV)", + "RESPIRATORY_SUPPORT__NON_INVASIVE": "നോൺ-ഇൻവേസീവ് വെൻ്റിലേറ്റർ (NIV)", + "RESPIRATORY_SUPPORT__OXYGEN_SUPPORT": "ഓക്സിജൻ പിന്തുണ", + "RESPIRATORY_SUPPORT__UNKNOWN": "ഒന്നുമില്ല", + "Resource": "സഹായം", + "SORT_OPTIONS__-bed__name": "കിടക്ക നമ്പർ N-1", + "SORT_OPTIONS__-category_severity": "ഏറ്റവും ഉയർന്ന തീവ്രത വിഭാഗം ആദ്യം", + "SORT_OPTIONS__-created_date": "ആദ്യം സൃഷ്ടിച്ച ഏറ്റവും പുതിയ തീയതി", + "SORT_OPTIONS__-modified_date": "ഏറ്റവും പുതിയ അപ്ഡേറ്റ് തീയതി ആദ്യം", + "SORT_OPTIONS__-name": "രോഗിയുടെ പേര് ZA", + "SORT_OPTIONS__-review_time": "ഏറ്റവും പുതിയ അവലോകന തീയതി ആദ്യം", + "SORT_OPTIONS__-taken_at": "ഏറ്റവും പുതിയ തീയതി ആദ്യം", + "SORT_OPTIONS__bed__name": "ബെഡ് നമ്പർ 1-N", + "SORT_OPTIONS__category_severity": "ഏറ്റവും കുറഞ്ഞ തീവ്രത വിഭാഗം ആദ്യം", + "SORT_OPTIONS__created_date": "ഏറ്റവും പഴയ സൃഷ്ടിച്ച തീയതി ആദ്യം", + "SORT_OPTIONS__facility__name,-last_consultation__current_bed__bed__name": "കിടക്ക നമ്പർ N-1", + "SORT_OPTIONS__facility__name,last_consultation__current_bed__bed__name": "ബെഡ് നമ്പർ 1-N", + "SORT_OPTIONS__modified_date": "ഏറ്റവും പഴയ പുതുക്കിയ തീയതി ആദ്യം", + "SORT_OPTIONS__name": "രോഗിയുടെ പേര് AZ", + "SORT_OPTIONS__review_time": "ഏറ്റവും പഴയ അവലോകന തീയതി ആദ്യം", + "SORT_OPTIONS__taken_at": "ആദ്യം എടുത്ത ഏറ്റവും പഴയ തീയതി", + "Sample Test": "സാമ്പിൾ ടെസ്റ്റ്", + "Shifting": "ഫെസിലിറ്റി മാറ്റല്‍ ", "Submit": "സമർപ്പിക്കുക", - "Cancel": "റദ്ദാക്കുക", - "powered_by": "പ്രായോജകർ", - "care": "കെയർ", - "something_went_wrong": "എന്തോ കുഴപ്പം സംഭവിച്ചു..!", - "stop": "നിർത്തുക", - "record": "റെക്കോർഡ് ഓഡിയോ", - "recording": "റെക്കോർഡിംഗ്", - "yes": "അതെ", - "no": "ഇല്ല", - "status": "നില", - "created": "സൃഷ്ടിച്ചത്", - "modified": "പരിഷ്കരിച്ചു", - "updated": "അപ്ഡേറ്റ് ചെയ്തു", - "configure": "കോൺഫിഗർ ചെയ്യുക", - "assigned_to": "ലേക്ക് നിയോഗിച്ചു", - "cancel": "റദ്ദാക്കുക", - "clear": "ക്ലിയർ", - "apply": "അപേക്ഷിക്കുക", - "filter_by": "ഇതനുസരിച്ച് ഫിൽട്ടർ ചെയ്യുക", - "filter": "ഫിൽട്ടർ ചെയ്യുക", - "settings_and_filters": "ക്രമീകരണങ്ങളും ഫിൽട്ടറുകളും", - "ordering": "ഓർഡർ ചെയ്യുന്നു", - "international_mobile": "അന്താരാഷ്ട്ര മൊബൈൽ", - "indian_mobile": "ഇന്ത്യൻ മൊബൈൽ", - "mobile": "മൊബൈൽ", - "landline": "ഇന്ത്യൻ ലാൻഡ്‌ലൈൻ", - "support": "പിന്തുണ", - "emergency_contact_number": "എമർജൻസി കോൺടാക്റ്റ് നമ്പർ", - "last_modified": "അവസാനം പരിഷ്കരിച്ചത്", - "patient_address": "രോഗിയുടെ വിലാസം", - "all_details": "എല്ലാ വിശദാംശങ്ങളും", - "confirm": "സ്ഥിരീകരിക്കുക", - "refresh_list": "ലിസ്റ്റ് പുതുക്കുക", - "last_edited": "അവസാനം എഡിറ്റ് ചെയ്തത്", - "audit_log": "ഓഡിറ്റ് ലോഗ്", - "comments": "അഭിപ്രായങ്ങൾ", - "contact_person_number": "ബന്ധപ്പെടേണ്ട വ്യക്തിയുടെ നമ്പർ", - "referral_letter": "റഫറൽ കത്ത്", - "print": "അച്ചടിക്കുക", - "print_referral_letter": "റഫറൽ കത്ത് അച്ചടിക്കുക", - "date_of_positive_covid_19_swab": "പോസിറ്റീവ് കോവിഡ് 19 സ്വാബ് തീയതി", - "patient_no": "OP/IP നമ്പർ", - "date_of_admission": "പ്രവേശന തീയതി", - "india_1": "ഇന്ത്യ", - "unique_id": "അദ്വിതീയ ഐഡി", - "date_and_time": "തീയതിയും സമയവും", - "facility_type": "സൗകര്യ തരം", - "number_of_chronic_diseased_dependents": "വിട്ടുമാറാത്ത രോഗങ്ങളെ ആശ്രയിക്കുന്നവരുടെ എണ്ണം", - "number_of_aged_dependents_above_60": "പ്രായമായ ആശ്രിതരുടെ എണ്ണം (60-ൽ കൂടുതൽ)", - "ongoing_medications": "നടന്നുകൊണ്ടിരിക്കുന്ന മരുന്നുകൾ", - "countries_travelled": "രാജ്യങ്ങൾ സഞ്ചരിച്ചു", - "travel_within_last_28_days": "ആഭ്യന്തര/അന്താരാഷ്ട്ര യാത്ര (കഴിഞ്ഞ 28 ദിവസത്തിനുള്ളിൽ)", - "estimated_contact_date": "കണക്കാക്കിയ കോൺടാക്റ്റ് തീയതി", - "blood_group": "രക്ത ഗ്രൂപ്പ്", - "date_of_birth": "ജനനത്തീയതി", - "date_of_test": "ടെസ്റ്റ് തീയതി", - "srf_id": "SRF ഐഡി", - "contact_number": "ബന്ധപ്പെടേണ്ട നമ്പർ", - "diagnosis": "രോഗനിർണയം", - "copied_to_clipboard": "ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി", - "is": "ആണ്", - "reason": "കാരണം", - "description": "വിവരണം", - "name": "പേര്", - "address": "വിലാസം", - "phone": "ഫോൺ", - "nationality": "ദേശീയത", - "allergies": "അലർജികൾ", - "type_your_comment": "നിങ്ങളുടെ അഭിപ്രായം ടൈപ്പ് ചെയ്യുക", - "any_other_comments": "മറ്റേതെങ്കിലും അഭിപ്രായങ്ങൾ", - "loading": "ലോഡ് ചെയ്യുന്നു...", - "facility": "സൗകര്യം", - "local_body": "തദ്ദേശ സ്ഥാപനം", - "filters": "ഫിൽട്ടറുകൾ", - "unknown": "അജ്ഞാതം", + "TELEMEDICINE": "ടെലിമെഡിസിൻ", + "Users": "ഉപയോക്താക്കൾ", + "VENTILATOR": "വിശദമായ അപ്ഡേറ്റ്", + "VENTILATOR_MODE__CMV": "കൺട്രോൾ മെക്കാനിക്കൽ വെൻ്റിലേഷൻ (CMV)", + "VENTILATOR_MODE__PCV": "പ്രഷർ കൺട്രോൾ വെൻ്റിലേഷൻ (PCV)", + "VENTILATOR_MODE__PC_SIMV": "പ്രഷർ കൺട്രോൾഡ് SIMV (PC-SIMV)", + "VENTILATOR_MODE__PSV": "C-PAP / പ്രഷർ സപ്പോർട്ട് വെൻ്റിലേഷൻ (PSV)", + "VENTILATOR_MODE__SIMV": "സിൻക്രൊണൈസ്ഡ് ഇൻ്റർമിറ്റൻറ് നിർബന്ധിത വെൻ്റിലേഷൻ (SIMV)", + "VENTILATOR_MODE__VCV": "വോളിയം കൺട്രോൾ വെൻ്റിലേഷൻ (VCV)", + "VENTILATOR_MODE__VC_SIMV": "വോളിയം നിയന്ത്രിത SIMV (VC-SIMV)", + "View Facility": "ഫെസിലിറ്റി കാണുക", + "action_irreversible": "ഈ പ്രവർത്തനം മാറ്റാനാവാത്തതാണ്", "active": "സജീവമാണ്", - "completed": "പൂർത്തിയാക്കി", - "on": "ഓൺ", - "open": "തുറക്കുക", - "features": "ഫീച്ചറുകൾ", - "pincode": "പിൻകോഡ്", - "required": "ആവശ്യമാണ്", - "field_required": "ഈ ഫീൽഡ് പൂരിപ്പിക്കേണ്ടതുണ്ട്", - "litres": "ലിറ്റർ", - "litres_per_day": "ലിറ്റർ / ദിവസം", - "invalid_pincode": "പിൻകോഡ് അസാധുവാണ്", - "invalid_phone_number": "അസാധുവായ ഫോൺ നമ്പർ", - "latitude_invalid": "അക്ഷാംശം -90 നും 90 നും ഇടയിലായിരിക്കണം", - "longitude_invalid": "രേഖാംശം -180 നും 180 നും ഇടയിലായിരിക്കണം", - "save": "സംരക്ഷിക്കുക", - "continue": "തുടരുക", - "save_and_continue": "സംരക്ഷിച്ച് തുടരുക", - "select": "തിരഞ്ഞെടുക്കുക", - "lsg": "Lsg", - "delete": "ഇല്ലാതാക്കുക", - "remove": "നീക്കം ചെയ്യുക", - "max_size_for_image_uploaded_should_be": "അപ്‌ലോഡ് ചെയ്‌ത ചിത്രത്തിനുള്ള പരമാവധി വലുപ്പം ആയിരിക്കണം", - "allowed_formats_are": "അനുവദനീയമായ ഫോർമാറ്റുകളാണ്", - "recommended_aspect_ratio_for": "ഇതിനായി ശുപാർശ ചെയ്യുന്ന വീക്ഷണ അനുപാതം", - "drag_drop_image_to_upload": "അപ്‌ലോഡ് ചെയ്യാൻ ചിത്രം വലിച്ചിടുക", - "upload_an_image": "ഒരു ചിത്രം അപ്‌ലോഡ് ചെയ്യുക", - "upload": "അപ്‌ലോഡ് ചെയ്യുക", - "uploading": "അപ്‌ലോഡ് ചെയ്യുന്നു", - "switch": "മാറുക", - "capture": "ക്യാപ്ചർ", - "retake": "വീണ്ടും എടുക്കുക", - "submit": "സമർപ്പിക്കുക", - "camera": "ക്യാമറ", - "camera_permission_denied": "ക്യാമറ അനുമതി നിഷേധിച്ചു", - "submitting": "സമർപ്പിക്കുന്നു", - "view_details": "വിശദാംശങ്ങൾ കാണുക", - "type_to_search": "തിരയാൻ ടൈപ്പ് ചെയ്യുക", - "show_all": "എല്ലാം കാണിക്കുക", - "hide": "മറയ്ക്കുക", - "select_skills": "കുറച്ച് കഴിവുകൾ തിരഞ്ഞെടുത്ത് ചേർക്കുക", - "contact_your_admin_to_add_skills": "കഴിവുകൾ ചേർക്കാൻ നിങ്ങളുടെ അഡ്‌മിനെ ബന്ധപ്പെടുക", + "active_prescriptions": "സജീവ കുറിപ്പടികൾ", "add": "ചേർക്കുക", "add_as": "ആയി ചേർക്കുക", - "sort_by": "ഇങ്ങനെ അടുക്കുക", - "none": "ഒന്നുമില്ല", - "choose_file": "ഉപകരണത്തിൽ നിന്ന് അപ്‌ലോഡ് ചെയ്യുക", - "open_camera": "ക്യാമറ തുറക്കുക", - "file_preview": "ഫയൽ പ്രിവ്യൂ", - "file_preview_not_supported": "ഈ ഫയൽ പ്രിവ്യൂ ചെയ്യാൻ കഴിയില്ല. ഇത് ഡൗൺലോഡ് ചെയ്യാൻ ശ്രമിക്കുക.", - "view_faciliy": "സൗകര്യം കാണുക", - "view_patients": "രോഗികളെ കാണുക", - "frequency": "ആവൃത്തി", - "days": "ദിവസങ്ങൾ", - "never": "ഒരിക്കലും", + "add_beds": "കിടക്ക(കൾ) ചേർക്കുക", + "add_details_of_patient": "രോഗിയുടെ വിശദാംശങ്ങൾ ചേർക്കുക", + "add_location": "ലൊക്കേഷൻ ചേർക്കുക", + "add_new_user": "പുതിയ ഉപയോക്താവിനെ ചേർക്കുക", "add_notes": "കുറിപ്പുകൾ ചേർക്കുക", - "notes_placeholder": "നിങ്ങളുടെ കുറിപ്പുകൾ ടൈപ്പ് ചെയ്യുക", - "optional": "ഓപ്ഷണൽ", - "discontinue": "നിർത്തുക", - "discontinued": "നിർത്തലാക്കി", - "not_specified": "വ്യക്തമാക്കിയിട്ടില്ല", + "add_prescription_medication": "കുറിപ്പടി മരുന്ന് ചേർക്കുക", + "add_prescription_to_consultation_note": "ഈ കൺസൾട്ടേഷനിലേക്ക് ഒരു പുതിയ കുറിപ്പടി ചേർക്കുക.", + "add_prn_prescription": "PRN കുറിപ്പടി ചേർക്കുക", + "address": "വിലാസം", + "administer": "ഭരണം നടത്തുക", + "administer_medicine": "മെഡിസിൻ നടത്തുക", + "administer_medicines": "മരുന്നുകൾ നൽകുക", + "administer_selected_medicines": "തിരഞ്ഞെടുത്ത മരുന്നുകൾ നൽകുക", + "administered_on": "മേൽ നടത്തി", + "administration_dosage_range_error": "ഡോസ് ആരംഭത്തിനും ടാർഗെറ്റ് ഡോസേജിനും ഇടയിലായിരിക്കണം", + "administration_notes": "അഡ്മിനിസ്ട്രേഷൻ കുറിപ്പുകൾ", + "advanced_filters": "വിപുലമായ ഫിൽട്ടറുകൾ", + "age": "പ്രായം", "all_changes_have_been_saved": "എല്ലാ മാറ്റങ്ങളും സംരക്ഷിച്ചു", - "no_data_found": "വിവരങ്ങളൊന്നും കണ്ടെത്തിയില്ല", - "edit": "എഡിറ്റ് ചെയ്യുക", - "clear_selection": "തിരഞ്ഞെടുപ്പ് മായ്‌ക്കുക", - "select_date": "തീയതി തിരഞ്ഞെടുക്കുക", - "DD/MM/YYYY": "DD/MM/YYYY", - "clear_all_filters": "എല്ലാ ഫിൽട്ടറുകളും മായ്ക്കുക", - "summary": "സംഗ്രഹം", - "report": "റിപ്പോർട്ട് ചെയ്യുക", - "treating_doctor": "ചികിത്സിക്കുന്ന ഡോക്ടർ", - "ration_card__NO_CARD": "നോൺ-കാർഡ് ഹോൾഡർ", - "ration_card__BPL": "ബി.പി.എൽ", - "ration_card__APL": "എ.പി.എൽ", - "empty_date_time": "--:-- --; ------------", - "caution": "ജാഗ്രത", - "feed_optimal_experience_for_phones": "ഒപ്റ്റിമൽ കാണൽ അനുഭവത്തിനായി, നിങ്ങളുടെ ഉപകരണം തിരിക്കുന്നത് പരിഗണിക്കുക.", - "feed_optimal_experience_for_apple_phones": "ഒപ്റ്റിമൽ കാണൽ അനുഭവത്തിനായി, നിങ്ങളുടെ ഉപകരണം തിരിക്കുന്നത് പരിഗണിക്കുക. നിങ്ങളുടെ ഉപകരണ ക്രമീകരണങ്ങളിൽ സ്വയമേവ തിരിയുന്നത് പ്രവർത്തനക്ഷമമാണെന്ന് ഉറപ്പാക്കുക.", - "action_irreversible": "ഈ പ്രവർത്തനം മാറ്റാനാവാത്തതാണ്", - "GENDER__1": "പുരുഷൻ", - "GENDER__2": "സ്ത്രീ", - "GENDER__3": "നോൺ-ബൈനറി", - "normal": "സാധാരണ", - "done": "ചെയ്തു", - "view": "കാണുക", - "rename": "പേരുമാറ്റുക", - "more_info": "കൂടുതൽ വിവരങ്ങൾ", + "all_details": "എല്ലാ വിശദാംശങ്ങളും", + "allergies": "അലർജികൾ", + "allowed_formats_are": "അനുവദനീയമായ ഫോർമാറ്റുകളാണ്", + "already_a_member": "ഇതിനകം തന്നെ ഒരു അംഗമാണോ?", + "ambulance_driver_name": "ആംബുലൻസ് ഡ്രൈവറുടെ പേര്", + "ambulance_number": "ആംബുലൻസ് നം", + "ambulance_phone_number": "ആംബുലൻസിൻ്റെ ഫോൺ നമ്പർ", + "antenatal": "ജനനത്തിനുമുമ്പ്", + "any_other_comments": "മറ്റേതെങ്കിലും അഭിപ്രായങ്ങൾ", + "apply": "അപേക്ഷിക്കുക", + "approved_by_district_covid_control_room": "ജില്ലാ കോവിഡ് കൺട്രോൾ റൂം അംഗീകരിച്ചു", + "approving_facility": "അംഗീകാരം നൽകുന്ന സൗകര്യത്തിൻ്റെ പേര്", "archive": "ആർക്കൈവ്", - "discard": "നിരസിക്കുക", - "live": "തത്സമയം", - "discharged": "ഡിസ്ചാർജ് ചെയ്തു", "archived": "ആർക്കൈവ് ചെയ്തു", - "no_changes_made": "മാറ്റങ്ങളൊന്നും വരുത്തിയിട്ടില്ല", - "user_deleted_successfuly": "ഉപയോക്താവ് ഇല്ലാതാക്കി", - "users": "ഉപയോക്താക്കൾ", + "are_you_still_watching": "നിങ്ങൾ ഇപ്പോഴും കാണുന്നുണ്ടോ?", "are_you_sure_want_to_delete": "{{name}}ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ?", - "oxygen_information": "ഓക്സിജൻ വിവരങ്ങൾ", - "deleted_successfully": "{{name}} വിജയകരമായി ഇല്ലാതാക്കി", - "delete_item": "{{name}}ഇല്ലാതാക്കുക", - "unsupported_browser": "പിന്തുണയ്‌ക്കാത്ത ബ്രൗസർ", - "unsupported_browser_description": "നിങ്ങളുടെ ബ്രൗസർ ({{name}} പതിപ്പ് {{version}}) പിന്തുണയ്ക്കുന്നില്ല. ഏറ്റവും പുതിയ പതിപ്പിലേക്ക് നിങ്ങളുടെ ബ്രൗസർ അപ്‌ഡേറ്റ് ചെയ്യുക അല്ലെങ്കിൽ മികച്ച അനുഭവത്തിനായി പിന്തുണയ്‌ക്കുന്ന ബ്രൗസറിലേക്ക് മാറുക.", - "SORT_OPTIONS__-created_date": "ആദ്യം സൃഷ്ടിച്ച ഏറ്റവും പുതിയ തീയതി", - "SORT_OPTIONS__created_date": "ഏറ്റവും പഴയ സൃഷ്ടിച്ച തീയതി ആദ്യം", - "SORT_OPTIONS__-category_severity": "ഏറ്റവും ഉയർന്ന തീവ്രത വിഭാഗം ആദ്യം", - "SORT_OPTIONS__category_severity": "ഏറ്റവും കുറഞ്ഞ തീവ്രത വിഭാഗം ആദ്യം", - "SORT_OPTIONS__-modified_date": "ഏറ്റവും പുതിയ അപ്ഡേറ്റ് തീയതി ആദ്യം", - "SORT_OPTIONS__modified_date": "ഏറ്റവും പഴയ പുതുക്കിയ തീയതി ആദ്യം", - "SORT_OPTIONS__facility__name,last_consultation__current_bed__bed__name": "ബെഡ് നമ്പർ 1-N", - "SORT_OPTIONS__facility__name,-last_consultation__current_bed__bed__name": "കിടക്ക നമ്പർ N-1", - "SORT_OPTIONS__-review_time": "ഏറ്റവും പുതിയ അവലോകന തീയതി ആദ്യം", - "SORT_OPTIONS__review_time": "ഏറ്റവും പഴയ അവലോകന തീയതി ആദ്യം", - "SORT_OPTIONS__taken_at": "ആദ്യം എടുത്ത ഏറ്റവും പഴയ തീയതി", - "SORT_OPTIONS__-taken_at": "ഏറ്റവും പുതിയ തീയതി ആദ്യം", - "SORT_OPTIONS__name": "രോഗിയുടെ പേര് AZ", - "SORT_OPTIONS__-name": "രോഗിയുടെ പേര് ZA", - "SORT_OPTIONS__bed__name": "ബെഡ് നമ്പർ 1-N", - "SORT_OPTIONS__-bed__name": "കിടക്ക നമ്പർ N-1", - "middleware_hostname": "മിഡിൽവെയർ ഹോസ്റ്റ്നാമം", - "local_ipaddress": "പ്രാദേശിക ഐപി വിലാസം", - "no_consultation_updates": "കൺസൾട്ടേഷൻ അപ്‌ഡേറ്റുകളൊന്നുമില്ല", - "consultation_updates": "കൺസൾട്ടേഷൻ അപ്ഡേറ്റുകൾ", - "update_log": "അപ്ഡേറ്റ് ലോഗ്", - "record_updates": "റെക്കോർഡ് അപ്ഡേറ്റുകൾ", - "log_lab_results": "ലോഗ് ലാബ് ഫലങ്ങൾ", - "no_log_update_delta": "മുമ്പത്തെ ലോഗ് അപ്ഡേറ്റ് മുതൽ മാറ്റങ്ങളൊന്നുമില്ല", - "virtual_nursing_assistant": "വെർച്വൽ നഴ്സിംഗ് അസിസ്റ്റൻ്റ്", - "discharge": "ഡിസ്ചാർജ്", - "discharge_summary": "ഡിസ്ചാർജ് സംഗ്രഹം", - "discharge_from_care": "CARE-ൽ നിന്നുള്ള ഡിസ്ചാർജ്", - "generating_discharge_summary": "ഡിസ്ചാർജ് സംഗ്രഹം സൃഷ്ടിക്കുന്നു", - "discharge_summary_not_ready": "ഡിസ്ചാർജ് സംഗ്രഹം ഇതുവരെ തയ്യാറായിട്ടില്ല.", - "download_discharge_summary": "ഡിസ്ചാർജ് സംഗ്രഹം ഡൗൺലോഡ് ചെയ്യുക", - "email_discharge_summary_description": "ഡിസ്ചാർജ് സംഗ്രഹം ലഭിക്കുന്നതിന് നിങ്ങളുടെ സാധുവായ ഇമെയിൽ വിലാസം നൽകുക", - "generated_summary_caution": "കെയർ സിസ്റ്റത്തിൽ ക്യാപ്‌ചർ ചെയ്‌ത വിവരങ്ങൾ ഉപയോഗിച്ച് കമ്പ്യൂട്ടർ സൃഷ്‌ടിച്ച സംഗ്രഹമാണിത്.", - "NORMAL": "സംക്ഷിപ്ത അപ്ഡേറ്റ്", - "VENTILATOR": "വിശദമായ അപ്ഡേറ്റ്", - "DOCTORS_LOG": "പുരോഗതി കുറിപ്പ്", - "AUTOMATED": "ഓട്ടോമേറ്റഡ്", - "TELEMEDICINE": "ടെലിമെഡിസിൻ", - "investigations": "അന്വേഷണങ്ങൾ", - "search_investigation_placeholder": "അന്വേഷണവും ഗ്രൂപ്പുകളും", - "save_investigation": "അന്വേഷണം സംരക്ഷിക്കുക", - "investigation_reports": "അന്വേഷണ റിപ്പോർട്ടുകൾ", - "no_investigation": "അന്വേഷണ റിപ്പോർട്ടുകളൊന്നും കണ്ടെത്തിയില്ല", - "investigations_suggested": "അന്വേഷണങ്ങൾ നിർദ്ദേശിച്ചു", - "to_be_conducted": "നടത്തേണ്ടത്", - "log_report": "ലോഗ് റിപ്പോർട്ട്", - "no_investigation_suggestions": "അന്വേഷണ നിർദ്ദേശങ്ങളൊന്നുമില്ല", - "select_investigation": "അന്വേഷണങ്ങൾ തിരഞ്ഞെടുക്കുക (എല്ലാ അന്വേഷണങ്ങളും സ്ഥിരസ്ഥിതിയായി തിരഞ്ഞെടുക്കും)", - "select_investigations": "അന്വേഷണങ്ങൾ തിരഞ്ഞെടുക്കുക", - "get_tests": "ടെസ്റ്റുകൾ നേടുക", - "select_investigation_groups": "അന്വേഷണ സംഘങ്ങൾ തിരഞ്ഞെടുക്കുക", - "select_groups": "ഗ്രൂപ്പുകൾ തിരഞ്ഞെടുക്കുക", - "generate_report": "റിപ്പോർട്ട് സൃഷ്ടിക്കുക", - "prev_sessions": "മുൻ സെഷനുകൾ", - "next_sessions": "അടുത്ത സെഷനുകൾ", - "no_changes": "മാറ്റങ്ങളൊന്നുമില്ല", - "back_to_consultation": "കൺസൾട്ടേഷനിലേക്ക് മടങ്ങുക", - "no_treating_physicians_available": "ഈ സൗകര്യത്തിന് ഹോം ഫെസിലിറ്റി ഡോക്ടർമാരില്ല. ദയവായി നിങ്ങളുടെ അഡ്‌മിനെ ബന്ധപ്പെടുക.", - "encounter_suggestion_edit_disallowed": "എഡിറ്റ് കൺസൾട്ടേഷനിൽ ഈ ഓപ്ഷനിലേക്ക് മാറാൻ അനുവാദമില്ല", - "encounter_suggestion__A": "പ്രവേശനം", - "encounter_suggestion__DC": "ഡൊമിസിലിയറി കെയർ", - "encounter_suggestion__OP": "ഔട്ട് പേഷ്യൻ്റ് സന്ദർശനം", - "encounter_suggestion__DD": "കൂടിയാലോചന", - "encounter_suggestion__HI": "കൂടിയാലോചന", - "encounter_suggestion__R": "കൂടിയാലോചന", - "encounter_date_field_label__A": "സൗകര്യത്തിലേക്കുള്ള പ്രവേശന തീയതിയും സമയവും", - "encounter_date_field_label__DC": "ഡൊമിസിലിയറി കെയർ ആരംഭിച്ച തീയതിയും സമയവും", - "encounter_date_field_label__OP": "ഔട്ട്-പേഷ്യൻ്റ് സന്ദർശന തീയതിയും സമയവും", - "encounter_date_field_label__DD": "കൂടിയാലോചനയുടെ തീയതിയും സമയവും", - "encounter_date_field_label__HI": "കൂടിയാലോചനയുടെ തീയതിയും സമയവും", - "encounter_date_field_label__R": "കൂടിയാലോചനയുടെ തീയതിയും സമയവും", + "are_you_sure_want_to_delete_this_record": "ഈ റെക്കോർഡ് ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ?", + "asset_class": "അസറ്റ് ക്ലാസ്", + "asset_location": "അസറ്റ് ലൊക്കേഷൻ", + "asset_name": "അസറ്റ് പേര്", + "asset_not_found_msg": "ശ്ശോ! നിങ്ങൾ അന്വേഷിക്കുന്ന അസറ്റ് നിലവിലില്ല. അസറ്റ് ഐഡി പരിശോധിക്കുക.", + "asset_qr_id": "അസറ്റ് QR ഐഡി", + "asset_type": "അസറ്റ് തരം", + "assigned_facility": "സൗകര്യം ഏൽപ്പിച്ചു", + "assigned_to": "ലേക്ക് നിയോഗിച്ചു", + "audio__allow_permission": "സൈറ്റ് ക്രമീകരണങ്ങളിൽ ദയവായി മൈക്രോഫോൺ അനുമതി അനുവദിക്കുക", + "audio__allow_permission_button": "എങ്ങനെ അനുവദിക്കണമെന്ന് അറിയാൻ ഇവിടെ ക്ലിക്ക് ചെയ്യുക", + "audio__allow_permission_helper": "നിങ്ങൾ മുമ്പ് മൈക്രോഫോൺ ആക്‌സസ് നിരസിച്ചിരിക്കാം.", + "audio__record": "റെക്കോർഡ് ഓഡിയോ", + "audio__record_helper": "റെക്കോർഡിംഗ് ആരംഭിക്കാൻ ബട്ടൺ ക്ലിക്ക് ചെയ്യുക", + "audio__recorded": "ഓഡിയോ റെക്കോർഡ് ചെയ്തു", + "audio__recording": "റെക്കോർഡിംഗ്", + "audio__recording_helper": "ദയവായി നിങ്ങളുടെ മൈക്രോഫോണിൽ സംസാരിക്കുക.", + "audio__recording_helper_2": "റെക്കോർഡിംഗ് നിർത്താൻ ബട്ടണിൽ ക്ലിക്ക് ചെയ്യുക.", + "audio__start_again": "വീണ്ടും ആരംഭിക്കുക", + "audit_log": "ഓഡിറ്റ് ലോഗ്", + "auth_login_title": "അംഗീകൃത ലോഗിൻ", + "authorize_shift_delete": "ഷിഫ്റ്റ് ഇല്ലാതാക്കൽ അംഗീകരിക്കുക", + "auto_generated_for_care": "പരിചരണത്തിനായി സ്വയമേവ സൃഷ്ടിച്ചത്", + "available_features": "ലഭ്യമായ സവിശേഷതകൾ", + "available_in": "ലഭ്യമായ ഭാഷകൾ", + "average_weekly_working_hours": "പ്രതിവാര ശരാശരി പ്രവൃത്തി സമയം", + "awaiting_destination_approval": "ഡെസ്റ്റിനേഷൻ അനുമതിക്കായി കാത്തിരിക്കുന്നു", + "back": "തിരികെ", "back_dated_encounter_date_caution": "ഇതിനായി നിങ്ങൾ ഒരു ഏറ്റുമുട്ടൽ സൃഷ്ടിക്കുകയാണ്", - "encounter_duration_confirmation": "ഈ ഏറ്റുമുട്ടലിൻ്റെ ദൈർഘ്യം ഇതായിരിക്കും", - "consultation_notes": "പൊതു നിർദ്ദേശങ്ങൾ (ഉപദേശം)", - "procedure_suggestions": "നടപടിക്രമ നിർദ്ദേശങ്ങൾ", - "edit_cover_photo": "മുഖചിത്രം എഡിറ്റ് ചെയ്യുക", - "no_cover_photo_uploaded_for_this_facility": "ഈ സൗകര്യത്തിനായി കവർ ഫോട്ടോ അപ്‌ലോഡ് ചെയ്‌തിട്ടില്ല", + "back_to_consultation": "കൺസൾട്ടേഷനിലേക്ക് മടങ്ങുക", + "back_to_login": "ലോഗിൻ പേജിലേക്ക് മടങ്ങുക", + "base_dosage": "അളവ്", + "bed_capacity": "കിടക്ക കപ്പാസിറ്റി", + "bed_search_placeholder": "കിടക്കകളുടെ പേര് ഉപയോഗിച്ച് തിരയുക", + "bed_type": "കിടക്കയുടെ തരം", + "blood_group": "രക്ത ഗ്രൂപ്പ്", + "board_view": "ബോർഡ് കാഴ്ച", + "bradycardia": "ബ്രാഡികാർഡിയ", + "breathlessness_level": "ശ്വാസതടസ്സം നില", + "camera": "ക്യാമറ", + "camera_permission_denied": "ക്യാമറ അനുമതി നിഷേധിച്ചു", + "cancel": "റദ്ദാക്കുക", + "capture": "ക്യാപ്ചർ", "capture_cover_photo": "മുഖചിത്രം എടുക്കുക", - "diagnoses": "രോഗനിർണയങ്ങൾ", - "diagnosis_already_added": "ഈ രോഗനിർണയം ഇതിനകം ചേർത്തിട്ടുണ്ട്", - "principal": "പ്രിൻസിപ്പൽ", - "principal_diagnosis": "പ്രധാന രോഗനിർണയം", - "unconfirmed": "സ്ഥിരീകരിച്ചിട്ടില്ല", - "provisional": "താൽക്കാലികം", - "differential": "ഡിഫറൻഷ്യൽ", - "confirmed": "സ്ഥിരീകരിച്ചു", - "refuted": "നിഷേധിച്ചു", - "entered-in-error": "തെറ്റായി നൽകി", - "help_unconfirmed": "ഇത് ഒരു സ്ഥിരീകരിച്ച അവസ്ഥയായി കണക്കാക്കാൻ മതിയായ ഡയഗ്നോസ്റ്റിക് കൂടാതെ/അല്ലെങ്കിൽ ക്ലിനിക്കൽ തെളിവുകൾ ഇല്ല.", - "help_provisional": "ഇതൊരു താൽക്കാലിക രോഗനിർണയമാണ് - ഇപ്പോഴും പരിഗണനയിലിരിക്കുന്ന ഒരു സ്ഥാനാർത്ഥി.", - "help_differential": "രോഗനിർണ്ണയ പ്രക്രിയയ്ക്കും പ്രാഥമിക ചികിത്സയ്ക്കും കൂടുതൽ മാർഗ്ഗനിർദ്ദേശം നൽകുന്നതിന് സാധ്യതയുള്ള (സാധാരണയായി പരസ്പരവിരുദ്ധമായ) രോഗനിർണയങ്ങളിൽ ഒന്ന്.", - "help_confirmed": "ഇത് ഒരു സ്ഥിരീകരിച്ച അവസ്ഥയായി കണക്കാക്കാൻ മതിയായ ഡയഗ്നോസ്റ്റിക് കൂടാതെ/അല്ലെങ്കിൽ ക്ലിനിക്കൽ തെളിവുകൾ ഉണ്ട്.", - "help_refuted": "തുടർന്നുള്ള ഡയഗ്നോസ്റ്റിക്, ക്ലിനിക്കൽ തെളിവുകൾ വഴി ഈ അവസ്ഥ ഒഴിവാക്കിയിട്ടുണ്ട്.", - "help_entered-in-error": "പ്രസ്‌താവന തെറ്റായി നൽകിയതിനാൽ സാധുതയില്ല.", - "search_icd11_placeholder": "ICD-11 രോഗനിർണയങ്ങൾക്കായി തിരയുക", - "icd11_as_recommended": "WHO ശുപാർശ ചെയ്യുന്ന ICD-11 പ്രകാരം", - "Facilities": "ഫെസിലിറ്റികള്‍", - "Patients": "രോഗികൾ", - "Sample Test": "സാമ്പിൾ ടെസ്റ്റ്", - "Shifting": "ഫെസിലിറ്റി മാറ്റല്‍ ", - "Resource": "സഹായം", - "Users": "ഉപയോക്താക്കൾ", - "Profile": "പ്രൊഫൈൽ", - "Dashboard": "ഡാഷ്ബോർഡ്", - "return_to_care": "CARE എന്ന താളിലേക്ക് മടങ്ങുക", - "404_message": "നിലവിലില്ലാത്തതോ മറ്റൊരു URL-ലേക്ക് നീക്കിയതോ ആയ ഒരു പേജിൽ നിങ്ങൾ ഇടറിവീണതായി തോന്നുന്നു. നിങ്ങൾ ശരിയായ ലിങ്ക് നൽകിയിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക!", - "error_404": "പിശക് 404", - "page_not_found": "പേജ് കണ്ടെത്തിയില്ല", - "session_expired": "സെഷൻ കാലഹരണപ്പെട്ടു", - "invalid_password_reset_link": "അസാധുവായ പാസ്‌വേഡ് പുനഃസജ്ജീകരണ ലിങ്ക്", - "invalid_link_msg": "നിങ്ങൾ ഉപയോഗിച്ച പാസ്‌വേഡ് പുനഃസജ്ജീകരണ ലിങ്ക് അസാധുവാണ് അല്ലെങ്കിൽ കാലഹരണപ്പെട്ടതായി തോന്നുന്നു. ഒരു പുതിയ പാസ്‌വേഡ് പുനഃസജ്ജീകരണ ലിങ്ക് അഭ്യർത്ഥിക്കുക.", - "return_to_password_reset": "പാസ്‌വേഡ് പുനഃസജ്ജീകരണത്തിലേക്ക് മടങ്ങുക", - "return_to_login": "ലോഗിൻ എന്നതിലേക്ക് മടങ്ങുക", - "session_expired_msg": "നിങ്ങളുടെ സെഷൻ കാലഹരണപ്പെട്ടതായി തോന്നുന്നു. ഇത് നിഷ്ക്രിയത്വം മൂലമാകാം. തുടരാൻ വീണ്ടും ലോഗിൻ ചെയ്യുക.", - "invalid_reset": "അസാധുവായ റീസെറ്റ്", - "please_upload_a_csv_file": "ദയവായി ഒരു CSV ഫയൽ അപ്‌ലോഡ് ചെയ്യുക", - "csv_file_in_the_specified_format": "നിർദ്ദിഷ്ട ഫോർമാറ്റിൽ ഒരു CSV ഫയൽ തിരഞ്ഞെടുക്കുക", - "sample_format": "സാമ്പിൾ ഫോർമാറ്റ്", - "search_for_facility": "സൗകര്യത്തിനായി തിരയുക", - "select_local_body": "തദ്ദേശ സ്ഥാപനം തിരഞ്ഞെടുക്കുക", - "select_wards": "വാർഡുകൾ തിരഞ്ഞെടുക്കുക", - "result_date": "ഫല തീയതി", - "sample_collection_date": "സാമ്പിൾ ശേഖരണ തീയതി", - "record_has_been_deleted_successfully": "റെക്കോർഡ് വിജയകരമായി ഇല്ലാതാക്കി.", - "error_while_deleting_record": "റെക്കോർഡ് ഇല്ലാതാക്കുന്നതിൽ പിശക്", - "result_details": "ഫലത്തിൻ്റെ വിശദാംശങ്ങൾ", + "care": "കെയർ", + "category": "വിഭാഗം", + "caution": "ജാഗ്രത", + "central_nursing_station": "സെൻട്രൽ നഴ്‌സിംഗ് സ്റ്റേഷൻ", + "choose_file": "ഉപകരണത്തിൽ നിന്ന് അപ്‌ലോഡ് ചെയ്യുക", + "choose_location": "ലൊക്കേഷൻ തിരഞ്ഞെടുക്കുക", + "clear": "ക്ലിയർ", + "clear_all_filters": "എല്ലാ ഫിൽട്ടറുകളും മായ്ക്കുക", + "clear_home_facility": "ഹോം സൗകര്യം മായ്‌ക്കുക", + "clear_selection": "തിരഞ്ഞെടുപ്പ് മായ്‌ക്കുക", + "close": "അടയ്ക്കുക", + "close_scanner": "സ്കാനർ അടയ്ക്കുക", + "comment_added_successfully": "അഭിപ്രായം വിജയകരമായി ചേർത്തു", + "comment_min_length": "കമൻ്റിൽ കുറഞ്ഞത് 1 പ്രതീകമെങ്കിലും ഉണ്ടായിരിക്കണം", + "comments": "അഭിപ്രായങ്ങൾ", + "completed": "പൂർത്തിയാക്കി", + "configure": "കോൺഫിഗർ ചെയ്യുക", + "configure_facility": "സൗകര്യം ക്രമീകരിക്കുക", + "confirm": "സ്ഥിരീകരിക്കുക", "confirm_delete": "ഇല്ലാതാക്കൽ സ്ഥിരീകരിക്കുക", - "are_you_sure_want_to_delete_this_record": "ഈ റെക്കോർഡ് ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ?", - "patient_category": "രോഗികളുടെ വിഭാഗം", - "source": "ഉറവിടം", - "result": "ഫലം", - "sample_type": "സാമ്പിൾ തരം", - "patient_status": "രോഗിയുടെ അവസ്ഥ", - "mobile_number": "മൊബൈൽ നമ്പർ", - "patient_created": "രോഗിയെ സൃഷ്ടിച്ചു", - "update_record": "റെക്കോർഡ് അപ്ഡേറ്റ് ചെയ്യുക", - "facility_search_placeholder": "ഫെസിലിറ്റി / ജില്ല പ്രകാരം തിരയുക", - "advanced_filters": "വിപുലമായ ഫിൽട്ടറുകൾ", - "facility_name": "സൗകര്യത്തിൻ്റെ പേര്", - "KASP Empanelled": "കെ. എ. എസ്. പി. എംപാനല്‍ ചെയ്യപ്പെട്ടത്", - "View Facility": "ഫെസിലിറ്റി കാണുക", - "no_duplicate_facility": "അനധികൃതമായി ഫെസിലിറ്റികള്‍ സൃഷ്ടിക്കരുത്", - "no_facilities": "ഫെസിലിറ്റികളൊന്നും കണ്ടെത്തുവാനായില്ല", - "no_staff": "ജീവനക്കാരെ കണ്ടെത്തിയില്ല", - "no_bed_types_found": "കിടക്ക തരങ്ങളൊന്നും കണ്ടെത്തിയില്ല", - "total_beds": "മൊത്തം കിടക്കകൾ", + "confirm_discontinue": "നിർത്തലാക്കൽ സ്ഥിരീകരിക്കുക", + "confirm_password": "പാസ്‌വേഡ് ഉറപ്പാക്കുക", + "confirm_transfer_complete": "കൈമാറ്റം പൂർത്തിയായെന്ന് സ്ഥിരീകരിക്കുക!", + "confirmed": "സ്ഥിരീകരിച്ചു", + "consultation_notes": "പൊതു നിർദ്ദേശങ്ങൾ (ഉപദേശം)", + "consultation_updates": "കൺസൾട്ടേഷൻ അപ്ഡേറ്റുകൾ", + "contact_number": "ബന്ധപ്പെടേണ്ട നമ്പർ", + "contact_person": "ഫെസിലിറ്റിയിൽ ബന്ധപ്പെടുന്ന വ്യക്തിയുടെ പേര്", + "contact_person_at_the_facility": "നിലവിലെ സൗകര്യത്തിലുള്ള വ്യക്തിയുമായി ബന്ധപ്പെടുക", + "contact_person_number": "ബന്ധപ്പെടേണ്ട വ്യക്തിയുടെ നമ്പർ", + "contact_phone": "ബന്ധപ്പെടാനുള്ള വ്യക്തി നമ്പർ", + "contact_your_admin_to_add_skills": "കഴിവുകൾ ചേർക്കാൻ നിങ്ങളുടെ അഡ്‌മിനെ ബന്ധപ്പെടുക", + "continue": "തുടരുക", + "continue_watching": "കാണുന്നത് തുടരുക", + "contribute_github": "GitHubൽ സംഭാവന ചെയ്യുക", + "copied_to_clipboard": "ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി", + "countries_travelled": "രാജ്യങ്ങൾ സഞ്ചരിച്ചു", + "covid_19_cat_gov": "സർക്കാർ പ്രകാരം കോവിഡ്_19 ക്ലിനിക്കൽ വിഭാഗം. കേരള മാർഗരേഖ (എ/ബി/സി)", + "create": "സൃഷ്ടിക്കുക", + "create_add_more": "സൃഷ്‌ടിക്കുക, കൂടുതൽ ചേർക്കുക", + "create_asset": "അസറ്റ് സൃഷ്ടിക്കുക", "create_facility": "ഒരു പുതിയ ഫെസിലിറ്റി സൃഷ്ടിക്കുക", - "staff_list": "സ്റ്റാഫ് ലിസ്റ്റ്", - "bed_capacity": "കിടക്ക കപ്പാസിറ്റി", - "cylinders": "സിലിണ്ടറുകൾ", - "cylinders_per_day": "സിലിണ്ടറുകൾ / ദിവസം", - "liquid_oxygen_capacity": "ദ്രാവക ഓക്സിജൻ ശേഷി", - "expected_burn_rate": "പ്രതീക്ഷിക്കുന്ന പൊള്ളൽ നിരക്ക്", - "type_b_cylinders": "ബി തരം സിലിണ്ടറുകൾ", - "type_c_cylinders": "സി തരം സിലിണ്ടറുകൾ", - "type_d_cylinders": "ഡി തരം സിലിണ്ടറുകൾ", - "update_asset": "അസറ്റ് അപ്ഡേറ്റ് ചെയ്യുക", "create_new_asset": "പുതിയ അസറ്റ് സൃഷ്ടിക്കുക", - "you_need_at_least_a_location_to_create_an_assest": "ഒരു അസസ്‌റ്റ് സൃഷ്‌ടിക്കാൻ നിങ്ങൾക്ക് ഒരു ലൊക്കേഷനെങ്കിലും ആവശ്യമാണ്.", - "add_location": "ലൊക്കേഷൻ ചേർക്കുക", - "close_scanner": "സ്കാനർ അടയ്ക്കുക", - "scan_asset_qr": "അസറ്റ് ക്യുആർ സ്കാൻ ചെയ്യുക!", - "create": "സൃഷ്ടിക്കുക", - "asset_name": "അസറ്റ് പേര്", - "asset_location": "അസറ്റ് ലൊക്കേഷൻ", - "asset_type": "അസറ്റ് തരം", - "asset_class": "അസറ്റ് ക്ലാസ്", - "details_about_the_equipment": "ഉപകരണത്തെക്കുറിച്ചുള്ള വിശദാംശങ്ങൾ", - "working_status": "പ്രവർത്തന നില", - "why_the_asset_is_not_working": "എന്തുകൊണ്ടാണ് അസറ്റ് പ്രവർത്തിക്കാത്തത്?", - "describe_why_the_asset_is_not_working": "അസറ്റ് പ്രവർത്തിക്കാത്തത് എന്തുകൊണ്ടെന്ന് വിവരിക്കുക", - "asset_qr_id": "അസറ്റ് QR ഐഡി", - "manufacturer": "നിർമ്മാതാവ്", - "eg_xyz": "ഉദാ. XYZ", - "eg_abc": "ഉദാ. എബിസി", - "warranty_amc_expiry": "വാറൻ്റി / AMC കാലഹരണപ്പെടുന്നു", + "create_resource_request": "റിസോഴ്സ് അഭ്യർത്ഥന സൃഷ്ടിക്കുക", + "created": "സൃഷ്ടിച്ചത്", + "created_date": "സൃഷ്ടിച്ച തീയതി", + "csv_file_in_the_specified_format": "നിർദ്ദിഷ്ട ഫോർമാറ്റിൽ ഒരു CSV ഫയൽ തിരഞ്ഞെടുക്കുക", + "customer_support_email": "ഉപഭോക്തൃ പിന്തുണ ഇമെയിൽ", "customer_support_name": "ഉപഭോക്തൃ പിന്തുണയുടെ പേര്", "customer_support_number": "ഉപഭോക്തൃ പിന്തുണ നമ്പർ", - "customer_support_email": "ഉപഭോക്തൃ പിന്തുണ ഇമെയിൽ", - "eg_mail_example_com": "ഉദാ. mail@example.com", - "vendor_name": "വെണ്ടർ പേര്", - "serial_number": "സീരിയൽ നമ്പർ", - "last_serviced_on": "അവസാനം സർവീസ് ചെയ്തത്", - "create_add_more": "സൃഷ്‌ടിക്കുക, കൂടുതൽ ചേർക്കുക", - "discharged_patients": "ഡിസ്ചാർജ് ചെയ്ത രോഗികൾ", - "discharged_patients_empty": "ഡിസ്ചാർജ് ചെയ്ത രോഗികളൊന്നും ഈ സൗകര്യത്തിൽ ഇല്ല", - "update_facility_middleware_success": "ഫെസിലിറ്റി മിഡിൽവെയർ വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", - "treatment_summary__head_title": "ചികിത്സയുടെ സംഗ്രഹം", - "treatment_summary__print": "ചികിത്സയുടെ സംഗ്രഹം അച്ചടിക്കുക", - "treatment_summary__heading": "ഇടക്കാല ചികിത്സ സംഗ്രഹം", - "patient_registration__name": "പേര്", - "patient_registration__address": "വിലാസം", - "patient_registration__age": "പ്രായം", - "patient_consultation__op": "ഒ.പി", - "patient_consultation__ip": "ഐ.പി", - "patient_consultation__dc_admission": "ഡൊമിസിലിയറി കെയർ ആരംഭിച്ച തീയതി", - "patient_consultation__admission": "പ്രവേശന തീയതി", - "patient_registration__gender": "ലിംഗഭേദം", - "patient_registration__contact": "അടിയന്തര കോൺടാക്റ്റ്", - "patient_registration__comorbidities": "കോമോർബിഡിറ്റികൾ", - "patient_registration__comorbidities__disease": "രോഗം", - "patient_registration__comorbidities__details": "വിശദാംശങ്ങൾ", - "patient_consultation__consultation_notes": "പൊതു നിർദ്ദേശങ്ങൾ", - "patient_consultation__special_instruction": "പ്രത്യേക നിർദ്ദേശങ്ങൾ", - "suggested_investigations": "നിർദ്ദേശിച്ച അന്വേഷണങ്ങൾ", - "investigations__date": "തീയതി", - "investigations__name": "പേര്", - "investigations__result": "ഫലം", - "investigations__ideal_value": "അനുയോജ്യമായ മൂല്യം", - "investigations__range": "മൂല്യ ശ്രേണി", - "investigations__unit": "യൂണിറ്റ്", - "patient_consultation__treatment__plan": "പ്ലാൻ ചെയ്യുക", - "patient_consultation__treatment__summary": "സംഗ്രഹം", - "patient_consultation__treatment__summary__date": "തീയതി", - "patient_consultation__treatment__summary__spo2": "SpO2", - "patient_consultation__treatment__summary__temperature": "താപനില", - "diagnosis__principal": "പ്രിൻസിപ്പൽ", + "cylinders": "സിലിണ്ടറുകൾ", + "cylinders_per_day": "സിലിണ്ടറുകൾ / ദിവസം", + "date_and_time": "തീയതിയും സമയവും", + "date_of_admission": "പ്രവേശന തീയതി", + "date_of_birth": "ജനനത്തീയതി", + "date_of_positive_covid_19_swab": "പോസിറ്റീവ് കോവിഡ് 19 സ്വാബ് തീയതി", + "date_of_test": "ടെസ്റ്റ് തീയതി", + "days": "ദിവസങ്ങൾ", + "delete": "ഇല്ലാതാക്കുക", + "delete_facility": "സൗകര്യം ഇല്ലാതാക്കുക", + "delete_item": "{{name}}ഇല്ലാതാക്കുക", + "delete_record": "റെക്കോർഡ് ഇല്ലാതാക്കുക", + "deleted_successfully": "{{name}} വിജയകരമായി ഇല്ലാതാക്കി", + "describe_why_the_asset_is_not_working": "അസറ്റ് പ്രവർത്തിക്കാത്തത് എന്തുകൊണ്ടെന്ന് വിവരിക്കുക", + "description": "വിവരണം", + "details_about_the_equipment": "ഉപകരണത്തെക്കുറിച്ചുള്ള വിശദാംശങ്ങൾ", + "details_of_assigned_facility": "നിയുക്ത സൗകര്യത്തിൻ്റെ വിശദാംശങ്ങൾ", + "details_of_origin_facility": "ഉറവിട സൗകര്യത്തിൻ്റെ വിശദാംശങ്ങൾ", + "details_of_patient": "രോഗിയുടെ വിശദാംശങ്ങൾ", + "details_of_shifting_approving_facility": "അംഗീകാരം നൽകുന്ന സൗകര്യം മാറ്റുന്നതിൻ്റെ വിശദാംശങ്ങൾ", + "diagnoses": "രോഗനിർണയങ്ങൾ", + "diagnosis": "രോഗനിർണയം", "diagnosis__confirmed": "സ്ഥിരീകരിച്ചു", + "diagnosis__differential": "ഡിഫറൻഷ്യൽ", + "diagnosis__principal": "പ്രിൻസിപ്പൽ", "diagnosis__provisional": "താൽക്കാലികം", "diagnosis__unconfirmed": "സ്ഥിരീകരിച്ചിട്ടില്ല", - "diagnosis__differential": "ഡിഫറൻഷ്യൽ", - "active_prescriptions": "സജീവ കുറിപ്പടികൾ", - "prescriptions__medicine": "മരുന്ന്", - "prescriptions__route": "റൂട്ട്", - "prescriptions__dosage_frequency": "അളവും ആവൃത്തിയും", - "prescriptions__start_date": "നിർദ്ദേശിച്ചിരിക്കുന്നത്", - "select_facility_for_discharged_patients_warning": "ഡിസ്ചാർജ് ചെയ്ത രോഗികളെ കാണാനുള്ള സൗകര്യം തിരഞ്ഞെടുക്കേണ്ടതുണ്ട്.", + "diagnosis_already_added": "ഈ രോഗനിർണയം ഇതിനകം ചേർത്തിട്ടുണ്ട്", + "diastolic": "ഡയസ്റ്റോളിക്", + "differential": "ഡിഫറൻഷ്യൽ", + "discard": "നിരസിക്കുക", + "discharge": "ഡിസ്ചാർജ്", + "discharge_from_care": "CARE-ൽ നിന്നുള്ള ഡിസ്ചാർജ്", + "discharge_prescription": "ഡിസ്ചാർജ് കുറിപ്പടി", + "discharge_summary": "ഡിസ്ചാർജ് സംഗ്രഹം", + "discharge_summary_not_ready": "ഡിസ്ചാർജ് സംഗ്രഹം ഇതുവരെ തയ്യാറായിട്ടില്ല.", + "discharged": "ഡിസ്ചാർജ് ചെയ്തു", + "discharged_patients": "ഡിസ്ചാർജ് ചെയ്ത രോഗികൾ", + "discharged_patients_empty": "ഡിസ്ചാർജ് ചെയ്ത രോഗികളൊന്നും ഈ സൗകര്യത്തിൽ ഇല്ല", + "disclaimer": "നിരാകരണം", + "discontinue": "നിർത്തുക", + "discontinue_caution_note": "ഈ കുറിപ്പടി നിർത്തണമെന്ന് തീർച്ചയാണോ?", + "discontinued": "നിർത്തലാക്കി", + "disease_status": "രോഗാവസ്ഥ", + "district": "ജില്ല", + "district_program_management_supporting_unit": "ജില്ലാ പ്രോഗ്രാം മാനേജ്മെൻ്റ് സപ്പോർട്ടിംഗ് യൂണിറ്റ്", + "done": "ചെയ്തു", + "dosage": "അളവ്", + "down": "താഴേക്ക്", + "download": "ഡൗൺലോഡ് ചെയ്യുക", + "download_discharge_summary": "ഡിസ്ചാർജ് സംഗ്രഹം ഡൗൺലോഡ് ചെയ്യുക", + "download_type": "ഡൗൺലോഡുകളുടെ തരം", + "downloading": "ഡൗൺലോഡ് ചെയ്യുന്നു", + "downloads": "ഡൗൺലോഡുകൾ", + "drag_drop_image_to_upload": "അപ്‌ലോഡ് ചെയ്യാൻ ചിത്രം വലിച്ചിടുക", + "duplicate_patient_record_birth_unknown": "രോഗിയുടെ ജനന വർഷത്തെക്കുറിച്ച് നിങ്ങൾക്ക് ഉറപ്പില്ലെങ്കിൽ നിങ്ങളുടെ ജില്ലാ പരിചരണ കോർഡിനേറ്റർ, ഷിഫ്റ്റിംഗ് സൗകര്യം അല്ലെങ്കിൽ രോഗിയെ ബന്ധപ്പെടുക.", "duplicate_patient_record_confirmation": "ജനന വർഷം ചേർത്ത് രോഗിയുടെ രേഖ നിങ്ങളുടെ സൗകര്യത്തിലേക്ക് പ്രവേശിപ്പിക്കുക", "duplicate_patient_record_rejection": "ഞാൻ സൃഷ്ടിക്കാൻ ആഗ്രഹിക്കുന്ന സംശയാസ്പദമായ / രോഗി ലിസ്റ്റിൽ ഇല്ലെന്ന് ഞാൻ സ്ഥിരീകരിക്കുന്നു.", - "duplicate_patient_record_birth_unknown": "രോഗിയുടെ ജനന വർഷത്തെക്കുറിച്ച് നിങ്ങൾക്ക് ഉറപ്പില്ലെങ്കിൽ നിങ്ങളുടെ ജില്ലാ പരിചരണ കോർഡിനേറ്റർ, ഷിഫ്റ്റിംഗ് സൗകര്യം അല്ലെങ്കിൽ രോഗിയെ ബന്ധപ്പെടുക.", - "patient_transfer_birth_match_note": "ശ്രദ്ധിക്കുക: ട്രാൻസ്ഫർ അഭ്യർത്ഥന പ്രോസസ്സ് ചെയ്യുന്നതിന് ജനന വർഷം രോഗിയുമായി പൊരുത്തപ്പെടണം.", - "available_features": "ലഭ്യമായ സവിശേഷതകൾ", - "update_facility": "അപ്ഡേറ്റ് സൗകര്യം", - "configure_facility": "സൗകര്യം ക്രമീകരിക്കുക", - "inventory_management": "ഇൻവെൻ്ററി മാനേജ്മെൻ്റ്", - "location_management": "ലൊക്കേഷൻ മാനേജ്മെൻ്റ്", - "resource_request": "റിസോഴ്സ് അഭ്യർത്ഥന", - "view_asset": "അസറ്റുകൾ കാണുക", - "view_users": "ഉപയോക്താക്കളെ കാണുക", - "view_abdm_records": "ABDM റെക്കോർഡുകൾ കാണുക", - "delete_facility": "സൗകര്യം ഇല്ലാതാക്കുക", - "central_nursing_station": "സെൻട്രൽ നഴ്‌സിംഗ് സ്റ്റേഷൻ", - "add_details_of_patient": "രോഗിയുടെ വിശദാംശങ്ങൾ ചേർക്കുക", - "choose_location": "ലൊക്കേഷൻ തിരഞ്ഞെടുക്കുക", - "live_monitoring": "തത്സമയ നിരീക്ഷണം", - "open_live_monitoring": "ലൈവ് മോണിറ്ററിംഗ് തുറക്കുക", - "audio__allow_permission": "സൈറ്റ് ക്രമീകരണങ്ങളിൽ ദയവായി മൈക്രോഫോൺ അനുമതി അനുവദിക്കുക", - "audio__allow_permission_helper": "നിങ്ങൾ മുമ്പ് മൈക്രോഫോൺ ആക്‌സസ് നിരസിച്ചിരിക്കാം.", - "audio__allow_permission_button": "എങ്ങനെ അനുവദിക്കണമെന്ന് അറിയാൻ ഇവിടെ ക്ലിക്ക് ചെയ്യുക", - "audio__record": "റെക്കോർഡ് ഓഡിയോ", - "audio__record_helper": "റെക്കോർഡിംഗ് ആരംഭിക്കാൻ ബട്ടൺ ക്ലിക്ക് ചെയ്യുക", - "audio__recording": "റെക്കോർഡിംഗ്", - "audio__recording_helper": "ദയവായി നിങ്ങളുടെ മൈക്രോഫോണിൽ സംസാരിക്കുക.", - "audio__recording_helper_2": "റെക്കോർഡിംഗ് നിർത്താൻ ബട്ടണിൽ ക്ലിക്ക് ചെയ്യുക.", - "audio__recorded": "ഓഡിയോ റെക്കോർഡ് ചെയ്തു", - "audio__start_again": "വീണ്ടും ആരംഭിക്കുക", + "edit": "എഡിറ്റ് ചെയ്യുക", + "edit_caution_note": "കൺസൾട്ടേഷനിൽ എഡിറ്റ് ചെയ്ത വിശദാംശങ്ങളോടൊപ്പം ഒരു പുതിയ കുറിപ്പടി ചേർക്കുകയും നിലവിലുള്ള കുറിപ്പടി നിർത്തലാക്കുകയും ചെയ്യും.", + "edit_cover_photo": "മുഖചിത്രം എഡിറ്റ് ചെയ്യുക", + "edit_history": "ചരിത്രം തിരുത്തുക", + "edit_prescriptions": "കുറിപ്പടികൾ എഡിറ്റ് ചെയ്യുക", + "edited_by": "എഡിറ്റ് ചെയ്തത്", + "edited_on": "എഡിറ്റ് ചെയ്തത്", + "eg_abc": "ഉദാ. എബിസി", + "eg_details_on_functionality_service_etc": "ഉദാ. പ്രവർത്തനം, സേവനം മുതലായവയെക്കുറിച്ചുള്ള വിശദാംശങ്ങൾ.", + "eg_mail_example_com": "ഉദാ. mail@example.com", + "eg_xyz": "ഉദാ. XYZ", + "email": "ഇമെയിൽ വിലാസം", + "email_address": "ഇമെയിൽ വിലാസം", + "email_discharge_summary_description": "ഡിസ്ചാർജ് സംഗ്രഹം ലഭിക്കുന്നതിന് നിങ്ങളുടെ സാധുവായ ഇമെയിൽ വിലാസം നൽകുക", + "email_success": "ഞങ്ങൾ ഉടൻ ഒരു ഇമെയിൽ അയയ്ക്കും. ദയവായി നിങ്ങളുടെ ഇൻബോക്സ് പരിശോധിക്കുക.", + "emergency": "അടിയന്തരാവസ്ഥ", + "emergency_contact_number": "എമർജൻസി കോൺടാക്റ്റ് നമ്പർ", + "empty_date_time": "--:-- --; ------------", + "encounter_date_field_label__A": "സൗകര്യത്തിലേക്കുള്ള പ്രവേശന തീയതിയും സമയവും", + "encounter_date_field_label__DC": "ഡൊമിസിലിയറി കെയർ ആരംഭിച്ച തീയതിയും സമയവും", + "encounter_date_field_label__DD": "കൂടിയാലോചനയുടെ തീയതിയും സമയവും", + "encounter_date_field_label__HI": "കൂടിയാലോചനയുടെ തീയതിയും സമയവും", + "encounter_date_field_label__OP": "ഔട്ട്-പേഷ്യൻ്റ് സന്ദർശന തീയതിയും സമയവും", + "encounter_date_field_label__R": "കൂടിയാലോചനയുടെ തീയതിയും സമയവും", + "encounter_duration_confirmation": "ഈ ഏറ്റുമുട്ടലിൻ്റെ ദൈർഘ്യം ഇതായിരിക്കും", + "encounter_suggestion__A": "പ്രവേശനം", + "encounter_suggestion__DC": "ഡൊമിസിലിയറി കെയർ", + "encounter_suggestion__DD": "കൂടിയാലോചന", + "encounter_suggestion__HI": "കൂടിയാലോചന", + "encounter_suggestion__OP": "ഔട്ട് പേഷ്യൻ്റ് സന്ദർശനം", + "encounter_suggestion__R": "കൂടിയാലോചന", + "encounter_suggestion_edit_disallowed": "എഡിറ്റ് കൺസൾട്ടേഷനിൽ ഈ ഓപ്ഷനിലേക്ക് മാറാൻ അനുവാദമില്ല", "enter_file_name": "ഫയലിൻ്റെ പേര് നൽകുക", - "no_files_found": "{{type}} ഫയലുകളൊന്നും കണ്ടെത്തിയില്ല", - "upload_headings__patient": "പുതിയ രോഗി ഫയൽ അപ്‌ലോഡ് ചെയ്യുക", - "upload_headings__consultation": "പുതിയ കൺസൾട്ടേഷൻ ഫയൽ അപ്‌ലോഡ് ചെയ്യുക", - "upload_headings__sample_report": "സാമ്പിൾ റിപ്പോർട്ട് അപ്‌ലോഡ് ചെയ്യുക", - "upload_headings__supporting_info": "സഹായ വിവരങ്ങൾ അപ്‌ലോഡ് ചെയ്യുക", - "file_list_headings__patient": "രോഗിയുടെ ഫയലുകൾ", - "file_list_headings__consultation": "കൺസൾട്ടേഷൻ ഫയലുകൾ", - "file_list_headings__sample_report": "സാമ്പിൾ റിപ്പോർട്ട്", - "file_list_headings__supporting_info": "സഹായ വിവരം", + "enter_valid_age": "ദയവായി പ്രാമാണികമായ വയസ്സ് നൽകുക", + "entered-in-error": "തെറ്റായി നൽകി", + "error_404": "പിശക് 404", + "error_deleting_shifting": "ഷിഫ്റ്റിംഗ് റെക്കോർഡ് ഇല്ലാതാക്കുന്നതിൽ പിശക്", + "error_while_deleting_record": "റെക്കോർഡ് ഇല്ലാതാക്കുന്നതിൽ പിശക്", + "escape": "രക്ഷപ്പെടുക", + "estimated_contact_date": "കണക്കാക്കിയ കോൺടാക്റ്റ് തീയതി", + "expected_burn_rate": "പ്രതീക്ഷിക്കുന്ന പൊള്ളൽ നിരക്ക്", + "facilities": "സൗകര്യങ്ങൾ", + "facility": "സൗകര്യം", + "facility_name": "സൗകര്യത്തിൻ്റെ പേര്", + "facility_preference": "സൗകര്യ മുൻഗണന", + "facility_search_placeholder": "ഫെസിലിറ്റി / ജില്ല പ്രകാരം തിരയുക", + "facility_type": "സൗകര്യ തരം", + "features": "ഫീച്ചറുകൾ", + "feed_is_currently_not_live": "ഫീഡ് നിലവിൽ തത്സമയമല്ല", + "feed_optimal_experience_for_apple_phones": "ഒപ്റ്റിമൽ കാണൽ അനുഭവത്തിനായി, നിങ്ങളുടെ ഉപകരണം തിരിക്കുന്നത് പരിഗണിക്കുക. നിങ്ങളുടെ ഉപകരണ ക്രമീകരണങ്ങളിൽ സ്വയമേവ തിരിയുന്നത് പ്രവർത്തനക്ഷമമാണെന്ന് ഉറപ്പാക്കുക.", + "feed_optimal_experience_for_phones": "ഒപ്റ്റിമൽ കാണൽ അനുഭവത്തിനായി, നിങ്ങളുടെ ഉപകരണം തിരിക്കുന്നത് പരിഗണിക്കുക.", + "field_required": "ഈ ഫീൽഡ് പൂരിപ്പിക്കേണ്ടതുണ്ട്", "file_error__choose_file": "അപ്‌ലോഡ് ചെയ്യാൻ ഒരു ഫയൽ തിരഞ്ഞെടുക്കുക", + "file_error__dynamic": "ഫയൽ അപ്‌ലോഡ് ചെയ്യുന്നതിൽ പിശക്: {{statusText}}", "file_error__file_name": "ഫയലിൻ്റെ പേര് നൽകുക", "file_error__file_size": "ഫയലുകളുടെ പരമാവധി വലുപ്പം 100 MB ആണ്", "file_error__file_type": "അസാധുവായ ഫയൽ തരം \".{{extension}}\" അനുവദനീയമായ തരങ്ങൾ: {{allowedExtensions}}", - "file_uploaded": "ഫയൽ അപ്‌ലോഡ് ചെയ്‌തു", - "file_error__dynamic": "ഫയൽ അപ്‌ലോഡ് ചെയ്യുന്നതിൽ പിശക്: {{statusText}}", "file_error__network": "ഫയൽ അപ്‌ലോഡ് ചെയ്യുന്നതിൽ പിശക്: നെറ്റ്‌വർക്ക് പിശക്", - "monitor": "മോണിറ്റർ", - "show_default_presets": "ഡിഫോൾട്ട് പ്രീസെറ്റുകൾ കാണിക്കുക", - "show_patient_presets": "രോഗിയുടെ പ്രീസെറ്റുകൾ കാണിക്കുക", - "moving_camera": "ചലിക്കുന്ന ക്യാമറ", + "file_list_headings__consultation": "കൺസൾട്ടേഷൻ ഫയലുകൾ", + "file_list_headings__patient": "രോഗിയുടെ ഫയലുകൾ", + "file_list_headings__sample_report": "സാമ്പിൾ റിപ്പോർട്ട്", + "file_list_headings__supporting_info": "സഹായ വിവരം", + "file_preview": "ഫയൽ പ്രിവ്യൂ", + "file_preview_not_supported": "ഈ ഫയൽ പ്രിവ്യൂ ചെയ്യാൻ കഴിയില്ല. ഇത് ഡൗൺലോഡ് ചെയ്യാൻ ശ്രമിക്കുക.", + "file_uploaded": "ഫയൽ അപ്‌ലോഡ് ചെയ്‌തു", + "filter": "ഫിൽട്ടർ ചെയ്യുക", + "filter_by": "ഇതനുസരിച്ച് ഫിൽട്ടർ ചെയ്യുക", + "filter_by_category": "വിഭാഗം അനുസരിച്ച് ഫിൽട്ടർ ചെയ്യുക", + "filters": "ഫിൽട്ടറുകൾ", + "first_name": "പേരിന്‍റെ ആദ്യഭാഗം", + "footer_body": "കേരള സർക്കാറിന്‍റെ പൂർണ്ണമായ ധാരണയോടും പിന്തുണയോടും കൂടി സർക്കാർ ശ്രമങ്ങളെ പിന്തുണയ്ക്കുന്നതിനായി നൂതന പ്രവർത്തകരുടെയും സന്നദ്ധപ്രവർത്തകരുടെയും ഒരു മൾട്ടി-ഡിസിപ്ലിനറി ടീം രൂപകൽപ്പന ചെയ്ത മാതൃകാപരമായ ഒരു ഓപ്പൺ സോഴ്‌സ് പബ്ലിക് യൂട്ടിലിറ്റിയാണ് കൊറോണ സേഫ് നെറ്റ്‌വർക്ക്.", + "forget_password": "പാസ്‌വേഡ് മറന്നോ?", + "forget_password_instruction": "നിങ്ങളുടെ യൂസർനെയിം/ഉപയോക്തൃനാമം നൽകുക. പാസ്‌വേഡ് പുന: സജ്ജമാക്കാൻ ഞങ്ങൾ ഒരു ലിങ്ക് അയയ്‌ക്കുന്നതായിരിക്കും.", + "frequency": "ആവൃത്തി", "full_screen": "പൂർണ്ണ സ്ക്രീൻ", - "feed_is_currently_not_live": "ഫീഡ് നിലവിൽ തത്സമയമല്ല", - "zoom_out": "സൂം ഔട്ട്", - "zoom_in": "സൂം ഇൻ ചെയ്യുക", - "right": "ശരിയാണ്", + "gender": "ലിംഗഭേദം", + "generate_report": "റിപ്പോർട്ട് സൃഷ്ടിക്കുക", + "generated_summary_caution": "കെയർ സിസ്റ്റത്തിൽ ക്യാപ്‌ചർ ചെയ്‌ത വിവരങ്ങൾ ഉപയോഗിച്ച് കമ്പ്യൂട്ടർ സൃഷ്‌ടിച്ച സംഗ്രഹമാണിത്.", + "generating": "സൃഷ്ടിക്കുന്നു", + "generating_discharge_summary": "ഡിസ്ചാർജ് സംഗ്രഹം സൃഷ്ടിക്കുന്നു", + "get_tests": "ടെസ്റ്റുകൾ നേടുക", + "goal": "ഡിജിറ്റൽ ടൂളുകൾ ഉപയോഗിച്ച് പൊതുജനാരോഗ്യ സേവനങ്ങളുടെ ഗുണനിലവാരവും പ്രവേശനക്ഷമതയും തുടർച്ചയായി മെച്ചപ്പെടുത്തുകയാണ് ഞങ്ങളുടെ ലക്ഷ്യം.", + "help_confirmed": "ഇത് ഒരു സ്ഥിരീകരിച്ച അവസ്ഥയായി കണക്കാക്കാൻ മതിയായ ഡയഗ്നോസ്റ്റിക് കൂടാതെ/അല്ലെങ്കിൽ ക്ലിനിക്കൽ തെളിവുകൾ ഉണ്ട്.", + "help_differential": "രോഗനിർണ്ണയ പ്രക്രിയയ്ക്കും പ്രാഥമിക ചികിത്സയ്ക്കും കൂടുതൽ മാർഗ്ഗനിർദ്ദേശം നൽകുന്നതിന് സാധ്യതയുള്ള (സാധാരണയായി പരസ്പരവിരുദ്ധമായ) രോഗനിർണയങ്ങളിൽ ഒന്ന്.", + "help_entered-in-error": "പ്രസ്‌താവന തെറ്റായി നൽകിയതിനാൽ സാധുതയില്ല.", + "help_provisional": "ഇതൊരു താൽക്കാലിക രോഗനിർണയമാണ് - ഇപ്പോഴും പരിഗണനയിലിരിക്കുന്ന ഒരു സ്ഥാനാർത്ഥി.", + "help_refuted": "തുടർന്നുള്ള ഡയഗ്നോസ്റ്റിക്, ക്ലിനിക്കൽ തെളിവുകൾ വഴി ഈ അവസ്ഥ ഒഴിവാക്കിയിട്ടുണ്ട്.", + "help_unconfirmed": "ഇത് ഒരു സ്ഥിരീകരിച്ച അവസ്ഥയായി കണക്കാക്കാൻ മതിയായ ഡയഗ്നോസ്റ്റിക് കൂടാതെ/അല്ലെങ്കിൽ ക്ലിനിക്കൽ തെളിവുകൾ ഇല്ല.", + "hide": "മറയ്ക്കുക", + "home_facility": "ഹോം സൗകര്യം", + "icd11_as_recommended": "WHO ശുപാർശ ചെയ്യുന്ന ICD-11 പ്രകാരം", + "inconsistent_dosage_units_error": "ഡോസേജ് യൂണിറ്റുകൾ ഒന്നായിരിക്കണം", + "india_1": "ഇന്ത്യ", + "indian_mobile": "ഇന്ത്യൻ മൊബൈൽ", + "indicator": "സൂചകം", + "inidcator_event": "ഇൻഡിക്കേറ്റർ ഇവൻ്റ്", + "instruction_on_titration": "ടൈറ്ററേഷനെക്കുറിച്ചുള്ള നിർദ്ദേശം", + "international_mobile": "അന്താരാഷ്ട്ര മൊബൈൽ", + "invalid_asset_id_msg": "ശ്ശോ! നിങ്ങൾ നൽകിയ അസറ്റ് ഐഡി സാധുതയുള്ളതായി കാണുന്നില്ല.", + "invalid_email": "ദയവായി പ്രാമാണികമായ ഇമെയിൽ വിലാസം നൽകുക", + "invalid_link_msg": "നിങ്ങൾ ഉപയോഗിച്ച പാസ്‌വേഡ് പുനഃസജ്ജീകരണ ലിങ്ക് അസാധുവാണ് അല്ലെങ്കിൽ കാലഹരണപ്പെട്ടതായി തോന്നുന്നു. ഒരു പുതിയ പാസ്‌വേഡ് പുനഃസജ്ജീകരണ ലിങ്ക് അഭ്യർത്ഥിക്കുക.", + "invalid_password": "പാസ്‌വേഡ് ആവശ്യകതകൾ പാലിക്കുന്നില്ല", + "invalid_password_reset_link": "അസാധുവായ പാസ്‌വേഡ് പുനഃസജ്ജീകരണ ലിങ്ക്", + "invalid_phone": "ദയവായി പ്രാമാണികമായ ഫോൺ നമ്പർ നൽകുക", + "invalid_phone_number": "അസാധുവായ ഫോൺ നമ്പർ", + "invalid_pincode": "പിൻകോഡ് അസാധുവാണ്", + "invalid_reset": "അസാധുവായ റീസെറ്റ്", + "invalid_username": "അനിവാര്യം. 150 ചിഹ്നമോ, അക്ഷരമോ, സംഖ്യയോ അതിൽ കുറവോ. അക്ഷരങ്ങൾ, അക്കങ്ങൾ, @/./+/-/_ മാത്രം ഉപയോഗിക്കുക.", + "inventory_management": "ഇൻവെൻ്ററി മാനേജ്മെൻ്റ്", + "investigation_reports": "അന്വേഷണ റിപ്പോർട്ടുകൾ", + "investigations": "അന്വേഷണങ്ങൾ", + "investigations__date": "തീയതി", + "investigations__ideal_value": "അനുയോജ്യമായ മൂല്യം", + "investigations__name": "പേര്", + "investigations__range": "മൂല്യ ശ്രേണി", + "investigations__result": "ഫലം", + "investigations__unit": "യൂണിറ്റ്", + "investigations_suggested": "അന്വേഷണങ്ങൾ നിർദ്ദേശിച്ചു", + "is": "ആണ്", + "is_antenatal": "ജനനത്തിനു മുമ്പുള്ളതാണ്", + "is_emergency": "അടിയന്തരാവസ്ഥയാണ്", + "is_emergency_case": "അടിയന്തര സാഹചര്യമാണ്", + "is_it_upshift": "അത് ഉയർച്ചയാണോ?", + "is_this_an_emergency": "ഇതൊരു അടിയന്തരാവസ്ഥയാണോ?", + "is_this_an_upshift": "ഇതൊരു ഉയർച്ചയാണോ?", + "is_up_shift": "ഷിഫ്റ്റ് ആയി", + "is_upshift_case": "കേസ് മാറ്റി", + "landline": "ഇന്ത്യൻ ലാൻഡ്‌ലൈൻ", + "last_administered": "അവസാനം ഭരിച്ചത്", + "last_edited": "അവസാനം എഡിറ്റ് ചെയ്തത്", + "last_modified": "അവസാനം പരിഷ്കരിച്ചത്", + "last_name": "പേരിന്‍റെ അവസാന ഭാഗം", + "last_online": "അവസാനമായി ഓൺലൈൻ", + "last_serviced_on": "അവസാനം സർവീസ് ചെയ്തത്", + "latitude_invalid": "അക്ഷാംശം -90 നും 90 നും ഇടയിലായിരിക്കണം", "left": "ഇടത്", - "down": "താഴേക്ക്", - "up": "മുകളിലേക്ക്", - "RESPIRATORY_SUPPORT_SHORT__UNKNOWN": "ഒന്നുമില്ല", - "RESPIRATORY_SUPPORT_SHORT__OXYGEN_SUPPORT": "O2 പിന്തുണ", - "RESPIRATORY_SUPPORT_SHORT__NON_INVASIVE": "എൻ.ഐ.വി", - "RESPIRATORY_SUPPORT_SHORT__INVASIVE": "IV", - "RESPIRATORY_SUPPORT__UNKNOWN": "ഒന്നുമില്ല", - "RESPIRATORY_SUPPORT__OXYGEN_SUPPORT": "ഓക്സിജൻ പിന്തുണ", - "RESPIRATORY_SUPPORT__NON_INVASIVE": "നോൺ-ഇൻവേസീവ് വെൻ്റിലേറ്റർ (NIV)", - "RESPIRATORY_SUPPORT__INVASIVE": "ആക്രമണാത്മക വെൻ്റിലേറ്റർ (IV)", - "VENTILATOR_MODE__CMV": "കൺട്രോൾ മെക്കാനിക്കൽ വെൻ്റിലേഷൻ (CMV)", - "VENTILATOR_MODE__VCV": "വോളിയം കൺട്രോൾ വെൻ്റിലേഷൻ (VCV)", - "VENTILATOR_MODE__PCV": "പ്രഷർ കൺട്രോൾ വെൻ്റിലേഷൻ (PCV)", - "VENTILATOR_MODE__SIMV": "സിൻക്രൊണൈസ്ഡ് ഇൻ്റർമിറ്റൻറ് നിർബന്ധിത വെൻ്റിലേഷൻ (SIMV)", - "VENTILATOR_MODE__VC_SIMV": "വോളിയം നിയന്ത്രിത SIMV (VC-SIMV)", - "VENTILATOR_MODE__PC_SIMV": "പ്രഷർ കൺട്രോൾഡ് SIMV (PC-SIMV)", - "VENTILATOR_MODE__PSV": "C-PAP / പ്രഷർ സപ്പോർട്ട് വെൻ്റിലേഷൻ (PSV)", - "CONSCIOUSNESS_LEVEL__UNRESPONSIVE": "പ്രതികരിക്കുന്നില്ല", - "CONSCIOUSNESS_LEVEL__RESPONDS_TO_PAIN": "വേദനയോട് പ്രതികരിക്കുന്നു", - "CONSCIOUSNESS_LEVEL__RESPONDS_TO_VOICE": "ശബ്ദത്തോട് പ്രതികരിക്കുന്നു", - "CONSCIOUSNESS_LEVEL__ALERT": "മുന്നറിയിപ്പ്", - "CONSCIOUSNESS_LEVEL__AGITATED_OR_CONFUSED": "അസ്വസ്ഥതയോ ആശയക്കുഴപ്പത്തിലോ", - "CONSCIOUSNESS_LEVEL__ONSET_OF_AGITATION_AND_CONFUSION": "പ്രക്ഷോഭത്തിൻ്റെയും ആശയക്കുഴപ്പത്തിൻ്റെയും തുടക്കം", - "PUPIL_REACTION__UNKNOWN": "അജ്ഞാതം", - "PUPIL_REACTION__BRISK": "ചടുലമായ", - "PUPIL_REACTION__SLUGGISH": "ആലസ്യം", - "PUPIL_REACTION__FIXED": "പരിഹരിച്ചു", - "PUPIL_REACTION__CANNOT_BE_ASSESSED": "വിലയിരുത്താൻ കഴിയില്ല", - "LIMB_RESPONSE__UNKNOWN": "അജ്ഞാതം", - "LIMB_RESPONSE__STRONG": "ശക്തമായ", - "LIMB_RESPONSE__MODERATE": "മിതത്വം", - "LIMB_RESPONSE__WEAK": "ദുർബലമായ", - "LIMB_RESPONSE__FLEXION": "ഫ്ലെക്സിഷൻ", - "LIMB_RESPONSE__EXTENSION": "വിപുലീകരണം", - "LIMB_RESPONSE__NONE": "ഒന്നുമില്ല", - "OXYGEN_MODALITY__NASAL_PRONGS": "നാസൽ പ്രോംഗ്സ്", - "OXYGEN_MODALITY__SIMPLE_FACE_MASK": "ലളിതമായ മുഖംമൂടി", - "OXYGEN_MODALITY__NON_REBREATHING_MASK": "നോൺ റീബ്രീത്തിംഗ് മാസ്ക്", - "OXYGEN_MODALITY__HIGH_FLOW_NASAL_CANNULA": "ഉയർന്ന ഒഴുക്ക് നാസൽ കാനുല", - "INSULIN_INTAKE_FREQUENCY__UNKNOWN": "അജ്ഞാതം", - "INSULIN_INTAKE_FREQUENCY__OD": "ദിവസത്തിൽ ഒരിക്കൽ (OD)", - "INSULIN_INTAKE_FREQUENCY__BD": "ദിവസത്തിൽ രണ്ടുതവണ (BD)", - "INSULIN_INTAKE_FREQUENCY__TD": "ദിവസത്തിൽ മൂന്ന് തവണ (ടിഡി)", - "NURSING_CARE_PROCEDURE__personal_hygiene": "വ്യക്തിഗത ശുചിത്വം", - "NURSING_CARE_PROCEDURE__positioning": "സ്ഥാനനിർണ്ണയം", - "NURSING_CARE_PROCEDURE__suctioning": "സക്ഷനിംഗ്", - "NURSING_CARE_PROCEDURE__ryles_tube_care": "റൈൽസ് ട്യൂബ് കെയർ", - "NURSING_CARE_PROCEDURE__iv_sitecare": "IV സൈറ്റ് കെയർ", - "NURSING_CARE_PROCEDURE__nubulisation": "നുബുലൈസേഷൻ", - "NURSING_CARE_PROCEDURE__dressing": "വസ്ത്രധാരണം", - "NURSING_CARE_PROCEDURE__dvt_pump_stocking": "ഡിവിടി പമ്പ് സ്റ്റോക്കിംഗ്", - "NURSING_CARE_PROCEDURE__restrain": "നിയന്ത്രിക്കുക", - "NURSING_CARE_PROCEDURE__chest_tube_care": "ചെസ്റ്റ് ട്യൂബ് കെയർ", - "NURSING_CARE_PROCEDURE__tracheostomy_care": "ട്രാക്കിയോസ്റ്റമി കെയർ", - "NURSING_CARE_PROCEDURE__stoma_care": "സ്റ്റോമ കെയർ", - "NURSING_CARE_PROCEDURE__catheter_care": "കത്തീറ്റർ കെയർ", - "HEARTBEAT_RHYTHM__REGULAR": "പതിവ്", - "HEARTBEAT_RHYTHM__IRREGULAR": "ക്രമരഹിതം", - "HEARTBEAT_RHYTHM__UNKNOWN": "അജ്ഞാതം", + "linked_facilities": "ബന്ധിപ്പിച്ച സൗകര്യങ്ങൾ", + "liquid_oxygen_capacity": "ദ്രാവക ഓക്സിജൻ ശേഷി", + "list_view": "ലിസ്റ്റ് കാഴ്ച", + "litres": "ലിറ്റർ", + "litres_per_day": "ലിറ്റർ / ദിവസം", + "live": "തത്സമയം", + "live_monitoring": "തത്സമയ നിരീക്ഷണം", + "load_more": "കൂടുതൽ ലോഡ് ചെയ്യുക", + "loading": "ലോഡ് ചെയ്യുന്നു...", + "local_body": "തദ്ദേശ സ്ഥാപനം", + "local_ipaddress": "പ്രാദേശിക ഐപി വിലാസം", + "location": "സ്ഥാനം", + "location_management": "ലൊക്കേഷൻ മാനേജ്മെൻ്റ്", + "log_lab_results": "ലോഗ് ലാബ് ഫലങ്ങൾ", + "log_report": "ലോഗ് റിപ്പോർട്ട്", + "login": "ലോഗിൻ ചെയ്യുക/അകത്തു പ്രവേശിക്കുക", + "longitude_invalid": "രേഖാംശം -180 നും 180 നും ഇടയിലായിരിക്കണം", + "lsg": "Lsg", + "make_multiple_beds_label": "നിങ്ങൾക്ക് ഒന്നിലധികം കിടക്കകൾ നിർമ്മിക്കണോ?", + "manage_prescriptions": "കുറിപ്പടികൾ കൈകാര്യം ചെയ്യുക", + "manufacturer": "നിർമ്മാതാവ്", "map_acronym": "മാപ്പ്", - "systolic": "സിസ്റ്റോളിക്", - "diastolic": "ഡയസ്റ്റോളിക്", - "pain": "വേദന", - "pain_chart_description": "വേദനയുടെ പ്രദേശവും തീവ്രതയും അടയാളപ്പെടുത്തുക", - "bradycardia": "ബ്രാഡികാർഡിയ", - "tachycardia": "ടാക്കിക്കാർഡിയ", - "medicine": "മരുന്ന്", - "route": "റൂട്ട്", - "dosage": "അളവ്", - "base_dosage": "അളവ്", - "start_dosage": "ഡോസ് ആരംഭിക്കുക", - "target_dosage": "ടാർഗെറ്റ് ഡോസ്", - "instruction_on_titration": "ടൈറ്ററേഷനെക്കുറിച്ചുള്ള നിർദ്ദേശം", - "titrate_dosage": "ടൈട്രേറ്റ് ഡോസ്", - "indicator": "സൂചകം", - "inidcator_event": "ഇൻഡിക്കേറ്റർ ഇവൻ്റ്", + "mark_all_as_read": "എല്ലാം വായിച്ചതായി അടയാളപ്പെടുത്തുക", + "mark_as_read": "വായിച്ചതായി അടയാളപ്പെടുത്തുക", + "mark_as_unread": "വായിക്കാത്തതായി അടയാളപ്പെടുത്തുക", + "mark_this_transfer_as_complete_question": "ഈ കൈമാറ്റം പൂർത്തിയായതായി അടയാളപ്പെടുത്തണമെന്ന് തീർച്ചയാണോ? ഒറിജിൻ സൗകര്യത്തിന് ഈ രോഗിക്ക് ഇനി ആക്‌സസ് ഉണ്ടായിരിക്കില്ല", + "mark_transfer_complete_confirmation": "ഈ കൈമാറ്റം പൂർത്തിയായതായി അടയാളപ്പെടുത്തണമെന്ന് തീർച്ചയാണോ? ഒറിജിൻ സൗകര്യത്തിന് ഈ രോഗിക്ക് ഇനി ആക്‌സസ് ഉണ്ടായിരിക്കില്ല", "max_dosage_24_hrs": "പരമാവധി. 24 മണിക്കൂറിനുള്ളിൽ ഡോസ്.", - "min_time_bw_doses": "മിനി. സമയം b/w ഡോസുകൾ", - "manage_prescriptions": "കുറിപ്പടികൾ കൈകാര്യം ചെയ്യുക", - "prescription_details": "കുറിപ്പടി വിശദാംശങ്ങൾ", - "prescription_medications": "കുറിപ്പടി മരുന്നുകൾ", - "prn_prescriptions": "PRN കുറിപ്പടികൾ", - "prescription": "കുറിപ്പടി", - "discharge_prescription": "ഡിസ്ചാർജ് കുറിപ്പടി", - "edit_prescriptions": "കുറിപ്പടികൾ എഡിറ്റ് ചെയ്യുക", - "prescription_medication": "കുറിപ്പടി മരുന്ന്", - "add_prescription_medication": "കുറിപ്പടി മരുന്ന് ചേർക്കുക", - "prn_prescription": "PRN കുറിപ്പടി", - "add_prn_prescription": "PRN കുറിപ്പടി ചേർക്കുക", - "add_prescription_to_consultation_note": "ഈ കൺസൾട്ടേഷനിലേക്ക് ഒരു പുതിയ കുറിപ്പടി ചേർക്കുക.", + "max_dosage_in_24hrs_gte_base_dosage_error": "പരമാവധി. 24 മണിക്കൂറിനുള്ളിലെ ഡോസ് അടിസ്ഥാന ഡോസേജിനേക്കാൾ കൂടുതലോ തുല്യമോ ആയിരിക്കണം", + "max_size_for_image_uploaded_should_be": "അപ്‌ലോഡ് ചെയ്‌ത ചിത്രത്തിനുള്ള പരമാവധി വലുപ്പം ആയിരിക്കണം", + "medical_worker": "മെഡിക്കൽ വർക്കർ", + "medicine": "മരുന്ന്", "medicine_administration_history": "മെഡിസിൻ അഡ്മിനിസ്ട്രേഷൻ ചരിത്രം", - "return_to_patient_dashboard": "പേഷ്യൻ്റ് ഡാഷ്‌ബോർഡിലേക്ക് മടങ്ങുക", - "administered_on": "മേൽ നടത്തി", - "administer": "ഭരണം നടത്തുക", - "administer_medicine": "മെഡിസിൻ നടത്തുക", - "administer_medicines": "മരുന്നുകൾ നൽകുക", - "administer_selected_medicines": "തിരഞ്ഞെടുത്ത മരുന്നുകൾ നൽകുക", - "select_for_administration": "അഡ്മിനിസ്ട്രേഷനായി തിരഞ്ഞെടുക്കുക", "medicines_administered": "മരുന്ന്(കൾ) നൽകി", "medicines_administered_error": "മരുന്ന്(കൾ) നൽകുന്നതിൽ പിശക്", - "prescription_discontinued": "കുറിപ്പടി നിർത്തലാക്കി", - "administration_notes": "അഡ്മിനിസ്ട്രേഷൻ കുറിപ്പുകൾ", - "last_administered": "അവസാനം ഭരിച്ചത്", - "prescription_logs": "കുറിപ്പടി രേഖകൾ", + "middleware_hostname": "മിഡിൽവെയർ ഹോസ്റ്റ്നാമം", + "min_password_len_8": "ഏറ്റവും കുറഞ്ഞ പാസ്‌വേഡ് ദൈർഘ്യം 8", + "min_time_bw_doses": "മിനി. സമയം b/w ഡോസുകൾ", + "mobile": "മൊബൈൽ", + "mobile_number": "മൊബൈൽ നമ്പർ", "modification_caution_note": "ഒരിക്കൽ ചേർത്തുകഴിഞ്ഞാൽ മാറ്റങ്ങളൊന്നും സാധ്യമല്ല", - "discontinue_caution_note": "ഈ കുറിപ്പടി നിർത്തണമെന്ന് തീർച്ചയാണോ?", - "confirm_discontinue": "നിർത്തലാക്കൽ സ്ഥിരീകരിക്കുക", - "edit_caution_note": "കൺസൾട്ടേഷനിൽ എഡിറ്റ് ചെയ്ത വിശദാംശങ്ങളോടൊപ്പം ഒരു പുതിയ കുറിപ്പടി ചേർക്കുകയും നിലവിലുള്ള കുറിപ്പടി നിർത്തലാക്കുകയും ചെയ്യും.", - "reason_for_discontinuation": "നിർത്തലാക്കാനുള്ള കാരണം", - "reason_for_edit": "തിരുത്താനുള്ള കാരണം", - "PRESCRIPTION_ROUTE_ORAL": "വാമൊഴി", - "PRESCRIPTION_ROUTE_IV": "IV", - "PRESCRIPTION_ROUTE_IM": "ഐ.എം", - "PRESCRIPTION_ROUTE_SC": "എസ്/സി", - "PRESCRIPTION_ROUTE_INHALATION": "ഇൻഹാലേഷൻ", - "PRESCRIPTION_ROUTE_NASOGASTRIC": "നാസോഗാസ്ട്രിക് / ഗ്യാസ്ട്രോസ്റ്റമി ട്യൂബ്", - "PRESCRIPTION_ROUTE_INTRATHECAL": "ഇൻട്രാതെക്കൽ കുത്തിവയ്പ്പ്", - "PRESCRIPTION_ROUTE_TRANSDERMAL": "ട്രാൻസ്ഡെർമൽ", - "PRESCRIPTION_ROUTE_RECTAL": "മലദ്വാരം", - "PRESCRIPTION_ROUTE_SUBLINGUAL": "ഉപഭാഷാപരമായ", - "PRESCRIPTION_FREQUENCY_STAT": "ഉടനെ", - "PRESCRIPTION_FREQUENCY_OD": "ദിവസത്തിൽ ഒരിക്കൽ", - "PRESCRIPTION_FREQUENCY_HS": "രാത്രി മാത്രം", - "PRESCRIPTION_FREQUENCY_BD": "ദിവസേന രണ്ടുതവണ", - "PRESCRIPTION_FREQUENCY_TID": "എട്ടാം മണിക്കൂർ", - "PRESCRIPTION_FREQUENCY_QID": "ആറാം മണിക്കൂർ", - "PRESCRIPTION_FREQUENCY_Q4H": "നാലാമത്തെ മണിക്കൂർ", - "PRESCRIPTION_FREQUENCY_QOD": "ഇതര ദിവസം", - "PRESCRIPTION_FREQUENCY_QWK": "ആഴ്ചയിൽ ഒരിക്കൽ", - "inconsistent_dosage_units_error": "ഡോസേജ് യൂണിറ്റുകൾ ഒന്നായിരിക്കണം", - "max_dosage_in_24hrs_gte_base_dosage_error": "പരമാവധി. 24 മണിക്കൂറിനുള്ളിലെ ഡോസ് അടിസ്ഥാന ഡോസേജിനേക്കാൾ കൂടുതലോ തുല്യമോ ആയിരിക്കണം", - "administration_dosage_range_error": "ഡോസ് ആരംഭത്തിനും ടാർഗെറ്റ് ഡോസേജിനും ഇടയിലായിരിക്കണം", + "modified": "പരിഷ്കരിച്ചു", + "modified_date": "പരിഷ്കരിച്ച തീയതി", + "monitor": "മോണിറ്റർ", + "more_info": "കൂടുതൽ വിവരങ്ങൾ", + "moving_camera": "ചലിക്കുന്ന ക്യാമറ", + "name": "പേര്", + "name_of_hospital": "ആശുപത്രിയുടെ പേര്", + "name_of_shifting_approving_facility": "ഷിഫ്റ്റിംഗ് അപ്രൂവിംഗ് സൗകര്യത്തിൻ്റെ പേര്", + "nationality": "ദേശീയത", + "never": "ഒരിക്കലും", + "new_password": "പുതിയ പാസ്‌വേഡ്", + "next_sessions": "അടുത്ത സെഷനുകൾ", + "no": "ഇല്ല", + "no_bed_types_found": "കിടക്ക തരങ്ങളൊന്നും കണ്ടെത്തിയില്ല", + "no_changes": "മാറ്റങ്ങളൊന്നുമില്ല", + "no_changes_made": "മാറ്റങ്ങളൊന്നും വരുത്തിയിട്ടില്ല", + "no_consultation_updates": "കൺസൾട്ടേഷൻ അപ്‌ഡേറ്റുകളൊന്നുമില്ല", + "no_cover_photo_uploaded_for_this_facility": "ഈ സൗകര്യത്തിനായി കവർ ഫോട്ടോ അപ്‌ലോഡ് ചെയ്‌തിട്ടില്ല", + "no_data_found": "വിവരങ്ങളൊന്നും കണ്ടെത്തിയില്ല", + "no_duplicate_facility": "അനധികൃതമായി ഫെസിലിറ്റികള്‍ സൃഷ്ടിക്കരുത്", + "no_facilities": "ഫെസിലിറ്റികളൊന്നും കണ്ടെത്തുവാനായില്ല", + "no_files_found": "{{type}} ഫയലുകളൊന്നും കണ്ടെത്തിയില്ല", + "no_home_facility": "വീടിനുള്ള സൗകര്യം നൽകിയിട്ടില്ല", + "no_investigation": "അന്വേഷണ റിപ്പോർട്ടുകളൊന്നും കണ്ടെത്തിയില്ല", + "no_investigation_suggestions": "അന്വേഷണ നിർദ്ദേശങ്ങളൊന്നുമില്ല", + "no_linked_facilities": "ലിങ്ക്ഡ് സൗകര്യങ്ങളൊന്നുമില്ല", + "no_log_update_delta": "മുമ്പത്തെ ലോഗ് അപ്ഡേറ്റ് മുതൽ മാറ്റങ്ങളൊന്നുമില്ല", "no_notices_for_you": "നിങ്ങൾക്കായി അറിയിപ്പുകളൊന്നുമില്ല.", - "mark_as_read": "വായിച്ചതായി അടയാളപ്പെടുത്തുക", - "mark_as_unread": "വായിക്കാത്തതായി അടയാളപ്പെടുത്തുക", - "subscribe": "സബ്സ്ക്രൈബ് ചെയ്യുക", - "subscribe_on_this_device": "ഈ ഉപകരണത്തിൽ സബ്സ്ക്രൈബ് ചെയ്യുക", + "no_patients_to_show": "കാണിക്കാൻ രോഗികളില്ല.", + "no_results_found": "ഫലങ്ങളൊന്നും കണ്ടെത്തിയില്ല", + "no_staff": "ജീവനക്കാരെ കണ്ടെത്തിയില്ല", + "no_treating_physicians_available": "ഈ സൗകര്യത്തിന് ഹോം ഫെസിലിറ്റി ഡോക്ടർമാരില്ല. ദയവായി നിങ്ങളുടെ അഡ്‌മിനെ ബന്ധപ്പെടുക.", + "no_users_found": "ഉപയോക്താക്കളെ കണ്ടെത്തിയില്ല", + "none": "ഒന്നുമില്ല", + "normal": "സാധാരണ", + "not_specified": "വ്യക്തമാക്കിയിട്ടില്ല", + "notes": "കുറിപ്പുകൾ", + "notes_placeholder": "നിങ്ങളുടെ കുറിപ്പുകൾ ടൈപ്പ് ചെയ്യുക", "notification_permission_denied": "അറിയിപ്പ് അനുമതി നിഷേധിച്ചു", "notification_permission_granted": "അറിയിപ്പ് അനുമതി നൽകി", - "show_unread_notifications": "വായിക്കാത്തത് കാണിക്കുക", - "show_all_notifications": "എല്ലാം കാണിക്കുക", - "filter_by_category": "വിഭാഗം അനുസരിച്ച് ഫിൽട്ടർ ചെയ്യുക", - "mark_all_as_read": "എല്ലാം വായിച്ചതായി അടയാളപ്പെടുത്തുക", - "reload": "വീണ്ടും ലോഡുചെയ്യുക", - "no_results_found": "ഫലങ്ങളൊന്നും കണ്ടെത്തിയില്ല", - "load_more": "കൂടുതൽ ലോഡ് ചെയ്യുക", - "subscription_error": "സബ്സ്ക്രിപ്ഷൻ പിശക്", - "unsubscribe_failed": "അൺസബ്‌സ്‌ക്രൈബ് ചെയ്യാനായില്ല.", - "unsubscribe": "അൺസബ്സ്ക്രൈബ് ചെയ്യുക", - "escape": "രക്ഷപ്പെടുക", - "invalid_asset_id_msg": "ശ്ശോ! നിങ്ങൾ നൽകിയ അസറ്റ് ഐഡി സാധുതയുള്ളതായി കാണുന്നില്ല.", - "asset_not_found_msg": "ശ്ശോ! നിങ്ങൾ അന്വേഷിക്കുന്ന അസറ്റ് നിലവിലില്ല. അസറ്റ് ഐഡി പരിശോധിക്കുക.", - "create_resource_request": "റിസോഴ്സ് അഭ്യർത്ഥന സൃഷ്ടിക്കുക", - "contact_person": "ഫെസിലിറ്റിയിൽ ബന്ധപ്പെടുന്ന വ്യക്തിയുടെ പേര്", - "approving_facility": "അംഗീകാരം നൽകുന്ന സൗകര്യത്തിൻ്റെ പേര്", - "contact_phone": "ബന്ധപ്പെടാനുള്ള വ്യക്തി നമ്പർ", + "number_of_aged_dependents_above_60": "പ്രായമായ ആശ്രിതരുടെ എണ്ണം (60-ൽ കൂടുതൽ)", + "number_of_beds": "കിടക്കകളുടെ എണ്ണം", + "number_of_beds_out_of_range_error": "കിടക്കകളുടെ എണ്ണം 100-ൽ കൂടരുത്", + "number_of_chronic_diseased_dependents": "വിട്ടുമാറാത്ത രോഗങ്ങളെ ആശ്രയിക്കുന്നവരുടെ എണ്ണം", + "on": "ഓൺ", + "ongoing_medications": "നടന്നുകൊണ്ടിരിക്കുന്ന മരുന്നുകൾ", + "open": "തുറക്കുക", + "open_camera": "ക്യാമറ തുറക്കുക", + "open_live_monitoring": "ലൈവ് മോണിറ്ററിംഗ് തുറക്കുക", + "optional": "ഓപ്ഷണൽ", + "ordering": "ഓർഡർ ചെയ്യുന്നു", + "origin_facility": "നിലവിലെ സൗകര്യം", + "oxygen_information": "ഓക്സിജൻ വിവരങ്ങൾ", + "page_not_found": "പേജ് കണ്ടെത്തിയില്ല", + "pain": "വേദന", + "pain_chart_description": "വേദനയുടെ പ്രദേശവും തീവ്രതയും അടയാളപ്പെടുത്തുക", + "passport_number": "പാസ്പോർട്ട് നമ്പർ", + "password": "പാസ്‌വേഡ്", + "password_mismatch": "പാസ്‌വേഡും ഉറപ്പാക്കിയ പാസ്‌വേഡും സമാനമായിരിക്കണം", + "password_reset_failure": "പാസ്‌വേഡ് പുന: സജ്ജീകരണം പരാജയപ്പെട്ടു", + "password_reset_success": "പാസ്‌വേഡ് പുന: സജ്ജീകരണം വിജയിച്ചു", + "password_sent": "പാസ്‌വേഡ് പുന: സജ്ജീകരണ ലിങ്ക് അയച്ചിട്ടുണ്ട്", + "patient_address": "രോഗിയുടെ വിലാസം", + "patient_category": "രോഗികളുടെ വിഭാഗം", + "patient_consultation__admission": "പ്രവേശന തീയതി", + "patient_consultation__consultation_notes": "പൊതു നിർദ്ദേശങ്ങൾ", + "patient_consultation__dc_admission": "ഡൊമിസിലിയറി കെയർ ആരംഭിച്ച തീയതി", + "patient_consultation__ip": "ഐ.പി", + "patient_consultation__op": "ഒ.പി", + "patient_consultation__special_instruction": "പ്രത്യേക നിർദ്ദേശങ്ങൾ", + "patient_consultation__treatment__plan": "പ്ലാൻ ചെയ്യുക", + "patient_consultation__treatment__summary": "സംഗ്രഹം", + "patient_consultation__treatment__summary__date": "തീയതി", + "patient_consultation__treatment__summary__spo2": "SpO2", + "patient_consultation__treatment__summary__temperature": "താപനില", + "patient_created": "രോഗിയെ സൃഷ്ടിച്ചു", + "patient_name": "രോഗിയുടെ പേര്", + "patient_no": "OP/IP നമ്പർ", + "patient_phone_number": "രോഗിയുടെ ഫോൺ നമ്പർ", + "patient_registration__address": "വിലാസം", + "patient_registration__age": "പ്രായം", + "patient_registration__comorbidities": "കോമോർബിഡിറ്റികൾ", + "patient_registration__comorbidities__details": "വിശദാംശങ്ങൾ", + "patient_registration__comorbidities__disease": "രോഗം", + "patient_registration__contact": "അടിയന്തര കോൺടാക്റ്റ്", + "patient_registration__gender": "ലിംഗഭേദം", + "patient_registration__name": "പേര്", + "patient_state": "രോഗിയുടെ അവസ്ഥ", + "patient_status": "രോഗിയുടെ അവസ്ഥ", + "patient_transfer_birth_match_note": "ശ്രദ്ധിക്കുക: ട്രാൻസ്ഫർ അഭ്യർത്ഥന പ്രോസസ്സ് ചെയ്യുന്നതിന് ജനന വർഷം രോഗിയുമായി പൊരുത്തപ്പെടണം.", + "phone": "ഫോൺ", + "phone_no": "ഫോൺ നമ്പർ.", + "phone_number": "ഫോൺ നമ്പർ", + "phone_number_at_current_facility": "നിലവിലെ സൗകര്യത്തിൽ ബന്ധപ്പെടുന്ന വ്യക്തിയുടെ ഫോൺ നമ്പർ", + "pincode": "പിൻകോഡ്", + "please_enter_a_reason_for_the_shift": "ഷിഫ്റ്റിനുള്ള കാരണം നൽകുക.", + "please_select_a_facility": "ദയവായി ഒരു സൗകര്യം തിരഞ്ഞെടുക്കുക", + "please_select_breathlessness_level": "ശ്വാസതടസ്സം നില തിരഞ്ഞെടുക്കുക", + "please_select_facility_type": "ദയവായി സൗകര്യത്തിൻ്റെ തരം തിരഞ്ഞെടുക്കുക", + "please_select_patient_category": "ദയവായി രോഗി വിഭാഗം തിരഞ്ഞെടുക്കുക", + "please_select_preferred_vehicle_type": "ദയവായി തിരഞ്ഞെടുത്ത വാഹന തരം തിരഞ്ഞെടുക്കുക", + "please_select_status": "ദയവായി സ്റ്റാറ്റസ് തിരഞ്ഞെടുക്കുക", + "please_upload_a_csv_file": "ദയവായി ഒരു CSV ഫയൽ അപ്‌ലോഡ് ചെയ്യുക", + "post_your_comment": "നിങ്ങളുടെ അഭിപ്രായം പോസ്റ്റ് ചെയ്യുക", + "powered_by": "പ്രായോജകർ", + "preferred_facility_type": "ഇഷ്ടപ്പെട്ട സൗകര്യ തരം", + "preferred_vehicle": "ഇഷ്ടപ്പെട്ട വാഹനം", + "prescription": "കുറിപ്പടി", + "prescription_details": "കുറിപ്പടി വിശദാംശങ്ങൾ", + "prescription_discontinued": "കുറിപ്പടി നിർത്തലാക്കി", + "prescription_logs": "കുറിപ്പടി രേഖകൾ", + "prescription_medication": "കുറിപ്പടി മരുന്ന്", + "prescription_medications": "കുറിപ്പടി മരുന്നുകൾ", + "prescriptions__dosage_frequency": "അളവും ആവൃത്തിയും", + "prescriptions__medicine": "മരുന്ന്", + "prescriptions__route": "റൂട്ട്", + "prescriptions__start_date": "നിർദ്ദേശിച്ചിരിക്കുന്നത്", + "prev_sessions": "മുൻ സെഷനുകൾ", + "principal": "പ്രിൻസിപ്പൽ", + "principal_diagnosis": "പ്രധാന രോഗനിർണയം", + "print": "അച്ചടിക്കുക", + "print_referral_letter": "റഫറൽ കത്ത് അച്ചടിക്കുക", + "prn_prescription": "PRN കുറിപ്പടി", + "prn_prescriptions": "PRN കുറിപ്പടികൾ", + "procedure_suggestions": "നടപടിക്രമ നിർദ്ദേശങ്ങൾ", + "provisional": "താൽക്കാലികം", + "ration_card__APL": "എ.പി.എൽ", + "ration_card__BPL": "ബി.പി.എൽ", + "ration_card__NO_CARD": "നോൺ-കാർഡ് ഹോൾഡർ", + "reason": "കാരണം", + "reason_for_discontinuation": "നിർത്തലാക്കാനുള്ള കാരണം", + "reason_for_edit": "തിരുത്താനുള്ള കാരണം", + "reason_for_referral": "റഫറൽ ചെയ്യാനുള്ള കാരണം", + "reason_for_shift": "ഷിഫ്റ്റിനുള്ള കാരണം", + "recommended_aspect_ratio_for": "ഇതിനായി ശുപാർശ ചെയ്യുന്ന വീക്ഷണ അനുപാതം", + "record": "റെക്കോർഡ് ഓഡിയോ", + "record_delete_confirm": "ഈ റെക്കോർഡ് ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ?", + "record_has_been_deleted_successfully": "റെക്കോർഡ് വിജയകരമായി ഇല്ലാതാക്കി.", + "record_updates": "റെക്കോർഡ് അപ്ഡേറ്റുകൾ", + "recording": "റെക്കോർഡിംഗ്", + "redirected_to_create_consultation": "ശ്രദ്ധിക്കുക: കൺസൾട്ടേഷൻ ഫോം സൃഷ്‌ടിക്കാൻ നിങ്ങളെ റീഡയറക്‌ടുചെയ്യും. കൈമാറ്റ പ്രക്രിയ പൂർത്തിയാക്കാൻ ദയവായി ഫോം പൂരിപ്പിക്കുക", + "referral_letter": "റഫറൽ കത്ത്", + "referred_to": "പരാമർശിച്ചത്", + "refresh_list": "ലിസ്റ്റ് പുതുക്കുക", + "refuted": "നിഷേധിച്ചു", + "register_hospital": "ആശുപത്രി രജിസ്റ്റർ ചെയ്യുക", + "register_page_title": "ആശുപത്രി അഡ്മിനിസ്ട്രേറ്ററായി രജിസ്റ്റർ ചെയ്യുക", + "reload": "വീണ്ടും ലോഡുചെയ്യുക", + "remove": "നീക്കം ചെയ്യുക", + "rename": "പേരുമാറ്റുക", + "report": "റിപ്പോർട്ട് ചെയ്യുക", + "req_atleast_one_digit": "കുറഞ്ഞത് ഒരു അക്കമെങ്കിലും ആവശ്യമാണ്", + "req_atleast_one_lowercase": "കുറഞ്ഞത് ഒരു ചെറിയ അക്ഷരമെങ്കിലും ആവശ്യമാണ്", + "req_atleast_one_symbol": "കുറഞ്ഞത് ഒരു ചിഹ്നമെങ്കിലും ആവശ്യമാണ്", + "req_atleast_one_uppercase": "കുറഞ്ഞത് ഒരു വലിയ കേസെങ്കിലും ആവശ്യമാണ്", + "request_description": "അഭ്യർത്ഥനയുടെ വിവരണം", + "request_description_placeholder": "നിങ്ങളുടെ വിവരണം ഇവിടെ ടൈപ്പ് ചെയ്യുക", "request_title": "പേര് അഭ്യർത്ഥിക്കുക", "request_title_placeholder": "നിങ്ങളുടെ തലക്കെട്ട് ഇവിടെ ടൈപ്പ് ചെയ്യുക", + "required": "ആവശ്യമാണ്", "required_quantity": "ആവശ്യമായ അളവ്", - "request_description": "അഭ്യർത്ഥനയുടെ വിവരണം", - "request_description_placeholder": "നിങ്ങളുടെ വിവരണം ഇവിടെ ടൈപ്പ് ചെയ്യുക", + "reset": "പുന: സജ്ജമാക്കുക ", + "reset_password": "പാസ്‌വേഡ് പുന: സജ്ജമാക്കുക", + "resource_request": "റിസോഴ്സ് അഭ്യർത്ഥന", + "result": "ഫലം", + "result_date": "ഫല തീയതി", + "result_details": "ഫലത്തിൻ്റെ വിശദാംശങ്ങൾ", + "resume": "പുനരാരംഭിക്കുക", + "retake": "വീണ്ടും എടുക്കുക", + "return_to_care": "CARE എന്ന താളിലേക്ക് മടങ്ങുക", + "return_to_login": "ലോഗിൻ എന്നതിലേക്ക് മടങ്ങുക", + "return_to_password_reset": "പാസ്‌വേഡ് പുനഃസജ്ജീകരണത്തിലേക്ക് മടങ്ങുക", + "return_to_patient_dashboard": "പേഷ്യൻ്റ് ഡാഷ്‌ബോർഡിലേക്ക് മടങ്ങുക", + "right": "ശരിയാണ്", + "route": "റൂട്ട്", + "sample_collection_date": "സാമ്പിൾ ശേഖരണ തീയതി", + "sample_format": "സാമ്പിൾ ഫോർമാറ്റ്", + "sample_type": "സാമ്പിൾ തരം", + "save": "സംരക്ഷിക്കുക", + "save_and_continue": "സംരക്ഷിച്ച് തുടരുക", + "save_investigation": "അന്വേഷണം സംരക്ഷിക്കുക", + "scan_asset_qr": "അസറ്റ് ക്യുആർ സ്കാൻ ചെയ്യുക!", + "search_by_username": "ഉപയോക്തൃനാമം ഉപയോഗിച്ച് തിരയുക", + "search_for_facility": "സൗകര്യത്തിനായി തിരയുക", + "search_icd11_placeholder": "ICD-11 രോഗനിർണയങ്ങൾക്കായി തിരയുക", + "search_investigation_placeholder": "അന്വേഷണവും ഗ്രൂപ്പുകളും", + "search_patient": "രോഗിയെ തിരയുക", "search_resource": "തിരയൽ റിസോഴ്സ്", - "emergency": "അടിയന്തരാവസ്ഥ", - "up_shift": "മുകളിലേക്ക് ഷിഫ്റ്റ്", - "antenatal": "ജനനത്തിനുമുമ്പ്", - "phone_no": "ഫോൺ നമ്പർ.", - "patient_name": "രോഗിയുടെ പേര്", - "disease_status": "രോഗാവസ്ഥ", - "breathlessness_level": "ശ്വാസതടസ്സം നില", - "assigned_facility": "സൗകര്യം ഏൽപ്പിച്ചു", - "origin_facility": "നിലവിലെ സൗകര്യം", - "shifting_approval_facility": "ഷിഫ്റ്റിംഗ് അംഗീകാര സൗകര്യം", + "select": "തിരഞ്ഞെടുക്കുക", + "select_date": "തീയതി തിരഞ്ഞെടുക്കുക", + "select_facility_for_discharged_patients_warning": "ഡിസ്ചാർജ് ചെയ്ത രോഗികളെ കാണാനുള്ള സൗകര്യം തിരഞ്ഞെടുക്കേണ്ടതുണ്ട്.", + "select_for_administration": "അഡ്മിനിസ്ട്രേഷനായി തിരഞ്ഞെടുക്കുക", + "select_groups": "ഗ്രൂപ്പുകൾ തിരഞ്ഞെടുക്കുക", + "select_investigation": "അന്വേഷണങ്ങൾ തിരഞ്ഞെടുക്കുക (എല്ലാ അന്വേഷണങ്ങളും സ്ഥിരസ്ഥിതിയായി തിരഞ്ഞെടുക്കും)", + "select_investigation_groups": "അന്വേഷണ സംഘങ്ങൾ തിരഞ്ഞെടുക്കുക", + "select_investigations": "അന്വേഷണങ്ങൾ തിരഞ്ഞെടുക്കുക", + "select_local_body": "തദ്ദേശ സ്ഥാപനം തിരഞ്ഞെടുക്കുക", + "select_skills": "കുറച്ച് കഴിവുകൾ തിരഞ്ഞെടുത്ത് ചേർക്കുക", + "select_wards": "വാർഡുകൾ തിരഞ്ഞെടുക്കുക", + "send_email": "ഇമെയിൽ അയയ്ക്കുക", + "send_reset_link": "പുന: സജ്ജീകരണ ലിങ്ക് അയയ്‌ക്കുക", + "serial_number": "സീരിയൽ നമ്പർ", + "serviced_on": "സർവീസ് ചെയ്തു", + "session_expired": "സെഷൻ കാലഹരണപ്പെട്ടു", + "session_expired_msg": "നിങ്ങളുടെ സെഷൻ കാലഹരണപ്പെട്ടതായി തോന്നുന്നു. ഇത് നിഷ്ക്രിയത്വം മൂലമാകാം. തുടരാൻ വീണ്ടും ലോഗിൻ ചെയ്യുക.", + "set_average_weekly_working_hours_for": "ഇതിനായി ശരാശരി പ്രതിവാര പ്രവൃത്തി സമയം സജ്ജമാക്കുക", + "settings_and_filters": "ക്രമീകരണങ്ങളും ഫിൽട്ടറുകളും", + "severity_of_breathlessness": "ശ്വാസതടസ്സത്തിൻ്റെ തീവ്രത", + "shift_request_updated_successfully": "ഷിഫ്റ്റ് അഭ്യർത്ഥന വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", "shifting": "ഷിഫ്റ്റിംഗ്", - "search_patient": "രോഗിയെ തിരയുക", - "list_view": "ലിസ്റ്റ് കാഴ്ച", - "comment_min_length": "കമൻ്റിൽ കുറഞ്ഞത് 1 പ്രതീകമെങ്കിലും ഉണ്ടായിരിക്കണം", - "comment_added_successfully": "അഭിപ്രായം വിജയകരമായി ചേർത്തു", - "post_your_comment": "നിങ്ങളുടെ അഭിപ്രായം പോസ്റ്റ് ചെയ്യുക", + "shifting_approval_facility": "ഷിഫ്റ്റിംഗ് അംഗീകാര സൗകര്യം", "shifting_approving_facility": "അംഗീകാരം നൽകുന്ന സൗകര്യം മാറ്റുന്നു", - "is_emergency_case": "അടിയന്തര സാഹചര്യമാണ്", - "is_upshift_case": "കേസ് മാറ്റി", - "is_antenatal": "ജനനത്തിനു മുമ്പുള്ളതാണ്", - "patient_phone_number": "രോഗിയുടെ ഫോൺ നമ്പർ", - "created_date": "സൃഷ്ടിച്ച തീയതി", - "modified_date": "പരിഷ്കരിച്ച തീയതി", - "no_patients_to_show": "കാണിക്കാൻ രോഗികളില്ല.", - "shifting_status": "ഷിഫ്റ്റിംഗ് സ്റ്റാറ്റസ്", - "transfer_to_receiving_facility": "സ്വീകരിക്കാനുള്ള സൗകര്യത്തിലേക്ക് ട്രാൻസ്ഫർ ചെയ്യുക", - "confirm_transfer_complete": "കൈമാറ്റം പൂർത്തിയായെന്ന് സ്ഥിരീകരിക്കുക!", - "mark_transfer_complete_confirmation": "ഈ കൈമാറ്റം പൂർത്തിയായതായി അടയാളപ്പെടുത്തണമെന്ന് തീർച്ചയാണോ? ഒറിജിൻ സൗകര്യത്തിന് ഈ രോഗിക്ക് ഇനി ആക്‌സസ് ഉണ്ടായിരിക്കില്ല", - "board_view": "ബോർഡ് കാഴ്ച", + "shifting_approving_facility_can_not_be_empty": "ഷിഫ്റ്റിംഗ് അപ്രൂവിംഗ് സൗകര്യം ശൂന്യമായിരിക്കരുത്.", "shifting_deleted": "ഷിഫ്റ്റിംഗ് റെക്കോർഡ് വിജയകരമായി ഇല്ലാതാക്കി.", - "details_of_shifting_approving_facility": "അംഗീകാരം നൽകുന്ന സൗകര്യം മാറ്റുന്നതിൻ്റെ വിശദാംശങ്ങൾ", - "details_of_assigned_facility": "നിയുക്ത സൗകര്യത്തിൻ്റെ വിശദാംശങ്ങൾ", - "details_of_origin_facility": "ഉറവിട സൗകര്യത്തിൻ്റെ വിശദാംശങ്ങൾ", - "details_of_patient": "രോഗിയുടെ വിശദാംശങ്ങൾ", - "record_delete_confirm": "ഈ റെക്കോർഡ് ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ?", - "phone_number_at_current_facility": "നിലവിലെ സൗകര്യത്തിൽ ബന്ധപ്പെടുന്ന വ്യക്തിയുടെ ഫോൺ നമ്പർ", - "authorize_shift_delete": "ഷിഫ്റ്റ് ഇല്ലാതാക്കൽ അംഗീകരിക്കുക", - "delete_record": "റെക്കോർഡ് ഇല്ലാതാക്കുക", - "severity_of_breathlessness": "ശ്വാസതടസ്സത്തിൻ്റെ തീവ്രത", - "facility_preference": "സൗകര്യ മുൻഗണന", - "vehicle_preference": "വാഹന മുൻഗണന", - "is_up_shift": "ഷിഫ്റ്റ് ആയി", - "ambulance_driver_name": "ആംബുലൻസ് ഡ്രൈവറുടെ പേര്", - "ambulance_phone_number": "ആംബുലൻസിൻ്റെ ഫോൺ നമ്പർ", - "ambulance_number": "ആംബുലൻസ് നം", - "is_emergency": "അടിയന്തരാവസ്ഥയാണ്", - "contact_person_at_the_facility": "നിലവിലെ സൗകര്യത്തിലുള്ള വ്യക്തിയുമായി ബന്ധപ്പെടുക", - "update_status_details": "സ്റ്റാറ്റസ്/വിശദാംശങ്ങൾ അപ്ഡേറ്റ് ചെയ്യുക", "shifting_details": "വിശദാംശങ്ങൾ മാറ്റുന്നു", - "auto_generated_for_care": "പരിചരണത്തിനായി സ്വയമേവ സൃഷ്ടിച്ചത്", - "approved_by_district_covid_control_room": "ജില്ലാ കോവിഡ് കൺട്രോൾ റൂം അംഗീകരിച്ചു", - "treatment_summary": "ചികിത്സയുടെ സംഗ്രഹം", - "reason_for_referral": "റഫറൽ ചെയ്യാനുള്ള കാരണം", - "referred_to": "പരാമർശിച്ചത്", - "covid_19_cat_gov": "സർക്കാർ പ്രകാരം കോവിഡ്_19 ക്ലിനിക്കൽ വിഭാഗം. കേരള മാർഗരേഖ (എ/ബി/സി)", - "district_program_management_supporting_unit": "ജില്ലാ പ്രോഗ്രാം മാനേജ്മെൻ്റ് സപ്പോർട്ടിംഗ് യൂണിറ്റ്", - "name_of_hospital": "ആശുപത്രിയുടെ പേര്", - "passport_number": "പാസ്പോർട്ട് നമ്പർ", + "shifting_status": "ഷിഫ്റ്റിംഗ് സ്റ്റാറ്റസ്", + "show_all": "എല്ലാം കാണിക്കുക", + "show_all_notifications": "എല്ലാം കാണിക്കുക", + "show_default_presets": "ഡിഫോൾട്ട് പ്രീസെറ്റുകൾ കാണിക്കുക", + "show_patient_presets": "രോഗിയുടെ പ്രീസെറ്റുകൾ കാണിക്കുക", + "show_unread_notifications": "വായിക്കാത്തത് കാണിക്കുക", + "sign_out": "ലോഗ് ഔട്ട് ചെയ്യുക/പുറത്തിറങ്ങുക", + "something_went_wrong": "എന്തോ കുഴപ്പം സംഭവിച്ചു..!", + "something_wrong": "എന്തോ കുഴപ്പം സംഭവിച്ചു! കുറച്ചു കഴിഞ്ഞു വീണ്ടും ശ്രമിക്കുക!", + "sort_by": "ഇങ്ങനെ അടുക്കുക", + "source": "ഉറവിടം", + "srf_id": "SRF ഐഡി", + "staff_list": "സ്റ്റാഫ് ലിസ്റ്റ്", + "start_dosage": "ഡോസ് ആരംഭിക്കുക", + "state": "സംസ്ഥാനം", + "status": "നില", + "stop": "നിർത്തുക", + "stream_stop_due_to_inativity": "സജീവമല്ലാത്തതിനാൽ തത്സമയ ഫീഡ് സ്ട്രീമിംഗ് നിർത്തും", + "stream_stopped_due_to_inativity": "സജീവമല്ലാത്തതിനാൽ തത്സമയ ഫീഡ് സ്ട്രീമിംഗ് നിർത്തി", + "sub_category": "ഉപവിഭാഗം", + "submit": "സമർപ്പിക്കുക", + "submitting": "സമർപ്പിക്കുന്നു", + "subscribe": "സബ്സ്ക്രൈബ് ചെയ്യുക", + "subscribe_on_this_device": "ഈ ഉപകരണത്തിൽ സബ്സ്ക്രൈബ് ചെയ്യുക", + "subscription_error": "സബ്സ്ക്രിപ്ഷൻ പിശക്", + "suggested_investigations": "നിർദ്ദേശിച്ച അന്വേഷണങ്ങൾ", + "summary": "സംഗ്രഹം", + "support": "പിന്തുണ", + "switch": "മാറുക", + "systolic": "സിസ്റ്റോളിക്", + "tachycardia": "ടാക്കിക്കാർഡിയ", + "target_dosage": "ടാർഗെറ്റ് ഡോസ്", "test_type": "ടെസ്റ്റ് തരം", - "medical_worker": "മെഡിക്കൽ വർക്കർ", - "error_deleting_shifting": "ഷിഫ്റ്റിംഗ് റെക്കോർഡ് ഇല്ലാതാക്കുന്നതിൽ പിശക്", + "titrate_dosage": "ടൈട്രേറ്റ് ഡോസ്", + "to_be_conducted": "നടത്തേണ്ടത്", + "total_beds": "മൊത്തം കിടക്കകൾ", + "total_users": "മൊത്തം ഉപയോക്താക്കൾ", + "transfer_in_progress": "കൈമാറ്റം പുരോഗമിക്കുന്നു", + "transfer_to_receiving_facility": "സ്വീകരിക്കാനുള്ള സൗകര്യത്തിലേക്ക് ട്രാൻസ്ഫർ ചെയ്യുക", + "travel_within_last_28_days": "ആഭ്യന്തര/അന്താരാഷ്ട്ര യാത്ര (കഴിഞ്ഞ 28 ദിവസത്തിനുള്ളിൽ)", + "treating_doctor": "ചികിത്സിക്കുന്ന ഡോക്ടർ", + "treatment_summary": "ചികിത്സയുടെ സംഗ്രഹം", + "treatment_summary__head_title": "ചികിത്സയുടെ സംഗ്രഹം", + "treatment_summary__heading": "ഇടക്കാല ചികിത്സ സംഗ്രഹം", + "treatment_summary__print": "ചികിത്സയുടെ സംഗ്രഹം അച്ചടിക്കുക", + "try_again_later": "പിന്നീട് വീണ്ടും ശ്രമിക്കുക!", "type_any_extra_comments_here": "എന്തെങ്കിലും അധിക അഭിപ്രായങ്ങൾ ഇവിടെ ടൈപ്പ് ചെയ്യുക", + "type_b_cylinders": "ബി തരം സിലിണ്ടറുകൾ", + "type_c_cylinders": "സി തരം സിലിണ്ടറുകൾ", + "type_d_cylinders": "ഡി തരം സിലിണ്ടറുകൾ", + "type_to_search": "തിരയാൻ ടൈപ്പ് ചെയ്യുക", + "type_your_comment": "നിങ്ങളുടെ അഭിപ്രായം ടൈപ്പ് ചെയ്യുക", "type_your_reason_here": "നിങ്ങളുടെ കാരണം ഇവിടെ ടൈപ്പ് ചെയ്യുക", - "reason_for_shift": "ഷിഫ്റ്റിനുള്ള കാരണം", - "preferred_facility_type": "ഇഷ്ടപ്പെട്ട സൗകര്യ തരം", - "preferred_vehicle": "ഇഷ്ടപ്പെട്ട വാഹനം", - "is_it_upshift": "അത് ഉയർച്ചയാണോ?", - "is_this_an_upshift": "ഇതൊരു ഉയർച്ചയാണോ?", - "is_this_an_emergency": "ഇതൊരു അടിയന്തരാവസ്ഥയാണോ?", - "what_facility_assign_the_patient_to": "ഏത് സൗകര്യമാണ് രോഗിയെ ഏൽപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നത്", - "name_of_shifting_approving_facility": "ഷിഫ്റ്റിംഗ് അപ്രൂവിംഗ് സൗകര്യത്തിൻ്റെ പേര്", + "unconfirmed": "സ്ഥിരീകരിച്ചിട്ടില്ല", + "unique_id": "അദ്വിതീയ ഐഡി", + "unknown": "അജ്ഞാതം", + "unsubscribe": "അൺസബ്സ്ക്രൈബ് ചെയ്യുക", + "unsubscribe_failed": "അൺസബ്‌സ്‌ക്രൈബ് ചെയ്യാനായില്ല.", + "unsupported_browser": "പിന്തുണയ്‌ക്കാത്ത ബ്രൗസർ", + "unsupported_browser_description": "നിങ്ങളുടെ ബ്രൗസർ ({{name}} പതിപ്പ് {{version}}) പിന്തുണയ്ക്കുന്നില്ല. ഏറ്റവും പുതിയ പതിപ്പിലേക്ക് നിങ്ങളുടെ ബ്രൗസർ അപ്‌ഡേറ്റ് ചെയ്യുക അല്ലെങ്കിൽ മികച്ച അനുഭവത്തിനായി പിന്തുണയ്‌ക്കുന്ന ബ്രൗസറിലേക്ക് മാറുക.", + "up": "മുകളിലേക്ക്", + "up_shift": "മുകളിലേക്ക് ഷിഫ്റ്റ്", + "update": "അപ്ഡേറ്റ്", + "update_asset": "അസറ്റ് അപ്ഡേറ്റ് ചെയ്യുക", + "update_asset_service_record": "അസറ്റ് സർവീസ് റെക്കോർഡ് അപ്ഡേറ്റ് ചെയ്യുക", + "update_bed": "കിടക്ക അപ്ഡേറ്റ് ചെയ്യുക", + "update_facility": "അപ്ഡേറ്റ് സൗകര്യം", + "update_facility_middleware_success": "ഫെസിലിറ്റി മിഡിൽവെയർ വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", + "update_log": "അപ്ഡേറ്റ് ലോഗ്", + "update_record": "റെക്കോർഡ് അപ്ഡേറ്റ് ചെയ്യുക", + "update_record_for_asset": "അസറ്റിൻ്റെ റെക്കോർഡ് അപ്ഡേറ്റ് ചെയ്യുക", "update_shift_request": "ഷിഫ്റ്റ് അഭ്യർത്ഥന അപ്ഡേറ്റ് ചെയ്യുക", - "shift_request_updated_successfully": "ഷിഫ്റ്റ് അഭ്യർത്ഥന വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", - "please_enter_a_reason_for_the_shift": "ഷിഫ്റ്റിനുള്ള കാരണം നൽകുക.", - "please_select_preferred_vehicle_type": "ദയവായി തിരഞ്ഞെടുത്ത വാഹന തരം തിരഞ്ഞെടുക്കുക", - "please_select_facility_type": "ദയവായി സൗകര്യത്തിൻ്റെ തരം തിരഞ്ഞെടുക്കുക", - "please_select_breathlessness_level": "ശ്വാസതടസ്സം നില തിരഞ്ഞെടുക്കുക", - "please_select_a_facility": "ദയവായി ഒരു സൗകര്യം തിരഞ്ഞെടുക്കുക", - "please_select_status": "ദയവായി സ്റ്റാറ്റസ് തിരഞ്ഞെടുക്കുക", - "please_select_patient_category": "ദയവായി രോഗി വിഭാഗം തിരഞ്ഞെടുക്കുക", - "shifting_approving_facility_can_not_be_empty": "ഷിഫ്റ്റിംഗ് അപ്രൂവിംഗ് സൗകര്യം ശൂന്യമായിരിക്കരുത്.", - "redirected_to_create_consultation": "ശ്രദ്ധിക്കുക: കൺസൾട്ടേഷൻ ഫോം സൃഷ്‌ടിക്കാൻ നിങ്ങളെ റീഡയറക്‌ടുചെയ്യും. കൈമാറ്റ പ്രക്രിയ പൂർത്തിയാക്കാൻ ദയവായി ഫോം പൂരിപ്പിക്കുക", - "mark_this_transfer_as_complete_question": "ഈ കൈമാറ്റം പൂർത്തിയായതായി അടയാളപ്പെടുത്തണമെന്ന് തീർച്ചയാണോ? ഒറിജിൻ സൗകര്യത്തിന് ഈ രോഗിക്ക് ഇനി ആക്‌സസ് ഉണ്ടായിരിക്കില്ല", - "transfer_in_progress": "കൈമാറ്റം പുരോഗമിക്കുന്നു", - "patient_state": "രോഗിയുടെ അവസ്ഥ", - "yet_to_be_decided": "ഇനിയും തീരുമാനമായിട്ടില്ല", - "awaiting_destination_approval": "ഡെസ്റ്റിനേഷൻ അനുമതിക്കായി കാത്തിരിക്കുന്നു", + "update_status_details": "സ്റ്റാറ്റസ്/വിശദാംശങ്ങൾ അപ്ഡേറ്റ് ചെയ്യുക", + "updated": "അപ്ഡേറ്റ് ചെയ്തു", + "updating": "അപ്ഡേറ്റ് ചെയ്യുന്നു", + "upload": "അപ്‌ലോഡ് ചെയ്യുക", + "upload_an_image": "ഒരു ചിത്രം അപ്‌ലോഡ് ചെയ്യുക", + "upload_headings__consultation": "പുതിയ കൺസൾട്ടേഷൻ ഫയൽ അപ്‌ലോഡ് ചെയ്യുക", + "upload_headings__patient": "പുതിയ രോഗി ഫയൽ അപ്‌ലോഡ് ചെയ്യുക", + "upload_headings__sample_report": "സാമ്പിൾ റിപ്പോർട്ട് അപ്‌ലോഡ് ചെയ്യുക", + "upload_headings__supporting_info": "സഹായ വിവരങ്ങൾ അപ്‌ലോഡ് ചെയ്യുക", + "uploading": "അപ്‌ലോഡ് ചെയ്യുന്നു", + "user_deleted_successfuly": "ഉപയോക്താവ് ഇല്ലാതാക്കി", "user_management": "ഉപയോക്തൃ മാനേജ്മെൻ്റ്", - "facilities": "സൗകര്യങ്ങൾ", - "add_new_user": "പുതിയ ഉപയോക്താവിനെ ചേർക്കുക", - "no_users_found": "ഉപയോക്താക്കളെ കണ്ടെത്തിയില്ല", - "home_facility": "ഹോം സൗകര്യം", - "no_home_facility": "വീടിനുള്ള സൗകര്യം നൽകിയിട്ടില്ല", - "clear_home_facility": "ഹോം സൗകര്യം മായ്‌ക്കുക", - "linked_facilities": "ബന്ധിപ്പിച്ച സൗകര്യങ്ങൾ", - "no_linked_facilities": "ലിങ്ക്ഡ് സൗകര്യങ്ങളൊന്നുമില്ല", - "average_weekly_working_hours": "പ്രതിവാര ശരാശരി പ്രവൃത്തി സമയം", - "set_average_weekly_working_hours_for": "ഇതിനായി ശരാശരി പ്രതിവാര പ്രവൃത്തി സമയം സജ്ജമാക്കുക", - "search_by_username": "ഉപയോക്തൃനാമം ഉപയോഗിച്ച് തിരയുക", - "last_online": "അവസാനമായി ഓൺലൈൻ", - "total_users": "മൊത്തം ഉപയോക്താക്കൾ" -} \ No newline at end of file + "username": "യൂസർനെയിം/ഉപയോക്തൃനാമം", + "users": "ഉപയോക്താക്കൾ", + "vehicle_preference": "വാഹന മുൻഗണന", + "vendor_name": "വെണ്ടർ പേര്", + "view": "കാണുക", + "view_abdm_records": "ABDM റെക്കോർഡുകൾ കാണുക", + "view_asset": "അസറ്റുകൾ കാണുക", + "view_details": "വിശദാംശങ്ങൾ കാണുക", + "view_faciliy": "സൗകര്യം കാണുക", + "view_patients": "രോഗികളെ കാണുക", + "view_users": "ഉപയോക്താക്കളെ കാണുക", + "virtual_nursing_assistant": "വെർച്വൽ നഴ്സിംഗ് അസിസ്റ്റൻ്റ്", + "ward": "വാർഡ്", + "warranty_amc_expiry": "വാറൻ്റി / AMC കാലഹരണപ്പെടുന്നു", + "what_facility_assign_the_patient_to": "ഏത് സൗകര്യമാണ് രോഗിയെ ഏൽപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നത്", + "why_the_asset_is_not_working": "എന്തുകൊണ്ടാണ് അസറ്റ് പ്രവർത്തിക്കാത്തത്?", + "working_status": "പ്രവർത്തന നില", + "yes": "അതെ", + "yet_to_be_decided": "ഇനിയും തീരുമാനമായിട്ടില്ല", + "you_need_at_least_a_location_to_create_an_assest": "ഒരു അസസ്‌റ്റ് സൃഷ്‌ടിക്കാൻ നിങ്ങൾക്ക് ഒരു ലൊക്കേഷനെങ്കിലും ആവശ്യമാണ്.", + "zoom_in": "സൂം ഇൻ ചെയ്യുക", + "zoom_out": "സൂം ഔട്ട്" +} diff --git a/src/Locale/mr.json b/src/Locale/mr.json index 180e7df8391..06e9c5bbbde 100644 --- a/src/Locale/mr.json +++ b/src/Locale/mr.json @@ -1,66 +1,66 @@ { - "username": "युजरनेम", - "password": "पासवर्ड", - "new_password": "नवीन पासवर्ड", - "confirm_password": "पासवर्डची खात्री करा", - "first_name": "नाव", - "last_name": "आडनाव", - "email": "ई-मेल पत्ता", - "phone_number": "दूरध्वनी क्रमांक", - "district": "जिल्हा", - "gender": "लिंग", - "age": "वय", - "login": "लॉगिन", - "field_required": "हे भरणे आवश्यक आहे", - "password_mismatch": "\"पासवर्ड\" आणि \"पासवर्डची खात्री करा\" दोन्ही सारखे हवेत.", - "enter_valid_age": "वैध वय प्रविष्ट करा", - "invalid_username": "आवश्यक. १५० अक्षरे किंवा त्याहून कमी. फक्त अक्षरे, अंक आणि @/./+/-/_", - "invalid_password": "पासवर्डसाठी आवश्यक बाबी नाहीत", - "invalid_email": "वैध ईमेल पत्ता प्रविष्ट करा.", - "invalid_phone": "वैध दूरध्वनी क्रमांक प्रविष्ट करा.", - "register_hospital": "हॉस्पिटलचे नाव नोंदवा", - "register_page_title": "हॉस्पिटल व्यवस्थापक म्हणून नोंदणी करा", - "auth_login_title": "अधिकृत लॉगिन", - "back_to_login": "लॉगिन पृष्ठावर परत या", - "available_in": "उपलब्ध भाषा", - "forget_password": "पासवर्ड विसरलात?", - "forget_password_instruction": "युजरनेम प्रविष्ट करा आणि आम्ही तुम्हाला पासवर्ड रीसेट करण्यासाठी एक लिंक पाठवू.", - "send_reset_link": "रीसेट लिंक पाठवा", - "already_a_member": "आधीपासून सदस्य आहात?", - "password_sent": "पासवर्ड रिसेट झाला इमेल पाठवला", - "password_reset_success": "पासवर्ड यशस्वीपणे रिसेट झाला", - "password_reset_failure": "पासवर्ड रिसेट झाला नाही", - "reset_password": "रिसेट पासवर्ड", - "sign_out": "साइन आउट", - "goal": "डिजिटल साधनांचा वापर करून सार्वजनिक आरोग्य सेवांची गुणवत्ता आणि सुलभता सतत सुधारणे हे आमचे ध्येय आहे.", - "something_wrong": "काहीतरी चूक झाली! पुन्हा प्रयत्न करा", - "contribute_github": "Github वर योगदान द्या", - "footer_body": "कोरोनासेफ नेटवर्क ही एक मुक्त-स्त्रोत सार्वजनिक सुविधा आहे जी केरळ सरकारच्या पूर्ण मदतीने आणि समर्थनासह सरकारच्या प्रयत्नांना पाठिंबा देण्यासाठी मॉडेलवर काम करणारे नवीन-स्वयंसेवक आणि स्वयंसेवकांच्या एकाधिक-शिस्तबद्ध टीमद्वारे डिझाइन केलेले आहे.", - "reset": "रीसेट करा", - "downloads": "डाउनलोड", - "download_type": "डाउनलोड प्रकार", - "State": "राज्य", + "Assets": "मालमत्ता", + "Dashboard": "डॅशबोर्ड", "District": "जिल्हा", + "Facilities": "हॉस्पिटल", + "Facility Type": "हॉस्पिटल प्रकार", + "KASP Empanelled": "KASP समिती ", "Local Body": "स्थानिक संस्था", "Location": "स्थान", - "Ward": "वॉर्ड", "Notice Board": "सूचना फलक", - "Assets": "मालमत्ता", "Notifications": "अधिसूचना", - "Facilities": "हॉस्पिटल", "Patients": "रुग्ण", + "Profile": "प्रोफाइल", + "Resource": "संसाधन", "Sample Test": "नमुना तपासणी ", "Shifting": "शिफ्टिंग", - "Resource": "संसाधन", + "State": "राज्य", "Users": "युजर्स", - "Profile": "प्रोफाइल", - "Dashboard": "डॅशबोर्ड", - "facility_search_placeholder": "हॉस्पिटल / जिल्हा यानुसार शोध घ्या", - "advanced_filters": "अद्ययावत फिल्टर ", - "Facility Type": "हॉस्पिटल प्रकार", - "KASP Empanelled": "KASP समिती ", "View Facility": "हॉस्पिटल पाहा", + "Ward": "वॉर्ड", + "advanced_filters": "अद्ययावत फिल्टर ", + "age": "वय", + "already_a_member": "आधीपासून सदस्य आहात?", + "auth_login_title": "अधिकृत लॉगिन", + "available_in": "उपलब्ध भाषा", + "back_to_login": "लॉगिन पृष्ठावर परत या", + "confirm_password": "पासवर्डची खात्री करा", + "contribute_github": "Github वर योगदान द्या", + "create_facility": "नवीन हॉस्पिटल सुविधा निर्माण करा", + "district": "जिल्हा", + "download_type": "डाउनलोड प्रकार", + "downloads": "डाउनलोड", + "email": "ई-मेल पत्ता", + "enter_valid_age": "वैध वय प्रविष्ट करा", + "facility_search_placeholder": "हॉस्पिटल / जिल्हा यानुसार शोध घ्या", + "field_required": "हे भरणे आवश्यक आहे", + "first_name": "नाव", + "footer_body": "कोरोनासेफ नेटवर्क ही एक मुक्त-स्त्रोत सार्वजनिक सुविधा आहे जी केरळ सरकारच्या पूर्ण मदतीने आणि समर्थनासह सरकारच्या प्रयत्नांना पाठिंबा देण्यासाठी मॉडेलवर काम करणारे नवीन-स्वयंसेवक आणि स्वयंसेवकांच्या एकाधिक-शिस्तबद्ध टीमद्वारे डिझाइन केलेले आहे.", + "forget_password": "पासवर्ड विसरलात?", + "forget_password_instruction": "युजरनेम प्रविष्ट करा आणि आम्ही तुम्हाला पासवर्ड रीसेट करण्यासाठी एक लिंक पाठवू.", + "gender": "लिंग", + "goal": "डिजिटल साधनांचा वापर करून सार्वजनिक आरोग्य सेवांची गुणवत्ता आणि सुलभता सतत सुधारणे हे आमचे ध्येय आहे.", + "invalid_email": "वैध ईमेल पत्ता प्रविष्ट करा.", + "invalid_password": "पासवर्डसाठी आवश्यक बाबी नाहीत", + "invalid_phone": "वैध दूरध्वनी क्रमांक प्रविष्ट करा.", + "invalid_username": "आवश्यक. १५० अक्षरे किंवा त्याहून कमी. फक्त अक्षरे, अंक आणि @/./+/-/_", + "last_name": "आडनाव", + "login": "लॉगिन", + "new_password": "नवीन पासवर्ड", "no_duplicate_facility": "बनावट हॉस्पिटल सुविधा मुळीच तयार करू नका", "no_facilities": "कोणतेही हॉस्पिटल नाही", - "create_facility": "नवीन हॉस्पिटल सुविधा निर्माण करा" -} \ No newline at end of file + "password": "पासवर्ड", + "password_mismatch": "\"पासवर्ड\" आणि \"पासवर्डची खात्री करा\" दोन्ही सारखे हवेत.", + "password_reset_failure": "पासवर्ड रिसेट झाला नाही", + "password_reset_success": "पासवर्ड यशस्वीपणे रिसेट झाला", + "password_sent": "पासवर्ड रिसेट झाला इमेल पाठवला", + "phone_number": "दूरध्वनी क्रमांक", + "register_hospital": "हॉस्पिटलचे नाव नोंदवा", + "register_page_title": "हॉस्पिटल व्यवस्थापक म्हणून नोंदणी करा", + "reset": "रीसेट करा", + "reset_password": "रिसेट पासवर्ड", + "send_reset_link": "रीसेट लिंक पाठवा", + "sign_out": "साइन आउट", + "something_wrong": "काहीतरी चूक झाली! पुन्हा प्रयत्न करा", + "username": "युजरनेम" +} diff --git a/src/Locale/ta.json b/src/Locale/ta.json index cb2eb506bc2..1fbf82c29aa 100644 --- a/src/Locale/ta.json +++ b/src/Locale/ta.json @@ -1,813 +1,813 @@ { - "create_asset": "சொத்தை உருவாக்கவும்", - "edit_history": "வரலாற்றைத் திருத்தவும்", - "update_record_for_asset": "சொத்துக்கான பதிவைப் புதுப்பிக்கவும்", - "edited_on": "அன்று திருத்தப்பட்டது", - "edited_by": "திருத்தியது", - "serviced_on": "சேவை செய்யப்பட்டது", - "notes": "குறிப்புகள்", - "back": "மீண்டும்", - "close": "மூடு", - "update_asset_service_record": "சொத்து சேவை பதிவை புதுப்பிக்கவும்", - "eg_details_on_functionality_service_etc": "எ.கா. செயல்பாடு, சேவை போன்றவை பற்றிய விவரங்கள்.", - "updating": "புதுப்பிக்கிறது", - "update": "புதுப்பிக்கவும்", - "are_you_still_watching": "நீங்கள் இன்னும் பார்க்கிறீர்களா?", - "stream_stop_due_to_inativity": "லைவ் ஃபீட் செயல்படாததால் ஸ்ட்ரீமிங் நிறுத்தப்படும்", - "stream_stopped_due_to_inativity": "லைவ் ஃபீட் செயல்படாததால் ஸ்ட்ரீமிங் நிறுத்தப்பட்டது", - "continue_watching": "தொடர்ந்து பார்க்கவும்", - "resume": "ரெஸ்யூம்", - "username": "பயனர்பெயர்", - "password": "கடவுச்சொல்", - "new_password": "புதிய கடவுச்சொல்", - "confirm_password": "கடவுச்சொல்லை உறுதிப்படுத்தவும்", - "first_name": "முதல் பெயர்", - "last_name": "கடைசி பெயர்", - "email": "மின்னஞ்சல் முகவரி", - "phone_number": "தொலைபேசி எண்", - "district": "மாவட்டம்", - "gender": "பாலினம்", - "age": "வயது", - "login": "உள்நுழைய", - "password_mismatch": "கடவுச்சொல் பொருந்தவில்லை", - "enter_valid_age": "செல்லுபடியாகும் வயதை உள்ளிடவும்", - "invalid_username": "தேவை. 150 எழுத்துக்கள் அல்லது குறைவானவை. எழுத்துக்கள், எண்கள் மற்றும் @ /. / + / - / _ மட்டும்.", - "invalid_password": "கடவுச்சொல் தேவைகளை பூர்த்தி செய்யவில்லை", - "invalid_email": "செல்லுபடியாகும் மின்னஞ்சல் முகவரியை உள்ளிடவும்", - "invalid_phone": "செல்லுபடியாகும் தொலைபேசி எண்ணை உள்ளிடவும்", - "register_hospital": "மருத்துவமனை பதிவு", - "register_page_title": "மருத்துவமனை நிர்வாகியாக பதிவு செய்யுங்கள்", - "auth_login_title": "அங்கீகரிக்கப்பட்ட உள்நுழைவு", - "forget_password": "கடவுச்சொல்லை மறந்துவிட்டீர்களா?", - "forget_password_instruction": "உங்கள் பயனர்பெயரை உள்ளிடவும், உங்கள் கடவுச்சொல்லை மீட்டமைக்க ஒரு இணைப்பை நாங்கள் உங்களுக்கு அனுப்புவோம்.", - "send_reset_link": "மீட்டமை இணைப்பை அனுப்பவும்", - "already_a_member": "ஏற்கனவே உறுப்பினரா?", - "password_sent": "கடவுச்சொல் மீட்டமை மின்னஞ்சல் அனுப்பப்பட்டது!", - "password_reset_success": "கடவுச்சொல் வெற்றிகரமாக மீட்டமைக்கப்பட்டது!", - "password_reset_failure": "கடவுச்சொல் மீட்டமைப்பு தோல்வியுற்றது!", - "reset_password": "கடவுச்சொல்லை மீட்டமை", - "available_in": "கிடைக்கும் மொழிகள்", - "sign_out": "வெளியேறு", - "back_to_login": "உள்நுழைவு பக்கத்திற்குத் திரும்பு", - "min_password_len_8": "குறைந்தபட்ச கடவுச்சொல் நீளம் 8", - "req_atleast_one_digit": "குறைந்தது ஒரு இலக்கமாவது தேவை", - "req_atleast_one_uppercase": "குறைந்தபட்சம் ஒரு பெரிய வழக்கு தேவை", - "req_atleast_one_lowercase": "குறைந்தபட்சம் ஒரு சிறிய எழுத்து தேவை", - "req_atleast_one_symbol": "குறைந்தது ஒரு சின்னம் தேவை", - "bed_search_placeholder": "படுக்கைகளின் பெயரைக் கொண்டு தேடுங்கள்", + "404_message": "இல்லாத அல்லது வேறொரு URLக்கு நகர்த்தப்பட்ட ஒரு பக்கத்தில் நீங்கள் தடுமாறிவிட்டதாகத் தெரிகிறது. நீங்கள் சரியான இணைப்பை உள்ளிட்டுள்ளீர்கள் என்பதை உறுதிப்படுத்தவும்!", + "AUTOMATED": "தானியங்கி", + "Assets": "சொத்துக்கள்", "BED_WITH_OXYGEN_SUPPORT": "ஆக்ஸிஜன் ஆதரவுடன் படுக்கை", - "REGULAR": "வழக்கமான", + "CONSCIOUSNESS_LEVEL__AGITATED_OR_CONFUSED": "கலக்கம் அல்லது குழப்பம்", + "CONSCIOUSNESS_LEVEL__ALERT": "எச்சரிக்கை", + "CONSCIOUSNESS_LEVEL__ONSET_OF_AGITATION_AND_CONFUSION": "கிளர்ச்சி மற்றும் குழப்பத்தின் ஆரம்பம்", + "CONSCIOUSNESS_LEVEL__RESPONDS_TO_PAIN": "வலிக்கு பதிலளிக்கிறது", + "CONSCIOUSNESS_LEVEL__RESPONDS_TO_VOICE": "குரலுக்கு பதிலளிக்கிறது", + "CONSCIOUSNESS_LEVEL__UNRESPONSIVE": "பதிலளிக்காதது", + "Cancel": "ரத்து செய்", + "DD/MM/YYYY": "DD/MM/YYYY", + "DOCTORS_LOG": "முன்னேற்றக் குறிப்பு", + "Dashboard": "டாஷ்போர்டு", + "Facilities": "வசதிகள்", + "GENDER__1": "ஆண்", + "GENDER__2": "பெண்", + "GENDER__3": "பைனரி அல்லாத", + "HEARTBEAT_RHYTHM__IRREGULAR": "ஒழுங்கற்ற", + "HEARTBEAT_RHYTHM__REGULAR": "வழக்கமான", + "HEARTBEAT_RHYTHM__UNKNOWN": "தெரியவில்லை", "ICU": "ஐசியூ", + "INSULIN_INTAKE_FREQUENCY__BD": "ஒரு நாளைக்கு இரண்டு முறை (BD)", + "INSULIN_INTAKE_FREQUENCY__OD": "ஒரு நாளைக்கு ஒரு முறை (OD)", + "INSULIN_INTAKE_FREQUENCY__TD": "ஒரு நாளைக்கு மூன்று முறை (டிடி)", + "INSULIN_INTAKE_FREQUENCY__UNKNOWN": "தெரியவில்லை", "ISOLATION": "தனிமைப்படுத்துதல்", - "add_beds": "படுக்கைகளைச் சேர்", - "update_bed": "படுக்கையைப் புதுப்பிக்கவும்", - "bed_type": "படுக்கை வகை", - "make_multiple_beds_label": "நீங்கள் பல படுக்கைகளை உருவாக்க விரும்புகிறீர்களா?", - "number_of_beds": "படுக்கைகளின் எண்ணிக்கை", - "number_of_beds_out_of_range_error": "படுக்கைகளின் எண்ணிக்கை 100க்கு மேல் இருக்கக்கூடாது", - "goal": "டிஜிட்டல் கருவிகளைப் பயன்படுத்தி பொது சுகாதார சேவைகளின் தரம் மற்றும் அணுகல்தன்மையை தொடர்ந்து மேம்படுத்துவதே எங்கள் குறிக்கோள்.", - "something_wrong": "ஏதோ தவறு நடந்துவிட்டது! பின்னர் மீண்டும் முயற்சிக்கவும்!", - "try_again_later": "பிறகு முயற்சிக்கவும்!", - "contribute_github": "Github-ல் பங்களிப்பு செய்யுங்கள்", - "footer_body": "கொரோனா சேஃப் நெட்வொர்க் என்பது ஒரு திறந்த மூல பொது பயன்பாடாகும், இது கேரள அரசாங்கத்தின் முழு புரிதலுடனும் ஆதரவிற்கும் அரசாங்க முயற்சிகளை ஆதரிக்க ஒரு மாதிரியில் பணிபுரியும் புதுமைப்பித்தர்கள் மற்றும் தன்னார்வலர்களின் பல ஒழுக்கக் குழுவால் வடிவமைக்கப்பட்டுள்ளது.", - "reset": "மீட்டமை", - "download": "பதிவிறக்கவும்", - "downloads": "பதிவிறக்கங்கள்", - "downloading": "பதிவிறக்குகிறது", - "generating": "உருவாக்குகிறது", - "send_email": "மின்னஞ்சல் அனுப்பவும்", - "email_address": "மின்னஞ்சல் முகவரி", - "email_success": "விரைவில் மின்னஞ்சல் அனுப்புவோம். உங்கள் இன்பாக்ஸை சரிபார்க்கவும்.", - "disclaimer": "மறுப்பு", - "category": "வகை", - "sub_category": "துணை வகை", - "download_type": "பதிவிறக்க வகை", - "state": "மாநிலம்", - "location": "இடம்", - "ward": "வார்டு", + "KASP Empanelled": "KASP சேர்ந்தார்", + "LIMB_RESPONSE__EXTENSION": "நீட்டிப்பு", + "LIMB_RESPONSE__FLEXION": "நெகிழ்வு", + "LIMB_RESPONSE__MODERATE": "மிதமான", + "LIMB_RESPONSE__NONE": "இல்லை", + "LIMB_RESPONSE__STRONG": "வலுவான", + "LIMB_RESPONSE__UNKNOWN": "தெரியவில்லை", + "LIMB_RESPONSE__WEAK": "பலவீனமான", + "NORMAL": "சுருக்கமான புதுப்பிப்பு", + "NURSING_CARE_PROCEDURE__catheter_care": "வடிகுழாய் பராமரிப்பு", + "NURSING_CARE_PROCEDURE__chest_tube_care": "மார்பு குழாய் பராமரிப்பு", + "NURSING_CARE_PROCEDURE__dressing": "ஆடை அணிதல்", + "NURSING_CARE_PROCEDURE__dvt_pump_stocking": "DVT பம்ப் ஸ்டாக்கிங்", + "NURSING_CARE_PROCEDURE__iv_sitecare": "IV தள பராமரிப்பு", + "NURSING_CARE_PROCEDURE__nubulisation": "நுபுலைசேஷன்", + "NURSING_CARE_PROCEDURE__personal_hygiene": "தனிப்பட்ட சுகாதாரம்", + "NURSING_CARE_PROCEDURE__positioning": "நிலைப்படுத்துதல்", + "NURSING_CARE_PROCEDURE__restrain": "கட்டுப்படுத்து", + "NURSING_CARE_PROCEDURE__ryles_tube_care": "ரைல்ஸ் குழாய் பராமரிப்பு", + "NURSING_CARE_PROCEDURE__stoma_care": "ஸ்டோமா கேர்", + "NURSING_CARE_PROCEDURE__suctioning": "உறிஞ்சும்", + "NURSING_CARE_PROCEDURE__tracheostomy_care": "டிரக்கியோஸ்டமி பராமரிப்பு", "Notice Board": "அறிவிப்பு பலகை", - "Assets": "சொத்துக்கள்", "Notifications": "அறிவிப்புகள்", + "OXYGEN_MODALITY__HIGH_FLOW_NASAL_CANNULA": "அதிக ஓட்டம் நாசி கேனுலா", + "OXYGEN_MODALITY__NASAL_PRONGS": "நாசி முனைகள்", + "OXYGEN_MODALITY__NON_REBREATHING_MASK": "சுவாசிக்காத முகமூடி", + "OXYGEN_MODALITY__SIMPLE_FACE_MASK": "எளிய முகமூடி", + "PRESCRIPTION_FREQUENCY_BD": "தினமும் இருமுறை", + "PRESCRIPTION_FREQUENCY_HS": "இரவு மட்டும்", + "PRESCRIPTION_FREQUENCY_OD": "தினமும் ஒருமுறை", + "PRESCRIPTION_FREQUENCY_Q4H": "4 வது மணிநேரம்", + "PRESCRIPTION_FREQUENCY_QID": "6 வது மணிநேரம்", + "PRESCRIPTION_FREQUENCY_QOD": "மாற்று நாள்", + "PRESCRIPTION_FREQUENCY_QWK": "வாரம் ஒருமுறை", + "PRESCRIPTION_FREQUENCY_STAT": "உடனடியாக", + "PRESCRIPTION_FREQUENCY_TID": "8வது மணிநேரம்", + "PRESCRIPTION_ROUTE_IM": "ஐ.எம்", + "PRESCRIPTION_ROUTE_INHALATION": "உள்ளிழுத்தல்", + "PRESCRIPTION_ROUTE_INTRATHECAL": "உள்நோக்கி ஊசி", + "PRESCRIPTION_ROUTE_IV": "IV", + "PRESCRIPTION_ROUTE_NASOGASTRIC": "நாசோகாஸ்ட்ரிக் / காஸ்ட்ரோஸ்டமி குழாய்", + "PRESCRIPTION_ROUTE_ORAL": "வாய்வழி", + "PRESCRIPTION_ROUTE_RECTAL": "மலக்குடல்", + "PRESCRIPTION_ROUTE_SC": "எஸ்/சி", + "PRESCRIPTION_ROUTE_SUBLINGUAL": "சப்ளிங்குவல்", + "PRESCRIPTION_ROUTE_TRANSDERMAL": "டிரான்ஸ்டெர்மல்", + "PUPIL_REACTION__BRISK": "சுறுசுறுப்பான", + "PUPIL_REACTION__CANNOT_BE_ASSESSED": "மதிப்பிட முடியாது", + "PUPIL_REACTION__FIXED": "சரி செய்யப்பட்டது", + "PUPIL_REACTION__SLUGGISH": "மந்தமான", + "PUPIL_REACTION__UNKNOWN": "தெரியவில்லை", + "Patients": "நோயாளிகள்", + "Profile": "சுயவிவரம்", + "REGULAR": "வழக்கமான", + "RESPIRATORY_SUPPORT_SHORT__INVASIVE": "IV", + "RESPIRATORY_SUPPORT_SHORT__NON_INVASIVE": "என்.ஐ.வி", + "RESPIRATORY_SUPPORT_SHORT__OXYGEN_SUPPORT": "O2 ஆதரவு", + "RESPIRATORY_SUPPORT_SHORT__UNKNOWN": "இல்லை", + "RESPIRATORY_SUPPORT__INVASIVE": "ஊடுருவும் காற்றோட்டம் (IV)", + "RESPIRATORY_SUPPORT__NON_INVASIVE": "ஆக்கிரமிப்பு அல்லாத வென்டிலேட்டர் (NIV)", + "RESPIRATORY_SUPPORT__OXYGEN_SUPPORT": "ஆக்ஸிஜன் ஆதரவு", + "RESPIRATORY_SUPPORT__UNKNOWN": "இல்லை", + "Resource": "வளம்", + "SORT_OPTIONS__-bed__name": "படுக்கை எண். N-1", + "SORT_OPTIONS__-category_severity": "அதிக தீவிரத்தன்மை பிரிவு முதலில்", + "SORT_OPTIONS__-created_date": "புதிதாக உருவாக்கப்பட்ட தேதி முதலில்", + "SORT_OPTIONS__-modified_date": "முதலில் புதுப்பிக்கப்பட்ட தேதி", + "SORT_OPTIONS__-name": "நோயாளியின் பெயர் ZA", + "SORT_OPTIONS__-review_time": "சமீபத்திய மதிப்பாய்வு தேதி முதலில்", + "SORT_OPTIONS__-taken_at": "சமீபத்தில் எடுக்கப்பட்ட தேதி முதலில்", + "SORT_OPTIONS__bed__name": "படுக்கை எண் 1-N", + "SORT_OPTIONS__category_severity": "குறைந்த தீவிரத்தன்மை வகை முதலில்", + "SORT_OPTIONS__created_date": "பழைய உருவாக்கப்பட்ட தேதி முதலில்", + "SORT_OPTIONS__facility__name,-last_consultation__current_bed__bed__name": "படுக்கை எண். N-1", + "SORT_OPTIONS__facility__name,last_consultation__current_bed__bed__name": "படுக்கை எண் 1-N", + "SORT_OPTIONS__modified_date": "பழைய புதுப்பிக்கப்பட்ட தேதி முதலில்", + "SORT_OPTIONS__name": "நோயாளியின் பெயர் AZ", + "SORT_OPTIONS__review_time": "பழைய மதிப்பாய்வு தேதி முதலில்", + "SORT_OPTIONS__taken_at": "முதலில் எடுக்கப்பட்ட பழைய தேதி", + "Sample Test": "மாதிரி சோதனை", + "Shifting": "மாற்றுதல்", "Submit": "சமர்ப்பிக்கவும்", - "Cancel": "ரத்து செய்", - "powered_by": "மூலம் இயக்கப்படுகிறது", - "care": "கவனிப்பு", - "something_went_wrong": "ஏதோ தவறாகிவிட்டது..!", - "stop": "நிறுத்து", - "record": "ஆடியோ பதிவு", - "recording": "பதிவு செய்தல்", - "yes": "ஆம்", - "no": "இல்லை", - "status": "நிலை", - "created": "உருவாக்கப்பட்டது", - "modified": "மாற்றியமைக்கப்பட்டது", - "updated": "புதுப்பிக்கப்பட்டது", - "configure": "கட்டமைக்கவும்", - "assigned_to": "க்கு ஒதுக்கப்பட்டது", - "cancel": "ரத்து செய்", - "clear": "தெளிவு", - "apply": "விண்ணப்பிக்கவும்", - "filter_by": "வடிகட்டவும்", - "filter": "வடிகட்டி", - "settings_and_filters": "அமைப்புகள் மற்றும் வடிப்பான்கள்", - "ordering": "ஆர்டர் செய்தல்", - "international_mobile": "சர்வதேச மொபைல்", - "indian_mobile": "இந்திய மொபைல்", - "mobile": "மொபைல்", - "landline": "இந்திய லேண்ட்லைன்", - "support": "ஆதரவு", - "emergency_contact_number": "அவசர தொடர்பு எண்", - "last_modified": "கடைசியாக மாற்றப்பட்டது", - "patient_address": "நோயாளியின் முகவரி", - "all_details": "அனைத்து விவரங்களும்", - "confirm": "உறுதிப்படுத்தவும்", - "refresh_list": "பட்டியலைப் புதுப்பிக்கவும்", - "last_edited": "கடைசியாக திருத்தப்பட்டது", - "audit_log": "தணிக்கை பதிவு", - "comments": "கருத்துகள்", - "contact_person_number": "தொடர்பு நபர் எண்", - "referral_letter": "பரிந்துரை கடிதம்", - "print": "அச்சிடுக", - "print_referral_letter": "பரிந்துரை கடிதத்தை அச்சிடுங்கள்", - "date_of_positive_covid_19_swab": "பாசிட்டிவ் கோவிட் 19 ஸ்வாப் தேதி", - "patient_no": "OP/IP எண்", - "date_of_admission": "சேர்க்கை தேதி", - "india_1": "இந்தியா", - "unique_id": "தனித்துவமான ஐடி", - "date_and_time": "தேதி மற்றும் நேரம்", - "facility_type": "வசதி வகை", - "number_of_chronic_diseased_dependents": "நாள்பட்ட நோய்களைச் சார்ந்திருப்பவர்களின் எண்ணிக்கை", - "number_of_aged_dependents_above_60": "வயதான சார்புடையவர்களின் எண்ணிக்கை (60 க்கு மேல்)", - "ongoing_medications": "தொடரும் மருந்துகள்", - "countries_travelled": "நாடுகள் பயணம் செய்தன", - "travel_within_last_28_days": "உள்நாட்டு/சர்வதேச பயணம் (கடந்த 28 நாட்களுக்குள்)", - "estimated_contact_date": "மதிப்பிடப்பட்ட தொடர்பு தேதி", - "blood_group": "இரத்தக் குழு", - "date_of_birth": "பிறந்த தேதி", - "date_of_test": "தேர்வு தேதி", - "srf_id": "SRF ஐடி", - "contact_number": "தொடர்பு எண்", - "diagnosis": "நோய் கண்டறிதல்", - "copied_to_clipboard": "கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது", - "is": "உள்ளது", - "reason": "காரணம்", - "description": "விளக்கம்", - "name": "பெயர்", - "address": "முகவரி", - "phone": "தொலைபேசி", - "nationality": "தேசியம்", - "allergies": "ஒவ்வாமை", - "type_your_comment": "உங்கள் கருத்தை உள்ளிடவும்", - "any_other_comments": "வேறு ஏதேனும் கருத்துகள்", - "loading": "ஏற்றுகிறது...", - "facility": "வசதி", - "local_body": "உள்ளூர் அமைப்பு", - "filters": "வடிப்பான்கள்", - "unknown": "தெரியவில்லை", + "TELEMEDICINE": "டெலிமெடிசின்", + "Users": "பயனர்கள்", + "VENTILATOR": "விரிவான புதுப்பிப்பு", + "VENTILATOR_MODE__CMV": "கட்டுப்பாட்டு இயந்திர காற்றோட்டம் (CMV)", + "VENTILATOR_MODE__PCV": "அழுத்தம் கட்டுப்பாட்டு காற்றோட்டம் (PCV)", + "VENTILATOR_MODE__PC_SIMV": "அழுத்தம் கட்டுப்படுத்தப்பட்ட SIMV (PC-SIMV)", + "VENTILATOR_MODE__PSV": "சி-பிஏபி / பிரஷர் சப்போர்ட் வென்டிலேஷன் (பிஎஸ்வி)", + "VENTILATOR_MODE__SIMV": "ஒத்திசைக்கப்பட்ட இடைப்பட்ட கட்டாய காற்றோட்டம் (SIMV)", + "VENTILATOR_MODE__VCV": "வால்யூம் கண்ட்ரோல் வென்டிலேஷன் (VCV)", + "VENTILATOR_MODE__VC_SIMV": "தொகுதி கட்டுப்படுத்தப்பட்ட SIMV (VC-SIMV)", + "View Facility": "வசதி காண்க", + "action_irreversible": "இந்த நடவடிக்கை மீள முடியாதது", "active": "செயலில்", - "completed": "முடிக்கப்பட்டது", - "on": "அன்று", - "open": "திற", - "features": "அம்சங்கள்", - "pincode": "பின்கோடு", - "required": "தேவை", - "field_required": "இந்த புலம் தேவை", - "litres": "லிட்டர்கள்", - "litres_per_day": "லிட்டர்/நாள்", - "invalid_pincode": "தவறான பின்கோடு", - "invalid_phone_number": "தவறான தொலைபேசி எண்", - "latitude_invalid": "அட்சரேகை -90 மற்றும் 90 க்கு இடையில் இருக்க வேண்டும்", - "longitude_invalid": "தீர்க்கரேகை -180 மற்றும் 180 க்கு இடையில் இருக்க வேண்டும்", - "save": "சேமிக்கவும்", - "continue": "தொடரவும்", - "save_and_continue": "சேமித்து தொடரவும்", - "select": "தேர்ந்தெடு", - "lsg": "Lsg", - "delete": "நீக்கு", - "remove": "அகற்று", - "max_size_for_image_uploaded_should_be": "பதிவேற்றப்பட்ட படத்திற்கான அதிகபட்ச அளவு இருக்க வேண்டும்", - "allowed_formats_are": "அனுமதிக்கப்பட்ட வடிவங்கள்", - "recommended_aspect_ratio_for": "பரிந்துரைக்கப்பட்ட தோற்ற விகிதம்", - "drag_drop_image_to_upload": "பதிவேற்ற படத்தை இழுத்து விடவும்", - "upload_an_image": "ஒரு படத்தை பதிவேற்றவும்", - "upload": "பதிவேற்றவும்", - "uploading": "பதிவேற்றுகிறது", - "switch": "மாறவும்", - "capture": "பிடிப்பு", - "retake": "மீண்டும் எடுக்கவும்", - "submit": "சமர்ப்பிக்கவும்", - "camera": "கேமரா", - "camera_permission_denied": "கேமரா அனுமதி நிராகரித்தது", - "submitting": "சமர்ப்பிக்கிறது", - "view_details": "விவரங்களைக் காண்க", - "type_to_search": "தேட தட்டச்சு செய்யவும்", - "show_all": "அனைத்தையும் காட்டு", - "hide": "மறை", - "select_skills": "சில திறன்களைத் தேர்ந்தெடுத்து சேர்க்கவும்", - "contact_your_admin_to_add_skills": "திறன்களைச் சேர்க்க உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்", + "active_prescriptions": "செயலில் உள்ள மருந்துகள்", "add": "சேர்", "add_as": "என சேர்", - "sort_by": "வரிசைப்படுத்து", - "none": "இல்லை", - "choose_file": "சாதனத்திலிருந்து பதிவேற்றவும்", - "open_camera": "கேமராவைத் திற", - "file_preview": "கோப்பு முன்னோட்டம்", - "file_preview_not_supported": "இந்தக் கோப்பை முன்னோட்டமிட முடியவில்லை. பதிவிறக்கம் செய்து பாருங்கள்.", - "view_faciliy": "பார்வை வசதி", - "view_patients": "நோயாளிகளைப் பார்க்கவும்", - "frequency": "அதிர்வெண்", - "days": "நாட்கள்", - "never": "ஒருபோதும்", + "add_beds": "படுக்கைகளைச் சேர்", + "add_details_of_patient": "நோயாளியின் விவரங்களைச் சேர்க்கவும்", + "add_location": "இருப்பிடத்தைச் சேர்க்கவும்", + "add_new_user": "புதிய பயனரைச் சேர்க்கவும்", "add_notes": "குறிப்புகளைச் சேர்க்கவும்", - "notes_placeholder": "உங்கள் குறிப்புகளைத் தட்டச்சு செய்யவும்", - "optional": "விருப்பமானது", - "discontinue": "நிறுத்து", - "discontinued": "நிறுத்தப்பட்டது", - "not_specified": "குறிப்பிடப்படவில்லை", + "add_prescription_medication": "பரிந்துரைக்கப்பட்ட மருந்துகளைச் சேர்க்கவும்", + "add_prescription_to_consultation_note": "இந்த ஆலோசனையில் புதிய மருந்துச் சீட்டைச் சேர்க்கவும்.", + "add_prn_prescription": "PRN மருந்துச் சீட்டைச் சேர்க்கவும்", + "address": "முகவரி", + "administer": "நிர்வாகம்", + "administer_medicine": "மருந்தை நிர்வகி", + "administer_medicines": "மருந்துகளை நிர்வகிக்கவும்", + "administer_selected_medicines": "தேர்ந்தெடுக்கப்பட்ட மருந்துகளை நிர்வகிக்கவும்", + "administered_on": "அன்று நிர்வகிக்கப்படுகிறது", + "administration_dosage_range_error": "ஆரம்ப மற்றும் இலக்கு டோஸ் இடையே மருந்தளவு இருக்க வேண்டும்", + "administration_notes": "நிர்வாக குறிப்புகள்", + "advanced_filters": "மேம்பட்ட வடிப்பான்கள்", + "age": "வயது", "all_changes_have_been_saved": "அனைத்து மாற்றங்களும் சேமிக்கப்பட்டன", - "no_data_found": "தரவு எதுவும் கிடைக்கவில்லை", - "edit": "திருத்தவும்", - "clear_selection": "தெளிவான தேர்வு", - "select_date": "தேதியைத் தேர்ந்தெடுக்கவும்", - "DD/MM/YYYY": "DD/MM/YYYY", - "clear_all_filters": "அனைத்து வடிப்பான்களையும் அழிக்கவும்", - "summary": "சுருக்கம்", - "report": "அறிக்கை", - "treating_doctor": "சிகிச்சை அளிக்கும் மருத்துவர்", - "ration_card__NO_CARD": "அட்டை இல்லாதவர்", - "ration_card__BPL": "பிபிஎல்", - "ration_card__APL": "ஏபிஎல்", - "empty_date_time": "--:-- --; ------------", - "caution": "எச்சரிக்கை", - "feed_optimal_experience_for_phones": "சிறந்த பார்வை அனுபவத்திற்கு, உங்கள் சாதனத்தைச் சுழற்றுவதைக் கவனியுங்கள்.", - "feed_optimal_experience_for_apple_phones": "சிறந்த பார்வை அனுபவத்திற்கு, உங்கள் சாதனத்தைச் சுழற்றுவதைக் கவனியுங்கள். உங்கள் சாதன அமைப்புகளில் தானாகச் சுழற்றுவது இயக்கப்பட்டிருப்பதை உறுதிசெய்யவும்.", - "action_irreversible": "இந்த நடவடிக்கை மீள முடியாதது", - "GENDER__1": "ஆண்", - "GENDER__2": "பெண்", - "GENDER__3": "பைனரி அல்லாத", - "normal": "இயல்பானது", - "done": "முடிந்தது", - "view": "காண்க", - "rename": "மறுபெயரிடவும்", - "more_info": "மேலும் தகவல்", + "all_details": "அனைத்து விவரங்களும்", + "allergies": "ஒவ்வாமை", + "allowed_formats_are": "அனுமதிக்கப்பட்ட வடிவங்கள்", + "already_a_member": "ஏற்கனவே உறுப்பினரா?", + "ambulance_driver_name": "ஆம்புலன்ஸ் ஓட்டுநரின் பெயர்", + "ambulance_number": "ஆம்புலன்ஸ் எண்", + "ambulance_phone_number": "ஆம்புலன்ஸின் தொலைபேசி எண்", + "antenatal": "முற்பிறவி", + "any_other_comments": "வேறு ஏதேனும் கருத்துகள்", + "apply": "விண்ணப்பிக்கவும்", + "approved_by_district_covid_control_room": "மாவட்ட கோவிட் கட்டுப்பாட்டு அறையால் அங்கீகரிக்கப்பட்டது", + "approving_facility": "அங்கீகரிக்கும் வசதியின் பெயர்", "archive": "காப்பகம்", - "discard": "நிராகரி", - "live": "வாழ்க", - "discharged": "வெளியேற்றப்பட்டது", "archived": "காப்பகப்படுத்தப்பட்டது", - "no_changes_made": "எந்த மாற்றமும் செய்யப்படவில்லை", - "user_deleted_successfuly": "பயனர் வெற்றிகரமாக நீக்கப்பட்டார்", - "users": "பயனர்கள்", + "are_you_still_watching": "நீங்கள் இன்னும் பார்க்கிறீர்களா?", "are_you_sure_want_to_delete": "{{name}}ஐ நிச்சயமாக நீக்க விரும்புகிறீர்களா?", - "oxygen_information": "ஆக்ஸிஜன் தகவல்", - "deleted_successfully": "{{name}} வெற்றிகரமாக நீக்கப்பட்டது", - "delete_item": "{{name}}ஐ நீக்கவும்", - "unsupported_browser": "ஆதரிக்கப்படாத உலாவி", - "unsupported_browser_description": "உங்கள் உலாவி ({{name}} பதிப்பு {{version}}) ஆதரிக்கப்படவில்லை. உங்கள் உலாவியை சமீபத்திய பதிப்பிற்கு புதுப்பிக்கவும் அல்லது சிறந்த அனுபவத்திற்காக ஆதரிக்கப்படும் உலாவிக்கு மாறவும்.", - "SORT_OPTIONS__-created_date": "புதிதாக உருவாக்கப்பட்ட தேதி முதலில்", - "SORT_OPTIONS__created_date": "பழைய உருவாக்கப்பட்ட தேதி முதலில்", - "SORT_OPTIONS__-category_severity": "அதிக தீவிரத்தன்மை பிரிவு முதலில்", - "SORT_OPTIONS__category_severity": "குறைந்த தீவிரத்தன்மை வகை முதலில்", - "SORT_OPTIONS__-modified_date": "முதலில் புதுப்பிக்கப்பட்ட தேதி", - "SORT_OPTIONS__modified_date": "பழைய புதுப்பிக்கப்பட்ட தேதி முதலில்", - "SORT_OPTIONS__facility__name,last_consultation__current_bed__bed__name": "படுக்கை எண் 1-N", - "SORT_OPTIONS__facility__name,-last_consultation__current_bed__bed__name": "படுக்கை எண். N-1", - "SORT_OPTIONS__-review_time": "சமீபத்திய மதிப்பாய்வு தேதி முதலில்", - "SORT_OPTIONS__review_time": "பழைய மதிப்பாய்வு தேதி முதலில்", - "SORT_OPTIONS__taken_at": "முதலில் எடுக்கப்பட்ட பழைய தேதி", - "SORT_OPTIONS__-taken_at": "சமீபத்தில் எடுக்கப்பட்ட தேதி முதலில்", - "SORT_OPTIONS__name": "நோயாளியின் பெயர் AZ", - "SORT_OPTIONS__-name": "நோயாளியின் பெயர் ZA", - "SORT_OPTIONS__bed__name": "படுக்கை எண் 1-N", - "SORT_OPTIONS__-bed__name": "படுக்கை எண். N-1", - "middleware_hostname": "மிடில்வேர் ஹோஸ்ட்பெயர்", - "local_ipaddress": "உள்ளூர் ஐபி முகவரி", - "no_consultation_updates": "ஆலோசனை அறிவிப்புகள் இல்லை", - "consultation_updates": "ஆலோசனை புதுப்பிப்புகள்", - "update_log": "புதுப்பிப்பு பதிவேடு", - "record_updates": "பதிவு புதுப்பிப்புகள்", - "log_lab_results": "பதிவு ஆய்வக முடிவுகள்", - "no_log_update_delta": "முந்தைய பதிவு புதுப்பித்தலுக்குப் பிறகு எந்த மாற்றமும் இல்லை", - "virtual_nursing_assistant": "மெய்நிகர் நர்சிங் உதவியாளர்", - "discharge": "வெளியேற்றம்", - "discharge_summary": "வெளியேற்ற சுருக்கம்", - "discharge_from_care": "CARE இலிருந்து வெளியேற்றம்", - "generating_discharge_summary": "வெளியேற்ற சுருக்கத்தை உருவாக்குகிறது", - "discharge_summary_not_ready": "டிஸ்சார்ஜ் சுருக்கம் இன்னும் தயாராகவில்லை.", - "download_discharge_summary": "வெளியேற்ற சுருக்கத்தைப் பதிவிறக்கவும்", - "email_discharge_summary_description": "டிஸ்சார்ஜ் சுருக்கத்தைப் பெற உங்கள் சரியான மின்னஞ்சல் முகவரியை உள்ளிடவும்", - "generated_summary_caution": "இது CARE அமைப்பில் கைப்பற்றப்பட்ட தகவலைப் பயன்படுத்தி கணினியில் உருவாக்கப்பட்ட சுருக்கமாகும்.", - "NORMAL": "சுருக்கமான புதுப்பிப்பு", - "VENTILATOR": "விரிவான புதுப்பிப்பு", - "DOCTORS_LOG": "முன்னேற்றக் குறிப்பு", - "AUTOMATED": "தானியங்கி", - "TELEMEDICINE": "டெலிமெடிசின்", - "investigations": "விசாரணைகள்", - "search_investigation_placeholder": "தேடல் விசாரணை & குழுக்கள்", - "save_investigation": "விசாரணையைச் சேமிக்கவும்", - "investigation_reports": "விசாரணை அறிக்கைகள்", - "no_investigation": "விசாரணை அறிக்கைகள் எதுவும் கிடைக்கவில்லை", - "investigations_suggested": "விசாரணைகள் பரிந்துரைக்கப்பட்டுள்ளன", - "to_be_conducted": "நடத்தப்பட வேண்டும்", - "log_report": "பதிவு அறிக்கை", - "no_investigation_suggestions": "விசாரணை பரிந்துரைகள் இல்லை", - "select_investigation": "விசாரணைகளைத் தேர்ந்தெடு (எல்லா விசாரணைகளும் இயல்பாகவே தேர்ந்தெடுக்கப்படும்)", - "select_investigations": "விசாரணைகளைத் தேர்ந்தெடுக்கவும்", - "get_tests": "சோதனைகளைப் பெறுங்கள்", - "select_investigation_groups": "விசாரணைக் குழுக்களைத் தேர்ந்தெடுக்கவும்", - "select_groups": "குழுக்களைத் தேர்ந்தெடுக்கவும்", - "generate_report": "அறிக்கையை உருவாக்கவும்", - "prev_sessions": "முந்தைய அமர்வுகள்", - "next_sessions": "அடுத்த அமர்வுகள்", - "no_changes": "மாற்றங்கள் இல்லை", - "back_to_consultation": "ஆலோசனைக்குத் திரும்பு", - "no_treating_physicians_available": "இந்த வசதியில் வீட்டு வசதி டாக்டர்கள் இல்லை. உங்கள் நிர்வாகியைத் தொடர்பு கொள்ளவும்.", - "encounter_suggestion_edit_disallowed": "திருத்த ஆலோசனையில் இந்த விருப்பத்திற்கு மாற அனுமதிக்கப்படவில்லை", - "encounter_suggestion__A": "சேர்க்கை", - "encounter_suggestion__DC": "வீட்டு பராமரிப்பு", - "encounter_suggestion__OP": "வெளி நோயாளி வருகை", - "encounter_suggestion__DD": "ஆலோசனை", - "encounter_suggestion__HI": "ஆலோசனை", - "encounter_suggestion__R": "ஆலோசனை", - "encounter_date_field_label__A": "வசதிக்கான சேர்க்கை தேதி மற்றும் நேரம்", - "encounter_date_field_label__DC": "வீட்டு பராமரிப்பு தொடங்கும் தேதி மற்றும் நேரம்", - "encounter_date_field_label__OP": "வெளி நோயாளி வருகையின் தேதி மற்றும் நேரம்", - "encounter_date_field_label__DD": "கலந்தாய்வு தேதி & நேரம்", - "encounter_date_field_label__HI": "கலந்தாய்வு தேதி & நேரம்", - "encounter_date_field_label__R": "கலந்தாய்வு தேதி & நேரம்", + "are_you_sure_want_to_delete_this_record": "இந்தப் பதிவை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", + "asset_class": "சொத்து வகுப்பு", + "asset_location": "சொத்து இருப்பிடம்", + "asset_name": "சொத்து பெயர்", + "asset_not_found_msg": "அச்சச்சோ! நீங்கள் தேடும் சொத்து இல்லை. சொத்து ஐடியைச் சரிபார்க்கவும்.", + "asset_qr_id": "சொத்து QR ஐடி", + "asset_type": "சொத்து வகை", + "assigned_facility": "வசதி ஒதுக்கப்பட்டுள்ளது", + "assigned_to": "க்கு ஒதுக்கப்பட்டது", + "audio__allow_permission": "தள அமைப்புகளில் மைக்ரோஃபோன் அனுமதியை அனுமதிக்கவும்", + "audio__allow_permission_button": "எப்படி அனுமதிப்பது என்பதை அறிய இங்கே கிளிக் செய்யவும்", + "audio__allow_permission_helper": "கடந்த காலத்தில் மைக்ரோஃபோன் அணுகலை நீங்கள் மறுத்திருக்கலாம்.", + "audio__record": "ஆடியோ பதிவு", + "audio__record_helper": "பதிவைத் தொடங்க பொத்தானைக் கிளிக் செய்யவும்", + "audio__recorded": "ஆடியோ பதிவு செய்யப்பட்டது", + "audio__recording": "பதிவு செய்தல்", + "audio__recording_helper": "உங்கள் மைக்ரோஃபோனில் பேசவும்.", + "audio__recording_helper_2": "பதிவை நிறுத்த பொத்தானைக் கிளிக் செய்யவும்.", + "audio__start_again": "மீண்டும் தொடங்கவும்", + "audit_log": "தணிக்கை பதிவு", + "auth_login_title": "அங்கீகரிக்கப்பட்ட உள்நுழைவு", + "authorize_shift_delete": "ஷிப்ட் நீக்கத்தை அங்கீகரிக்கவும்", + "auto_generated_for_care": "பராமரிப்புக்காக தானாக உருவாக்கப்பட்டுள்ளது", + "available_features": "கிடைக்கும் அம்சங்கள்", + "available_in": "கிடைக்கும் மொழிகள்", + "average_weekly_working_hours": "சராசரி வாராந்திர வேலை நேரம்", + "awaiting_destination_approval": "இலக்கு அனுமதிக்காக காத்திருக்கிறது", + "back": "மீண்டும்", "back_dated_encounter_date_caution": "நீங்கள் ஒரு சந்திப்பை உருவாக்குகிறீர்கள்", - "encounter_duration_confirmation": "இந்த சந்திப்பின் காலம் இருக்கும்", - "consultation_notes": "பொதுவான வழிமுறைகள் (ஆலோசனை)", - "procedure_suggestions": "செயல்முறை பரிந்துரைகள்", - "edit_cover_photo": "அட்டைப் படத்தைத் திருத்து", - "no_cover_photo_uploaded_for_this_facility": "இந்த வசதிக்காக அட்டைப் புகைப்படம் பதிவேற்றப்படவில்லை", + "back_to_consultation": "ஆலோசனைக்குத் திரும்பு", + "back_to_login": "உள்நுழைவு பக்கத்திற்குத் திரும்பு", + "base_dosage": "மருந்தளவு", + "bed_capacity": "படுக்கை திறன்", + "bed_search_placeholder": "படுக்கைகளின் பெயரைக் கொண்டு தேடுங்கள்", + "bed_type": "படுக்கை வகை", + "blood_group": "இரத்தக் குழு", + "board_view": "பலகை காட்சி", + "bradycardia": "பிராடி கார்டியா", + "breathlessness_level": "மூச்சுத்திணறல் நிலை", + "camera": "கேமரா", + "camera_permission_denied": "கேமரா அனுமதி நிராகரித்தது", + "cancel": "ரத்து செய்", + "capture": "பிடிப்பு", "capture_cover_photo": "அட்டைப் படத்தைப் பிடிக்கவும்", - "diagnoses": "நோய் கண்டறிகிறது", - "diagnosis_already_added": "இந்த நோயறிதல் ஏற்கனவே சேர்க்கப்பட்டது", - "principal": "அதிபர்", - "principal_diagnosis": "முதன்மை நோயறிதல்", - "unconfirmed": "உறுதி செய்யப்படவில்லை", - "provisional": "தற்காலிகமானது", - "differential": "வித்தியாசமான", - "confirmed": "உறுதி செய்யப்பட்டது", - "refuted": "மறுத்தார்", - "entered-in-error": "தவறுதலாக உள்ளிடப்பட்டது", - "help_unconfirmed": "இதை உறுதிப்படுத்தப்பட்ட நிலையாகக் கருதுவதற்கு போதுமான நோயறிதல் மற்றும்/அல்லது மருத்துவ சான்றுகள் இல்லை.", - "help_provisional": "இது ஒரு தற்காலிக நோயறிதல் - இன்னும் ஒரு வேட்பாளர் பரிசீலனையில் உள்ளது.", - "help_differential": "சாத்தியமான (மற்றும் பொதுவாக பரஸ்பரம் பிரத்தியேகமான) நோயறிதல்களின் தொகுப்பில் ஒன்று கண்டறியும் செயல்முறை மற்றும் பூர்வாங்க சிகிச்சையை மேலும் வழிகாட்டும்.", - "help_confirmed": "இதை உறுதிப்படுத்தப்பட்ட நிலையாகக் கருதுவதற்கு போதுமான நோயறிதல் மற்றும்/அல்லது மருத்துவ சான்றுகள் உள்ளன.", - "help_refuted": "இந்த நிலை அடுத்தடுத்த நோயறிதல் மற்றும் மருத்துவ சான்றுகளால் நிராகரிக்கப்பட்டது.", - "help_entered-in-error": "அறிக்கை பிழையாக உள்ளிடப்பட்டது, அது செல்லாது.", - "search_icd11_placeholder": "ICD-11 நோய் கண்டறிதல்களைத் தேடவும்", - "icd11_as_recommended": "WHO பரிந்துரைத்த ICD-11 இன் படி", - "Facilities": "வசதிகள்", - "Patients": "நோயாளிகள்", - "Sample Test": "மாதிரி சோதனை", - "Shifting": "மாற்றுதல்", - "Resource": "வளம்", - "Users": "பயனர்கள்", - "Profile": "சுயவிவரம்", - "Dashboard": "டாஷ்போர்டு", - "return_to_care": "CARE பக்கத்துக்குத் திரும்பு", - "404_message": "இல்லாத அல்லது வேறொரு URLக்கு நகர்த்தப்பட்ட ஒரு பக்கத்தில் நீங்கள் தடுமாறிவிட்டதாகத் தெரிகிறது. நீங்கள் சரியான இணைப்பை உள்ளிட்டுள்ளீர்கள் என்பதை உறுதிப்படுத்தவும்!", - "error_404": "பிழை 404", - "page_not_found": "பக்கம் கிடைக்கவில்லை", - "session_expired": "அமர்வு காலாவதியானது", - "invalid_password_reset_link": "தவறான கடவுச்சொல் மீட்டமைப்பு இணைப்பு", - "invalid_link_msg": "நீங்கள் பயன்படுத்திய கடவுச்சொல் மீட்டமைப்பு இணைப்பு தவறானது அல்லது காலாவதியானது போல் தெரிகிறது. புதிய கடவுச்சொல் மீட்டமைப்பு இணைப்பைக் கோரவும்.", - "return_to_password_reset": "கடவுச்சொல் மீட்டமைப்புக்குத் திரும்பு", - "return_to_login": "உள்நுழைவுக்குத் திரும்பு", - "session_expired_msg": "உங்கள் அமர்வு காலாவதியானது போல் தெரிகிறது. இது செயலற்ற தன்மை காரணமாக இருக்கலாம். தொடர மீண்டும் உள்நுழையவும்.", - "invalid_reset": "தவறான மீட்டமைப்பு", - "please_upload_a_csv_file": "CSV கோப்பைப் பதிவேற்றவும்", - "csv_file_in_the_specified_format": "குறிப்பிட்ட வடிவத்தில் CSV கோப்பைத் தேர்ந்தெடுக்கவும்", - "sample_format": "மாதிரி வடிவம்", - "search_for_facility": "வசதியைத் தேடுங்கள்", - "select_local_body": "உள்ளாட்சி அமைப்பைத் தேர்ந்தெடுக்கவும்", - "select_wards": "வார்டுகளைத் தேர்ந்தெடுக்கவும்", - "result_date": "முடிவு தேதி", - "sample_collection_date": "மாதிரி சேகரிப்பு தேதி", - "record_has_been_deleted_successfully": "பதிவு வெற்றிகரமாக நீக்கப்பட்டது.", - "error_while_deleting_record": "பதிவை நீக்குவதில் பிழை", - "result_details": "முடிவு விவரங்கள்", + "care": "கவனிப்பு", + "category": "வகை", + "caution": "எச்சரிக்கை", + "central_nursing_station": "மத்திய நர்சிங் நிலையம்", + "choose_file": "சாதனத்திலிருந்து பதிவேற்றவும்", + "choose_location": "இருப்பிடத்தைத் தேர்ந்தெடுக்கவும்", + "clear": "தெளிவு", + "clear_all_filters": "அனைத்து வடிப்பான்களையும் அழிக்கவும்", + "clear_home_facility": "தெளிவான வீட்டு வசதி", + "clear_selection": "தெளிவான தேர்வு", + "close": "மூடு", + "close_scanner": "ஸ்கேனரை மூடு", + "comment_added_successfully": "கருத்து வெற்றிகரமாக சேர்க்கப்பட்டது", + "comment_min_length": "கருத்து குறைந்தது 1 எழுத்தையாவது கொண்டிருக்க வேண்டும்", + "comments": "கருத்துகள்", + "completed": "முடிக்கப்பட்டது", + "configure": "கட்டமைக்கவும்", + "configure_facility": "வசதியை உள்ளமைக்கவும்", + "confirm": "உறுதிப்படுத்தவும்", "confirm_delete": "நீக்குவதை உறுதிப்படுத்தவும்", - "are_you_sure_want_to_delete_this_record": "இந்தப் பதிவை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", - "patient_category": "நோயாளி வகை", - "source": "ஆதாரம்", - "result": "முடிவு", - "sample_type": "மாதிரி வகை", - "patient_status": "நோயாளியின் நிலை", - "mobile_number": "மொபைல் எண்", - "patient_created": "நோயாளி உருவாக்கப்பட்டது", - "update_record": "பதிவைப் புதுப்பிக்கவும்", - "facility_search_placeholder": "வசதி / மாவட்ட பெயர் மூலம் தேடுங்கள்", - "advanced_filters": "மேம்பட்ட வடிப்பான்கள்", - "facility_name": "வசதி பெயர்", - "KASP Empanelled": "KASP சேர்ந்தார்", - "View Facility": "வசதி காண்க", - "no_duplicate_facility": "நீங்கள் நகல் வசதிகளை உருவாக்கக்கூடாது", - "no_facilities": "வசதிகள் எதுவும் கிடைக்கவில்லை", - "no_staff": "ஊழியர்கள் இல்லை", - "no_bed_types_found": "படுக்கை வகைகள் இல்லை", - "total_beds": "மொத்த படுக்கைகள்", + "confirm_discontinue": "நிறுத்துவதை உறுதிப்படுத்தவும்", + "confirm_password": "கடவுச்சொல்லை உறுதிப்படுத்தவும்", + "confirm_transfer_complete": "பரிமாற்றம் முடிந்தது என்பதை உறுதிப்படுத்தவும்!", + "confirmed": "உறுதி செய்யப்பட்டது", + "consultation_notes": "பொதுவான வழிமுறைகள் (ஆலோசனை)", + "consultation_updates": "ஆலோசனை புதுப்பிப்புகள்", + "contact_number": "தொடர்பு எண்", + "contact_person": "வசதி உள்ள தொடர்பு நபரின் பெயர்", + "contact_person_at_the_facility": "தற்போதைய வசதியில் உள்ள நபரைத் தொடர்பு கொள்ளவும்", + "contact_person_number": "தொடர்பு நபர் எண்", + "contact_phone": "தொடர்பு நபர் எண்", + "contact_your_admin_to_add_skills": "திறன்களைச் சேர்க்க உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்", + "continue": "தொடரவும்", + "continue_watching": "தொடர்ந்து பார்க்கவும்", + "contribute_github": "Github-ல் பங்களிப்பு செய்யுங்கள்", + "copied_to_clipboard": "கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது", + "countries_travelled": "நாடுகள் பயணம் செய்தன", + "covid_19_cat_gov": "அரசாங்கத்தின்படி கோவிட்_19 மருத்துவ வகை. கேரளா வழிகாட்டுதல் (A/B/C)", + "create": "உருவாக்கு", + "create_add_more": "உருவாக்கி மேலும் சேர்க்கவும்", + "create_asset": "சொத்தை உருவாக்கவும்", "create_facility": "புதிய வசதியை உருவாக்கவும்", - "staff_list": "பணியாளர்கள் பட்டியல்", - "bed_capacity": "படுக்கை திறன்", - "cylinders": "சிலிண்டர்கள்", - "cylinders_per_day": "சிலிண்டர்கள்/நாள்", - "liquid_oxygen_capacity": "திரவ ஆக்ஸிஜன் திறன்", - "expected_burn_rate": "எதிர்பார்க்கப்படும் எரிப்பு விகிதம்", - "type_b_cylinders": "பி வகை சிலிண்டர்கள்", - "type_c_cylinders": "சி வகை சிலிண்டர்கள்", - "type_d_cylinders": "டி வகை சிலிண்டர்கள்", - "update_asset": "சொத்தைப் புதுப்பிக்கவும்", "create_new_asset": "புதிய சொத்தை உருவாக்கவும்", - "you_need_at_least_a_location_to_create_an_assest": "ஒரு அசெஸ்ட்டை உருவாக்க குறைந்தபட்சம் ஒரு இருப்பிடமாவது தேவை.", - "add_location": "இருப்பிடத்தைச் சேர்க்கவும்", - "close_scanner": "ஸ்கேனரை மூடு", - "scan_asset_qr": "அசெட் க்யூஆர் ஸ்கேன்!", - "create": "உருவாக்கு", - "asset_name": "சொத்து பெயர்", - "asset_location": "சொத்து இருப்பிடம்", - "asset_type": "சொத்து வகை", - "asset_class": "சொத்து வகுப்பு", - "details_about_the_equipment": "உபகரணங்கள் பற்றிய விவரங்கள்", - "working_status": "வேலை நிலை", - "why_the_asset_is_not_working": "சொத்து ஏன் வேலை செய்யவில்லை?", - "describe_why_the_asset_is_not_working": "சொத்து ஏன் வேலை செய்யவில்லை என்பதை விவரிக்கவும்", - "asset_qr_id": "சொத்து QR ஐடி", - "manufacturer": "உற்பத்தியாளர்", - "eg_xyz": "எ.கா. XYZ", - "eg_abc": "எ.கா. ஏபிசி", - "warranty_amc_expiry": "உத்தரவாதம் / AMC காலாவதி", + "create_resource_request": "ஆதார கோரிக்கையை உருவாக்கவும்", + "created": "உருவாக்கப்பட்டது", + "created_date": "உருவாக்கப்பட்ட தேதி", + "csv_file_in_the_specified_format": "குறிப்பிட்ட வடிவத்தில் CSV கோப்பைத் தேர்ந்தெடுக்கவும்", + "customer_support_email": "வாடிக்கையாளர் ஆதரவு மின்னஞ்சல்", "customer_support_name": "வாடிக்கையாளர் ஆதரவு பெயர்", "customer_support_number": "வாடிக்கையாளர் ஆதரவு எண்", - "customer_support_email": "வாடிக்கையாளர் ஆதரவு மின்னஞ்சல்", - "eg_mail_example_com": "எ.கா. mail@example.com", - "vendor_name": "விற்பனையாளர் பெயர்", - "serial_number": "வரிசை எண்", - "last_serviced_on": "கடைசியாக சேவை செய்யப்பட்டது", - "create_add_more": "உருவாக்கி மேலும் சேர்க்கவும்", - "discharged_patients": "வெளியேற்றப்பட்ட நோயாளிகள்", - "discharged_patients_empty": "இந்த வசதியில் டிஸ்சார்ஜ் செய்யப்பட்ட நோயாளிகள் யாரும் இல்லை", - "update_facility_middleware_success": "வசதி மிடில்வேர் வெற்றிகரமாக புதுப்பிக்கப்பட்டது", - "treatment_summary__head_title": "சிகிச்சை சுருக்கம்", - "treatment_summary__print": "அச்சு சிகிச்சை சுருக்கம்", - "treatment_summary__heading": "இடைக்கால சிகிச்சை சுருக்கம்", - "patient_registration__name": "பெயர்", - "patient_registration__address": "முகவரி", - "patient_registration__age": "வயது", - "patient_consultation__op": "OP", - "patient_consultation__ip": "ஐபி", - "patient_consultation__dc_admission": "வீட்டு பராமரிப்பு தேதி தொடங்கியது", - "patient_consultation__admission": "சேர்க்கை தேதி", - "patient_registration__gender": "பாலினம்", - "patient_registration__contact": "அவசரத் தொடர்பு", - "patient_registration__comorbidities": "கூட்டு நோய்கள்", - "patient_registration__comorbidities__disease": "நோய்", - "patient_registration__comorbidities__details": "விவரங்கள்", - "patient_consultation__consultation_notes": "பொதுவான வழிமுறைகள்", - "patient_consultation__special_instruction": "சிறப்பு வழிமுறைகள்", - "suggested_investigations": "பரிந்துரைக்கப்பட்ட விசாரணைகள்", - "investigations__date": "தேதி", - "investigations__name": "பெயர்", - "investigations__result": "முடிவு", - "investigations__ideal_value": "சிறந்த மதிப்பு", - "investigations__range": "மதிப்பு வரம்பு", - "investigations__unit": "அலகு", - "patient_consultation__treatment__plan": "திட்டம்", - "patient_consultation__treatment__summary": "சுருக்கம்", - "patient_consultation__treatment__summary__date": "தேதி", - "patient_consultation__treatment__summary__spo2": "SpO2", - "patient_consultation__treatment__summary__temperature": "வெப்பநிலை", - "diagnosis__principal": "அதிபர்", + "cylinders": "சிலிண்டர்கள்", + "cylinders_per_day": "சிலிண்டர்கள்/நாள்", + "date_and_time": "தேதி மற்றும் நேரம்", + "date_of_admission": "சேர்க்கை தேதி", + "date_of_birth": "பிறந்த தேதி", + "date_of_positive_covid_19_swab": "பாசிட்டிவ் கோவிட் 19 ஸ்வாப் தேதி", + "date_of_test": "தேர்வு தேதி", + "days": "நாட்கள்", + "delete": "நீக்கு", + "delete_facility": "நீக்கு வசதி", + "delete_item": "{{name}}ஐ நீக்கவும்", + "delete_record": "பதிவை நீக்கு", + "deleted_successfully": "{{name}} வெற்றிகரமாக நீக்கப்பட்டது", + "describe_why_the_asset_is_not_working": "சொத்து ஏன் வேலை செய்யவில்லை என்பதை விவரிக்கவும்", + "description": "விளக்கம்", + "details_about_the_equipment": "உபகரணங்கள் பற்றிய விவரங்கள்", + "details_of_assigned_facility": "ஒதுக்கப்பட்ட வசதியின் விவரங்கள்", + "details_of_origin_facility": "மூல வசதியின் விவரங்கள்", + "details_of_patient": "நோயாளியின் விவரங்கள்", + "details_of_shifting_approving_facility": "ஒப்புதல் வசதியை மாற்றுவதற்கான விவரங்கள்", + "diagnoses": "நோய் கண்டறிகிறது", + "diagnosis": "நோய் கண்டறிதல்", "diagnosis__confirmed": "உறுதி செய்யப்பட்டது", + "diagnosis__differential": "வித்தியாசமான", + "diagnosis__principal": "அதிபர்", "diagnosis__provisional": "தற்காலிகமானது", "diagnosis__unconfirmed": "உறுதி செய்யப்படவில்லை", - "diagnosis__differential": "வித்தியாசமான", - "active_prescriptions": "செயலில் உள்ள மருந்துகள்", - "prescriptions__medicine": "மருந்து", - "prescriptions__route": "பாதை", - "prescriptions__dosage_frequency": "மருந்தளவு & அதிர்வெண்", - "prescriptions__start_date": "அன்று பரிந்துரைக்கப்பட்டது", - "select_facility_for_discharged_patients_warning": "டிஸ்சார்ஜ் செய்யப்பட்ட நோயாளிகளைப் பார்க்க வசதியைத் தேர்ந்தெடுக்க வேண்டும்.", + "diagnosis_already_added": "இந்த நோயறிதல் ஏற்கனவே சேர்க்கப்பட்டது", + "diastolic": "டயஸ்டாலிக்", + "differential": "வித்தியாசமான", + "discard": "நிராகரி", + "discharge": "வெளியேற்றம்", + "discharge_from_care": "CARE இலிருந்து வெளியேற்றம்", + "discharge_prescription": "வெளியேற்ற மருந்து", + "discharge_summary": "வெளியேற்ற சுருக்கம்", + "discharge_summary_not_ready": "டிஸ்சார்ஜ் சுருக்கம் இன்னும் தயாராகவில்லை.", + "discharged": "வெளியேற்றப்பட்டது", + "discharged_patients": "வெளியேற்றப்பட்ட நோயாளிகள்", + "discharged_patients_empty": "இந்த வசதியில் டிஸ்சார்ஜ் செய்யப்பட்ட நோயாளிகள் யாரும் இல்லை", + "disclaimer": "மறுப்பு", + "discontinue": "நிறுத்து", + "discontinue_caution_note": "இந்த மருந்தை நிச்சயமாக நிறுத்த விரும்புகிறீர்களா?", + "discontinued": "நிறுத்தப்பட்டது", + "disease_status": "நோய் நிலை", + "district": "மாவட்டம்", + "district_program_management_supporting_unit": "மாவட்ட திட்ட மேலாண்மை துணை அலகு", + "done": "முடிந்தது", + "dosage": "மருந்தளவு", + "down": "கீழே", + "download": "பதிவிறக்கவும்", + "download_discharge_summary": "வெளியேற்ற சுருக்கத்தைப் பதிவிறக்கவும்", + "download_type": "பதிவிறக்க வகை", + "downloading": "பதிவிறக்குகிறது", + "downloads": "பதிவிறக்கங்கள்", + "drag_drop_image_to_upload": "பதிவேற்ற படத்தை இழுத்து விடவும்", + "duplicate_patient_record_birth_unknown": "நோயாளியின் பிறந்த ஆண்டு குறித்து உங்களுக்குத் தெரியாவிட்டால், உங்கள் மாவட்ட பராமரிப்பு ஒருங்கிணைப்பாளர், இடமாற்றம் செய்யும் வசதி அல்லது நோயாளியைத் தொடர்பு கொள்ளவும்.", "duplicate_patient_record_confirmation": "பிறந்த ஆண்டைச் சேர்ப்பதன் மூலம் நோயாளியின் பதிவை உங்கள் வசதியில் அனுமதிக்கவும்", "duplicate_patient_record_rejection": "நான் உருவாக்க விரும்பும் சந்தேக நபர் / நோயாளி பட்டியலில் இல்லை என்பதை உறுதிப்படுத்துகிறேன்.", - "duplicate_patient_record_birth_unknown": "நோயாளியின் பிறந்த ஆண்டு குறித்து உங்களுக்குத் தெரியாவிட்டால், உங்கள் மாவட்ட பராமரிப்பு ஒருங்கிணைப்பாளர், இடமாற்றம் செய்யும் வசதி அல்லது நோயாளியைத் தொடர்பு கொள்ளவும்.", - "patient_transfer_birth_match_note": "குறிப்பு: பரிமாற்றக் கோரிக்கையைச் செயல்படுத்த, பிறந்த ஆண்டு நோயாளியுடன் பொருந்த வேண்டும்.", - "available_features": "கிடைக்கும் அம்சங்கள்", - "update_facility": "மேம்படுத்தல் வசதி", - "configure_facility": "வசதியை உள்ளமைக்கவும்", - "inventory_management": "சரக்கு மேலாண்மை", - "location_management": "இருப்பிட மேலாண்மை", - "resource_request": "ஆதார கோரிக்கை", - "view_asset": "சொத்துக்களைப் பார்க்கவும்", - "view_users": "பயனர்களைக் காண்க", - "view_abdm_records": "ABDM பதிவுகளைப் பார்க்கவும்", - "delete_facility": "நீக்கு வசதி", - "central_nursing_station": "மத்திய நர்சிங் நிலையம்", - "add_details_of_patient": "நோயாளியின் விவரங்களைச் சேர்க்கவும்", - "choose_location": "இருப்பிடத்தைத் தேர்ந்தெடுக்கவும்", - "live_monitoring": "நேரடி கண்காணிப்பு", - "open_live_monitoring": "நேரடி கண்காணிப்பைத் திறக்கவும்", - "audio__allow_permission": "தள அமைப்புகளில் மைக்ரோஃபோன் அனுமதியை அனுமதிக்கவும்", - "audio__allow_permission_helper": "கடந்த காலத்தில் மைக்ரோஃபோன் அணுகலை நீங்கள் மறுத்திருக்கலாம்.", - "audio__allow_permission_button": "எப்படி அனுமதிப்பது என்பதை அறிய இங்கே கிளிக் செய்யவும்", - "audio__record": "ஆடியோ பதிவு", - "audio__record_helper": "பதிவைத் தொடங்க பொத்தானைக் கிளிக் செய்யவும்", - "audio__recording": "பதிவு செய்தல்", - "audio__recording_helper": "உங்கள் மைக்ரோஃபோனில் பேசவும்.", - "audio__recording_helper_2": "பதிவை நிறுத்த பொத்தானைக் கிளிக் செய்யவும்.", - "audio__recorded": "ஆடியோ பதிவு செய்யப்பட்டது", - "audio__start_again": "மீண்டும் தொடங்கவும்", + "edit": "திருத்தவும்", + "edit_caution_note": "திருத்தப்பட்ட விவரங்களுடன் கலந்தாய்வில் புதிய மருந்துச் சீட்டு சேர்க்கப்படும் மற்றும் தற்போதைய மருந்துச் சீட்டு நிறுத்தப்படும்.", + "edit_cover_photo": "அட்டைப் படத்தைத் திருத்து", + "edit_history": "வரலாற்றைத் திருத்தவும்", + "edit_prescriptions": "மருந்துச்சீட்டுகளைத் திருத்தவும்", + "edited_by": "திருத்தியது", + "edited_on": "அன்று திருத்தப்பட்டது", + "eg_abc": "எ.கா. ஏபிசி", + "eg_details_on_functionality_service_etc": "எ.கா. செயல்பாடு, சேவை போன்றவை பற்றிய விவரங்கள்.", + "eg_mail_example_com": "எ.கா. mail@example.com", + "eg_xyz": "எ.கா. XYZ", + "email": "மின்னஞ்சல் முகவரி", + "email_address": "மின்னஞ்சல் முகவரி", + "email_discharge_summary_description": "டிஸ்சார்ஜ் சுருக்கத்தைப் பெற உங்கள் சரியான மின்னஞ்சல் முகவரியை உள்ளிடவும்", + "email_success": "விரைவில் மின்னஞ்சல் அனுப்புவோம். உங்கள் இன்பாக்ஸை சரிபார்க்கவும்.", + "emergency": "அவசரநிலை", + "emergency_contact_number": "அவசர தொடர்பு எண்", + "empty_date_time": "--:-- --; ------------", + "encounter_date_field_label__A": "வசதிக்கான சேர்க்கை தேதி மற்றும் நேரம்", + "encounter_date_field_label__DC": "வீட்டு பராமரிப்பு தொடங்கும் தேதி மற்றும் நேரம்", + "encounter_date_field_label__DD": "கலந்தாய்வு தேதி & நேரம்", + "encounter_date_field_label__HI": "கலந்தாய்வு தேதி & நேரம்", + "encounter_date_field_label__OP": "வெளி நோயாளி வருகையின் தேதி மற்றும் நேரம்", + "encounter_date_field_label__R": "கலந்தாய்வு தேதி & நேரம்", + "encounter_duration_confirmation": "இந்த சந்திப்பின் காலம் இருக்கும்", + "encounter_suggestion__A": "சேர்க்கை", + "encounter_suggestion__DC": "வீட்டு பராமரிப்பு", + "encounter_suggestion__DD": "ஆலோசனை", + "encounter_suggestion__HI": "ஆலோசனை", + "encounter_suggestion__OP": "வெளி நோயாளி வருகை", + "encounter_suggestion__R": "ஆலோசனை", + "encounter_suggestion_edit_disallowed": "திருத்த ஆலோசனையில் இந்த விருப்பத்திற்கு மாற அனுமதிக்கப்படவில்லை", "enter_file_name": "கோப்பு பெயரை உள்ளிடவும்", - "no_files_found": "{{type}} கோப்புகள் இல்லை", - "upload_headings__patient": "புதிய நோயாளி கோப்பை பதிவேற்றவும்", - "upload_headings__consultation": "புதிய ஆலோசனைக் கோப்பைப் பதிவேற்றவும்", - "upload_headings__sample_report": "மாதிரி அறிக்கையைப் பதிவேற்றவும்", - "upload_headings__supporting_info": "துணைத் தகவலைப் பதிவேற்றவும்", - "file_list_headings__patient": "நோயாளி கோப்புகள்", - "file_list_headings__consultation": "ஆலோசனை கோப்புகள்", - "file_list_headings__sample_report": "மாதிரி அறிக்கை", - "file_list_headings__supporting_info": "துணைத் தகவல்", + "enter_valid_age": "செல்லுபடியாகும் வயதை உள்ளிடவும்", + "entered-in-error": "தவறுதலாக உள்ளிடப்பட்டது", + "error_404": "பிழை 404", + "error_deleting_shifting": "பதிவை மாற்றுவதில் பிழை", + "error_while_deleting_record": "பதிவை நீக்குவதில் பிழை", + "escape": "எஸ்கேப்", + "estimated_contact_date": "மதிப்பிடப்பட்ட தொடர்பு தேதி", + "expected_burn_rate": "எதிர்பார்க்கப்படும் எரிப்பு விகிதம்", + "facilities": "வசதிகள்", + "facility": "வசதி", + "facility_name": "வசதி பெயர்", + "facility_preference": "வசதி விருப்பம்", + "facility_search_placeholder": "வசதி / மாவட்ட பெயர் மூலம் தேடுங்கள்", + "facility_type": "வசதி வகை", + "features": "அம்சங்கள்", + "feed_is_currently_not_live": "ஊட்டம் தற்போது நேரலையில் இல்லை", + "feed_optimal_experience_for_apple_phones": "சிறந்த பார்வை அனுபவத்திற்கு, உங்கள் சாதனத்தைச் சுழற்றுவதைக் கவனியுங்கள். உங்கள் சாதன அமைப்புகளில் தானாகச் சுழற்றுவது இயக்கப்பட்டிருப்பதை உறுதிசெய்யவும்.", + "feed_optimal_experience_for_phones": "சிறந்த பார்வை அனுபவத்திற்கு, உங்கள் சாதனத்தைச் சுழற்றுவதைக் கவனியுங்கள்.", + "field_required": "இந்த புலம் தேவை", "file_error__choose_file": "பதிவேற்ற ஒரு கோப்பைத் தேர்ந்தெடுக்கவும்", + "file_error__dynamic": "கோப்பைப் பதிவேற்றுவதில் பிழை: {{statusText}}", "file_error__file_name": "கோப்பின் பெயரை உள்ளிடவும்", "file_error__file_size": "கோப்புகளின் அதிகபட்ச அளவு 100 எம்பி", "file_error__file_type": "தவறான கோப்பு வகை \".{{extension}}\" அனுமதிக்கப்பட்ட வகைகள்: {{allowedExtensions}}", - "file_uploaded": "கோப்பு வெற்றிகரமாக பதிவேற்றப்பட்டது", - "file_error__dynamic": "கோப்பைப் பதிவேற்றுவதில் பிழை: {{statusText}}", "file_error__network": "கோப்பைப் பதிவேற்றுவதில் பிழை: பிணையப் பிழை", - "monitor": "கண்காணிக்கவும்", - "show_default_presets": "இயல்புநிலை முன்னமைவுகளைக் காட்டு", - "show_patient_presets": "நோயாளியின் முன்னமைவுகளைக் காட்டு", - "moving_camera": "நகரும் கேமரா", + "file_list_headings__consultation": "ஆலோசனை கோப்புகள்", + "file_list_headings__patient": "நோயாளி கோப்புகள்", + "file_list_headings__sample_report": "மாதிரி அறிக்கை", + "file_list_headings__supporting_info": "துணைத் தகவல்", + "file_preview": "கோப்பு முன்னோட்டம்", + "file_preview_not_supported": "இந்தக் கோப்பை முன்னோட்டமிட முடியவில்லை. பதிவிறக்கம் செய்து பாருங்கள்.", + "file_uploaded": "கோப்பு வெற்றிகரமாக பதிவேற்றப்பட்டது", + "filter": "வடிகட்டி", + "filter_by": "வடிகட்டவும்", + "filter_by_category": "வகையின்படி வடிகட்டவும்", + "filters": "வடிப்பான்கள்", + "first_name": "முதல் பெயர்", + "footer_body": "கொரோனா சேஃப் நெட்வொர்க் என்பது ஒரு திறந்த மூல பொது பயன்பாடாகும், இது கேரள அரசாங்கத்தின் முழு புரிதலுடனும் ஆதரவிற்கும் அரசாங்க முயற்சிகளை ஆதரிக்க ஒரு மாதிரியில் பணிபுரியும் புதுமைப்பித்தர்கள் மற்றும் தன்னார்வலர்களின் பல ஒழுக்கக் குழுவால் வடிவமைக்கப்பட்டுள்ளது.", + "forget_password": "கடவுச்சொல்லை மறந்துவிட்டீர்களா?", + "forget_password_instruction": "உங்கள் பயனர்பெயரை உள்ளிடவும், உங்கள் கடவுச்சொல்லை மீட்டமைக்க ஒரு இணைப்பை நாங்கள் உங்களுக்கு அனுப்புவோம்.", + "frequency": "அதிர்வெண்", "full_screen": "முழுத்திரை", - "feed_is_currently_not_live": "ஊட்டம் தற்போது நேரலையில் இல்லை", - "zoom_out": "பெரிதாக்கவும்", - "zoom_in": "பெரிதாக்கவும்", - "right": "சரி", + "gender": "பாலினம்", + "generate_report": "அறிக்கையை உருவாக்கவும்", + "generated_summary_caution": "இது CARE அமைப்பில் கைப்பற்றப்பட்ட தகவலைப் பயன்படுத்தி கணினியில் உருவாக்கப்பட்ட சுருக்கமாகும்.", + "generating": "உருவாக்குகிறது", + "generating_discharge_summary": "வெளியேற்ற சுருக்கத்தை உருவாக்குகிறது", + "get_tests": "சோதனைகளைப் பெறுங்கள்", + "goal": "டிஜிட்டல் கருவிகளைப் பயன்படுத்தி பொது சுகாதார சேவைகளின் தரம் மற்றும் அணுகல்தன்மையை தொடர்ந்து மேம்படுத்துவதே எங்கள் குறிக்கோள்.", + "help_confirmed": "இதை உறுதிப்படுத்தப்பட்ட நிலையாகக் கருதுவதற்கு போதுமான நோயறிதல் மற்றும்/அல்லது மருத்துவ சான்றுகள் உள்ளன.", + "help_differential": "சாத்தியமான (மற்றும் பொதுவாக பரஸ்பரம் பிரத்தியேகமான) நோயறிதல்களின் தொகுப்பில் ஒன்று கண்டறியும் செயல்முறை மற்றும் பூர்வாங்க சிகிச்சையை மேலும் வழிகாட்டும்.", + "help_entered-in-error": "அறிக்கை பிழையாக உள்ளிடப்பட்டது, அது செல்லாது.", + "help_provisional": "இது ஒரு தற்காலிக நோயறிதல் - இன்னும் ஒரு வேட்பாளர் பரிசீலனையில் உள்ளது.", + "help_refuted": "இந்த நிலை அடுத்தடுத்த நோயறிதல் மற்றும் மருத்துவ சான்றுகளால் நிராகரிக்கப்பட்டது.", + "help_unconfirmed": "இதை உறுதிப்படுத்தப்பட்ட நிலையாகக் கருதுவதற்கு போதுமான நோயறிதல் மற்றும்/அல்லது மருத்துவ சான்றுகள் இல்லை.", + "hide": "மறை", + "home_facility": "வீட்டு வசதி", + "icd11_as_recommended": "WHO பரிந்துரைத்த ICD-11 இன் படி", + "inconsistent_dosage_units_error": "மருந்தளவு அலகுகள் ஒரே மாதிரியாக இருக்க வேண்டும்", + "india_1": "இந்தியா", + "indian_mobile": "இந்திய மொபைல்", + "indicator": "காட்டி", + "inidcator_event": "காட்டி நிகழ்வு", + "instruction_on_titration": "டைட்ரேஷன் பற்றிய வழிமுறைகள்", + "international_mobile": "சர்வதேச மொபைல்", + "invalid_asset_id_msg": "அச்சச்சோ! நீங்கள் உள்ளிட்ட சொத்து ஐடி சரியானதாகத் தெரியவில்லை.", + "invalid_email": "செல்லுபடியாகும் மின்னஞ்சல் முகவரியை உள்ளிடவும்", + "invalid_link_msg": "நீங்கள் பயன்படுத்திய கடவுச்சொல் மீட்டமைப்பு இணைப்பு தவறானது அல்லது காலாவதியானது போல் தெரிகிறது. புதிய கடவுச்சொல் மீட்டமைப்பு இணைப்பைக் கோரவும்.", + "invalid_password": "கடவுச்சொல் தேவைகளை பூர்த்தி செய்யவில்லை", + "invalid_password_reset_link": "தவறான கடவுச்சொல் மீட்டமைப்பு இணைப்பு", + "invalid_phone": "செல்லுபடியாகும் தொலைபேசி எண்ணை உள்ளிடவும்", + "invalid_phone_number": "தவறான தொலைபேசி எண்", + "invalid_pincode": "தவறான பின்கோடு", + "invalid_reset": "தவறான மீட்டமைப்பு", + "invalid_username": "தேவை. 150 எழுத்துக்கள் அல்லது குறைவானவை. எழுத்துக்கள், எண்கள் மற்றும் @ /. / + / - / _ மட்டும்.", + "inventory_management": "சரக்கு மேலாண்மை", + "investigation_reports": "விசாரணை அறிக்கைகள்", + "investigations": "விசாரணைகள்", + "investigations__date": "தேதி", + "investigations__ideal_value": "சிறந்த மதிப்பு", + "investigations__name": "பெயர்", + "investigations__range": "மதிப்பு வரம்பு", + "investigations__result": "முடிவு", + "investigations__unit": "அலகு", + "investigations_suggested": "விசாரணைகள் பரிந்துரைக்கப்பட்டுள்ளன", + "is": "உள்ளது", + "is_antenatal": "பிறப்புக்கு முந்தையது", + "is_emergency": "அவசரநிலை", + "is_emergency_case": "அவசர வழக்கு", + "is_it_upshift": "அது உயர்வானதா", + "is_this_an_emergency": "இது அவசரநிலையா?", + "is_this_an_upshift": "இது ஒரு உயர்வுதானா?", + "is_up_shift": "மாறிவிட்டது", + "is_upshift_case": "அப்ஷிஃப்ட் கேஸ்", + "landline": "இந்திய லேண்ட்லைன்", + "last_administered": "கடைசியாக நிர்வகிக்கப்பட்டது", + "last_edited": "கடைசியாக திருத்தப்பட்டது", + "last_modified": "கடைசியாக மாற்றப்பட்டது", + "last_name": "கடைசி பெயர்", + "last_online": "கடைசியாக ஆன்லைன்", + "last_serviced_on": "கடைசியாக சேவை செய்யப்பட்டது", + "latitude_invalid": "அட்சரேகை -90 மற்றும் 90 க்கு இடையில் இருக்க வேண்டும்", "left": "விட்டு", - "down": "கீழே", - "up": "மேலே", - "RESPIRATORY_SUPPORT_SHORT__UNKNOWN": "இல்லை", - "RESPIRATORY_SUPPORT_SHORT__OXYGEN_SUPPORT": "O2 ஆதரவு", - "RESPIRATORY_SUPPORT_SHORT__NON_INVASIVE": "என்.ஐ.வி", - "RESPIRATORY_SUPPORT_SHORT__INVASIVE": "IV", - "RESPIRATORY_SUPPORT__UNKNOWN": "இல்லை", - "RESPIRATORY_SUPPORT__OXYGEN_SUPPORT": "ஆக்ஸிஜன் ஆதரவு", - "RESPIRATORY_SUPPORT__NON_INVASIVE": "ஆக்கிரமிப்பு அல்லாத வென்டிலேட்டர் (NIV)", - "RESPIRATORY_SUPPORT__INVASIVE": "ஊடுருவும் காற்றோட்டம் (IV)", - "VENTILATOR_MODE__CMV": "கட்டுப்பாட்டு இயந்திர காற்றோட்டம் (CMV)", - "VENTILATOR_MODE__VCV": "வால்யூம் கண்ட்ரோல் வென்டிலேஷன் (VCV)", - "VENTILATOR_MODE__PCV": "அழுத்தம் கட்டுப்பாட்டு காற்றோட்டம் (PCV)", - "VENTILATOR_MODE__SIMV": "ஒத்திசைக்கப்பட்ட இடைப்பட்ட கட்டாய காற்றோட்டம் (SIMV)", - "VENTILATOR_MODE__VC_SIMV": "தொகுதி கட்டுப்படுத்தப்பட்ட SIMV (VC-SIMV)", - "VENTILATOR_MODE__PC_SIMV": "அழுத்தம் கட்டுப்படுத்தப்பட்ட SIMV (PC-SIMV)", - "VENTILATOR_MODE__PSV": "சி-பிஏபி / பிரஷர் சப்போர்ட் வென்டிலேஷன் (பிஎஸ்வி)", - "CONSCIOUSNESS_LEVEL__UNRESPONSIVE": "பதிலளிக்காதது", - "CONSCIOUSNESS_LEVEL__RESPONDS_TO_PAIN": "வலிக்கு பதிலளிக்கிறது", - "CONSCIOUSNESS_LEVEL__RESPONDS_TO_VOICE": "குரலுக்கு பதிலளிக்கிறது", - "CONSCIOUSNESS_LEVEL__ALERT": "எச்சரிக்கை", - "CONSCIOUSNESS_LEVEL__AGITATED_OR_CONFUSED": "கலக்கம் அல்லது குழப்பம்", - "CONSCIOUSNESS_LEVEL__ONSET_OF_AGITATION_AND_CONFUSION": "கிளர்ச்சி மற்றும் குழப்பத்தின் ஆரம்பம்", - "PUPIL_REACTION__UNKNOWN": "தெரியவில்லை", - "PUPIL_REACTION__BRISK": "சுறுசுறுப்பான", - "PUPIL_REACTION__SLUGGISH": "மந்தமான", - "PUPIL_REACTION__FIXED": "சரி செய்யப்பட்டது", - "PUPIL_REACTION__CANNOT_BE_ASSESSED": "மதிப்பிட முடியாது", - "LIMB_RESPONSE__UNKNOWN": "தெரியவில்லை", - "LIMB_RESPONSE__STRONG": "வலுவான", - "LIMB_RESPONSE__MODERATE": "மிதமான", - "LIMB_RESPONSE__WEAK": "பலவீனமான", - "LIMB_RESPONSE__FLEXION": "நெகிழ்வு", - "LIMB_RESPONSE__EXTENSION": "நீட்டிப்பு", - "LIMB_RESPONSE__NONE": "இல்லை", - "OXYGEN_MODALITY__NASAL_PRONGS": "நாசி முனைகள்", - "OXYGEN_MODALITY__SIMPLE_FACE_MASK": "எளிய முகமூடி", - "OXYGEN_MODALITY__NON_REBREATHING_MASK": "சுவாசிக்காத முகமூடி", - "OXYGEN_MODALITY__HIGH_FLOW_NASAL_CANNULA": "அதிக ஓட்டம் நாசி கேனுலா", - "INSULIN_INTAKE_FREQUENCY__UNKNOWN": "தெரியவில்லை", - "INSULIN_INTAKE_FREQUENCY__OD": "ஒரு நாளைக்கு ஒரு முறை (OD)", - "INSULIN_INTAKE_FREQUENCY__BD": "ஒரு நாளைக்கு இரண்டு முறை (BD)", - "INSULIN_INTAKE_FREQUENCY__TD": "ஒரு நாளைக்கு மூன்று முறை (டிடி)", - "NURSING_CARE_PROCEDURE__personal_hygiene": "தனிப்பட்ட சுகாதாரம்", - "NURSING_CARE_PROCEDURE__positioning": "நிலைப்படுத்துதல்", - "NURSING_CARE_PROCEDURE__suctioning": "உறிஞ்சும்", - "NURSING_CARE_PROCEDURE__ryles_tube_care": "ரைல்ஸ் குழாய் பராமரிப்பு", - "NURSING_CARE_PROCEDURE__iv_sitecare": "IV தள பராமரிப்பு", - "NURSING_CARE_PROCEDURE__nubulisation": "நுபுலைசேஷன்", - "NURSING_CARE_PROCEDURE__dressing": "ஆடை அணிதல்", - "NURSING_CARE_PROCEDURE__dvt_pump_stocking": "DVT பம்ப் ஸ்டாக்கிங்", - "NURSING_CARE_PROCEDURE__restrain": "கட்டுப்படுத்து", - "NURSING_CARE_PROCEDURE__chest_tube_care": "மார்பு குழாய் பராமரிப்பு", - "NURSING_CARE_PROCEDURE__tracheostomy_care": "டிரக்கியோஸ்டமி பராமரிப்பு", - "NURSING_CARE_PROCEDURE__stoma_care": "ஸ்டோமா கேர்", - "NURSING_CARE_PROCEDURE__catheter_care": "வடிகுழாய் பராமரிப்பு", - "HEARTBEAT_RHYTHM__REGULAR": "வழக்கமான", - "HEARTBEAT_RHYTHM__IRREGULAR": "ஒழுங்கற்ற", - "HEARTBEAT_RHYTHM__UNKNOWN": "தெரியவில்லை", + "linked_facilities": "இணைக்கப்பட்ட வசதிகள்", + "liquid_oxygen_capacity": "திரவ ஆக்ஸிஜன் திறன்", + "list_view": "பட்டியல் காட்சி", + "litres": "லிட்டர்கள்", + "litres_per_day": "லிட்டர்/நாள்", + "live": "வாழ்க", + "live_monitoring": "நேரடி கண்காணிப்பு", + "load_more": "மேலும் ஏற்றவும்", + "loading": "ஏற்றுகிறது...", + "local_body": "உள்ளூர் அமைப்பு", + "local_ipaddress": "உள்ளூர் ஐபி முகவரி", + "location": "இடம்", + "location_management": "இருப்பிட மேலாண்மை", + "log_lab_results": "பதிவு ஆய்வக முடிவுகள்", + "log_report": "பதிவு அறிக்கை", + "login": "உள்நுழைய", + "longitude_invalid": "தீர்க்கரேகை -180 மற்றும் 180 க்கு இடையில் இருக்க வேண்டும்", + "lsg": "Lsg", + "make_multiple_beds_label": "நீங்கள் பல படுக்கைகளை உருவாக்க விரும்புகிறீர்களா?", + "manage_prescriptions": "மருந்துகளை நிர்வகிக்கவும்", + "manufacturer": "உற்பத்தியாளர்", "map_acronym": "வரைபடம்", - "systolic": "சிஸ்டாலிக்", - "diastolic": "டயஸ்டாலிக்", - "pain": "வலி", - "pain_chart_description": "வலியின் பகுதி மற்றும் தீவிரத்தை குறிக்கவும்", - "bradycardia": "பிராடி கார்டியா", - "tachycardia": "டாக்ரிக்கார்டியா", - "medicine": "மருந்து", - "route": "பாதை", - "dosage": "மருந்தளவு", - "base_dosage": "மருந்தளவு", - "start_dosage": "தொடக்க மருந்தளவு", - "target_dosage": "இலக்கு அளவு", - "instruction_on_titration": "டைட்ரேஷன் பற்றிய வழிமுறைகள்", - "titrate_dosage": "டைட்ரேட் அளவு", - "indicator": "காட்டி", - "inidcator_event": "காட்டி நிகழ்வு", + "mark_all_as_read": "அனைத்தையும் படித்ததாகக் குறிக்கவும்", + "mark_as_read": "படித்ததாகக் குறி", + "mark_as_unread": "படிக்காதது எனக் குறி", + "mark_this_transfer_as_complete_question": "இந்தப் பரிமாற்றம் முடிந்ததாக நிச்சயமாகக் குறிக்க விரும்புகிறீர்களா? இந்த நோயாளியை ஆரிஜின் வசதி இனி அணுகாது", + "mark_transfer_complete_confirmation": "இந்தப் பரிமாற்றம் முடிந்ததாக நிச்சயமாகக் குறிக்க விரும்புகிறீர்களா? இந்த நோயாளியை ஆரிஜின் வசதி இனி அணுகாது", "max_dosage_24_hrs": "அதிகபட்சம். 24 மணி நேரத்தில் மருந்தளவு", - "min_time_bw_doses": "குறைந்தபட்சம் நேரம் b/w அளவுகள்", - "manage_prescriptions": "மருந்துகளை நிர்வகிக்கவும்", - "prescription_details": "மருந்துச் சீட்டு விவரங்கள்", - "prescription_medications": "பரிந்துரைக்கப்பட்ட மருந்துகள்", - "prn_prescriptions": "PRN பரிந்துரைகள்", - "prescription": "மருந்துச்சீட்டு", - "discharge_prescription": "வெளியேற்ற மருந்து", - "edit_prescriptions": "மருந்துச்சீட்டுகளைத் திருத்தவும்", - "prescription_medication": "பரிந்துரைக்கப்பட்ட மருந்து", - "add_prescription_medication": "பரிந்துரைக்கப்பட்ட மருந்துகளைச் சேர்க்கவும்", - "prn_prescription": "PRN மருந்து", - "add_prn_prescription": "PRN மருந்துச் சீட்டைச் சேர்க்கவும்", - "add_prescription_to_consultation_note": "இந்த ஆலோசனையில் புதிய மருந்துச் சீட்டைச் சேர்க்கவும்.", + "max_dosage_in_24hrs_gte_base_dosage_error": "அதிகபட்சம். 24 மணிநேரத்தில் மருந்தளவு அடிப்படை அளவை விட அதிகமாகவோ அல்லது சமமாகவோ இருக்க வேண்டும்", + "max_size_for_image_uploaded_should_be": "பதிவேற்றப்பட்ட படத்திற்கான அதிகபட்ச அளவு இருக்க வேண்டும்", + "medical_worker": "மருத்துவ பணியாளர்", + "medicine": "மருந்து", "medicine_administration_history": "மருத்துவ நிர்வாக வரலாறு", - "return_to_patient_dashboard": "நோயாளி டாஷ்போர்டுக்குத் திரும்பு", - "administered_on": "அன்று நிர்வகிக்கப்படுகிறது", - "administer": "நிர்வாகம்", - "administer_medicine": "மருந்தை நிர்வகி", - "administer_medicines": "மருந்துகளை நிர்வகிக்கவும்", - "administer_selected_medicines": "தேர்ந்தெடுக்கப்பட்ட மருந்துகளை நிர்வகிக்கவும்", - "select_for_administration": "நிர்வாகத்திற்கு தேர்ந்தெடுக்கவும்", "medicines_administered": "மருந்து (கள்) நிர்வகிக்கப்படுகிறது", "medicines_administered_error": "மருந்துகளை வழங்குவதில் பிழை", - "prescription_discontinued": "மருந்துச் சீட்டு நிறுத்தப்பட்டது", - "administration_notes": "நிர்வாக குறிப்புகள்", - "last_administered": "கடைசியாக நிர்வகிக்கப்பட்டது", - "prescription_logs": "மருந்துப் பதிவுகள்", + "middleware_hostname": "மிடில்வேர் ஹோஸ்ட்பெயர்", + "min_password_len_8": "குறைந்தபட்ச கடவுச்சொல் நீளம் 8", + "min_time_bw_doses": "குறைந்தபட்சம் நேரம் b/w அளவுகள்", + "mobile": "மொபைல்", + "mobile_number": "மொபைல் எண்", "modification_caution_note": "ஒருமுறை சேர்த்தால் எந்த மாற்றமும் சாத்தியமில்லை", - "discontinue_caution_note": "இந்த மருந்தை நிச்சயமாக நிறுத்த விரும்புகிறீர்களா?", - "confirm_discontinue": "நிறுத்துவதை உறுதிப்படுத்தவும்", - "edit_caution_note": "திருத்தப்பட்ட விவரங்களுடன் கலந்தாய்வில் புதிய மருந்துச் சீட்டு சேர்க்கப்படும் மற்றும் தற்போதைய மருந்துச் சீட்டு நிறுத்தப்படும்.", - "reason_for_discontinuation": "நிறுத்தத்திற்கான காரணம்", - "reason_for_edit": "திருத்தத்திற்கான காரணம்", - "PRESCRIPTION_ROUTE_ORAL": "வாய்வழி", - "PRESCRIPTION_ROUTE_IV": "IV", - "PRESCRIPTION_ROUTE_IM": "ஐ.எம்", - "PRESCRIPTION_ROUTE_SC": "எஸ்/சி", - "PRESCRIPTION_ROUTE_INHALATION": "உள்ளிழுத்தல்", - "PRESCRIPTION_ROUTE_NASOGASTRIC": "நாசோகாஸ்ட்ரிக் / காஸ்ட்ரோஸ்டமி குழாய்", - "PRESCRIPTION_ROUTE_INTRATHECAL": "உள்நோக்கி ஊசி", - "PRESCRIPTION_ROUTE_TRANSDERMAL": "டிரான்ஸ்டெர்மல்", - "PRESCRIPTION_ROUTE_RECTAL": "மலக்குடல்", - "PRESCRIPTION_ROUTE_SUBLINGUAL": "சப்ளிங்குவல்", - "PRESCRIPTION_FREQUENCY_STAT": "உடனடியாக", - "PRESCRIPTION_FREQUENCY_OD": "தினமும் ஒருமுறை", - "PRESCRIPTION_FREQUENCY_HS": "இரவு மட்டும்", - "PRESCRIPTION_FREQUENCY_BD": "தினமும் இருமுறை", - "PRESCRIPTION_FREQUENCY_TID": "8வது மணிநேரம்", - "PRESCRIPTION_FREQUENCY_QID": "6 வது மணிநேரம்", - "PRESCRIPTION_FREQUENCY_Q4H": "4 வது மணிநேரம்", - "PRESCRIPTION_FREQUENCY_QOD": "மாற்று நாள்", - "PRESCRIPTION_FREQUENCY_QWK": "வாரம் ஒருமுறை", - "inconsistent_dosage_units_error": "மருந்தளவு அலகுகள் ஒரே மாதிரியாக இருக்க வேண்டும்", - "max_dosage_in_24hrs_gte_base_dosage_error": "அதிகபட்சம். 24 மணிநேரத்தில் மருந்தளவு அடிப்படை அளவை விட அதிகமாகவோ அல்லது சமமாகவோ இருக்க வேண்டும்", - "administration_dosage_range_error": "ஆரம்ப மற்றும் இலக்கு டோஸ் இடையே மருந்தளவு இருக்க வேண்டும்", + "modified": "மாற்றியமைக்கப்பட்டது", + "modified_date": "மாற்றியமைக்கப்பட்ட தேதி", + "monitor": "கண்காணிக்கவும்", + "more_info": "மேலும் தகவல்", + "moving_camera": "நகரும் கேமரா", + "name": "பெயர்", + "name_of_hospital": "மருத்துவமனையின் பெயர்", + "name_of_shifting_approving_facility": "ஷிஃப்டிங் அங்கீகரிக்கும் வசதியின் பெயர்", + "nationality": "தேசியம்", + "never": "ஒருபோதும்", + "new_password": "புதிய கடவுச்சொல்", + "next_sessions": "அடுத்த அமர்வுகள்", + "no": "இல்லை", + "no_bed_types_found": "படுக்கை வகைகள் இல்லை", + "no_changes": "மாற்றங்கள் இல்லை", + "no_changes_made": "எந்த மாற்றமும் செய்யப்படவில்லை", + "no_consultation_updates": "ஆலோசனை அறிவிப்புகள் இல்லை", + "no_cover_photo_uploaded_for_this_facility": "இந்த வசதிக்காக அட்டைப் புகைப்படம் பதிவேற்றப்படவில்லை", + "no_data_found": "தரவு எதுவும் கிடைக்கவில்லை", + "no_duplicate_facility": "நீங்கள் நகல் வசதிகளை உருவாக்கக்கூடாது", + "no_facilities": "வசதிகள் எதுவும் கிடைக்கவில்லை", + "no_files_found": "{{type}} கோப்புகள் இல்லை", + "no_home_facility": "வீட்டு வசதி ஒதுக்கப்படவில்லை", + "no_investigation": "விசாரணை அறிக்கைகள் எதுவும் கிடைக்கவில்லை", + "no_investigation_suggestions": "விசாரணை பரிந்துரைகள் இல்லை", + "no_linked_facilities": "இணைக்கப்பட்ட வசதிகள் இல்லை", + "no_log_update_delta": "முந்தைய பதிவு புதுப்பித்தலுக்குப் பிறகு எந்த மாற்றமும் இல்லை", "no_notices_for_you": "உங்களுக்கான அறிவிப்புகள் இல்லை.", - "mark_as_read": "படித்ததாகக் குறி", - "mark_as_unread": "படிக்காதது எனக் குறி", - "subscribe": "குழுசேர்", - "subscribe_on_this_device": "இந்தச் சாதனத்தில் குழுசேரவும்", + "no_patients_to_show": "காட்ட நோயாளிகள் இல்லை.", + "no_results_found": "முடிவுகள் எதுவும் கிடைக்கவில்லை", + "no_staff": "ஊழியர்கள் இல்லை", + "no_treating_physicians_available": "இந்த வசதியில் வீட்டு வசதி டாக்டர்கள் இல்லை. உங்கள் நிர்வாகியைத் தொடர்பு கொள்ளவும்.", + "no_users_found": "பயனர்கள் இல்லை", + "none": "இல்லை", + "normal": "இயல்பானது", + "not_specified": "குறிப்பிடப்படவில்லை", + "notes": "குறிப்புகள்", + "notes_placeholder": "உங்கள் குறிப்புகளைத் தட்டச்சு செய்யவும்", "notification_permission_denied": "அறிவிப்பு அனுமதி நிராகரிக்கப்பட்டது", "notification_permission_granted": "அறிவிப்பு அனுமதி அளிக்கப்பட்டது", - "show_unread_notifications": "படிக்காததைக் காட்டு", - "show_all_notifications": "அனைத்தையும் காட்டு", - "filter_by_category": "வகையின்படி வடிகட்டவும்", - "mark_all_as_read": "அனைத்தையும் படித்ததாகக் குறிக்கவும்", - "reload": "மீண்டும் ஏற்றவும்", - "no_results_found": "முடிவுகள் எதுவும் கிடைக்கவில்லை", - "load_more": "மேலும் ஏற்றவும்", - "subscription_error": "சந்தா பிழை", - "unsubscribe_failed": "குழுவிலக முடியவில்லை.", - "unsubscribe": "குழுவிலகவும்", - "escape": "எஸ்கேப்", - "invalid_asset_id_msg": "அச்சச்சோ! நீங்கள் உள்ளிட்ட சொத்து ஐடி சரியானதாகத் தெரியவில்லை.", - "asset_not_found_msg": "அச்சச்சோ! நீங்கள் தேடும் சொத்து இல்லை. சொத்து ஐடியைச் சரிபார்க்கவும்.", - "create_resource_request": "ஆதார கோரிக்கையை உருவாக்கவும்", - "contact_person": "வசதி உள்ள தொடர்பு நபரின் பெயர்", - "approving_facility": "அங்கீகரிக்கும் வசதியின் பெயர்", - "contact_phone": "தொடர்பு நபர் எண்", + "number_of_aged_dependents_above_60": "வயதான சார்புடையவர்களின் எண்ணிக்கை (60 க்கு மேல்)", + "number_of_beds": "படுக்கைகளின் எண்ணிக்கை", + "number_of_beds_out_of_range_error": "படுக்கைகளின் எண்ணிக்கை 100க்கு மேல் இருக்கக்கூடாது", + "number_of_chronic_diseased_dependents": "நாள்பட்ட நோய்களைச் சார்ந்திருப்பவர்களின் எண்ணிக்கை", + "on": "அன்று", + "ongoing_medications": "தொடரும் மருந்துகள்", + "open": "திற", + "open_camera": "கேமராவைத் திற", + "open_live_monitoring": "நேரடி கண்காணிப்பைத் திறக்கவும்", + "optional": "விருப்பமானது", + "ordering": "ஆர்டர் செய்தல்", + "origin_facility": "தற்போதைய வசதி", + "oxygen_information": "ஆக்ஸிஜன் தகவல்", + "page_not_found": "பக்கம் கிடைக்கவில்லை", + "pain": "வலி", + "pain_chart_description": "வலியின் பகுதி மற்றும் தீவிரத்தை குறிக்கவும்", + "passport_number": "பாஸ்போர்ட் எண்", + "password": "கடவுச்சொல்", + "password_mismatch": "கடவுச்சொல் பொருந்தவில்லை", + "password_reset_failure": "கடவுச்சொல் மீட்டமைப்பு தோல்வியுற்றது!", + "password_reset_success": "கடவுச்சொல் வெற்றிகரமாக மீட்டமைக்கப்பட்டது!", + "password_sent": "கடவுச்சொல் மீட்டமை மின்னஞ்சல் அனுப்பப்பட்டது!", + "patient_address": "நோயாளியின் முகவரி", + "patient_category": "நோயாளி வகை", + "patient_consultation__admission": "சேர்க்கை தேதி", + "patient_consultation__consultation_notes": "பொதுவான வழிமுறைகள்", + "patient_consultation__dc_admission": "வீட்டு பராமரிப்பு தேதி தொடங்கியது", + "patient_consultation__ip": "ஐபி", + "patient_consultation__op": "OP", + "patient_consultation__special_instruction": "சிறப்பு வழிமுறைகள்", + "patient_consultation__treatment__plan": "திட்டம்", + "patient_consultation__treatment__summary": "சுருக்கம்", + "patient_consultation__treatment__summary__date": "தேதி", + "patient_consultation__treatment__summary__spo2": "SpO2", + "patient_consultation__treatment__summary__temperature": "வெப்பநிலை", + "patient_created": "நோயாளி உருவாக்கப்பட்டது", + "patient_name": "நோயாளி பெயர்", + "patient_no": "OP/IP எண்", + "patient_phone_number": "நோயாளியின் தொலைபேசி எண்", + "patient_registration__address": "முகவரி", + "patient_registration__age": "வயது", + "patient_registration__comorbidities": "கூட்டு நோய்கள்", + "patient_registration__comorbidities__details": "விவரங்கள்", + "patient_registration__comorbidities__disease": "நோய்", + "patient_registration__contact": "அவசரத் தொடர்பு", + "patient_registration__gender": "பாலினம்", + "patient_registration__name": "பெயர்", + "patient_state": "நோயாளி நிலை", + "patient_status": "நோயாளியின் நிலை", + "patient_transfer_birth_match_note": "குறிப்பு: பரிமாற்றக் கோரிக்கையைச் செயல்படுத்த, பிறந்த ஆண்டு நோயாளியுடன் பொருந்த வேண்டும்.", + "phone": "தொலைபேசி", + "phone_no": "தொலைபேசி எண்.", + "phone_number": "தொலைபேசி எண்", + "phone_number_at_current_facility": "தற்போதைய வசதியில் உள்ள தொடர்பு நபரின் தொலைபேசி எண்", + "pincode": "பின்கோடு", + "please_enter_a_reason_for_the_shift": "மாற்றத்திற்கான காரணத்தை உள்ளிடவும்.", + "please_select_a_facility": "வசதியைத் தேர்ந்தெடுக்கவும்", + "please_select_breathlessness_level": "மூச்சுத் திணறல் நிலையைத் தேர்ந்தெடுக்கவும்", + "please_select_facility_type": "வசதி வகையைத் தேர்ந்தெடுக்கவும்", + "please_select_patient_category": "நோயாளி வகையைத் தேர்ந்தெடுக்கவும்", + "please_select_preferred_vehicle_type": "விருப்பமான வாகன வகையைத் தேர்ந்தெடுக்கவும்", + "please_select_status": "தயவுசெய்து நிலையைத் தேர்ந்தெடுக்கவும்", + "please_upload_a_csv_file": "CSV கோப்பைப் பதிவேற்றவும்", + "post_your_comment": "உங்கள் கருத்தை பதிவிடவும்", + "powered_by": "மூலம் இயக்கப்படுகிறது", + "preferred_facility_type": "விருப்பமான வசதி வகை", + "preferred_vehicle": "விருப்பமான வாகனம்", + "prescription": "மருந்துச்சீட்டு", + "prescription_details": "மருந்துச் சீட்டு விவரங்கள்", + "prescription_discontinued": "மருந்துச் சீட்டு நிறுத்தப்பட்டது", + "prescription_logs": "மருந்துப் பதிவுகள்", + "prescription_medication": "பரிந்துரைக்கப்பட்ட மருந்து", + "prescription_medications": "பரிந்துரைக்கப்பட்ட மருந்துகள்", + "prescriptions__dosage_frequency": "மருந்தளவு & அதிர்வெண்", + "prescriptions__medicine": "மருந்து", + "prescriptions__route": "பாதை", + "prescriptions__start_date": "அன்று பரிந்துரைக்கப்பட்டது", + "prev_sessions": "முந்தைய அமர்வுகள்", + "principal": "அதிபர்", + "principal_diagnosis": "முதன்மை நோயறிதல்", + "print": "அச்சிடுக", + "print_referral_letter": "பரிந்துரை கடிதத்தை அச்சிடுங்கள்", + "prn_prescription": "PRN மருந்து", + "prn_prescriptions": "PRN பரிந்துரைகள்", + "procedure_suggestions": "செயல்முறை பரிந்துரைகள்", + "provisional": "தற்காலிகமானது", + "ration_card__APL": "ஏபிஎல்", + "ration_card__BPL": "பிபிஎல்", + "ration_card__NO_CARD": "அட்டை இல்லாதவர்", + "reason": "காரணம்", + "reason_for_discontinuation": "நிறுத்தத்திற்கான காரணம்", + "reason_for_edit": "திருத்தத்திற்கான காரணம்", + "reason_for_referral": "பரிந்துரைக்கான காரணம்", + "reason_for_shift": "மாற்றத்திற்கான காரணம்", + "recommended_aspect_ratio_for": "பரிந்துரைக்கப்பட்ட தோற்ற விகிதம்", + "record": "ஆடியோ பதிவு", + "record_delete_confirm": "இந்தப் பதிவை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", + "record_has_been_deleted_successfully": "பதிவு வெற்றிகரமாக நீக்கப்பட்டது.", + "record_updates": "பதிவு புதுப்பிப்புகள்", + "recording": "பதிவு செய்தல்", + "redirected_to_create_consultation": "குறிப்பு: ஆலோசனை படிவத்தை உருவாக்க நீங்கள் திருப்பி விடப்படுவீர்கள். பரிமாற்ற செயல்முறையை முடிக்க படிவத்தை பூர்த்தி செய்யவும்", + "referral_letter": "பரிந்துரை கடிதம்", + "referred_to": "குறிப்பிடப்படுகிறது", + "refresh_list": "பட்டியலைப் புதுப்பிக்கவும்", + "refuted": "மறுத்தார்", + "register_hospital": "மருத்துவமனை பதிவு", + "register_page_title": "மருத்துவமனை நிர்வாகியாக பதிவு செய்யுங்கள்", + "reload": "மீண்டும் ஏற்றவும்", + "remove": "அகற்று", + "rename": "மறுபெயரிடவும்", + "report": "அறிக்கை", + "req_atleast_one_digit": "குறைந்தது ஒரு இலக்கமாவது தேவை", + "req_atleast_one_lowercase": "குறைந்தபட்சம் ஒரு சிறிய எழுத்து தேவை", + "req_atleast_one_symbol": "குறைந்தது ஒரு சின்னம் தேவை", + "req_atleast_one_uppercase": "குறைந்தபட்சம் ஒரு பெரிய வழக்கு தேவை", + "request_description": "கோரிக்கையின் விளக்கம்", + "request_description_placeholder": "உங்கள் விளக்கத்தை இங்கே தட்டச்சு செய்யவும்", "request_title": "தலைப்பு கோரிக்கை", "request_title_placeholder": "உங்கள் தலைப்பை இங்கே தட்டச்சு செய்யவும்", + "required": "தேவை", "required_quantity": "தேவையான அளவு", - "request_description": "கோரிக்கையின் விளக்கம்", - "request_description_placeholder": "உங்கள் விளக்கத்தை இங்கே தட்டச்சு செய்யவும்", + "reset": "மீட்டமை", + "reset_password": "கடவுச்சொல்லை மீட்டமை", + "resource_request": "ஆதார கோரிக்கை", + "result": "முடிவு", + "result_date": "முடிவு தேதி", + "result_details": "முடிவு விவரங்கள்", + "resume": "ரெஸ்யூம்", + "retake": "மீண்டும் எடுக்கவும்", + "return_to_care": "CARE பக்கத்துக்குத் திரும்பு", + "return_to_login": "உள்நுழைவுக்குத் திரும்பு", + "return_to_password_reset": "கடவுச்சொல் மீட்டமைப்புக்குத் திரும்பு", + "return_to_patient_dashboard": "நோயாளி டாஷ்போர்டுக்குத் திரும்பு", + "right": "சரி", + "route": "பாதை", + "sample_collection_date": "மாதிரி சேகரிப்பு தேதி", + "sample_format": "மாதிரி வடிவம்", + "sample_type": "மாதிரி வகை", + "save": "சேமிக்கவும்", + "save_and_continue": "சேமித்து தொடரவும்", + "save_investigation": "விசாரணையைச் சேமிக்கவும்", + "scan_asset_qr": "அசெட் க்யூஆர் ஸ்கேன்!", + "search_by_username": "பயனர்பெயர் மூலம் தேடவும்", + "search_for_facility": "வசதியைத் தேடுங்கள்", + "search_icd11_placeholder": "ICD-11 நோய் கண்டறிதல்களைத் தேடவும்", + "search_investigation_placeholder": "தேடல் விசாரணை & குழுக்கள்", + "search_patient": "நோயாளியைத் தேடுங்கள்", "search_resource": "தேடல் ஆதாரம்", - "emergency": "அவசரநிலை", - "up_shift": "அப் ஷிப்ட்", - "antenatal": "முற்பிறவி", - "phone_no": "தொலைபேசி எண்.", - "patient_name": "நோயாளி பெயர்", - "disease_status": "நோய் நிலை", - "breathlessness_level": "மூச்சுத்திணறல் நிலை", - "assigned_facility": "வசதி ஒதுக்கப்பட்டுள்ளது", - "origin_facility": "தற்போதைய வசதி", - "shifting_approval_facility": "ஒப்புதல் வசதியை மாற்றுதல்", + "select": "தேர்ந்தெடு", + "select_date": "தேதியைத் தேர்ந்தெடுக்கவும்", + "select_facility_for_discharged_patients_warning": "டிஸ்சார்ஜ் செய்யப்பட்ட நோயாளிகளைப் பார்க்க வசதியைத் தேர்ந்தெடுக்க வேண்டும்.", + "select_for_administration": "நிர்வாகத்திற்கு தேர்ந்தெடுக்கவும்", + "select_groups": "குழுக்களைத் தேர்ந்தெடுக்கவும்", + "select_investigation": "விசாரணைகளைத் தேர்ந்தெடு (எல்லா விசாரணைகளும் இயல்பாகவே தேர்ந்தெடுக்கப்படும்)", + "select_investigation_groups": "விசாரணைக் குழுக்களைத் தேர்ந்தெடுக்கவும்", + "select_investigations": "விசாரணைகளைத் தேர்ந்தெடுக்கவும்", + "select_local_body": "உள்ளாட்சி அமைப்பைத் தேர்ந்தெடுக்கவும்", + "select_skills": "சில திறன்களைத் தேர்ந்தெடுத்து சேர்க்கவும்", + "select_wards": "வார்டுகளைத் தேர்ந்தெடுக்கவும்", + "send_email": "மின்னஞ்சல் அனுப்பவும்", + "send_reset_link": "மீட்டமை இணைப்பை அனுப்பவும்", + "serial_number": "வரிசை எண்", + "serviced_on": "சேவை செய்யப்பட்டது", + "session_expired": "அமர்வு காலாவதியானது", + "session_expired_msg": "உங்கள் அமர்வு காலாவதியானது போல் தெரிகிறது. இது செயலற்ற தன்மை காரணமாக இருக்கலாம். தொடர மீண்டும் உள்நுழையவும்.", + "set_average_weekly_working_hours_for": "சராசரி வாராந்திர வேலை நேரத்தை அமைக்கவும்", + "settings_and_filters": "அமைப்புகள் மற்றும் வடிப்பான்கள்", + "severity_of_breathlessness": "மூச்சுத் திணறலின் தீவிரம்", + "shift_request_updated_successfully": "ஷிப்ட் கோரிக்கை வெற்றிகரமாக புதுப்பிக்கப்பட்டது", "shifting": "மாறுதல்", - "search_patient": "நோயாளியைத் தேடுங்கள்", - "list_view": "பட்டியல் காட்சி", - "comment_min_length": "கருத்து குறைந்தது 1 எழுத்தையாவது கொண்டிருக்க வேண்டும்", - "comment_added_successfully": "கருத்து வெற்றிகரமாக சேர்க்கப்பட்டது", - "post_your_comment": "உங்கள் கருத்தை பதிவிடவும்", + "shifting_approval_facility": "ஒப்புதல் வசதியை மாற்றுதல்", "shifting_approving_facility": "அங்கீகரிக்கும் வசதியை மாற்றுகிறது", - "is_emergency_case": "அவசர வழக்கு", - "is_upshift_case": "அப்ஷிஃப்ட் கேஸ்", - "is_antenatal": "பிறப்புக்கு முந்தையது", - "patient_phone_number": "நோயாளியின் தொலைபேசி எண்", - "created_date": "உருவாக்கப்பட்ட தேதி", - "modified_date": "மாற்றியமைக்கப்பட்ட தேதி", - "no_patients_to_show": "காட்ட நோயாளிகள் இல்லை.", - "shifting_status": "நிலை மாறுகிறது", - "transfer_to_receiving_facility": "பெறும் வசதிக்கு இடமாற்றம்", - "confirm_transfer_complete": "பரிமாற்றம் முடிந்தது என்பதை உறுதிப்படுத்தவும்!", - "mark_transfer_complete_confirmation": "இந்தப் பரிமாற்றம் முடிந்ததாக நிச்சயமாகக் குறிக்க விரும்புகிறீர்களா? இந்த நோயாளியை ஆரிஜின் வசதி இனி அணுகாது", - "board_view": "பலகை காட்சி", + "shifting_approving_facility_can_not_be_empty": "ஷிஃப்டிங் அங்கீகரிக்கும் வசதி காலியாக இருக்க முடியாது.", "shifting_deleted": "ஷிஃப்டிங் பதிவு வெற்றிகரமாக நீக்கப்பட்டது.", - "details_of_shifting_approving_facility": "ஒப்புதல் வசதியை மாற்றுவதற்கான விவரங்கள்", - "details_of_assigned_facility": "ஒதுக்கப்பட்ட வசதியின் விவரங்கள்", - "details_of_origin_facility": "மூல வசதியின் விவரங்கள்", - "details_of_patient": "நோயாளியின் விவரங்கள்", - "record_delete_confirm": "இந்தப் பதிவை நிச்சயமாக நீக்க விரும்புகிறீர்களா?", - "phone_number_at_current_facility": "தற்போதைய வசதியில் உள்ள தொடர்பு நபரின் தொலைபேசி எண்", - "authorize_shift_delete": "ஷிப்ட் நீக்கத்தை அங்கீகரிக்கவும்", - "delete_record": "பதிவை நீக்கு", - "severity_of_breathlessness": "மூச்சுத் திணறலின் தீவிரம்", - "facility_preference": "வசதி விருப்பம்", - "vehicle_preference": "வாகன விருப்பம்", - "is_up_shift": "மாறிவிட்டது", - "ambulance_driver_name": "ஆம்புலன்ஸ் ஓட்டுநரின் பெயர்", - "ambulance_phone_number": "ஆம்புலன்ஸின் தொலைபேசி எண்", - "ambulance_number": "ஆம்புலன்ஸ் எண்", - "is_emergency": "அவசரநிலை", - "contact_person_at_the_facility": "தற்போதைய வசதியில் உள்ள நபரைத் தொடர்பு கொள்ளவும்", - "update_status_details": "நிலை/விவரங்களைப் புதுப்பிக்கவும்", "shifting_details": "விவரங்களை மாற்றுகிறது", - "auto_generated_for_care": "பராமரிப்புக்காக தானாக உருவாக்கப்பட்டுள்ளது", - "approved_by_district_covid_control_room": "மாவட்ட கோவிட் கட்டுப்பாட்டு அறையால் அங்கீகரிக்கப்பட்டது", - "treatment_summary": "சிகிச்சை சுருக்கம்", - "reason_for_referral": "பரிந்துரைக்கான காரணம்", - "referred_to": "குறிப்பிடப்படுகிறது", - "covid_19_cat_gov": "அரசாங்கத்தின்படி கோவிட்_19 மருத்துவ வகை. கேரளா வழிகாட்டுதல் (A/B/C)", - "district_program_management_supporting_unit": "மாவட்ட திட்ட மேலாண்மை துணை அலகு", - "name_of_hospital": "மருத்துவமனையின் பெயர்", - "passport_number": "பாஸ்போர்ட் எண்", + "shifting_status": "நிலை மாறுகிறது", + "show_all": "அனைத்தையும் காட்டு", + "show_all_notifications": "அனைத்தையும் காட்டு", + "show_default_presets": "இயல்புநிலை முன்னமைவுகளைக் காட்டு", + "show_patient_presets": "நோயாளியின் முன்னமைவுகளைக் காட்டு", + "show_unread_notifications": "படிக்காததைக் காட்டு", + "sign_out": "வெளியேறு", + "something_went_wrong": "ஏதோ தவறாகிவிட்டது..!", + "something_wrong": "ஏதோ தவறு நடந்துவிட்டது! பின்னர் மீண்டும் முயற்சிக்கவும்!", + "sort_by": "வரிசைப்படுத்து", + "source": "ஆதாரம்", + "srf_id": "SRF ஐடி", + "staff_list": "பணியாளர்கள் பட்டியல்", + "start_dosage": "தொடக்க மருந்தளவு", + "state": "மாநிலம்", + "status": "நிலை", + "stop": "நிறுத்து", + "stream_stop_due_to_inativity": "லைவ் ஃபீட் செயல்படாததால் ஸ்ட்ரீமிங் நிறுத்தப்படும்", + "stream_stopped_due_to_inativity": "லைவ் ஃபீட் செயல்படாததால் ஸ்ட்ரீமிங் நிறுத்தப்பட்டது", + "sub_category": "துணை வகை", + "submit": "சமர்ப்பிக்கவும்", + "submitting": "சமர்ப்பிக்கிறது", + "subscribe": "குழுசேர்", + "subscribe_on_this_device": "இந்தச் சாதனத்தில் குழுசேரவும்", + "subscription_error": "சந்தா பிழை", + "suggested_investigations": "பரிந்துரைக்கப்பட்ட விசாரணைகள்", + "summary": "சுருக்கம்", + "support": "ஆதரவு", + "switch": "மாறவும்", + "systolic": "சிஸ்டாலிக்", + "tachycardia": "டாக்ரிக்கார்டியா", + "target_dosage": "இலக்கு அளவு", "test_type": "சோதனை வகை", - "medical_worker": "மருத்துவ பணியாளர்", - "error_deleting_shifting": "பதிவை மாற்றுவதில் பிழை", + "titrate_dosage": "டைட்ரேட் அளவு", + "to_be_conducted": "நடத்தப்பட வேண்டும்", + "total_beds": "மொத்த படுக்கைகள்", + "total_users": "மொத்த பயனர்கள்", + "transfer_in_progress": "இடமாற்றம் நடைபெறுகிறது", + "transfer_to_receiving_facility": "பெறும் வசதிக்கு இடமாற்றம்", + "travel_within_last_28_days": "உள்நாட்டு/சர்வதேச பயணம் (கடந்த 28 நாட்களுக்குள்)", + "treating_doctor": "சிகிச்சை அளிக்கும் மருத்துவர்", + "treatment_summary": "சிகிச்சை சுருக்கம்", + "treatment_summary__head_title": "சிகிச்சை சுருக்கம்", + "treatment_summary__heading": "இடைக்கால சிகிச்சை சுருக்கம்", + "treatment_summary__print": "அச்சு சிகிச்சை சுருக்கம்", + "try_again_later": "பிறகு முயற்சிக்கவும்!", "type_any_extra_comments_here": "கூடுதல் கருத்துகளை இங்கே தட்டச்சு செய்யவும்", + "type_b_cylinders": "பி வகை சிலிண்டர்கள்", + "type_c_cylinders": "சி வகை சிலிண்டர்கள்", + "type_d_cylinders": "டி வகை சிலிண்டர்கள்", + "type_to_search": "தேட தட்டச்சு செய்யவும்", + "type_your_comment": "உங்கள் கருத்தை உள்ளிடவும்", "type_your_reason_here": "உங்கள் காரணத்தை இங்கே தட்டச்சு செய்யவும்", - "reason_for_shift": "மாற்றத்திற்கான காரணம்", - "preferred_facility_type": "விருப்பமான வசதி வகை", - "preferred_vehicle": "விருப்பமான வாகனம்", - "is_it_upshift": "அது உயர்வானதா", - "is_this_an_upshift": "இது ஒரு உயர்வுதானா?", - "is_this_an_emergency": "இது அவசரநிலையா?", - "what_facility_assign_the_patient_to": "நோயாளியை எந்த வசதிக்கு ஒதுக்க விரும்புகிறீர்கள்", - "name_of_shifting_approving_facility": "ஷிஃப்டிங் அங்கீகரிக்கும் வசதியின் பெயர்", + "unconfirmed": "உறுதி செய்யப்படவில்லை", + "unique_id": "தனித்துவமான ஐடி", + "unknown": "தெரியவில்லை", + "unsubscribe": "குழுவிலகவும்", + "unsubscribe_failed": "குழுவிலக முடியவில்லை.", + "unsupported_browser": "ஆதரிக்கப்படாத உலாவி", + "unsupported_browser_description": "உங்கள் உலாவி ({{name}} பதிப்பு {{version}}) ஆதரிக்கப்படவில்லை. உங்கள் உலாவியை சமீபத்திய பதிப்பிற்கு புதுப்பிக்கவும் அல்லது சிறந்த அனுபவத்திற்காக ஆதரிக்கப்படும் உலாவிக்கு மாறவும்.", + "up": "மேலே", + "up_shift": "அப் ஷிப்ட்", + "update": "புதுப்பிக்கவும்", + "update_asset": "சொத்தைப் புதுப்பிக்கவும்", + "update_asset_service_record": "சொத்து சேவை பதிவை புதுப்பிக்கவும்", + "update_bed": "படுக்கையைப் புதுப்பிக்கவும்", + "update_facility": "மேம்படுத்தல் வசதி", + "update_facility_middleware_success": "வசதி மிடில்வேர் வெற்றிகரமாக புதுப்பிக்கப்பட்டது", + "update_log": "புதுப்பிப்பு பதிவேடு", + "update_record": "பதிவைப் புதுப்பிக்கவும்", + "update_record_for_asset": "சொத்துக்கான பதிவைப் புதுப்பிக்கவும்", "update_shift_request": "ஷிப்ட் கோரிக்கையைப் புதுப்பிக்கவும்", - "shift_request_updated_successfully": "ஷிப்ட் கோரிக்கை வெற்றிகரமாக புதுப்பிக்கப்பட்டது", - "please_enter_a_reason_for_the_shift": "மாற்றத்திற்கான காரணத்தை உள்ளிடவும்.", - "please_select_preferred_vehicle_type": "விருப்பமான வாகன வகையைத் தேர்ந்தெடுக்கவும்", - "please_select_facility_type": "வசதி வகையைத் தேர்ந்தெடுக்கவும்", - "please_select_breathlessness_level": "மூச்சுத் திணறல் நிலையைத் தேர்ந்தெடுக்கவும்", - "please_select_a_facility": "வசதியைத் தேர்ந்தெடுக்கவும்", - "please_select_status": "தயவுசெய்து நிலையைத் தேர்ந்தெடுக்கவும்", - "please_select_patient_category": "நோயாளி வகையைத் தேர்ந்தெடுக்கவும்", - "shifting_approving_facility_can_not_be_empty": "ஷிஃப்டிங் அங்கீகரிக்கும் வசதி காலியாக இருக்க முடியாது.", - "redirected_to_create_consultation": "குறிப்பு: ஆலோசனை படிவத்தை உருவாக்க நீங்கள் திருப்பி விடப்படுவீர்கள். பரிமாற்ற செயல்முறையை முடிக்க படிவத்தை பூர்த்தி செய்யவும்", - "mark_this_transfer_as_complete_question": "இந்தப் பரிமாற்றம் முடிந்ததாக நிச்சயமாகக் குறிக்க விரும்புகிறீர்களா? இந்த நோயாளியை ஆரிஜின் வசதி இனி அணுகாது", - "transfer_in_progress": "இடமாற்றம் நடைபெறுகிறது", - "patient_state": "நோயாளி நிலை", - "yet_to_be_decided": "இன்னும் முடிவு செய்யப்படவில்லை", - "awaiting_destination_approval": "இலக்கு அனுமதிக்காக காத்திருக்கிறது", + "update_status_details": "நிலை/விவரங்களைப் புதுப்பிக்கவும்", + "updated": "புதுப்பிக்கப்பட்டது", + "updating": "புதுப்பிக்கிறது", + "upload": "பதிவேற்றவும்", + "upload_an_image": "ஒரு படத்தை பதிவேற்றவும்", + "upload_headings__consultation": "புதிய ஆலோசனைக் கோப்பைப் பதிவேற்றவும்", + "upload_headings__patient": "புதிய நோயாளி கோப்பை பதிவேற்றவும்", + "upload_headings__sample_report": "மாதிரி அறிக்கையைப் பதிவேற்றவும்", + "upload_headings__supporting_info": "துணைத் தகவலைப் பதிவேற்றவும்", + "uploading": "பதிவேற்றுகிறது", + "user_deleted_successfuly": "பயனர் வெற்றிகரமாக நீக்கப்பட்டார்", "user_management": "பயனர் மேலாண்மை", - "facilities": "வசதிகள்", - "add_new_user": "புதிய பயனரைச் சேர்க்கவும்", - "no_users_found": "பயனர்கள் இல்லை", - "home_facility": "வீட்டு வசதி", - "no_home_facility": "வீட்டு வசதி ஒதுக்கப்படவில்லை", - "clear_home_facility": "தெளிவான வீட்டு வசதி", - "linked_facilities": "இணைக்கப்பட்ட வசதிகள்", - "no_linked_facilities": "இணைக்கப்பட்ட வசதிகள் இல்லை", - "average_weekly_working_hours": "சராசரி வாராந்திர வேலை நேரம்", - "set_average_weekly_working_hours_for": "சராசரி வாராந்திர வேலை நேரத்தை அமைக்கவும்", - "search_by_username": "பயனர்பெயர் மூலம் தேடவும்", - "last_online": "கடைசியாக ஆன்லைன்", - "total_users": "மொத்த பயனர்கள்" -} \ No newline at end of file + "username": "பயனர்பெயர்", + "users": "பயனர்கள்", + "vehicle_preference": "வாகன விருப்பம்", + "vendor_name": "விற்பனையாளர் பெயர்", + "view": "காண்க", + "view_abdm_records": "ABDM பதிவுகளைப் பார்க்கவும்", + "view_asset": "சொத்துக்களைப் பார்க்கவும்", + "view_details": "விவரங்களைக் காண்க", + "view_faciliy": "பார்வை வசதி", + "view_patients": "நோயாளிகளைப் பார்க்கவும்", + "view_users": "பயனர்களைக் காண்க", + "virtual_nursing_assistant": "மெய்நிகர் நர்சிங் உதவியாளர்", + "ward": "வார்டு", + "warranty_amc_expiry": "உத்தரவாதம் / AMC காலாவதி", + "what_facility_assign_the_patient_to": "நோயாளியை எந்த வசதிக்கு ஒதுக்க விரும்புகிறீர்கள்", + "why_the_asset_is_not_working": "சொத்து ஏன் வேலை செய்யவில்லை?", + "working_status": "வேலை நிலை", + "yes": "ஆம்", + "yet_to_be_decided": "இன்னும் முடிவு செய்யப்படவில்லை", + "you_need_at_least_a_location_to_create_an_assest": "ஒரு அசெஸ்ட்டை உருவாக்க குறைந்தபட்சம் ஒரு இருப்பிடமாவது தேவை.", + "zoom_in": "பெரிதாக்கவும்", + "zoom_out": "பெரிதாக்கவும்" +} From ef3403a327a444c9de01a640077530e172b9150b Mon Sep 17 00:00:00 2001 From: Shivank Kacker Date: Thu, 17 Oct 2024 15:36:13 +0530 Subject: [PATCH 24/31] Updated UI for facility cards and avatar component (#8782) --- cypress/pageobject/Facility/FacilityHome.ts | 2 +- src/CAREUI/display/Count.tsx | 10 +- src/Components/Common/Avatar.tsx | 62 ++++++----- .../Common/Sidebar/SidebarUserCard.tsx | 2 +- src/Components/Facility/FacilityBlock.tsx | 14 +-- src/Components/Facility/FacilityCard.tsx | 105 ++++++------------ src/Components/Facility/FacilityHome.tsx | 57 ++++------ src/Components/Patient/ManagePatients.tsx | 7 +- src/Locale/en.json | 3 + 9 files changed, 110 insertions(+), 152 deletions(-) diff --git a/cypress/pageobject/Facility/FacilityHome.ts b/cypress/pageobject/Facility/FacilityHome.ts index e021171ff0a..dea7de0e7b6 100644 --- a/cypress/pageobject/Facility/FacilityHome.ts +++ b/cypress/pageobject/Facility/FacilityHome.ts @@ -72,7 +72,7 @@ class FacilityHome { } verifyOccupancyBadgeVisibility() { - cy.get("#occupany-badge").should("be.visible"); + cy.get('[data-test-id="occupancy-badge"]').should("be.visible"); } verifyAndCloseNotifyModal() { diff --git a/src/CAREUI/display/Count.tsx b/src/CAREUI/display/Count.tsx index 997b58794eb..6b28ca4f962 100644 --- a/src/CAREUI/display/Count.tsx +++ b/src/CAREUI/display/Count.tsx @@ -11,15 +11,13 @@ interface Props { export default function CountBlock(props: Props) { return ( -
    -
    -
    +
    +
    +
    -
    +
    {props.text}
    {props.loading ? ( diff --git a/src/Components/Common/Avatar.tsx b/src/Components/Common/Avatar.tsx index a519901216b..e4d42dd72ae 100644 --- a/src/Components/Common/Avatar.tsx +++ b/src/Components/Common/Avatar.tsx @@ -1,4 +1,5 @@ -import React from "react"; +import { cn } from "@/lib/utils"; +import React, { useEffect, useRef, useState } from "react"; const colors: string[] = [ "#E6F3FF", // Light Blue @@ -44,43 +45,54 @@ const initials = (name: string): string => { interface AvatarProps { colors?: [string, string]; name: string; + imageUrl?: string; className?: string; - square?: boolean; // New prop to determine if the avatar should be square } const Avatar: React.FC = ({ colors: propColors, name, + imageUrl, className, - square = false, // Default to false for backwards compatibility }) => { - const [bgColor, fgColor] = propColors || toColor(name); + const [bgColor] = propColors || toColor(name); + const [width, setWidth] = useState(0); + const avatarRef = useRef(null); + + useEffect(() => { + const updateWidth = () => { + const avatarRect = avatarRef.current?.getBoundingClientRect(); + const width = avatarRect?.width || 0; + setWidth(width); + }; + updateWidth(); + document.addEventListener("resize", updateWidth); + return () => document.removeEventListener("resize", updateWidth); + }, []); return ( - - {square ? ( - + {imageUrl ? ( + {name} ) : ( - +
    {initials(name)}
    )} - - {initials(name)} - - +
    ); }; diff --git a/src/Components/Common/Sidebar/SidebarUserCard.tsx b/src/Components/Common/Sidebar/SidebarUserCard.tsx index 825507ffb25..9effc947dd6 100644 --- a/src/Components/Common/Sidebar/SidebarUserCard.tsx +++ b/src/Components/Common/Sidebar/SidebarUserCard.tsx @@ -40,7 +40,7 @@ const SidebarUserCard: React.FC = ({ shrinked }) => {
    diff --git a/src/Components/Facility/FacilityBlock.tsx b/src/Components/Facility/FacilityBlock.tsx index 3232321637f..0ad87b050c5 100644 --- a/src/Components/Facility/FacilityBlock.tsx +++ b/src/Components/Facility/FacilityBlock.tsx @@ -24,15 +24,11 @@ export default function FacilityBlock(props: { return ( -
    - {facility.read_cover_image_url ? ( - - ) : ( - - )} +
    +
    {facility.name} diff --git a/src/Components/Facility/FacilityCard.tsx b/src/Components/Facility/FacilityCard.tsx index 69b5b9d421e..e874a0f85c0 100644 --- a/src/Components/Facility/FacilityCard.tsx +++ b/src/Components/Facility/FacilityCard.tsx @@ -9,7 +9,6 @@ import CareIcon from "../../CAREUI/icons/CareIcon"; import { formatPhoneNumber, parsePhoneNumber } from "../../Utils/utils"; import DialogModal from "../Common/Dialog"; import TextAreaFormField from "../Form/FormFields/TextAreaFormField"; -import { classNames } from "../../Utils/utils"; import request from "../../Utils/request/request"; import routes from "../../Redux/api"; import careConfig from "@careConfig"; @@ -52,20 +51,18 @@ export const FacilityCard = (props: { return (
    -
    +
    - {(facility.read_cover_image_url && ( - {facility.name} - )) || } +
    @@ -73,21 +70,12 @@ export const FacilityCard = (props: {
    - {(facility.read_cover_image_url && ( - {facility.name} - )) || ( - - )} +
    {facility.kasp_empanelled && ( @@ -99,12 +87,27 @@ export const FacilityCard = (props: { className="flex flex-wrap items-center justify-between" id="facility-name-card" > - - {facility.name} - +
    + + {facility.name} + +
    0.85 ? "justify-center rounded-md border border-red-600 bg-red-500 p-1 font-bold text-white" : "text-secondary-700"}`} + > + + {t("live_patients_total_beds")} + {" "} + +
    + {t("occupancy")}: {facility.patient_count} /{" "} + {facility.bed_count}{" "} +
    +
    +
    - View CNS + {t("view_cns")}
    +
    -
    +
    {/*
    */}
    -
    - 0.85 - ? "button-danger-border bg-red-500" - : "button-primary-border bg-primary-100" - }`} - > - - Live Patients / Total beds - {" "} - - 0.85 - ? "text-white" - : "text-primary-600", - )} - />{" "} -
    - 0.85 - ? "text-white" - : "text-secondary-700" - }`} - > - Occupancy: {facility.patient_count} /{" "} - {facility.bed_count}{" "} -
    {" "} -
    {
    ); - const CoverImage = () => ( - {facilityData?.name} - ); - return ( { onDelete={() => facilityFetch()} facility={facilityData ?? ({} as FacilityModel)} /> - {hasCoverImage ? ( -
    - - {editCoverImageTooltip} -
    - ) : ( -
    - hasPermissionToEditCoverImage && setEditCoverImage(true) - } - > - - {editCoverImageTooltip} -
    - )} + +
    hasPermissionToEditCoverImage && setEditCoverImage(true)} + > + + {editCoverImageTooltip} +
    { hasPermissionToEditCoverImage && setEditCoverImage(true) } > - {hasCoverImage ? ( - - ) : ( -
    - -
    - )} +
    + +
    + {editCoverImageTooltip}
    diff --git a/src/Components/Patient/ManagePatients.tsx b/src/Components/Patient/ManagePatients.tsx index 5259909bebe..7d49ffdaad1 100644 --- a/src/Components/Patient/ManagePatients.tsx +++ b/src/Components/Patient/ManagePatients.tsx @@ -494,7 +494,7 @@ export const PatientManager = () => { const children = (
    { ) : (
    )} diff --git a/src/Locale/en.json b/src/Locale/en.json index a7c2d1a0c21..d4808fa185b 100644 --- a/src/Locale/en.json +++ b/src/Locale/en.json @@ -642,6 +642,7 @@ "litres_per_day": "Litres/day", "live": "Live", "live_monitoring": "Live Monitoring", + "live_patients_total_beds": "Live Patients / Total beds", "load_more": "Load More", "loading": "Loading...", "local_body": "Local body", @@ -732,6 +733,7 @@ "nursing_care": "Nursing Care", "nursing_information": "Nursing Information", "nutrition": "Nutrition", + "occupancy": "Occupancy", "occupation": "Occupation", "on": "On", "ongoing_medications": "Ongoing Medications", @@ -1036,6 +1038,7 @@ "view": "View", "view_abdm_records": "View ABDM Records", "view_asset": "View Assets", + "view_cns": "View CNS", "view_details": "View Details", "view_faciliy": "View Facility", "view_patients": "View Patients", From 8d4640b4a04c08a0661b14646338b04f51170210 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Thu, 17 Oct 2024 15:37:44 +0530 Subject: [PATCH 25/31] Sort only `en` locale file in the sort-locale script; Update docker and CI to use `npm run install-all` (#8813) --- .devcontainer/devcontainer.json | 2 +- .github/workflows/cypress.yaml | 2 +- Dockerfile | 2 ++ scripts/sort-locales.js | 29 +++++++++-------------------- 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4fe94183a2f..40e5259b1c6 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -26,7 +26,7 @@ "cpus": 4 }, "waitFor": "onCreateCommand", - "postCreateCommand": "npm install", + "postCreateCommand": "npm run install-all", "postAttachCommand": { "server": "npm run dev" }, diff --git a/.github/workflows/cypress.yaml b/.github/workflows/cypress.yaml index 500dbd92be0..0f588568bbc 100644 --- a/.github/workflows/cypress.yaml +++ b/.github/workflows/cypress.yaml @@ -70,7 +70,7 @@ jobs: node-version: "20" - name: Install dependencies 📦 - run: npm install + run: npm run install-all - name: Build ⚙️ run: npm run build diff --git a/Dockerfile b/Dockerfile index 5061a977585..3a96ab3c28a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,8 @@ RUN npm install COPY . . +RUN npm run setup + RUN npm run build diff --git a/scripts/sort-locales.js b/scripts/sort-locales.js index cf365a41d09..adff586a93b 100644 --- a/scripts/sort-locales.js +++ b/scripts/sort-locales.js @@ -1,26 +1,15 @@ // eslint-disable-next-line @typescript-eslint/no-var-requires const fs = require("fs"); -// eslint-disable-next-line @typescript-eslint/no-var-requires -const path = require("path"); - -const directory = "src/Locale"; -fs.readdir(directory, (err, files) => { - if (err) throw err; +const file = "src/Locale/en.json"; - files.forEach((file) => { - if (file.endsWith(".json")) { - const filePath = path.join(directory, file); - const data = JSON.parse(fs.readFileSync(filePath, "utf8")); +const data = JSON.parse(fs.readFileSync(file, "utf8")); - const sortedData = Object.keys(data) - .sort() - .reduce((acc, key) => { - acc[key] = data[key]; - return acc; - }, {}); +const sortedData = Object.keys(data) + .sort() + .reduce((acc, key) => { + acc[key] = data[key]; + return acc; + }, {}); - fs.writeFileSync(filePath, JSON.stringify(sortedData, null, 2) + "\n"); - } - }); -}); +fs.writeFileSync(file, JSON.stringify(sortedData, null, 2) + "\n"); From d14ca0c88924d84a62e7517d6c3104499ece8438 Mon Sep 17 00:00:00 2001 From: Kamishetty Rishith <119791436+Rishith25@users.noreply.github.com> Date: Fri, 18 Oct 2024 16:00:17 +0530 Subject: [PATCH 26/31] Corrected redirection of cancel button (#8823) --- src/Components/Patient/PatientRegister.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/Patient/PatientRegister.tsx b/src/Components/Patient/PatientRegister.tsx index 9fd923e58f2..21c06043369 100644 --- a/src/Components/Patient/PatientRegister.tsx +++ b/src/Components/Patient/PatientRegister.tsx @@ -922,7 +922,7 @@ export const PatientRegister = (props: PatientRegisterProps) => { validate={validateForm} onSubmit={handleSubmit} submitLabel={buttonText} - onCancel={() => navigate("/facility")} + onCancel={() => goBack()} className="bg-transparent px-1 py-2 md:px-2" onDraftRestore={(newState) => { dispatch({ type: "set_state", state: newState }); From b373a0d22e7d686a4f02f9cfdc9a5f77f0f69569 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Fri, 18 Oct 2024 19:00:22 +0530 Subject: [PATCH 27/31] =?UTF-8?q?=F0=9F=93=B7=20Support=20for=20linking=20?= =?UTF-8?q?multiple=20cameras=20to=20a=20bed=20(#8253)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cypress/pageobject/Asset/AssetCreation.ts | 2 +- src/CAREUI/interactive/KeyboardShortcut.tsx | 12 +- src/Common/constants.tsx | 14 - src/Components/Assets/AssetConfigure.tsx | 19 +- .../Assets/AssetType/HL7Monitor.tsx | 83 ++- .../Assets/AssetType/ONVIFCamera.tsx | 227 ------ src/Components/Assets/AssetTypes.tsx | 3 + .../Assets/configure/CameraConfigure.tsx | 88 --- .../Assets/configure/MonitorConfigure.tsx | 87 --- src/Components/CameraFeed/CameraFeed.tsx | 29 +- src/Components/CameraFeed/CameraFeedOld.tsx | 685 ------------------ .../CameraFeed/CameraFeedWithBedPresets.tsx | 21 +- ...etBedSelect.tsx => CameraPresetSelect.tsx} | 24 +- src/Components/CameraFeed/ConfigureCamera.tsx | 643 ++++++++++++++++ src/Components/CameraFeed/FeedAlert.tsx | 4 +- src/Components/CameraFeed/FeedControls.tsx | 2 - src/Components/CameraFeed/routes.ts | 49 ++ src/Components/CameraFeed/useFeedPTZ.ts | 208 ------ src/Components/CameraFeed/useOperateCamera.ts | 6 +- src/Components/CameraFeed/utils.ts | 2 +- src/Components/Common/MonitorAssetPopover.tsx | 2 +- .../ConsultationFeedTab.tsx | 91 +-- .../Facility/ConsultationDetails/index.tsx | 39 +- src/Components/Facility/FacilityUsers.tsx | 6 +- .../Form/FormFields/TextFormField.tsx | 23 + src/Locale/en.json | 36 +- src/Locale/hi.json | 4 +- src/Locale/kn.json | 4 +- src/Locale/ml.json | 4 +- src/Locale/ta.json | 4 +- src/Redux/actions.tsx | 27 - src/Utils/transformUtils.ts | 17 +- 32 files changed, 975 insertions(+), 1490 deletions(-) delete mode 100644 src/Components/Assets/AssetType/ONVIFCamera.tsx delete mode 100644 src/Components/Assets/configure/CameraConfigure.tsx delete mode 100644 src/Components/Assets/configure/MonitorConfigure.tsx delete mode 100644 src/Components/CameraFeed/CameraFeedOld.tsx rename src/Components/CameraFeed/{AssetBedSelect.tsx => CameraPresetSelect.tsx} (88%) create mode 100644 src/Components/CameraFeed/ConfigureCamera.tsx delete mode 100644 src/Components/CameraFeed/useFeedPTZ.ts diff --git a/cypress/pageobject/Asset/AssetCreation.ts b/cypress/pageobject/Asset/AssetCreation.ts index d6991e82ff0..f0b2f1b74eb 100644 --- a/cypress/pageobject/Asset/AssetCreation.ts +++ b/cypress/pageobject/Asset/AssetCreation.ts @@ -154,7 +154,7 @@ export class AssetPage { } clickConfigureAsset() { - cy.get("#submit").contains("Set Configuration").click(); + cy.get("#submit").contains("Update").click(); } clickConfigureVital() { diff --git a/src/CAREUI/interactive/KeyboardShortcut.tsx b/src/CAREUI/interactive/KeyboardShortcut.tsx index 1d2bebeb316..4ad46c99387 100644 --- a/src/CAREUI/interactive/KeyboardShortcut.tsx +++ b/src/CAREUI/interactive/KeyboardShortcut.tsx @@ -31,7 +31,10 @@ export default function KeyboardShortcut(props: Props) { )} {(props.altShortcuts || [props.shortcut]).map((shortcut, idx, arr) => ( <> - + {shortcut.map((key, idx, keys) => ( <> {SHORTCUT_KEY_MAP[key] || key} @@ -42,7 +45,12 @@ export default function KeyboardShortcut(props: Props) { ))} {idx !== arr.length - 1 && ( - or + + or + )} ))} diff --git a/src/Common/constants.tsx b/src/Common/constants.tsx index d46473bfd2d..08d21dc1edc 100644 --- a/src/Common/constants.tsx +++ b/src/Common/constants.tsx @@ -839,20 +839,6 @@ export const LOCATION_BED_TYPES = [ { id: "REGULAR", name: "Regular" }, ] as const; -export const ASSET_META_TYPE = [ - { id: "CAMERA", text: "Camera(ONVIF)" }, - { id: "HL7MONITOR", text: "Vitals Monitor(HL7)" }, -]; - -export const CAMERA_TYPE = [ - { id: "HIKVISION", text: "ONVIF Camera (HIKVISION)" }, -]; - -export const GENDER: { [key: number]: string } = GENDER_TYPES.reduce( - (acc, curr) => ({ ...acc, [curr.id]: curr.text }), - {}, -); - export type CameraPTZ = { icon?: IconName; label: string; diff --git a/src/Components/Assets/AssetConfigure.tsx b/src/Components/Assets/AssetConfigure.tsx index aa6b7c9221e..9f5f73f296d 100644 --- a/src/Components/Assets/AssetConfigure.tsx +++ b/src/Components/Assets/AssetConfigure.tsx @@ -1,6 +1,6 @@ import Loading from "../Common/Loading"; import HL7Monitor from "./AssetType/HL7Monitor"; -import ONVIFCamera from "./AssetType/ONVIFCamera"; +import ConfigureCamera from "../CameraFeed/ConfigureCamera"; import Page from "../Common/components/Page"; import useQuery from "../../Utils/request/useQuery"; import routes from "../../Redux/api"; @@ -11,13 +11,11 @@ interface AssetConfigureProps { } const AssetConfigure = ({ assetId, facilityId }: AssetConfigureProps) => { - const { - data: asset, - loading, - refetch, - } = useQuery(routes.getAsset, { pathParams: { external_id: assetId } }); + const { data: asset, refetch } = useQuery(routes.getAsset, { + pathParams: { external_id: assetId }, + }); - if (loading || !asset) { + if (!asset) { return ; } @@ -63,12 +61,7 @@ const AssetConfigure = ({ assetId, facilityId }: AssetConfigureProps) => { }} backUrl={`/facility/${facilityId}/assets/${assetId}`} > - refetch()} - /> + refetch()} /> ); }; diff --git a/src/Components/Assets/AssetType/HL7Monitor.tsx b/src/Components/Assets/AssetType/HL7Monitor.tsx index 6583157018d..383af38fa28 100644 --- a/src/Components/Assets/AssetType/HL7Monitor.tsx +++ b/src/Components/Assets/AssetType/HL7Monitor.tsx @@ -1,7 +1,6 @@ import { SyntheticEvent, useEffect, useState } from "react"; -import { AssetData, ResolvedMiddleware } from "../AssetTypes"; +import { AssetClass, AssetData, ResolvedMiddleware } from "../AssetTypes"; import * as Notification from "../../../Utils/Notifications.js"; -import MonitorConfigure from "../configure/MonitorConfigure"; import Loading from "../../Common/Loading"; import { checkIfValidIP } from "../../../Common/validation"; import Card from "../../../CAREUI/display/Card"; @@ -13,6 +12,10 @@ import VentilatorPatientVitalsMonitor from "../../VitalsMonitor/VentilatorPatien import useAuthUser from "../../../Common/hooks/useAuthUser"; import request from "../../../Utils/request/request"; import routes from "../../../Redux/api"; +import { BedModel } from "../../Facility/models"; +import useQuery from "../../../Utils/request/useQuery"; +import { FieldLabel } from "../../Form/FormFields/FormField"; +import { BedSelect } from "../../Common/BedSelect"; interface HL7MonitorProps { assetId: string; @@ -151,3 +154,79 @@ const HL7Monitor = (props: HL7MonitorProps) => { ); }; export default HL7Monitor; + +const saveLink = async (assetId: string, bedId: string) => { + await request(routes.createAssetBed, { + body: { + asset: assetId, + bed: bedId, + }, + }); + Notification.Success({ msg: "AssetBed Link created successfully" }); +}; +const updateLink = async ( + assetbedId: string, + assetId: string, + bed: BedModel, +) => { + await request(routes.partialUpdateAssetBed, { + pathParams: { external_id: assetbedId }, + body: { + asset: assetId, + bed: bed.id ?? "", + }, + }); + Notification.Success({ msg: "AssetBed Link updated successfully" }); +}; + +function MonitorConfigure({ asset }: { asset: AssetData }) { + const [bed, setBed] = useState({}); + const [shouldUpdateLink, setShouldUpdateLink] = useState(false); + const { data: assetBed } = useQuery(routes.listAssetBeds, { + query: { asset: asset.id }, + onResponse: ({ res, data }) => { + if (res?.status === 200 && data && data.results.length > 0) { + setBed(data.results[0].bed_object); + setShouldUpdateLink(true); + } + }, + }); + + return ( +
    { + e.preventDefault(); + if (shouldUpdateLink) { + updateLink( + assetBed?.results[0].id as string, + asset.id as string, + bed as BedModel, + ); + } else { + saveLink(asset.id as string, bed?.id as string); + } + }} + > +
    +
    + Bed + setBed(selected as BedModel)} + selected={bed} + error="" + multiple={false} + location={asset?.location_object?.id} + facility={asset?.location_object?.facility?.id} + not_occupied_by_asset_type={AssetClass.HL7MONITOR} + className="w-full" + /> +
    + + + {shouldUpdateLink ? "Update Bed" : "Save Bed"} + +
    +
    + ); +} diff --git a/src/Components/Assets/AssetType/ONVIFCamera.tsx b/src/Components/Assets/AssetType/ONVIFCamera.tsx deleted file mode 100644 index f79894d089f..00000000000 --- a/src/Components/Assets/AssetType/ONVIFCamera.tsx +++ /dev/null @@ -1,227 +0,0 @@ -import { useEffect, useState } from "react"; -import { AssetData, ResolvedMiddleware } from "../AssetTypes"; -import * as Notification from "../../../Utils/Notifications.js"; -import { BedModel } from "../../Facility/models"; -import { getCameraConfig } from "../../../Utils/transformUtils"; -import CameraConfigure from "../configure/CameraConfigure"; -import Loading from "../../Common/Loading"; -import { checkIfValidIP } from "../../../Common/validation"; -import TextFormField from "../../Form/FormFields/TextFormField"; -import { Submit } from "../../Common/components/ButtonV2"; -import { SyntheticEvent } from "react"; -import useAuthUser from "../../../Common/hooks/useAuthUser"; - -import request from "../../../Utils/request/request"; -import routes from "../../../Redux/api"; -import useQuery from "../../../Utils/request/useQuery"; - -import CareIcon from "../../../CAREUI/icons/CareIcon"; -import useOperateCamera, { - PTZPayload, -} from "../../CameraFeed/useOperateCamera"; - -interface Props { - assetId: string; - facilityId: string; - asset: any; - onUpdated?: () => void; -} - -const ONVIFCamera = ({ assetId, facilityId, asset, onUpdated }: Props) => { - const [isLoading, setIsLoading] = useState(true); - const [assetType, setAssetType] = useState(""); - const [middlewareHostname, setMiddlewareHostname] = useState(""); - const [resolvedMiddleware, setResolvedMiddleware] = - useState(); - const [cameraAddress, setCameraAddress] = useState(""); - const [ipadrdress_error, setIpAddress_error] = useState(""); - const [username, setUsername] = useState(""); - const [password, setPassword] = useState(""); - const [streamUuid, setStreamUuid] = useState(""); - const [bed, setBed] = useState({}); - const [newPreset, setNewPreset] = useState(""); - const [loadingAddPreset, setLoadingAddPreset] = useState(false); - const [loadingSetConfiguration, setLoadingSetConfiguration] = useState(false); - const [refreshPresetsHash, setRefreshPresetsHash] = useState( - Number(new Date()), - ); - const { data: facility, loading } = useQuery(routes.getPermittedFacility, { - pathParams: { id: facilityId }, - }); - const authUser = useAuthUser(); - - const { operate } = useOperateCamera(assetId ?? "", true); - - useEffect(() => { - if (asset) { - setAssetType(asset?.asset_class); - setResolvedMiddleware(asset?.resolved_middleware); - const cameraConfig = getCameraConfig(asset); - setMiddlewareHostname(cameraConfig.middleware_hostname); - setCameraAddress(cameraConfig.hostname); - setUsername(cameraConfig.username); - setPassword(cameraConfig.password); - setStreamUuid(cameraConfig.accessKey); - } - setIsLoading(false); - }, [asset]); - - const handleSubmit = async (e: SyntheticEvent) => { - e.preventDefault(); - if (checkIfValidIP(cameraAddress)) { - setLoadingSetConfiguration(true); - setIpAddress_error(""); - const data = { - meta: { - asset_type: "CAMERA", - middleware_hostname: middlewareHostname, - local_ip_address: cameraAddress, - camera_access_key: `${username}:${password}:${streamUuid}`, - }, - }; - const { res } = await request(routes.partialUpdateAsset, { - pathParams: { external_id: assetId }, - body: data, - }); - if (res?.status === 200) { - Notification.Success({ msg: "Asset Configured Successfully" }); - onUpdated?.(); - } else { - Notification.Error({ msg: "Something went wrong!" }); - } - setLoadingSetConfiguration(false); - } else { - setIpAddress_error("IP address is invalid"); - } - }; - - const addPreset = async (e: SyntheticEvent) => { - e.preventDefault(); - const meta = { - bed_id: bed.id, - preset_name: newPreset, - }; - try { - setLoadingAddPreset(true); - - const { data } = await operate({ type: "get_status" }); - const { position } = (data as { result: { position: PTZPayload } }) - .result; - - const { res } = await request(routes.createAssetBed, { - body: { - meta: { ...meta, position }, - asset: assetId, - bed: bed?.id as string, - }, - }); - if (res?.status === 201) { - Notification.Success({ - msg: "Preset Added Successfully", - }); - setBed({}); - setNewPreset(""); - setRefreshPresetsHash(Number(new Date())); - } else { - Notification.Error({ - msg: "Something went wrong..!", - }); - } - } catch (e) { - Notification.Error({ - msg: "Something went wrong..!", - }); - } - setLoadingAddPreset(false); - }; - if (isLoading || loading || !facility) return ; - - return ( -
    - {["DistrictAdmin", "StateAdmin"].includes(authUser.user_type) && ( -
    -
    - -

    Middleware Hostname

    - {resolvedMiddleware?.source != "asset" && ( -
    - - - Middleware hostname sourced from asset{" "} - {resolvedMiddleware?.source} - -
    - )} -
    - } - placeholder={resolvedMiddleware?.hostname} - value={middlewareHostname} - onChange={({ value }) => setMiddlewareHostname(value)} - /> - setCameraAddress(value)} - error={ipadrdress_error} - /> - setUsername(value)} - /> - setPassword(value)} - /> - setStreamUuid(value)} - /> -
    -
    - -
    - - )} - - {assetType === "ONVIF" ? ( - - ) : null} -
    - ); -}; -export default ONVIFCamera; diff --git a/src/Components/Assets/AssetTypes.tsx b/src/Components/Assets/AssetTypes.tsx index e3dee31bb7f..2f8e086a813 100644 --- a/src/Components/Assets/AssetTypes.tsx +++ b/src/Components/Assets/AssetTypes.tsx @@ -109,6 +109,9 @@ export interface AssetData { latest_status: string; last_service: AssetService; meta?: { + middleware_hostname?: string; + local_ip_address?: string; + camera_access_key?: string; [key: string]: any; }; } diff --git a/src/Components/Assets/configure/CameraConfigure.tsx b/src/Components/Assets/configure/CameraConfigure.tsx deleted file mode 100644 index e5e017db8dc..00000000000 --- a/src/Components/Assets/configure/CameraConfigure.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { SyntheticEvent } from "react"; -import { AssetData } from "../AssetTypes"; -import CameraFeedOld from "../../CameraFeed/CameraFeedOld"; -import { BedSelect } from "../../Common/BedSelect"; -import { BedModel } from "../../Facility/models"; -import { getCameraConfig } from "../../../Utils/transformUtils"; -import { Submit } from "../../Common/components/ButtonV2"; -import TextFormField from "../../Form/FormFields/TextFormField"; -import Card from "../../../CAREUI/display/Card"; -import { FieldErrorText } from "../../Form/FormFields/FormField"; - -interface CameraConfigureProps { - asset: AssetData; - addPreset(e: SyntheticEvent): void; - setBed(bed: BedModel): void; - bed: BedModel; - newPreset: string; - setNewPreset(preset: string): void; - refreshPresetsHash: number; - facilityMiddlewareHostname: string; - isLoading: boolean; -} -export default function CameraConfigure(props: CameraConfigureProps) { - const { - asset, - addPreset, - setBed, - bed, - isLoading, - newPreset, - setNewPreset, - refreshPresetsHash, - facilityMiddlewareHostname, - } = props; - - return ( -
    - -
    -
    -
    - - setBed(selected as BedModel)} - selected={bed} - error="" - multiple={false} - location={asset?.location_object?.id} - facility={asset?.location_object?.facility?.id} - /> -
    -
    - - setNewPreset(e.value)} - errorClassName="hidden" - /> - {newPreset.length > 12 && ( - - )} -
    -
    -
    - -
    -
    -
    - - - -
    - ); -} diff --git a/src/Components/Assets/configure/MonitorConfigure.tsx b/src/Components/Assets/configure/MonitorConfigure.tsx deleted file mode 100644 index 785b82873de..00000000000 --- a/src/Components/Assets/configure/MonitorConfigure.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { useState } from "react"; -import { BedSelect } from "../../Common/BedSelect"; -import { BedModel } from "../../Facility/models"; -import { AssetClass, AssetData } from "../AssetTypes"; -import * as Notification from "../../../Utils/Notifications.js"; -import { Submit } from "../../Common/components/ButtonV2"; -import { FieldLabel } from "../../Form/FormFields/FormField"; -import request from "../../../Utils/request/request"; -import routes from "../../../Redux/api"; -import useQuery from "../../../Utils/request/useQuery"; -import CareIcon from "../../../CAREUI/icons/CareIcon"; - -const saveLink = async (assetId: string, bedId: string) => { - await request(routes.createAssetBed, { - body: { - asset: assetId, - bed: bedId, - }, - }); - Notification.Success({ msg: "AssetBed Link created successfully" }); -}; -const update_Link = async ( - assetbedId: string, - assetId: string, - bed: BedModel, -) => { - await request(routes.partialUpdateAssetBed, { - pathParams: { external_id: assetbedId }, - body: { - asset: assetId, - bed: bed.id ?? "", - }, - }); - Notification.Success({ msg: "AssetBed Link updated successfully" }); -}; - -export default function MonitorConfigure({ asset }: { asset: AssetData }) { - const [bed, setBed] = useState({}); - const [updateLink, setUpdateLink] = useState(false); - const { data: assetBed } = useQuery(routes.listAssetBeds, { - query: { asset: asset.id }, - onResponse: ({ res, data }) => { - if (res?.status === 200 && data && data.results.length > 0) { - setBed(data.results[0].bed_object); - setUpdateLink(true); - } - }, - }); - - return ( -
    { - e.preventDefault(); - if (updateLink) { - update_Link( - assetBed?.results[0].id as string, - asset.id as string, - bed as BedModel, - ); - } else { - saveLink(asset.id as string, bed?.id as string); - } - }} - > -
    -
    - Bed - setBed(selected as BedModel)} - selected={bed} - error="" - multiple={false} - location={asset?.location_object?.id} - facility={asset?.location_object?.facility?.id} - not_occupied_by_asset_type={AssetClass.HL7MONITOR} - className="w-full" - /> -
    - - - {updateLink ? "Update Bed" : "Save Bed"} - -
    -
    - ); -} diff --git a/src/Components/CameraFeed/CameraFeed.tsx b/src/Components/CameraFeed/CameraFeed.tsx index e49a63f7028..3c9b25b6fc9 100644 --- a/src/Components/CameraFeed/CameraFeed.tsx +++ b/src/Components/CameraFeed/CameraFeed.tsx @@ -78,7 +78,7 @@ export default function CameraFeed(props: Props) { .operate({ type: "get_stream_token" }) .then(({ res, data }) => { if (res?.status != 200) { - setState("authentication_error"); + setState("host_unreachable"); return props.onStreamError?.(); } const result = data?.result as { token: string }; @@ -183,13 +183,15 @@ export default function CameraFeed(props: Props) { {props.children}
    - - {props.asset.name} - - +
    + + {props.asset.name} + + +
    {!isIOS && (
    ); - case "authentication_error": - return ( - - ); case "offline": return ( { - const { cameraPTZ } = props; - return ( - - ); -}; - -const CameraFeedOld = (props: any) => { - const middlewareHostname = props.middlewareHostname; - const [presetsPage, setPresetsPage] = useState(0); - const cameraAsset = props.asset; - const [presets, setPresets] = useState([]); - const [bedPresets, setBedPresets] = useState([]); - const [showDefaultPresets, setShowDefaultPresets] = useState(false); - const [precision, setPrecision] = useState(1); - const [streamStatus, setStreamStatus] = useState( - StreamStatus.Offline, - ); - const [videoStartTime, setVideoStartTime] = useState(null); - const [bed, setBed] = useState({}); - const [presetName, setPresetName] = useState(""); - const [loading, setLoading] = useState(); - const dispatch: any = useDispatch(); - const [page, setPage] = useState({ - count: 0, - limit: 8, - offset: 0, - }); - const [toDelete, setToDelete] = useState(null); - const [toUpdate, setToUpdate] = useState(null); - const [_isFullscreen, setFullscreen] = useFullscreen(); - - const { width } = useWindowDimensions(); - const extremeSmallScreenBreakpoint = 320; - const isExtremeSmallScreen = - width <= extremeSmallScreenBreakpoint ? true : false; - const liveFeedPlayerRef = useRef(null); - const [streamUrl, setStreamUrl] = useState(""); - - const refreshPresetsHash = props.refreshPresetsHash; - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const [currentPreset, setCurrentPreset] = useState(); - const { - absoluteMove, - getCameraStatus, - getStreamToken, - getPTZPayload, - getPresets, - gotoPreset, - relativeMove, - } = useFeedPTZ({ - config: { - middlewareHostname, - ...cameraAsset, - }, - dispatch, - }); - - const fetchCameraPresets = () => - getPresets({ - onSuccess: (resp) => { - setPresets(resp); - }, - onError: (resp) => { - resp instanceof AxiosError && - Notification.Error({ - msg: "Camera is offline", - }); - }, - }); - - const calculateVideoLiveDelay = () => { - const video = liveFeedPlayerRef.current as HTMLVideoElement; - if (!video || !videoStartTime) return 0; - - const timeDifference = - (new Date().getTime() - videoStartTime.getTime()) / 1000; - - return timeDifference - video.currentTime; - }; - - const getBedPresets = async (id: any) => { - const bedAssets = await dispatch( - listAssetBeds({ - asset: id, - limit: page.limit, - offset: page.offset, - }), - ); - setBedPresets(bedAssets?.data?.results); - setPage({ - ...page, - count: bedAssets?.data?.count, - }); - }; - - const deletePreset = async (id: any) => { - const res = await dispatch(deleteAssetBed(id)); - if (res?.status === 204) { - Notification.Success({ msg: "Preset deleted successfully" }); - getBedPresets(cameraAsset.id); - } else { - Notification.Error({ - msg: "Error while deleting Preset: " + (res?.data?.detail || ""), - }); - } - setToDelete(null); - }; - - const updatePreset = async (currentPreset: any) => { - const data = { - bed_id: bed.id, - preset_name: presetName, - }; - const response = await dispatch( - partialUpdateAssetBed( - { - asset: currentPreset.asset_object.id, - bed: bed.id, - meta: { - ...currentPreset.meta, - ...data, - }, - }, - currentPreset?.id, - ), - ); - if (response && response.status === 200) { - Notification.Success({ msg: "Preset Updated" }); - } else { - Notification.Error({ msg: "Something Went Wrong" }); - } - getBedPresets(cameraAsset?.id); - fetchCameraPresets(); - setToUpdate(null); - }; - - const gotoBedPreset = (preset: any) => { - setLoading("Moving"); - absoluteMove(preset.meta.position, { - onSuccess: () => setLoading(undefined), - }); - }; - - useEffect(() => { - if (cameraAsset?.hostname) { - fetchCameraPresets(); - setTimeout(() => { - startStreamFeed(); - }, 1000); - } - }, []); - - useEffect(() => { - setPresetName(toUpdate?.meta?.preset_name); - setBed(toUpdate?.bed_object); - }, [toUpdate]); - - useEffect(() => { - getBedPresets(cameraAsset.id); - if (bedPresets?.[0]?.position) { - absoluteMove(bedPresets[0]?.position, {}); - } - }, [page.offset, cameraAsset.id, refreshPresetsHash]); - - const startStreamFeed = useCallback(async () => { - if (!liveFeedPlayerRef.current) return; - - await getStreamToken({ - onSuccess: (data) => { - setStreamUrl( - `wss://${middlewareHostname}/stream/${cameraAsset?.accessKey}/channel/0/mse?uuid=${cameraAsset?.accessKey}&channel=0&token=${data.token}`, - ); - }, - onError: () => { - setStreamStatus(StreamStatus.Offline); - }, - }); - }, [liveFeedPlayerRef.current]); - - const viewOptions = (page: number) => { - return presets - ? Object.entries(presets) - .map(([key, value]) => ({ label: key, value })) - .slice(page, page + 10) - : Array.from(Array(10), (_, i) => ({ - label: "Monitor " + (i + 1), - value: i + 1, - })); - }; - useEffect(() => { - let tId: any; - if (streamStatus !== StreamStatus.Playing) { - setStreamStatus(StreamStatus.Loading); - tId = setTimeout(() => { - startStreamFeed(); - }, 5000); - } - - return () => { - clearTimeout(tId); - }; - }, [startStreamFeed, streamStatus]); - - const handlePagination = (cOffset: number) => { - setPage({ - ...page, - offset: cOffset, - }); - }; - - const cameraPTZActionCBs: { [key: string]: (option: any) => void } = { - precision: () => { - setPrecision((precision: number) => - precision === 16 ? 1 : precision * 2, - ); - }, - reset: async () => { - setStreamStatus(StreamStatus.Loading); - setVideoStartTime(null); - await startStreamFeed(); - }, - fullScreen: () => { - if (!liveFeedPlayerRef.current) return; - setFullscreen(true, liveFeedPlayerRef.current); - }, - updatePreset: (option) => { - getCameraStatus({ - onSuccess: async (data) => { - if (currentPreset?.asset_object?.id && data?.position) { - setLoading(option.loadingLabel); - console.log("Updating Preset"); - const response = await dispatch( - partialUpdateAssetBed( - { - asset: currentPreset.asset_object.id, - bed: currentPreset.bed_object.id, - meta: { - ...currentPreset.meta, - position: data?.position, - }, - }, - currentPreset?.id, - ), - ); - if (response && response.status === 200) { - Notification.Success({ msg: "Preset Updated" }); - getBedPresets(cameraAsset?.id); - fetchCameraPresets(); - } - setLoading(undefined); - } - }, - }); - }, - other: (option) => { - setLoading(option.loadingLabel); - relativeMove(getPTZPayload(option.action, precision), { - onSuccess: () => setLoading(undefined), - }); - }, - }; - - const cameraPTZ = getCameraPTZ(precision).map((option) => { - const cb = - cameraPTZActionCBs[ - cameraPTZActionCBs[option.action] ? option.action : "other" - ]; - return { ...option, callback: () => cb(option) }; - }); - - // Voluntarily disabling eslint, since length of `cameraPTZ` is constant and - // hence shall not cause issues. (https://news.ycombinator.com/item?id=24363703) - for (const option of cameraPTZ) { - if (!option.shortcutKey) continue; - // eslint-disable-next-line react-hooks/rules-of-hooks - useKeyboardShortcut(option.shortcutKey, option.callback); - } - - return ( - - {toDelete && ( - -

    - Preset: {toDelete.meta.preset_name} -

    -

    - Bed: {toDelete.bed_object.name} -

    - - } - action="Delete" - variant="danger" - onClose={() => setToDelete(null)} - onConfirm={() => deletePreset(toDelete.id)} - /> - )} - {toUpdate && ( - setToUpdate(null)} - onConfirm={() => updatePreset(toUpdate)} - > -
    - setPresetName(value)} - /> -
    - Bed - setBed(selected as BedModel)} - selected={bed} - error="" - multiple={false} - location={cameraAsset.location_id} - facility={cameraAsset.facility_id} - /> -
    -
    -
    - )} -
    -
    -
    -
    - { - setVideoStartTime(() => new Date()); - }} - onWaiting={() => { - const delay = calculateVideoLiveDelay(); - if (delay > 5) { - setStreamStatus(StreamStatus.Loading); - } - }} - onSuccess={() => setStreamStatus(StreamStatus.Playing)} - onError={() => setStreamStatus(StreamStatus.Offline)} - /> - - {streamStatus === StreamStatus.Playing && - calculateVideoLiveDelay() > 3 && ( -
    - - Slow Network Detected -
    - )} - - {loading && ( -
    -
    -
    -

    {loading}

    -
    -
    - )} - {/* { streamStatus > 0 && */} -
    - {streamStatus === StreamStatus.Offline && ( -
    -

    - STATUS: OFFLINE -

    -

    - Feed is currently not live. -

    -

    - Click refresh button to try again. -

    -
    - )} - {streamStatus === StreamStatus.Stop && ( -
    -

    - STATUS: STOPPED -

    -

    Feed is Stooped.

    -

    - Click refresh button to start feed. -

    -
    - )} - {streamStatus === StreamStatus.Loading && ( -
    -

    - STATUS: LOADING -

    -

    - Fetching latest feed. -

    -
    - )} -
    -
    -
    - {cameraPTZ.map((option) => { - const shortcutKeyDescription = - option.shortcutKey && - option.shortcutKey - .join(" + ") - .replace("Control", "Ctrl") - .replace("ArrowUp", "↑") - .replace("ArrowDown", "↓") - .replace("ArrowLeft", "←") - .replace("ArrowRight", "→"); - - return ( - - ); - })} -
    - -
    -
    -
    - -
    - -
    -
    - {showDefaultPresets ? ( - <> - {viewOptions(presetsPage)?.map((option: any, i) => ( - - ))} - - ) : ( - <> - {bedPresets?.map((preset: any, index: number) => ( -
    - -
    - - -
    -
    - ))} - - )} -
    - {/* Page Number Next and Prev buttons */} - {showDefaultPresets ? ( -
    - - -
    - ) : ( -
    - - -
    - )} - {props?.showRefreshButton && ( - - )} -
    -
    -
    -
    - - ); -}; - -export default CameraFeedOld; diff --git a/src/Components/CameraFeed/CameraFeedWithBedPresets.tsx b/src/Components/CameraFeed/CameraFeedWithBedPresets.tsx index 7268397b81a..3e447e34e21 100644 --- a/src/Components/CameraFeed/CameraFeedWithBedPresets.tsx +++ b/src/Components/CameraFeed/CameraFeedWithBedPresets.tsx @@ -1,32 +1,29 @@ import { useState } from "react"; -import { AssetBedModel, AssetData } from "../Assets/AssetTypes"; +import { AssetData } from "../Assets/AssetTypes"; import CameraFeed from "./CameraFeed"; import useQuery from "../../Utils/request/useQuery"; -import routes from "../../Redux/api"; -import useSlug from "../../Common/hooks/useSlug"; -import { CameraPresetDropdown } from "./AssetBedSelect"; +import { CameraPresetDropdown } from "./CameraPresetSelect"; import useOperateCamera from "./useOperateCamera"; import { classNames } from "../../Utils/utils"; +import { CameraPreset, FeedRoutes } from "./routes"; interface Props { asset: AssetData; } export default function LocationFeedTile(props: Props) { - const facility = useSlug("facility"); - const [preset, setPreset] = useState(); - - const { data, loading } = useQuery(routes.listAssetBeds, { - query: { limit: 100, facility, asset: props.asset?.id }, + const [preset, setPreset] = useState(); + const { operate, key } = useOperateCamera(props.asset.id); + const { data, loading } = useQuery(FeedRoutes.listAssetPresets, { + pathParams: { asset_id: props.asset.id }, + query: { limit: 100 }, }); - const { operate, key } = useOperateCamera(props.asset.id, true); - return ( string; - onChange?: (value: AssetBedModel) => void; + options: CameraPreset[]; + value?: CameraPreset; + label?: (value: CameraPreset) => string; + onChange?: (value: CameraPreset) => void; } export default function CameraPresetSelect(props: Props) { @@ -71,16 +70,13 @@ export const CameraPresetDropdown = ( props: Props & { placeholder: string }, ) => { const selected = props.value; - - const options = props.options.filter(({ meta }) => meta.type !== "boundary"); - const label = props.label ?? defaultLabel; return (
    - {options.length === 0 + {props.options.length === 0 ? "No presets" : selected ? label(selected) @@ -113,7 +109,7 @@ export const CameraPresetDropdown = ( as="ul" className="absolute z-20 max-h-48 w-full overflow-auto rounded-b-lg bg-white py-1 text-base shadow-lg ring-1 ring-secondary-500 focus:outline-none md:max-h-60" > - {options?.map((obj) => ( + {props.options.map((obj) => ( { - return `${bed_object.name}: ${meta.preset_name}`; +const defaultLabel = (preset: CameraPreset) => { + return `${preset.asset_bed.bed_object.name}: ${preset.name}`; }; diff --git a/src/Components/CameraFeed/ConfigureCamera.tsx b/src/Components/CameraFeed/ConfigureCamera.tsx new file mode 100644 index 00000000000..052f93a9b05 --- /dev/null +++ b/src/Components/CameraFeed/ConfigureCamera.tsx @@ -0,0 +1,643 @@ +import { useEffect, useState } from "react"; +import { AssetData } from "../Assets/AssetTypes"; +import { getCameraConfig, makeAccessKey } from "../../Utils/transformUtils"; +import TextFormField from "../Form/FormFields/TextFormField"; +import ButtonV2, { Cancel, Submit } from "../Common/components/ButtonV2"; +import useAuthUser from "../../Common/hooks/useAuthUser"; +import CareIcon from "../../CAREUI/icons/CareIcon"; +import useOperateCamera from "./useOperateCamera"; +import CameraFeed from "./CameraFeed"; +import { useTranslation } from "react-i18next"; +import request from "../../Utils/request/request"; +import routes from "../../Redux/api"; +import { Error, Success } from "../../Utils/Notifications"; +import { useQueryParams } from "raviger"; +import useQuery from "../../Utils/request/useQuery"; +import { classNames, compareBy } from "../../Utils/utils"; +import RecordMeta from "../../CAREUI/display/RecordMeta"; +import { CameraPreset, FeedRoutes, GetStatusResponse } from "./routes"; +import DialogModal from "../Common/Dialog"; +import { + Listbox, + ListboxButton, + ListboxOption, + ListboxOptions, +} from "@headlessui/react"; +import { dropdownOptionClassNames } from "../Form/MultiSelectMenuV2"; +import Loading from "../Common/Loading"; +import ConfirmDialog from "../Common/ConfirmDialog"; +import { FieldLabel } from "../Form/FormFields/FormField"; +import { checkIfValidIP } from "../../Common/validation"; +import CheckBoxFormField from "../Form/FormFields/CheckBoxFormField"; + +interface Props { + asset: AssetData; + onUpdated: () => void; +} + +type OnvifPreset = { name: string; value: number }; + +export default function ConfigureCamera(props: Props) { + const { t } = useTranslation(); + const authUser = useAuthUser(); + + const presetNameSuggestions = [ + t("patient_face"), + t("patient_body"), + t("vitals_monitor"), + ]; + + const [query, setQuery] = useQueryParams<{ bed?: string }>(); + const [meta, setMeta] = useState(props.asset.meta); + const [onvifPresets, setOnvifPresets] = useState(); + const [currentOnvifPreset, setCurrentOnvifPreset] = useState(); + const [createPreset, setCreatePreset] = useState(); + const [editPreset, setEditPreset] = useState<{ + preset: CameraPreset["id"]; + position?: CameraPreset["position"]; + }>(); + const [presetName, setPresetName] = useState(""); + const [showUnlinkConfirmation, setShowUnlinkConfirmation] = useState(false); + + const assetBedsQuery = useQuery(routes.listAssetBeds, { + query: { asset: props.asset.id, limit: 50 }, + }); + + const bedsQuery = useQuery(routes.listFacilityBeds, { + query: { location: props.asset.location_object.id, limit: 50 }, + }); + + const linkedAssetBeds = assetBedsQuery.data?.results.sort( + compareBy("created_date"), + ); + + const linkedBedIDs = linkedAssetBeds?.map((a) => a.bed_object.id!); + const unlinkedBeds = + linkedBedIDs && + bedsQuery.data?.results + .filter((bed) => !linkedBedIDs.includes(bed.id!)) + .sort(compareBy("created_date")); + + const firstBedId = + linkedAssetBeds?.[0]?.bed_object.id ?? unlinkedBeds?.[0]?.id; + useEffect(() => { + if (!query.bed && firstBedId) { + setQuery({ bed: firstBedId }); + } + }, [query.bed, firstBedId]); + + const selectedAssetBed = linkedAssetBeds?.find( + (a) => a.bed_object.id === query.bed, + ); + const selectedUnlinkedBed = unlinkedBeds?.find((bed) => bed.id === query.bed); + + const cameraPresetsQuery = useQuery(FeedRoutes.listAssetBedPresets, { + pathParams: { assetbed_id: selectedAssetBed?.id ?? "" }, + query: { position: true, limit: 50 }, + prefetch: !!selectedAssetBed?.id, + }); + + useEffect(() => setMeta(props.asset.meta), [props.asset]); + + const accessKeyAttributes = getCameraConfig(meta); + + const { operate, key } = useOperateCamera(props.asset.id); + + if (!["DistrictAdmin", "StateAdmin"].includes(authUser.user_type)) { + return ( +
    + +
    + ); + } + + return ( +
    +
    +
    { + e.preventDefault(); + const { res } = await request(routes.partialUpdateAsset, { + pathParams: { external_id: props.asset.id }, + body: { meta }, + }); + + if (res?.ok) { + Success({ msg: "Asset Configured Successfully" }); + props.onUpdated(); + } + }} + > +

    {t("feed_configurations")}

    +
    + +

    {t("middleware_hostname")}

    + {!!props.asset.resolved_middleware && + props.asset.resolved_middleware.source != "asset" && ( +
    + + + {t("middleware_hostname_sourced_from", { + source: props.asset.resolved_middleware?.source, + })} + +
    + )} +
    + } + placeholder={ + props.asset.resolved_middleware?.hostname ?? + t("middleware_hostname_example") + } + value={meta?.middleware_hostname} + onChange={({ value }) => + setMeta({ ...meta, middleware_hostname: value }) + } + /> + + setMeta({ ...meta, local_ip_address: value }) + } + error={ + meta?.local_ip_address && !checkIfValidIP(meta.local_ip_address) + ? t("invalid_ip_address") + : undefined + } + /> + + setMeta({ + ...meta, + camera_access_key: makeAccessKey({ + ...accessKeyAttributes, + username: value, + }), + }) + } + /> + + setMeta({ + ...meta, + camera_access_key: makeAccessKey({ + ...accessKeyAttributes, + password: value, + }), + }) + } + /> + + setMeta({ + ...meta, + camera_access_key: makeAccessKey({ + ...accessKeyAttributes, + accessKey: value, + }), + }) + } + /> +
    +
    + +
    + + +
    + { + if (!onvifPresets) { + setOnvifPresets( + Object.entries(presets).map(([name, value]) => ({ + name, + value, + })), + ); + } + }} + > +
    + { + setCurrentOnvifPreset(preset); + operate({ + type: "goto_preset", + data: { + preset: preset.value, + }, + }); + }} + disabled={!onvifPresets?.length} + > +
    + + + {!onvifPresets?.length + ? t("no_presets") + : (currentOnvifPreset?.name ?? + t("move_to_onvif_preset"))} + + + + + + + {onvifPresets?.map((obj) => ( + + classNames( + dropdownOptionClassNames(args), + "px-2 py-1.5", + ) + } + value={obj} + > + {obj.name} + + ))} + +
    +
    +
    +
    +
    +
    + + {!linkedAssetBeds?.length && !unlinkedBeds?.length ? ( +
    + +

    {t("location_beds_empty")}

    +

    {t("add_beds_to_configure_presets")}

    +
    +
    + ) : ( +
    +

    {t("manage_bed_presets")}

    +
    + + {cameraPresetsQuery.loading && } + {selectedAssetBed && ( + <> + setShowUnlinkConfirmation(false)} + onConfirm={async () => { + const { res } = await request(routes.deleteAssetBed, { + pathParams: { external_id: selectedAssetBed.id }, + }); + + if (res?.ok) { + Success({ + msg: `${selectedAssetBed.bed_object.name} was unlinked from ${selectedAssetBed.asset_object.name}.`, + }); + setShowUnlinkConfirmation(false); + assetBedsQuery.refetch(); + } + }} + /> + { + setCreatePreset(undefined); + setPresetName(""); + }} + > + setPresetName(value)} + errorClassName="hidden" + placeholder={t("preset_name_placeholder")} + suggestions={presetNameSuggestions} + /> +
    + { + const { res } = await request(FeedRoutes.createPreset, { + pathParams: { assetbed_id: selectedAssetBed.id }, + body: { + name: presetName, + position: createPreset!, + }, + }); + if (!res?.ok) { + return; + } + setCreatePreset(undefined); + setPresetName(""); + Success({ msg: "Preset created" }); + cameraPresetsQuery.refetch(); + }} + disabled={!presetName} + /> +
    +
    +
    +
      +
    • { + const { data } = await operate({ type: "get_status" }); + if (!data) { + Error({ msg: t("unable_to_get_current_position") }); + return; + } + setCreatePreset( + (data as GetStatusResponse).result.position, + ); + }} + > + + {t("add_preset")} +
    • + {cameraPresetsQuery.data?.results.map((preset) => ( +
    • + { + setEditPreset(undefined); + setPresetName(""); + }} + > +
      + setPresetName(value)} + placeholder={t("preset_name_placeholder")} + suggestions={presetNameSuggestions} + /> + {t("position")} + { + if (!value) { + setEditPreset({ + ...editPreset!, + position: undefined, + }); + return; + } + + const { data } = await operate({ + type: "get_status", + }); + if (!data) { + Error({ + msg: t("unable_to_get_current_position"), + }); + return; + } + setEditPreset({ + ...editPreset!, + position: (data as GetStatusResponse).result + .position!, + }); + }} + /> +
      + { + setEditPreset(undefined); + setPresetName(""); + }} + /> + { + const { res } = await request( + FeedRoutes.deletePreset, + { + pathParams: { + assetbed_id: selectedAssetBed.id, + id: preset.id, + }, + }, + ); + if (!res?.ok) { + return; + } + Success({ msg: t("preset_deleted") }); + cameraPresetsQuery.refetch(); + setEditPreset(undefined); + setPresetName(""); + }} + variant="danger" + > + + {t("delete")} + + { + const { res } = await request( + FeedRoutes.updatePreset, + { + pathParams: { + assetbed_id: selectedAssetBed.id, + id: preset.id, + }, + body: { + name: presetName || undefined, + position: editPreset?.position, + }, + }, + ); + if (!res?.ok) { + return; + } + Success({ msg: t("preset_updated") }); + setEditPreset(undefined); + setPresetName(""); + cameraPresetsQuery.refetch(); + }} + /> +
      + +
      + {preset.name} + + + +
      + + operate({ + type: "absolute_move", + data: preset.position!, + }) + } + > + + {t("view")} + + { + setEditPreset({ preset: preset.id }); + }} + > + + {t("update")} + +
      +
      +
    • + ))} +
    +
    + + setShowUnlinkConfirmation(true)} + > + {t("unlink_camera_and_bed")} + +
    +
    + + )} + {selectedUnlinkedBed && ( +
    + +

    {t("bed_not_linked_to_camera")}

    +

    {t("create_preset_prerequisite")}

    + { + const { res } = await request(routes.createAssetBed, { + body: { + asset: props.asset.id, + bed: selectedUnlinkedBed.id, + }, + }); + if (res?.ok) { + Success({ msg: t("camera_bed_link_success") }); + assetBedsQuery.refetch(); + } + }} + className="mt-6" + > + {t("link_camera_and_bed")} + +
    +
    + )} +
    +
    + )} +
    + ); +} diff --git a/src/Components/CameraFeed/FeedAlert.tsx b/src/Components/CameraFeed/FeedAlert.tsx index 09f3b21ae42..86c5468decf 100644 --- a/src/Components/CameraFeed/FeedAlert.tsx +++ b/src/Components/CameraFeed/FeedAlert.tsx @@ -9,8 +9,7 @@ export type FeedAlertState = | "moving" | "zooming" | "saving_preset" - | "host_unreachable" - | "authentication_error"; + | "host_unreachable"; interface Props { state?: FeedAlertState; @@ -25,7 +24,6 @@ const ALERT_ICON_MAP: Partial> = { zooming: "l-search", saving_preset: "l-save", host_unreachable: "l-exclamation-triangle", - authentication_error: "l-exclamation-triangle", }; export default function FeedAlert({ state }: Props) { diff --git a/src/Components/CameraFeed/FeedControls.tsx b/src/Components/CameraFeed/FeedControls.tsx index 1bacd6c1cfc..36d3aa96cd2 100644 --- a/src/Components/CameraFeed/FeedControls.tsx +++ b/src/Components/CameraFeed/FeedControls.tsx @@ -15,8 +15,6 @@ const Actions = { const metaKey = isAppleDevice ? "Meta" : "Control"; -export type PTZAction = keyof typeof Actions; - /** * Returns the PTZ payload for the given action * diff --git a/src/Components/CameraFeed/routes.ts b/src/Components/CameraFeed/routes.ts index aecbdc655fa..db983d6a383 100644 --- a/src/Components/CameraFeed/routes.ts +++ b/src/Components/CameraFeed/routes.ts @@ -1,4 +1,8 @@ import { Type } from "../../Redux/api"; +import { PaginatedResponse } from "../../Utils/request/types"; +import { WritableOnly } from "../../Utils/types"; +import { AssetBedModel } from "../Assets/AssetTypes"; +import { PerformedByModel } from "../HCX/misc"; import { OperationAction, PTZPayload } from "./useOperateCamera"; export type GetStatusResponse = { @@ -23,6 +27,18 @@ export type GetPresetsResponse = { result: Record; }; +export type CameraPreset = { + readonly id: string; + name: string; + readonly asset_bed: AssetBedModel; + position: PTZPayload; + readonly created_by: PerformedByModel; + readonly updated_by: PerformedByModel; + readonly created_date: string; + readonly modified_date: string; + readonly is_migrated: boolean; +}; + export const FeedRoutes = { operateAsset: { path: "/api/v1/asset/{id}/operate_assets/", @@ -32,4 +48,37 @@ export const FeedRoutes = { >(), TBody: Type<{ action: OperationAction }>(), }, + + listAssetBedPresets: { + path: "/api/v1/assetbed/{assetbed_id}/camera_presets/", + method: "GET", + TRes: Type>(), + }, + listAssetPresets: { + path: "/api/v1/asset/{asset_id}/camera_presets/", + method: "GET", + TRes: Type>(), + }, + listBedPresets: { + path: "/api/v1/bed/{bed_id}/camera_presets/", + method: "GET", + TRes: Type>(), + }, + createPreset: { + path: "/api/v1/assetbed/{assetbed_id}/camera_presets/", + method: "POST", + TRes: Type(), + TBody: Type>(), + }, + updatePreset: { + path: "/api/v1/assetbed/{assetbed_id}/camera_presets/{id}/", + method: "PATCH", + TRes: Type(), + TBody: Type>>(), + }, + deletePreset: { + path: "/api/v1/assetbed/{assetbed_id}/camera_presets/{id}/", + method: "DELETE", + TRes: Type(), + }, } as const; diff --git a/src/Components/CameraFeed/useFeedPTZ.ts b/src/Components/CameraFeed/useFeedPTZ.ts deleted file mode 100644 index fb704baf972..00000000000 --- a/src/Components/CameraFeed/useFeedPTZ.ts +++ /dev/null @@ -1,208 +0,0 @@ -/** - * Deprecated. Use `useOperateAsset` instead. - * - * Preserving for backwards compatibility and preventing merge conflict with a - * co-related PR. Will be removed in the future. - */ - -import { operateAsset } from "../../Redux/actions"; - -export interface IAsset { - id: string; -} - -interface PTZPayload { - x: number; - y: number; - zoom: number; -} - -interface UseMSEMediaPlayerOption { - config: IAsset; - dispatch: any; -} - -interface UseMSEMediaPlayerReturnType { - absoluteMove: (payload: PTZPayload, options: IOptions) => void; - relativeMove: (payload: PTZPayload, options: IOptions) => void; - getPTZPayload: ( - action: PTZ, - precision?: number, - value?: number, - ) => PTZPayload; - getCameraStatus: (options: IOptions) => void; - getStreamToken: (options: IOptions) => void; - getPresets: (options: IOptions) => void; - gotoPreset: (payload: IGotoPresetPayload, options: IOptions) => void; -} - -interface IOptions { - onSuccess?: (resp: Record) => void; - onError?: (resp: Record) => void; -} - -export enum PTZ { - Up = "up", - Down = "down", - Left = "left", - Right = "right", - ZoomIn = "zoomIn", - ZoomOut = "zoomOut", -} - -const getCameraStatus = - (config: IAsset, dispatch: any) => - async (options: IOptions = {}) => { - if (!config.id) return; - const resp = await dispatch( - operateAsset(config.id, { - action: { - type: "get_status", - }, - }), - ); - resp && - (resp.status === 200 - ? options?.onSuccess && options.onSuccess(resp.data.result) - : options?.onError && options.onError(resp)); - }; - -const getStreamToken = - (config: IAsset, dispatch: any) => - async (options: IOptions = {}) => { - if (!config.id) return; - const resp = await dispatch( - operateAsset(config.id, { - action: { - type: "get_stream_token", - }, - }), - ); - resp && - (resp.status === 200 - ? options?.onSuccess && options.onSuccess(resp.data.result) - : options?.onError && options.onError(resp)); - }; - -const getPresets = - (config: IAsset, dispatch: any) => - async (options: IOptions = {}) => { - if (!config.id) return; - const resp = await dispatch( - operateAsset(config.id, { - action: { - type: "get_presets", - }, - }), - ); - resp && - (resp.status === 200 - ? options?.onSuccess && options.onSuccess(resp.data.result) - : options?.onError && options.onError(resp)); - }; - -interface IGotoPresetPayload { - preset: string; -} - -const gotoPreset = - (config: IAsset, dispatch: any) => - async (payload: IGotoPresetPayload, options: IOptions = {}) => { - if (!config.id) return; - const resp = await dispatch( - operateAsset(config.id, { - action: { - type: "goto_preset", - data: payload, - }, - }), - ); - resp && - (resp.status === 200 - ? options?.onSuccess && options.onSuccess(resp.data.result) - : options?.onError && options.onError(resp)); - }; - -const absoluteMove = - (config: IAsset, dispatch: any) => - async (payload: PTZPayload, options: IOptions = {}) => { - if (!config.id) return; - const resp = await dispatch( - operateAsset(config.id, { - action: { - type: "absolute_move", - data: payload, - }, - }), - ); - resp && - (resp.status === 200 - ? options?.onSuccess && options.onSuccess(resp.data.result) - : options?.onError && options.onError(resp)); - }; - -const relativeMove = - (config: IAsset, dispatch: any) => - async (payload: PTZPayload, options: IOptions = {}) => { - if (!config.id) return; - const resp = await dispatch( - operateAsset(config.id, { - action: { - type: "relative_move", - data: payload, - }, - }), - ); - resp && - (resp.status === 200 - ? options?.onSuccess && options.onSuccess(resp.data.result) - : options?.onError && options.onError(resp)); - }; - -export const getPTZPayload = ( - action: PTZ, - precision = 1, - value?: number, -): PTZPayload => { - let x = 0; - let y = 0; - let zoom = 0; - const delta = !value ? 0.1 / Math.max(1, precision) : value; - switch (action) { - case PTZ.Up: - y = delta; - break; - case PTZ.Down: - y = -delta; - break; - case PTZ.Left: - x = -delta; - break; - case PTZ.Right: - x = delta; - break; - case PTZ.ZoomIn: - zoom = delta; - break; - case PTZ.ZoomOut: - zoom = -delta; - break; - } - - return { x, y, zoom }; -}; - -export const useFeedPTZ = ({ - config, - dispatch, -}: UseMSEMediaPlayerOption): UseMSEMediaPlayerReturnType => { - return { - absoluteMove: absoluteMove(config, dispatch), - relativeMove: relativeMove(config, dispatch), - getPTZPayload, - getCameraStatus: getCameraStatus(config, dispatch), - getStreamToken: getStreamToken(config, dispatch), - getPresets: getPresets(config, dispatch), - gotoPreset: gotoPreset(config, dispatch), - }; -}; diff --git a/src/Components/CameraFeed/useOperateCamera.ts b/src/Components/CameraFeed/useOperateCamera.ts index bfddbf5b887..0e65fb0130c 100644 --- a/src/Components/CameraFeed/useOperateCamera.ts +++ b/src/Components/CameraFeed/useOperateCamera.ts @@ -54,7 +54,7 @@ export type OperationAction = * This hook is used to control the PTZ of a camera asset and retrieve other related information. * @param id The external id of the camera asset */ -export default function useOperateCamera(id: string, silent = false) { +export default function useOperateCamera(id: string) { const [key, setKey] = useState(0); return { @@ -70,14 +70,14 @@ export default function useOperateCamera(id: string, silent = false) { type: "get_status", }, }, - silent, + silent: true, }); } return request(FeedRoutes.operateAsset, { pathParams: { id }, body: { action }, - silent, + silent: true, }); }, }; diff --git a/src/Components/CameraFeed/utils.ts b/src/Components/CameraFeed/utils.ts index 5556237d579..1cb721ebcc3 100644 --- a/src/Components/CameraFeed/utils.ts +++ b/src/Components/CameraFeed/utils.ts @@ -21,7 +21,7 @@ export const getStreamUrl = (asset: AssetData, token?: string) => { throw "getStreamUrl can be invoked only for ONVIF Assets"; } - const config = getCameraConfig(asset); + const config = getCameraConfig(asset.meta); const host = asset.resolved_middleware?.hostname; const uuid = config.accessKey; diff --git a/src/Components/Common/MonitorAssetPopover.tsx b/src/Components/Common/MonitorAssetPopover.tsx index 5293c0a6cd4..3d7d55ad271 100644 --- a/src/Components/Common/MonitorAssetPopover.tsx +++ b/src/Components/Common/MonitorAssetPopover.tsx @@ -62,7 +62,7 @@ const MonitorAssetPopover = ({

    - {t("local_ipaddress")}: + {t("local_ip_address")}:

    {asset?.meta?.local_ip_address} diff --git a/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx b/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx index 2e999d1956e..91922c99205 100644 --- a/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx +++ b/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx @@ -1,14 +1,11 @@ import { useEffect, useRef, useState } from "react"; import { ConsultationTabProps } from "./index"; -import { AssetBedModel, AssetData } from "../../Assets/AssetTypes"; -import routes from "../../../Redux/api"; import useQuery from "../../../Utils/request/useQuery"; import CameraFeed from "../../CameraFeed/CameraFeed"; import Loading from "../../Common/Loading"; -import AssetBedSelect from "../../CameraFeed/AssetBedSelect"; +import CameraPresetSelect from "../../CameraFeed/CameraPresetSelect"; import { triggerGoal } from "../../../Integrations/Plausible"; import useAuthUser from "../../../Common/hooks/useAuthUser"; -import useSlug from "../../../Common/hooks/useSlug"; import CareIcon from "../../../CAREUI/icons/CareIcon"; import ButtonV2 from "../../Common/components/ButtonV2"; import useOperateCamera, { @@ -20,18 +17,19 @@ import ConfirmDialog from "../../Common/ConfirmDialog"; import useBreakpoints from "../../../Common/hooks/useBreakpoints"; import { Warn } from "../../../Utils/Notifications"; import { useTranslation } from "react-i18next"; -import { GetStatusResponse } from "../../CameraFeed/routes"; +import { + CameraPreset, + FeedRoutes, + GetStatusResponse, +} from "../../CameraFeed/routes"; import StillWatching from "../../CameraFeed/StillWatching"; export const ConsultationFeedTab = (props: ConsultationTabProps) => { const { t } = useTranslation(); const authUser = useAuthUser(); - const facility = useSlug("facility"); const bed = props.consultationData.current_bed?.bed_object; const feedStateSessionKey = `encounterFeedState[${props.consultationId}]`; - - const [asset, setAsset] = useState(); - const [preset, setPreset] = useState(); + const [preset, setPreset] = useState(); const [showPresetSaveConfirmation, setShowPresetSaveConfirmation] = useState(false); const [isUpdatingPreset, setIsUpdatingPreset] = useState(false); @@ -52,23 +50,22 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => { } }, []); - const { key, operate } = useOperateCamera(asset?.id ?? "", true); + const asset = preset?.asset_bed.asset_object; + + const { key, operate } = useOperateCamera(asset?.id ?? ""); - const { data, loading, refetch } = useQuery(routes.listAssetBeds, { - query: { limit: 100, facility, bed: bed?.id, asset: asset?.id }, + const presetsQuery = useQuery(FeedRoutes.listBedPresets, { + pathParams: { bed_id: bed?.id ?? "" }, + query: { limit: 100 }, prefetch: !!bed, onResponse: ({ data }) => { if (!data) { return; } - const presets = data.results.filter( - (obj) => - obj.asset_object.meta?.asset_type === "CAMERA" && - obj.meta.type !== "boundary", - ); - + const presets = data.results; const lastStateJSON = sessionStorage.getItem(feedStateSessionKey); + const preset = (() => { if (lastStateJSON) { @@ -77,23 +74,33 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => { return presets.find((obj) => obj.id === lastState.value); } if (lastState.type === "position") { + const assetBedObj = presets.find( + (p) => p.asset_bed.id === lastState.assetBed, + )?.asset_bed; + + if (!assetBedObj) { + return; + } + return { ...presets[0], id: "", - meta: { ...presets[0].meta, position: lastState.value }, - }; + asset_bed: assetBedObj, + position: lastState.value, + } satisfies CameraPreset; } } })() ?? presets[0]; + console.log({ preset, presets }); + if (preset) { setPreset(preset); - setAsset(preset.asset_object); } }, }); - const presets = data?.results; + const presets = presetsQuery.data?.results; const handleUpdatePreset = async () => { if (!preset) return; @@ -102,17 +109,17 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => { const { data } = await operate({ type: "get_status" }); const { position } = (data as { result: { position: PTZPayload } }).result; - - const { data: updated } = await request(routes.partialUpdateAssetBed, { - pathParams: { external_id: preset.id }, + const { data: updated } = await request(FeedRoutes.updatePreset, { + pathParams: { + assetbed_id: preset.asset_bed.id, + id: preset.id, + }, body: { - asset: preset.asset_object.id, - bed: preset.bed_object.id, - meta: { ...preset.meta, position }, + position, }, }); - await refetch(); + await presetsQuery.refetch(); setPreset(updated); setHasMoved(false); @@ -124,7 +131,7 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => { if (divRef.current) { divRef.current.scrollIntoView({ behavior: "smooth" }); } - }, [!!bed, loading, !!asset, divRef.current]); + }, [!!bed, presetsQuery.loading, !!asset, divRef.current]); useEffect(() => { if (preset?.id) { @@ -138,7 +145,7 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => { } }, [feedStateSessionKey, preset]); - if (loading) { + if (presetsQuery.loading) { return ; } @@ -169,8 +176,11 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => { { + if (!preset) { + return; + } setHasMoved(true); setTimeout(async () => { const { data } = await operate({ type: "get_status" }); @@ -179,6 +189,7 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => { feedStateSessionKey, JSON.stringify({ type: "position", + assetBed: preset.asset_bed.id, value: (data as GetStatusResponse).result.position, } satisfies LastAccessedPosition), ); @@ -204,26 +215,19 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => {

    {presets ? ( <> - obj.meta.preset_name} + label={(obj) => obj.name} value={preset} onChange={(value) => { triggerGoal("Camera Preset Clicked", { - presetName: preset?.meta?.preset_name, + presetName: preset?.name, consultationId: props.consultationId, userId: authUser.id, result: "success", }); setHasMoved(false); - // Voluntarily copying to trigger change of reference of the position attribute, so that the useEffect of CameraFeed that handles the moves gets triggered. - setPreset({ - ...value, - meta: { - ...value.meta, - position: { ...value.meta.position }, - }, - }); + setPreset(value); }} /> {isUpdatingPreset ? ( @@ -269,6 +273,7 @@ type LastAccessedPreset = { type LastAccessedPosition = { type: "position"; + assetBed: string; value: PTZPayload; }; diff --git a/src/Components/Facility/ConsultationDetails/index.tsx b/src/Components/Facility/ConsultationDetails/index.tsx index 6970898a158..3b34689221d 100644 --- a/src/Components/Facility/ConsultationDetails/index.tsx +++ b/src/Components/Facility/ConsultationDetails/index.tsx @@ -1,10 +1,6 @@ import { GENDER_TYPES } from "../../../Common/constants"; import { ConsultationModel } from "../models"; -import { - getConsultation, - getPatient, - listAssetBeds, -} from "../../../Redux/actions"; +import { getConsultation, getPatient } from "../../../Redux/actions"; import { statusType, useAbortableEffect } from "../../../Common/utils"; import { useCallback, useState } from "react"; import DoctorVideoSlideover from "../DoctorVideoSlideover"; @@ -35,7 +31,6 @@ import { ConsultationNeurologicalMonitoringTab } from "./ConsultationNeurologica import ABDMRecordsTab from "../../ABDM/ABDMRecordsTab"; import { ConsultationNutritionTab } from "./ConsultationNutritionTab"; import PatientNotesSlideover from "../PatientNotesSlideover"; -import { AssetBedModel } from "../../Assets/AssetTypes"; import PatientInfoCard from "../../Patient/PatientInfoCard"; import RelativeDateUserMention from "../../Common/RelativeDateUserMention"; import DiagnosesListAccordion from "../../Diagnosis/DiagnosesListAccordion"; @@ -129,20 +124,24 @@ export const ConsultationDetails = (props: any) => { ); } setConsultationData(data); - const assetRes = data?.current_bed?.bed_object?.id - ? await dispatch( - listAssetBeds({ - bed: data?.current_bed?.bed_object?.id, - }), - ) - : null; - const isCameraAttachedRes = - assetRes != null - ? assetRes.data.results.some((asset: AssetBedModel) => { - return asset?.asset_object?.asset_class === "ONVIF"; - }) - : false; - setIsCameraAttached(isCameraAttachedRes); + + setIsCameraAttached( + await (async () => { + const bedId = data?.current_bed?.bed_object?.id; + if (!bedId) { + return false; + } + const { data: assetBeds } = await request(routes.listAssetBeds, { + query: { bed: bedId }, + }); + if (!assetBeds) { + return false; + } + return assetBeds.results.some( + (a) => a.asset_object.asset_class === "ONVIF", + ); + })(), + ); // Get patient data const id = res.data.patient; diff --git a/src/Components/Facility/FacilityUsers.tsx b/src/Components/Facility/FacilityUsers.tsx index 92cc4b35d10..f7fe62810fc 100644 --- a/src/Components/Facility/FacilityUsers.tsx +++ b/src/Components/Facility/FacilityUsers.tsx @@ -4,7 +4,7 @@ import CareIcon from "../../CAREUI/icons/CareIcon"; import { RESULTS_PER_PAGE_LIMIT } from "../../Common/constants"; import * as Notification from "../../Utils/Notifications.js"; import { formatName, isUserOnline, relativeTime } from "../../Utils/utils"; -import SlideOverCustom from "../../CAREUI/interactive/SlideOver"; +import SlideOver from "../../CAREUI/interactive/SlideOver"; import Pagination from "../Common/Pagination"; import UserDetails from "../Common/UserDetails"; import ButtonV2 from "../Common/components/ButtonV2"; @@ -279,7 +279,7 @@ export default function FacilityUsers(props: any) { /> )}
    - - +
    {manageUsers}
    diff --git a/src/Components/Form/FormFields/TextFormField.tsx b/src/Components/Form/FormFields/TextFormField.tsx index 0593dc9a2d3..12d6623cd15 100644 --- a/src/Components/Form/FormFields/TextFormField.tsx +++ b/src/Components/Form/FormFields/TextFormField.tsx @@ -25,6 +25,7 @@ export type TextFormFieldProps = FormFieldBaseProps & { onKeyDown?: (event: React.KeyboardEvent) => void; onFocus?: (event: React.FocusEvent) => void; onBlur?: (event: React.FocusEvent) => void; + suggestions?: string[]; }; const TextFormField = forwardRef((props: TextFormFieldProps, ref) => { @@ -125,6 +126,28 @@ const TextFormField = forwardRef((props: TextFormFieldProps, ref) => { ); } + if ( + props.suggestions?.length && + !props.suggestions.includes(`${field.value}`) + ) { + child = ( +
    + {child} +
      + {props.suggestions.map((suggestion) => ( +
    • field.handleChange(suggestion)} + > + {suggestion} +
    • + ))} +
    +
    + ); + } + return {child}; }); diff --git a/src/Locale/en.json b/src/Locale/en.json index d4808fa185b..08f9ded2130 100644 --- a/src/Locale/en.json +++ b/src/Locale/en.json @@ -222,6 +222,7 @@ "add_as": "Add as", "add_attachments": "Add Attachments", "add_beds": "Add Bed(s)", + "add_beds_to_configure_presets": "Add beds to this location to configure presets for them.", "add_details_of_patient": "Add Details of Patient", "add_location": "Add Location", "add_new_user": "Add New User", @@ -229,6 +230,7 @@ "add_policy": "Add Insurance Policy", "add_prescription_medication": "Add Prescription Medication", "add_prescription_to_consultation_note": "Add a new prescription to this consultation.", + "add_preset": "Add preset", "add_prn_prescription": "Add PRN Prescription", "add_remarks": "Add remarks", "add_spoke": "Add Spoke Facility", @@ -296,6 +298,7 @@ "bed_capacity": "Bed Capacity", "bed_created_notification_one": "{{count}} Bed created successfully", "bed_created_notification_other": "{{count}} Beds created successfully", + "bed_not_linked_to_camera": "This bed has not been linked to this camera.", "bed_search_placeholder": "Search by beds name", "bed_type": "Bed Type", "bed_type__100": "ICU Bed", @@ -314,7 +317,9 @@ "bradycardia": "Bradycardia", "breathlessness_level": "Breathlessness level", "camera": "Camera", + "camera_bed_link_success": "Camera linked to bed successfully.", "camera_permission_denied": "Camera Permission denied", + "camera_was_linked_to_bed": "This camera was linked to this bed", "cancel": "Cancel", "capture": "Capture", "capture_cover_photo": "Capture Cover Photo", @@ -385,7 +390,7 @@ "confirm_password": "Confirm Password", "confirm_transfer_complete": "Confirm Transfer Complete!", "confirmed": "Confirmed", - "consultation_not_filed": "You have not filed any consultation for this patient yet.", + "consultation_not_filed": "You have not filed a consultation for this patient yet.", "consultation_not_filed_description": "Please file a consultation for this patient to continue.", "consultation_notes": "General Instructions (Advice)", "consultation_updates": "Consultation updates", @@ -408,6 +413,9 @@ "create_consultation": "Create Consultation", "create_facility": "Create a new facility", "create_new_asset": "Create New Asset", + "create_position_preset": "Create a new position preset", + "create_position_preset_description": "Creates a new position preset in Care from the current position of the camera for the given name", + "create_preset_prerequisite": "To create presets for this bed, you'll need to link the camera to the bed first.", "create_resource_request": "Create Resource Request", "created": "Created", "created_date": "Created Date", @@ -535,6 +543,7 @@ "facility_type": "Facility Type", "failed_to_link_abha_number": "Failed to link ABHA number", "features": "Features", + "feed_configurations": "Feed Configurations", "feed_is_currently_not_live": "Feed is currently not live", "feed_optimal_experience_for_apple_phones": "For optimal viewing experience, consider rotating your device. Ensure auto-rotate is enabled in your device settings.", "feed_optimal_experience_for_phones": "For optimal viewing experience, consider rotating your device.", @@ -591,6 +600,7 @@ "international_mobile": "International Mobile", "invalid_asset_id_msg": "Oops! The asset ID you entered does not appear to be valid.", "invalid_email": "Please Enter a Valid Email Address", + "invalid_ip_address": "Invalid IP Address", "invalid_link_msg": "It appears that the password reset link you have used is either invalid or expired. Please request a new password reset link.", "invalid_password": "Password doesn't meet the requirements", "invalid_password_reset_link": "Invalid password reset link", @@ -634,6 +644,7 @@ "latitude_invalid": "Latitude must be between -90 and 90", "left": "Left", "length": "Length ({{unit}})", + "link_camera_and_bed": "Link bed to Camera", "linked_facilities": "Linked Facilities", "linked_skills": "Linked Skills", "liquid_oxygen_capacity": "Liquid Oxygen Capacity", @@ -646,8 +657,10 @@ "load_more": "Load More", "loading": "Loading...", "local_body": "Local body", - "local_ipaddress": "Local IP Address", + "local_ip_address": "Local IP Address", + "local_ip_address_example": "e.g. 192.168.0.123", "location": "Location", + "location_beds_empty": "No beds available in this location", "location_management": "Location Management", "log_lab_results": "Log Lab Results", "log_report": "Log Report", @@ -655,7 +668,9 @@ "longitude_invalid": "Longitude must be between -180 and 180", "lsg": "Lsg", "make_multiple_beds_label": "Do you want to make multiple beds?", + "manage_bed_presets": "Manage Presets of Bed", "manage_prescriptions": "Manage Prescriptions", + "manage_preset": "Manage preset {{ name }}", "manufacturer": "Manufacturer", "map_acronym": "M.A.P.", "mark_all_as_read": "Mark all as Read", @@ -673,6 +688,8 @@ "medicines_administered": "Medicine(s) administered", "medicines_administered_error": "Error administering medicine(s)", "middleware_hostname": "Middleware Hostname", + "middleware_hostname_example": "e.g. example.ohc.network", + "middleware_hostname_sourced_from": "Middleware hostname sourced from {{ source }}", "min_password_len_8": "Minimum password length 8", "min_time_bw_doses": "Min. time b/w doses", "mobile": "Mobile", @@ -682,6 +699,7 @@ "modified_date": "Modified Date", "monitor": "Monitor", "more_info": "More Info", + "move_to_onvif_preset": "Move to an ONVIF Preset", "moving_camera": "Moving Camera", "name": "Name", "name_of_hospital": "Name of Hospital", @@ -711,6 +729,7 @@ "no_patients_to_show": "No patients to show.", "no_policy_added": "No Insurance Policy Added", "no_policy_found": "No Insurance Policy Found for this Patient", + "no_presets": "No Presets", "no_remarks": "No remarks", "no_results_found": "No Results Found", "no_staff": "No staff found", @@ -757,6 +776,7 @@ "password_reset_success": "Password Reset successfully", "password_sent": "Password Reset Email Sent", "patient_address": "Patient Address", + "patient_body": "Patient Body", "patient_category": "Patient Category", "patient_consultation__admission": "Date of admission", "patient_consultation__consultation_notes": "General Instructions", @@ -771,6 +791,7 @@ "patient_consultation__treatment__summary__temperature": "Temperature", "patient_created": "Patient Created", "patient_details": "Patient Details", + "patient_face": "Patient Face", "patient_name": "Patient name", "patient_no": "OP/IP No", "patient_notes_thread__Doctors": "Doctor's Discussions", @@ -813,6 +834,7 @@ "policy__policy_id__example": "POL001", "policy__subscriber_id": "Member ID", "policy__subscriber_id__example": "SUB001", + "position": "Position", "post_your_comment": "Post Your Comment", "powered_by": "Powered By", "preferred_facility_type": "Preferred Facility Type", @@ -827,6 +849,9 @@ "prescriptions__medicine": "Medicine", "prescriptions__route": "Route", "prescriptions__start_date": "Prescribed On", + "preset_deleted": "Preset deleted", + "preset_name_placeholder": "Specify an identifiable name for the new preset", + "preset_updated": "Preset updated", "prev_sessions": "Prev Sessions", "principal": "Principal", "principal_diagnosis": "Principal diagnosis", @@ -963,6 +988,7 @@ "stop": "Stop", "stream_stop_due_to_inativity": "The live feed will stop streaming due to inactivity", "stream_stopped_due_to_inativity": "The live feed has stopped streaming due to inactivity", + "stream_uuid": "Stream UUID", "sub_category": "Sub Category", "submit": "Submit", "submitting": "Submitting", @@ -998,9 +1024,13 @@ "type_to_search": "Type to search", "type_your_comment": "Type your comment", "type_your_reason_here": "Type your reason here", + "unable_to_get_current_position": "Unable to get current position.", "unconfirmed": "Unconfirmed", "unique_id": "Unique Id", "unknown": "Unknown", + "unlink_asset_bed_and_presets": "Delete linked presets and unlink bed", + "unlink_asset_bed_caution": "This action will also delete all presets that are associated to this camera and bed.", + "unlink_camera_and_bed": "Unlink this bed from this camera", "unsubscribe": "Unsubscribe", "unsubscribe_failed": "Unsubscribe failed.", "unsupported_browser": "Unsupported Browser", @@ -1015,6 +1045,7 @@ "update_facility": "Update Facility", "update_facility_middleware_success": "Facility middleware updated successfully", "update_log": "Update Log", + "update_preset_position_to_current": "Update preset's position to camera's current position", "update_record": "Update Record", "update_record_for_asset": "Update record for asset", "update_shift_request": "Update Shift Request", @@ -1045,6 +1076,7 @@ "view_users": "View Users", "virtual_nursing_assistant": "Virtual Nursing Assistant", "vitals": "Vitals", + "vitals_monitor": "Vitals Monitor", "ward": "Ward", "warranty_amc_expiry": "Warranty / AMC Expiry", "what_facility_assign_the_patient_to": "What facility would you like to assign the patient to", diff --git a/src/Locale/hi.json b/src/Locale/hi.json index 93d9ef32f34..e235c558978 100644 --- a/src/Locale/hi.json +++ b/src/Locale/hi.json @@ -458,7 +458,7 @@ "load_more": "और लोड करें", "loading": "लोड हो रहा है...", "local_body": "स्थानीय निकाय", - "local_ipaddress": "स्थानीय आईपी पता", + "local_ip_address": "स्थानीय आईपी पता", "location": "जगह", "location_management": "स्थान प्रबंधन", "log_lab_results": "लॉग लैब परिणाम", @@ -810,4 +810,4 @@ "you_need_at_least_a_location_to_create_an_assest": "संपत्ति बनाने के लिए आपको कम से कम एक स्थान की आवश्यकता होगी।", "zoom_in": "ज़ूम इन", "zoom_out": "ज़ूम आउट" -} +} \ No newline at end of file diff --git a/src/Locale/kn.json b/src/Locale/kn.json index acaebe8e421..dc46e49394f 100644 --- a/src/Locale/kn.json +++ b/src/Locale/kn.json @@ -459,7 +459,7 @@ "load_more": "ಇನ್ನಷ್ಟು ಲೋಡ್ ಮಾಡಿ", "loading": "ಲೋಡ್ ಆಗುತ್ತಿದೆ...", "local_body": "ಸ್ಥಳೀಯ ಸಂಸ್ಥೆ", - "local_ipaddress": "ಸ್ಥಳೀಯ IP ವಿಳಾಸ", + "local_ip_address": "ಸ್ಥಳೀಯ IP ವಿಳಾಸ", "location": "ಸ್ಥಳ", "location_management": "ಸ್ಥಳ ನಿರ್ವಹಣೆ", "log_lab_results": "ಲಾಗ್ ಲ್ಯಾಬ್ ಫಲಿತಾಂಶಗಳು", @@ -810,4 +810,4 @@ "you_need_at_least_a_location_to_create_an_assest": "ಆಸ್ತಿಯನ್ನು ರಚಿಸಲು ನಿಮಗೆ ಕನಿಷ್ಠ ಸ್ಥಳದ ಅಗತ್ಯವಿದೆ.", "zoom_in": "ಜೂಮ್ ಇನ್", "zoom_out": "ಜೂಮ್ ಔಟ್" -} +} \ No newline at end of file diff --git a/src/Locale/ml.json b/src/Locale/ml.json index 8460b6f8b7c..d830d3a46ec 100644 --- a/src/Locale/ml.json +++ b/src/Locale/ml.json @@ -458,7 +458,7 @@ "load_more": "കൂടുതൽ ലോഡ് ചെയ്യുക", "loading": "ലോഡ് ചെയ്യുന്നു...", "local_body": "തദ്ദേശ സ്ഥാപനം", - "local_ipaddress": "പ്രാദേശിക ഐപി വിലാസം", + "local_ip_address": "പ്രാദേശിക ഐപി വിലാസം", "location": "സ്ഥാനം", "location_management": "ലൊക്കേഷൻ മാനേജ്മെൻ്റ്", "log_lab_results": "ലോഗ് ലാബ് ഫലങ്ങൾ", @@ -810,4 +810,4 @@ "you_need_at_least_a_location_to_create_an_assest": "ഒരു അസസ്‌റ്റ് സൃഷ്‌ടിക്കാൻ നിങ്ങൾക്ക് ഒരു ലൊക്കേഷനെങ്കിലും ആവശ്യമാണ്.", "zoom_in": "സൂം ഇൻ ചെയ്യുക", "zoom_out": "സൂം ഔട്ട്" -} +} \ No newline at end of file diff --git a/src/Locale/ta.json b/src/Locale/ta.json index 1fbf82c29aa..042f5a068c4 100644 --- a/src/Locale/ta.json +++ b/src/Locale/ta.json @@ -458,7 +458,7 @@ "load_more": "மேலும் ஏற்றவும்", "loading": "ஏற்றுகிறது...", "local_body": "உள்ளூர் அமைப்பு", - "local_ipaddress": "உள்ளூர் ஐபி முகவரி", + "local_ip_address": "உள்ளூர் ஐபி முகவரி", "location": "இடம்", "location_management": "இருப்பிட மேலாண்மை", "log_lab_results": "பதிவு ஆய்வக முடிவுகள்", @@ -810,4 +810,4 @@ "you_need_at_least_a_location_to_create_an_assest": "ஒரு அசெஸ்ட்டை உருவாக்க குறைந்தபட்சம் ஒரு இருப்பிடமாவது தேவை.", "zoom_in": "பெரிதாக்கவும்", "zoom_out": "பெரிதாக்கவும்" -} +} \ No newline at end of file diff --git a/src/Redux/actions.tsx b/src/Redux/actions.tsx index 47d3530d065..29fe2fed2ef 100644 --- a/src/Redux/actions.tsx +++ b/src/Redux/actions.tsx @@ -1,29 +1,5 @@ import { fireRequest } from "./fireRequest"; -// asset bed -export const listAssetBeds = (params: object, altKey?: string) => - fireRequest("listAssetBeds", [], params, {}, altKey); - -export const partialUpdateAssetBed = (params: object, asset_id: string) => - fireRequest( - "partialUpdateAssetBed", - [], - { ...params }, - { - external_id: asset_id, - }, - ); - -export const deleteAssetBed = (asset_id: string) => - fireRequest( - "deleteAssetBed", - [], - {}, - { - external_id: asset_id, - }, - ); - export const getPatient = (pathParam: object) => { return fireRequest("getPatient", [], {}, pathParam); }; @@ -41,6 +17,3 @@ export const getConsultation = (id: string) => { export const dischargePatient = (params: object, pathParams: object) => { return fireRequest("dischargePatient", [], params, pathParams); }; - -export const operateAsset = (id: string, params: object) => - fireRequest("operateAsset", [], params, { external_id: id }); diff --git a/src/Utils/transformUtils.ts b/src/Utils/transformUtils.ts index 0050a0bcbb6..4aa63da734c 100644 --- a/src/Utils/transformUtils.ts +++ b/src/Utils/transformUtils.ts @@ -1,16 +1,23 @@ import { AssetData } from "../Components/Assets/AssetTypes"; -export const getCameraConfig = (asset: AssetData) => { - const { meta } = asset; +export const getCameraConfig = (meta: AssetData["meta"]) => { return { middleware_hostname: meta?.middleware_hostname, - id: asset?.id, hostname: meta?.local_ip_address, username: meta?.camera_access_key?.split(":")[0], password: meta?.camera_access_key?.split(":")[1], accessKey: meta?.camera_access_key?.split(":")[2], port: 80, - location_id: asset?.location_object?.id, - facility_id: asset?.location_object?.facility?.id, }; }; + +export const makeAccessKey = ( + attrs: Pick< + ReturnType, + "username" | "password" | "accessKey" + >, +) => { + return [attrs.username, attrs.password, attrs.accessKey] + .map((a) => a ?? "") + .join(":"); +}; From 2778b496730339b327bc63a948158407c6d521a4 Mon Sep 17 00:00:00 2001 From: JavidSumra <112365664+JavidSumra@users.noreply.github.com> Date: Fri, 18 Oct 2024 21:08:24 +0530 Subject: [PATCH 28/31] fix: close profile dropdown on first click when navigating (#8824) --- src/Components/Common/Sidebar/SidebarUserCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/Common/Sidebar/SidebarUserCard.tsx b/src/Components/Common/Sidebar/SidebarUserCard.tsx index 9effc947dd6..70a64917224 100644 --- a/src/Components/Common/Sidebar/SidebarUserCard.tsx +++ b/src/Components/Common/Sidebar/SidebarUserCard.tsx @@ -26,7 +26,7 @@ const SidebarUserCard: React.FC = ({ shrinked }) => {
    - +
    @@ -50,7 +52,7 @@ function ConsentArtefactCard({ artefact }: IConsentArtefactCardProps) { key={hiType} className="flex items-center justify-center rounded-full bg-secondary-600 px-4 py-1.5 text-xs font-medium text-white" > - {hiType} + {t(`consent__hi_type__${hiType}`)}
    ); })} @@ -64,15 +66,14 @@ interface IConsentRequestCardProps { } function ConsentRequestCard({ consent }: IConsentRequestCardProps) { + const { t } = useTranslation(); + return (
    - { - ABDM_CONSENT_PURPOSE.find((p) => p.value === consent.purpose) - ?.label - } + {t(`consent__purpose__${consent.purpose}`)}
    {formatName(consent.requester)} @@ -84,39 +85,40 @@ function ConsentRequestCard({ consent }: IConsentRequestCardProps) { {dayjs(consent.to_time).format("MMM DD YYYY")}

    - expires in {dayjs(consent.expiry).fromNow()} + {t("expires_on")} {dayjs(consent.expiry).fromNow()}

    { - const { res, error } = await request( - routes.abha.checkConsentStatus, + const { res, data } = await request( + routes.abdm.consent.checkStatus, { - pathParams: { id: consent.id }, + body: { + consent_request: consent.id, + }, }, ); - if (res?.status === 200) { + if (res?.status === 202) { Notification.Success({ - msg: "Checking Status!", + msg: data?.detail ?? t("checking_consent_status"), }); - } else { - Notification.Error({ - msg: error?.message ?? "Error while checking status!", + Notification.Warn({ + msg: t("async_operation_warning"), }); } }} ghost className="max-w-2xl text-sm text-secondary-700 hover:text-secondary-900" > - check status + {t("check_status")}

    - created {dayjs(consent.created_date).fromNow()} + {t("created_on")} {dayjs(consent.created_date).fromNow()}

    - modified {dayjs(consent.modified_date).fromNow()} + {t("modified_on")} {dayjs(consent.modified_date).fromNow()}

    @@ -130,8 +132,8 @@ function ConsentRequestCard({ consent }: IConsentRequestCardProps) {

    {consent.status === "REQUESTED" - ? "Waiting for the Patient to approve the consent request" - : "Patient has rejected the consent request"} + ? t("consent_request_waiting_approval") + : t("consent_request_rejected")}

    )} @@ -147,7 +149,7 @@ function ConsentRequestCard({ consent }: IConsentRequestCardProps) { : "bg-secondary-600", )} > - {hiType} + {t(`consent__hi_type__${hiType}`)}
    ); })} @@ -161,7 +163,9 @@ interface IProps { } export default function ABDMRecordsTab({ patientId }: IProps) { - const { data, loading } = useQuery(routes.abha.listConsents, { + const { t } = useTranslation(); + + const { data, loading } = useQuery(routes.abdm.consent.list, { query: { patient: patientId, ordering: "-created_date", @@ -175,9 +179,11 @@ export default function ABDMRecordsTab({ patientId }: IProps) { if (!data?.results.length) { return (
    -

    No Records found

    +

    + {t("no_records_found")} +

    - Raise a consent request to fetch patient records over ABDM + {t("raise_consent_request")}

    ); diff --git a/src/Components/ABDM/ABHAProfileModal.tsx b/src/Components/ABDM/ABHAProfileModal.tsx index 99b888cc1ef..87d5369d191 100644 --- a/src/Components/ABDM/ABHAProfileModal.tsx +++ b/src/Components/ABDM/ABHAProfileModal.tsx @@ -8,6 +8,7 @@ import { useRef } from "react"; import request from "../../Utils/request/request"; import routes from "../../Redux/api"; import { AbhaNumberModel } from "./types/abha"; +import { useTranslation } from "react-i18next"; interface IProps { patientId?: string; @@ -17,32 +18,55 @@ interface IProps { } const ABHAProfileModal = ({ patientId, show, onClose, abha }: IProps) => { + const { t } = useTranslation(); + const printRef = useRef(null); const downloadAbhaCard = async (type: "pdf" | "png") => { - if (!patientId) return; - const { res, data } = await request(routes.abha.getAbhaCard, { - body: { - patient: patientId, - type: type, - }, + if (!patientId || !abha?.abha_number) return; + + Notify.Success({ msg: t("downloading_abha_card") }); + + const { res, data } = await request(routes.abdm.healthId.getAbhaCard, { + query: { abha_id: abha?.abha_number }, }); if (res?.status === 200 && data) { + const imageUrl = URL.createObjectURL(data); + if (type === "png") { const downloadLink = document.createElement("a"); - downloadLink.href = "data:application/octet-stream;base64," + data; + downloadLink.href = imageUrl; downloadLink.download = "abha.png"; downloadLink.click(); + URL.revokeObjectURL(imageUrl); } else { - const htmlPopup = ``; - - const printWindow = window.open("", "PDF"); + const printWindow = window.open("", "_blank"); + const htmlPopup = ` + + + Print Image + + + + + + + `; printWindow?.document.write(htmlPopup); - printWindow?.print(); + printWindow?.document.close(); + printWindow?.addEventListener("load", () => { + printWindow?.print(); + URL.revokeObjectURL(imageUrl); + }); } - } else { - Notify.Error({ msg: "Download Failed..." }); } }; @@ -50,7 +74,7 @@ const ABHAProfileModal = ({ patientId, show, onClose, abha }: IProps) => { -

    ABHA Profile

    +

    {t("abha_profile")}

    downloadAbhaCard("pdf")} @@ -93,16 +117,19 @@ const ABHAProfileModal = ({ patientId, show, onClose, abha }: IProps) => {
    {[ { - label: "Name", + label: t("full_name"), value: abha?.name || `${abha?.first_name} ${abha?.middle_name} ${abha?.last_name}`, }, - { label: "DOB", value: abha?.date_of_birth }, - { label: "Gender", value: abha?.gender }, - { label: "ABHA Number", value: abha?.abha_number }, - { label: "ABHA ID", value: abha?.health_id?.split("@")[0] }, - { label: "Email", value: abha?.email }, + { label: t("date_of_birth"), value: abha?.date_of_birth }, + { label: t("gender"), value: abha?.gender }, + { label: t("abha_number"), value: abha?.abha_number }, + { + label: t("abha_address"), + value: abha?.health_id?.split("@")[0], + }, + { label: t("email"), value: abha?.email }, ].map((item, index) => item.value ? (
    @@ -117,13 +144,13 @@ const ABHAProfileModal = ({ patientId, show, onClose, abha }: IProps) => {
    {abha?.created_date && (
    - Created On: + {t("created_on")}: {formatDateTime(abha.created_date)}
    )} {abha?.modified_date && (
    - Last Modified On: + {t("modified_on")}: {formatDateTime(abha.modified_date)}
    )} diff --git a/src/Components/ABDM/ConfigureHealthFacility.tsx b/src/Components/ABDM/ConfigureHealthFacility.tsx index f78a65f2cd1..495f2e5d4f6 100644 --- a/src/Components/ABDM/ConfigureHealthFacility.tsx +++ b/src/Components/ABDM/ConfigureHealthFacility.tsx @@ -8,17 +8,32 @@ import useQuery from "../../Utils/request/useQuery"; import routes from "../../Redux/api"; import request from "../../Utils/request/request"; import { FieldChangeEvent } from "../Form/FormFields/Utils.js"; +import { IHealthFacility } from "./types/health-facility.js"; +import { useTranslation } from "react-i18next"; + import Loading from "@/Components/Common/Loading"; const initForm = { - health_facility: null, + health_facility: null as IHealthFacility | null, hf_id: "", }; + const initialState = { form: { ...initForm }, - errors: {}, + errors: {} as Partial>, }; -const FormReducer = (state = initialState, action: any) => { +const FormReducer = ( + state = initialState, + action: + | { + type: "set_form"; + form: typeof initialState.form; + } + | { + type: "set_error"; + errors: typeof initialState.errors; + }, +) => { switch (action.type) { case "set_form": { return { @@ -37,12 +52,20 @@ const FormReducer = (state = initialState, action: any) => { } }; -export const ConfigureHealthFacility = (props: any) => { +export interface IConfigureHealthFacilityProps { + facilityId: string; +} + +export const ConfigureHealthFacility = ( + props: IConfigureHealthFacilityProps, +) => { + const { t } = useTranslation(); + const [state, dispatch] = useReducer(FormReducer, initialState); const { facilityId } = props; const [isLoading, setIsLoading] = useState(false); - const { loading } = useQuery(routes.abha.getHealthFacility, { + const { loading } = useQuery(routes.abdm.healthFacility.get, { pathParams: { facility_id: facilityId }, silent: true, onResponse(res) { @@ -66,7 +89,7 @@ export const ConfigureHealthFacility = (props: any) => { if (!state.form.hf_id) { dispatch({ type: "set_error", - errors: { hf_id: ["Health Facility Id is required"] }, + errors: { hf_id: t("health_facility__validation__hf_id_required") }, }); setIsLoading(false); return; @@ -76,7 +99,7 @@ export const ConfigureHealthFacility = (props: any) => { let responseData = null; if (state.form.hf_id === state.form.health_facility?.hf_id) { const { res, data } = await request( - routes.abha.registerHealthFacilityAsService, + routes.abdm.healthFacility.registerAsService, { pathParams: { facility_id: facilityId, @@ -87,7 +110,7 @@ export const ConfigureHealthFacility = (props: any) => { responseData = data; } else if (state.form.health_facility) { const { res, data } = await request( - routes.abha.partialUpdateHealthFacility, + routes.abdm.healthFacility.partialUpdate, { pathParams: { facility_id: facilityId, @@ -100,11 +123,12 @@ export const ConfigureHealthFacility = (props: any) => { response = res; responseData = data; } else { - const { res, data } = await request(routes.abha.createHealthFacility, { + const { res, data } = await request(routes.abdm.healthFacility.create, { body: { facility: facilityId, hf_id: state.form.hf_id, }, + silent: true, }); response = res; responseData = data; @@ -112,18 +136,21 @@ export const ConfigureHealthFacility = (props: any) => { if (response?.ok && responseData?.registered) { Notification.Success({ - msg: "Health Facility config updated successfully", + msg: t("health_facility__config_update_success"), }); navigate(`/facility/${facilityId}`); } else { if (responseData?.registered === false) { Notification.Warn({ - msg: responseData?.detail || "Health ID registration failed", + msg: + responseData?.detail || + t("health_facility__config_registration_error"), }); navigate(`/facility/${facilityId}`); } else { Notification.Error({ - msg: responseData?.detail || "Health Facility config update failed", + msg: + responseData?.detail || t("health_facility__config_update_error"), }); } } @@ -148,7 +175,7 @@ export const ConfigureHealthFacility = (props: any) => {
    { <>
    - The ABDM health facility is successfully linked with - care{" "} - and registered as a service in bridge + {t("health_facility__registered_1.1")}{" "} + + {t("health_facility__registered_1.2")} + - No Action Required. + {t("health_facility__registered_2")}
    - Registered + {t("health_facility__registered_3")} ) : ( <>
    - The ABDM health facility is successfully linked with - care{" "} + {t("health_facility__not_registered_1.1")}{" "} - but not registered as a service in bridge + {t("health_facility__not_registered_1.2")} - Click on Link Health Facility to - register the service + {t("health_facility__not_registered_2")} + {t("health_facility__not_registered_3")}
    - Not Registered )}

    @@ -206,7 +232,7 @@ export const ConfigureHealthFacility = (props: any) => { state.form.hf_id === state.form.health_facility?.hf_id && state.form.health_facility?.registered } - label="Link Health Facility" + label={t("health_facility__link")} />
    diff --git a/src/Components/ABDM/FetchRecordsModal.tsx b/src/Components/ABDM/FetchRecordsModal.tsx index 721927c47a6..3da4af9199b 100644 --- a/src/Components/ABDM/FetchRecordsModal.tsx +++ b/src/Components/ABDM/FetchRecordsModal.tsx @@ -16,15 +16,12 @@ import DateFormField from "../Form/FormFields/DateFormField.js"; import request from "../../Utils/request/request.js"; import routes from "../../Redux/api"; import { useMessageListener } from "../../Common/hooks/useMessageListener.js"; -import CircularProgress from "../Common/components/CircularProgress.js"; -import CareIcon from "../../CAREUI/icons/CareIcon.js"; -import { classNames } from "../../Utils/utils.js"; import { AbhaNumberModel } from "./types/abha.js"; import { ConsentHIType, ConsentPurpose } from "./types/consent.js"; -import useNotificationSubscriptionState from "../../Common/hooks/useNotificationSubscriptionState.js"; +import { useTranslation } from "react-i18next"; -const getDate = (value: any) => - value && dayjs(value).isValid() && dayjs(value).toDate(); +const getDate = (value: string | Date) => + (value && dayjs(value).isValid() && dayjs(value).toDate()) || undefined; interface IProps { abha?: AbhaNumberModel; @@ -33,9 +30,11 @@ interface IProps { } export default function FetchRecordsModal({ abha, show, onClose }: IProps) { + const { t } = useTranslation(); + const [idVerificationStatus, setIdVerificationStatus] = useState< "pending" | "in-progress" | "verified" | "failed" - >("pending"); + >("verified"); const [purpose, setPurpose] = useState("CAREMGT"); const [fromDate, setFromDate] = useState( dayjs().subtract(30, "day").toDate(), @@ -46,10 +45,10 @@ export default function FetchRecordsModal({ abha, show, onClose }: IProps) { const [expiryDate, setExpiryDate] = useState( dayjs().add(30, "day").toDate(), ); - const [errors, setErrors] = useState({}); - const notificationSubscriptionState = useNotificationSubscriptionState([ - show, - ]); + const [errors, setErrors] = useState>({}); + // const notificationSubscriptionState = useNotificationSubscriptionState([ + // show, + // ]); useMessageListener((data) => { if (data.type === "MESSAGE" && data.from === "patients/on_find") { @@ -67,11 +66,11 @@ export default function FetchRecordsModal({ abha, show, onClose }: IProps) { - {["unsubscribed", "subscribed_on_other_device"].includes( + {/* {["unsubscribed", "subscribed_on_other_device"].includes( notificationSubscriptionState, ) && (

    @@ -79,20 +78,20 @@ export default function FetchRecordsModal({ abha, show, onClose }: IProps) { Notifications needs to be enabled on this device to verify the patient.

    - )} + )} */}
    null} disabled - label="Patient Identifier" + label={t("consent_request__patient_identifier")} name="health_id" error={errors.health_id} className="flex-1" /> - { const { res } = await request(routes.abha.findPatient, { body: { @@ -131,17 +130,17 @@ export default function FetchRecordsModal({ abha, show, onClose }: IProps) { failed: "Retry", }[idVerificationStatus] } - + */}
    o.label} - optionValue={(o) => o.value} + optionLabel={(o) => t(`consent__purpose__${o}`)} + optionValue={(o) => o} value={purpose} onChange={({ value }) => setPurpose(value)} required @@ -158,30 +157,30 @@ export default function FetchRecordsModal({ abha, show, onClose }: IProps) { setFromDate(e.value.start!); setToDate(e.value.end!); }} - label="Health Records range" + label={t("consent_request__date_range")} required /> { - setHiTypes(ABDM_HI_TYPE.map((type) => type.value)); + setHiTypes(ABDM_HI_TYPE); }} > - Select All + {t("select_all")} ) } value={hiTypes} - optionLabel={(option) => option.label} - optionValue={(option) => option.value} + optionLabel={(option) => t(`consent__hi_type__${option}`)} + optionValue={(option) => option} onChange={(e) => setHiTypes(e.value)} required /> @@ -191,7 +190,7 @@ export default function FetchRecordsModal({ abha, show, onClose }: IProps) { id="expiry_date" value={getDate(expiryDate)} onChange={(e) => setExpiryDate(e.value!)} - label="Consent Expiry Date" + label={t("consent_request__expiry")} required disablePast position="TOP-RIGHT" @@ -203,14 +202,14 @@ export default function FetchRecordsModal({ abha, show, onClose }: IProps) { if (idVerificationStatus !== "verified") { setErrors({ ...errors, - health_id: "Please verify the patient identifier", + health_id: t("verify_patient_identifier"), }); return; } setIsMakingConsentRequest(true); - const { res } = await request(routes.abha.createConsent, { + const { res } = await request(routes.abdm.consent.create, { body: { patient_abha: abha?.health_id as string, hi_types: hiTypes, @@ -223,17 +222,13 @@ export default function FetchRecordsModal({ abha, show, onClose }: IProps) { if (res?.status === 201) { Notification.Success({ - msg: "Consent requested successfully!", + msg: t("consent_requested_successfully"), }); navigate( `/facility/${abha?.patient_object?.facility}/abdm`, // ?? `/facility/${abha?.patient_object?.facility}/patient/${abha?.patient_object?.id}/consultation/${abha?.patient_object?.last_consultation?.id}/abdm`, ); - } else { - Notification.Error({ - msg: "Error while requesting consent!", - }); } setIsMakingConsentRequest(false); onClose(); @@ -241,7 +236,7 @@ export default function FetchRecordsModal({ abha, show, onClose }: IProps) { disabled={idVerificationStatus !== "verified"} loading={isMakingConsentRequest} > - Request Consent + {t("request_consent")}
    diff --git a/src/Components/ABDM/HealthInformation.tsx b/src/Components/ABDM/HealthInformation.tsx index 1531f47c853..dd5a279bc1c 100644 --- a/src/Components/ABDM/HealthInformation.tsx +++ b/src/Components/ABDM/HealthInformation.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import routes from "../../Redux/api"; import useQuery from "../../Utils/request/useQuery"; import Loading from "../Common/Loading"; @@ -9,7 +10,9 @@ interface IProps { } export default function HealthInformation({ artefactId }: IProps) { - const { data, loading, error } = useQuery(routes.abha.getHealthInformation, { + const { t } = useTranslation(); + + const { data, loading, error } = useQuery(routes.abdm.healthInformation.get, { pathParams: { artefactId }, silent: true, }); @@ -18,7 +21,7 @@ export default function HealthInformation({ artefactId }: IProps) { return ; } - const parseData = (data: any) => { + const parseData = (data: string) => { try { return JSON.parse(data); } catch (e) { @@ -29,20 +32,19 @@ export default function HealthInformation({ artefactId }: IProps) { }; return ( - +
    {!!error?.is_archived && ( <>

    - This record has been archived + {t("hi__record_archived__title")}

    - This record has been archived and is no longer available for - viewing. + {t("hi__record_archived_description")}

    - This record was archived on{" "} - {new Date(error?.archived_time as string).toLocaleString()} as{" "} + {t("hi__record_archived_on")}{" "} + {new Date(error?.archived_time as string).toLocaleString()} -{" "} {error?.archived_reason as string}

    @@ -50,13 +52,13 @@ export default function HealthInformation({ artefactId }: IProps) { {error && !error?.is_archived && ( <>

    - This record hasn't been fetched yet + {t("hi__record_not_fetched_title")}

    - This record hasn't been fetched yet. Please try again later. + {t("hi__record_not_fetched_description")}

    - Waiting for the HIP to send the record. + {t("hi__waiting_for_record")}

    )} diff --git a/src/Components/ABDM/LinkABHANumberModal.tsx b/src/Components/ABDM/LinkABHANumberModal.tsx deleted file mode 100644 index c2855ae7569..00000000000 --- a/src/Components/ABDM/LinkABHANumberModal.tsx +++ /dev/null @@ -1,875 +0,0 @@ -import * as Notify from "../../Utils/Notifications"; - -import Dropdown, { DropdownItem } from "../Common/components/Menu"; -import { useEffect, useState } from "react"; - -import ButtonV2 from "../Common/components/ButtonV2"; -import CareIcon from "../../CAREUI/icons/CareIcon"; -import CircularProgress from "../Common/components/CircularProgress"; -import DialogModal from "../Common/Dialog"; -import OtpFormField from "../Form/FormFields/OtpFormField"; -import QRScanner from "../Common/QRScanner"; -import TextFormField from "../Form/FormFields/TextFormField"; -import { classNames } from "../../Utils/utils"; -import request from "../../Utils/request/request"; -import routes from "../../Redux/api"; -import { ABDMError, ABHAQRContent } from "./models"; - -export const validateRule = ( - condition: boolean, - content: JSX.Element | string, -) => { - return ( -
    - {condition ? ( - - ) : ( - - )}{" "} - - {content} - -
    - ); -}; -interface Props { - patientId?: string; - patientMobile?: string | undefined; - onSuccess?: (abha: any) => void; - show: boolean; - onClose: () => void; -} - -type Step = - | "ScanExistingQR" - | "AadhaarVerification" - | "MobileVerification" - | "HealthIDCreation"; - -export default function LinkABHANumberModal({ - patientId, - patientMobile, - onSuccess, - ...props -}: Props) { - const [currentStep, setCurrentStep] = useState("AadhaarVerification"); - const [transactionId, setTransactionId] = useState(""); - - const title = ( -
    - -

    - {currentStep === "ScanExistingQR" - ? "Link Existing ABHA Number" - : "Generate ABHA number"} -

    -
    - ); - - return ( - -
    - {currentStep === "ScanExistingQR" && ( - - )} - - {currentStep === "AadhaarVerification" && ( - { - setTransactionId(transactionId); - setCurrentStep("MobileVerification"); - }} - /> - )} - - {currentStep === "MobileVerification" && transactionId && ( - { - setTransactionId(transactionId); - setCurrentStep("HealthIDCreation"); - }} - patientMobile={patientMobile} - /> - )} - - {currentStep === "HealthIDCreation" && transactionId && ( - { - props.onClose(); - onSuccess?.(abha); - }} - patientId={patientId} - /> - )} -
    - -
    - {["AadhaarVerification", "MobileVerification", "HealthIDCreation"].find( - (step) => step === currentStep, - ) ? ( -

    setCurrentStep("ScanExistingQR")} - className="cursor-pointer text-center text-sm text-blue-800" - > - Already have an ABHA number -

    - ) : ( -

    setCurrentStep("AadhaarVerification")} - className="cursor-pointer text-center text-sm text-blue-800" - > - Don't have an ABHA Number -

    - )} -
    -
    - ); -} - -interface ScanABHAQRSectionProps { - patientId?: string; - onSuccess?: (abha: any) => void; - closeModal: () => void; -} - -const ScanABHAQRSection = ({ - patientId, - onSuccess, - closeModal, -}: ScanABHAQRSectionProps) => { - const [qrValue, setQrValue] = useState(""); - const [authMethods, setAuthMethods] = useState([]); - const [selectedAuthMethod, setSelectedAuthMethod] = useState(""); - const [txnId, setTxnId] = useState(""); - const [otp, setOtp] = useState(""); - const [acceptedDisclaimer, setAcceptedDisclaimer] = useState(false); - const [isLoading, setIsLoading] = useState(false); - - const supportedAuthMethods = ["MOBILE_OTP", "AADHAAR_OTP"]; - - if (isLoading) { - return ( -
    - - Loading - - -
    - ); - } - - return ( -
    - { - if (value[0] && !isNaN(Number(value[0]))) { - // 92-1234-1234-1234 - if ([2, 7, 12].includes(value.length)) { - if (qrValue.length && qrValue[qrValue.length - 1] === "-") { - value.slice(value.length - 1); - } else { - value += "-"; - } - } - } - setQrValue(value); - }} - parse={async (value: string | null) => { - if (!value) return; - setIsLoading(true); - - try { - const abha = JSON.parse(value) as ABHAQRContent; - - const { res, data } = await request(routes.abha.linkViaQR, { - body: { - patientId, - hidn: abha?.hidn, - phr: (abha?.phr ?? abha?.hid) as string, - name: abha?.name, - gender: abha?.gender, - dob: abha?.dob.replace(/\//g, "-"), - address: abha?.address, - "dist name": abha?.["dist name"] ?? abha?.district_name, - "state name": abha?.["state name"] ?? abha?.state_name, - }, - }); - - if (res?.status === 200 || res?.status === 202) { - Notify.Success({ msg: "Request sent successfully" }); - onSuccess?.({ - ...data, - abha_profile: { - ...data?.abha_profile, - healthIdNumber: data?.abha_profile?.abha_number, - healthId: data?.abha_profile?.health_id, - mobile: abha?.mobile, - monthOfBirth: - data?.abha_profile?.date_of_birth?.split("-")[1], - dayOfBirth: data?.abha_profile?.date_of_birth?.split("-")[2], - yearOfBirth: data?.abha_profile?.date_of_birth?.split("-")[0], - }, - }); - } else { - Notify.Error({ msg: "Linking Failed" }); - } - } catch (e) { - Notify.Error({ msg: "Invalid ABHA QR" }); - } finally { - setIsLoading(false); - closeModal(); - } - }} - /> - {!txnId && ( -
    - - { - setAcceptedDisclaimer(e.target.checked); - }} - className="mr-2 rounded border-secondary-700 shadow-sm ring-0 ring-offset-0" - /> - I declare that the ABHA No. of the patient is voluntarily provided - by the patient (or guardian or nominee of the patient). - -
    - )} - {txnId && ( - setOtp(value as string)} - value={otp} - label="Enter 6 digit OTP!" - error="" - /> - )} -
    - <> - {txnId ? ( - { - let response = null; - let Rdata = null; - let Rerror = null; - - switch (selectedAuthMethod) { - case "MOBILE_OTP": - { - const { res, data, error } = await request( - routes.abha.confirmWithMobileOtp, - { - body: { - otp: otp, - txnId: txnId, - patientId: patientId, - }, - }, - ); - response = res; - Rdata = data; - Rerror = error; - } - break; - - case "AADHAAR_OTP": - { - const { res, data, error } = await request( - routes.abha.confirmWithAadhaarOtp, - { - body: { - otp: otp, - txnId: txnId, - patientId: patientId, - }, - }, - ); - response = res; - Rdata = data; - Rerror = error; - } - break; - } - - if (response?.status === 200) { - onSuccess?.(Rdata); - Notify.Success({ - msg: "ABHA Number linked successfully", - }); - } else { - Notify.Error({ - msg: Rerror ?? "Something went wrong!", - }); - } - }} - > - Link - - ) : authMethods.length ? ( - - {authMethods.map((method) => ( - { - const { res, data } = await request( - routes.abha.initiateAbdmAuthentication, - { body: { authMethod: method, healthid: qrValue } }, - ); - - if (res?.status === 200 && data?.txnId) { - setSelectedAuthMethod(method); - setTxnId(data.txnId); - } - }} - > - {method.replace(/_/g, " ")} - - ))} - - ) : ( - { - const { res, data } = await request( - routes.abha.searchByHealthId, - { - body: { - healthId: qrValue, - }, - }, - ); - - if (res?.status === 200 && data?.authMethods) { - setAuthMethods( - data.authMethods?.filter?.((method: string) => - supportedAuthMethods.find( - (supported) => supported === method, - ), - ), - ); - } - }} - > - Verify - - )} - -
    -
    - ); -}; - -interface VerifyAadhaarSectionProps { - onVerified: (transactionId: string) => void; -} - -const VerifyAadhaarSection = ({ onVerified }: VerifyAadhaarSectionProps) => { - const [aadhaarNumber, setAadhaarNumber] = useState(""); - const [aadhaarNumberError, setAadhaarNumberError] = useState(); - - const [otp, setOtp] = useState(""); - const [otpError, setOtpError] = useState(); - - const [txnId, setTxnId] = useState(); - const [isSendingOtp, setIsSendingOtp] = useState(false); - const [isVerifyingOtp, setIsVerifyingOtp] = useState(false); - const [verified, setIsVerified] = useState(false); - const [acceptedDisclaimer1, setAcceptedDisclaimer1] = useState(false); - const [acceptedDisclaimer2, setAcceptedDisclaimer2] = useState(false); - - useEffect(() => { - if (verified && txnId) { - setTimeout(() => onVerified(txnId), 1000); - } - }, [verified]); - - const otpSent = !!txnId; - - const validateAadhaar = () => { - if (aadhaarNumber.length !== 12 && aadhaarNumber.length !== 16) { - setAadhaarNumberError( - "Should be a 12-digit aadhaar number or 16-digit virtual ID", - ); - return false; - } - - if (aadhaarNumber.includes(" ")) { - setAadhaarNumberError("Should not contain spaces"); - return false; - } - - return true; - }; - - const sendOtp = async () => { - if (!validateAadhaar()) return; - - setIsSendingOtp(true); - - const { res, data } = await request(routes.abha.generateAadhaarOtp, { - body: { - aadhaar: aadhaarNumber, - }, - }); - setIsSendingOtp(false); - - if (res?.status === 200 && data) { - const { txnId } = data; - setTxnId(txnId); - Notify.Success({ - msg: "OTP has been sent to the mobile number registered with the Aadhar number.", - }); - } else { - Notify.Error({ msg: JSON.stringify(data) }); - } - }; - - const resendOtp = async () => { - if (!validateAadhaar() || !txnId) return; - - setIsSendingOtp(true); - const { res, data } = await request(routes.abha.resendAadhaarOtp, { - body: { - txnId: txnId, - }, - silent: true, - }); - setIsSendingOtp(false); - - if (res?.status === 200 && data?.txnId) { - setTxnId(data.txnId); - Notify.Success({ - msg: "OTP has been resent to the mobile number registered with the Aadhar number.", - }); - } else { - Notify.Error({ - msg: - (data as unknown as ABDMError).details - ?.map((detail) => detail.message) - .join(", ") - .trim() || - (data as unknown as ABDMError).message || - "OTP resend failed", - }); - } - }; - - const validateOtp = () => { - if (otp.length !== 6) { - setOtpError("Must be a 6-digit code"); - return false; - } - - if (otp.includes(" ")) { - setOtpError("Should not contain spaces"); - return false; - } - return true; - }; - - const verifyOtp = async () => { - if (!validateOtp() || !txnId) return; - - setIsVerifyingOtp(true); - const { res, data } = await request(routes.abha.verifyAadhaarOtp, { - body: { - otp: otp, - txnId: txnId, - }, - }); - setIsVerifyingOtp(false); - - if (res?.status === 200 && data?.txnId) { - setTxnId(data.txnId); - Notify.Success({ msg: "OTP verified" }); - setIsVerified(true); - } else { - Notify.Error({ msg: "OTP verification failed" }); - } - }; - - return ( -
    -
    - setAadhaarNumber(value)} - error={aadhaarNumberError} - /> - - Aadhaar number will not be stored by CARE - -
    - - {!otpSent && ( -
    - - { - setAcceptedDisclaimer1(e.target.checked); - }} - className="mr-2 rounded border-secondary-700 shadow-sm ring-0 ring-offset-0" - /> - I declare that consent of the patient (or guardian or nominee of the - patient) is obtained for generation of such ABHA Number as per the{" "} - - Privacy Policy - - . - - - - { - setAcceptedDisclaimer2(e.target.checked); - }} - className="mr-2 rounded border-secondary-700 shadow-sm ring-0 ring-offset-0" - /> - I declare that the Aadhaar Number and demographic details of the - patient are shared voluntarily by the patient (or guardian or - nominee of the patient) through CARE with NHA for the sole purpose - of creation of ABHA Number. The patient understands that such data - of the patient will be collected, stored and utilized as per{" "} - - ABDM Health Data Management Policy - - . The patient authorizes NHA to use the Aadhaar number for - performing Aadhaar based authentication with UIDAI as per the - provisions of Aadhaar Act 2016 for the aforesaid purpose. - -
    - )} - - {otpSent && ( - setOtp(value as string)} - value={otp} - label="Enter 6-digit OTP sent to the registered mobile" - disabled={isVerifyingOtp} - error={otpError} - /> - )} - -
    - <> - - {(isSendingOtp && "Sending OTP...") || - (otpSent ? "Resend OTP" : "Send OTP")} - - - {otpSent && ( - - {(verified && "Verified") || - (isVerifyingOtp ? "Verifying..." : "Verify")} - - )} - -
    -
    - ); -}; - -interface VerifyMobileSectionProps { - transactionId: string; - onVerified: (transactionId: string) => void; - patientMobile?: string | undefined; -} - -const VerifyMobileSection = ({ - transactionId, - onVerified, - patientMobile, -}: VerifyMobileSectionProps) => { - const [mobile, setMobile] = useState(() => patientMobile || ""); - const [mobileError, setMobileError] = useState(); - - const [otp, setOtp] = useState(""); - const [otpError, setOtpError] = useState(); - - const [txnId, setTxnId] = useState(() => transactionId); - const [otpDispatched, setOtpDispatched] = useState(false); - const [isSendingOtp, setIsSendingOtp] = useState(false); - const [isVerifyingOtp, setIsVerifyingOtp] = useState(false); - const [verified, setIsVerified] = useState(false); - - useEffect(() => { - if (verified && txnId) { - setTimeout(() => onVerified(txnId), 1000); - } - }, [verified]); - - const validateMobile = () => { - if (mobile.length !== 10) { - setMobileError("Should contain 10-digits"); - return false; - } - - if (mobile.includes(" ")) { - setMobileError("Should not contain spaces"); - return false; - } - - return true; - }; - - const sendOtp = async () => { - if (!validateMobile()) return; - - setOtpDispatched(false); - setIsSendingOtp(true); - const { res, data } = await request(routes.abha.checkAndGenerateMobileOtp, { - body: { - mobile: mobile, - txnId: txnId, - }, - }); - setIsSendingOtp(false); - - if (res?.status === 200 && data) { - const { txnId, mobileLinked } = data; - setTxnId(txnId); - - if (mobileLinked) { - setIsVerified(true); - Notify.Success({ - msg: "Mobile number verified.", - }); - } else { - setOtpDispatched(true); - Notify.Success({ - msg: "OTP has been sent to the mobile number.", - }); - } - } else { - Notify.Error({ msg: JSON.stringify(data) }); - } - }; - - const validateOtp = () => { - if (otp.length !== 6) { - setOtpError("Must be a 6-digit code"); - return false; - } - - if (otp.includes(" ")) { - setOtpError("Should not contain spaces"); - return false; - } - return true; - }; - - const verifyOtp = async () => { - if (!validateOtp()) return; - - setIsVerifyingOtp(true); - const { res, data } = await request(routes.abha.verifyMobileOtp, { - body: { - txnId: txnId, - otp: otp, - }, - }); - setIsVerifyingOtp(false); - - if (res?.status === 200 && data?.txnId) { - setTxnId(data.txnId); - Notify.Success({ msg: "OTP verified" }); - setIsVerified(true); - } else { - Notify.Error({ msg: "OTP verification failed" }); - } - }; - - return ( -
    - setMobile(value)} - error={mobileError} - /> - - {otpDispatched ? ( - setOtp(value as string)} - error={otpError} - /> - ) : ( -

    - OTP is - generated if the above phone number is not linked with given Aadhaar - number. -

    - )} - -
    - - {(isSendingOtp && "Sending OTP...") || - (otpDispatched ? "Resend OTP" : "Send OTP")} - - - {otpDispatched && ( - - {(verified && "Verified") || - (isVerifyingOtp ? "Verifying..." : "Verify")} - - )} -
    -
    - ); -}; - -interface CreateHealthIDSectionProps { - transactionId: string; - onCreateSuccess: (abha: any) => void; - patientId?: string; -} - -const CreateHealthIDSection = ({ - transactionId, - onCreateSuccess, - patientId, -}: CreateHealthIDSectionProps) => { - const [healthId, setHealthId] = useState(""); - const [isCreating, setIsCreating] = useState(false); - const [isHealthIdInputInFocus, setIsHealthIdInputInFocus] = useState(false); - - const handleCreateHealthId = async () => { - setIsCreating(true); - const { res, data } = await request(routes.abha.createHealthId, { - body: { - healthId: healthId, - txnId: transactionId, - patientId: patientId, - }, - }); - if (res?.status === 200) { - Notify.Success({ msg: "Abha Address created" }); - onCreateSuccess(data); - } else { - Notify.Error({ msg: JSON.stringify(data) }); - } - setIsCreating(false); - }; - - return ( -
    - { - setHealthId(value); - }} - onFocus={() => setIsHealthIdInputInFocus(true)} - onBlur={() => setIsHealthIdInputInFocus(false)} - /> - -

    - Existing - ABHA Address is used if ABHA Number already exists. -

    - - {isHealthIdInputInFocus && ( -
    - {validateRule( - healthId.length >= 4, - "Should be atleast 4 character long", - )} - {validateRule( - isNaN(Number(healthId[0])) && healthId[0] !== ".", - "Shouldn't start with a number or dot (.)", - )} - {validateRule( - healthId[healthId.length - 1] !== ".", - "Shouldn't end with a dot (.)", - )} - {validateRule( - /^[0-9a-zA-Z.]+$/.test(healthId), - "Should only contain letters, numbers and dot (.)", - )} -
    - )} - -
    - - {isCreating ? "Creating Abha Address..." : "Create Abha Address"} - -
    -
    - ); -}; diff --git a/src/Components/ABDM/LinkAbhaNumber/CreateWithAadhaar.tsx b/src/Components/ABDM/LinkAbhaNumber/CreateWithAadhaar.tsx new file mode 100644 index 00000000000..e2fff0e51e6 --- /dev/null +++ b/src/Components/ABDM/LinkAbhaNumber/CreateWithAadhaar.tsx @@ -0,0 +1,732 @@ +import { useTranslation } from "react-i18next"; +import useMultiStepForm, { InjectedStepProps } from "./useMultiStepForm"; +import { classNames } from "../../../Utils/utils"; +import TextFormField from "../../Form/FormFields/TextFormField"; +import { useEffect, useState } from "react"; +import ButtonV2, { ButtonWithTimer } from "../../Common/components/ButtonV2"; +import OtpFormField from "../../Form/FormFields/OtpFormField"; +import PhoneNumberFormField from "../../Form/FormFields/PhoneNumberFormField"; +import { AbhaNumberModel } from "../types/abha"; +import { validateRule } from "../../Users/UserAdd"; +import request from "../../../Utils/request/request"; +import routes from "../../../Redux/api"; +import * as Notify from "../../../Utils/Notifications"; +import CheckBoxFormField from "../../Form/FormFields/CheckBoxFormField"; + +const MAX_OTP_RESEND_ALLOWED = 2; + +type ICreateWithAadhaarProps = { + onSuccess: (abhaNumber: AbhaNumberModel) => void; +}; + +type Memory = { + aadhaarNumber: string; + mobileNumber: string; + + isLoading: boolean; + validationError: string; + + transactionId: string; + abhaNumber: AbhaNumberModel | null; + + resendOtpCount: number; +}; + +export default function CreateWithAadhaar({ + onSuccess, +}: ICreateWithAadhaarProps) { + const { currentStep } = useMultiStepForm( + [ + , + , + , + , + , + , + ], + { + aadhaarNumber: "", + mobileNumber: "+91", + isLoading: false, + validationError: "", + transactionId: "", + abhaNumber: null, + resendOtpCount: 0, + }, + ); + + return
    {currentStep}
    ; +} + +type IEnterAadhaarProps = InjectedStepProps; + +function EnterAadhaar({ memory, setMemory, next }: IEnterAadhaarProps) { + const { t } = useTranslation(); + const [disclaimerAccepted, setDisclaimerAccepted] = useState([ + false, + false, + false, + false, + ]); + + const validateAadhaar = () => { + if ( + memory?.aadhaarNumber.length !== 12 && + memory?.aadhaarNumber.length !== 16 + ) { + setMemory((prev) => ({ + ...prev, + validationError: t("aadhaar_validation_length_error"), + })); + return false; + } + + if (memory?.aadhaarNumber.includes(" ")) { + setMemory((prev) => ({ + ...prev, + validationError: t("aadhaar_validation_space_error"), + })); + return false; + } + + return true; + }; + + const handleSubmit = async () => { + if (!validateAadhaar()) return; + + setMemory((prev) => ({ ...prev, isLoading: true })); + + const { res, data } = await request( + routes.abdm.healthId.abhaCreateSendAadhaarOtp, + { + body: { + aadhaar: memory!.aadhaarNumber, + }, + }, + ); + + if (res?.status === 200 && data) { + setMemory((prev) => ({ ...prev, transactionId: data.transaction_id })); + Notify.Success({ + msg: data.detail ?? t("aadhaar_otp_send_success"), + }); + next(); + } + + setMemory((prev) => ({ ...prev, isLoading: false })); + }; + + return ( +
    +
    + + setMemory((prev) => ({ ...prev, aadhaarNumber: value })) + } + error={memory?.validationError} + /> + + {t("aadhaar_number_will_not_be_stored")} + +
    + +
    + {disclaimerAccepted.map((isAccepted, i) => ( + { + setDisclaimerAccepted( + disclaimerAccepted.map((v, j) => (j === i ? e.value : v)), + ); + }} + className="mr-2 rounded border-gray-700" + labelClassName="text-xs text-gray-800" + errorClassName="hidden" + /> + ))} +
    + +
    + !v) || + memory?.aadhaarNumber.length === 0 + } + onClick={handleSubmit} + > + {t("send_otp")} + +
    +
    + ); +} + +type IVerifyAadhaarProps = InjectedStepProps; + +function VerifyAadhaar({ memory, setMemory, next }: IVerifyAadhaarProps) { + const { t } = useTranslation(); + const [otp, setOtp] = useState(""); + + const validateMobileNumber = () => { + const phone = memory?.mobileNumber.replace("+91", "").replace(/ /g, ""); + if (phone?.length !== 10) { + setMemory((prev) => ({ + ...prev, + validationError: t("mobile_number_validation_error"), + })); + return false; + } + + return true; + }; + + const handleSubmit = async () => { + if (!validateMobileNumber()) return; + + setMemory((prev) => ({ ...prev, isLoading: true })); + + const { res, data } = await request( + routes.abdm.healthId.abhaCreateVerifyAadhaarOtp, + { + body: { + otp: otp, + transaction_id: memory?.transactionId, + mobile: memory?.mobileNumber.replace("+91", "").replace(/ /g, ""), + }, + }, + ); + + if (res?.status === 200 && data) { + setMemory((prev) => ({ + ...prev, + transactionId: data.transaction_id, + abhaNumber: data.abha_number, + resendOtpCount: 0, + })); + Notify.Success({ + msg: data.detail ?? t("otp_verification_success"), + }); + next(); + } + + setMemory((prev) => ({ ...prev, isLoading: false })); + }; + + const handleResendOtp = async () => { + setMemory((prev) => ({ ...prev, isLoading: true })); + + const { res, data } = await request( + routes.abdm.healthId.abhaCreateSendAadhaarOtp, + { + body: { + aadhaar: memory!.aadhaarNumber, + // transaction_id: memory?.transactionId, + }, + silent: true, + }, + ); + + if (res?.status === 200 && data) { + setMemory((prev) => ({ + ...prev, + transactionId: data.transaction_id, + resendOtpCount: prev.resendOtpCount + 1, + })); + Notify.Success({ + msg: data.detail ?? t("aadhaar_otp_send_success"), + }); + } else { + setMemory((prev) => ({ + ...prev, + resendOtpCount: Infinity, + })); + Notify.Success({ + msg: t("aadhaar_otp_send_error"), + }); + } + + setMemory((prev) => ({ ...prev, isLoading: false })); + }; + + return ( +
    +
    + + setMemory((prev) => ({ ...prev, aadhaarNumber: value })) + } + /> + + {t("aadhaar_number_will_not_be_stored")} + +
    + +
    + setOtp(value as string)} + value={otp} + label={t("enter_aadhaar_otp")} + disabled={memory?.isLoading} + /> +
    + +
    + } + name="mobile_number" + value={memory?.mobileNumber} + onChange={(e) => { + if (!memory?.mobileNumber.startsWith("+91")) { + setMemory((prev) => ({ + ...prev, + validationError: t("only_indian_mobile_numbers_supported"), + })); + return; + } + + setMemory((prev) => ({ ...prev, mobileNumber: e.value })); + }} + error={memory?.validationError} + errorClassName="text-xs text-red-500" + types={["mobile"]} + /> +
    + +
    + 6 || memory?.mobileNumber.length === 0} + onClick={handleSubmit} + > + {t("verify_otp")} + + + {(memory?.resendOtpCount ?? 0) < MAX_OTP_RESEND_ALLOWED && ( + + {t("resend_otp")} + + )} +
    +
    + ); +} + +type IHandleExistingAbhaNumberProps = InjectedStepProps & { + onSuccess: (abhaNumber: AbhaNumberModel) => void; +}; + +function HandleExistingAbhaNumber({ + memory, + onSuccess, + next, +}: IHandleExistingAbhaNumberProps) { + const { t } = useTranslation(); + + // skip this step for new abha number + useEffect(() => { + if (memory?.abhaNumber?.new) { + next(); + } + }, [memory?.abhaNumber, memory?.mobileNumber]); // eslint-disable-line + + return ( +
    +

    + {t("abha_number_exists")} +

    +

    + {t("abha_number_exists_description")} +

    +
    + + {t("create_new_abha_address")} + + onSuccess(memory?.abhaNumber as AbhaNumberModel)} + > + {t("use_existing_abha_address")} + +

    + {memory?.abhaNumber?.health_id} +

    +
    +
    + ); +} + +type ILinkMobileNumberProps = InjectedStepProps; + +function LinkMobileNumber({ + memory, + goTo, + setMemory, + next, +}: ILinkMobileNumberProps) { + const { t } = useTranslation(); + + useEffect(() => { + if ( + memory?.abhaNumber?.mobile === + memory?.mobileNumber.replace("+91", "").replace(/ /g, "") + ) { + goTo(5); // skip linking mobile number + } + }, [memory?.abhaNumber, memory?.mobileNumber]); // eslint-disable-line + + const handleSubmit = async () => { + setMemory((prev) => ({ ...prev, isLoading: true })); + + const { res, data } = await request( + routes.abdm.healthId.abhaCreateLinkMobileNumber, + { + body: { + mobile: memory?.mobileNumber.replace("+91", "").replace(/ /g, ""), + transaction_id: memory?.transactionId, + }, + }, + ); + + if (res?.status === 200 && data) { + setMemory((prev) => ({ + ...prev, + transactionId: data.transaction_id, + })); + Notify.Success({ + msg: data.detail ?? t("mobile_otp_send_success"), + }); + next(); + } + + setMemory((prev) => ({ ...prev, isLoading: false })); + }; + + return ( +
    +
    + } + name="mobile_number" + value={memory?.mobileNumber} + disabled={true} + onChange={() => null} + types={["mobile"]} + /> +
    + +

    + {t("mobile_number_different_from_aadhaar_mobile_number")} +

    + +
    + + {t("send_otp")} + +
    +
    + ); +} + +type IVerifyMobileNumberProps = InjectedStepProps; + +function VerifyMobileNumber({ + memory, + setMemory, + next, +}: IVerifyMobileNumberProps) { + const { t } = useTranslation(); + const [otp, setOtp] = useState(""); + + const handleSubmit = async () => { + setMemory((prev) => ({ ...prev, isLoading: true })); + + const { res, data } = await request( + routes.abdm.healthId.abhaCreateVerifyMobileNumber, + { + body: { + transaction_id: memory?.transactionId, + otp: otp, + }, + }, + ); + + if (res?.status === 200 && data) { + setMemory((prev) => ({ + ...prev, + transactionId: data.transaction_id, + resendOtpCount: 0, + })); + Notify.Success({ + msg: data.detail ?? t("mobile_otp_verify_success"), + }); + next(); + } + + setMemory((prev) => ({ ...prev, isLoading: false })); + }; + + const handleResendOtp = async () => { + setMemory((prev) => ({ ...prev, isLoading: true })); + + const { res, data } = await request( + routes.abdm.healthId.abhaCreateLinkMobileNumber, + { + body: { + mobile: memory?.mobileNumber.replace("+91", "").replace(/ /g, ""), + transaction_id: memory?.transactionId, + }, + }, + ); + + if (res?.status === 200 && data) { + setMemory((prev) => ({ + ...prev, + transactionId: data.transaction_id, + resendOtpCount: prev.resendOtpCount + 1, + })); + Notify.Success({ + msg: data.detail ?? t("mobile_otp_send_success"), + }); + } else { + setMemory((prev) => ({ + ...prev, + resendOtpCount: Infinity, + })); + Notify.Success({ + msg: t("mobile_otp_send_error"), + }); + } + + setMemory((prev) => ({ ...prev, isLoading: false })); + }; + + return ( +
    +
    + } + name="mobile_number" + value={memory?.mobileNumber} + disabled={true} + onChange={() => null} + types={["mobile"]} + /> +
    + +
    + setOtp(value as string)} + value={otp} + label={t("enter_mobile_otp")} + disabled={memory?.isLoading} + /> +
    + +
    + + {t("verify_otp")} + + + {(memory?.resendOtpCount ?? 0) < MAX_OTP_RESEND_ALLOWED && ( + + {t("resend_otp")} + + )} +
    +
    + ); +} + +type IChooseAbhaAddressProps = InjectedStepProps & { + onSuccess: (abhaNumber: AbhaNumberModel) => void; +}; + +function ChooseAbhaAddress({ + memory, + setMemory, + onSuccess, +}: IChooseAbhaAddressProps) { + const { t } = useTranslation(); + const [healthId, setHealthId] = useState(""); + const [suggestions, setSuggestions] = useState([]); + + useEffect(() => { + const fetchSuggestions = async () => { + const { res, data } = await request( + routes.abdm.healthId.abhaCreateAbhaAddressSuggestion, + { + body: { + transaction_id: memory?.transactionId, + }, + }, + ); + + if (res?.status === 200 && data) { + setMemory((prev) => ({ ...prev, transactionId: data.transaction_id })); + setSuggestions(data.abha_addresses); + } + }; + + fetchSuggestions(); + }, [healthId, memory?.transactionId, setMemory]); + + const handleSubmit = async () => { + setMemory((prev) => ({ ...prev, isLoading: true })); + + const { res, data } = await request( + routes.abdm.healthId.abhaCreateEnrolAbhaAddress, + { + body: { + abha_address: healthId, + transaction_id: memory?.transactionId, + }, + }, + ); + + if (res?.status === 200 && data) { + setMemory((prev) => ({ + ...prev, + transactionId: data.transaction_id, + abhaNumber: data.abha_number, + })); + Notify.Success({ + msg: data.detail ?? t("abha_address_created_success"), + }); + onSuccess(data.abha_number); + } + + setMemory((prev) => ({ ...prev, isLoading: false })); + }; + + return ( +
    + { + setHealthId(value); + }} + /> + +
    + {validateRule( + healthId.length >= 4, + t("abha_address_validation_length_error"), + )} + {validateRule( + isNaN(Number(healthId[0])) && healthId[0] !== ".", + t("abha_address_validation_start_error"), + )} + {validateRule( + healthId[healthId.length - 1] !== ".", + t("abha_address_validation_end_error"), + )} + {validateRule( + /^[0-9a-zA-Z._]+$/.test(healthId), + t("abha_address_validation_character_error"), + )} +
    + + {suggestions.length > 0 && ( +
    +

    + {t("abha_address_suggestions")} +

    +
    + {suggestions + .filter((suggestion) => suggestion !== healthId) + .map((suggestion) => ( +

    setHealthId(suggestion)} + className="cursor-pointer rounded-md bg-primary-400 px-2.5 py-1 text-xs text-white" + > + {suggestion} +

    + ))} +
    +
    + )} + +
    + + {t("create_abha_address")} + +
    +
    + ); +} diff --git a/src/Components/ABDM/LinkAbhaNumber/LinkWithOtp.tsx b/src/Components/ABDM/LinkAbhaNumber/LinkWithOtp.tsx new file mode 100644 index 00000000000..5e71b1a19fc --- /dev/null +++ b/src/Components/ABDM/LinkAbhaNumber/LinkWithOtp.tsx @@ -0,0 +1,346 @@ +import { useTranslation } from "react-i18next"; +import { AbhaNumberModel } from "../types/abha"; +import useMultiStepForm, { InjectedStepProps } from "./useMultiStepForm"; +import { useMemo, useState } from "react"; +import TextFormField from "../../Form/FormFields/TextFormField"; +import { classNames } from "../../../Utils/utils"; +import ButtonV2, { ButtonWithTimer } from "../../Common/components/ButtonV2"; +import Dropdown, { DropdownItem } from "../../Common/components/Menu"; +import OtpFormField from "../../Form/FormFields/OtpFormField"; +import * as Notify from "../../../Utils/Notifications"; +import request from "../../../Utils/request/request"; +import routes from "../../../Redux/api"; +import CheckBoxFormField from "../../Form/FormFields/CheckBoxFormField"; + +const MAX_OTP_RESEND_ALLOWED = 2; + +type ILoginWithOtpProps = { + onSuccess: (abhaNumber: AbhaNumberModel) => void; +}; + +type Memory = { + id: string; + + isLoading: boolean; + validationError: string; + + transactionId: string; + type: "aadhaar" | "mobile" | "abha-number" | "abha-address"; + otp_system: "abdm" | "aadhaar"; + abhaNumber: AbhaNumberModel | null; + + resendOtpCount: number; +}; + +export default function LinkWithOtp({ onSuccess }: ILoginWithOtpProps) { + const { currentStep } = useMultiStepForm( + [ + , + , + ], + { + id: "", + isLoading: false, + validationError: "", + transactionId: "", + type: "aadhaar", + otp_system: "aadhaar", + abhaNumber: null, + resendOtpCount: 0, + }, + ); + + return
    {currentStep}
    ; +} + +type IEnterIdProps = InjectedStepProps; + +const supportedAuthMethods = ["AADHAAR_OTP", "MOBILE_OTP"]; + +function EnterId({ memory, setMemory, next }: IEnterIdProps) { + const { t } = useTranslation(); + const [disclaimerAccepted, setDisclaimerAccepted] = useState([ + false, + false, + false, + ]); + const [authMethods, setAuthMethods] = useState([]); + + const valueType = useMemo(() => { + const id = memory?.id; + const isNumeric = !isNaN(Number(id?.trim())); + + if (isNumeric && (id?.length === 12 || id?.length === 16)) { + return "aadhaar"; + } else if (isNumeric && id?.length === 10) { + return "mobile"; + } else if (isNumeric && id?.length === 14) { + return "abha-number"; + } else { + return "abha-address"; + } + }, [memory?.id]); + + const handleGetAuthMethods = async () => { + setMemory((prev) => ({ ...prev, isLoading: true })); + + if (valueType === "aadhaar") { + setAuthMethods(["AADHAAR_OTP"]); + } else if (valueType === "mobile") { + setAuthMethods(["MOBILE_OTP"]); + } else { + const { res, data, error } = await request( + routes.abdm.healthId.abhaLoginCheckAuthMethods, + { + body: { + abha_address: memory?.id.replace(/-/g, "").replace(/ /g, ""), + }, + silent: true, + }, + ); + + if (res?.status === 200 && data) { + const methods = data.auth_methods.filter((method: string) => + supportedAuthMethods.find((supported) => supported === method), + ); + + if (methods.length === 0) { + Notify.Warn({ msg: t("get_auth_mode_error") }); + } + } else { + Notify.Error({ msg: error?.message ?? t("get_auth_mode_error") }); + } + } + + setMemory((prev) => ({ ...prev, isLoading: false })); + }; + + const handleSendOtp = async (authMethod: string) => { + if (!supportedAuthMethods.includes(authMethod)) { + Notify.Warn({ msg: t("auth_method_unsupported") }); + return; + } + + const otp_system: "aadhaar" | "abdm" = + authMethod === "AADHAAR_OTP" ? "aadhaar" : "abdm"; + + setMemory((prev) => ({ + ...prev, + isLoading: true, + type: valueType, + otp_system, + })); + + const { res, data } = await request(routes.abdm.healthId.abhaLoginSendOtp, { + body: { + value: memory?.id, + type: valueType, + otp_system, + }, + }); + + if (res?.status === 200 && data) { + setMemory((prev) => ({ + ...prev, + transactionId: data.transaction_id, + })); + Notify.Success({ msg: data.detail ?? t("send_otp_success") }); + next(); + } + + setMemory((prev) => ({ ...prev, isLoading: false })); + }; + + return ( +
    +
    + { + setMemory((prev) => ({ ...prev, id: value })); + setAuthMethods([]); + }} + error={memory?.validationError} + /> + + {t("any_id_description")} + +
    + +
    + {disclaimerAccepted.map((isAccepted, i) => ( + { + setDisclaimerAccepted( + disclaimerAccepted.map((v, j) => (j === i ? e.value : v)), + ); + }} + className="mr-2 rounded border-gray-700" + labelClassName="text-xs text-gray-800" + errorClassName="hidden" + /> + ))} +
    + +
    + {authMethods.length === 0 ? ( + !v) || memory?.id.length === 0 + } + onClick={handleGetAuthMethods} + > + {t("get_auth_methods")} + + ) : ( + + {authMethods.map((method) => ( + handleSendOtp(method)}> + {t(`abha__auth_method__${method}`)} + + ))} + + )} +
    +
    + ); +} + +type IVerifyIdProps = InjectedStepProps & { + onSuccess: (abhaNumber: AbhaNumberModel) => void; +}; + +function VerifyId({ memory, setMemory, onSuccess }: IVerifyIdProps) { + const { t } = useTranslation(); + const [otp, setOtp] = useState(""); + + const handleSubmit = async () => { + setMemory((prev) => ({ ...prev, isLoading: true })); + + const { res, data } = await request( + routes.abdm.healthId.abhaLoginVerifyOtp, + { + body: { + type: memory?.type, + transaction_id: memory?.transactionId, + otp, + otp_system: memory?.otp_system, + }, + }, + ); + + if (res?.status === 200 && data) { + Notify.Success({ msg: t("verify_otp_success") }); + onSuccess(data.abha_number); + } + + setMemory((prev) => ({ ...prev, isLoading: false })); + }; + + const handleResendOtp = async () => { + setMemory((prev) => ({ ...prev, isLoading: true })); + + const { res, data } = await request(routes.abdm.healthId.abhaLoginSendOtp, { + body: { + value: memory?.id, + type: memory?.type, + otp_system: memory?.otp_system, + }, + }); + + if (res?.status === 200 && data) { + setMemory((prev) => ({ + ...prev, + transactionId: data.transaction_id, + resendOtpCount: (prev.resendOtpCount ?? 0) + 1, + })); + Notify.Success({ msg: data.detail ?? t("send_otp_success") }); + } else { + setMemory((prev) => ({ + ...prev, + resendOtpCount: Infinity, + })); + Notify.Error({ msg: t("send_otp_error") }); + } + + setMemory((prev) => ({ ...prev, isLoading: false })); + }; + + return ( +
    +
    + null} + /> + + {t("any_id_description")} + +
    + +
    + setOtp(value as string)} + value={otp} + label={t("enter_otp")} + disabled={memory?.isLoading} + /> +
    + +
    + + {t("verify_and_link")} + + + {(memory?.resendOtpCount ?? 0) < MAX_OTP_RESEND_ALLOWED && ( + + {t("resend_otp")} + + )} +
    +
    + ); +} diff --git a/src/Components/ABDM/LinkAbhaNumber/LinkWithQr.tsx b/src/Components/ABDM/LinkAbhaNumber/LinkWithQr.tsx new file mode 100644 index 00000000000..7f9f9c7d853 --- /dev/null +++ b/src/Components/ABDM/LinkAbhaNumber/LinkWithQr.tsx @@ -0,0 +1,68 @@ +import { useTranslation } from "react-i18next"; +import { AbhaNumberModel, ABHAQRContent } from "../types/abha"; +import * as Notification from "../../../Utils/Notifications.js"; + +import { Scanner, IDetectedBarcode } from "@yudiel/react-qr-scanner"; +import request from "../../../Utils/request/request"; +import routes from "../../../Redux/api"; +import { useState } from "react"; + +type ILoginWithQrProps = { + onSuccess: (abhaNumber: AbhaNumberModel) => void; +}; + +export default function LinkWithQr({ onSuccess }: ILoginWithQrProps) { + const { t } = useTranslation(); + const [isLoading, setIsLoading] = useState(false); + + return ( +
    + { + if (detectedCodes.length === 0) return; + + const scannedValue = detectedCodes[0].rawValue; + if (!scannedValue || isLoading) return; + + try { + const qrData = JSON.parse(scannedValue) as ABHAQRContent; + + setIsLoading(true); + const { res, data } = await request(routes.abdm.abhaNumber.create, { + body: { + abha_number: qrData.hidn, + health_id: qrData.hid || qrData.phr, + name: qrData.name, + gender: qrData.gender, + date_of_birth: qrData.dob, + address: qrData.address, + district: qrData.district_name || qrData["dist name"], + state: qrData.state_name || qrData["state name"], + mobile: qrData.mobile, + }, + }); + + if (res?.status === 201 && data) { + onSuccess(data); + } + setIsLoading(false); + } catch (e) { + Notification.Error({ + msg: t("abha__qr_scanning_error"), + }); + } + }} + onError={(e: unknown) => { + const errorMessage = e instanceof Error ? e.message : "Unknown error"; + Notification.Error({ + msg: errorMessage, + }); + }} + scanDelay={3000} + constraints={{ + facingMode: "environment", + }} + /> +
    + ); +} diff --git a/src/Components/ABDM/LinkAbhaNumber/index.tsx b/src/Components/ABDM/LinkAbhaNumber/index.tsx new file mode 100644 index 00000000000..f3ad9911197 --- /dev/null +++ b/src/Components/ABDM/LinkAbhaNumber/index.tsx @@ -0,0 +1,140 @@ +import { useState } from "react"; +import DialogModal from "../../Common/Dialog"; +import { AbhaNumberModel } from "../types/abha"; +import ButtonV2 from "../../Common/components/ButtonV2"; +import { classNames } from "../../../Utils/utils"; +import CreateWithAadhaar from "./CreateWithAadhaar"; +import { useTranslation } from "react-i18next"; +import LinkWithOtp from "./LinkWithOtp"; +import LinkWithQr from "./LinkWithQr"; + +interface ILinkAbhaNumberProps { + show: boolean; + onClose: () => void; + onSuccess: (abhaNumber: AbhaNumberModel) => void; +} + +const ABHA_LINK_OPTIONS = { + create_with_aadhaar: { + title: "abha_link_options__create_with_aadhaar__title", + description: "abha_link_options__create_with_aadhaar__description", + disabled: false, + value: "create_with_aadhaar", + create: true, + }, + link_with_otp: { + title: "abha_link_options__link_with_otp__title", + description: "abha_link_options__link_with_otp__description", + disabled: false, + value: "link_with_otp", + create: false, + }, + create_with_driving_license: { + title: "abha_link_options__create_with_driving_license__title", + description: "abha_link_options__create_with_driving_license__description", + disabled: true, + value: "create_with_driving_license", + create: true, + }, + link_with_demographics: { + title: "abha_link_options__link_with_demographics__title", + description: "abha_link_options__link_with_demographics__description", + disabled: true, + value: "link_with_demographics", + create: false, + }, + link_with_qr: { + title: "abha_link_options__link_with_qr__title", + description: "abha_link_options__link_with_qr__description", + disabled: false, + value: "link_with_qr", + create: false, + }, +}; + +export default function LinkAbhaNumber({ + show, + onClose, + onSuccess, +}: ILinkAbhaNumberProps) { + const { t } = useTranslation(); + const [currentAbhaLinkOption, setCurrentAbhaLinkOption] = useState< + keyof typeof ABHA_LINK_OPTIONS + >("create_with_aadhaar"); + + return ( + + {currentAbhaLinkOption === "create_with_aadhaar" && ( + + )} + + {currentAbhaLinkOption === "link_with_otp" && ( + + )} + + {currentAbhaLinkOption === "link_with_qr" && ( + + )} + +
    +

    + setCurrentAbhaLinkOption( + ABHA_LINK_OPTIONS[currentAbhaLinkOption].create + ? "link_with_otp" + : "create_with_aadhaar", + ) + } + className="cursor-pointer text-center text-sm text-blue-800" + > + {ABHA_LINK_OPTIONS[currentAbhaLinkOption].create + ? t("link_existing_abha_profile") + : t("create_new_abha_profile")} +

    +
    + +
    +

    + {t("try_different_abha_linking_option")} +

    +
    + {Object.values(ABHA_LINK_OPTIONS) + .filter( + (option) => + option.value !== currentAbhaLinkOption && + ABHA_LINK_OPTIONS[currentAbhaLinkOption]?.create === + option.create, + ) + .sort((a) => (a.disabled ? 1 : -1)) + .map((option) => ( + + setCurrentAbhaLinkOption( + option.value as keyof typeof ABHA_LINK_OPTIONS, + ) + } + ghost + tooltip={ + option.disabled + ? t("abha_link_options__disabled_tooltip") + : t(option.description) + } + disabled={option.disabled} + tooltipClassName="top-full mt-1" + className={classNames( + "w-full border border-gray-400 text-secondary-800", + !option.disabled && "hover:border-primary-100", + )} + > + {t(option.title)} + + ))} +
    +
    +
    + ); +} diff --git a/src/Components/ABDM/LinkAbhaNumber/useMultiStepForm.ts b/src/Components/ABDM/LinkAbhaNumber/useMultiStepForm.ts new file mode 100644 index 00000000000..8107fff8370 --- /dev/null +++ b/src/Components/ABDM/LinkAbhaNumber/useMultiStepForm.ts @@ -0,0 +1,70 @@ +import { + cloneElement, + Dispatch, + ReactElement, + SetStateAction, + useCallback, + useMemo, + useState, +} from "react"; + +export interface InjectedStepProps { + currentStepIndex: number; + isFirstStep: boolean; + isLastStep: boolean; + next: () => void; + prev: () => void; + goTo: (step: number) => void; + memory: T | null; + setMemory: Dispatch>; +} + +export default function useMultiStepForm( + steps: ReactElement[], + initialValues?: T, +) { + const [currentStepIndex, setCurrentStepIndex] = useState(0); + const [memory, setMemory] = useState(initialValues as T); + + const next = useCallback( + () => + setCurrentStepIndex((prev) => + steps.length - 1 > prev ? prev + 1 : prev, + ), + [steps.length], + ); + + const prev = useCallback( + () => setCurrentStepIndex((prev) => (prev > 0 ? prev - 1 : prev)), + [], + ); + + const goTo = useCallback( + (step: number) => + setCurrentStepIndex((prev) => + step >= 0 && step <= steps.length - 1 ? step : prev, + ), + [steps.length], + ); + + const options = useMemo( + () => ({ + currentStepIndex, + isFirstStep: currentStepIndex === 0, + isLastStep: currentStepIndex === steps.length - 1, + next, + prev, + goTo, + memory, + setMemory, + }), + [currentStepIndex, memory, next, prev, goTo, steps.length], + ); + + const currentStep = cloneElement(steps[currentStepIndex], { + ...options, + ...steps[currentStepIndex].props, + }); + + return { currentStep, ...options }; +} diff --git a/src/Components/ABDM/LinkCareContextModal.tsx b/src/Components/ABDM/LinkCareContextModal.tsx deleted file mode 100644 index 9ec9885bbca..00000000000 --- a/src/Components/ABDM/LinkCareContextModal.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import * as Notification from "../../Utils/Notifications.js"; - -import ButtonV2 from "../Common/components/ButtonV2"; -import DateFormField from "../Form/FormFields/DateFormField"; -import DialogModal from "../Common/Dialog"; -import TextFormField from "../Form/FormFields/TextFormField"; -import { useState } from "react"; -import routes from "../../Redux/api.js"; -import request from "../../Utils/request/request.js"; -import { AbhaNumberModel } from "./types/abha.js"; - -interface IProps { - consultationId: string; - abha?: AbhaNumberModel; - show: boolean; - onClose: () => void; -} - -const LinkCareContextModal = ({ - consultationId, - abha, - show, - onClose, -}: IProps) => { - const [acceptedDisclaimer, setAcceptedDisclaimer] = useState(false); - const [isLinkingCareContext, setIsLinkingCareContext] = useState(false); - - return ( - -
    - null} - disabled - label="Name" - name="name" - error="" - /> - null} - disabled - label="Gender" - name="gender" - error="" - /> -
    - null} - disabled - required - /> - -
    - - { - setAcceptedDisclaimer(e.target.checked); - }} - className="mr-2 rounded border-secondary-700 shadow-sm ring-0 ring-offset-0" - /> - I declare that the data of the patient is voluntarily provided by the - patient (or guardian or nominee of the patient). - -
    - -
    - { - setIsLinkingCareContext(true); - const { res } = await request(routes.abha.linkCareContext, { - body: { - consultation: consultationId, - name: abha?.name, - gender: abha?.gender, - dob: abha?.date_of_birth, - }, - reattempts: 0, - }); - if (res?.status === 202) { - Notification.Success({ - msg: "Care Context sucessfully linked!", - }); - } - setIsLinkingCareContext(false); - onClose(); - }} - disabled={!acceptedDisclaimer} - loading={isLinkingCareContext} - > - Link Care Context - -
    -
    - ); -}; - -export default LinkCareContextModal; diff --git a/src/Components/ABDM/models.ts b/src/Components/ABDM/models.ts deleted file mode 100644 index 899ec948777..00000000000 --- a/src/Components/ABDM/models.ts +++ /dev/null @@ -1,138 +0,0 @@ -export interface ICreateHealthIdRequest { - healthId?: string; - // email: string; - // firstName: string; - // middleName: string; - // lastName: string; - // password: string; - // profilePhoto: string; - txnId: string; - patientId?: string; -} - -export interface ICreateHealthIdResponse { - email?: string; - firstName: string; - lastName: string; - healthId?: string; - healthIdNumber: string; -} - -export interface IHealthFacility { - id: string; - registered: boolean; - external_id: string; - created_date: string; - modified_date: string; - hf_id: string; - facility: string; - detail?: string; -} - -export interface ILinkABHANumber { - abha_profile: { - abha_number: string; - health_id: string; - date_of_birth: string; - }; -} - -export interface IConfirmMobileOtp { - otp: string; - txnId: string; - patientId?: string; - message?: string; -} - -export interface IHealthId { - authMethods?: string[]; -} - -export interface ABDMError { - code: string; - details?: { - code: string; - message: string; - }[]; - message: string; -} - -export interface IAadhaarOtp { - txnId: string; -} - -export interface ICheckAndGenerateMobileOtp { - mobileLinked: boolean; - txnId: string; -} - -export interface IAadhaarOtpTBody { - aadhaar?: string; - txnId?: string; -} - -export interface IVerifyAadhaarOtpTBody { - consultation?: string; - name?: string; - gender?: "M" | "F" | "O"; - dob?: string; - otp?: string; - txnId?: string; -} - -export interface IGenerateMobileOtpTBody { - mobile: string; - txnId: string; -} - -export interface ISearchByHealthIdTBody { - healthId: string; -} - -export interface IinitiateAbdmAuthenticationTBody { - authMethod: string; - healthid: string; -} - -export interface IgetAbhaCardTBody { - patient: string; - type: "pdf" | "png"; -} - -export interface IcreateHealthFacilityTBody { - facility: string; - hf_id: string; -} - -export interface IpartialUpdateHealthFacilityTBody { - hf_id: string; -} - -export interface ILinkViaQRBody { - hidn: string; - phr: string; - name: string; - gender: "M" | "F" | "O"; - dob: string; - address?: string; - "dist name"?: string; - "state name"?: string; - patientId?: string; -} - -export interface ABHAQRContent { - address: string; - distlgd: string; - district_name?: string; - state_name?: string; - dob: string; - gender: "M" | "F" | "O"; - hid?: string; - phr?: string; - "dist name"?: string; - hidn: string; - mobile: string; - name: string; - "state name"?: string; - statelgd: string; -} diff --git a/src/Components/ABDM/types/abha.ts b/src/Components/ABDM/types/abha.ts index fd03b30cdc4..d94549e2242 100644 --- a/src/Components/ABDM/types/abha.ts +++ b/src/Components/ABDM/types/abha.ts @@ -17,9 +17,29 @@ export type AbhaNumberModel = { district: string | null; state: string | null; pincode: string | null; + mobile: string | null; email: string | null; profile_photo: string | null; new: boolean; patient: string | null; patient_object: PatientModel | null; }; + +export type ABHAQRContent = { + hidn: string; + name: string; + gender: "M" | "F" | "O"; + dob: string; + mobile: string; + address: string; + distlgd: string; + statelgd: string; +} & ({ hid: string; phr?: never } | { phr: string; hid?: never }) & + ( + | { district_name: string; "dist name"?: never } + | { "dist name": string; district_name?: never } + ) & + ( + | { state_name: string; "state name"?: never } + | { "state name": string; state_name?: never } + ); diff --git a/src/Components/ABDM/types/health-facility.ts b/src/Components/ABDM/types/health-facility.ts new file mode 100644 index 00000000000..419003dbf8e --- /dev/null +++ b/src/Components/ABDM/types/health-facility.ts @@ -0,0 +1,19 @@ +export interface IHealthFacility { + id: string; + registered: boolean; + external_id: string; + created_date: string; + modified_date: string; + hf_id: string; + facility: string; + detail?: string; +} + +export interface IcreateHealthFacilityTBody { + facility: string; + hf_id: string; +} + +export interface IpartialUpdateHealthFacilityTBody { + hf_id: string; +} diff --git a/src/Components/Common/components/ButtonV2.tsx b/src/Components/Common/components/ButtonV2.tsx index bc67e150fdc..b7eab5f29d7 100644 --- a/src/Components/Common/components/ButtonV2.tsx +++ b/src/Components/Common/components/ButtonV2.tsx @@ -4,6 +4,8 @@ import CareIcon from "../../../CAREUI/icons/CareIcon"; import { Link } from "raviger"; import { classNames } from "../../../Utils/utils"; import { useTranslation } from "react-i18next"; +import { useEffect, useState } from "react"; +import Spinner from "../Spinner"; export type ButtonSize = "small" | "default" | "large"; export type ButtonShape = "square" | "circle"; @@ -22,36 +24,40 @@ export type RawButtonProps = Omit< "style" >; +export type ButtonStyleProps = { + /** + * - `"small"` has small text and minimal padding. + * - `"default"` has small text with normal padding. + * - `"large"` has base text size with large padding. + */ + size?: ButtonSize; + /** + * - `"square"` gives a button with minimally rounded corners. + * - `"circle"` gives a button with fully rounded corners. Ideal when only + * icons are present. + */ + circle?: boolean | undefined; + /** + * - `"primary"` is ideal for form submissions, etc. + * - `"secondary"` is ideal for things that have secondary importance. + * - `"danger"` is ideal for destructive or dangerous actions, such as delete. + * - `"warning"` is ideal for actions that require caution such as archive. + * - `"alert"` is ideal for actions that require alert. + */ + variant?: ButtonVariant; + /** If set, gives an elevated button with hover effects. */ + shadow?: boolean | undefined; + /** If set, removes the background to give a simple text button. */ + ghost?: boolean | undefined; + /** + * If set, applies border to the button. + */ + border?: boolean | undefined; +}; + export type ButtonProps = RawButtonProps & - AuthorizedElementProps & { - /** - * - `"small"` has small text and minimal padding. - * - `"default"` has small text with normal padding. - * - `"large"` has base text size with large padding. - */ - size?: ButtonSize; - /** - * - `"square"` gives a button with minimally rounded corners. - * - `"circle"` gives a button with fully rounded corners. Ideal when only - * icons are present. - */ - circle?: boolean | undefined; - /** - * - `"primary"` is ideal for form submissions, etc. - * - `"secondary"` is ideal for things that have secondary importance. - * - `"danger"` is ideal for destructive or dangerous actions, such as delete. - * - `"warning"` is ideal for actions that require caution such as archive. - * - `"alert"` is ideal for actions that require alert. - */ - variant?: ButtonVariant; - /** If set, gives an elevated button with hover effects. */ - shadow?: boolean | undefined; - /** If set, removes the background to give a simple text button. */ - ghost?: boolean | undefined; - /** - * If set, applies border to the button. - */ - border?: boolean | undefined; + AuthorizedElementProps & + ButtonStyleProps & { /** * Whether the button is disabled or not. * This is overriden to `true` if `loading` is `true`. @@ -83,10 +89,28 @@ export type ButtonProps = RawButtonProps & tooltipClassName?: string; }; -const ButtonV2 = ({ - authorizeFor, +export const buttonStyles = ({ size = "default", + circle = false, variant = "primary", + ghost = false, + border = false, + shadow = !ghost, +}: ButtonStyleProps) => { + return classNames( + "inline-flex h-min cursor-pointer items-center justify-center gap-2 whitespace-pre font-medium outline-offset-1 transition-all duration-200 ease-in-out disabled:cursor-not-allowed disabled:bg-secondary-200 disabled:text-secondary-500", + `button-size-${size}`, + `button-shape-${circle ? "circle" : "square"}`, + ghost ? `button-${variant}-ghost` : `button-${variant}-default`, + border && `button-${variant}-border`, + shadow && "shadow enabled:hover:shadow-md", + ); +}; + +const ButtonV2 = ({ + authorizeFor, + size, + variant, circle, shadow, ghost, @@ -103,14 +127,9 @@ const ButtonV2 = ({ shadow ??= !ghost; const className = classNames( - props.className, - "inline-flex h-min cursor-pointer items-center justify-center gap-2 whitespace-pre font-medium outline-offset-1 transition-all duration-200 ease-in-out disabled:cursor-not-allowed disabled:bg-secondary-200 disabled:text-secondary-500", - `button-size-${size}`, - `button-shape-${circle ? "circle" : "square"}`, - ghost ? `button-${variant}-ghost` : `button-${variant}-default`, - border && `button-${variant}-border`, - shadow && "shadow enabled:hover:shadow-md", + buttonStyles({ size, circle, variant, ghost, border, shadow }), tooltip && "tooltip", + props.className, ); if (tooltip) { @@ -202,3 +221,53 @@ export const Cancel = ({ label = "Cancel", ...props }: CommonButtonProps) => { /> ); }; + +export type ButtonWithTimerProps = CommonButtonProps & { + initialInverval?: number; + interval?: number; +}; + +export const ButtonWithTimer = ({ + initialInverval, + interval = 60, + ...buttonProps +}: ButtonWithTimerProps) => { + const [seconds, setSeconds] = useState(initialInverval ?? interval); + const [isButtonDisabled, setIsButtonDisabled] = useState(true); + + useEffect(() => { + let interval = undefined; + if (seconds > 0) { + interval = setInterval(() => { + setSeconds((prevSeconds) => prevSeconds - 1); + }, 1000); + } else { + setIsButtonDisabled(false); + clearInterval(interval); + } + return () => clearInterval(interval); + }, [seconds]); + + return ( +
    + { + await buttonProps.onClick?.(e); + setSeconds(interval); + setIsButtonDisabled(true); + }} + > + {!!(seconds && isButtonDisabled) && ( +
    + + {seconds} +
    + )} + + {buttonProps.children ?? buttonProps.label} +
    +
    + ); +}; diff --git a/src/Components/Facility/ConsultationDetails/index.tsx b/src/Components/Facility/ConsultationDetails/index.tsx index 3b34689221d..639c6dd9e40 100644 --- a/src/Components/Facility/ConsultationDetails/index.tsx +++ b/src/Components/Facility/ConsultationDetails/index.tsx @@ -168,7 +168,7 @@ export const ConsultationDetails = (props: any) => { // Get abha number data const { data: abhaNumberData } = await request( - routes.abha.getAbhaNumber, + routes.abdm.abhaNumber.get, { pathParams: { abhaNumberId: id ?? "" }, silent: true, diff --git a/src/Components/Form/FormFields/TextFormField.tsx b/src/Components/Form/FormFields/TextFormField.tsx index 12d6623cd15..a3663358a56 100644 --- a/src/Components/Form/FormFields/TextFormField.tsx +++ b/src/Components/Form/FormFields/TextFormField.tsx @@ -1,32 +1,30 @@ import { FormFieldBaseProps, useFormFieldPropsResolver } from "./Utils"; -import { HTMLInputTypeAttribute, forwardRef, useState } from "react"; +import { + DetailedHTMLProps, + InputHTMLAttributes, + forwardRef, + useState, +} from "react"; import CareIcon from "../../../CAREUI/icons/CareIcon"; import FormField from "./FormField"; import { classNames } from "../../../Utils/utils"; -export type TextFormFieldProps = FormFieldBaseProps & { - placeholder?: string; - value?: string | number; - autoComplete?: string; - type?: HTMLInputTypeAttribute; - className?: string | undefined; - inputClassName?: string | undefined; - removeDefaultClasses?: true | undefined; - leading?: React.ReactNode | undefined; - trailing?: React.ReactNode | undefined; - leadingFocused?: React.ReactNode | undefined; - trailingFocused?: React.ReactNode | undefined; - trailingPadding?: string | undefined; - leadingPadding?: string | undefined; - min?: string | number; - max?: string | number; - step?: string | number; - onKeyDown?: (event: React.KeyboardEvent) => void; - onFocus?: (event: React.FocusEvent) => void; - onBlur?: (event: React.FocusEvent) => void; - suggestions?: string[]; -}; +export type TextFormFieldProps = FormFieldBaseProps & + Omit< + DetailedHTMLProps, HTMLInputElement>, + "onChange" + > & { + inputClassName?: string | undefined; + removeDefaultClasses?: true | undefined; + leading?: React.ReactNode | undefined; + trailing?: React.ReactNode | undefined; + leadingFocused?: React.ReactNode | undefined; + trailingFocused?: React.ReactNode | undefined; + trailingPadding?: string | undefined; + leadingPadding?: string | undefined; + suggestions?: string[]; + }; const TextFormField = forwardRef((props: TextFormFieldProps, ref) => { const field = useFormFieldPropsResolver(props); @@ -44,7 +42,8 @@ const TextFormField = forwardRef((props: TextFormFieldProps, ref) => { let child = ( } id={field.id} className={classNames( "cui-input-base peer", @@ -55,18 +54,10 @@ const TextFormField = forwardRef((props: TextFormFieldProps, ref) => { )} disabled={field.disabled} type={props.type === "password" ? getPasswordFieldType() : props.type} - placeholder={props.placeholder} name={field.name} value={field.value} - min={props.min} - max={props.max} - autoComplete={props.autoComplete} required={field.required} - onFocus={props.onFocus} - onBlur={props.onBlur} onChange={(e) => field.handleChange(e.target.value)} - onKeyDown={props.onKeyDown} - step={props.step} /> ); diff --git a/src/Components/Patient/ManagePatients.tsx b/src/Components/Patient/ManagePatients.tsx index 7d49ffdaad1..758d948864d 100644 --- a/src/Components/Patient/ManagePatients.tsx +++ b/src/Components/Patient/ManagePatients.tsx @@ -52,6 +52,7 @@ import { import { ICD11DiagnosisModel } from "../Diagnosis/types.js"; import { getDiagnosesByIds } from "../Diagnosis/utils.js"; import Tabs from "../Common/components/Tabs.js"; +import { isPatientMandatoryDataFilled } from "./Utils.js"; import request from "../../Utils/request/request.js"; import { Avatar } from "../Common/Avatar.js"; @@ -473,7 +474,9 @@ export const PatientManager = () => { if (data?.count) { patientList = data.results.map((patient) => { let patientUrl = ""; - if ( + if (!isPatientMandatoryDataFilled(patient)) { + patientUrl = `/facility/${patient.facility}/patient/${patient.id}`; + } else if ( patient.last_consultation && patient.last_consultation?.facility === patient.facility && !(patient.last_consultation?.discharge_date && patient.is_active) @@ -592,10 +595,26 @@ export const PatientManager = () => { )}
    - {!patient.last_consultation || - patient.last_consultation?.facility !== patient.facility || - (patient.last_consultation?.discharge_date && - patient.is_active) ? ( + {!isPatientMandatoryDataFilled(patient) && ( + + + + + + + + )} + + {isPatientMandatoryDataFilled(patient) && + (!patient.last_consultation || + patient.last_consultation?.facility !== patient.facility || + (patient.last_consultation?.discharge_date && + patient.is_active)) ? ( { return OCCUPATION_TYPES.find((i) => i.value === occupation)?.text; }; @@ -341,6 +342,40 @@ export const PatientHome = (props: any) => { )} + + {isPatientMandatoryDataFilled(patientData) && + (patientData?.facility != patientData?.last_consultation?.facility || + (patientData.is_active && + patientData?.last_consultation?.discharge_date)) && ( +
    +
    +
    +

    + + + {t("consultation_missing_warning")}{" "} + + {patientData.facility_object?.name || "-"}{" "} + + +

    +
    +
    +
    + + {t("create_consultation")} + +
    +
    + )}
    diff --git a/src/Components/Patient/PatientInfoCard.tsx b/src/Components/Patient/PatientInfoCard.tsx index 1f581b9b0e7..7e3a9563799 100644 --- a/src/Components/Patient/PatientInfoCard.tsx +++ b/src/Components/Patient/PatientInfoCard.tsx @@ -22,8 +22,6 @@ import { humanizeStrings, } from "../../Utils/utils.js"; import ABHAProfileModal from "../ABDM/ABHAProfileModal.js"; -import LinkABHANumberModal from "../ABDM/LinkABHANumberModal.js"; -import LinkCareContextModal from "../ABDM/LinkCareContextModal.js"; import DialogModal from "../Common/Dialog.js"; import ButtonV2 from "../Common/components/ButtonV2.js"; import Beds from "../Facility/Consultations/Beds.js"; @@ -43,6 +41,7 @@ import FetchRecordsModal from "../ABDM/FetchRecordsModal.js"; import { AbhaNumberModel } from "../ABDM/types/abha.js"; import { SkillModel } from "../Users/models.js"; import { AuthorizedForConsultationRelatedActions } from "../../CAREUI/misc/AuthorizedChild.js"; +import LinkAbhaNumber from "../ABDM/LinkAbhaNumber"; import careConfig from "@careConfig"; const formatSkills = (arr: SkillModel[]) => { @@ -75,7 +74,6 @@ export default function PatientInfoCard(props: { const [openDischargeSummaryDialog, setOpenDischargeSummaryDialog] = useState(false); const [openDischargeDialog, setOpenDischargeDialog] = useState(false); - const [showLinkCareContext, setShowLinkCareContext] = useState(false); const patient = props.patient; const consultation = props.consultation; @@ -748,7 +746,7 @@ export default function PatientInfoCard(props: { close(); setShowABHAProfile(true); triggerGoal("Patient Card Button Clicked", { - buttonName: "Show ABHA Profile", + buttonName: t("show_abha_profile"), consultationId: consultation?.id, userId: authUser?.id, }); @@ -758,25 +756,7 @@ export default function PatientInfoCard(props: { icon="l-user-square" className="text-lg text-primary-500" /> - Show ABHA Profile -
    -
    { - triggerGoal("Patient Card Button Clicked", { - buttonName: "Link Care Context", - consultationId: consultation?.id, - userId: authUser?.id, - }); - close(); - setShowLinkCareContext(true); - }} - > - - Link Care Context + {t("show_abha_profile")}
    - Fetch Records over ABDM + {t("hi__fetch_records")}
    )} @@ -815,7 +795,7 @@ export default function PatientInfoCard(props: { icon="l-link" className="text-lg text-primary-500" /> -

    Link ABHA Number

    +

    {t("link_abha_profile")}

    )} @@ -957,12 +937,33 @@ export default function PatientInfoCard(props: {
    - setShowLinkABHANumber(false)} - patientId={patient.id as any} - onSuccess={(_) => { - window.location.href += "?show-abha-profile=true"; + onSuccess={async (abhaProfile) => { + const { res, data } = await request( + routes.abdm.healthId.linkAbhaNumberAndPatient, + { + body: { + patient: patient.id, + abha_number: abhaProfile.external_id, + }, + }, + ); + + if (res?.status === 200 && data) { + Notification.Success({ + msg: t("abha_number_linked_successfully"), + }); + + props.fetchPatientData?.({ aborted: false }); + setShowLinkABHANumber(false); + setShowABHAProfile(true); + } else { + Notification.Error({ + msg: t("failed_to_link_abha_number"), + }); + } }} /> setShowABHAProfile(false)} /> - setShowLinkCareContext(false)} - /> { pathParams: { id: id ? id : 0 }, }); const { data: abhaNumberData } = await request( - routes.abha.getAbhaNumber, + routes.abdm.abhaNumber.get, { pathParams: { abhaNumberId: id ?? "" }, silent: true, @@ -589,7 +591,6 @@ export const PatientRegister = (props: PatientRegisterProps) => { } }); const data = { - abha_number: state.form.abha_number, phone_number: parsePhoneNumber(formData.phone_number), emergency_phone_number: parsePhoneNumber(formData.emergency_phone_number), date_of_birth: @@ -681,12 +682,15 @@ export const PatientRegister = (props: PatientRegisterProps) => { }); if (res?.ok && requestData) { if (state.form.abha_number) { - const { res, data } = await request(routes.abha.linkPatient, { - body: { - patient: requestData.id, - abha_number: state.form.abha_number, + const { res, data } = await request( + routes.abdm.healthId.linkAbhaNumberAndPatient, + { + body: { + patient: requestData.id, + abha_number: state.form.abha_number, + }, }, - }); + ); if (res?.status === 200 && data) { Notification.Success({ @@ -738,64 +742,64 @@ export const PatientRegister = (props: PatientRegisterProps) => { setIsLoading(false); }; - const handleAbhaLinking = ( - { - id, - abha_profile: { - healthIdNumber, - healthId, - name, - mobile, - gender, - monthOfBirth, - dayOfBirth, - yearOfBirth, - pincode, - }, - }: any, - field: any, + const populateAbhaValues = ( + abhaProfile: AbhaNumberModel, + field: FormContextValue, ) => { - const values: any = {}; - if (id) values["abha_number"] = id; - if (healthIdNumber) values["health_id_number"] = healthIdNumber; - if (healthId) values["health_id"] = healthId; + const values = { + abha_number: abhaProfile.external_id, + health_id_number: abhaProfile.abha_number, + health_id: abhaProfile.health_id, + }; - if (name) + if (abhaProfile.name) field("name").onChange({ name: "name", - value: name, + value: abhaProfile.name, }); - if (mobile) { + if (abhaProfile.mobile) { field("phone_number").onChange({ name: "phone_number", - value: parsePhoneNumber(mobile, "IN"), + value: parsePhoneNumber(abhaProfile.mobile, "IN"), }); field("emergency_phone_number").onChange({ name: "emergency_phone_number", - value: parsePhoneNumber(mobile, "IN"), + value: parsePhoneNumber(abhaProfile.mobile, "IN"), }); } - if (gender) + if (abhaProfile.gender) field("gender").onChange({ name: "gender", - value: gender === "M" ? "1" : gender === "F" ? "2" : "3", + value: { M: "1", F: "2", O: "3" }[abhaProfile.gender], }); - if (monthOfBirth && dayOfBirth && yearOfBirth) + if (abhaProfile.date_of_birth) field("date_of_birth").onChange({ name: "date_of_birth", - value: new Date(`${monthOfBirth}-${dayOfBirth}-${yearOfBirth}`), + value: new Date(abhaProfile.date_of_birth), }); - if (pincode) + if (abhaProfile.pincode) field("pincode").onChange({ name: "pincode", - value: pincode, + value: abhaProfile.pincode, }); + if (abhaProfile.address) { + field("address").onChange({ + name: "address", + value: abhaProfile.address, + }); + + field("permanent_address").onChange({ + name: "permanent_address", + value: abhaProfile.address, + }); + } + dispatch({ type: "set_form", form: { ...state.form, ...values } }); setShowLinkAbhaNumberModal(false); }; @@ -1035,16 +1039,17 @@ export const PatientRegister = (props: PatientRegisterProps) => { {careConfig.abdm.enabled && (
    {showLinkAbhaNumberModal && ( - setShowLinkAbhaNumberModal(false)} - onSuccess={(data: any) => { + onSuccess={(data) => { if (id) { - navigate(`/facility/${facilityId}/patient/${id}`); - return; + Notification.Warn({ + msg: "To link Abha Number, please save the patient details", + }); } - handleAbhaLinking(data, field); + populateAbhaValues(data, field); }} /> )} diff --git a/src/Components/Patient/Utils.ts b/src/Components/Patient/Utils.ts new file mode 100644 index 00000000000..96e05e63232 --- /dev/null +++ b/src/Components/Patient/Utils.ts @@ -0,0 +1,19 @@ +import { PatientModel } from "./models"; + +export function isPatientMandatoryDataFilled(patient: PatientModel) { + return ( + patient.phone_number && + patient.emergency_phone_number && + patient.name && + patient.gender && + (patient.date_of_birth || patient.year_of_birth) && + patient.address && + patient.permanent_address && + patient.pincode && + patient.state && + patient.district && + patient.local_body && + ("medical_history" in patient ? patient.medical_history : true) && + patient.blood_group + ); +} diff --git a/src/Components/Patient/models.tsx b/src/Components/Patient/models.tsx index d9e275fdc4a..9843b867a5b 100644 --- a/src/Components/Patient/models.tsx +++ b/src/Components/Patient/models.tsx @@ -134,6 +134,7 @@ export interface PatientModel { created_by?: PerformedByModel; assigned_to?: { first_name?: string; username?: string; last_name?: string }; assigned_to_object?: AssignedToObjectModel; + occupation?: Occupation; meta_info?: PatientMeta; age?: string; } diff --git a/src/Locale/en.json b/src/Locale/en.json index 08f9ded2130..e516ec61733 100644 --- a/src/Locale/en.json +++ b/src/Locale/en.json @@ -213,7 +213,43 @@ "VENTILATOR_MODE__VCV": "Volume Control Ventilation (VCV)", "VENTILATOR_MODE__VC_SIMV": "Volume Controlled SIMV (VC-SIMV)", "View Facility": "View Facility", - "abha_number_linked_successfully": "ABHA number linked successfully", + "aadhaar_number": "Aadhaar Number", + "aadhaar_number_will_not_be_stored": "Aadhaar number will not be stored by CARE", + "aadhaar_otp_send_error": "Failed to send OTP. Please try again later.", + "aadhaar_otp_send_success": "OTP has been sent to the mobile number registered with the Aadhar number.", + "aadhaar_validation_length_error": "Should be a 12-digit aadhaar number or 16-digit virtual ID", + "aadhaar_validation_space_error": "Aadhaar number should not contain spaces", + "abha__auth_method__AADHAAR_OTP": "Aadhaar OTP", + "abha__auth_method__MOBILE_OTP": "Mobile OTP", + "abha__disclaimer_1": "I am voluntarily sharing my Aadhaar Number / Virtual ID issued by the Unique Identification Authority of India (\"UIDAI\"), and my demographic information for the purpose of creating an Ayushman Bharat Health Account number (\"ABHA number\") and Ayushman Bharat Health Account address (\"ABHA Address\"). I authorize NHA to use my Aadhaar number / Virtual ID for performing Aadhaar based authentication with UIDAI as per the provisions of the Aadhaar (Targeted Delivery of Financial and other Subsidies, Benefits and Services) Act, 2016 for the aforesaid purpose. I understand that UIDAI will share my e-KYC details, or response of \"Yes\" with NHA upon successful authentication.", + "abha__disclaimer_2": "I consent to usage of my ABHA address and ABHA number for linking of my legacy (past) health records and those which will be generated during this encounter.", + "abha__disclaimer_3": "I authorize the sharing of all my health records with healthcare provider(s) for the purpose of providing healthcare services to me during this encounter.", + "abha__disclaimer_4": "I consent to the anonymization and subsequent use of my health records for public health purposes.", + "abha__qr_scanning_error": "Error scanning QR code, Invalid QR code", + "abha_address": "ABHA Address", + "abha_address_created_error": "Failed to create Abha Address. Please try again later.", + "abha_address_created_success": "Abha Address has been created successfully.", + "abha_address_suggestions": "Here are some suggestions:", + "abha_address_validation_character_error": "Should only contain letters, numbers, underscore(_) or dot(.)", + "abha_address_validation_end_error": "Shouldn't end with a dot (.)", + "abha_address_validation_length_error": "Should be atleast 4 character long", + "abha_address_validation_start_error": "Shouldn't start with a number or dot (.)", + "abha_details": "ABHA Details", + "abha_link_options__create_with_aadhaar__description": "Create New ABHA Number Using Aadhaar Number", + "abha_link_options__create_with_aadhaar__title": "Create with Aadhaar", + "abha_link_options__create_with_driving_license__description": "Create New ABHA Number Using Driving License", + "abha_link_options__create_with_driving_license__title": "Create with Driving License", + "abha_link_options__disabled_tooltip": "We are currently working on this feature", + "abha_link_options__link_with_demographics__description": "Link Existing ABHA Number Using Demographic details", + "abha_link_options__link_with_demographics__title": "Link with Demographics", + "abha_link_options__link_with_otp__description": "Link Existing ABHA Number Using Mobile or Aadhaar OTP", + "abha_link_options__link_with_otp__title": "Link with OTP", + "abha_link_options__link_with_qr__title": "Link with ABHA QR", + "abha_number": "ABHA Number", + "abha_number_exists": "ABHA Number already exists", + "abha_number_exists_description": "There is an ABHA Number already linked with the given Aadhaar Number, Do you want to create a new ABHA Address?", + "abha_number_linked_successfully": "ABHA Number has been linked successfully.", + "abha_profile": "ABHA Profile", "access_level": "Access Level", "action_irreversible": "This action is irreversible", "active": "Active", @@ -253,6 +289,8 @@ "ambulance_number": "Ambulance No", "ambulance_phone_number": "Phone number of Ambulance", "antenatal": "Antenatal", + "any_id": "Enter any ID linked with your ABHA number", + "any_id_description": "Currently we support: Aadhaar Number / Mobile Number", "any_other_comments": "Any other comments", "apply": "Apply", "approved_by_district_covid_control_room": "Approved by District COVID Control Room", @@ -272,6 +310,7 @@ "assets": "Assets", "assigned_facility": "Facility assigned", "assigned_to": "Assigned to", + "async_operation_warning": "This operation may take some time. Please check back later.", "audio__allow_permission": "Please allow microphone permission in site settings", "audio__allow_permission_button": "Click here to know how to allow", "audio__allow_permission_helper": "You might have denied microphone access in the past.", @@ -284,6 +323,7 @@ "audio__start_again": "Start Again", "audit_log": "Audit Log", "auth_login_title": "Authorized Login", + "auth_method_unsupported": "This authentication method is not supported, please try a different method", "authorize_shift_delete": "Authorize shift delete", "auto_generated_for_care": "Auto Generated for Care", "available_features": "Available Features", @@ -333,6 +373,8 @@ "check_for_available_update": "Check for available update", "check_for_update": "Check for Update", "check_policy_eligibility": "Check Policy Eligibility", + "check_status": "Check Status", + "checking_consent_status": "Consent request status is being checked!", "checking_eligibility": "Checking Eligibility", "checking_for_update": "Checking for update", "checking_policy_eligibility": "Checking Policy Eligibility", @@ -390,6 +432,39 @@ "confirm_password": "Confirm Password", "confirm_transfer_complete": "Confirm Transfer Complete!", "confirmed": "Confirmed", + "consent__hi_range": "Health Information Range", + "consent__hi_type__DiagnosticReport": "Diagnostic Report", + "consent__hi_type__DischargeSummary": "Discharge Summary", + "consent__hi_type__HealthDocumentRecord": "Health Document Record", + "consent__hi_type__ImmunizationRecord": "Immunization Record", + "consent__hi_type__OPConsultation": "OP Consultation", + "consent__hi_type__Prescription": "Prescription", + "consent__hi_type__WellnessRecord": "Wellness Record", + "consent__hi_types": "HI Profiles", + "consent__patient": "Patient", + "consent__purpose": "Purpose", + "consent__purpose__BTG": "Break The Glass", + "consent__purpose__CAREMGT": "Care Management", + "consent__purpose__DSRCH": "Disease Specific Healthcare Research", + "consent__purpose__HPAYMT": "Healthcare Payment", + "consent__purpose__PATRQT": "Self Requested", + "consent__purpose__PUBHLTH": "Public Health", + "consent__status": "Status", + "consent__status__DENIED": "Denied", + "consent__status__EXPIRED": "Expired", + "consent__status__GRANTED": "Granted", + "consent__status__REQUESTED": "Requested", + "consent__status__REVOKED": "Revoked", + "consent_request__date_range": "Health Records Date Range", + "consent_request__expiry": "Consent Expiry Date", + "consent_request__hi_types": "Health Information Types", + "consent_request__hi_types_placeholder": "Select One or More HI Types", + "consent_request__patient_identifier": "Patient Identifier", + "consent_request__purpose": "Purpose of Request", + "consent_request_rejected": "Patient has rejected the consent request", + "consent_request_waiting_approval": "Waiting for the Patient to approve the consent request", + "consent_requested_successfully": "Consent requested successfully!", + "consultation_missing_warning": "You have not created a consultation for the patient in", "consultation_not_filed": "You have not filed a consultation for this patient yet.", "consultation_not_filed_description": "Please file a consultation for this patient to continue.", "consultation_notes": "General Instructions (Advice)", @@ -408,10 +483,13 @@ "covid_19_cat_gov": "Covid_19 Clinical Category as per Govt. of Kerala guideline (A/B/C)", "covid_19_death_reporting_form_1": "Covid-19 Death Reporting : Form 1", "create": "Create", + "create_abha_address": "Create ABHA Address", "create_add_more": "Create & Add More", "create_asset": "Create Asset", "create_consultation": "Create Consultation", "create_facility": "Create a new facility", + "create_new_abha_address": "Create New ABHA Address", + "create_new_abha_profile": "Don't have an ABHA Number", "create_new_asset": "Create New Asset", "create_position_preset": "Create a new position preset", "create_position_preset_description": "Creates a new position preset in Care from the current position of the camera for the given name", @@ -440,6 +518,7 @@ "delete_item": "Delete {{name}}", "delete_record": "Delete Record", "deleted_successfully": "{{name}} deleted successfully", + "denied_on": "Denied On", "describe_why_the_asset_is_not_working": "Describe why the asset is not working", "description": "Description", "details_about_the_equipment": "Details about the equipment", @@ -483,6 +562,7 @@ "download_discharge_summary": "Download discharge summary", "download_type": "Download Type", "downloading": "Downloading", + "downloading_abha_card": "Generating ABHA Card, Please hold on", "downloads": "Downloads", "drag_drop_image_to_upload": "Drag & drop image to upload", "duplicate_patient_record_birth_unknown": "Please contact your district care coordinator, the shifting facility or the patient themselves if you are not sure about the patient's year of birth.", @@ -524,8 +604,15 @@ "encounter_suggestion__OP": "Out-patient visit", "encounter_suggestion__R": "Consultation", "encounter_suggestion_edit_disallowed": "Not allowed to switch to this option in edit consultation", + "enter_aadhaar_number": "Enter a 12-digit Aadhaar ID", + "enter_aadhaar_otp": "Enter OTP sent to the registered mobile with Aadhaar", + "enter_abha_address": "Enter ABHA Address", + "enter_any_id": "Enter any ID linked with your ABHA number", "enter_file_name": "Enter File Name", "enter_message": "Start typing...", + "enter_mobile_number": "Enter Mobile Number", + "enter_mobile_otp": "Enter OTP sent to the given mobile number", + "enter_otp": "Enter OTP sent to the registered mobile with the respective ID", "enter_valid_age": "Please Enter Valid Age", "entered-in-error": "Entered in error", "error_404": "Error 404", @@ -535,13 +622,16 @@ "estimated_contact_date": "Estimated contact date", "expand_sidebar": "Expand Sidebar", "expected_burn_rate": "Expected Burn Rate", + "expired_on": "Expired On", + "expires_on": "Expires On", "facilities": "Facilities", "facility": "Facility", + "facility_consent_requests_page_title": "Patient Consent List", "facility_name": "Facility Name", "facility_preference": "Facility preference", "facility_search_placeholder": "Search by Facility / District Name", "facility_type": "Facility Type", - "failed_to_link_abha_number": "Failed to link ABHA number", + "failed_to_link_abha_number": "Failed to link ABHA Number. Please try again later.", "features": "Features", "feed_configurations": "Feed Configurations", "feed_is_currently_not_live": "Feed is currently not live", @@ -573,25 +663,53 @@ "forget_password": "Forgot password?", "forget_password_instruction": "Enter your username, and if it exists, we will send you a link to reset your password.", "frequency": "Frequency", + "full_name": "Full Name", "full_screen": "Full Screen", "gender": "Gender", "generate_report": "Generate Report", "generated_summary_caution": "This is a computer generated summary using the information captured in the CARE system.", "generating": "Generating", "generating_discharge_summary": "Generating discharge summary", + "get_auth_methods": "Get Available Authentication Methods", + "get_auth_mode_error": "Could not find any supported authentication methods, Please try again with a different authentication method", "get_tests": "Get Tests", "goal": "Our goal is to continuously improve the quality and accessibility of public healthcare services using digital tools.", + "granted_on": "Granted On", "has_domestic_healthcare_support": "Has domestic healthcare support?", + "health_facility__config_registration_error": "Health ID registration failed", + "health_facility__config_update_error": "Health Facility config update failed", + "health_facility__config_update_success": "Health Facility config updated successfully", + "health_facility__hf_id": "Health Facility Id", + "health_facility__link": "Link Health Facility", + "health_facility__not_registered_1.1": "The ABDM health facility is successfully linked with care", + "health_facility__not_registered_1.2": "but not registered as a service in bridge", + "health_facility__not_registered_2": "Click on Link Health Facility to register the service", + "health_facility__not_registered_3": "Not Registered", + "health_facility__registered_1.1": "The ABDM health facility is successfully linked with care", + "health_facility__registered_1.2": "and registered as a service in bridge", + "health_facility__registered_2": "No Action Required", + "health_facility__registered_3": "Registered", + "health_facility__validation__hf_id_required": "Health Facility Id is required", "help_confirmed": "There is sufficient diagnostic and/or clinical evidence to treat this as a confirmed condition.", "help_differential": "One of a set of potential (and typically mutually exclusive) diagnoses asserted to further guide the diagnostic process and preliminary treatment.", "help_entered-in-error": "The statement was entered in error and is not valid.", "help_provisional": "This is a tentative diagnosis - still a candidate that is under consideration.", "help_refuted": "This condition has been ruled out by subsequent diagnostic and clinical evidence.", "help_unconfirmed": "There is not sufficient diagnostic and/or clinical evidence to treat this as a confirmed condition.", + "hi__fetch_records": "Fetch Records over ABDM", + "hi__page_title": "Health Information", + "hi__record_archived__title": "This record has been archived", + "hi__record_archived_description": "This record has been archived and is no longer available for viewing.", + "hi__record_archived_on": " This record was archived on", + "hi__record_not_fetched_description": "This record hasn't been fetched yet. Please check back after some time.", + "hi__record_not_fetched_title": "This record hasn't been fetched yet", + "hi__waiting_for_record": "Waiting for the Host HIP to send the record.", "hide": "Hide", "home_facility": "Home Facility", "hubs": "Hub Facilities", + "i_declare": "I hereby declare that:", "icd11_as_recommended": "As per ICD-11 recommended by WHO", + "incomplete_patient_details_warning": "Patient details are incomplete. Please update the details before proceeding.", "inconsistent_dosage_units_error": "Dosage units must be same", "indian_mobile": "Indian Mobile", "indicator": "Indicator", @@ -644,7 +762,10 @@ "latitude_invalid": "Latitude must be between -90 and 90", "left": "Left", "length": "Length ({{unit}})", + "link_abha_number": "Link ABHA Number", + "link_abha_profile": "Link ABHA Profile", "link_camera_and_bed": "Link bed to Camera", + "link_existing_abha_profile": "Already have an ABHA number", "linked_facilities": "Linked Facilities", "linked_skills": "Linked Skills", "liquid_oxygen_capacity": "Liquid Oxygen Capacity", @@ -694,9 +815,16 @@ "min_time_bw_doses": "Min. time b/w doses", "mobile": "Mobile", "mobile_number": "Mobile Number", + "mobile_number_different_from_aadhaar_mobile_number": "We have noticed that you have entered a mobile number that is different from the one linked to your Aadhaar. We will send an OTP to this number to link it with your Abha number.", + "mobile_number_validation_error": "Enter a valid mobile number", + "mobile_otp_send_error": "Failed to send OTP. Please try again later.", + "mobile_otp_send_success": "OTP has been sent to the given mobile number.", + "mobile_otp_verify_error": "Failed to verify mobile number. Please try again later.", + "mobile_otp_verify_success": "Mobile number has been verified successfully.", "modification_caution_note": "No modifications possible once added", "modified": "Modified", "modified_date": "Modified Date", + "modified_on": "Modified On", "monitor": "Monitor", "more_info": "More Info", "move_to_onvif_preset": "Move to an ONVIF Preset", @@ -730,6 +858,7 @@ "no_policy_added": "No Insurance Policy Added", "no_policy_found": "No Insurance Policy Found for this Patient", "no_presets": "No Presets", + "no_records_found": "No records found", "no_remarks": "No remarks", "no_results_found": "No Results Found", "no_staff": "No staff found", @@ -756,6 +885,7 @@ "occupation": "Occupation", "on": "On", "ongoing_medications": "Ongoing Medications", + "only_indian_mobile_numbers_supported": "Currently only Indian numbers are supported", "open": "Open", "open_camera": "Open Camera", "open_live_monitoring": "Open Live Monitoring", @@ -764,6 +894,8 @@ "ordering": "Ordering", "origin_facility": "Current facility", "other_details": "Other details", + "otp_verification_error": "Failed to verify OTP. Please try again later.", + "otp_verification_success": "OTP has been verified successfully.", "out_of_range_error": "Value must be between {{ start }} and {{ end }}.", "oxygen_information": "Oxygen Information", "page_not_found": "Page Not Found", @@ -791,6 +923,7 @@ "patient_consultation__treatment__summary__temperature": "Temperature", "patient_created": "Patient Created", "patient_details": "Patient Details", + "patient_details_incomplete": "Patient Details Incomplete", "patient_face": "Patient Face", "patient_name": "Patient name", "patient_no": "OP/IP No", @@ -864,6 +997,7 @@ "profile": "Profile", "provisional": "Provisional", "qualification": "Qualification", + "raise_consent_request": "Raise a consent request to fetch patient records over ABDM", "ration_card__APL": "APL", "ration_card__BPL": "BPL", "ration_card__NO_CARD": "Non-card holder", @@ -882,6 +1016,7 @@ "redirected_to_create_consultation": "Note: You will be redirected to create consultation form. Please complete the form to finish the transfer process", "referral_letter": "Referral Letter", "referred_to": "Referred to", + "refresh": "Refresh", "refresh_list": "Refresh List", "refuted": "Refuted", "register_hospital": "Register Hospital", @@ -894,12 +1029,14 @@ "req_atleast_one_lowercase": "Require at least one lower case letter", "req_atleast_one_symbol": "Require at least one symbol", "req_atleast_one_uppercase": "Require at least one upper case", + "request_consent": "Request Consent", "request_description": "Description of Request", "request_description_placeholder": "Type your description here", "request_title": "Request Title", "request_title_placeholder": "Type your title here", "required": "Required", "required_quantity": "Required Quantity", + "resend_otp": "Resend OTP", "reset": "Reset", "reset_password": "Reset Password", "resource": "Resource", @@ -915,6 +1052,7 @@ "return_to_login": "Return to Login", "return_to_password_reset": "Return to Password Reset", "return_to_patient_dashboard": "Return to Patient Dashboard", + "revoked_on": "Revoked On", "right": "Right", "route": "Route", "routine": "Routine", @@ -934,6 +1072,7 @@ "search_resource": "Search Resource", "see_attachments": "See Attachments", "select": "Select", + "select_all": "Select All", "select_date": "Select date", "select_eligible_policy": "Select an Eligible Insurance Policy", "select_facility_for_discharged_patients_warning": "Facility needs to be selected to view discharged patients.", @@ -949,6 +1088,9 @@ "select_wards": "Select wards", "send_email": "Send Email", "send_message": "Send Message", + "send_otp": "Send OTP", + "send_otp_error": "Failed to send OTP. Please try again later.", + "send_otp_success": "OTP has been sent to the respective mobile number", "send_reset_link": "Send Reset Link", "serial_number": "Serial Number", "serviced_on": "Serviced on", @@ -966,6 +1108,7 @@ "shifting_deleted": "Shifting record has been deleted successfully.", "shifting_details": "Shifting details", "shifting_status": "Shifting status", + "show_abha_profile": "Show ABHA Profile", "show_all": "Show all", "show_all_notifications": "Show All", "show_default_presets": "Show Default Presets", @@ -1017,6 +1160,7 @@ "treatment_summary__heading": "INTERIM TREATMENT SUMMARY", "treatment_summary__print": "Print Treatment Summary", "try_again_later": "Try again later!", + "try_different_abha_linking_option": "Want to try a different linking option, here are some more:", "type_any_extra_comments_here": "type any extra comments here", "type_b_cylinders": "B Type Cylinders", "type_c_cylinders": "C Type Cylinders", @@ -1045,12 +1189,14 @@ "update_facility": "Update Facility", "update_facility_middleware_success": "Facility middleware updated successfully", "update_log": "Update Log", + "update_patient_details": "Update Patient Details", "update_preset_position_to_current": "Update preset's position to camera's current position", "update_record": "Update Record", "update_record_for_asset": "Update record for asset", "update_shift_request": "Update Shift Request", "update_status_details": "Update Status/Details", "updated": "Updated", + "updated_on": "Updated On", "updating": "Updating", "upload": "Upload", "upload_an_image": "Upload an image", @@ -1059,12 +1205,19 @@ "upload_headings__sample_report": "Upload Sample Report", "upload_headings__supporting_info": "Upload Supporting Info", "uploading": "Uploading", + "use_existing_abha_address": "Use Existing ABHA Address", "user_deleted_successfuly": "User Deleted Successfuly", "user_management": "User Management", "username": "Username", "users": "Users", "vehicle_preference": "Vehicle preference", "vendor_name": "Vendor Name", + "verify_and_link": "Verify and Link", + "verify_otp": "Verify OTP", + "verify_otp_error": "Failed to verify OTP. Please try again later.", + "verify_otp_success": "OTP has been verified successfully.", + "verify_patient_identifier": "Please verify the patient identifier", + "verify_using": "Verify Using", "video_conference_link": "Video Conference Link", "view": "View", "view_abdm_records": "View ABDM Records", diff --git a/src/Redux/api.tsx b/src/Redux/api.tsx index ea728d7f53c..d562908a140 100644 --- a/src/Redux/api.tsx +++ b/src/Redux/api.tsx @@ -50,25 +50,6 @@ import { SampleReportModel, SampleTestModel, } from "../Components/Patient/models"; -import { - IAadhaarOtp, - IAadhaarOtpTBody, - ICheckAndGenerateMobileOtp, - IConfirmMobileOtp, - ICreateHealthIdRequest, - ICreateHealthIdResponse, - IGenerateMobileOtpTBody, - IHealthFacility, - IHealthId, - ILinkABHANumber, - ILinkViaQRBody, - ISearchByHealthIdTBody, - IVerifyAadhaarOtpTBody, - IcreateHealthFacilityTBody, - IgetAbhaCardTBody, - IinitiateAbdmAuthenticationTBody, - IpartialUpdateHealthFacilityTBody, -} from "../Components/ABDM/models"; import { IComment, IResource } from "../Components/Resource/models"; import { IDeleteBedCapacity, @@ -117,8 +98,13 @@ import { import { InvestigationSessionType } from "../Components/Facility/Investigations/investigationsTab"; import { AbhaNumberModel } from "../Components/ABDM/types/abha"; import { ScribeModel } from "../Components/Scribe/Scribe"; -import { InsurerOptionModel } from "../Components/HCX/InsurerAutocomplete"; -import { PMJAYPackageItem } from "../Components/Common/PMJAYProcedurePackageAutocomplete"; +import { + IcreateHealthFacilityTBody, + IHealthFacility, + IpartialUpdateHealthFacilityTBody, +} from "../Components/ABDM/types/health-facility"; +import { PMJAYPackageItem } from "@/Components/Common/PMJAYProcedurePackageAutocomplete"; +import { InsurerOptionModel } from "@/Components/HCX/InsurerAutocomplete"; /** * A fake function that returns an empty object casted to type T @@ -1361,196 +1347,243 @@ const routes = { TBody: Type(), }, - abha: { - getAbhaNumber: { - path: "/api/v1/abdm/abha_numbers/{abhaNumberId}/", - method: "GET", - TRes: Type(), - }, - - // ABDM HealthID endpoints - generateAadhaarOtp: { - path: "/api/v1/abdm/healthid/generate_aadhaar_otp/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, - - resendAadhaarOtp: { - path: "/api/v1/abdm/healthid/resend_aadhaar_otp/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, - - verifyAadhaarOtp: { - path: "/api/v1/abdm/healthid/verify_aadhaar_otp/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, - - generateMobileOtp: { - path: "/api/v1/abdm/healthid/generate_mobile_otp/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, - - checkAndGenerateMobileOtp: { - path: "/api/v1/abdm/healthid/check_and_generate_mobile_otp/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, + abdm: { + consent: { + list: { + path: "/api/abdm/consent/", + method: "GET", + TRes: Type>(), + }, - // TODO: resend mobile otp - verifyMobileOtp: { - path: "/api/v1/abdm/healthid/verify_mobile_otp/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, + create: { + path: "/api/abdm/consent/", + method: "POST", + TRes: Type(), + TBody: Type(), + }, - createHealthId: { - path: "/api/v1/abdm/healthid/create_health_id/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, + get: { + path: "/api/abdm/consent/{id}/", + method: "GET", + }, - linkPatient: { - path: "/api/v1/abdm/healthid/link_patient/", - method: "POST", - TBody: Type<{ abha_number: string; patient: string }>(), - TRes: Type(), + checkStatus: { + path: "/api/abdm/v3/hiu/consent_request_status/", + method: "POST", + TBody: Type<{ + consent_request: string; + }>(), + TRes: Type<{ + detail: string; + }>(), + }, }, - searchByHealthId: { - path: "/api/v1/abdm/healthid/search_by_health_id/", - method: "POST", - TRes: Type(), - TBody: Type(), + healthInformation: { + get: { + path: "/api/abdm/health_information/{artefactId}", + method: "GET", + TRes: Type(), + }, }, - initiateAbdmAuthentication: { - path: "/api/v1/abdm/healthid/auth_init/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, + healthFacility: { + list: { + path: "/api/abdm/health_facility/", + method: "GET", + }, - confirmWithAadhaarOtp: { - path: "/api/v1/abdm/healthid/confirm_with_aadhaar_otp/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, + create: { + path: "/api/abdm/health_facility/", + method: "POST", + TRes: Type(), + TBody: Type(), + }, - confirmWithMobileOtp: { - path: "/api/v1/abdm/healthid/confirm_with_mobile_otp/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, + get: { + path: "/api/abdm/health_facility/{facility_id}/", + method: "GET", + TRes: Type(), + }, - linkViaQR: { - path: "/api/v1/abdm/healthid/link_via_qr/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, + update: { + path: "/api/abdm/health_facility/{facility_id}/", + method: "PUT", + TRes: Type(), + TBody: Type(), + }, - linkCareContext: { - path: "/api/v1/abdm/healthid/add_care_context/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, + partialUpdate: { + path: "/api/abdm/health_facility/{facility_id}/", + method: "PATCH", + TRes: Type(), + TBody: Type(), + }, - getAbhaCard: { - path: "/api/v1/abdm/healthid/get_abha_card/", - method: "POST", - TRes: Type(), - TBody: Type(), + registerAsService: { + path: "/api/abdm/health_facility/{facility_id}/register_service/", + method: "POST", + TRes: Type(), + TBody: Type(), + }, }, - // ABDM Health Facility - - listHealthFacility: { - path: "/api/v1/abdm/health_facility/", - method: "GET", + abhaNumber: { + get: { + path: "/api/abdm/abha_number/{abhaNumberId}/", + method: "GET", + TRes: Type(), + }, + create: { + path: "/api/abdm/abha_number/", + method: "POST", + TBody: Type>(), + TRes: Type(), + }, }, - createHealthFacility: { - path: "/api/v1/abdm/health_facility/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, + healthId: { + abhaCreateSendAadhaarOtp: { + path: "/api/abdm/v3/health_id/create/send_aadhaar_otp/", + method: "POST", + TBody: Type<{ + aadhaar: string; + transaction_id?: string; + }>(), + TRes: Type<{ + transaction_id: string; + detail: string; + }>(), + }, - getHealthFacility: { - path: "/api/v1/abdm/health_facility/{facility_id}/", - method: "GET", - TRes: Type(), - }, + abhaCreateVerifyAadhaarOtp: { + path: "/api/abdm/v3/health_id/create/verify_aadhaar_otp/", + method: "POST", + TBody: Type<{ + transaction_id: string; + otp: string; + mobile: string; + }>(), + TRes: Type<{ + transaction_id: string; + detail: string; + is_new: boolean; + abha_number: AbhaNumberModel; + }>(), + }, - updateHealthFacility: { - path: "/api/v1/abdm/health_facility/{facility_id}/", - method: "PUT", - TRes: Type(), - TBody: Type(), - }, + abhaCreateLinkMobileNumber: { + path: "/api/abdm/v3/health_id/create/link_mobile_number/", + method: "POST", + TBody: Type<{ + transaction_id: string; + mobile: string; + }>(), + TRes: Type<{ + transaction_id: string; + detail: string; + }>(), + }, - partialUpdateHealthFacility: { - path: "/api/v1/abdm/health_facility/{facility_id}/", - method: "PATCH", - TRes: Type(), - TBody: Type(), - }, + abhaCreateVerifyMobileNumber: { + path: "/api/abdm/v3/health_id/create/verify_mobile_otp/", + method: "POST", + TBody: Type<{ + transaction_id: string; + otp: string; + }>(), + TRes: Type<{ + transaction_id: string; + detail: string; + }>(), + }, - registerHealthFacilityAsService: { - path: "/api/v1/abdm/health_facility/{facility_id}/register_service/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, + abhaCreateAbhaAddressSuggestion: { + path: "/api/abdm/v3/health_id/create/abha_address_suggestion/", + method: "POST", + TBody: Type<{ + transaction_id: string; + }>(), + TRes: Type<{ + transaction_id: string; + abha_addresses: string[]; + }>(), + }, - listConsents: { - path: "/api/v1/abdm/consent/", - method: "GET", - TRes: Type>(), - }, + abhaCreateEnrolAbhaAddress: { + path: "/api/abdm/v3/health_id/create/enrol_abha_address/", + method: "POST", + TBody: Type<{ + transaction_id: string; + abha_address: string; + }>(), + TRes: Type<{ + detail?: string; + transaction_id: string; + health_id: string; + preferred_abha_address: string; + abha_number: AbhaNumberModel; + }>(), + }, - createConsent: { - path: "/api/v1/abdm/consent/", - method: "POST", - TRes: Type(), - TBody: Type(), - }, + linkAbhaNumberAndPatient: { + path: "/api/abdm/v3/health_id/link_patient/", + method: "POST", + TBody: Type<{ + abha_number: string; + patient: string; + }>(), + TRes: Type<{ + detail: string; + }>(), + }, - getConsent: { - path: "/api/v1/abdm/consent/{id}/", - method: "GET", - }, + abhaLoginCheckAuthMethods: { + path: "/api/abdm/v3/health_id/login/check_auth_methods/", + method: "POST", + TBody: Type<{ + abha_address: string; + }>(), + TRes: Type<{ + abha_number: string; + auth_methods: string[]; + }>(), + }, - checkConsentStatus: { - path: "/api/v1/abdm/consent/{id}/status/", - method: "GET", - TRes: Type(), - }, + abhaLoginSendOtp: { + path: "/api/abdm/v3/health_id/login/send_otp/", + method: "POST", + TBody: Type<{ + type: "abha-number" | "abha-address" | "mobile" | "aadhaar"; + value: string; + otp_system: "abdm" | "aadhaar"; + }>(), + TRes: Type<{ + transaction_id: string; + detail: string; + }>(), + }, - getHealthInformation: { - path: "/api/v1/abdm/health_information/{artefactId}", - method: "GET", - TRes: Type(), - }, + abhaLoginVerifyOtp: { + path: "/api/abdm/v3/health_id/login/verify_otp/", + method: "POST", + TBody: Type<{ + type: "abha-number" | "abha-address" | "mobile" | "aadhaar"; + otp: string; + transaction_id: string; + otp_system: "abdm" | "aadhaar"; + }>(), + TRes: Type<{ + abha_number: AbhaNumberModel; + created: boolean; + }>(), + }, - findPatient: { - path: "/api/v1/abdm/patients/find/", - method: "POST", - TRes: Type(), - TBody: Type<{ id: string }>(), + getAbhaCard: { + path: "/api/abdm/v3/health_id/abha_card", + method: "GET", + TRes: Type(), + }, }, }, diff --git a/src/Utils/request/request.ts b/src/Utils/request/request.ts index 151cc30c460..3fa648316af 100644 --- a/src/Utils/request/request.ts +++ b/src/Utils/request/request.ts @@ -85,6 +85,11 @@ async function getResponseBody(res: Response): Promise { } const isJson = res.headers.get("content-type")?.includes("application/json"); + const isImage = res.headers.get("content-type")?.includes("image"); + + if (isImage) { + return (await res.blob()) as TData; + } if (!isJson) { return (await res.text()) as TData; From 63a28a565cde5f735e8d74bb5c0bcefdd75f34ae Mon Sep 17 00:00:00 2001 From: Khavin Shankar Date: Mon, 21 Oct 2024 18:44:24 +0530 Subject: [PATCH 31/31] disable abha number linking when health facility id is not present --- src/Components/Patient/PatientInfoCard.tsx | 66 +++++++++++++++------- src/Components/Patient/PatientRegister.tsx | 44 +++++++++++---- src/Locale/en.json | 2 + 3 files changed, 81 insertions(+), 31 deletions(-) diff --git a/src/Components/Patient/PatientInfoCard.tsx b/src/Components/Patient/PatientInfoCard.tsx index 7e3a9563799..deb3708451c 100644 --- a/src/Components/Patient/PatientInfoCard.tsx +++ b/src/Components/Patient/PatientInfoCard.tsx @@ -1,5 +1,10 @@ import * as Notification from "../../Utils/Notifications.js"; - +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/Components/ui/tooltip"; import { CONSULTATION_SUGGESTION, DISCHARGE_REASONS, @@ -43,6 +48,7 @@ import { SkillModel } from "../Users/models.js"; import { AuthorizedForConsultationRelatedActions } from "../../CAREUI/misc/AuthorizedChild.js"; import LinkAbhaNumber from "../ABDM/LinkAbhaNumber"; import careConfig from "@careConfig"; +import { cn } from "@/lib/utils.js"; const formatSkills = (arr: SkillModel[]) => { const skills = arr.map((skill) => skill.skill_object.name); @@ -133,6 +139,11 @@ export default function PatientInfoCard(props: { prefetch: !!consultation?.treating_physician_object?.username, }); + const { data: healthFacility } = useQuery(routes.abdm.healthFacility.get, { + pathParams: { facility_id: patient.facility ?? "" }, + silent: true, + }); + return ( <> ) : ( - - {({ close }) => ( -
    { - close(); - setShowLinkABHANumber(true); - }} - > - - -

    {t("link_abha_profile")}

    -
    -
    - )} -
    + + + + + {({ close, disabled }) => ( +
    { + close(); + setShowLinkABHANumber(true); + }} + > + + +

    {t("generate_link_abha")}

    +
    +
    + )} +
    +
    + + {!healthFacility && ( + + {t("abha_disabled_due_to_no_health_facility")} + + )} +
    +
    ))}
    diff --git a/src/Components/Patient/PatientRegister.tsx b/src/Components/Patient/PatientRegister.tsx index 8cfd1a74ce3..cb007bb224f 100644 --- a/src/Components/Patient/PatientRegister.tsx +++ b/src/Components/Patient/PatientRegister.tsx @@ -28,7 +28,12 @@ import { import { useCallback, useReducer, useRef, useState } from "react"; import { navigate } from "raviger"; import { statusType, useAbortableEffect } from "../../Common/utils"; - +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/Components/ui/tooltip"; import AccordionV2 from "../Common/components/AccordionV2"; import AutocompleteFormField from "../Form/FormFields/Autocomplete.js"; import ButtonV2 from "../Common/components/ButtonV2"; @@ -372,6 +377,11 @@ export const PatientRegister = (props: PatientRegisterProps) => { [id], ); + const { data: healthFacility } = useQuery(routes.abdm.healthFacility.get, { + pathParams: { facility_id: facilityId }, + silent: true, + }); + useQuery(routes.hcx.policies.list, { query: { patient: id, @@ -1013,16 +1023,28 @@ export const PatientRegister = (props: PatientRegisterProps) => {
    {!state.form.abha_number && (
    - + + + + + + {!healthFacility && ( + + {t("abha_disabled_due_to_no_health_facility")} + + )} + +
    )} {showAlertMessage.show && ( diff --git a/src/Locale/en.json b/src/Locale/en.json index e516ec61733..e54fcf451e2 100644 --- a/src/Locale/en.json +++ b/src/Locale/en.json @@ -235,6 +235,7 @@ "abha_address_validation_length_error": "Should be atleast 4 character long", "abha_address_validation_start_error": "Shouldn't start with a number or dot (.)", "abha_details": "ABHA Details", + "abha_disabled_due_to_no_health_facility": "ABHA Number generation and linking is disabled for this facility, Please link a health facility to enable this feature.", "abha_link_options__create_with_aadhaar__description": "Create New ABHA Number Using Aadhaar Number", "abha_link_options__create_with_aadhaar__title": "Create with Aadhaar", "abha_link_options__create_with_driving_license__description": "Create New ABHA Number Using Driving License", @@ -666,6 +667,7 @@ "full_name": "Full Name", "full_screen": "Full Screen", "gender": "Gender", + "generate_link_abha": "Generate/Link ABHA Number", "generate_report": "Generate Report", "generated_summary_caution": "This is a computer generated summary using the information captured in the CARE system.", "generating": "Generating",