Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

(fix) O3-3013 Appointment Form should validate invalid time values #1069

Merged
merged 2 commits into from
Mar 29, 2024

Conversation

mseaton
Copy link
Member

@mseaton mseaton commented Mar 29, 2024

Requirements

  • This PR has a title that briefly describes the work done including the ticket number. If there is a ticket, make sure your PR title includes a conventional commit label. See existing PR titles for inspiration.
  • My work conforms to the OpenMRS 3.0 Styleguide and design documentation.
  • My work includes tests or is validated by existing tests.

Summary

If you enter an invalid time in the time field input when scheduling an appointment, nothing prevents the form submission, and the invalid time is discarded and the time is set to midnight on the appointment. This is problematic, particularly since times like "11" might be entered, which are invalid, and are just silently saved as midnight.

Screenshots

image

Related Issue

https://openmrs.atlassian.net/browse/O3-3013

Copy link
Contributor

Size Change: +120 B (0%)

Total Size: 3.1 MB

ℹ️ View Unchanged
Filename Size Change
packages/esm-active-visits-app/dist/130.js 148 kB 0 B
packages/esm-active-visits-app/dist/255.js 2.21 kB 0 B
packages/esm-active-visits-app/dist/271.js 762 B 0 B
packages/esm-active-visits-app/dist/277.js 13.4 kB 0 B
packages/esm-active-visits-app/dist/316.js 42.9 kB 0 B
packages/esm-active-visits-app/dist/319.js 683 B 0 B
packages/esm-active-visits-app/dist/382.js 1.15 kB 0 B
packages/esm-active-visits-app/dist/448.js 47.1 kB 0 B
packages/esm-active-visits-app/dist/460.js 784 B 0 B
packages/esm-active-visits-app/dist/574.js 588 B 0 B
packages/esm-active-visits-app/dist/588.js 6.66 kB 0 B
packages/esm-active-visits-app/dist/635.js 1.15 kB 0 B
packages/esm-active-visits-app/dist/644.js 762 B 0 B
packages/esm-active-visits-app/dist/729.js 3.1 kB 0 B
packages/esm-active-visits-app/dist/757.js 695 B 0 B
packages/esm-active-visits-app/dist/784.js 2.63 kB 0 B
packages/esm-active-visits-app/dist/788.js 586 B 0 B
packages/esm-active-visits-app/dist/807.js 918 B 0 B
packages/esm-active-visits-app/dist/833.js 732 B 0 B
packages/esm-active-visits-app/dist/879.js 2.94 kB 0 B
packages/esm-active-visits-app/dist/main.js 65 kB 0 B
packages/esm-active-visits-app/dist/openmrs-esm-active-visits-app.js 3.33 kB 0 B
packages/esm-appointments-app/dist/130.js 148 kB 0 B
packages/esm-appointments-app/dist/152.js 257 B 0 B
packages/esm-appointments-app/dist/255.js 2.22 kB 0 B
packages/esm-appointments-app/dist/262.js 9.36 kB 0 B
packages/esm-appointments-app/dist/271.js 2.26 kB 0 B
packages/esm-appointments-app/dist/303.js 258 B 0 B
packages/esm-appointments-app/dist/319.js 2.2 kB 0 B
packages/esm-appointments-app/dist/337.js 259 kB 0 B
packages/esm-appointments-app/dist/390.js 26 kB 0 B
packages/esm-appointments-app/dist/4.js 1.77 kB 0 B
packages/esm-appointments-app/dist/460.js 2.4 kB 0 B
packages/esm-appointments-app/dist/500.js 2.51 kB 0 B
packages/esm-appointments-app/dist/574.js 1.95 kB +8 B (0%)
packages/esm-appointments-app/dist/588.js 6.65 kB 0 B
packages/esm-appointments-app/dist/591.js 16.9 kB 0 B
packages/esm-appointments-app/dist/644.js 2.26 kB 0 B
packages/esm-appointments-app/dist/729.js 3.1 kB 0 B
packages/esm-appointments-app/dist/757.js 2.02 kB 0 B
packages/esm-appointments-app/dist/784.js 2.63 kB 0 B
packages/esm-appointments-app/dist/788.js 1.96 kB 0 B
packages/esm-appointments-app/dist/807.js 2.66 kB 0 B
packages/esm-appointments-app/dist/833.js 2.26 kB 0 B
packages/esm-appointments-app/dist/989.js 51 kB +66 B (0%)
packages/esm-appointments-app/dist/main.js 322 kB +46 B (0%)
packages/esm-appointments-app/dist/openmrs-esm-appointments-app.js 3.42 kB 0 B
packages/esm-patient-list-management-app/dist/130.js 148 kB 0 B
packages/esm-patient-list-management-app/dist/255.js 2.21 kB 0 B
packages/esm-patient-list-management-app/dist/271.js 1.55 kB 0 B
packages/esm-patient-list-management-app/dist/295.js 99.3 kB 0 B
packages/esm-patient-list-management-app/dist/319.js 1.52 kB 0 B
packages/esm-patient-list-management-app/dist/382.js 1.15 kB 0 B
packages/esm-patient-list-management-app/dist/460.js 1.7 kB 0 B
packages/esm-patient-list-management-app/dist/574.js 1.34 kB 0 B
packages/esm-patient-list-management-app/dist/588.js 6.66 kB 0 B
packages/esm-patient-list-management-app/dist/591.js 16.9 kB 0 B
packages/esm-patient-list-management-app/dist/635.js 1.15 kB 0 B
packages/esm-patient-list-management-app/dist/644.js 1.55 kB 0 B
packages/esm-patient-list-management-app/dist/716.js 4.66 kB 0 B
packages/esm-patient-list-management-app/dist/729.js 3.1 kB 0 B
packages/esm-patient-list-management-app/dist/757.js 1.5 kB 0 B
packages/esm-patient-list-management-app/dist/784.js 2.64 kB 0 B
packages/esm-patient-list-management-app/dist/788.js 1.34 kB 0 B
packages/esm-patient-list-management-app/dist/807.js 1.84 kB 0 B
packages/esm-patient-list-management-app/dist/833.js 1.58 kB 0 B
packages/esm-patient-list-management-app/dist/995.js 21.9 kB 0 B
packages/esm-patient-list-management-app/dist/main.js 125 kB 0 B
packages/esm-patient-list-management-app/dist/openmrs-esm-patient-list-management-app.js 3.29 kB 0 B
packages/esm-patient-registration-app/dist/130.js 148 kB 0 B
packages/esm-patient-registration-app/dist/152.js 262 B 0 B
packages/esm-patient-registration-app/dist/255.js 2.21 kB 0 B
packages/esm-patient-registration-app/dist/271.js 2.01 kB 0 B
packages/esm-patient-registration-app/dist/303.js 260 B 0 B
packages/esm-patient-registration-app/dist/319.js 1.99 kB 0 B
packages/esm-patient-registration-app/dist/460.js 2.12 kB 0 B
packages/esm-patient-registration-app/dist/481.js 6.75 kB 0 B
packages/esm-patient-registration-app/dist/537.js 2.34 kB 0 B
packages/esm-patient-registration-app/dist/574.js 1.7 kB 0 B
packages/esm-patient-registration-app/dist/591.js 16.9 kB 0 B
packages/esm-patient-registration-app/dist/644.js 2.01 kB 0 B
packages/esm-patient-registration-app/dist/676.js 6.59 kB 0 B
packages/esm-patient-registration-app/dist/686.js 92 kB 0 B
packages/esm-patient-registration-app/dist/729.js 3.1 kB 0 B
packages/esm-patient-registration-app/dist/735.js 464 B 0 B
packages/esm-patient-registration-app/dist/757.js 2.07 kB 0 B
packages/esm-patient-registration-app/dist/783.js 36.2 kB 0 B
packages/esm-patient-registration-app/dist/784.js 2.64 kB 0 B
packages/esm-patient-registration-app/dist/788.js 1.7 kB 0 B
packages/esm-patient-registration-app/dist/807.js 2.43 kB 0 B
packages/esm-patient-registration-app/dist/833.js 1.97 kB 0 B
packages/esm-patient-registration-app/dist/879.js 2.94 kB 0 B
packages/esm-patient-registration-app/dist/main.js 130 kB 0 B
packages/esm-patient-registration-app/dist/openmrs-esm-patient-registration-app.js 3.34 kB 0 B
packages/esm-patient-search-app/dist/130.js 148 kB 0 B
packages/esm-patient-search-app/dist/255.js 2.21 kB 0 B
packages/esm-patient-search-app/dist/271.js 899 B 0 B
packages/esm-patient-search-app/dist/319.js 857 B 0 B
packages/esm-patient-search-app/dist/382.js 1.15 kB 0 B
packages/esm-patient-search-app/dist/460.js 924 B 0 B
packages/esm-patient-search-app/dist/574.js 732 B 0 B
packages/esm-patient-search-app/dist/584.js 21.7 kB 0 B
packages/esm-patient-search-app/dist/588.js 6.66 kB 0 B
packages/esm-patient-search-app/dist/591.js 16.9 kB 0 B
packages/esm-patient-search-app/dist/635.js 1.15 kB 0 B
packages/esm-patient-search-app/dist/644.js 899 B 0 B
packages/esm-patient-search-app/dist/729.js 3.1 kB 0 B
packages/esm-patient-search-app/dist/757.js 864 B 0 B
packages/esm-patient-search-app/dist/778.js 23.1 kB 0 B
packages/esm-patient-search-app/dist/784.js 2.63 kB 0 B
packages/esm-patient-search-app/dist/788.js 726 B 0 B
packages/esm-patient-search-app/dist/807.js 1.03 kB 0 B
packages/esm-patient-search-app/dist/833.js 867 B 0 B
packages/esm-patient-search-app/dist/main.js 48 kB 0 B
packages/esm-patient-search-app/dist/openmrs-esm-patient-search-app.js 3.3 kB 0 B
packages/esm-service-queues-app/dist/115.js 56.4 kB 0 B
packages/esm-service-queues-app/dist/130.js 148 kB 0 B
packages/esm-service-queues-app/dist/152.js 262 B 0 B
packages/esm-service-queues-app/dist/233.js 1.79 kB 0 B
packages/esm-service-queues-app/dist/255.js 2.22 kB 0 B
packages/esm-service-queues-app/dist/263.js 3.52 kB 0 B
packages/esm-service-queues-app/dist/271.js 3.86 kB 0 B
packages/esm-service-queues-app/dist/303.js 261 B 0 B
packages/esm-service-queues-app/dist/319.js 3.34 kB 0 B
packages/esm-service-queues-app/dist/328.js 3.29 kB 0 B
packages/esm-service-queues-app/dist/389.js 1.89 kB 0 B
packages/esm-service-queues-app/dist/425.js 2.08 kB 0 B
packages/esm-service-queues-app/dist/460.js 4.17 kB 0 B
packages/esm-service-queues-app/dist/574.js 3.49 kB 0 B
packages/esm-service-queues-app/dist/588.js 6.66 kB 0 B
packages/esm-service-queues-app/dist/591.js 16.9 kB 0 B
packages/esm-service-queues-app/dist/616.js 2.71 kB 0 B
packages/esm-service-queues-app/dist/644.js 3.86 kB 0 B
packages/esm-service-queues-app/dist/694.js 2.64 kB 0 B
packages/esm-service-queues-app/dist/696.js 570 B 0 B
packages/esm-service-queues-app/dist/729.js 3.1 kB 0 B
packages/esm-service-queues-app/dist/738.js 554 B 0 B
packages/esm-service-queues-app/dist/745.js 159 kB 0 B
packages/esm-service-queues-app/dist/757.js 3.34 kB 0 B
packages/esm-service-queues-app/dist/784.js 2.63 kB 0 B
packages/esm-service-queues-app/dist/788.js 3.34 kB 0 B
packages/esm-service-queues-app/dist/806.js 1.67 kB 0 B
packages/esm-service-queues-app/dist/807.js 4.61 kB 0 B
packages/esm-service-queues-app/dist/833.js 3.86 kB 0 B
packages/esm-service-queues-app/dist/981.js 2.95 kB 0 B
packages/esm-service-queues-app/dist/main.js 219 kB 0 B
packages/esm-service-queues-app/dist/openmrs-esm-service-queues-app.js 3.3 kB 0 B

compressed-size-action

} from '@openmrs/esm-framework';
import { convertTime12to24 } from '@openmrs/esm-patient-common-lib';
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The use of this function from patient-common-lib was a big part of the problem, as it is what is responsible for (silently) returning a value of "midnight" if the converted time fails to match the expected format. This gets rid of the usage of this and adds the appropriate handling directly.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ibacher @denniskigen assumedly we should ticket and fix the convertTime12to24 as well, unless for some reason that behavior is expected?

const time12HourFormatRegexPattern = '(1[0-2]|0?[1-9]):[0-5][0-9]';
function isValidTime(timeStr) {
return timeStr.match(new RegExp(time12HourFormatRegexPattern));
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Simple validation function to check the time format - used within the carbon field component to control whether the "invalid time" message appears, and within the form schema to control whether the form submission is allowed.

@@ -66,7 +68,7 @@ const appointmentsFormSchema = z.object({
recurringPatternPeriod: z.number(),
recurringPatternDaysOfWeek: z.array(z.string()),
selectedDaysOfWeekText: z.string().optional(),
startTime: z.string(),
startTime: z.string().refine((value) => isValidTime(value)),
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems to be needed to prevent the form submission if the value fails validation

pattern="([\d]+:[\d]{2})"
pattern={time12HourFormatRegexPattern}
invalid={!isValidTime(value)}
invalidText={t('invalidTime', 'Invalid time')}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't quite know what the pattern property here accomplishes. It doesn't seem to have much effect. The invalid and invalidText seem to be what is needed to display a validation error below the field if the input value is invalid.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fwiw, the pattern attribute is explained here: https://react.carbondesignsystem.com/?path=/docs/components-timepicker--overview

On quick glance, it seems like it is supposed to do what the invalid function is doing? I have found that React Carbon elements don't have the greatest documentation (in this case, perhaps the pattern works in conjunction with warning, just a guess?) so if we can't get this to work and are relying on invalid, probably just remove the pattern attribute entirely to avoid future confusion.

Copy link
Contributor

@chibongho chibongho Mar 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pattern seems to be what the browser uses to check pattern on form submission. https://www.w3schools.com/TAGS/att_input_pattern.asp

I'm guessing invalid can be set whenever, and doesn't need to be tied to form submission action.

const [hours, minutes] = convertTime12to24(startTime, timeFormat);
const hoursAndMinutes = startTime.split(':').map((item) => parseInt(item, 10));
const hours = (hoursAndMinutes[0] % 12) + (timeFormat === 'PM' ? 12 : 0);
const minutes = hoursAndMinutes[1];
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This logic is essentially what was in the convertTime12to24 method without the erroneous handling of invalid values.

Copy link
Member

@mogoodrich mogoodrich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @mseaton a couple comments, but LGTM

} from '@openmrs/esm-framework';
import { convertTime12to24 } from '@openmrs/esm-patient-common-lib';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ibacher @denniskigen assumedly we should ticket and fix the convertTime12to24 as well, unless for some reason that behavior is expected?

pattern="([\d]+:[\d]{2})"
pattern={time12HourFormatRegexPattern}
invalid={!isValidTime(value)}
invalidText={t('invalidTime', 'Invalid time')}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fwiw, the pattern attribute is explained here: https://react.carbondesignsystem.com/?path=/docs/components-timepicker--overview

On quick glance, it seems like it is supposed to do what the invalid function is doing? I have found that React Carbon elements don't have the greatest documentation (in this case, perhaps the pattern works in conjunction with warning, just a guess?) so if we can't get this to work and are relying on invalid, probably just remove the pattern attribute entirely to avoid future confusion.

Copy link
Contributor

@chibongho chibongho left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. A bit unnerving that convertTime12to24 defaults to 00:00 silently on error...

pattern="([\d]+:[\d]{2})"
pattern={time12HourFormatRegexPattern}
invalid={!isValidTime(value)}
invalidText={t('invalidTime', 'Invalid time')}
Copy link
Contributor

@chibongho chibongho Mar 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pattern seems to be what the browser uses to check pattern on form submission. https://www.w3schools.com/TAGS/att_input_pattern.asp

I'm guessing invalid can be set whenever, and doesn't need to be tied to form submission action.

@mseaton mseaton merged commit 44f67cb into main Mar 29, 2024
6 checks passed
@mseaton mseaton deleted the O3-3013 branch March 29, 2024 13:50
senthil-athiban pushed a commit to senthil-athiban/openmrs-esm-patient-management that referenced this pull request Apr 15, 2024
denniskigen added a commit that referenced this pull request Aug 8, 2024
…e left empty (#1182)

* (fix) fix typo on recurring appointment label (#1047)

* (fix) service queues - make edit queue entry modal body scrollable if content is too long (#1042)

* (fix) O3-2471 recommended visit type tab should only show if configured to do so (#1045)

* (fix) service queues - unescape queue name when passed into t() (#1043)

Co-authored-by: Jayasanka Weerasinghe <33048395+jayasanka-sack@users.noreply.github.com>

* (refactor) O3-2891: Refactor Patient Appointments ESM into Appointments ESM (#1048)

* (feat) re-use upcomming appointment work to mark appointments as `Checked In` (#1050)

* (chore) Update translations from Transifex (#1011)

Co-authored-by: OpenMRS Bot <infrastructure@openmrs.org>
Co-authored-by: Mark Goodrich <mgoodrich@pih.org>

* (feat) use configured identifier type on appointment table (#1054)

* (fix) add `@openmrs/esm-patient-common-lib` as peer dependency and register appointment workspace correctly (#1053)

* (fix): Enhanced Tablet View: Service Queues Metrics Header Overhaul (#1046)

* (fix): Tablet-UI. Making Tablet Service-queues metrics header responsive on tablet mode

Signed-off-by: Joshua Murithi <brodiamyzalius@gmail.com>

* Fixup

---------

Signed-off-by: Joshua Murithi <brodiamyzalius@gmail.com>
Co-authored-by: Dennis Kigen <kigen.work@gmail.com>

* (chore) Update translations from Transifex (#1055)

Co-authored-by: OpenMRS Bot <infrastructure@openmrs.org>
Co-authored-by: Mark Goodrich <mgoodrich@pih.org>

* Enhanced Monthly Calendar UI for Appointment Scheduler (#1049)

* Enhanced Monthly Calendar UI for Appointment Scheduler

* clicking on a day from within the month to change the appointment date

* Localized days in weeks

* Removed weekly calendar view on appointment scheduler

---------

Co-authored-by: Donald Kibet <chelashawdonald@yahoo.com>

* (BREAKING) O3-2748 service queues - add ability to undo transitions and void queue entries (#1052)

* (BREAKGING) O3-2748 service queues - add ability to undo transitions and void queue entries

* add tests

* minor wording fixup

* remove unused imports

* change undo transition route per update in backend PR

* address PR comments

* (chore) O3-2989 service queues - refactor <PatientSearch> to not have things unrelated to patient serach (#1058)

* (feat) O3-2892: Add Patient-Centric View within the Appointments App (#1057)

* O3-2788 (fix) appointments table should correctly search by patient name or identifier (#1067)

* (fix) O3-3009 Appointment form should limit location to those tagged as 'Appointment Location' (#1066)

* (fix) O3-3013 Appointment Form should validate invalid time values (#1069)

* (fix) O3-3013 appointment time validation should match entire string (#1073)

* (feature) O3-2930: Add date of birth to patient details in Appointments Module

Co-authored-by: Mark Goodrich <mgoodrich@pih.org>

* (feat) O3-3025: Add validation in change status modal for service queues (#1076)

* (feat) O3-3025: Add validation in change status modal for service queues

* (test) updated test to reflect changes

* (fix) O3-2748 service queue - fix NPE in undo transition dialog (#1077)

* (fix) Fix queue filtering by location (#1078)

* (chore) Separate linting and formatting concerns (#1080)

* (feat) O3-3030 - make new queue table support creating new queue entry (#1079)

* (feat) O3-3030 - make new queue table support creating new queue entry

* fix metrics

* address PR comment

* (fix):O3-3039-Fix Incorrect Client Selection Issue When Navigating Pages in Queue Table (#1082)

* (refactor) O3-3012: Switch registering appointments form workspace ba… (#1068)

* (fix) Fix error for undifined attribute type (#1083)

* (test) O3-3005: Add E2E test for registering an unknown patient (#1070)

Co-authored-by: Dennis Kigen <kigen.work@gmail.com>

* (fix) Handle null start date on patient list details (#1081)

* Handle null start date on list details

* Removed unnecessary optional chaining

---------

Co-authored-by: Dennis Kigen <kigen.work@gmail.com>

* (chore) Update translations from Transifex (#1059)

Co-authored-by: OpenMRS Bot <infrastructure@openmrs.org>
Co-authored-by: Ian <52504170+ibacher@users.noreply.github.com>

* (refactor) O3-2685: Inconsistent / Duplicated Appointments List UI between Home App and Appointments App (#1084)

* (chore) Fix Prettier glob patterns

* O3-3030 service queues: fix NPE in mapVisitQueueEntryProperties (#1085)

* O3-3030 service queues: fix NPE in mapVisitQueueEntryProperties

* change default rep string for queue entries to include visit encounters

---------

Co-authored-by: Makombe Kennedy <kennedymakombe@gmail.com>

* (test) Remove mock implementations of usePagination (#1088)

* (test) Remove mock implementations of usePagination

* Fixup

* (chore) Bump playwright (#1090)

* O3-3043 - (feat) service queues - add new view of queue entries showin… (#1086)

* O3-3043 - (feat) service queues - add new view of queue entries showing one table per status

* move queue-table-for-all-statuses into view/

* (chore) Flag rules-of-hooks lint violations (#1091)

* (chore) Flag rules-of-hooks lint violations

* Fix e2e tests

* (chore) Update translations from Transifex (#1087)

Co-authored-by: OpenMRS Bot <infrastructure@openmrs.org>
Co-authored-by: Ian <52504170+ibacher@users.noreply.github.com>

* (feat) O3-3063: UI tweaks for the Today's appointments widget (#1092)

* (feat) UI tweaks for the Today's appointments widget

* Appointments dashboard fixes

* (fix) O3-3063: Fix appointments table empty state text (#1094)

* (feat) O3:3063: Appointments dashboard UI tweaks (#1096)

* (fix) Fix appointment metrics error state

* Enhanced relationship display logic to differentiate 'Patient' roles (#1089)

* (fix): improve client side form validation

* (fix): error validation

* Fixup

---------

Signed-off-by: Joshua Murithi <brodiamyzalius@gmail.com>
Co-authored-by: Donald Kibet <chelashawdonald@yahoo.com>
Co-authored-by: chibongho <cbho@pih.org>
Co-authored-by: Michael Seaton <mseaton@pih.org>
Co-authored-by: Jayasanka Weerasinghe <33048395+jayasanka-sack@users.noreply.github.com>
Co-authored-by: Mark Goodrich <mgoodrich@pih.org>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: OpenMRS Bot <infrastructure@openmrs.org>
Co-authored-by: Joshua Murithi <brodiamyzalius@gmail.com>
Co-authored-by: Dennis Kigen <kigen.work@gmail.com>
Co-authored-by: Gabriel Mbatha Ngao <gabriel.mbatha@gmail.com>
Co-authored-by: sparsh989 <151712330+sparsh989@users.noreply.github.com>
Co-authored-by: Makombe Kennedy <kennedymakombe@gmail.com>
Co-authored-by: Daud Kakumirizi <dkakumirizii@gmail.com>
Co-authored-by: Pedro Sousa - ICRC <68599335+icrc-psousa@users.noreply.github.com>
Co-authored-by: Ian <52504170+ibacher@users.noreply.github.com>
Co-authored-by: Piyush Mishra <91911367+piyushmishra1416@users.noreply.github.com>
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants