diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f1459744f..36d0669902 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,38 @@ +## [101.20.2](https://github.com/dhis2/capture-app/compare/v101.20.1...v101.20.2) (2024-12-22) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([a463047](https://github.com/dhis2/capture-app/commit/a4630471d77804436c8803daed4bd05e5c61f2c7)) + +## [101.20.1](https://github.com/dhis2/capture-app/compare/v101.20.0...v101.20.1) (2024-12-19) + + +### Bug Fixes + +* [DHIS2-118654] Use importStrategy=DELETE to support older backend ([#3914](https://github.com/dhis2/capture-app/issues/3914)) ([eb5325e](https://github.com/dhis2/capture-app/commit/eb5325e71087c0e00011878bd58f2fef3ad55eea)) + +# [101.20.0](https://github.com/dhis2/capture-app/compare/v101.19.4...v101.20.0) (2024-12-17) + + +### Features + +* [DHIS2-18017] Ability to unlink event from edit/view event page ([#3846](https://github.com/dhis2/capture-app/issues/3846)) ([ad352f5](https://github.com/dhis2/capture-app/commit/ad352f5845a8780668ecf5659100f650c697d426)) + +## [101.19.4](https://github.com/dhis2/capture-app/compare/v101.19.3...v101.19.4) (2024-12-15) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([ef97375](https://github.com/dhis2/capture-app/commit/ef973753e9014541c22215ea0690fecb819c82e3)) + +## [101.19.3](https://github.com/dhis2/capture-app/compare/v101.19.2...v101.19.3) (2024-12-13) + + +### Bug Fixes + +* [DHIS2-18614] prevent runtime error when only one date range is selected ([#3906](https://github.com/dhis2/capture-app/issues/3906)) ([4699a84](https://github.com/dhis2/capture-app/commit/4699a84b138a17bc42fae5be6685a71b840c1a43)) + ## [101.19.2](https://github.com/dhis2/capture-app/compare/v101.19.1...v101.19.2) (2024-12-08) diff --git a/cypress/e2e/EnrollmentAddEventPage/EnrollmentAddEventPageForm/EnrollmentAddEventPageForm.feature b/cypress/e2e/EnrollmentAddEventPage/EnrollmentAddEventPageForm/EnrollmentAddEventPageForm.feature index e74ed7c4f8..f6ac348149 100644 --- a/cypress/e2e/EnrollmentAddEventPage/EnrollmentAddEventPageForm/EnrollmentAddEventPageForm.feature +++ b/cypress/e2e/EnrollmentAddEventPage/EnrollmentAddEventPageForm/EnrollmentAddEventPageForm.feature @@ -21,9 +21,9 @@ Feature: User interacts with the Enrollment New Event Workspace And the user selects Positive And you click the Save without completing button Then all events should be displayed - And the newest event in datatable nr 1 should contain Active - And the newest event in datatable nr 1 should contain 13 - And the newest event in datatable nr 1 should contain Positive + And the newest event in datatable nr 2 should contain Active + And the newest event in datatable nr 2 should contain 13 + And the newest event in datatable nr 2 should contain Positive And the events in Sputum smear microscopy are deleted Scenario: Required fields should display an error when saving without data diff --git a/cypress/e2e/EnrollmentAddEventPage/EnrollmentAddEventPageForm/EnrollmentAddEventPageForm.js b/cypress/e2e/EnrollmentAddEventPage/EnrollmentAddEventPageForm/EnrollmentAddEventPageForm.js index 7a8523cfa6..8870d88e19 100644 --- a/cypress/e2e/EnrollmentAddEventPage/EnrollmentAddEventPageForm/EnrollmentAddEventPageForm.js +++ b/cypress/e2e/EnrollmentAddEventPage/EnrollmentAddEventPageForm/EnrollmentAddEventPageForm.js @@ -132,7 +132,7 @@ Then('all events should be displayed', () => { }); Then(/^the newest event in datatable nr (.*) should contain (.*)$/, (eq, status) => { - cy.get('[data-test="dhis2-uicore-datatable"]') + cy.get('[data-test="stage-content"]') .eq(eq) .within(() => { cy.get('[data-test="dhis2-uicore-datatablerow"]') diff --git a/cypress/e2e/EnrollmentEditEventPage/EnrollmentEditEventPageForm/EnrollmentEditEventPageForm.feature b/cypress/e2e/EnrollmentEditEventPage/EnrollmentEditEventPageForm/EnrollmentEditEventPageForm.feature index 31ab0f99c8..b0eb978b21 100644 --- a/cypress/e2e/EnrollmentEditEventPage/EnrollmentEditEventPageForm/EnrollmentEditEventPageForm.feature +++ b/cypress/e2e/EnrollmentEditEventPage/EnrollmentEditEventPageForm/EnrollmentEditEventPageForm.feature @@ -77,6 +77,7 @@ And the user see the following text: 11 When the user clicks on the cancel button Then the user is navigated to the enrollment dashboard +@with-restore-event-schedule-date Scenario: User can update schedule date for a scheduled event Given you land on the enrollment event page with selected Person by having typed /#/enrollmentEventEdit?eventId=RIrfCcEP8Uu&orgUnitId=DiszpKrYNg8 Then the view enrollment event form is in edit mode diff --git a/cypress/e2e/EnrollmentEditEventPage/EnrollmentEditEventPageForm/EnrollmentEditEventPageForm.js b/cypress/e2e/EnrollmentEditEventPage/EnrollmentEditEventPageForm/EnrollmentEditEventPageForm.js index 3f42786176..46c7045b98 100644 --- a/cypress/e2e/EnrollmentEditEventPage/EnrollmentEditEventPageForm/EnrollmentEditEventPageForm.js +++ b/cypress/e2e/EnrollmentEditEventPage/EnrollmentEditEventPageForm/EnrollmentEditEventPageForm.js @@ -1,6 +1,18 @@ -import { defineStep as And, Given, Then, When } from '@badeball/cypress-cucumber-preprocessor'; +import { defineStep as And, Given, Then, When, Before } from '@badeball/cypress-cucumber-preprocessor'; import { getCurrentYear } from '../../../support/date'; +Before({ tags: '@with-restore-event-schedule-date' }, () => { + cy.buildApiUrl('tracker', 'events/RIrfCcEP8Uu') + .then(url => cy.request(url)) + .then((apiResponse) => { + const event = apiResponse.body; + const eventToUpdate = { ...event, scheduledAt: `${getCurrentYear() - 15}-01-07` }; + return cy + .buildApiUrl('tracker?async=false&importStrategy=UPDATE') + .then(eventUrl => cy.request('POST', eventUrl, { events: [eventToUpdate] })); + }); +}); + const changeEnrollmentAndEventsStatus = () => ( cy.buildApiUrl( 'tracker', diff --git a/i18n/ar_IQ.po b/i18n/ar_IQ.po index a599e064d5..62ad611d9c 100644 --- a/i18n/ar_IQ.po +++ b/i18n/ar_IQ.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2024-11-07T11:57:59.094Z\n" +"POT-Creation-Date: 2024-12-03T10:58:18.077Z\n" "PO-Revision-Date: 2019-06-27 07:31+0000\n" "Last-Translator: KRG HIS , 2024\n" "Language-Team: Arabic (Iraq) (https://app.transifex.com/hisp-uio/teams/100509/ar_IQ/)\n" @@ -120,66 +120,6 @@ msgstr "يتم التحقق من القيمة" msgid "Async field update failed" msgstr "فشل تحديث حقل متزامن" -msgid "A value is required" -msgstr "قيمة مطلوبة" - -msgid "Please provide a valid number" -msgstr "نرجوا ادخال صيغة رقمية صحيحة" - -msgid "Please provide a valid integer" -msgstr "من فضلك ادخل رقم صحيح، من غير كسر" - -msgid "Please provide a positive integer" -msgstr "من فضلك ادخل رقم صحيح موجب" - -msgid "Please provide zero or a positive integer" -msgstr "من فضلك ادخل عدد صحيح موجب، أو صفر" - -msgid "Please provide a negative integer" -msgstr "من فضلك ادخل احد الأعداد الصحيحة السالبة" - -msgid "Please provide a valid date" -msgstr "نرجوا ادخال صيغة صحيحة للتاريخ" - -msgid "A date in the future is not allowed" -msgstr "" - -msgid "Please provide a valid date and time" -msgstr "من فضلك ادخل صيغة صحيحة للتاريخ والوقت" - -msgid "Please provide a valid time" -msgstr "من فضلك ادخل صيغة صحيحة للوقت" - -msgid "Please provide an integer between 0 and 100" -msgstr "" - -msgid "Please provide a valid url" -msgstr "يرجى ادخال صيغة ارتباط تشعبي سليمة" - -msgid "Please provide a valid email address" -msgstr "من فضلك ادخل صيغة بريد الكتروني سليمة" - -msgid "Please provide a valid age" -msgstr "من فضلك ادخل صيغة عمرية سليمة" - -msgid "Please provide a valid phone number" -msgstr "من فضلك ادخل صيغة رقم تلفون سليمة" - -msgid "Please provide a valid organisation unit" -msgstr "من فضلك ادخل وحدة تنظيمية صالحة" - -msgid "Please provide valid coordinates" -msgstr "من فضلك ادخل صيغة احداثيات سليمة" - -msgid "This value already exists" -msgstr "هذه القيمة موجودة مسبقاً" - -msgid "\"From\" cannot be greater than \"To\"" -msgstr "لا يمكن ان تكون \"من\" اكبر من \"إلى\"" - -msgid "Checking..." -msgstr "يتم الفحص" - msgid "Area" msgstr "مساحة" @@ -192,6 +132,12 @@ msgstr "التسجيل" msgid "Complete event" msgstr "" +msgid "A value is required" +msgstr "قيمة مطلوبة" + +msgid "Please provide a valid date" +msgstr "نرجوا ادخال صيغة صحيحة للتاريخ" + msgid "{{ stageName }} - Basic info" msgstr "" @@ -204,8 +150,8 @@ msgstr "" msgid "Please select {{categoryName}}" msgstr "" -msgid "A future date is not allowed" -msgstr "غير مسموح تاريخ بالمستقبل" +msgid "A date in the future is not allowed" +msgstr "" msgid "Saving a new enrollment in {{programName}} in {{orgUnitName}}." msgstr "" @@ -1184,6 +1130,9 @@ msgstr "" msgid "Coordinates" msgstr "" +msgid "Please provide valid coordinates" +msgstr "من فضلك ادخل صيغة احداثيات سليمة" + msgid "Delete polygon" msgstr "حذف المضلع" @@ -1440,6 +1389,12 @@ msgstr "" msgid "Report date" msgstr "" +msgid "Please enter a date" +msgstr "" + +msgid "Please provide a valid organisation unit" +msgstr "من فضلك ادخل وحدة تنظيمية صالحة" + msgid "Please select a valid event" msgstr "" @@ -1944,6 +1899,60 @@ msgstr "" msgid "Error updating the Assignee" msgstr "" +msgid "Please provide a valid number" +msgstr "نرجوا ادخال صيغة رقمية صحيحة" + +msgid "Please provide a valid integer" +msgstr "من فضلك ادخل رقم صحيح، من غير كسر" + +msgid "Please provide a positive integer" +msgstr "من فضلك ادخل رقم صحيح موجب" + +msgid "Please provide zero or a positive integer" +msgstr "من فضلك ادخل عدد صحيح موجب، أو صفر" + +msgid "Please provide a negative integer" +msgstr "من فضلك ادخل احد الأعداد الصحيحة السالبة" + +msgid "Please provide a valid date and time" +msgstr "من فضلك ادخل صيغة صحيحة للتاريخ والوقت" + +msgid "Please provide a valid time" +msgstr "من فضلك ادخل صيغة صحيحة للوقت" + +msgid "Please provide an integer between 0 and 100" +msgstr "" + +msgid "Please provide a valid url" +msgstr "يرجى ادخال صيغة ارتباط تشعبي سليمة" + +msgid "Please provide a valid email address" +msgstr "من فضلك ادخل صيغة بريد الكتروني سليمة" + +msgid "Please provide a valid age" +msgstr "من فضلك ادخل صيغة عمرية سليمة" + +msgid "Please provide a valid phone number" +msgstr "من فضلك ادخل صيغة رقم تلفون سليمة" + +msgid "This value already exists" +msgstr "هذه القيمة موجودة مسبقاً" + +msgid "\"From\" cannot be greater than \"To\"" +msgstr "لا يمكن ان تكون \"من\" اكبر من \"إلى\"" + +msgid "Checking..." +msgstr "يتم الفحص" + +msgid "Please provide a valid positive integer" +msgstr "" + +msgid "Please enter a valid time" +msgstr "" + +msgid "Please enter a time" +msgstr "" + msgid "Set coordinate" msgstr "ضبط الإحداثية" diff --git a/i18n/ckb.po b/i18n/ckb.po index 53cbcbe935..5dc8e3c17c 100644 --- a/i18n/ckb.po +++ b/i18n/ckb.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2024-11-07T11:57:59.094Z\n" +"POT-Creation-Date: 2024-12-03T10:58:18.077Z\n" "PO-Revision-Date: 2019-06-27 07:31+0000\n" "Last-Translator: Viktor Varland , 2024\n" "Language-Team: Central Kurdish (https://app.transifex.com/hisp-uio/teams/100509/ckb/)\n" @@ -122,66 +122,6 @@ msgstr "ئەم نرخە دەسەلمێندرێت" msgid "Async field update failed" msgstr "ئەبدەیتکردنی خانەکە سەرکەوتوو نەبوو. " -msgid "A value is required" -msgstr "نرخێک پێویستە" - -msgid "Please provide a valid number" -msgstr "تکایە ژمارەیەکی درووست بنووسە" - -msgid "Please provide a valid integer" -msgstr "تکایە ژمارەیەکی درووست بنووسە" - -msgid "Please provide a positive integer" -msgstr "تکایە ژمارەیەکی پۆسەتیڤ بنووسە" - -msgid "Please provide zero or a positive integer" -msgstr "تکایە ژمارەیەکی پۆسەتیڤ یاخود سفر بنووسە" - -msgid "Please provide a negative integer" -msgstr "تکایە ژمارەیەکی نێگەتیڤ بنووسە" - -msgid "Please provide a valid date" -msgstr "تکایە بەروارێکی درووست بنووسە" - -msgid "A date in the future is not allowed" -msgstr "" - -msgid "Please provide a valid date and time" -msgstr "تکایە بەروارو کاتێکی درووست بنووسە" - -msgid "Please provide a valid time" -msgstr "تکایە کاتێکی درووست بنووسە" - -msgid "Please provide an integer between 0 and 100" -msgstr "" - -msgid "Please provide a valid url" -msgstr "تکایە یو URLێکی درووست بنووسە" - -msgid "Please provide a valid email address" -msgstr "تکایە ئیمەیڵێکی درووست بنووسە" - -msgid "Please provide a valid age" -msgstr "تکایە تەمەنێکی درووست بنووسە" - -msgid "Please provide a valid phone number" -msgstr "تکایە ژمارە مۆبایلێکی درووست بنووسە" - -msgid "Please provide a valid organisation unit" -msgstr "تکایە ئۆرگانیزەیشن یونتێکی درووست بنووسە" - -msgid "Please provide valid coordinates" -msgstr "تکایە کۆردینەیتی درووستی سەر نەخشە بنووسە" - -msgid "This value already exists" -msgstr "ئەم نرخە پێشوتر هەبووە" - -msgid "\"From\" cannot be greater than \"To\"" -msgstr "\"From\"ناکرێت گەورەتربێت لە \"To\"" - -msgid "Checking..." -msgstr "پشکنین..." - msgid "Area" msgstr "ناوچە" @@ -194,6 +134,12 @@ msgstr "تۆمارکردن" msgid "Complete event" msgstr "" +msgid "A value is required" +msgstr "نرخێک پێویستە" + +msgid "Please provide a valid date" +msgstr "تکایە بەروارێکی درووست بنووسە" + msgid "{{ stageName }} - Basic info" msgstr "" @@ -206,8 +152,8 @@ msgstr "" msgid "Please select {{categoryName}}" msgstr "" -msgid "A future date is not allowed" -msgstr "بەرواری داهاتوو ناکرێت تۆماربکرێت" +msgid "A date in the future is not allowed" +msgstr "" msgid "Saving a new enrollment in {{programName}} in {{orgUnitName}}." msgstr "" @@ -1186,6 +1132,9 @@ msgstr "" msgid "Coordinates" msgstr "" +msgid "Please provide valid coordinates" +msgstr "تکایە کۆردینەیتی درووستی سەر نەخشە بنووسە" + msgid "Delete polygon" msgstr "فرەلاکە بسڕەوە" @@ -1434,6 +1383,12 @@ msgstr "" msgid "Report date" msgstr "" +msgid "Please enter a date" +msgstr "" + +msgid "Please provide a valid organisation unit" +msgstr "تکایە ئۆرگانیزەیشن یونتێکی درووست بنووسە" + msgid "Please select a valid event" msgstr "" @@ -1898,6 +1853,60 @@ msgstr "" msgid "Error updating the Assignee" msgstr "" +msgid "Please provide a valid number" +msgstr "تکایە ژمارەیەکی درووست بنووسە" + +msgid "Please provide a valid integer" +msgstr "تکایە ژمارەیەکی درووست بنووسە" + +msgid "Please provide a positive integer" +msgstr "تکایە ژمارەیەکی پۆسەتیڤ بنووسە" + +msgid "Please provide zero or a positive integer" +msgstr "تکایە ژمارەیەکی پۆسەتیڤ یاخود سفر بنووسە" + +msgid "Please provide a negative integer" +msgstr "تکایە ژمارەیەکی نێگەتیڤ بنووسە" + +msgid "Please provide a valid date and time" +msgstr "تکایە بەروارو کاتێکی درووست بنووسە" + +msgid "Please provide a valid time" +msgstr "تکایە کاتێکی درووست بنووسە" + +msgid "Please provide an integer between 0 and 100" +msgstr "" + +msgid "Please provide a valid url" +msgstr "تکایە یو URLێکی درووست بنووسە" + +msgid "Please provide a valid email address" +msgstr "تکایە ئیمەیڵێکی درووست بنووسە" + +msgid "Please provide a valid age" +msgstr "تکایە تەمەنێکی درووست بنووسە" + +msgid "Please provide a valid phone number" +msgstr "تکایە ژمارە مۆبایلێکی درووست بنووسە" + +msgid "This value already exists" +msgstr "ئەم نرخە پێشوتر هەبووە" + +msgid "\"From\" cannot be greater than \"To\"" +msgstr "\"From\"ناکرێت گەورەتربێت لە \"To\"" + +msgid "Checking..." +msgstr "پشکنین..." + +msgid "Please provide a valid positive integer" +msgstr "" + +msgid "Please enter a valid time" +msgstr "" + +msgid "Please enter a time" +msgstr "" + msgid "Set coordinate" msgstr "هێڵی درێژی و پانی دیاریبکە" diff --git a/i18n/en.pot b/i18n/en.pot index afccea8bc5..2f414dc91a 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2024-12-03T10:58:18.077Z\n" -"PO-Revision-Date: 2024-12-03T10:58:18.077Z\n" +"POT-Creation-Date: 2024-12-05T11:39:04.447Z\n" +"PO-Revision-Date: 2024-12-05T11:39:04.447Z\n" msgid "Choose one or more dates..." msgstr "Choose one or more dates..." @@ -1466,9 +1466,44 @@ msgstr "{{ scheduledEvents }} scheduled" msgid "Stages and Events" msgstr "Stages and Events" +msgid "An error occurred while unlinking and deleting the event." +msgstr "An error occurred while unlinking and deleting the event." + +msgid "Unlink and delete linked event" +msgstr "Unlink and delete linked event" + +msgid "" +"Are you sure you want to remove the link and delete the linked event? This " +"action permanently removes the link, linked event, and all related data." +msgstr "" +"Are you sure you want to remove the link and delete the linked event? This " +"action permanently removes the link, linked event, and all related data." + +msgid "Yes, unlink and delete linked event" +msgstr "Yes, unlink and delete linked event" + +msgid "Unlink event" +msgstr "Unlink event" + +msgid "" +"Are you sure you want to remove the link between these events? This action " +"removes the link itself, but the linked event will remain." +msgstr "" +"Are you sure you want to remove the link between these events? This action " +"removes the link itself, but the linked event will remain." + +msgid "Yes, unlink event" +msgstr "Yes, unlink event" + msgid "View linked event" msgstr "View linked event" +msgid "You do not have access to remove the link between these events" +msgstr "You do not have access to remove the link between these events" + +msgid "You do not have access to remove the link and delete the linked event" +msgstr "You do not have access to remove the link and delete the linked event" + msgid "An error occurred while loading the widget." msgstr "An error occurred while loading the widget." diff --git a/i18n/es_419.po b/i18n/es_419.po index f996ede3ef..96fc75f7af 100644 --- a/i18n/es_419.po +++ b/i18n/es_419.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2024-10-25T18:18:11.518Z\n" +"POT-Creation-Date: 2024-12-03T10:58:18.077Z\n" "PO-Revision-Date: 2019-06-27 07:31+0000\n" "Last-Translator: Jaime Bosque , 2024\n" "Language-Team: Spanish (Latin America) (https://app.transifex.com/hisp-uio/teams/100509/es_419/)\n" @@ -46,6 +46,39 @@ msgstr "" " a utilizar esta versión, pero tenga en cuenta que esto cerrará otras " "versiones." +msgid "Enrollment dashboard" +msgstr "" + +msgid "View event" +msgstr "" + +msgid "Edit event" +msgstr "Editar evento" + +msgid "New event" +msgstr "Evento nuevo" + +msgid "Active enrollments" +msgstr "" + +msgid "Completed enrollments" +msgstr "" + +msgid "Cancelled enrollments" +msgstr "" + +msgid "{{trackedEntityName}} list" +msgstr "" + +msgid "Search" +msgstr "Buscar" + +msgid "Working List" +msgstr "" + +msgid "Event list" +msgstr "" + msgid "More" msgstr "" @@ -91,66 +124,6 @@ msgstr "Este valor está siendo validado" msgid "Async field update failed" msgstr "La actualización del campo asíncrono falló" -msgid "A value is required" -msgstr "Se requiere un valor" - -msgid "Please provide a valid number" -msgstr "Proporcione un número válido" - -msgid "Please provide a valid integer" -msgstr "Proporcione un número entero válido" - -msgid "Please provide a positive integer" -msgstr "Proporcione un número entero positivo" - -msgid "Please provide zero or a positive integer" -msgstr "Proporcione cero o un número entero positivo" - -msgid "Please provide a negative integer" -msgstr "Proporcione un número entero negativo" - -msgid "Please provide a valid date" -msgstr "Proporcione una fecha válida" - -msgid "A date in the future is not allowed" -msgstr "No se permite una fecha en el futuro" - -msgid "Please provide a valid date and time" -msgstr "Proporcione una fecha y hora válidas" - -msgid "Please provide a valid time" -msgstr "Proporcione una hora válida" - -msgid "Please provide an integer between 0 and 100" -msgstr "Proporcione un número entero entre 0 y 100" - -msgid "Please provide a valid url" -msgstr "Proporcione una URL válida" - -msgid "Please provide a valid email address" -msgstr "Por favor ingrese una dirección de correo electrónico válida" - -msgid "Please provide a valid age" -msgstr "Proporcione una edad válida" - -msgid "Please provide a valid phone number" -msgstr "Por favor provea un número de teléfono válido" - -msgid "Please provide a valid organisation unit" -msgstr "Proporcione una unidad organizativa válida" - -msgid "Please provide valid coordinates" -msgstr "Proporcione coordenadas válidas" - -msgid "This value already exists" -msgstr "Este valor ya existe" - -msgid "\"From\" cannot be greater than \"To\"" -msgstr "\"Desde\" no puede ser mayor que \"Hasta\"" - -msgid "Checking..." -msgstr "Verificando..." - msgid "Area" msgstr "Área" @@ -163,6 +136,12 @@ msgstr "Inscripción" msgid "Complete event" msgstr "Evento completo" +msgid "A value is required" +msgstr "Se requiere un valor" + +msgid "Please provide a valid date" +msgstr "Proporcione una fecha válida" + msgid "{{ stageName }} - Basic info" msgstr "{{ stageName }} - Información básica" @@ -175,8 +154,8 @@ msgstr "{{ stageName }} - Estado" msgid "Please select {{categoryName}}" msgstr "Seleccione {{categoryName}}." -msgid "A future date is not allowed" -msgstr "No se permite una fecha futura" +msgid "A date in the future is not allowed" +msgstr "No se permite una fecha en el futuro" msgid "Saving a new enrollment in {{programName}} in {{orgUnitName}}." msgstr "" @@ -307,9 +286,6 @@ msgstr "Sí, descartar cambios" msgid "No, cancel" msgstr "No, cancelar" -msgid "New event" -msgstr "Evento nuevo" - msgid "You don't have access to create an event in the current selections" msgstr "No tienes acceso para crear un evento en las selecciones actuales" @@ -533,9 +509,6 @@ msgstr "Escriba para filtrar opciones" msgid "No match found" msgstr "No se han encontraron resultados" -msgid "Search" -msgstr "Buscar" - msgid "Clear" msgstr "Limpiar" @@ -882,9 +855,6 @@ msgstr "evento" msgid "You don't have access to edit this event" msgstr "No tienes acceso para editar este evento." -msgid "Edit event" -msgstr "Editar evento" - msgid "View changelog" msgstr "" @@ -922,15 +892,6 @@ msgstr "No se pudo cargar el evento" msgid "Organisation unit could not be loaded" msgstr "No se pudo cargar la unidad organizativa" -msgid "Dashboard" -msgstr "" - -msgid "Edit Event" -msgstr "" - -msgid "View Event" -msgstr "" - msgid "Selected program" msgstr "Programa seleccionado" @@ -959,6 +920,9 @@ msgstr "" msgid "An error occurred while loading the form" msgstr "" +msgid "Back to all stages and events" +msgstr "Volver a todas las etapas y eventos" + msgid "Possible duplicates found" msgstr "Posibles duplicados encontrados." @@ -1196,6 +1160,9 @@ msgstr "" msgid "Coordinates" msgstr "" +msgid "Please provide valid coordinates" +msgstr "Proporcione coordenadas válidas" + msgid "Delete polygon" msgstr "" @@ -1283,6 +1250,9 @@ msgstr "Advertencia" msgid "stage not found in rules execution" msgstr "" +msgid "Please provide an valid organisation unit" +msgstr "" + msgid "Delete event" msgstr "Eliminar evento" @@ -1301,9 +1271,6 @@ msgstr "Evento completado" msgid "The event cannot be edited after it has been completed" msgstr "" -msgid "Back to all stages and events" -msgstr "Volver a todas las etapas y eventos" - msgid "Notes about this event" msgstr "" @@ -1446,6 +1413,12 @@ msgstr "" msgid "Report date" msgstr "Fecha de reporte" +msgid "Please enter a date" +msgstr "" + +msgid "Please provide a valid organisation unit" +msgstr "Proporcione una unidad organizativa válida" + msgid "Please select a valid event" msgstr "" @@ -1502,10 +1475,18 @@ msgstr "" msgid "Stages and Events" msgstr "" +msgid "View linked event" +msgstr "" + msgid "An error occurred while loading the widget." msgstr "" -msgid "View linked event" +msgid "Linked event" +msgstr "" + +msgid "" +"This {{stageName}} event is linked to a {{linkedStageName}} event. Review " +"the linked event details before entering data below" msgstr "" msgid "Scheduled" @@ -1541,6 +1522,12 @@ msgstr "" msgid "Value" msgstr "Valor" +msgid "File" +msgstr "" + +msgid "Image" +msgstr "" + msgid "New {{trackedEntityTypeName}} relationship" msgstr "" @@ -1601,6 +1588,46 @@ msgstr "" msgid "an error occurred loading working lists" msgstr "" +msgid "You do not have access to complete events" +msgstr "" + +msgid "Complete events" +msgstr "" + +msgid "Are you sure you want to complete all active events in selection?" +msgstr "" + +msgid "There are no active events to complete in the current selection." +msgstr "" + +msgid "Error completing events" +msgstr "" + +msgid "There was an error completing the events." +msgstr "" + +msgid "Details (Advanced)" +msgstr "" + +msgid "An unknown error occurred." +msgstr "" + +msgid "An error occurred while completing events" +msgstr "" + +msgid "An error occurred while deleting the events" +msgstr "" + +msgid "You do not have access to delete events" +msgstr "" + +msgid "Delete events" +msgstr "" + +msgid "" +"This cannot be undone. Are you sure you want to delete the selected events?" +msgstr "" + msgid "Registration Date" msgstr "" @@ -1616,13 +1643,128 @@ msgstr "Seguimiento" msgid "Choose a program stage to filter by {{label}}" msgstr "" -msgid "Active enrollments" +msgid "" +"Some enrollments were completed successfully, but there was an error while " +"completing the rest. Please see the details below." msgstr "" -msgid "Completed enrollments" +msgid "" +"There was an error while completing the enrollments. Please see the details " +"below." msgstr "" -msgid "Cancelled enrollments" +msgid "" +"An unexpected error occurred while fetching the enrollments. Please try " +"again." +msgstr "" + +msgid "" +"There are currently no active enrollments in the selection. All enrollments " +"are already completed or cancelled." +msgstr "" + +msgid "" +"This action will complete {{count}} active enrollment in your selection." +msgid_plural "" +"This action will complete {{count}} active enrollment in your selection." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "{{count}} enrollment already marked as completed will not be changed." +msgid_plural "" +"{{count}} enrollment already marked as completed will not be changed." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "Mark all events within enrollments as complete" +msgstr "" + +msgid "You do not have access to bulk complete enrollments" +msgstr "" + +msgid "Complete enrollments" +msgstr "" + +msgid "Error completing enrollments" +msgstr "" + +msgid "No active enrollments to complete" +msgstr "" + +msgid "Complete {{count}} enrollment" +msgid_plural "Complete {{count}} enrollment" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "An error occurred when completing the enrollments" +msgstr "" + +msgid "An unknown error occurred when completing enrollments" +msgstr "" + +msgid "You do not have access to delete enrollments" +msgstr "" + +msgid "Delete enrollments" +msgstr "" + +msgid "Delete selected enrollments" +msgstr "" + +msgid "" +"An error occurred while loading the selected enrollments. Please try again." +msgstr "" + +msgid "" +"This action will permanently delete the selected enrollments, including all " +"associated data and events." +msgstr "" + +msgid "Active enrollments ({{count}})" +msgid_plural "Active enrollments ({{count}})" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "Completed enrollments ({{count}})" +msgid_plural "Completed enrollments ({{count}})" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "Cancelled enrollments ({{count}})" +msgid_plural "Cancelled enrollments ({{count}})" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "Delete {{count}} enrollment" +msgid_plural "Delete {{count}} enrollment" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "An error occurred when deleting enrollments" +msgstr "" + +msgid "Delete {{ trackedEntityName }} with all enrollments" +msgstr "" + +msgid "Delete {{count}} {{ trackedEntityName }}" +msgid_plural "Delete {{count}} {{ trackedEntityName }}" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "" +"Deleting records will also delete any associated enrollments and events. " +"This cannot be undone. Are you sure you want to delete?" +msgstr "" + +msgid "An error occurred while deleting the records" msgstr "" msgid "Working list could not be updated" @@ -1634,6 +1776,15 @@ msgstr "" msgid "an error occurred loading Tracked entity instance lists" msgstr "" +msgid "{{count}} selected" +msgid_plural "{{count}} selected" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "Deselect all" +msgstr "" + msgid "Update view" msgstr "" @@ -1742,6 +1893,60 @@ msgstr "" msgid "Error updating the Assignee" msgstr "" +msgid "Please provide a valid number" +msgstr "Proporcione un número válido" + +msgid "Please provide a valid integer" +msgstr "Proporcione un número entero válido" + +msgid "Please provide a positive integer" +msgstr "Proporcione un número entero positivo" + +msgid "Please provide zero or a positive integer" +msgstr "Proporcione cero o un número entero positivo" + +msgid "Please provide a negative integer" +msgstr "Proporcione un número entero negativo" + +msgid "Please provide a valid date and time" +msgstr "Proporcione una fecha y hora válidas" + +msgid "Please provide a valid time" +msgstr "Proporcione una hora válida" + +msgid "Please provide an integer between 0 and 100" +msgstr "Proporcione un número entero entre 0 y 100" + +msgid "Please provide a valid url" +msgstr "Proporcione una URL válida" + +msgid "Please provide a valid email address" +msgstr "Por favor ingrese una dirección de correo electrónico válida" + +msgid "Please provide a valid age" +msgstr "Proporcione una edad válida" + +msgid "Please provide a valid phone number" +msgstr "Por favor provea un número de teléfono válido" + +msgid "This value already exists" +msgstr "Este valor ya existe" + +msgid "\"From\" cannot be greater than \"To\"" +msgstr "\"Desde\" no puede ser mayor que \"Hasta\"" + +msgid "Checking..." +msgstr "Verificando..." + +msgid "Please provide a valid positive integer" +msgstr "" + +msgid "Please enter a valid time" +msgstr "" + +msgid "Please enter a time" +msgstr "" + msgid "Set coordinate" msgstr "" diff --git a/i18n/nb.po b/i18n/nb.po index 08dc43cc41..0cf4fcf440 100644 --- a/i18n/nb.po +++ b/i18n/nb.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2024-12-03T10:58:18.077Z\n" +"POT-Creation-Date: 2024-12-05T11:39:04.447Z\n" "PO-Revision-Date: 2019-06-27 07:31+0000\n" "Last-Translator: Karoline Tufte Lien , 2024\n" "Language-Team: Norwegian Bokmål (https://app.transifex.com/hisp-uio/teams/100509/nb/)\n" @@ -45,10 +45,10 @@ msgstr "" "at dette vil lukke andre versjoner." msgid "Enrollment dashboard" -msgstr "" +msgstr "Registreringsdashbord" msgid "View event" -msgstr "" +msgstr "Vis hendelse" msgid "Edit event" msgstr "Rediger hendelse" @@ -66,16 +66,16 @@ msgid "Cancelled enrollments" msgstr "Avbrutte registreringer" msgid "{{trackedEntityName}} list" -msgstr "" +msgstr "{{trackedEntityName}}-liste" msgid "Search" msgstr "Søk" msgid "Working List" -msgstr "" +msgstr "Arbeidsliste" msgid "Event list" -msgstr "" +msgstr "Hendelsesliste" msgid "More" msgstr "Mer" @@ -1495,9 +1495,40 @@ msgstr "{{ scheduledEvents }} planlagt" msgid "Stages and Events" msgstr "Faser og hendelser" +msgid "An error occurred while unlinking and deleting the event." +msgstr "" + +msgid "Unlink and delete linked event" +msgstr "" + +msgid "" +"Are you sure you want to remove the link and delete the linked event? This " +"action permanently removes the link, linked event, and all related data." +msgstr "" + +msgid "Yes, unlink and delete linked event" +msgstr "" + +msgid "Unlink event" +msgstr "" + +msgid "" +"Are you sure you want to remove the link between these events? This action " +"removes the link itself, but the linked event will remain." +msgstr "" + +msgid "Yes, unlink event" +msgstr "" + msgid "View linked event" msgstr "Vis knyttede hendelser" +msgid "You do not have access to remove the link between these events" +msgstr "" + +msgid "You do not have access to remove the link and delete the linked event" +msgstr "" + msgid "An error occurred while loading the widget." msgstr "En feil oppstå ved lasting av widget. " diff --git a/i18n/ru.po b/i18n/ru.po index ffa9169d93..87410243b9 100644 --- a/i18n/ru.po +++ b/i18n/ru.po @@ -2,16 +2,16 @@ # Translators: # Ulanbek Abakirov , 2020 # Wanda , 2021 -# Yury Rogachev , 2024 # Viktor Varland , 2024 # Philip Larsen Donnelly, 2024 +# Yury Rogachev , 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" "POT-Creation-Date: 2024-12-03T10:58:18.077Z\n" "PO-Revision-Date: 2019-06-27 07:31+0000\n" -"Last-Translator: Philip Larsen Donnelly, 2024\n" +"Last-Translator: Yury Rogachev , 2024\n" "Language-Team: Russian (https://app.transifex.com/hisp-uio/teams/100509/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -47,10 +47,10 @@ msgstr "" "использовать эту версию, но имейте в виду, что другие версии будут закрыты." msgid "Enrollment dashboard" -msgstr "" +msgstr "Регистрационная инфопанель" msgid "View event" -msgstr "" +msgstr "Посмотреть событие" msgid "Edit event" msgstr "Редактировать событие" @@ -68,13 +68,13 @@ msgid "Cancelled enrollments" msgstr "Отмененные регистрационные записи" msgid "{{trackedEntityName}} list" -msgstr "" +msgstr "Список: {{trackedEntityName}} " msgid "Search" msgstr "Поиск" msgid "Working List" -msgstr "" +msgstr " Рабочий список" msgid "Event list" msgstr "" diff --git a/i18n/uz_UZ_Cyrl.po b/i18n/uz_UZ_Cyrl.po index df5e775c4a..e972c65b3a 100644 --- a/i18n/uz_UZ_Cyrl.po +++ b/i18n/uz_UZ_Cyrl.po @@ -2,13 +2,14 @@ # Translators: # Philip Larsen Donnelly, 2024 # Khurshid Ibatov , 2024 +# Sharaf Yuldashev, 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2024-11-07T11:57:59.094Z\n" +"POT-Creation-Date: 2024-12-03T10:58:18.077Z\n" "PO-Revision-Date: 2019-06-27 07:31+0000\n" -"Last-Translator: Khurshid Ibatov , 2024\n" +"Last-Translator: Sharaf Yuldashev, 2024\n" "Language-Team: Uzbek (Cyrillic) (https://app.transifex.com/hisp-uio/teams/100509/uz@Cyrl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -44,49 +45,49 @@ msgstr "" "Илтимос, саҳифани янгиланг, аммо бошқа версиялар ёпилишини унутманг." msgid "Enrollment dashboard" -msgstr "" +msgstr "Қайд этиш инфопанели" msgid "View event" -msgstr "" +msgstr "Ҳодиса/вазиятни кўриш" msgid "Edit event" -msgstr "Ҳодиса/тадбирни таҳрирланг" +msgstr "Ҳодиса/вазиятни таҳрирлаш" msgid "New event" msgstr "Янги ҳодиса" msgid "Active enrollments" -msgstr "" +msgstr "Фаол Қайдномалар" msgid "Completed enrollments" -msgstr "" +msgstr "Якунларган Қайдномалар" msgid "Cancelled enrollments" -msgstr "" +msgstr "Бекор қилинган Қайдномалар" msgid "{{trackedEntityName}} list" -msgstr "" +msgstr "{{trackedEntityName}} рўйхати" msgid "Search" msgstr "Излаш" msgid "Working List" -msgstr "" +msgstr "Ишчи рўйхат" msgid "Event list" -msgstr "" +msgstr "Ҳодиса/вазиятлар рўйхати " msgid "More" msgstr "Кўпроқ" msgid "View {{programName}} dashboard" -msgstr "" +msgstr "{{programName}}-инфопанелини кўриш" msgid "View dashboard" msgstr "Бошқарув панелини кўриш" msgid "View active enrollment" -msgstr "Фаол рўйхатдан ўтаётганларни кўриш" +msgstr "Фаол рўйхатдан ўтганларни кўриш" msgid "Re-enroll" msgstr "Қайта рўйхатдан ўтиш" @@ -121,66 +122,6 @@ msgstr "Ушбу қиймат тасдиқланмоқда" msgid "Async field update failed" msgstr "Асинхрон майдон янгиланиши амалга ошмади" -msgid "A value is required" -msgstr "Қиймат талаб қилинади" - -msgid "Please provide a valid number" -msgstr "Илтимос, тўғри рақамни кўрсатинг" - -msgid "Please provide a valid integer" -msgstr "Илтимос, тўғри бутун сонни кўрсатинг" - -msgid "Please provide a positive integer" -msgstr "Илтимос, бутун мусбат сонни кўрсатинг" - -msgid "Please provide zero or a positive integer" -msgstr "Илтимос, ноль ёки бутун мусбат сонни кўрсатинг" - -msgid "Please provide a negative integer" -msgstr "Илтимос, бутун манфий сонни кўрсатинг" - -msgid "Please provide a valid date" -msgstr "Илтимос, тўғри санани кўрсатинг" - -msgid "A date in the future is not allowed" -msgstr "Келажакдаги сана қабул қилинмайди" - -msgid "Please provide a valid date and time" -msgstr "Илтимос, тегишли сана ва вақтни кўрсатинг" - -msgid "Please provide a valid time" -msgstr "Илтимос, тўғри вақтни кўрсатинг" - -msgid "Please provide an integer between 0 and 100" -msgstr "" - -msgid "Please provide a valid url" -msgstr "Илтимос, ҳақиқий URL манзилни кўрсатинг" - -msgid "Please provide a valid email address" -msgstr "Илтимос, амалдаги е-почта манзилини кўрсатинг" - -msgid "Please provide a valid age" -msgstr "Илтимос, тўғри ёшни кўрсатинг" - -msgid "Please provide a valid phone number" -msgstr "Илтимос, тўғри телефон рақамини кўрсатинг" - -msgid "Please provide a valid organisation unit" -msgstr "Илтимос, тўғри ташкилий бўлимни кўрсатинг" - -msgid "Please provide valid coordinates" -msgstr "Илтимос, тўғри координаталарни кўрсатинг" - -msgid "This value already exists" -msgstr "Бу қиймат аллақачон мавжуд" - -msgid "\"From\" cannot be greater than \"To\"" -msgstr "Сана \"гача\" катта бўлиши мумкин эмас сана \"дан\" " - -msgid "Checking..." -msgstr "Текширилмоқда..." - msgid "Area" msgstr "Майдон" @@ -193,20 +134,26 @@ msgstr "Рўйхатга олиш" msgid "Complete event" msgstr "Ҳодиса/тадбирни якунлаш" +msgid "A value is required" +msgstr "Қиймат талаб қилинади" + +msgid "Please provide a valid date" +msgstr "Илтимос, тўғри санани кўрсатинг" + msgid "{{ stageName }} - Basic info" -msgstr "" +msgstr "{{ stageName }} - Асосий ахборот" msgid "{{ stageName }} - Assignee" -msgstr "" +msgstr "{{ stageName }} - Топширилган шахс" msgid "{{ stageName }} - Status" -msgstr "" +msgstr "{{ stageName }} - статуси" msgid "Please select {{categoryName}}" -msgstr "" +msgstr "Куйидагини танланг: {{categoryName}}" -msgid "A future date is not allowed" -msgstr "Келажакдаги сана танловига рухсат берилмайди" +msgid "A date in the future is not allowed" +msgstr "Келажакдаги сана қабул қилинмайди" msgid "Saving a new enrollment in {{programName}} in {{orgUnitName}}." msgstr "" @@ -222,10 +169,10 @@ msgid "Metadata error. see log for details" msgstr "МетаМаълумотда хатолик. Тафсилотлар учун журналга қаранг." msgid "{{ stageName }} - Details" -msgstr "" +msgstr "{{ stageName }} - хақида батафсил" msgid "{{ stageName }} - {{ sectionName }}" -msgstr "" +msgstr "{{ stageName }} - {{ sectionName }}" msgid "Assigned user" msgstr "Тавсия этилган фойдаланувчи" @@ -275,7 +222,7 @@ msgid "Completed" msgstr "Тўлдирилди" msgid "Please add or cancel note before saving the event" -msgstr "" +msgstr "Холатни сақлашдан олдин эслатмани қўшинг ёки бекор қилинг" msgid "Save and add another" msgstr "Сақлаш ва бошқасини қўшиш" @@ -357,15 +304,16 @@ msgid "An error has occurred. See log for details" msgstr "Хатолик юз берди. Тафсилотлар учун журналга қаранг" msgid "{{programStageName}} completed" -msgstr "" +msgstr "{{programStageName}} - якунланди" msgid "" "Would you like to complete the enrollment and all active events as well?" msgstr "" +"Қайд этиш жараёнини ва барча фаол холатларни ҳам якунлашни истайсизми?" msgid "{{count}} event in {{programStageName}}" msgid_plural "{{count}} event in {{programStageName}}" -msgstr[0] "" +msgstr[0] "{{count}} кайднома(лар) {{programStageName}}-да мавжуд" msgid "Yes, complete enrollment and events" msgstr "" @@ -377,7 +325,7 @@ msgid "Would you like to complete the enrollment?" msgstr "" msgid "Complete enrollment" -msgstr "Қайд этишни якунлансин" +msgstr "Қайд этишни якунлаш" msgid "A duplicate exists (but there were some errors, see log for details" msgstr "" @@ -653,7 +601,7 @@ msgid "Close the notice" msgstr "" msgid "Enrollment with id \"{{enrollmentId}}\" does not exist" -msgstr "\"{{enrollmentId}}\" идентификатори билан қайд қилиш имконсиз" +msgstr "\"{{enrollmentId}}\" - номерли қайднома мавжуд эмас" msgid "Tracked entity instance with id \"{{teiId}}\" does not exist" msgstr "" @@ -667,7 +615,7 @@ msgid "" msgstr "" msgid "No feedback for this enrollment yet" -msgstr "Ушбу қайд этишда қайта алоқа ахбороти мавжуд эмас" +msgstr "Ушбу қайднома бўйича мулоҳаза хали берилмади" msgid "No indicator output for this enrollment yet" msgstr "Ушбу қайд этишда индикатор ахбороти мавжуд эмас" @@ -703,13 +651,13 @@ msgstr "" "{{programName}} тоифаларга эга. Панелни кўриш учун барча тоифаларни танланг." msgid "Invalid enrollment id {{enrollmentId}}." -msgstr "" +msgstr " {{enrollmentId}}- Регистрация идентификатори хато." msgid "Choose an enrollment to view the dashboard." -msgstr "бошқарув панелини кўриш учун рўйхатдан ўтишни танланг." +msgstr "Бошқарув панелини кўриш учун \"Рўйхатдан ўтиш\"ни танланг." msgid "There are no active enrollments." -msgstr "" +msgstr "Фаол Регистрациялар мавжуд эмас" msgid "Add new enrollment for {{teiDisplayName}} in this program." msgstr "" @@ -1100,7 +1048,7 @@ msgid "Search for a {{trackedEntityName}} in {{programName}}" msgstr "Қидирув {{trackedEntityName}} да {{programName}}" msgid "No tracked entity types available" -msgstr "" +msgstr "Кузатилаётган объект(муассаса) турлари мавжуд эмас" msgid "Assigned to" msgstr "Тайинланган" @@ -1155,7 +1103,7 @@ msgid "Reactivate" msgstr "" msgid "Mark as cancelled" -msgstr "" +msgstr "\"Бекор қилинди\" деб белгилаш" msgid "Mark incomplete" msgstr "Тугалланмаган деб белгилансин" @@ -1181,7 +1129,7 @@ msgid "Mark for follow-up" msgstr "Кузатув учун белгиланг" msgid "Transfer" -msgstr "" +msgstr "Ўтказиш" msgid "An error occurred while transferring ownership" msgstr "" @@ -1196,11 +1144,14 @@ msgid "Longitude" msgstr "Узунлик" msgid "Set coordinates" -msgstr "" +msgstr "Координаталар ни белгилаш" msgid "Coordinates" msgstr "Координаталар" +msgid "Please provide valid coordinates" +msgstr "Илтимос, тўғри координаталарни кўрсатинг" + msgid "Delete polygon" msgstr "Полигон (кўпбурчак) ни ўчириб ташлаш" @@ -1254,7 +1205,7 @@ msgid "Cancelled" msgstr "Бекор қилинди" msgid "Add coordinates" -msgstr "" +msgstr "Координаталар ни киритиш" msgid "Add area" msgstr "" @@ -1296,7 +1247,7 @@ msgid "Delete event" msgstr "Ҳодиса/тадбирни ўчириб ташлаш" msgid "Yes, delete event" -msgstr "" +msgstr "Ҳа, холатни ўчириш" msgid "Go to “Schedule” tab to reschedule this event" msgstr "" @@ -1449,6 +1400,12 @@ msgstr "Режалаштирилган сана" msgid "Report date" msgstr "Ҳисобот санаси" +msgid "Please enter a date" +msgstr "" + +msgid "Please provide a valid organisation unit" +msgstr "Илтимос, тўғри ташкилий бўлимни кўрсатинг" + msgid "Please select a valid event" msgstr "" @@ -1903,6 +1860,60 @@ msgstr "" msgid "Error updating the Assignee" msgstr "" +msgid "Please provide a valid number" +msgstr "Илтимос, тўғри рақамни кўрсатинг" + +msgid "Please provide a valid integer" +msgstr "Илтимос, тўғри бутун сонни кўрсатинг" + +msgid "Please provide a positive integer" +msgstr "Илтимос, бутун мусбат сонни кўрсатинг" + +msgid "Please provide zero or a positive integer" +msgstr "Илтимос, ноль ёки бутун мусбат сонни кўрсатинг" + +msgid "Please provide a negative integer" +msgstr "Илтимос, бутун манфий сонни кўрсатинг" + +msgid "Please provide a valid date and time" +msgstr "Илтимос, тегишли сана ва вақтни кўрсатинг" + +msgid "Please provide a valid time" +msgstr "Илтимос, тўғри вақтни кўрсатинг" + +msgid "Please provide an integer between 0 and 100" +msgstr "" + +msgid "Please provide a valid url" +msgstr "Илтимос, ҳақиқий URL манзилни кўрсатинг" + +msgid "Please provide a valid email address" +msgstr "Илтимос, амалдаги е-почта манзилини кўрсатинг" + +msgid "Please provide a valid age" +msgstr "Илтимос, тўғри ёшни кўрсатинг" + +msgid "Please provide a valid phone number" +msgstr "Илтимос, тўғри телефон рақамини кўрсатинг" + +msgid "This value already exists" +msgstr "Бу қиймат аллақачон мавжуд" + +msgid "\"From\" cannot be greater than \"To\"" +msgstr "Сана \"гача\" катта бўлиши мумкин эмас сана \"дан\" " + +msgid "Checking..." +msgstr "Текширилмоқда..." + +msgid "Please provide a valid positive integer" +msgstr "" + +msgid "Please enter a valid time" +msgstr "" + +msgid "Please enter a time" +msgstr "" + msgid "Set coordinate" msgstr "Координатани ўрнатинг" diff --git a/i18n/vi.po b/i18n/vi.po index cfabbe1272..d23afbb606 100644 --- a/i18n/vi.po +++ b/i18n/vi.po @@ -131,7 +131,7 @@ msgid "Coordinate" msgstr "Tọa độ" msgid "Enrollment" -msgstr "Ghi danh" +msgstr "Đăng ký" msgid "Complete event" msgstr "Hoàn tất chương trình" @@ -1205,7 +1205,8 @@ msgid "Incident date" msgstr "Ngày xảy ra" msgid "Enrollment widget could not be loaded. Please try again later" -msgstr "Không thể tải tiện ích đăng ký. Vui lòng thử lại sau" +msgstr "" +"Không thể tải ô dữ liệu đăng ký vào chương trình. Vui lòng thử lại sau" msgid "Follow-up" msgstr "Theo dõi sau" @@ -1265,40 +1266,42 @@ msgid "Yes, delete event" msgstr "Có, xóa sự kiện" msgid "Go to “Schedule” tab to reschedule this event" -msgstr "" +msgstr "Vào tab “Lên lịch” để lên lịch lại sự kiện này" msgid "Scheduled date cannot be changed for {{ eventStatus }} events" -msgstr "" +msgstr "Ngày đã lên lịch không thể thay đổi cho sự kiện {{ eventStatus }}" msgid "Event completed" msgstr "Sự kiện đã hoàn tất" msgid "The event cannot be edited after it has been completed" -msgstr "" +msgstr "Sự kiện này không thể chỉnh sửa khi đã hoàn tất" msgid "Notes about this event" -msgstr "" +msgstr "Ghi chú về sự kiện này" msgid "Write a note about this event" -msgstr "" +msgstr "Viết một ghi chú cho sự kiện này" msgid "This event doesn't have any notes" -msgstr "" +msgstr "Sự kiện này không có ghi chú nào" msgid "Schedule date info" -msgstr "" +msgstr "Thông tin ngày lên lịch" msgid "Scheduled automatically for {{suggestedScheduleDate}}" -msgstr "" +msgstr "Đã lên lịch tự động cho {{suggestedScheduleDate}}" msgid "" "The scheduled date matches the suggested date, but can be changed if needed." msgstr "" +"Ngày đã lên lịch trùng với ngày được đề xuất nhưng có thể thay đổi nếu cần." msgid "The scheduled date is {{count}} days {{position}} the suggested date." msgid_plural "" "The scheduled date is {{count}} days {{position}} the suggested date." msgstr[0] "" +"Ngày lên lịch cách {{count}}ngày {{position}}so với ngày được đề xuất." msgid "after" msgstr "sau" @@ -1310,22 +1313,25 @@ msgid "There are {{count}} scheduled event in {{orgUnitName}} on this day." msgid_plural "" "There are {{count}} scheduled event in {{orgUnitName}} on this day." msgstr[0] "" +"Có {{count}}sự kiện được lên lịch trong ngày này tại {{orgUnitName}}" msgid "" "Scheduling an event in {{stageName}} for {{programName}} in {{orgUnitName}}" msgstr "" +"Đang lên lịch cho một sự kiện trong {{stageName}}cho {{programName}}tại " +"{{orgUnitName}}" msgid "Schedule info" -msgstr "" +msgstr "Thông tin lên lịch" msgid "Schedule date / Due date" -msgstr "" +msgstr "Ngày lên lịch / Ngày đến hạn" msgid "Event notes" -msgstr "" +msgstr "Ghi chú sự kiện" msgid "Write a note about this scheduled event" -msgstr "" +msgstr "Viết một ghi chú cho sự kiện đã lên lịch này" msgid "Save note" msgstr "Lưu ghi chú" @@ -1335,9 +1341,12 @@ msgid "" "information about this enrollment, use the Edit button in the in the " "Enrollment box on this dashboard" msgstr "" +"Thay đổi thông tin về {{trackedEntityName}}tại đây. Để thay đổi thông tin " +"đăng ký vào chương trình, sử dụng nút Chỉnh sửa trong hộp Đăng ký chương " +"trình trên bảng thông tin này." msgid " Loading..." -msgstr "" +msgstr "Đang tải..." msgid "Save changes" msgstr "Lưu các thay đổi" @@ -1346,67 +1355,70 @@ msgid "Profile" msgstr "Hồ sơ" msgid "There is a problem with this form" -msgstr "" +msgstr "Có một vấn đề với biểu nhập này" msgid "There are warnings in this form" -msgstr "" +msgstr "Có những cảnh báo trong biểu nhập này" msgid "There was a problem saving changes" -msgstr "" +msgstr "Có vấn đề khi lưu thay đổi" msgid "Try again or contact your system administrator for support" -msgstr "" +msgstr "Thử lại hoặc liên hệ người quản trị nhờ hỗ trợ" msgid "Fix errors in the form to continue." -msgstr "" +msgstr "Sửa các lỗi trên biểu nhập để tiếp tục" msgid "You do not have access to delete this {{trackedEntityTypeName}}" -msgstr "" +msgstr "Bạn không có quyền xóa {{trackedEntityTypeName}}này" msgid "Delete {{trackedEntityTypeName}}" -msgstr "" +msgstr "Xóa {{trackedEntityTypeName}}" msgid "" "Are you sure you want to delete this {{trackedEntityTypeName}}? This will " "permanently remove the {{trackedEntityTypeName}} and all its associated " "enrollments and events in all programs." msgstr "" +"Bạn có chắc muốn xóa {{trackedEntityTypeName}}này? Việc này sẽ xóa " +"{{trackedEntityTypeName}}và tất cả các dữ liệu liên quan như dữ liệu đăng ký" +" và sự kiện trong tất cả chương trình vĩnh viễn, không thể hồi phục." msgid "There was a problem deleting the {{trackedEntityTypeName}}" -msgstr "" +msgstr "Có vấn đề khi xóa {{trackedEntityTypeName}}" msgid "Yes, delete {{trackedEntityTypeName}}" -msgstr "" +msgstr "Có, xóa {{trackedEntityTypeName}}" msgid "Profile widget could not be loaded. Please try again later" -msgstr "" +msgstr "Không thể tải hồ sơ. Vui lòng thử lại sau" msgid "{{trackedEntityTypeName}} profile" -msgstr "" +msgstr "Hồ sơ {{trackedEntityTypeName}}" msgid "tracked entity instance" msgstr "thực thể được theo dõi" msgid "Link to an existing {{linkableStageLabel}}" -msgstr "" +msgstr "Liên kết đến một {{linkableStageLabel}} đang tồn tại" msgid "Choose a {{linkableStageLabel}}" -msgstr "" +msgstr "Chọn một {{linkableStageLabel}}" msgid "{{ linkableStageLabel }} is not repeatable" -msgstr "" +msgstr "{{ linkableStageLabel }}không lặp lại" msgid "{{ linkableStageLabel }} has no linkable events" -msgstr "" +msgstr "{{ linkableStageLabel }}không thể liên kết đến sự kiện" msgid "Ambiguous relationships, contact system administrator" -msgstr "" +msgstr "Mối quan hệ mơ hồ, liên hệ với quản trị viên hệ thống" msgid "Enter details now" -msgstr "" +msgstr "Nhập chi tiết bây giờ" msgid "Link to an existing" -msgstr "" +msgstr "Liên kết đến đối tượng sẵn có" msgid "Scheduled date" msgstr "Ngày đã hẹn" @@ -1415,96 +1427,100 @@ msgid "Report date" msgstr "Ngày báo cáo" msgid "Please enter a date" -msgstr "" +msgstr "Hãy chọn một ngày" msgid "Please provide a valid organisation unit" msgstr "Vui lòng cung cấp một đơn vị hợp lệ" msgid "Please select a valid event" -msgstr "" +msgstr "Hãy chọn một sự kiện hợp lệ" msgid "You do not have access to create events in this stage" -msgstr "" +msgstr "Bạn không có quyền tạo sự kiện trong giai đoạn này của chương trình" msgid "This stage can only have one event" -msgstr "" +msgstr "Giai đoạn này chỉ có duy nhất một sự kiện" msgid "New {{ eventName }} event" -msgstr "" +msgstr "Sự kiện {{ eventName }}mới" msgid "An error occurred while deleting the event" -msgstr "" +msgstr "Có lỗi xảy ra khi xóa sự kiện" msgid "" "Deleting an event is permanent and cannot be undone. Are you sure you want " "to delete this event?" msgstr "" +"Xóa một sự kiện vĩnh viễn và không thể hồi phục. Bạn có chắc muốn xóa sự " +"kiện này?" msgid "An error occurred when updating event status" -msgstr "" +msgstr "Có lỗi xảy ra khi cập nhật trạng thái sự kiện" msgid "Unskip" -msgstr "" +msgstr "Quay lại" msgid "Skip" msgstr "Bỏ qua" msgid "To open this event, please wait until saving is complete" -msgstr "" +msgstr "Đê mở sự kiện này, hãy đợi đến khi việc lưu trữ hoàn tất" msgid "Show {{ rest }} more" -msgstr "" +msgstr "Hiện nhiều hơn {{ rest }}" msgid "Go to full {{ eventName }}" -msgstr "" +msgstr "Đến {{ eventName }}đầy đủ" msgid "Events could not be retrieved. Please try again later." -msgstr "" +msgstr "Không thể truy xuất sự kiện. Vui lòng thử lại sau." msgid "{{ count }} event" msgid_plural "{{ count }} event" -msgstr[0] "" +msgstr[0] "{{count}}sự kiện" msgid "{{ overdueEvents }} overdue" -msgstr "" +msgstr "{{ overdueEvents }}quá hạn" msgid "{{ scheduledEvents }} scheduled" -msgstr "" +msgstr "{{ scheduledEvents }}đã lên lịch" msgid "Stages and Events" -msgstr "" +msgstr "Giai đoạn và Sự kiện" msgid "View linked event" -msgstr "" +msgstr "Xem sự kiện liên kết" msgid "An error occurred while loading the widget." -msgstr "" +msgstr "Có lỗi xảy ra khi tải thông tin" msgid "Linked event" -msgstr "" +msgstr "Sự kiện liên kết" msgid "" "This {{stageName}} event is linked to a {{linkedStageName}} event. Review " "the linked event details before entering data below" msgstr "" +"Sự kiện {{stageName}}được liên kết đến một sự kiện {{linkedStageName}}. Xem " +"lại chi tiết liên kết trước khi nhập dữ liệu sau" msgid "Scheduled" -msgstr "Đã xếp lịch" +msgstr "Đã lên lịch" msgid "Changelog" -msgstr "" +msgstr "Nhật ký thay đổi" msgid "No changes to display" -msgstr "" +msgstr "Không có thay đổi nào để hiển thị" msgid "Updated" -msgstr "" +msgstr "Đã cập nhật" msgid "Created" msgstr "Đã tạo" msgid "Deleted" -msgstr "" +msgstr "Đã xóa" msgid "Date" msgstr "Ngày" @@ -1516,7 +1532,7 @@ msgid "Data item" msgstr "Mục dữ liệu" msgid "Change" -msgstr "" +msgstr "Thay đổi" msgid "Value" msgstr "Giá trị" @@ -1528,29 +1544,29 @@ msgid "Image" msgstr "Hình ảnh" msgid "New {{trackedEntityTypeName}} relationship" -msgstr "" +msgstr "Quan hệ mới {{trackedEntityTypeName}}" msgid "Missing implementation step" -msgstr "" +msgstr "Thiếu bước triển khai" msgid "Go back without saving relationship" -msgstr "" +msgstr "Quay trở lại mà không cần lưu mối quan hệ" msgid "New Relationship" -msgstr "" +msgstr "Mối quan hệ mới" msgid "Link to an existing {{tetName}}" -msgstr "" +msgstr "Liên kết với một {{tetName}}đã tồn tại" msgid "An error occurred while adding the relationship" -msgstr "" +msgstr "Có lỗi khi thêm quan hệ" msgid "" "Something went wrong while loading relationships. Please try again later." -msgstr "" +msgstr "Có vấn đề khi tải các quan hệ. Hãy thử lại sau." msgid "{{trackedEntityTypeName}} relationships" -msgstr "" +msgstr "Các mối quan hệ của {{trackedEntityTypeName}}" msgid "Delete relationship" msgstr "Xóa quan hệ" @@ -1559,21 +1575,23 @@ msgid "" "Deleting the relationship is permanent and cannot be undone. Are you sure " "you want to delete this relationship?" msgstr "" +"Việc xóa mối quan hệ là vĩnh viễn và không thể hoàn tác. Bạn có chắc chắn " +"muốn xóa mối quan hệ này không?" msgid "Yes, delete relationship" -msgstr "" +msgstr "Có, xóa quan hệ" msgid "An error occurred while deleting the relationship." -msgstr "" +msgstr "Có lỗi khi xóa mối quan hệ." msgid "To open this relationship, please wait until saving is complete" -msgstr "" +msgstr "Để mở mối quan hệ này, hãy đợi khi việc lưu được hoàn thành." msgid "Type" msgstr "Loại" msgid "Created date" -msgstr "" +msgstr "Ngày tạo" msgid "Program stage name" msgstr "Tên giai đoạn chương trình" @@ -1588,50 +1606,55 @@ msgid "an error occurred loading working lists" msgstr "đã xảy ra lỗi khi tải danh sách làm việc" msgid "You do not have access to complete events" -msgstr "" +msgstr "Bạn không có quyền hoàn thành sự kiện" msgid "Complete events" -msgstr "" +msgstr "Hoàn thành sự kiện" msgid "Are you sure you want to complete all active events in selection?" msgstr "" +"Bạn có chắc chắn muốn hoàn thành tất cả các sự kiện đang hoạt động trong " +"phần lựa chọn không?" msgid "There are no active events to complete in the current selection." msgstr "" +"Không có sự kiện nào đang hoạt động để hoàn thành trong lựa chọn hiện tại." msgid "Error completing events" -msgstr "" +msgstr "Lỗi khi hoàn tất sự kiện" msgid "There was an error completing the events." -msgstr "" +msgstr "Đã xảy ra lỗi khi hoàn tất sự kiện." msgid "Details (Advanced)" -msgstr "" +msgstr "Chi tiết (Nâng cao)" msgid "An unknown error occurred." msgstr "Một lỗi không xác định đã xuất hiện." msgid "An error occurred while completing events" -msgstr "" +msgstr "Có lỗi khi hoàn tất sự kiện" msgid "An error occurred while deleting the events" -msgstr "" +msgstr "Có lỗi khi xoá sự kiện" msgid "You do not have access to delete events" -msgstr "" +msgstr "Bạn không có quyền xoá sự kiện" msgid "Delete events" -msgstr "" +msgstr "Xoá sự kiện" msgid "" "This cannot be undone. Are you sure you want to delete the selected events?" msgstr "" +"Không thể hoàn tác thao tác này. Bạn có chắc chắn muốn xóa các sự kiện đã " +"chọn không?" msgid "Registration Date" msgstr "Ngày đăng ký" msgid "Inactive" -msgstr "Không kích hoạt" +msgstr "Không hoạt động" msgid "Enrollment status" msgstr "Trạng thái đăng ký" @@ -1640,124 +1663,139 @@ msgid "Follow up" msgstr "Theo dõi" msgid "Choose a program stage to filter by {{label}}" -msgstr "" +msgstr "Chọn một giai đoạn để lọc bởi {{label}}" msgid "" "Some enrollments were completed successfully, but there was an error while " "completing the rest. Please see the details below." msgstr "" +"Một số lần đăng ký đã hoàn tất thành công, nhưng có lỗi khi hoàn tất phần " +"còn lại. Vui lòng xem chi tiết bên dưới." msgid "" "There was an error while completing the enrollments. Please see the details " "below." msgstr "" +"Đã xảy ra lỗi khi hoàn tất việc đăng ký. Vui lòng xem chi tiết bên dưới." msgid "" "An unexpected error occurred while fetching the enrollments. Please try " "again." msgstr "" +"Đã xảy ra lỗi không mong muốn khi tải thông tin đăng ký. Vui lòng thử lại." msgid "" "There are currently no active enrollments in the selection. All enrollments " "are already completed or cancelled." msgstr "" +"Hiện tại không có đăng ký nào đang hoạt động trong danh sách lựa chọn. Tất " +"cả các đăng ký đã hoàn tất hoặc đã hủy." msgid "" "This action will complete {{count}} active enrollment in your selection." msgid_plural "" "This action will complete {{count}} active enrollment in your selection." msgstr[0] "" +"Hành động này sẽ hoàn thành {{count}}đăng ký đang hoạt động trong lựa chọn " +"của bạn" msgid "{{count}} enrollment already marked as completed will not be changed." msgid_plural "" "{{count}} enrollment already marked as completed will not be changed." msgstr[0] "" +"Có {{count}}đăng ký đã được đánh dấu là đã hoàn thành sẽ không được thay " +"đổi." msgid "Mark all events within enrollments as complete" -msgstr "" +msgstr "Đánh dấu tất cả các sự kiện trong các đăng ký là đã hoàn tất" msgid "You do not have access to bulk complete enrollments" msgstr "" +"Bạn không có quyền truy cập vào danh sách đăng ký để hoàn thành hàng loạt" msgid "Complete enrollments" -msgstr "" +msgstr "Hoàn tất đăng ký" msgid "Error completing enrollments" -msgstr "" +msgstr "Lỗi khi hoàn tất đăng ký" msgid "No active enrollments to complete" -msgstr "" +msgstr "Không có đăng ký nào đang hoạt động để hoàn thành" msgid "Complete {{count}} enrollment" msgid_plural "Complete {{count}} enrollment" -msgstr[0] "" +msgstr[0] "Hoàn thành {{count}}đăng ký" msgid "An error occurred when completing the enrollments" -msgstr "" +msgstr "Đã xảy ra lỗi khi hoàn tất việc đăng ký" msgid "An unknown error occurred when completing enrollments" -msgstr "" +msgstr " Đã xảy ra lỗi không xác định khi hoàn tất đăng ký" msgid "You do not have access to delete enrollments" -msgstr "" +msgstr "Bạn không có quyền xóa đăng ký" msgid "Delete enrollments" -msgstr "" +msgstr "Xóa đăng ký" msgid "Delete selected enrollments" -msgstr "" +msgstr "Xóa các đăng ký đã chọn" msgid "" "An error occurred while loading the selected enrollments. Please try again." -msgstr "" +msgstr "Đã xảy ra lỗi khi tải các mục đăng ký đã chọn. Vui lòng thử lại." msgid "" "This action will permanently delete the selected enrollments, including all " "associated data and events." msgstr "" +" Hành động này sẽ xóa vĩnh viễn các mục đăng ký đã chọn, bao gồm tất cả dữ " +"liệu và sự kiện liên quan." msgid "Active enrollments ({{count}})" msgid_plural "Active enrollments ({{count}})" -msgstr[0] "" +msgstr[0] "Đăng ký đang hoạt động ({{count}})" msgid "Completed enrollments ({{count}})" msgid_plural "Completed enrollments ({{count}})" -msgstr[0] "" +msgstr[0] "Đăng ký đã hoàn thành ({{count}})" msgid "Cancelled enrollments ({{count}})" msgid_plural "Cancelled enrollments ({{count}})" -msgstr[0] "" +msgstr[0] "Đăng ký bị huỷ ({{count}})" msgid "Delete {{count}} enrollment" msgid_plural "Delete {{count}} enrollment" -msgstr[0] "" +msgstr[0] "Xoá {{count}}đăng ký" msgid "An error occurred when deleting enrollments" -msgstr "" +msgstr "Đã xảy ra lỗi khi xóa đăng ký" msgid "Delete {{ trackedEntityName }} with all enrollments" -msgstr "" +msgstr "Xoá {{ trackedEntityName }}với tất cả đăng ký" msgid "Delete {{count}} {{ trackedEntityName }}" msgid_plural "Delete {{count}} {{ trackedEntityName }}" -msgstr[0] "" +msgstr[0] "Xoá {{count}}{{ trackedEntityName }}" msgid "" "Deleting records will also delete any associated enrollments and events. " "This cannot be undone. Are you sure you want to delete?" msgstr "" +"Xóa hồ sơ cũng sẽ xóa mọi sự kiện và đăng ký liên quan. Không thể hoàn tác " +"thao tác này. Bạn có chắc chắn muốn xóa không?" msgid "An error occurred while deleting the records" -msgstr "" +msgstr "Đã xảy ra lỗi khi xóa bản ghi" msgid "Working list could not be updated" msgstr "Không thể cập nhật danh sách làm việc" msgid "an error occurred loading the working lists" -msgstr "" +msgstr "đã xảy ra lỗi khi tải danh sách làm việc" msgid "an error occurred loading Tracked entity instance lists" -msgstr "" +msgstr "đã có lỗi xảy ra khi tải danh sách cá thể" msgid "{{count}} selected" msgid_plural "{{count}} selected" @@ -1812,10 +1850,10 @@ msgid "An error has occured. See log for details" msgstr "Có lỗi. Xem log để biết thêm chi tiết." msgid "Scheduled{{ escape }} due {{ time }}" -msgstr "" +msgstr "Đã lên lịch {{ escape }}{{ time }}hẹn" msgid "Overdue{{ escape }} due {{ time }}" -msgstr "" +msgstr "Đã quá hạn {{ escape }}{{ time }}" msgid "Overdue" msgstr "Quá hạn" @@ -1827,10 +1865,10 @@ msgid "Visited" msgstr "Đã đến" msgid "{{trackedEntityName}} in program{{escape}} {{programName}}" -msgstr "" +msgstr "{{trackedEntityName}}trong chương trình {{escape}}{{programName}}" msgid "Program not found" -msgstr "Chương trình không tìm thấy" +msgstr "Không tìm thấy chương trình" msgid "Program is not a tracker program" msgstr "Chương trình không phải là một chương trình theo dõi" @@ -1839,7 +1877,7 @@ msgid "Error saving event" msgstr "Có lỗi khi đang lưu sự kiện" msgid "Could not save event" -msgstr "" +msgstr "Không thể lưu sự kiện" msgid "Could not delete event" msgstr "Không thể xóa sự kiện" @@ -1854,25 +1892,25 @@ msgid "Could not delete working list" msgstr "Không thể xóa danh sách làm việc" msgid "Organisation unit search failed." -msgstr "" +msgstr "Tìm kiếm đơn vị thất bại" msgid "Error saving tracked entity instance" -msgstr "" +msgstr "Lỗi khi lưu cá thể" msgid "Error saving enrollment" -msgstr "" +msgstr "Lỗi khi lưu đăng ký" msgid "Error saving the enrollment event" -msgstr "" +msgstr "Lỗi khi lưu sự kiện đăng ký" msgid "Error deleting the enrollment event" -msgstr "" +msgstr "Lỗi khi xóa sự kiện đăng ký" msgid "Error editing the event, the changes made were not saved" -msgstr "" +msgstr "Lỗi khi chỉnh sửa sự kiện, những thay đổi đã thực hiện không được lưu" msgid "Error updating the Assignee" -msgstr "" +msgstr "Lỗi khi cập nhật Người được giao" msgid "Please provide a valid number" msgstr "Vui lòng cung cấp một số hợp lệ" @@ -1920,13 +1958,13 @@ msgid "Checking..." msgstr "Đang kiểm tra ..." msgid "Please provide a valid positive integer" -msgstr "" +msgstr "Vui lòng cung cấp một số nguyên dương hợp lệ" msgid "Please enter a valid time" -msgstr "" +msgstr "Vui lòng nhập thời gian hợp lệ" msgid "Please enter a time" -msgstr "" +msgstr "Vui lòng nhập thời gian" msgid "Set coordinate" msgstr "Đặt tọa độ" @@ -1950,7 +1988,7 @@ msgid "Page {{currentPage}}" msgstr "Trang {{currentPage}}" msgid "Area on map saved" -msgstr "" +msgstr "Khu vực trên bản đồ đã được lưu" msgid "Compatibility mode" msgstr "Chế độ tương thích" diff --git a/i18n/zh.po b/i18n/zh.po index 7d141be381..6fa7b235d5 100644 --- a/i18n/zh.po +++ b/i18n/zh.po @@ -1,16 +1,16 @@ # # Translators: # Philip Larsen Donnelly, 2024 -# easylin , 2024 # Viktor Varland , 2024 # 晓东 林 <13981924470@126.com>, 2024 +# easylin , 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2024-12-03T10:58:18.077Z\n" +"POT-Creation-Date: 2024-12-05T11:39:04.447Z\n" "PO-Revision-Date: 2019-06-27 07:31+0000\n" -"Last-Translator: 晓东 林 <13981924470@126.com>, 2024\n" +"Last-Translator: easylin , 2024\n" "Language-Team: Chinese (https://app.transifex.com/hisp-uio/teams/100509/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,10 +42,10 @@ msgstr "" "App仅支持同时运行一个版本(在同一域中)。如果您想再次使用此版本,请刷新此页面,但是请注意,它将关闭其他版本。" msgid "Enrollment dashboard" -msgstr "" +msgstr "注册仪表板" msgid "View event" -msgstr "" +msgstr "查看活动" msgid "Edit event" msgstr "编辑事件" @@ -63,16 +63,16 @@ msgid "Cancelled enrollments" msgstr "取消注册" msgid "{{trackedEntityName}} list" -msgstr "" +msgstr "{{trackedEntityName}} 清单" msgid "Search" msgstr "搜索" msgid "Working List" -msgstr "" +msgstr "工作列表" msgid "Event list" -msgstr "" +msgstr "事件列表" msgid "More" msgstr "更多" @@ -1209,7 +1209,7 @@ msgid "stage not found in rules execution" msgstr "在规则执行中找不到阶段" msgid "Please provide an valid organisation unit" -msgstr "" +msgstr "请提供有效的组织单位" msgid "Delete event" msgstr "删除事件" @@ -1370,7 +1370,7 @@ msgid "Report date" msgstr "报告日期" msgid "Please enter a date" -msgstr "" +msgstr "请输入日期" msgid "Please provide a valid organisation unit" msgstr "请提供有效的机构" @@ -1429,19 +1429,50 @@ msgstr "{{ scheduledEvents }} 已安排" msgid "Stages and Events" msgstr "阶段与活动" +msgid "An error occurred while unlinking and deleting the event." +msgstr "" + +msgid "Unlink and delete linked event" +msgstr "" + +msgid "" +"Are you sure you want to remove the link and delete the linked event? This " +"action permanently removes the link, linked event, and all related data." +msgstr "" + +msgid "Yes, unlink and delete linked event" +msgstr "" + +msgid "Unlink event" +msgstr "" + +msgid "" +"Are you sure you want to remove the link between these events? This action " +"removes the link itself, but the linked event will remain." +msgstr "" + +msgid "Yes, unlink event" +msgstr "" + msgid "View linked event" msgstr "查看链接事件" +msgid "You do not have access to remove the link between these events" +msgstr "" + +msgid "You do not have access to remove the link and delete the linked event" +msgstr "" + msgid "An error occurred while loading the widget." msgstr "加载小部件时发生错误。" msgid "Linked event" -msgstr "" +msgstr "关联事件" msgid "" "This {{stageName}} event is linked to a {{linkedStageName}} event. Review " "the linked event details before entering data below" -msgstr "" +msgstr "此{{stageName}} 事件与{{linkedStageName}} 事件相关联。在输入以下数据之前,请查看链接事件的详细信息" msgid "Scheduled" msgstr "已经调度" @@ -1543,44 +1574,44 @@ msgid "an error occurred loading working lists" msgstr "载入工作列表发生错误" msgid "You do not have access to complete events" -msgstr "" +msgstr "您无法访问完成的事件" msgid "Complete events" -msgstr "" +msgstr "完成事件" msgid "Are you sure you want to complete all active events in selection?" -msgstr "" +msgstr "您确定要在选择中完成所有活动事件吗?" msgid "There are no active events to complete in the current selection." -msgstr "" +msgstr "当前选择中没有要完成的活动。" msgid "Error completing events" -msgstr "" +msgstr "完成事件 错误" msgid "There was an error completing the events." -msgstr "" +msgstr "完成事件时出现错误。" msgid "Details (Advanced)" -msgstr "" +msgstr "详细信息(高级)" msgid "An unknown error occurred." msgstr "出现未知错误。" msgid "An error occurred while completing events" -msgstr "" +msgstr "完成事件时发生错误" msgid "An error occurred while deleting the events" -msgstr "" +msgstr "删除事件时发生错误" msgid "You do not have access to delete events" -msgstr "" +msgstr "您无权删除事件" msgid "Delete events" -msgstr "" +msgstr "删除事件" msgid "" "This cannot be undone. Are you sure you want to delete the selected events?" -msgstr "" +msgstr "此操作无法撤销。您确定要删除所选事件吗?" msgid "Registration Date" msgstr "登记日期" @@ -1600,110 +1631,110 @@ msgstr "选择要按 {{label}} 筛选的项目阶段" msgid "" "Some enrollments were completed successfully, but there was an error while " "completing the rest. Please see the details below." -msgstr "" +msgstr "部分注册已成功完成,但在完成其他注册时出现错误。详情请见下文。" msgid "" "There was an error while completing the enrollments. Please see the details " "below." -msgstr "" +msgstr "在完成注册时出现错误。请参阅下面的详细信息。" msgid "" "An unexpected error occurred while fetching the enrollments. Please try " "again." -msgstr "" +msgstr "在获取注册信息时发生了意外错误。请重试。" msgid "" "There are currently no active enrollments in the selection. All enrollments " "are already completed or cancelled." -msgstr "" +msgstr "该选项中目前没有有效注册。所有注册均已完成或取消。" msgid "" "This action will complete {{count}} active enrollment in your selection." msgid_plural "" "This action will complete {{count}} active enrollment in your selection." -msgstr[0] "" +msgstr[0] "此操作将完成{{count}} 您选择的活动注册。" msgid "{{count}} enrollment already marked as completed will not be changed." msgid_plural "" "{{count}} enrollment already marked as completed will not be changed." -msgstr[0] "" +msgstr[0] "{{count}} 已标记为完成的注册将不会更改。" msgid "Mark all events within enrollments as complete" -msgstr "" +msgstr "将注册中的所有事件标记为已完成" msgid "You do not have access to bulk complete enrollments" -msgstr "" +msgstr "您无法批量完成注册" msgid "Complete enrollments" -msgstr "" +msgstr "完成注册" msgid "Error completing enrollments" -msgstr "" +msgstr "完成注册出错" msgid "No active enrollments to complete" -msgstr "" +msgstr "没有待完成的有效注册" msgid "Complete {{count}} enrollment" msgid_plural "Complete {{count}} enrollment" -msgstr[0] "" +msgstr[0] "完成{{count}} 注册" msgid "An error occurred when completing the enrollments" -msgstr "" +msgstr "完成注册时发生错误" msgid "An unknown error occurred when completing enrollments" -msgstr "" +msgstr "完成注册时出现未知错误" msgid "You do not have access to delete enrollments" -msgstr "" +msgstr "您没有删除注册的权限" msgid "Delete enrollments" -msgstr "" +msgstr "删除注册" msgid "Delete selected enrollments" -msgstr "" +msgstr "删除选定的注册" msgid "" "An error occurred while loading the selected enrollments. Please try again." -msgstr "" +msgstr "加载所选注册信息时发生错误。请重试。" msgid "" "This action will permanently delete the selected enrollments, including all " "associated data and events." -msgstr "" +msgstr "此操作将永久删除所选注册信息,包括所有相关数据和事件。" msgid "Active enrollments ({{count}})" msgid_plural "Active enrollments ({{count}})" -msgstr[0] "" +msgstr[0] "有效注册 ({{count}})" msgid "Completed enrollments ({{count}})" msgid_plural "Completed enrollments ({{count}})" -msgstr[0] "" +msgstr[0] "完成注册 ({{count}})" msgid "Cancelled enrollments ({{count}})" msgid_plural "Cancelled enrollments ({{count}})" -msgstr[0] "" +msgstr[0] "取消注册 ({{count}})" msgid "Delete {{count}} enrollment" msgid_plural "Delete {{count}} enrollment" -msgstr[0] "" +msgstr[0] "删除{{count}} 注册" msgid "An error occurred when deleting enrollments" -msgstr "" +msgstr "删除注册时发生错误" msgid "Delete {{ trackedEntityName }} with all enrollments" -msgstr "" +msgstr "删除{{ trackedEntityName }} 和所有注册信息" msgid "Delete {{count}} {{ trackedEntityName }}" msgid_plural "Delete {{count}} {{ trackedEntityName }}" -msgstr[0] "" +msgstr[0] "删除{{count}} {{ trackedEntityName }}" msgid "" "Deleting records will also delete any associated enrollments and events. " "This cannot be undone. Are you sure you want to delete?" -msgstr "" +msgstr "删除记录也会删除任何相关的注册和事件。此操作无法撤销。您确定要删除吗?" msgid "An error occurred while deleting the records" -msgstr "" +msgstr "删除记录时发生错误" msgid "Working list could not be updated" msgstr "工作清单无法更新" @@ -1875,13 +1906,13 @@ msgid "Checking..." msgstr "检查" msgid "Please provide a valid positive integer" -msgstr "" +msgstr "请提供一个有效的正整数" msgid "Please enter a valid time" -msgstr "" +msgstr "请输入有效时间" msgid "Please enter a time" -msgstr "" +msgstr "请输入时间" msgid "Set coordinate" msgstr "设置坐标" diff --git a/package.json b/package.json index 68096d2fa1..7200b95525 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "capture-app", "homepage": ".", - "version": "101.19.2", + "version": "101.20.2", "cacheVersion": "7", "serverVersion": "38", "license": "BSD-3-Clause", @@ -10,8 +10,7 @@ "packages/rules-engine" ], "dependencies": { - "@dhis2/rules-engine-javascript": "101.19.2", - "@dhis2-ui/calendar": "^10.0.3", + "@dhis2/rules-engine-javascript": "101.20.2", "@dhis2/app-runtime": "^3.9.3", "@dhis2/d2-i18n": "^1.1.0", "@dhis2/d2-icons": "^1.0.1", @@ -20,6 +19,7 @@ "@dhis2/d2-ui-rich-text": "^7.4.0", "@dhis2/d2-ui-sharing-dialog": "^7.3.3", "@dhis2/ui": "^9.10.1", + "@dhis2-ui/calendar": "^10.0.3", "@joakim_sm/react-infinite-calendar": "^2.4.2", "@material-ui/core": "3.9.4", "@material-ui/icons": "3", diff --git a/packages/rules-engine/package.json b/packages/rules-engine/package.json index ecf985fbc1..b9732045f9 100644 --- a/packages/rules-engine/package.json +++ b/packages/rules-engine/package.json @@ -1,6 +1,6 @@ { "name": "@dhis2/rules-engine-javascript", - "version": "101.19.2", + "version": "101.20.2", "license": "BSD-3-Clause", "main": "./build/cjs/index.js", "scripts": { diff --git a/src/core_modules/capture-core/components/WidgetEventEdit/EditEventDataEntry/editEventDataEntry.actions.js b/src/core_modules/capture-core/components/WidgetEventEdit/EditEventDataEntry/editEventDataEntry.actions.js index ddd9bd1ff2..52a9c2f393 100644 --- a/src/core_modules/capture-core/components/WidgetEventEdit/EditEventDataEntry/editEventDataEntry.actions.js +++ b/src/core_modules/capture-core/components/WidgetEventEdit/EditEventDataEntry/editEventDataEntry.actions.js @@ -71,7 +71,7 @@ export const startDeleteEventDataEntry = (serverData: Object, eventId: string, p actionCreator(actionTypes.START_DELETE_EVENT_DATA_ENTRY)({ eventId }, { offline: { effect: { - url: 'tracker?async=false&importStrategy=delete', + url: 'tracker?async=false&importStrategy=DELETE', method: effectMethods.POST, data: serverData, }, diff --git a/src/core_modules/capture-core/components/WidgetRelatedStages/ScheduleInOrgUnit/ScheduleInOrgUnit.component.js b/src/core_modules/capture-core/components/WidgetRelatedStages/ScheduleInOrgUnit/ScheduleInOrgUnit.component.js index 310e5f7100..2a3cddd09e 100644 --- a/src/core_modules/capture-core/components/WidgetRelatedStages/ScheduleInOrgUnit/ScheduleInOrgUnit.component.js +++ b/src/core_modules/capture-core/components/WidgetRelatedStages/ScheduleInOrgUnit/ScheduleInOrgUnit.component.js @@ -43,7 +43,7 @@ type Props = { ...CssClasses, } -export const ScheduleInOrgUnitPlain = ({ +const ScheduleInOrgUnitPlain = ({ relatedStagesDataValues, setRelatedStagesDataValues, saveAttempted, diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkAndDeleteModal.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkAndDeleteModal.js new file mode 100644 index 0000000000..abe1af1713 --- /dev/null +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkAndDeleteModal.js @@ -0,0 +1,87 @@ +// @flow +import React from 'react'; +import i18n from '@dhis2/d2-i18n'; +import { + Button, + ButtonStrip, + Modal, + ModalActions, + ModalContent, + ModalTitle, +} from '@dhis2/ui'; +import log from 'loglevel'; +import { useDataEngine, useAlert } from '@dhis2/app-runtime'; +import { useMutation, useQueryClient } from 'react-query'; +import { ReactQueryAppNamespace } from 'capture-core/utils/reactQueryHelpers'; +import type { Props } from './UnlinkAndDeleteModal.types'; + +export const UnlinkAndDeleteModal = ({ + setOpenModal, + eventId, + originEventId, +}: Props) => { + const dataEngine = useDataEngine(); + const queryClient = useQueryClient(); + const { show: showErrorAlert } = useAlert( + i18n.t('An error occurred while unlinking and deleting the event.'), + { critical: true }, + ); + + const deleteEvent = async () => { + const mutation = { + resource: 'tracker?async=false&importStrategy=DELETE', + type: 'create', + data: { events: [{ event: eventId }] }, + }; + + return dataEngine.mutate(mutation); + }; + + const mutation = useMutation(deleteEvent, { + onSuccess: () => { + queryClient.invalidateQueries([ + ReactQueryAppNamespace, + 'linkedEventByOriginEvent', + originEventId, + ]); + setOpenModal(false); + }, + onError: (error) => { + showErrorAlert(); + log.error( + `Failed to unlink and delete event with ID: ${eventId}`, + error, + ); + }, + }); + + return ( + + {i18n.t('Unlink and delete linked event')} + +

+ {i18n.t( + 'Are you sure you want to remove the link and delete the linked event? This action permanently removes the link, linked event, and all related data.', + )} +

+
+ + + + + + +
+ ); +}; diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkAndDeleteModal.types.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkAndDeleteModal.types.js new file mode 100644 index 0000000000..d154e7396d --- /dev/null +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkAndDeleteModal.types.js @@ -0,0 +1,6 @@ +// @flow +export type Props = {| + setOpenModal: (open: boolean) => void, + eventId: string, + originEventId: string, +|}; diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkModal.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkModal.js new file mode 100644 index 0000000000..66cf139e74 --- /dev/null +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkModal.js @@ -0,0 +1,82 @@ +// @flow +import React from 'react'; +import i18n from '@dhis2/d2-i18n'; +import { + Modal, + ModalContent, + ModalTitle, + ModalActions, + ButtonStrip, + Button, +} from '@dhis2/ui'; +import log from 'loglevel'; +import { useDataEngine, useAlert } from '@dhis2/app-runtime'; +import { useMutation, useQueryClient } from 'react-query'; +import { ReactQueryAppNamespace } from 'capture-core/utils/reactQueryHelpers'; +import type { Props } from './UnlinkModal.types'; + +export const UnlinkModal = ({ + setOpenModal, + relationshipId, + originEventId, +}: Props) => { + const dataEngine = useDataEngine(); + const queryClient = useQueryClient(); + const { show: showErrorAlert } = useAlert( + i18n.t('An error occurred while unlinking and deleting the event.'), + { critical: true }, + ); + + const deleteRelationship = async () => { + const mutation = { + resource: 'tracker?importStrategy=DELETE&async=false', + type: 'create', + data: { relationships: [{ relationship: relationshipId }] }, + }; + + return dataEngine.mutate(mutation); + }; + + const mutation = useMutation(deleteRelationship, { + onSuccess: () => { + queryClient.invalidateQueries([ + ReactQueryAppNamespace, + 'linkedEventByOriginEvent', + originEventId, + ]); + setOpenModal(false); + }, + onError: (error) => { + showErrorAlert(); + log.error( + `Failed to remove relationship with id ${relationshipId}`, + error, + ); + }, + }); + + return ( + + + {i18n.t('Unlink event')} + + +

{i18n.t('Are you sure you want to remove the link between these events? This action removes the link itself, but the linked event will remain.')}

+
+ + + + + + +
+ ); +}; diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkModal.types.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkModal.types.js new file mode 100644 index 0000000000..b2d0b37c85 --- /dev/null +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/UnlinkModal.types.js @@ -0,0 +1,6 @@ +// @flow +export type Props = {| + setOpenModal: (open: boolean) => void, + relationshipId: string, + originEventId: string, +|}; diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/index.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/index.js new file mode 100644 index 0000000000..6c9800926f --- /dev/null +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/Modal/index.js @@ -0,0 +1,3 @@ +// @flow +export { UnlinkModal } from './UnlinkModal'; +export { UnlinkAndDeleteModal } from './UnlinkAndDeleteModal'; diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/OverflowMenu.component.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/OverflowMenu.component.js new file mode 100644 index 0000000000..df12185fec --- /dev/null +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/OverflowMenu.component.js @@ -0,0 +1,114 @@ +// @flow +import React, { useState } from 'react'; +import { useHistory } from 'react-router-dom'; +import { + Divider, + FlyoutMenu, + IconDelete16, + IconLink16, + IconMore16, + IconView16, + MenuItem, +} from '@dhis2/ui'; +import i18n from '@dhis2/d2-i18n'; +import { ConditionalTooltip } from '../../Tooltips/ConditionalTooltip'; +import { OverflowButton } from '../../Buttons'; +import { UnlinkModal, UnlinkAndDeleteModal } from './Modal'; +import { buildUrlQueryString } from '../../../utils/routing'; +import type { Props } from './OverflowMenu.types'; +import { useRelationshipTypeAccess } from '../hooks'; + +export const OverflowMenuComponent = ({ + linkedEvent, + relationshipId, + orgUnitId, + originEventId, + stageWriteAccess, + relationshipType, +}: Props) => { + const { push } = useHistory(); + const [isActionsOpen, setIsActionsOpen] = useState(false); + const [isUnlinkModalOpen, setIsUnlinkModalOpen] = useState(false); + const [isUnlinkAndDeleteModalOpen, setIsUnlinkAndDeleteModalOpen] = useState(false); + const { relationshipTypeWriteAccess } = useRelationshipTypeAccess(relationshipType); + + const handleViewLinkedEvent = () => { + push(`/enrollmentEventEdit?${buildUrlQueryString({ eventId: linkedEvent.event, orgUnitId })}`); + setIsActionsOpen(false); + }; + + const handleUnlinkEvent = () => { + setIsUnlinkModalOpen(true); + setIsActionsOpen(false); + }; + + const handleUnlinkAndDeleteEvent = () => { + setIsUnlinkAndDeleteModalOpen(true); + setIsActionsOpen(false); + }; + + return ( + <> + setIsActionsOpen(prev => !prev)} + icon={} + small + secondary + dataTest="widget-linked-event-overflow-menu" + component={ + + } + dataTest="event-overflow-view-linked-event" + onClick={handleViewLinkedEvent} + /> + + + } + disabled={!relationshipTypeWriteAccess} + dense + dataTest="event-overflow-unlink-event" + onClick={handleUnlinkEvent} + /> + + + } + disabled={!stageWriteAccess || !relationshipTypeWriteAccess} + dense + destructive + dataTest="event-overflow-unlink-and-delete-event" + onClick={handleUnlinkAndDeleteEvent} + /> + + + } + /> + {isUnlinkModalOpen && ( + + )} + {isUnlinkAndDeleteModalOpen && ( + + )} + + ); +}; diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/OverflowMenu.types.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/OverflowMenu.types.js new file mode 100644 index 0000000000..61b1f85de3 --- /dev/null +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/OverflowMenu.types.js @@ -0,0 +1,9 @@ +// @flow +export type Props = { + linkedEvent: any, + relationshipId: string, + orgUnitId: string, + originEventId: string, + stageWriteAccess: boolean, + relationshipType: string, +}; diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/index.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/index.js new file mode 100644 index 0000000000..477342f90b --- /dev/null +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/OverflowMenu/index.js @@ -0,0 +1,2 @@ +// @flow +export { OverflowMenuComponent } from './OverflowMenu.component'; diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetHeader/WidgetHeader.container.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetHeader/WidgetHeader.container.js index 129dedd9ec..cc52138727 100644 --- a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetHeader/WidgetHeader.container.js +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetHeader/WidgetHeader.container.js @@ -1,15 +1,12 @@ // @flow -import React, { type ComponentType, useState } from 'react'; -import { useHistory } from 'react-router-dom'; -import { FlyoutMenu, IconMore16, MenuItem, spacersNum } from '@dhis2/ui'; -import i18n from '@dhis2/d2-i18n'; +import React, { type ComponentType } from 'react'; +import { spacersNum } from '@dhis2/ui'; import { withStyles } from '@material-ui/core/'; -import { OverflowButton } from '../../Buttons'; -import { buildUrlQueryString } from '../../../utils/routing'; import { EnrollmentPageKeys } from '../../Pages/common/EnrollmentOverviewDomain/EnrollmentPageLayout/DefaultEnrollmentLayout.constants'; import { NonBundledDhis2Icon } from '../../NonBundledDhis2Icon'; import type { PlainProps, Props } from './WidgetHeader.types'; +import { OverflowMenuComponent } from '../OverflowMenu'; const styles = { menu: { @@ -20,10 +17,17 @@ const styles = { }, }; - -const WidgetHeaderPlain = ({ linkedStage, linkedEvent, orgUnitId, currentPage, classes }: Props) => { - const [actionsIsOpen, setActionsIsOpen] = useState(false); - const { push } = useHistory(); +const WidgetHeaderPlain = ({ + linkedStage, + linkedEvent, + orgUnitId, + currentPage, + relationship, + relationshipType, + stage, + eventId, + classes, +}: Props) => { const { icon } = linkedStage; return ( <> @@ -41,30 +45,13 @@ const WidgetHeaderPlain = ({ linkedStage, linkedEvent, orgUnitId, currentPage, c {linkedStage.name} {currentPage === EnrollmentPageKeys.VIEW_EVENT && (
- setActionsIsOpen(prev => !prev)} - icon={} - small - secondary - dataTest={'widget-event-navigate-to-linked-event'} - component={ - - { - push( - `/enrollmentEventEdit?${buildUrlQueryString({ - eventId: linkedEvent.event, - orgUnitId, - })}`, - ); - setActionsIsOpen(false); - }} - /> - - } +
)} @@ -73,4 +60,3 @@ const WidgetHeaderPlain = ({ linkedStage, linkedEvent, orgUnitId, currentPage, c }; export const WidgetHeader: ComponentType = withStyles(styles)(WidgetHeaderPlain); - diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetHeader/WidgetHeader.types.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetHeader/WidgetHeader.types.js index 9a8b8d460f..383251fdbb 100644 --- a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetHeader/WidgetHeader.types.js +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetHeader/WidgetHeader.types.js @@ -8,10 +8,13 @@ export type PlainProps = {| linkedEvent: { event: string }, linkedStage: ProgramStage, currentPage: $Values | string, + relationship: string, + relationshipType: string, + stage: ProgramStage, + eventId: string, |}; export type Props = {| ...PlainProps, ...CssClasses, |}; - diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetTwoEventWorkspace.container.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetTwoEventWorkspace.container.js index 645f84064a..1851fb8d7b 100644 --- a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetTwoEventWorkspace.container.js +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetTwoEventWorkspace.container.js @@ -21,6 +21,8 @@ export const WidgetTwoEventWorkspace = ({ const { linkedEvent, dataValues, + relationship, + relationshipType, isError: isLinkedEventError, isLoading: isLinkedEventLoading, } = useLinkedEventByOriginId({ originEventId: eventId }); @@ -74,6 +76,10 @@ export const WidgetTwoEventWorkspace = ({ linkedEvent={linkedEvent} orgUnitId={orgUnitId} currentPage={currentPage} + stage={linkedStage} + eventId={eventId} + relationship={relationship} + relationshipType={relationshipType} /> } noncollapsible diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetTwoEventWorkspace.types.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetTwoEventWorkspace.types.js index c79a68c5d5..71bc0471fa 100644 --- a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetTwoEventWorkspace.types.js +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/WidgetTwoEventWorkspace.types.js @@ -21,4 +21,3 @@ export type LinkedEvent = {| occurredAt: string, orgUnit: string, |} - diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/hooks/index.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/hooks/index.js new file mode 100644 index 0000000000..195e176eef --- /dev/null +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/hooks/index.js @@ -0,0 +1,3 @@ +export { useClientDataValues } from './useClientDataValues'; +export { useLinkedEventByOriginId } from './useLinkedEventByOriginId'; +export { useRelationshipTypeAccess } from './useRelationshipTypeAccess'; diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/hooks/useLinkedEventByOriginId.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/hooks/useLinkedEventByOriginId.js index fa876139d7..c2453dbcc1 100644 --- a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/hooks/useLinkedEventByOriginId.js +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/hooks/useLinkedEventByOriginId.js @@ -4,7 +4,7 @@ import { useApiDataQuery } from '../../../utils/reactQueryHelpers'; type Props = {| originEventId: string, -|} +|}; const calculateRelatedStageRelationships = (event) => { if (!event || !event.relationships || event.relationships.length === 0) { @@ -33,6 +33,7 @@ const calculateRelatedStageRelationships = (event) => { return { relationshipType: stageToStageRelationship.relationshipType, + relationshipId: stageToStageRelationship.relationship, linkedEvent, }; }; @@ -42,7 +43,7 @@ export const useLinkedEventByOriginId = ({ originEventId }: Props) => { resource: 'tracker/events', id: originEventId, params: { - fields: 'event,relationships[relationshipType,relationshipName,bidirectional,' + + fields: 'event,relationships[relationship,relationshipType,relationshipName,bidirectional,' + 'from[event[event,dataValues,occurredAt,scheduledAt,status,orgUnit,programStage,program]],' + 'to[event[event,dataValues,*,occurredAt,scheduledAt,status,orgUnit,programStage,program]]' + ']', @@ -59,33 +60,21 @@ export const useLinkedEventByOriginId = ({ originEventId }: Props) => { }, ); - const { - linkedEvent, - relationshipType, - dataValues, - } = useMemo(() => { - if (!data) { - return {}; - } + const { linkedEvent, relationship, relationshipType, dataValues } = useMemo(() => { + if (!data) return {}; const relatedStageRelationship = calculateRelatedStageRelationships(data); - if (!relatedStageRelationship) { - return {}; - } + if (!relatedStageRelationship) return {}; return { linkedEvent: relatedStageRelationship.linkedEvent, + relationship: relatedStageRelationship.relationshipId, relationshipType: relatedStageRelationship.relationshipType, dataValues: relatedStageRelationship.linkedEvent.dataValues, }; }, [data]); - // Add fallback query if relationship is missing eventData - const { - data: fallbackDataValues, - isLoading: isLoadingFallback, - isError: isErrorFallback, - } = useApiDataQuery( + const { data: fallbackDataValues, isLoading: isLoadingFallback } = useApiDataQuery( ['linkedEventDataValuesFallback', linkedEvent?.event], { resource: 'tracker/events', @@ -94,17 +83,16 @@ export const useLinkedEventByOriginId = ({ originEventId }: Props) => { fields: 'event,dataValues,occurredAt,scheduledAt,status,orgUnit,programStage,program', }, }, - { - enabled: !!linkedEvent?.event && !dataValues, - }, + { enabled: !!linkedEvent?.event && !dataValues }, ); return { linkedEvent: dataValues ? linkedEvent : fallbackDataValues, + relationship, relationshipType, dataValues: dataValues || fallbackDataValues?.dataValues, isLoading: isLoading || isLoadingFallback, - isError: isError || isErrorFallback, + isError, error, }; }; diff --git a/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/hooks/useRelationshipTypeAccess.js b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/hooks/useRelationshipTypeAccess.js new file mode 100644 index 0000000000..a4befc955d --- /dev/null +++ b/src/core_modules/capture-core/components/WidgetTwoEventWorkspace/hooks/useRelationshipTypeAccess.js @@ -0,0 +1,27 @@ +// @flow +import { useIndexedDBQuery } from '../../../utils/reactQueryHelpers'; +import { getUserStorageController } from '../../../storageControllers'; +import { userStores } from '../../../storageControllers/stores'; + +export const useRelationshipTypeAccess = (relationshipTypeId: string) => { + const storageController = getUserStorageController(); + + const { data, error, isLoading } = useIndexedDBQuery( + ['relationshipTypeAccess', relationshipTypeId], + () => + storageController.get(userStores.RELATIONSHIP_TYPES, relationshipTypeId, { + project: ({ access }) => ({ + hasWriteAccess: access?.data?.write ?? false, + }), + }), + { + enabled: !!relationshipTypeId, + }, + ); + + return { + relationshipTypeWriteAccess: data?.hasWriteAccess, + isLoading, + error, + }; +}; diff --git a/src/core_modules/capture-core/components/WidgetsChangelog/common/hooks/index.js b/src/core_modules/capture-core/components/WidgetsChangelog/common/hooks/index.js index 7d2911cd6d..d35467e5b7 100644 --- a/src/core_modules/capture-core/components/WidgetsChangelog/common/hooks/index.js +++ b/src/core_modules/capture-core/components/WidgetsChangelog/common/hooks/index.js @@ -1,4 +1,3 @@ // @flow - export { useChangelogData } from './useChangelogData'; export { useListDataValues } from './useListDataValues';