@openmrs/esm-patient-programs-app 11.3.1-pre.9447 → 11.3.1-pre.9455

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 (106) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/dist/1119.js +1 -1
  3. package/dist/1197.js +1 -1
  4. package/dist/2146.js +1 -1
  5. package/dist/2690.js +1 -1
  6. package/dist/3099.js +1 -1
  7. package/dist/3390.js +1 -1
  8. package/dist/3390.js.map +1 -1
  9. package/dist/3584.js +1 -1
  10. package/dist/3697.js +1 -0
  11. package/dist/3697.js.map +1 -0
  12. package/dist/4055.js +1 -1
  13. package/dist/4132.js +1 -1
  14. package/dist/4335.js +1 -1
  15. package/dist/439.js +1 -1
  16. package/dist/4618.js +1 -1
  17. package/dist/4652.js +1 -1
  18. package/dist/4944.js +1 -1
  19. package/dist/5173.js +1 -1
  20. package/dist/5241.js +1 -1
  21. package/dist/5442.js +1 -1
  22. package/dist/5661.js +1 -1
  23. package/dist/5912.js +1 -1
  24. package/dist/5912.js.map +1 -1
  25. package/dist/6022.js +1 -1
  26. package/dist/6468.js +1 -1
  27. package/dist/6589.js +1 -1
  28. package/dist/6679.js +1 -1
  29. package/dist/6840.js +1 -1
  30. package/dist/6859.js +1 -1
  31. package/dist/7097.js +1 -1
  32. package/dist/7159.js +1 -1
  33. package/dist/723.js +1 -1
  34. package/dist/7617.js +1 -1
  35. package/dist/795.js +1 -1
  36. package/dist/8163.js +1 -1
  37. package/dist/8349.js +1 -1
  38. package/dist/8371.js +1 -1
  39. package/dist/8618.js +1 -1
  40. package/dist/890.js +1 -1
  41. package/dist/9214.js +1 -1
  42. package/dist/9538.js +1 -1
  43. package/dist/9569.js +1 -1
  44. package/dist/986.js +1 -1
  45. package/dist/9879.js +1 -1
  46. package/dist/9895.js +1 -1
  47. package/dist/9900.js +1 -1
  48. package/dist/9913.js +1 -1
  49. package/dist/main.js +1 -1
  50. package/dist/main.js.map +1 -1
  51. package/dist/openmrs-esm-patient-programs-app.js +1 -1
  52. package/dist/openmrs-esm-patient-programs-app.js.buildmanifest.json +158 -158
  53. package/dist/routes.json +1 -1
  54. package/package.json +2 -2
  55. package/src/programs/programs-action-menu.component.tsx +2 -2
  56. package/src/programs/programs-action-menu.test.tsx +2 -2
  57. package/src/programs/programs-detailed-summary.component.tsx +2 -2
  58. package/src/programs/programs-detailed-summary.test.tsx +2 -2
  59. package/src/programs/programs-form.test.tsx +21 -13
  60. package/src/programs/programs-form.workspace.tsx +40 -43
  61. package/src/programs/programs-overview.component.tsx +2 -2
  62. package/src/programs/programs-overview.test.tsx +2 -2
  63. package/src/routes.json +9 -3
  64. package/translations/am.json +1 -2
  65. package/translations/ar.json +1 -2
  66. package/translations/ar_SY.json +1 -2
  67. package/translations/bn.json +1 -2
  68. package/translations/cs.json +1 -2
  69. package/translations/de.json +1 -2
  70. package/translations/en_US.json +1 -2
  71. package/translations/es.json +1 -2
  72. package/translations/es_MX.json +1 -2
  73. package/translations/fr.json +1 -2
  74. package/translations/he.json +1 -2
  75. package/translations/hi.json +1 -2
  76. package/translations/hi_IN.json +1 -2
  77. package/translations/id.json +1 -2
  78. package/translations/it.json +1 -2
  79. package/translations/ka.json +1 -2
  80. package/translations/km.json +1 -2
  81. package/translations/ku.json +1 -2
  82. package/translations/ky.json +1 -2
  83. package/translations/lg.json +1 -2
  84. package/translations/ne.json +1 -2
  85. package/translations/pl.json +1 -2
  86. package/translations/pt.json +1 -2
  87. package/translations/pt_BR.json +1 -2
  88. package/translations/qu.json +1 -2
  89. package/translations/ro_RO.json +1 -2
  90. package/translations/ru_RU.json +1 -2
  91. package/translations/si.json +1 -2
  92. package/translations/sq.json +1 -2
  93. package/translations/sw.json +1 -2
  94. package/translations/sw_KE.json +1 -2
  95. package/translations/tr.json +1 -2
  96. package/translations/tr_TR.json +1 -2
  97. package/translations/uk.json +1 -2
  98. package/translations/uz.json +1 -2
  99. package/translations/uz@Latn.json +1 -2
  100. package/translations/uz_UZ.json +1 -2
  101. package/translations/vi.json +1 -2
  102. package/translations/zh.json +1 -2
  103. package/translations/zh_CN.json +1 -2
  104. package/translations/zh_TW.json +1 -2
  105. package/dist/5048.js +0 -1
  106. package/dist/5048.js.map +0 -1
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":[],"workspaces":[{"name":"programs-form-workspace","title":"programEnrollmentWorkspaceTitle","component":"programsFormWorkspace"}],"modals":[{"name":"program-delete-confirmation-modal","component":"deleteProgramConfirmationModal"}],"version":"11.3.1-pre.9447"}
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":"11.3.1-pre.9455"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openmrs/esm-patient-programs-app",
3
- "version": "11.3.1-pre.9447",
3
+ "version": "11.3.1-pre.9455",
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": "11.3.1-pre.9447",
55
+ "@openmrs/esm-patient-common-lib": "11.3.1-pre.9455",
56
56
  "webpack": "^5.99.9"
57
57
  },
58
58
  "stableVersion": "11.3.0"
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback } from 'react';
2
2
  import { useTranslation } from 'react-i18next';
3
3
  import { Layer, OverflowMenu, OverflowMenuItem } from '@carbon/react';
4
- import { launchWorkspace, showModal, useLayoutType } from '@openmrs/esm-framework';
4
+ import { launchWorkspace2, showModal, useLayoutType } from '@openmrs/esm-framework';
5
5
  import styles from './programs-action-menu.scss';
6
6
 
7
7
  interface ProgramActionsProps {
@@ -15,7 +15,7 @@ export const ProgramsActionMenu = ({ patientUuid, programEnrollmentId }: Program
15
15
 
16
16
  const launchEditProgramsForm = useCallback(
17
17
  () =>
18
- launchWorkspace('programs-form-workspace', {
18
+ launchWorkspace2('programs-form-workspace', {
19
19
  workspaceTitle: t('editProgramEnrollment', 'Edit program enrollment'),
20
20
  programEnrollmentId,
21
21
  }),
@@ -1,13 +1,13 @@
1
1
  import React from 'react';
2
2
  import userEvent from '@testing-library/user-event';
3
3
  import { render, screen, waitFor } from '@testing-library/react';
4
- import { launchWorkspace, showModal, useLayoutType } from '@openmrs/esm-framework';
4
+ import { launchWorkspace2, showModal, useLayoutType } from '@openmrs/esm-framework';
5
5
  import { mockPatient } from 'tools';
6
6
  import { ProgramsActionMenu } from './programs-action-menu.component';
7
7
 
8
8
  const mockShowModal = jest.mocked(showModal);
9
9
  const mockUseLayoutType = jest.mocked(useLayoutType);
10
- const mockLaunchWorkspace = jest.mocked(launchWorkspace);
10
+ const mockLaunchWorkspace = jest.mocked(launchWorkspace2);
11
11
 
12
12
  const testProps = {
13
13
  programEnrollmentId: '123',
@@ -23,7 +23,7 @@ import {
23
23
  useConfig,
24
24
  useLayoutType,
25
25
  isDesktop as desktopLayout,
26
- launchWorkspace,
26
+ launchWorkspace2,
27
27
  } from '@openmrs/esm-framework';
28
28
  import { CardHeader, EmptyState, ErrorState } from '@openmrs/esm-patient-common-lib';
29
29
  import { findLastState, usePrograms } from './programs.resource';
@@ -91,7 +91,7 @@ const ProgramsDetailedSummary: React.FC<ProgramsDetailedSummaryProps> = ({ patie
91
91
  [enrollments, t],
92
92
  );
93
93
 
94
- const launchProgramsForm = useCallback(() => launchWorkspace('programs-form-workspace'), []);
94
+ const launchProgramsForm = useCallback(() => launchWorkspace2('programs-form-workspace'), []);
95
95
 
96
96
  const isEnrolledInAllPrograms = useMemo(() => {
97
97
  if (!availablePrograms?.length || !enrollments?.length) {
@@ -1,13 +1,13 @@
1
1
  import React from 'react';
2
2
  import userEvent from '@testing-library/user-event';
3
3
  import { screen, within } from '@testing-library/react';
4
- import { getDefaultsFromConfigSchema, launchWorkspace, openmrsFetch, useConfig } from '@openmrs/esm-framework';
4
+ import { getDefaultsFromConfigSchema, launchWorkspace2, openmrsFetch, useConfig } from '@openmrs/esm-framework';
5
5
  import { mockCareProgramsResponse, mockEnrolledInAllProgramsResponse, mockEnrolledProgramsResponse } from '__mocks__';
6
6
  import { mockPatient, renderWithSwr, waitForLoadingToFinish } from 'tools';
7
7
  import { type ConfigObject, configSchema } from '../config-schema';
8
8
  import ProgramsDetailedSummary from './programs-detailed-summary.component';
9
9
 
10
- const mockLaunchWorkspace = jest.mocked(launchWorkspace);
10
+ const mockLaunchWorkspace = jest.mocked(launchWorkspace2);
11
11
  const mockUseConfig = jest.mocked(useConfig<ConfigObject>);
12
12
  const mockOpenmrsFetch = openmrsFetch as jest.Mock;
13
13
 
@@ -16,8 +16,9 @@ import {
16
16
  useAvailablePrograms,
17
17
  useEnrollments,
18
18
  } from './programs.resource';
19
- import ProgramsForm from './programs-form.workspace';
19
+ import ProgramsForm, { type ProgramsFormProps } from './programs-form.workspace';
20
20
  import { type ConfigObject, configSchema } from '../config-schema';
21
+ import { type PatientWorkspace2DefinitionProps } from '@openmrs/esm-patient-common-lib';
21
22
 
22
23
  const mockUseAvailablePrograms = jest.mocked(useAvailablePrograms);
23
24
  const mockUseEnrollments = jest.mocked(useEnrollments);
@@ -26,19 +27,22 @@ const mockUpdateProgramEnrollment = jest.mocked(updateProgramEnrollment);
26
27
  const mockShowSnackbar = jest.mocked(showSnackbar);
27
28
  const mockUseLocations = jest.mocked(useLocations);
28
29
  const mockCloseWorkspace = jest.fn();
29
- const mockCloseWorkspaceWithSavedChanges = jest.fn();
30
- const mockPromptBeforeClosing = jest.fn();
31
30
  const mockUseConfig = jest.mocked(useConfig<ConfigObject>);
32
31
 
33
- const testProps = {
32
+ const testProps: PatientWorkspace2DefinitionProps<ProgramsFormProps, {}> = {
34
33
  closeWorkspace: mockCloseWorkspace,
35
- closeWorkspaceWithSavedChanges: mockCloseWorkspaceWithSavedChanges,
36
- patientUuid: mockPatient.id,
37
- patient: mockPatient,
38
- promptBeforeClosing: mockPromptBeforeClosing,
39
- setTitle: jest.fn(),
40
- visitContext: null,
41
- mutateVisitContext: null,
34
+ groupProps: {
35
+ patientUuid: mockPatient.id,
36
+ patient: mockPatient,
37
+ visitContext: null,
38
+ mutateVisitContext: null,
39
+ },
40
+ workspaceName: '',
41
+ launchChildWorkspace: jest.fn(),
42
+ workspaceProps: {},
43
+ windowProps: {},
44
+ windowName: '',
45
+ isRootWorkspace: false,
42
46
  };
43
47
 
44
48
  jest.mock('./programs.resource', () => ({
@@ -111,7 +115,7 @@ describe('ProgramsForm', () => {
111
115
  new AbortController(),
112
116
  );
113
117
 
114
- expect(mockCloseWorkspaceWithSavedChanges).toHaveBeenCalledTimes(1);
118
+ expect(mockCloseWorkspace).toHaveBeenCalledTimes(1);
115
119
  expect(mockShowSnackbar).toHaveBeenCalledTimes(1);
116
120
  expect(mockShowSnackbar).toHaveBeenCalledWith({
117
121
  subtitle: 'It is now visible in the Programs table',
@@ -174,5 +178,9 @@ describe('ProgramsForm', () => {
174
178
  });
175
179
 
176
180
  function renderProgramsForm(programEnrollmentUuidToEdit?: string) {
177
- render(<ProgramsForm {...testProps} programEnrollmentId={programEnrollmentUuidToEdit} />);
181
+ const props = {
182
+ ...testProps,
183
+ workspaceProps: { programEnrollmentId: programEnrollmentUuidToEdit },
184
+ };
185
+ render(<ProgramsForm {...props} />);
178
186
  }
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useEffect, useMemo } from 'react';
1
+ import React, { useCallback, useMemo } from 'react';
2
2
  import classNames from 'classnames';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import type { TFunction } from 'i18next';
@@ -28,8 +28,9 @@ import {
28
28
  useConfig,
29
29
  useLayoutType,
30
30
  useSession,
31
+ Workspace2,
31
32
  } from '@openmrs/esm-framework';
32
- import { type DefaultPatientWorkspaceProps } from '@openmrs/esm-patient-common-lib';
33
+ import { type PatientWorkspace2DefinitionProps } from '@openmrs/esm-patient-common-lib';
33
34
  import { type ConfigObject } from '../config-schema';
34
35
  import {
35
36
  createProgramEnrollment,
@@ -40,7 +41,7 @@ import {
40
41
  } from './programs.resource';
41
42
  import styles from './programs-form.scss';
42
43
 
43
- interface ProgramsFormProps extends DefaultPatientWorkspaceProps {
44
+ export interface ProgramsFormProps {
44
45
  programEnrollmentId?: string;
45
46
  }
46
47
 
@@ -55,12 +56,10 @@ const createProgramsFormSchema = (t: TFunction) =>
55
56
 
56
57
  export type ProgramsFormData = z.infer<ReturnType<typeof createProgramsFormSchema>>;
57
58
 
58
- const ProgramsForm: React.FC<ProgramsFormProps> = ({
59
+ const ProgramsForm: React.FC<PatientWorkspace2DefinitionProps<ProgramsFormProps, {}>> = ({
59
60
  closeWorkspace,
60
- closeWorkspaceWithSavedChanges,
61
- patientUuid,
62
- programEnrollmentId,
63
- promptBeforeClosing,
61
+ groupProps: { patientUuid },
62
+ workspaceProps: { programEnrollmentId },
64
63
  }) => {
65
64
  const { t } = useTranslation();
66
65
  const isTablet = useLayoutType() === 'tablet';
@@ -115,10 +114,6 @@ const ProgramsForm: React.FC<ProgramsFormProps> = ({
115
114
 
116
115
  const selectedProgram = useWatch({ control, name: 'selectedProgram' });
117
116
 
118
- useEffect(() => {
119
- promptBeforeClosing(() => isDirty);
120
- }, [isDirty, promptBeforeClosing]);
121
-
122
117
  const onSubmit = useCallback(
123
118
  async (data: ProgramsFormData) => {
124
119
  const { selectedProgram, enrollmentDate, completionDate, enrollmentLocation, selectedProgramStatus } = data;
@@ -145,7 +140,7 @@ const ProgramsForm: React.FC<ProgramsFormProps> = ({
145
140
  }
146
141
 
147
142
  await mutateEnrollments();
148
- closeWorkspaceWithSavedChanges();
143
+ closeWorkspace({ discardUnsavedChanges: true });
149
144
 
150
145
  showSnackbar({
151
146
  kind: 'success',
@@ -164,7 +159,7 @@ const ProgramsForm: React.FC<ProgramsFormProps> = ({
164
159
  });
165
160
  }
166
161
  },
167
- [closeWorkspaceWithSavedChanges, currentEnrollment, currentState, mutateEnrollments, patientUuid, t],
162
+ [closeWorkspace, currentEnrollment, currentState, mutateEnrollments, patientUuid, t],
168
163
  );
169
164
 
170
165
  const programName = (
@@ -331,36 +326,38 @@ const ProgramsForm: React.FC<ProgramsFormProps> = ({
331
326
  }
332
327
 
333
328
  return (
334
- <Form className={styles.form} onSubmit={handleSubmit(onSubmit)}>
335
- <Stack className={styles.formContainer} gap={7}>
336
- {!availablePrograms.length && (
337
- <InlineNotification
338
- className={styles.notification}
339
- kind="error"
340
- lowContrast
341
- subtitle={t('configurePrograms', 'Please configure programs to continue.')}
342
- title={t('noProgramsConfigured', 'No programs configured')}
343
- />
344
- )}
345
- {formGroups.map((group, i) => (
346
- <FormGroup style={group.style} legendText={group.legendText} key={i}>
347
- <div className={styles.selectContainer}>{isTablet ? <Layer>{group.value}</Layer> : group.value}</div>
348
- </FormGroup>
349
- ))}
350
- </Stack>
351
- <ButtonSet className={classNames(isTablet ? styles.tablet : styles.desktop)}>
352
- <Button className={styles.button} kind="secondary" onClick={() => closeWorkspace()}>
353
- {getCoreTranslation('cancel')}
354
- </Button>
355
- <Button className={styles.button} disabled={isSubmitting} kind="primary" type="submit">
356
- {isSubmitting ? (
357
- <InlineLoading description={t('saving', 'Saving') + '...'} />
358
- ) : (
359
- <span>{t('saveAndClose', 'Save and close')}</span>
329
+ <Workspace2 title={t('programEnrollmentWorkspaceTitle', 'Program enrollment')} hasUnsavedChanges={isDirty}>
330
+ <Form className={styles.form} onSubmit={handleSubmit(onSubmit)}>
331
+ <Stack className={styles.formContainer} gap={7}>
332
+ {!availablePrograms.length && (
333
+ <InlineNotification
334
+ className={styles.notification}
335
+ kind="error"
336
+ lowContrast
337
+ subtitle={t('configurePrograms', 'Please configure programs to continue.')}
338
+ title={t('noProgramsConfigured', 'No programs configured')}
339
+ />
360
340
  )}
361
- </Button>
362
- </ButtonSet>
363
- </Form>
341
+ {formGroups.map((group, i) => (
342
+ <FormGroup style={group.style} legendText={group.legendText} key={i}>
343
+ <div className={styles.selectContainer}>{isTablet ? <Layer>{group.value}</Layer> : group.value}</div>
344
+ </FormGroup>
345
+ ))}
346
+ </Stack>
347
+ <ButtonSet className={classNames(isTablet ? styles.tablet : styles.desktop)}>
348
+ <Button className={styles.button} kind="secondary" onClick={() => closeWorkspace()}>
349
+ {getCoreTranslation('cancel')}
350
+ </Button>
351
+ <Button className={styles.button} disabled={isSubmitting} kind="primary" type="submit">
352
+ {isSubmitting ? (
353
+ <InlineLoading description={t('saving', 'Saving') + '...'} />
354
+ ) : (
355
+ <span>{t('saveAndClose', 'Save and close')}</span>
356
+ )}
357
+ </Button>
358
+ </ButtonSet>
359
+ </Form>
360
+ </Workspace2>
364
361
  );
365
362
  };
366
363
 
@@ -21,7 +21,7 @@ import {
21
21
  type ConfigObject,
22
22
  formatDate,
23
23
  formatDatetime,
24
- launchWorkspace,
24
+ launchWorkspace2,
25
25
  useConfig,
26
26
  useLayoutType,
27
27
  usePagination,
@@ -54,7 +54,7 @@ const ProgramsOverview: React.FC<ProgramsOverviewProps> = ({ basePath, patientUu
54
54
 
55
55
  const { results: paginatedEnrollments, goTo, currentPage } = usePagination(enrollments ?? [], programsCount);
56
56
 
57
- const launchProgramsForm = useCallback(() => launchWorkspace('programs-form-workspace'), []);
57
+ const launchProgramsForm = useCallback(() => launchWorkspace2('programs-form-workspace'), []);
58
58
 
59
59
  const tableHeaders = [
60
60
  {
@@ -1,13 +1,13 @@
1
1
  import React from 'react';
2
2
  import userEvent from '@testing-library/user-event';
3
3
  import { screen, within } from '@testing-library/react';
4
- import { launchWorkspace, openmrsFetch } from '@openmrs/esm-framework';
4
+ import { launchWorkspace2, openmrsFetch } from '@openmrs/esm-framework';
5
5
  import { mockCareProgramsResponse, mockEnrolledInAllProgramsResponse, mockEnrolledProgramsResponse } from '__mocks__';
6
6
  import { mockPatient, renderWithSwr, waitForLoadingToFinish } from 'tools';
7
7
  import ProgramsOverview from './programs-overview.component';
8
8
 
9
9
  const mockOpenmrsFetch = openmrsFetch as jest.Mock;
10
- const mockLaunchWorkspace = jest.mocked(launchWorkspace);
10
+ const mockLaunchWorkspace = jest.mocked(launchWorkspace2);
11
11
 
12
12
  const testProps = {
13
13
  basePath: `/patient/${mockPatient.id}/chart`,
package/src/routes.json CHANGED
@@ -30,11 +30,17 @@
30
30
  }
31
31
  ],
32
32
  "pages": [],
33
- "workspaces": [
33
+ "workspaces2": [
34
34
  {
35
35
  "name": "programs-form-workspace",
36
- "title": "programEnrollmentWorkspaceTitle",
37
- "component": "programsFormWorkspace"
36
+ "component": "programsFormWorkspace",
37
+ "window": "programs-form-window"
38
+ }
39
+ ],
40
+ "workspaceWindows2": [
41
+ {
42
+ "name": "programs-form-window",
43
+ "group": "patient-chart"
38
44
  }
39
45
  ],
40
46
  "modals": [
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "There are no more programs left to enroll this patient in",
30
30
  "noProgramsConfigured": "No programs configured",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "Program enrollments",
33
32
  "programEnrollmentSaveError": "Error saving program enrollment",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "Program name",
36
36
  "programRequired": "Program is required",
37
- "programs": "Program enrollments",
38
37
  "Programs": "Programs",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "Save and close",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "لا توجد برامج أخرى لتسجيل هذا المريض فيها",
30
30
  "noProgramsConfigured": "لم يتم تكوين أي برامج",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "تسجيلات البرنامج",
33
32
  "programEnrollmentSaveError": "خطأ في حفظ التسجيل في البرنامج",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "اسم البرنامج",
36
36
  "programRequired": "Program is required",
37
- "programs": "تسجيلات البرنامج",
38
37
  "Programs": "البرامج",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "حفظ وإغلاق",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "There are no more programs left to enroll this patient in",
30
30
  "noProgramsConfigured": "No programs configured",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "Program enrollments",
33
32
  "programEnrollmentSaveError": "Error saving program enrollment",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "Program name",
36
36
  "programRequired": "Program is required",
37
- "programs": "Program enrollments",
38
37
  "Programs": "Programs",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "Save and close",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "There are no more programs left to enroll this patient in",
30
30
  "noProgramsConfigured": "No programs configured",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "Program enrollments",
33
32
  "programEnrollmentSaveError": "Error saving program enrollment",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "Program name",
36
36
  "programRequired": "Program is required",
37
- "programs": "Program enrollments",
38
37
  "Programs": "Programs",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "Save and close",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "There are no more programs left to enroll this patient in",
30
30
  "noProgramsConfigured": "No programs configured",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "Program enrollments",
33
32
  "programEnrollmentSaveError": "Error saving program enrollment",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "Program name",
36
36
  "programRequired": "Program is required",
37
- "programs": "Program enrollments",
38
37
  "Programs": "Programs",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "Save and close",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "There are no more programs left to enroll this patient in",
30
30
  "noProgramsConfigured": "No programs configured",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "Program enrollments",
33
32
  "programEnrollmentSaveError": "Error saving program enrollment",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "Program name",
36
36
  "programRequired": "Program is required",
37
- "programs": "Program enrollments",
38
37
  "Programs": "Programs",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "Save and close",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "There are no more programs left to enroll this patient in",
30
30
  "noProgramsConfigured": "No programs configured",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "Program enrollments",
33
32
  "programEnrollmentSaveError": "Error saving program enrollment",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "Program name",
36
36
  "programRequired": "Program is required",
37
- "programs": "Program enrollments",
38
37
  "Programs": "Programs",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "Save and close",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "No quedan más programas en los que inscribir a este paciente",
30
30
  "noProgramsConfigured": "No hay programas configurados",
31
31
  "programEnrollmentDeleted": "Inscripción al programa eliminada",
32
- "programEnrollments": "Inscripciones a los programas",
33
32
  "programEnrollmentSaveError": "Error al guardar la inscripción al programa",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Registrar la inscripción al programa",
35
35
  "programName": "Nombre del programa",
36
36
  "programRequired": "El programa es obligatorio",
37
- "programs": "Inscripciones a los programas",
38
37
  "Programs": "Programas",
39
38
  "programStatus": "Estado del programa",
40
39
  "saveAndClose": "Guardar y cerrar",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "There are no more programs left to enroll this patient in",
30
30
  "noProgramsConfigured": "No programs configured",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "Program enrollments",
33
32
  "programEnrollmentSaveError": "Error saving program enrollment",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "Program name",
36
36
  "programRequired": "Program is required",
37
- "programs": "Program enrollments",
38
37
  "Programs": "Programs",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "Save and close",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "Il n'y a plus de programme où enregistrer le patient",
30
30
  "noProgramsConfigured": "Aucun programme configuré",
31
31
  "programEnrollmentDeleted": "Inscription au programme supprimée",
32
- "programEnrollments": "Enregistrement dans les programmes",
33
32
  "programEnrollmentSaveError": "Erreur d'enregistrement dans le programme",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Enregistrer les inscriptions au programme",
35
35
  "programName": "Nom du programme",
36
36
  "programRequired": "Le programme est requis",
37
- "programs": "programmes",
38
37
  "Programs": "Programmes",
39
38
  "programStatus": "Statut du programme",
40
39
  "saveAndClose": "Sauvegarder et fermer",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "אין עוד תוכניות שניתן להרשים את המטופל בהן",
30
30
  "noProgramsConfigured": "לא מוגדרות תוכניות",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "הרשמות לתוכניות",
33
32
  "programEnrollmentSaveError": "שגיאה בשמירת הרשמת התוכנית",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "שם התוכנית",
36
36
  "programRequired": "Program is required",
37
- "programs": "תוכניות",
38
37
  "Programs": "תוכניות",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "שמור וסגור",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "There are no more programs left to enroll this patient in",
30
30
  "noProgramsConfigured": "No programs configured",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "Program enrollments",
33
32
  "programEnrollmentSaveError": "Error saving program enrollment",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "Program name",
36
36
  "programRequired": "Program is required",
37
- "programs": "Program enrollments",
38
37
  "Programs": "Programs",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "Save and close",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "There are no more programs left to enroll this patient in",
30
30
  "noProgramsConfigured": "No programs configured",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "Program enrollments",
33
32
  "programEnrollmentSaveError": "Error saving program enrollment",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "Program name",
36
36
  "programRequired": "Program is required",
37
- "programs": "Program enrollments",
38
37
  "Programs": "Programs",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "Save and close",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "Tidak ada program lagi yang tersisa untuk mendaftarkan pasien ini",
30
30
  "noProgramsConfigured": "Tidak ada program yang dikonfigurasi",
31
31
  "programEnrollmentDeleted": "Pendaftaran program dihapus",
32
- "programEnrollments": "Pendaftaran program",
33
32
  "programEnrollmentSaveError": "Kesalahan menyimpan pendaftaran program",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Rekam pendaftaran program",
35
35
  "programName": "Nama program",
36
36
  "programRequired": "Program wajib diisi",
37
- "programs": "Pendaftaran program",
38
37
  "Programs": "Program",
39
38
  "programStatus": "Status program",
40
39
  "saveAndClose": "Simpan dan tutup",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "Non ci sono più programmi disponibili per l'iscrizione di questo paziente",
30
30
  "noProgramsConfigured": "Nessun programma configurato",
31
31
  "programEnrollmentDeleted": "Iscrizione al programma eliminata",
32
- "programEnrollments": "Iscrizioni ai programmi",
33
32
  "programEnrollmentSaveError": "Errore nel salvataggio dell'iscrizione al programma",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Registra iscrizione al programma",
35
35
  "programName": "Nome del programma",
36
36
  "programRequired": "Il programma è obbligatorio",
37
- "programs": "Iscrizioni ai programmi",
38
37
  "Programs": "Programmi",
39
38
  "programStatus": "Stato del programma",
40
39
  "saveAndClose": "Salva e chiudi",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "There are no more programs left to enroll this patient in",
30
30
  "noProgramsConfigured": "პროგრამები მორგებული არაა",
31
31
  "programEnrollmentDeleted": "აღმოჩენილია პროგრამაში ჩარიცხვა",
32
- "programEnrollments": "პროგრამაში ჩარიცხვები",
33
32
  "programEnrollmentSaveError": "პროგრამაში ჩარიცხვის შენახვის შეცდომა",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "პროგრამაში ჩარიცხვის ჩაწერა",
35
35
  "programName": "პროგრამის სახელი",
36
36
  "programRequired": "პროგრამა აუცილებელია",
37
- "programs": "პროგრამაში ჩარიცხვები",
38
37
  "Programs": "პროგრამები",
39
38
  "programStatus": "პროგრამის სტატუსი",
40
39
  "saveAndClose": "შენახვა და დახურვა",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "មិនមានកម្មវិធីទៀតទេដើម្បីចុះឈ្មោះអ្នកជំងឺនេះ",
30
30
  "noProgramsConfigured": "មិនមានកម្មវិធីដែលបានកំណត់រចនាសម្ព័ន្ធទេ",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "ការចុះឈ្មោះកម្មវិធី",
33
32
  "programEnrollmentSaveError": "កំហុសក្នុងការរក្សាទុកការចុះឈ្មោះកម្មវិធី",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "ឈ្មោះកម្មវិធី",
36
36
  "programRequired": "Program is required",
37
- "programs": "កម្មវិធី",
38
37
  "Programs": "កម្មវិធី",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "រក្សាទុក និងបិទ",
@@ -29,12 +29,11 @@
29
29
  "noEligibleEnrollments": "There are no more programs left to enroll this patient in",
30
30
  "noProgramsConfigured": "No programs configured",
31
31
  "programEnrollmentDeleted": "Program enrollment deleted",
32
- "programEnrollments": "Program enrollments",
33
32
  "programEnrollmentSaveError": "Error saving program enrollment",
33
+ "programEnrollmentsLower": "program enrollments",
34
34
  "programEnrollmentWorkspaceTitle": "Record program enrollment",
35
35
  "programName": "Program name",
36
36
  "programRequired": "Program is required",
37
- "programs": "Program enrollments",
38
37
  "Programs": "Programs",
39
38
  "programStatus": "Program status",
40
39
  "saveAndClose": "Save and close",