@openmrs/esm-patient-programs-app 12.3.5-pre.11739 → 12.3.5-pre.11751

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/1480.js +1 -1
  3. package/dist/1480.js.map +1 -1
  4. package/dist/1646.js +1 -1
  5. package/dist/1646.js.map +1 -1
  6. package/dist/1869.js +1 -1
  7. package/dist/1869.js.map +1 -1
  8. package/dist/1877.js +1 -1
  9. package/dist/1877.js.map +1 -1
  10. package/dist/2317.js +1 -1
  11. package/dist/2317.js.map +1 -1
  12. package/dist/2416.js +1 -1
  13. package/dist/2416.js.map +1 -1
  14. package/dist/282.js +1 -1
  15. package/dist/282.js.map +1 -1
  16. package/dist/2881.js +1 -1
  17. package/dist/2881.js.map +1 -1
  18. package/dist/3378.js +1 -1
  19. package/dist/3378.js.map +1 -1
  20. package/dist/3906.js +1 -1
  21. package/dist/3906.js.map +1 -1
  22. package/dist/3963.js +1 -1
  23. package/dist/3963.js.map +1 -1
  24. package/dist/4106.js +1 -1
  25. package/dist/4106.js.map +1 -1
  26. package/dist/4111.js +1 -1
  27. package/dist/4111.js.map +1 -1
  28. package/dist/434.js +1 -1
  29. package/dist/434.js.map +1 -1
  30. package/dist/4348.js +1 -1
  31. package/dist/4348.js.map +1 -1
  32. package/dist/4383.js +1 -1
  33. package/dist/4383.js.map +1 -1
  34. package/dist/4658.js +1 -1
  35. package/dist/4658.js.map +1 -1
  36. package/dist/4928.js +1 -1
  37. package/dist/4928.js.map +1 -1
  38. package/dist/5117.js +1 -1
  39. package/dist/5117.js.map +1 -1
  40. package/dist/5132.js +1 -1
  41. package/dist/5132.js.map +1 -1
  42. package/dist/5145.js +1 -1
  43. package/dist/5145.js.map +1 -1
  44. package/dist/5503.js +1 -1
  45. package/dist/5503.js.map +1 -1
  46. package/dist/556.js +1 -1
  47. package/dist/556.js.map +1 -1
  48. package/dist/5644.js +1 -1
  49. package/dist/5644.js.map +1 -1
  50. package/dist/5940.js +1 -1
  51. package/dist/5940.js.map +1 -1
  52. package/dist/6047.js +1 -1
  53. package/dist/6047.js.map +1 -1
  54. package/dist/6371.js +1 -1
  55. package/dist/6371.js.map +1 -1
  56. package/dist/6377.js +1 -1
  57. package/dist/6377.js.map +1 -1
  58. package/dist/6444.js +1 -1
  59. package/dist/6444.js.map +1 -1
  60. package/dist/6508.js +1 -1
  61. package/dist/6508.js.map +1 -1
  62. package/dist/6724.js +1 -1
  63. package/dist/6724.js.map +1 -1
  64. package/dist/6904.js +1 -1
  65. package/dist/6904.js.map +1 -1
  66. package/dist/7045.js +1 -1
  67. package/dist/7045.js.map +1 -1
  68. package/dist/7175.js +1 -1
  69. package/dist/7175.js.map +1 -1
  70. package/dist/7182.js +1 -1
  71. package/dist/7182.js.map +1 -1
  72. package/dist/7742.js +1 -1
  73. package/dist/7742.js.map +1 -1
  74. package/dist/7912.js +1 -1
  75. package/dist/7912.js.map +1 -1
  76. package/dist/8358.js +1 -1
  77. package/dist/8358.js.map +1 -1
  78. package/dist/8359.js +1 -1
  79. package/dist/8359.js.map +1 -1
  80. package/dist/8695.js +1 -1
  81. package/dist/8695.js.map +1 -1
  82. package/dist/903.js +1 -1
  83. package/dist/903.js.map +1 -1
  84. package/dist/9072.js +1 -1
  85. package/dist/9072.js.map +1 -1
  86. package/dist/9806.js +1 -1
  87. package/dist/9806.js.map +1 -1
  88. package/dist/main.js +1 -1
  89. package/dist/openmrs-esm-patient-programs-app.js +1 -1
  90. package/dist/openmrs-esm-patient-programs-app.js.buildmanifest.json +131 -131
  91. package/dist/routes.json +1 -1
  92. package/package.json +2 -2
  93. package/src/programs/programs-form.test.tsx +95 -0
  94. package/src/programs/programs-form.workspace.tsx +34 -11
  95. package/translations/am.json +1 -0
  96. package/translations/ar.json +1 -0
  97. package/translations/ar_SY.json +1 -0
  98. package/translations/bn.json +1 -0
  99. package/translations/cs.json +1 -0
  100. package/translations/de.json +1 -0
  101. package/translations/en.json +1 -0
  102. package/translations/en_US.json +1 -0
  103. package/translations/es.json +1 -0
  104. package/translations/es_MX.json +1 -0
  105. package/translations/fr.json +1 -0
  106. package/translations/he.json +1 -0
  107. package/translations/hi.json +1 -0
  108. package/translations/hi_IN.json +1 -0
  109. package/translations/id.json +1 -0
  110. package/translations/it.json +1 -0
  111. package/translations/ka.json +1 -0
  112. package/translations/km.json +1 -0
  113. package/translations/ku.json +1 -0
  114. package/translations/ky.json +1 -0
  115. package/translations/lg.json +1 -0
  116. package/translations/ne.json +1 -0
  117. package/translations/pl.json +1 -0
  118. package/translations/pt.json +1 -0
  119. package/translations/pt_BR.json +1 -0
  120. package/translations/qu.json +1 -0
  121. package/translations/ro_RO.json +1 -0
  122. package/translations/ru_RU.json +1 -0
  123. package/translations/si.json +1 -0
  124. package/translations/sq.json +1 -0
  125. package/translations/sw.json +1 -0
  126. package/translations/sw_KE.json +1 -0
  127. package/translations/tr.json +1 -0
  128. package/translations/tr_TR.json +1 -0
  129. package/translations/uk.json +1 -0
  130. package/translations/uz.json +1 -0
  131. package/translations/uz@Latn.json +1 -0
  132. package/translations/uz_UZ.json +1 -0
  133. package/translations/vi.json +1 -0
  134. package/translations/zh.json +1 -0
  135. package/translations/zh_CN.json +1 -0
  136. package/translations/zh_TW.json +1 -0
package/dist/routes.json CHANGED
@@ -1 +1 @@
1
- {"$schema":"https://json.openmrs.org/routes.schema.json","backendDependencies":{"webservices.rest":">=2.2.0"},"extensions":[{"name":"programs-overview-widget","component":"programsOverview","meta":{"fullWidth":false},"order":6},{"name":"programs-details-widget","slot":"patient-chart-programs-dashboard-slot","component":"programsDetailedSummary","order":6},{"name":"programs-summary-dashboard","slot":"patient-chart-dashboard-slot","component":"programsDashboardLink","meta":{"slot":"patient-chart-programs-dashboard-slot","path":"programs"},"order":10}],"pages":[],"workspaces2":[{"name":"programs-form-workspace","component":"programsFormWorkspace","window":"programs-form-window"}],"workspaceWindows2":[{"name":"programs-form-window","group":"patient-chart"}],"modals":[{"name":"program-delete-confirmation-modal","component":"deleteProgramConfirmationModal"}],"version":"12.3.5-pre.11739"}
1
+ {"$schema":"https://json.openmrs.org/routes.schema.json","backendDependencies":{"webservices.rest":">=2.2.0"},"extensions":[{"name":"programs-overview-widget","component":"programsOverview","meta":{"fullWidth":false},"order":6},{"name":"programs-details-widget","slot":"patient-chart-programs-dashboard-slot","component":"programsDetailedSummary","order":6},{"name":"programs-summary-dashboard","slot":"patient-chart-dashboard-slot","component":"programsDashboardLink","meta":{"slot":"patient-chart-programs-dashboard-slot","path":"programs"},"order":10}],"pages":[],"workspaces2":[{"name":"programs-form-workspace","component":"programsFormWorkspace","window":"programs-form-window"}],"workspaceWindows2":[{"name":"programs-form-window","group":"patient-chart"}],"modals":[{"name":"program-delete-confirmation-modal","component":"deleteProgramConfirmationModal"}],"version":"12.3.5-pre.11751"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openmrs/esm-patient-programs-app",
3
- "version": "12.3.5-pre.11739",
3
+ "version": "12.3.5-pre.11751",
4
4
  "license": "MPL-2.0",
5
5
  "description": "Patient programs microfrontend for the OpenMRS SPA",
6
6
  "browser": "dist/openmrs-esm-patient-programs-app.js",
@@ -52,7 +52,7 @@
52
52
  "swr": "2.x"
53
53
  },
54
54
  "devDependencies": {
55
- "@openmrs/esm-patient-common-lib": "12.3.5-pre.11739",
55
+ "@openmrs/esm-patient-common-lib": "12.3.5-pre.11751",
56
56
  "openmrs": "next",
57
57
  "vitest": "^4.1.2"
58
58
  },
@@ -6,6 +6,7 @@
6
6
  * matchers on payloads built with `new Date()` in production code.
7
7
  */
8
8
  import React from 'react';
9
+ import dayjs from 'dayjs';
9
10
  import { vi, describe, it, expect } from 'vitest';
10
11
  import userEvent from '@testing-library/user-event';
11
12
  import { fireEvent, render, screen } from '@testing-library/react';
@@ -174,6 +175,100 @@ describe('ProgramsForm', () => {
174
175
  );
175
176
  });
176
177
 
178
+ it('does not submit the form when completion date is before enrollment date', async () => {
179
+ const user = userEvent.setup();
180
+
181
+ // mockEnrolledProgramsResponse[0] has dateEnrolled: '2020-01-16'
182
+ renderProgramsForm(mockEnrolledProgramsResponse[0].uuid);
183
+
184
+ const completionDateInput = screen.getByRole('textbox', { name: /date completed/i });
185
+ const saveButton = screen.getByRole('button', { name: /save and close/i });
186
+
187
+ await user.click(completionDateInput);
188
+ await user.paste('2019-12-01');
189
+ await user.tab();
190
+
191
+ await user.click(saveButton);
192
+
193
+ expect(screen.getByText(/completion date cannot be before the enrollment date/i)).toBeInTheDocument();
194
+ expect(mockCreateProgramEnrollment).not.toHaveBeenCalled();
195
+ expect(mockUpdateProgramEnrollment).not.toHaveBeenCalled();
196
+ });
197
+
198
+ it('submits the form when the completion date is on the same day as the enrollment date', async () => {
199
+ const user = userEvent.setup();
200
+
201
+ // In create mode the enrollment date defaults to `new Date()`, which carries a
202
+ // time-of-day, while the date picker emits midnight. This guards that same-day
203
+ // completion is allowed and saved rather than rejected as "before enrollment".
204
+ const today = dayjs().format('YYYY-MM-DD');
205
+ const oncologyScreeningProgramUuid = '11b129ca-a5e7-4025-84bf-b92a173e20de';
206
+
207
+ renderProgramsForm();
208
+
209
+ const programNameInput = screen.getByRole('combobox', { name: /program name/i });
210
+ const completionDateInput = screen.getByRole('textbox', { name: /date completed/i });
211
+ const saveButton = screen.getByRole('button', { name: /save and close/i });
212
+
213
+ await user.selectOptions(programNameInput, [oncologyScreeningProgramUuid]);
214
+ await user.click(completionDateInput);
215
+ await user.paste(today);
216
+ await user.tab();
217
+
218
+ await user.click(saveButton);
219
+
220
+ expect(mockCreateProgramEnrollment).toHaveBeenCalledTimes(1);
221
+ expect(mockCreateProgramEnrollment).toHaveBeenCalledWith(
222
+ expect.objectContaining({
223
+ dateCompleted: expect.stringMatching(new RegExp(`^${today}`)),
224
+ program: oncologyScreeningProgramUuid,
225
+ patient: mockPatient.id,
226
+ }),
227
+ new AbortController(),
228
+ );
229
+ });
230
+
231
+ it('preserves a stored completion time that falls later than the enrollment time on the same day', async () => {
232
+ const user = userEvent.setup();
233
+
234
+ // The backend only rejects completion strictly before enrollment, so a stored same-day
235
+ // completion time later than the enrollment time is valid and must survive a resave
236
+ // that only touches an unrelated field.
237
+ const sameDayEnrollment = {
238
+ ...mockEnrolledProgramsResponse[0],
239
+ dateEnrolled: '2020-01-16T09:00:00.000+0000',
240
+ dateCompleted: '2020-01-16T17:00:00.000+0000',
241
+ };
242
+
243
+ mockUseEnrollments.mockReturnValue({
244
+ data: [sameDayEnrollment],
245
+ error: null,
246
+ isLoading: false,
247
+ isValidating: false,
248
+ activeEnrollments: [],
249
+ mutateEnrollments: vi.fn(),
250
+ });
251
+
252
+ mockUpdateProgramEnrollment.mockResolvedValue({
253
+ status: 200,
254
+ statusText: 'OK',
255
+ } as unknown as FetchResponse);
256
+
257
+ renderProgramsForm(sameDayEnrollment.uuid);
258
+
259
+ await user.click(screen.getByRole('radio', { name: 'location_2' }));
260
+ await user.click(screen.getByRole('button', { name: /save and close/i }));
261
+
262
+ expect(mockUpdateProgramEnrollment).toHaveBeenCalledTimes(1);
263
+ expect(mockUpdateProgramEnrollment).toHaveBeenCalledWith(
264
+ sameDayEnrollment.uuid,
265
+ expect.objectContaining({
266
+ dateCompleted: dayjs('2020-01-16T17:00:00.000+0000').format(),
267
+ }),
268
+ new AbortController(),
269
+ );
270
+ });
271
+
177
272
  it('renders the programs status field if the config property is set to true', async () => {
178
273
  mockUseConfig.mockReturnValue({
179
274
  ...getDefaultsFromConfigSchema(configSchema),
@@ -46,13 +46,30 @@ export interface ProgramsFormProps {
46
46
  }
47
47
 
48
48
  const createProgramsFormSchema = (t: TFunction) =>
49
- z.object({
50
- selectedProgram: z.string().refine((value) => !!value, t('programRequired', 'Program is required')),
51
- enrollmentDate: z.date(),
52
- completionDate: z.date().optional().nullable(),
53
- enrollmentLocation: z.string(),
54
- selectedProgramStatus: z.string(),
55
- });
49
+ z
50
+ .object({
51
+ selectedProgram: z.string().refine((value) => !!value, t('programRequired', 'Program is required')),
52
+ enrollmentDate: z.date(),
53
+ completionDate: z.date().optional().nullable(),
54
+ enrollmentLocation: z.string(),
55
+ selectedProgramStatus: z.string(),
56
+ })
57
+ .superRefine((data, ctx) => {
58
+ if (
59
+ data.completionDate &&
60
+ data.enrollmentDate &&
61
+ dayjs(data.completionDate).isBefore(data.enrollmentDate, 'day')
62
+ ) {
63
+ ctx.addIssue({
64
+ code: z.ZodIssueCode.custom,
65
+ message: t(
66
+ 'completionDateCannotBeBeforeEnrollmentDate',
67
+ 'Completion date cannot be before the enrollment date',
68
+ ),
69
+ path: ['completionDate'],
70
+ });
71
+ }
72
+ });
56
73
 
57
74
  export type ProgramsFormData = z.infer<ReturnType<typeof createProgramsFormSchema>>;
58
75
 
@@ -122,7 +139,14 @@ const ProgramsForm: React.FC<PatientWorkspace2DefinitionProps<ProgramsFormProps,
122
139
  patient: patientUuid,
123
140
  program: selectedProgram,
124
141
  dateEnrolled: enrollmentDate ? dayjs(enrollmentDate).format() : null,
125
- dateCompleted: completionDate ? dayjs(completionDate).format() : null,
142
+ // The date picker emits midnight timestamps, which the backend would reject as "before" a
143
+ // same-day enrollment. Align those to the enrollment timestamp, but preserve stored
144
+ // completion times that already fall later on the same day.
145
+ dateCompleted: completionDate
146
+ ? dayjs(completionDate).isSame(enrollmentDate, 'day') && dayjs(completionDate).isBefore(enrollmentDate)
147
+ ? dayjs(enrollmentDate).format()
148
+ : dayjs(completionDate).format()
149
+ : null,
126
150
  location: enrollmentLocation,
127
151
  states:
128
152
  !!selectedProgramStatus && selectedProgramStatus != currentState?.state.uuid
@@ -205,7 +229,7 @@ const ProgramsForm: React.FC<PatientWorkspace2DefinitionProps<ProgramsFormProps,
205
229
  data-testid="enrollmentDate"
206
230
  maxDate={(() => {
207
231
  const completionDate = watch('completionDate');
208
- return completionDate ? dayjs(completionDate).subtract(1, 'day').toDate() : new Date();
232
+ return completionDate ? dayjs(completionDate).toDate() : new Date();
209
233
  })()}
210
234
  labelText={t('dateEnrolled', 'Date enrolled')}
211
235
  invalid={Boolean(fieldState?.error?.message)}
@@ -224,9 +248,8 @@ const ProgramsForm: React.FC<PatientWorkspace2DefinitionProps<ProgramsFormProps,
224
248
  {...field}
225
249
  id="completionDate"
226
250
  data-testid="completionDate"
227
- minDate={dayjs(watch('enrollmentDate')).add(1, 'day').toDate()}
251
+ minDate={dayjs(watch('enrollmentDate')).toDate()}
228
252
  maxDate={new Date()}
229
- isDisabled={dayjs(watch('enrollmentDate')).isSame(dayjs(), 'day')}
230
253
  labelText={t('dateCompleted', 'Date completed')}
231
254
  invalid={Boolean(fieldState?.error?.message)}
232
255
  invalidText={fieldState?.error?.message}
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "اختر برنامجًا",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "أكتمل في",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "يرجى تكوين البرامج للمتابعة.",
12
13
  "dateCompleted": "تاريخ الاكتمال",
13
14
  "dateEnrolled": "تاريخ التسجيل",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Wählen Sie ein Programm aus",
9
9
  "chooseStatus": "Wählen Sie ein Programmstatus aus",
10
10
  "completedOn": "Abgeschlossen am",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Bitte konfigurieren Sie die Programme, um fortzufahren.",
12
13
  "dateCompleted": "Datum der Fertigstellung",
13
14
  "dateEnrolled": "Datum der Anmeldung",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Elegir un programa",
9
9
  "chooseStatus": "Elegir un estado de programa",
10
10
  "completedOn": "Completado El",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Por favor, configure los programas para continuar.",
12
13
  "dateCompleted": "Fecha de finalización",
13
14
  "dateEnrolled": "Fecha de inscripción",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choisissez un programme",
9
9
  "chooseStatus": "Choisissez un statut de programme",
10
10
  "completedOn": "Terminé le",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Veuillez configurer des programmes pour continuer.",
12
13
  "dateCompleted": "Date de fin",
13
14
  "dateEnrolled": "Date d'enregistrement",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "בחר תוכנית",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "הושלם בתאריך",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "אנא הגדר תוכניות כדי להמשיך.",
12
13
  "dateCompleted": "תאריך השלמה",
13
14
  "dateEnrolled": "תאריך הרשמה",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Pilih program",
9
9
  "chooseStatus": "Pilih status program",
10
10
  "completedOn": "Selesai Pada",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Harap konfigurasikan program untuk melanjutkan.",
12
13
  "dateCompleted": "Tanggal selesai",
13
14
  "dateEnrolled": "Tanggal pendaftaran",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Scegli un programma",
9
9
  "chooseStatus": "Scegli lo stato del programma",
10
10
  "completedOn": "Completato il",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Configura i programmi per continuare.",
12
13
  "dateCompleted": "Data di completamento",
13
14
  "dateEnrolled": "Data di iscrizione",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "აირჩიეთ პროგრამა",
9
9
  "chooseStatus": "აირჩიეთ პროგრამის სტატუსი",
10
10
  "completedOn": "დასრულების თარიღი",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "დასრულების თარიღი",
13
14
  "dateEnrolled": "ჩარიცხვის თარიღი",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "ជ្រើសរើសកម្មវិធីមួយ",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "បានបញ្ចប់នៅលើ",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "សូមកំណត់រចនាសម្ព័ន្ធកម្មវិធីដើម្បីបន្ត",
12
13
  "dateCompleted": "កាលបរិច្ឆេទដែលបានបំពេញ",
13
14
  "dateEnrolled": "កាលបរិច្ឆេទចុះឈ្មោះ",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Selecione um programa",
9
9
  "chooseStatus": "Selecione um estado do programa",
10
10
  "completedOn": "Concluído em",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Por favor configure programas para continuar.",
12
13
  "dateCompleted": "Data de conclusão",
13
14
  "dateEnrolled": "Data de inscrição",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Escolha um programa",
9
9
  "chooseStatus": "Escolha um status de programa",
10
10
  "completedOn": "Concluído em",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Configure os programas para continuar.",
12
13
  "dateCompleted": "Data de conclusão",
13
14
  "dateEnrolled": "Data de inscrição",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Alege un program",
9
9
  "chooseStatus": "Alege statusul programului",
10
10
  "completedOn": "Finalizat la",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Configureaza programele pentru a continua.",
12
13
  "dateCompleted": "Data finalizarii",
13
14
  "dateEnrolled": "Data inscrierii",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Выберите программу",
9
9
  "chooseStatus": "Выберите статус",
10
10
  "completedOn": "Завершено",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Пожалуйста, настройте программы чтобы продолжить.",
12
13
  "dateCompleted": "Дата завершения",
13
14
  "dateEnrolled": "Дата зачисления",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Chọn một chương trình",
9
9
  "chooseStatus": "Chọn trạng thái chương trình",
10
10
  "completedOn": "Hoàn thành vào",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Vui lòng cấu hình chương trình để tiếp tục.",
12
13
  "dateCompleted": "Ngày hoàn thành",
13
14
  "dateEnrolled": "Ngày ghi danh",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "选择一个项目",
9
9
  "chooseStatus": "选择一个项目状态",
10
10
  "completedOn": "完成于",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "请配置项目以继续。",
12
13
  "dateCompleted": "完成日期",
13
14
  "dateEnrolled": "登记日期",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "选择一个项目",
9
9
  "chooseStatus": "选择一个项目状态",
10
10
  "completedOn": "完成于",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "请配置项目以继续。",
12
13
  "dateCompleted": "完成日期",
13
14
  "dateEnrolled": "登记日期",
@@ -8,6 +8,7 @@
8
8
  "chooseProgram": "Choose a program",
9
9
  "chooseStatus": "Choose a program status",
10
10
  "completedOn": "Completed On",
11
+ "completionDateCannotBeBeforeEnrollmentDate": "Completion date cannot be before the enrollment date",
11
12
  "configurePrograms": "Please configure programs to continue.",
12
13
  "dateCompleted": "Date completed",
13
14
  "dateEnrolled": "Date enrolled",