@openmrs/esm-fast-data-entry-app 1.0.1-pre.17 → 1.0.1-pre.171

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 (148) hide show
  1. package/README.md +21 -2
  2. package/dist/101.js +1 -0
  3. package/dist/101.js.map +1 -0
  4. package/dist/132.js +1 -1
  5. package/dist/143.js +1 -0
  6. package/dist/143.js.map +1 -0
  7. package/dist/188.js +1 -0
  8. package/dist/188.js.map +1 -0
  9. package/dist/197.js +1 -0
  10. package/dist/219.js +1 -0
  11. package/dist/219.js.map +1 -0
  12. package/dist/221.js +1 -0
  13. package/dist/221.js.map +1 -0
  14. package/dist/259.js +1 -0
  15. package/dist/259.js.map +1 -0
  16. package/dist/29.js +2 -0
  17. package/dist/29.js.LICENSE.txt +3 -0
  18. package/dist/29.js.map +1 -0
  19. package/dist/300.js +1 -0
  20. package/dist/31.js +2 -0
  21. package/dist/{569.js.LICENSE.txt → 31.js.LICENSE.txt} +9 -6
  22. package/dist/31.js.map +1 -0
  23. package/dist/326.js +1 -0
  24. package/dist/326.js.map +1 -0
  25. package/dist/335.js +1 -0
  26. package/dist/367.js +1 -0
  27. package/dist/367.js.map +1 -0
  28. package/dist/480.js +1 -0
  29. package/dist/491.js +1 -0
  30. package/dist/491.js.map +1 -0
  31. package/dist/540.js +2 -0
  32. package/dist/540.js.map +1 -0
  33. package/dist/55.js +1 -0
  34. package/dist/564.js +1 -0
  35. package/dist/564.js.map +1 -0
  36. package/dist/602.js +1 -0
  37. package/dist/602.js.map +1 -0
  38. package/dist/626.js +2 -0
  39. package/dist/626.js.LICENSE.txt +9 -0
  40. package/dist/626.js.map +1 -0
  41. package/dist/652.js +1 -0
  42. package/dist/685.js +1 -0
  43. package/dist/685.js.map +1 -0
  44. package/dist/773.js +2 -0
  45. package/dist/{68.js.LICENSE.txt → 773.js.LICENSE.txt} +13 -2
  46. package/dist/773.js.map +1 -0
  47. package/dist/91.js +1 -0
  48. package/dist/91.js.map +1 -0
  49. package/dist/961.js +2 -0
  50. package/dist/961.js.map +1 -0
  51. package/dist/99.js +1 -0
  52. package/dist/99.js.map +1 -0
  53. package/dist/main.js +1 -1
  54. package/dist/main.js.map +1 -0
  55. package/dist/openmrs-esm-fast-data-entry-app.js +1 -1
  56. package/dist/openmrs-esm-fast-data-entry-app.js.buildmanifest.json +403 -136
  57. package/dist/openmrs-esm-fast-data-entry-app.js.map +1 -0
  58. package/dist/routes.json +1 -0
  59. package/jest.config.json +2 -1
  60. package/package.json +42 -37
  61. package/src/CancelModal.tsx +48 -0
  62. package/src/CompleteModal.tsx +46 -0
  63. package/src/FormBootstrap.tsx +32 -4
  64. package/src/add-group-modal/AddGroupModal.tsx +110 -60
  65. package/src/add-group-modal/styles.scss +7 -3
  66. package/src/config-schema.ts +62 -0
  67. package/src/context/FormWorkflowContext.tsx +13 -1
  68. package/src/context/FormWorkflowReducer.ts +13 -3
  69. package/src/context/GroupFormWorkflowContext.tsx +43 -6
  70. package/src/context/GroupFormWorkflowReducer.ts +160 -15
  71. package/src/declarations.d.ts +4 -0
  72. package/src/empty-state/styles.scss +14 -14
  73. package/src/form-entry-workflow/FormEntryWorkflow.tsx +74 -102
  74. package/src/form-entry-workflow/form-review-card/styles.scss +9 -11
  75. package/src/form-entry-workflow/patient-banner/styles.scss +11 -12
  76. package/src/form-entry-workflow/patient-search-header/PatientSearchHeader.tsx +2 -2
  77. package/src/form-entry-workflow/patient-search-header/styles.scss +13 -10
  78. package/src/form-entry-workflow/styles.scss +13 -14
  79. package/src/form-entry-workflow/workflow-review/WorkflowReview.tsx +5 -3
  80. package/src/form-entry-workflow/workflow-review/styles.scss +0 -4
  81. package/src/forms-page/FormsPage.tsx +10 -5
  82. package/src/forms-page/forms-table/FormsTable.tsx +11 -5
  83. package/src/forms-page/forms-table/styles.scss +4 -5
  84. package/src/forms-page/styles.scss +3 -5
  85. package/src/group-form-entry-workflow/GroupFormEntryWorkflow.tsx +12 -399
  86. package/src/group-form-entry-workflow/GroupSessionWorkspace.tsx +238 -0
  87. package/src/group-form-entry-workflow/SessionDetailsForm.tsx +177 -0
  88. package/src/group-form-entry-workflow/SessionMetaWorkspace.tsx +107 -0
  89. package/src/group-form-entry-workflow/attendance-table/AttendanceTable.tsx +144 -0
  90. package/src/group-form-entry-workflow/attendance-table/index.ts +1 -0
  91. package/src/group-form-entry-workflow/configurable-questions/ConfigurableQuestionsSection.tsx +47 -0
  92. package/src/group-form-entry-workflow/group-display-header/GroupDisplayHeader.tsx +1 -9
  93. package/src/group-form-entry-workflow/group-display-header/styles.scss +20 -20
  94. package/src/group-form-entry-workflow/group-search/CompactGroupSearch.tsx +1 -1
  95. package/src/group-form-entry-workflow/group-search/GroupSearch.tsx +1 -1
  96. package/src/group-form-entry-workflow/group-search/compact-group-result.scss +16 -17
  97. package/src/group-form-entry-workflow/group-search/compact-group-search.scss +7 -8
  98. package/src/group-form-entry-workflow/group-search/group-search.scss +20 -23
  99. package/src/group-form-entry-workflow/group-search-header/GroupSearchHeader.tsx +36 -6
  100. package/src/group-form-entry-workflow/group-search-header/styles.scss +8 -8
  101. package/src/group-form-entry-workflow/styles.scss +15 -17
  102. package/src/hooks/index.ts +8 -1
  103. package/src/hooks/useForm.ts +73 -0
  104. package/src/hooks/useGetAllForms.ts +3 -2
  105. package/src/hooks/useGetEncounter.ts +2 -2
  106. package/src/hooks/useGetPatient.ts +1 -1
  107. package/src/hooks/useGetPatients.ts +34 -0
  108. package/src/hooks/useGetSystemSetting.ts +38 -0
  109. package/src/hooks/usePostEndpoint.ts +10 -4
  110. package/src/hooks/useSearchEndpoint.ts +14 -8
  111. package/src/hooks/useStartVisit.ts +93 -0
  112. package/src/index.ts +13 -65
  113. package/src/patient-card/styles.scss +3 -4
  114. package/src/routes.json +24 -0
  115. package/src/types.ts +20 -0
  116. package/tools/i18next-parser.config.js +93 -0
  117. package/translations/am.json +75 -0
  118. package/translations/ar.json +75 -0
  119. package/translations/en.json +32 -11
  120. package/translations/es.json +75 -0
  121. package/translations/fr.json +75 -0
  122. package/translations/he.json +75 -0
  123. package/translations/km.json +75 -0
  124. package/turbo.json +18 -0
  125. package/dist/247.js +0 -1
  126. package/dist/255.js +0 -1
  127. package/dist/294.js +0 -2
  128. package/dist/32.js +0 -1
  129. package/dist/327.js +0 -1
  130. package/dist/403.js +0 -2
  131. package/dist/403.js.LICENSE.txt +0 -14
  132. package/dist/553.js +0 -2
  133. package/dist/553.js.LICENSE.txt +0 -14
  134. package/dist/569.js +0 -2
  135. package/dist/574.js +0 -1
  136. package/dist/595.js +0 -2
  137. package/dist/595.js.LICENSE.txt +0 -1
  138. package/dist/617.js +0 -1
  139. package/dist/68.js +0 -2
  140. package/dist/776.js +0 -1
  141. package/dist/804.js +0 -1
  142. package/dist/820.js +0 -1
  143. package/dist/906.js +0 -1
  144. package/dist/935.js +0 -2
  145. package/dist/openmrs-esm-fast-data-entry-app.old +0 -1
  146. package/src/declarations.d.tsx +0 -2
  147. /package/dist/{294.js.LICENSE.txt → 540.js.LICENSE.txt} +0 -0
  148. /package/dist/{935.js.LICENSE.txt → 961.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openmrs-esm-fast-data-entry-app.js","mappings":"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","sources":["webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/load script","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/consumes","webpack://@openmrs/esm-fast-data-entry-app/webpack/container-entry","webpack://@openmrs/esm-fast-data-entry-app/webpack/bootstrap","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/compat get default export","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/define property getters","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/ensure chunk","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/get javascript chunk filename","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/global","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/hasOwnProperty shorthand","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/make namespace object","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/node module decorator","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/sharing","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/publicPath","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/jsonp chunk loading","webpack://@openmrs/esm-fast-data-entry-app/webpack/runtime/nonce","webpack://@openmrs/esm-fast-data-entry-app/webpack/startup"],"names":["inProgress","dataWebpackPrefix","parseVersion","versionLt","rangeToString","satisfy","findSingletonVersionKey","getInvalidSingletonVersionMessage","getSingletonVersion","warn","get","loadSingletonVersionCheckFallback","installedModules","moduleToHandlerMapping","chunkMapping","moduleMap","__webpack_require__","e","then","module","getScope","R","o","Promise","resolve","Error","undefined","init","shareScope","initScope","S","name","oldScope","I","d","exports","__webpack_module_cache__","moduleId","cachedModule","id","loaded","__webpack_modules__","call","m","c","n","getter","__esModule","a","definition","key","Object","defineProperty","enumerable","f","chunkId","all","keys","reduce","promises","u","g","globalThis","this","Function","window","obj","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","i","length","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","forEach","fn","setTimeout","bind","type","target","head","appendChild","r","Symbol","toStringTag","value","nmd","paths","children","initPromises","initTokens","initToken","indexOf","scope","uniqueName","register","version","factory","eager","versions","activeVersion","from","scriptUrl","importScripts","location","currentScript","test","replace","p","str","split","map","exec","apply","b","t","range","pop","requiredVersion","scopeName","msg","console","entry","promise","fallback","consumes","onFactory","onError","error","installedChunks","j","installedChunkData","reject","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","data","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}
@@ -0,0 +1 @@
1
+ {"$schema":"https://json.openmrs.org/routes.schema.json","backendDependencies":{"fhir2":">=1.2","webservices.rest":"^2.2.0"},"pages":[{"component":"root","routeRegex":"forms","online":true,"offline":true}],"extensions":[{"name":"forms-app-link","slot":"app-menu-slot","component":"formsAppMenuLink","online":true,"offline":true}],"version":"1.0.1-pre.171"}
package/jest.config.json CHANGED
@@ -8,7 +8,8 @@
8
8
  "\\.(s?css)$": "identity-obj-proxy",
9
9
  "@openmrs/esm-framework": "@openmrs/esm-framework/mock",
10
10
  "^lodash-es/(.*)$": "lodash/$1",
11
- "^uuid$": "<rootDir>/node_modules/uuid/dist/index.js"
11
+ "^uuid$": "<rootDir>/node_modules/uuid/dist/index.js",
12
+ "^dexie$": "<rootDir>/node_modules/dexie"
12
13
  },
13
14
  "setupFilesAfterEnv": [
14
15
  "<rootDir>/src/setup-tests.ts"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openmrs/esm-fast-data-entry-app",
3
- "version": "1.0.1-pre.17",
3
+ "version": "1.0.1-pre.171",
4
4
  "license": "MPL-2.0",
5
5
  "description": "An OpenMRS 3.x microfrontend",
6
6
  "browser": "dist/openmrs-esm-fast-data-entry-app.js",
@@ -9,20 +9,16 @@
9
9
  "scripts": {
10
10
  "start": "openmrs develop",
11
11
  "serve": "webpack serve --mode=development",
12
- "build": "webpack --mode production",
12
+ "build": "webpack --mode production --color",
13
13
  "analyze": "webpack --mode=production --env.analyze=true",
14
- "lint": "eslint \"src/**/*.ts\" \"src/**/*.tsx\" --fix --max-warnings=0 -c .eslintrc.js",
15
- "prettier": "prettier --write \"src/**/*.{ts,tsx}\"",
14
+ "lint": "eslint \"src/**/*.ts\" \"src/**/*.tsx\" --fix --max-warnings=0",
15
+ "prettier": "prettier --write \"src/**/*.{ts,tsx}\" --list-different",
16
16
  "typescript": "tsc",
17
17
  "test": "jest --config jest.config.json --passWithNoTests",
18
- "verify": "concurrently 'yarn:lint' 'yarn:test' 'yarn:typescript'",
18
+ "verify": "turbo lint typescript test",
19
19
  "coverage": "yarn test -- --coverage ",
20
- "prepare": "husky install"
21
- },
22
- "husky": {
23
- "hooks": {
24
- "pre-commit": "pretty-quick --staged && yarn verify"
25
- }
20
+ "postinstall": "husky install",
21
+ "extract-translations": "i18next 'src/**/*.tsx' --config ./tools/i18next-parser.config.js"
26
22
  },
27
23
  "browserslist": [
28
24
  "extends browserslist-config-openmrs"
@@ -49,51 +45,60 @@
49
45
  "react": "18.x",
50
46
  "react-dom": "18.x",
51
47
  "react-i18next": "11.x",
52
- "react-router-dom": "6.x"
48
+ "react-router-dom": "6.x",
49
+ "swr": "2.x"
53
50
  },
54
51
  "devDependencies": {
55
- "@carbon/react": "^1.9.0",
52
+ "@carbon/react": "^1.37.0",
56
53
  "@openmrs/esm-framework": "next",
57
- "@swc/core": "^1.2.245",
58
- "@swc/jest": "^0.2.22",
59
- "@testing-library/dom": "^7.20.0",
60
- "@testing-library/jest-dom": "^5.16.5",
61
- "@testing-library/react": "^13.3.0",
54
+ "@swc-node/loader": "^1.3.7",
55
+ "@swc/core": "^1.3.84",
56
+ "@swc/jest": "^0.2.29",
57
+ "@testing-library/dom": "^7.31.2",
58
+ "@testing-library/jest-dom": "^5.17.0",
59
+ "@testing-library/react": "^13.4.0",
62
60
  "@testing-library/user-event": "^14.4.3",
63
- "@types/jest": "^28.1.7",
64
- "@types/react-dom": "^18.0.6",
61
+ "@types/jest": "^28.1.8",
62
+ "@types/react-dom": "^18.2.7",
65
63
  "@types/react-router-dom": "^5.3.3",
66
- "@types/testing-library__jest-dom": "^5.14.5",
67
- "@types/webpack-env": "^1.16.0",
68
- "@typescript-eslint/parser": "^5.14.0",
69
- "concurrently": "^6.2.0",
70
- "eslint": "^8.20.0",
71
- "eslint-config-prettier": "^8.3.0",
64
+ "@types/testing-library__jest-dom": "^5.14.9",
65
+ "@types/webpack-env": "^1.18.1",
66
+ "@typescript-eslint/eslint-plugin": "^6.7.0",
67
+ "@typescript-eslint/parser": "^6.7.0",
68
+ "concurrently": "^6.5.1",
69
+ "css-loader": "^6.8.1",
70
+ "eslint": "^8.49.0",
71
+ "eslint-config-prettier": "^8.10.0",
72
72
  "eslint-config-react-app": "^7.0.1",
73
- "eslint-config-ts-react-important-stuff": "^3.0.0",
74
73
  "eslint-plugin-prettier": "^4.2.1",
75
- "husky": "^8.0.1",
74
+ "husky": "^8.0.3",
76
75
  "identity-obj-proxy": "^3.0.0",
77
76
  "jest": "^28.1.3",
78
77
  "jest-cli": "^28.1.3",
79
78
  "jest-environment-jsdom": "^28.1.3",
80
79
  "lodash-es": "^4.17.21",
81
80
  "openmrs": "next",
82
- "prettier": "^2.3.0",
83
- "pretty-quick": "^3.1.0",
81
+ "prettier": "^2.8.8",
82
+ "pretty-quick": "^3.1.3",
84
83
  "react": "^18.2.0",
85
84
  "react-dom": "^18.2.0",
86
- "react-i18next": "^11.18.4",
87
- "react-router-dom": "^6.3.0",
88
- "semver": "^7.3.7",
85
+ "react-i18next": "^11.18.6",
86
+ "react-router-dom": "^6.15.0",
87
+ "semver": "^7.5.4",
89
88
  "swc-loader": "^0.2.3",
90
- "typescript": "^4.7.3",
91
- "webpack": "^5.73.0"
89
+ "swr": "^2.2.4",
90
+ "turbo": "^1.10.13",
91
+ "typescript": "^4.9.5",
92
+ "webpack": "^5.88.2",
93
+ "webpack-cli": "^5.1.4"
92
94
  },
93
- "packageManager": "yarn@3.2.2",
94
95
  "dependencies": {
96
+ "i18next": "^21.10.0",
97
+ "i18next-parser": "^6.6.0",
95
98
  "react-hook-form": "^7.34.2",
96
- "swr": "1.1.2"
99
+ "turbo": "^1.12.4",
100
+ "uuid": "^9.0.1"
97
101
  },
102
+ "packageManager": "yarn@4.1.1",
98
103
  "stableVersion": "1.0.0"
99
104
  }
@@ -0,0 +1,48 @@
1
+ import {
2
+ Button,
3
+ ComposedModal,
4
+ ModalBody,
5
+ ModalFooter,
6
+ ModalHeader,
7
+ } from "@carbon/react";
8
+ import React from "react";
9
+ import { useTranslation } from "react-i18next";
10
+
11
+ const CancelModal = ({ open, setOpen, context }) => {
12
+ const { t } = useTranslation();
13
+
14
+ const onCancel = () => setOpen(false);
15
+
16
+ const onDiscard = async () => {
17
+ await context.destroySession();
18
+ };
19
+
20
+ const onSaveAndClose = async () => {
21
+ await context.closeSession();
22
+ };
23
+
24
+ return (
25
+ <ComposedModal open={open}>
26
+ <ModalHeader>{t("areYouSure", "Are you sure?")}</ModalHeader>
27
+ <ModalBody>
28
+ {t(
29
+ "cancelExplanation",
30
+ "You will lose any unsaved changes on the current form. Do you want to discard the current session?"
31
+ )}
32
+ </ModalBody>
33
+ <ModalFooter>
34
+ <Button kind="secondary" onClick={onCancel}>
35
+ {t("cancel", "Cancel")}
36
+ </Button>
37
+ <Button kind="danger" onClick={onDiscard}>
38
+ {t("discard", "Discard")}
39
+ </Button>
40
+ <Button kind="primary" onClick={onSaveAndClose}>
41
+ {t("saveSession", "Save Session")}
42
+ </Button>
43
+ </ModalFooter>
44
+ </ComposedModal>
45
+ );
46
+ };
47
+
48
+ export default CancelModal;
@@ -0,0 +1,46 @@
1
+ import {
2
+ Button,
3
+ ComposedModal,
4
+ ModalBody,
5
+ ModalFooter,
6
+ ModalHeader,
7
+ } from "@carbon/react";
8
+ import React from "react";
9
+ import { useTranslation } from "react-i18next";
10
+
11
+ const CompleteModal = ({ open, setOpen, context, validateFirst = false }) => {
12
+ const { t } = useTranslation();
13
+
14
+ const onCancel = () => setOpen(false);
15
+
16
+ const onComplete = () => {
17
+ if (validateFirst) {
18
+ context.validateForComplete();
19
+ } else {
20
+ context.submitForComplete();
21
+ }
22
+ setOpen(false);
23
+ };
24
+
25
+ return (
26
+ <ComposedModal open={open}>
27
+ <ModalHeader>{t("areYouSure", "Are you sure?")}</ModalHeader>
28
+ <ModalBody>
29
+ {t(
30
+ "saveExplanation",
31
+ "Do you want to save the current form and exit the workflow?"
32
+ )}
33
+ </ModalBody>
34
+ <ModalFooter>
35
+ <Button kind="secondary" onClick={onCancel}>
36
+ {t("cancel", "Cancel")}
37
+ </Button>
38
+ <Button kind="primary" onClick={onComplete}>
39
+ {t("complete", "Complete")}
40
+ </Button>
41
+ </ModalFooter>
42
+ </ComposedModal>
43
+ );
44
+ };
45
+
46
+ export default CompleteModal;
@@ -1,6 +1,7 @@
1
- import React, { useEffect } from "react";
1
+ import React, { useContext, useEffect, useState } from "react";
2
2
  import { detach, ExtensionSlot } from "@openmrs/esm-framework";
3
3
  import useGetPatient from "./hooks/useGetPatient";
4
+ import GroupFormWorkflowContext from "./context/GroupFormWorkflowContext";
4
5
 
5
6
  export interface Order {
6
7
  uuid: string;
@@ -98,15 +99,22 @@ export interface Encounter {
98
99
  obs: Array<Observation>;
99
100
  orders: Array<Order>;
100
101
  }
102
+
103
+ type PreFilledQuestions = {
104
+ [key: string]: string;
105
+ };
106
+
101
107
  interface FormParams {
102
108
  formUuid: string;
103
109
  patientUuid: string;
104
110
  visitUuid?: string;
105
111
  visitTypeUuid?: string;
106
112
  encounterUuid?: string;
113
+ preFilledQuestions?: PreFilledQuestions;
107
114
  showDiscardSubmitButtons?: boolean;
108
115
  handlePostResponse?: (Encounter) => void;
109
116
  handleEncounterCreate?: (Object) => void;
117
+ handleOnValidate?: (boolean) => void;
110
118
  }
111
119
 
112
120
  const FormBootstrap = ({
@@ -117,18 +125,30 @@ const FormBootstrap = ({
117
125
  encounterUuid,
118
126
  handlePostResponse,
119
127
  handleEncounterCreate,
128
+ handleOnValidate,
120
129
  }: FormParams) => {
121
130
  const patient = useGetPatient(patientUuid);
131
+ const { activeSessionMeta } = useContext(GroupFormWorkflowContext);
122
132
 
123
133
  useEffect(() => {
124
134
  return () => detach("form-widget-slot", "form-widget-slot");
125
135
  });
126
136
 
137
+ // FIXME This should not be necessary
138
+ const [showForm, setShowForm] = useState(true);
139
+
140
+ const updateFormComponent = () => {
141
+ setShowForm(false);
142
+ setTimeout(() => {
143
+ setShowForm(true);
144
+ });
145
+ };
146
+
127
147
  return (
128
148
  <div>
129
- {formUuid && patientUuid && patient && (
149
+ {showForm && formUuid && patientUuid && patient && (
130
150
  <ExtensionSlot
131
- extensionSlotName="form-widget-slot"
151
+ name="form-widget-slot"
132
152
  state={{
133
153
  view: "form",
134
154
  formUuid,
@@ -138,9 +158,17 @@ const FormBootstrap = ({
138
158
  patient,
139
159
  encounterUuid: encounterUuid ?? "",
140
160
  closeWorkspace: () => undefined,
141
- handlePostResponse,
161
+ handlePostResponse: (encounter) => {
162
+ handlePostResponse(encounter);
163
+ updateFormComponent();
164
+ },
142
165
  handleEncounterCreate,
166
+ handleOnValidate,
143
167
  showDiscardSubmitButtons: false,
168
+ preFilledQuestions: {
169
+ ...activeSessionMeta,
170
+ encDate: activeSessionMeta.sessionDate,
171
+ },
144
172
  }}
145
173
  />
146
174
  )}
@@ -1,4 +1,10 @@
1
- import React, { useCallback, useContext, useEffect, useState } from "react";
1
+ import React, {
2
+ useCallback,
3
+ useContext,
4
+ useEffect,
5
+ useMemo,
6
+ useState,
7
+ } from "react";
2
8
  import {
3
9
  ComposedModal,
4
10
  Button,
@@ -7,11 +13,16 @@ import {
7
13
  ModalBody,
8
14
  TextInput,
9
15
  FormLabel,
10
- Loading,
11
16
  } from "@carbon/react";
12
- import { Add, TrashCan } from "@carbon/react/icons";
17
+ import { TrashCan } from "@carbon/react/icons";
13
18
  import { useTranslation } from "react-i18next";
14
- import { ExtensionSlot, showToast } from "@openmrs/esm-framework";
19
+ import {
20
+ ExtensionSlot,
21
+ fetchCurrentPatient,
22
+ showToast,
23
+ useConfig,
24
+ usePatient,
25
+ } from "@openmrs/esm-framework";
15
26
  import styles from "./styles.scss";
16
27
  import GroupFormWorkflowContext from "../context/GroupFormWorkflowContext";
17
28
  import { usePostCohort } from "../hooks";
@@ -20,21 +31,41 @@ const MemExtension = React.memo(ExtensionSlot);
20
31
 
21
32
  const PatientRow = ({ patient, removePatient }) => {
22
33
  const { t } = useTranslation();
34
+ const { patient: patientInfo, error, isLoading } = usePatient(patient?.uuid);
35
+ const onClickHandler = useCallback(
36
+ () => removePatient(patient?.uuid),
37
+ [patient, removePatient]
38
+ );
39
+
40
+ const patientDisplay = useMemo(() => {
41
+ if (isLoading || error || !patientInfo) return "";
42
+
43
+ const { identifier, name } = patientInfo;
44
+ const displayIdentifier = identifier?.[0]?.value || "";
45
+ const givenNames = `${(name?.[0]?.given || []).join(" ")} ${
46
+ name?.[0]?.family || ""
47
+ }`;
48
+
49
+ return `${displayIdentifier ? `${displayIdentifier} -` : ""}${
50
+ givenNames ? ` ${givenNames}` : ""
51
+ }`.trim();
52
+ }, [isLoading, error, patientInfo]);
53
+
23
54
  return (
24
- <li key={patient.uuid} className={styles.patientRow}>
55
+ <li className={styles.patientRow}>
25
56
  <span>
26
57
  <Button
27
58
  kind="tertiary"
28
59
  size="sm"
29
60
  hasIconOnly
30
- onClick={() => removePatient(patient.uuid)}
61
+ onClick={onClickHandler}
31
62
  renderIcon={TrashCan}
32
63
  tooltipAlignment="start"
33
64
  tooltipPosition="top"
34
65
  iconDescription={t("remove", "Remove")}
35
66
  />
36
67
  </span>
37
- <span className={styles.patientName}>{patient?.display}</span>
68
+ <span className={styles.patientName}>{patientDisplay}</span>
38
69
  </li>
39
70
  );
40
71
  };
@@ -86,13 +117,18 @@ const NewGroupForm = (props) => {
86
117
  <PatientRow
87
118
  patient={patient}
88
119
  removePatient={removePatient}
89
- key={index}
120
+ key={patient.uuid}
90
121
  />
91
122
  ))}
92
123
  </ul>
93
124
  )}
94
125
 
95
- <FormLabel>Search for patients to add to group</FormLabel>
126
+ <FormLabel>
127
+ {t(
128
+ "searchForPatientsToAddToGroup",
129
+ "Search for patients to add to group"
130
+ )}
131
+ </FormLabel>
96
132
  <div className={styles.searchBar}>
97
133
  <MemExtension
98
134
  extensionSlotName="patient-search-bar-slot"
@@ -108,18 +144,22 @@ const NewGroupForm = (props) => {
108
144
  );
109
145
  };
110
146
 
111
- const AddGroupModal = () => {
147
+ const AddGroupModal = ({
148
+ patients = undefined,
149
+ isCreate = undefined,
150
+ groupName = "",
151
+ cohortUuid = undefined,
152
+ isOpen,
153
+ onPostCancel,
154
+ onPostSubmit,
155
+ }) => {
112
156
  const { setGroup } = useContext(GroupFormWorkflowContext);
113
157
  const { t } = useTranslation();
114
- const [open, setOpen] = useState(false);
115
158
  const [errors, setErrors] = useState({});
116
- const [name, setName] = useState("");
117
- const [patientList, setPatientList] = useState([]);
118
- const { post, result, isPosting, error } = usePostCohort();
119
-
120
- const handleCancel = () => {
121
- setOpen(false);
122
- };
159
+ const [name, setName] = useState(groupName);
160
+ const [patientList, setPatientList] = useState(patients || []);
161
+ const { post, result, error } = usePostCohort();
162
+ const config = useConfig();
123
163
 
124
164
  const removePatient = useCallback(
125
165
  (patientUuid: string) =>
@@ -158,25 +198,47 @@ const AddGroupModal = () => {
158
198
  );
159
199
 
160
200
  const updatePatientList = useCallback(
161
- (patient) => {
162
- setPatientList((patientList) => {
163
- if (!patientList.find((p) => p.uuid === patient.uuid)) {
164
- return [...patientList, patient];
165
- } else {
166
- return patientList;
167
- }
168
- });
201
+ (patientUuid) => {
202
+ function getPatientName(patient) {
203
+ return [patient?.name?.[0]?.given, patient?.name?.[0]?.family].join(
204
+ " "
205
+ );
206
+ }
207
+ if (!patientList.find((p) => p.uuid === patientUuid)) {
208
+ fetchCurrentPatient(patientUuid).then((result) => {
209
+ const newPatient = { uuid: patientUuid, ...result };
210
+ setPatientList(
211
+ [...patientList, newPatient].sort((a, b) =>
212
+ getPatientName(a).localeCompare(getPatientName(b), undefined, {
213
+ sensitivity: "base",
214
+ })
215
+ )
216
+ );
217
+ });
218
+ }
169
219
  setErrors((errors) => ({ ...errors, patientList: null }));
170
220
  },
171
- [setPatientList]
221
+ [patientList, setPatientList]
172
222
  );
173
223
 
174
224
  const handleSubmit = () => {
175
225
  if (validate()) {
176
226
  post({
227
+ uuid: cohortUuid,
177
228
  name: name,
229
+ cohortType: config?.groupSessionConcepts?.cohortTypeId,
178
230
  cohortMembers: patientList.map((p) => ({ patient: p.uuid })),
179
231
  });
232
+ if (onPostSubmit) {
233
+ onPostSubmit();
234
+ }
235
+ }
236
+ };
237
+
238
+ const handleCancel = () => {
239
+ setPatientList(patients || []);
240
+ if (onPostCancel) {
241
+ onPostCancel();
180
242
  }
181
243
  };
182
244
 
@@ -198,7 +260,7 @@ const AddGroupModal = () => {
198
260
  title: t("postError", "POST Error"),
199
261
  description:
200
262
  error.message ??
201
- t("unknownPostError", "An unknown error occured while saving data"),
263
+ t("unknownPostError", "An unknown error occurred while saving data"),
202
264
  });
203
265
  if (error.fieldErrors) {
204
266
  setErrors(
@@ -215,43 +277,31 @@ const AddGroupModal = () => {
215
277
 
216
278
  return (
217
279
  <div className={styles.modal}>
218
- <Button
219
- onClick={() => setOpen(true)}
220
- renderIcon={Add}
221
- iconDescription="Add"
222
- >
223
- {t("createNewGroup", "Create New Group")}
224
- </Button>
225
- <ComposedModal open={open} onClose={() => setOpen(false)}>
226
- <ModalHeader>{t("createNewGroup", "Create New Group")}</ModalHeader>
280
+ <ComposedModal open={isOpen} onClose={handleCancel}>
281
+ <ModalHeader>
282
+ {isCreate
283
+ ? t("createNewGroup", "Create New Group")
284
+ : t("editGroup", "Edit Group")}
285
+ </ModalHeader>
227
286
  <ModalBody>
228
- {result ? (
229
- <p>Group saved succesfully</p>
230
- ) : isPosting ? (
231
- <div className={styles.loading}>
232
- <Loading withOverlay={false} />
233
- <span>Saving new group...</span>
234
- </div>
235
- ) : (
236
- <NewGroupForm
237
- {...{
238
- name,
239
- setName,
240
- patientList,
241
- updatePatientList,
242
- errors,
243
- validate,
244
- removePatient,
245
- }}
246
- />
247
- )}
287
+ <NewGroupForm
288
+ {...{
289
+ name,
290
+ setName,
291
+ patientList,
292
+ updatePatientList,
293
+ errors,
294
+ validate,
295
+ removePatient,
296
+ }}
297
+ />
248
298
  </ModalBody>
249
299
  <ModalFooter>
250
- <Button kind="secondary" onClick={handleCancel} disabled={isPosting}>
300
+ <Button kind="secondary" onClick={handleCancel}>
251
301
  {t("cancel", "Cancel")}
252
302
  </Button>
253
- <Button kind="primary" onClick={handleSubmit} disabled={isPosting}>
254
- {t("createGroup", "Create Group")}
303
+ <Button kind="primary" onClick={handleSubmit}>
304
+ {isCreate ? t("createGroup", "Create Group") : t("save", "Save")}
255
305
  </Button>
256
306
  </ModalFooter>
257
307
  </ComposedModal>
@@ -1,5 +1,5 @@
1
- @use '@carbon/styles/scss/spacing';
2
1
  @use '@carbon/colors';
2
+ @use '@carbon/layout';
3
3
 
4
4
  .modal {
5
5
  :global(.cds--modal) {
@@ -17,6 +17,10 @@
17
17
  width: 100%
18
18
  }
19
19
 
20
+ .searchBar > div button {
21
+ height: auto;
22
+ }
23
+
20
24
  .formError {
21
25
  color: red;
22
26
  }
@@ -32,7 +36,7 @@
32
36
 
33
37
  .patientName {
34
38
  flex-grow: 1;
35
- padding-left: spacing.$spacing-05;
39
+ padding-left: layout.$spacing-05;
36
40
  }
37
41
 
38
42
  .loading {
@@ -41,5 +45,5 @@
41
45
  flex-direction: column;
42
46
  justify-content: center;
43
47
  align-items: center;
44
- row-gap: spacing.$spacing-05;
48
+ row-gap: layout.$spacing-05;
45
49
  }