@argusoft/medplat-app-shell 1.0.5 → 1.0.7

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 (263) hide show
  1. package/package.json +139 -141
  2. package/src/GlobalErrorBoundary.jsx +31 -0
  3. package/src/SilentErrorFallback.jsx +68 -0
  4. package/src/TrackingProviderWrapper.jsx +40 -0
  5. package/src/_tests_/__mocks__/MockTranslationProvider.jsx +21 -0
  6. package/src/_tests_/__mocks__/ckeditor.js +45 -0
  7. package/src/_tests_/__mocks__/fileMock.js +1 -0
  8. package/src/_tests_/__mocks__/useranalytics.js +5 -0
  9. package/src/_tests_/views/components/Dashboard/DashboardUI.test.jsx +137 -0
  10. package/src/_tests_/views/components/Dashboard/DashboardUIMock.js +877 -0
  11. package/src/_tests_/views/components/ForgotPassword/ForgotPassword.test.jsx +314 -0
  12. package/src/_tests_/views/components/LocationDirective/LocationDirective.test.jsx.disable +229 -0
  13. package/src/_tests_/views/components/LocationDirective/mockLocationDirective.js +810 -0
  14. package/src/_tests_/views/components/LocationType/MockLocationType.js +42259 -0
  15. package/src/_tests_/views/components/LocationType/addlocationtype.test.jsx.disable +276 -0
  16. package/src/_tests_/views/components/LocationType/editlocationtype.test.jsx.disable +262 -0
  17. package/src/_tests_/views/components/LocationType/locationtype.test.jsx.disable +148 -0
  18. package/src/_tests_/views/components/Profile/UpdateProfileModalData.js +4396 -0
  19. package/src/_tests_/views/components/Profile/updateprofilemodal.test.jsx +282 -0
  20. package/src/_tests_/views/components/SideBar/MockSideBar.js +1379 -0
  21. package/src/_tests_/views/components/SideBar/SideBar.test.jsx +98 -0
  22. package/src/_tests_/views/components/SystemConfig/ManageSystemConfig/AddManageSystemConfig.test.jsx.disable +164 -0
  23. package/src/_tests_/views/components/SystemConfig/ManageSystemConfig/UpdateManageSystemConfig.test.jsx.disable +157 -0
  24. package/src/_tests_/views/components/SystemConfig/MockSystemConfig.js +1280 -0
  25. package/src/_tests_/views/components/SystemConfig/SystemConfig.test.jsx.disable +165 -0
  26. package/src/_tests_/views/components/login/Login.test.jsx +276 -0
  27. package/src/_tests_/views/components/login/MockAuthorise.js +2414 -0
  28. package/src/_tests_/views/components/login/ServiceResponse.js +595 -0
  29. package/src/_tests_/views/components/user/MockManageUser.js +7965 -0
  30. package/src/_tests_/views/components/user/manageuser.test.jsx.disable +989 -0
  31. package/src/_tests_/views/components/user/mockUsersData.js +582 -0
  32. package/src/assets/img/OASISLogin.png +0 -0
  33. package/src/assets/img/bahaarNew.png +0 -0
  34. package/src/assets/img/dnhdd4K.png +0 -0
  35. package/src/assets/img/govtofup.png +0 -0
  36. package/src/assets/img/sewarural4K.png +0 -0
  37. package/src/assets/img/techo4K.png +0 -0
  38. package/src/assets/img/up4K.png +0 -0
  39. package/src/common/HolidayList.jsx +573 -0
  40. package/src/common/MalaciaousInputUtil.js +23 -0
  41. package/src/common/SafeHtml.jsx +17 -0
  42. package/src/common/VersionManager.jsx +109 -0
  43. package/src/common/constants/PerformanceDashboard.js +514 -0
  44. package/src/common/constants/app.constant.js +781 -0
  45. package/src/common/constants/cccVerificationConstants.js +18 -0
  46. package/src/common/constants/fhsrConstant.js +33 -0
  47. package/src/common/constants/gvk-verification.constant.js +76 -0
  48. package/src/common/constants/search.constant.js +23 -0
  49. package/src/common/constants/teleconsulatationConstant.jsx +1339 -0
  50. package/src/common/directives/SearchTemplate.jsx +784 -0
  51. package/src/common/directives/SearchTemplate.scss +14 -0
  52. package/src/common/dynamicView/DynamicView.jsx +353 -0
  53. package/src/common/dynamicView/InputFieldComponent.jsx +1501 -0
  54. package/src/common/dynamicView/InputViewComponent.jsx +298 -0
  55. package/src/common/dynamicView/InputViewComponent.scss +15 -0
  56. package/src/common/env.js +5 -0
  57. package/src/common/filters/locationNameFilter.js +26 -0
  58. package/src/common/fontAwesomeIcons/FontAwesomeIcons.jsx +27 -0
  59. package/src/common/fontAwesomeIcons/FontAwesomeIconsNames.js +1968 -0
  60. package/src/common/fontPreferences/fontSizeProvider.jsx +34 -0
  61. package/src/common/fontPreferences/fontSizeSelector.jsx +116 -0
  62. package/src/common/getAssignedFeature/getAssignedFeature.js +32 -0
  63. package/src/common/interceptors/AxiosInterceptor.js +216 -0
  64. package/src/common/languageTranslator/TranslationContext.js +5 -0
  65. package/src/common/languageTranslator/TranslationProvider.jsx +24 -0
  66. package/src/common/languageTranslator/i18n.js +49 -0
  67. package/src/common/services/AuthenticateService.js +116 -0
  68. package/src/common/services/DownloadFile.js +35 -0
  69. package/src/common/services/ForgotPassword.js +18 -0
  70. package/src/common/services/FormConfiguratorService.js +195 -0
  71. package/src/common/services/GlobalApis.js +84 -0
  72. package/src/common/services/InterceptorNavigationService.js +17 -0
  73. package/src/common/services/LocationService.js +65 -0
  74. package/src/common/services/LocationType.js +11 -0
  75. package/src/common/services/QueryBuilder.js +36 -0
  76. package/src/common/services/Roles.js +28 -0
  77. package/src/common/services/SyncWithServer.js +15 -0
  78. package/src/common/services/SystemConfig.js +15 -0
  79. package/src/common/services/TranslationService.js +70 -0
  80. package/src/common/services/TwoFactorService.js +7 -0
  81. package/src/common/services/Users.js +91 -0
  82. package/src/common/services/Webtasks.js +27 -0
  83. package/src/common/services/util/Convert-pad-data-to-API-format.jsx +167 -0
  84. package/src/common/services/util/Convert-to-UI-format.jsx +82 -0
  85. package/src/common/services/util/EmptyPrescriptionPadData.jsx +11 -0
  86. package/src/common/services/util/GeneralUtil.js +456 -0
  87. package/src/common/services/util/Prescription-pad-util.js +339 -0
  88. package/src/common/services/util/PrescriptionPadData.js +67 -0
  89. package/src/common/services/util/PrescriptionpadCommonUtil.js +96 -0
  90. package/src/common/services/util/ReportFieldUtil.jsx +398 -0
  91. package/src/common/services/util/WebSocketContext.jsx +261 -0
  92. package/src/common/syncWithServer/SyncWithServerDialog.jsx +170 -0
  93. package/src/common/syncWithServer/SyncWithServerDialogSkeleton.jsx +67 -0
  94. package/src/common/tests/CustomWrapper.jsx +49 -0
  95. package/src/common/tests/TranslationWrapper.jsx +38 -0
  96. package/src/common/themeProvider/ColorInputs.jsx +97 -0
  97. package/src/common/themeProvider/EditableColorInput.jsx +128 -0
  98. package/src/common/themeProvider/ThemeEditor.jsx +319 -0
  99. package/src/common/themeProvider/ThemeProvider.jsx +210 -0
  100. package/src/common/themeProvider/themeConfig.js +558 -0
  101. package/src/common/toaster/toaster.jsx +30 -0
  102. package/src/firebaseConfig.js +24 -0
  103. package/src/global.scss +221 -0
  104. package/src/hooks/.gitkeep +0 -0
  105. package/src/hooks/useAESEncryption.js +56 -0
  106. package/src/hooks/useCaching.js +43 -0
  107. package/src/hooks/useDebounce.js +34 -0
  108. package/src/hooks/useDebounceFn.js +50 -0
  109. package/src/hooks/useDownloadPdf.js +358 -0
  110. package/src/hooks/useDownloadXlsx.js +55 -0
  111. package/src/hooks/useListValueFieldValues.js +30 -0
  112. package/src/hooks/useLocationHierarchies.js +63 -0
  113. package/src/hooks/useLocationHierarchyTranslate.js +16 -0
  114. package/src/hooks/useOnline.js +27 -0
  115. package/src/hooks/usePagination.js +63 -0
  116. package/src/hooks/useRefreshToken.js +87 -0
  117. package/src/hooks/useScript.js +25 -0
  118. package/src/hooks/useStopwatch.js +75 -0
  119. package/src/hooks/useTrackEvent.js +22 -0
  120. package/src/hooks/useWebAudioRecorder.js +115 -0
  121. package/src/layout/LoaderComponet.jsx +22 -0
  122. package/src/layout/LoaderContext.jsx +29 -0
  123. package/src/layout/mainLayout/AdaptiveZoom.jsx +27 -0
  124. package/src/layout/mainLayout/Chatbot.jsx +243 -0
  125. package/src/layout/mainLayout/Layout.jsx +445 -0
  126. package/src/layout/mainLayout/Profile/UpdateProfileModal.jsx +684 -0
  127. package/src/layout/mainLayout/header/LogoutModal.jsx +131 -0
  128. package/src/layout/mainLayout/header/Navbar.jsx +1677 -0
  129. package/src/layout/mainLayout/header/Navbar.scss +4 -0
  130. package/src/layout/mainLayout/header/index.js +0 -0
  131. package/src/layout/mainLayout/sidebar/SideBar.jsx +1402 -0
  132. package/src/layout/mainLayout/sidebar/Sidebar.css +159 -0
  133. package/src/layout/mainLayout/sidebar/index.js +0 -0
  134. package/src/logo.svg +1 -0
  135. package/src/reportWebVitals.js +13 -0
  136. package/src/setupFirebaseMessaging.js +28 -0
  137. package/src/setupTests.js +8 -0
  138. package/src/store/actions/AuthenticationActions.js +0 -0
  139. package/src/store/actions/ReportsActions.js +0 -0
  140. package/src/store/actions/TranslationAction.js +0 -0
  141. package/src/store/index.js +8 -0
  142. package/src/store/reducer.js +46 -0
  143. package/src/store/reducers/AuthenticationReducer.js +50 -0
  144. package/src/store/reducers/CalendarEventReducer.js +41 -0
  145. package/src/store/reducers/ConditionClipboardReducer.js +45 -0
  146. package/src/store/reducers/FeatureReducer.js +27 -0
  147. package/src/store/reducers/FormConfiguratorReducer.js +38 -0
  148. package/src/store/reducers/LoadingReducer.js +20 -0
  149. package/src/store/reducers/MembersAuthenticationReducer.js +28 -0
  150. package/src/store/reducers/PrescriptionPadReducer.js +329 -0
  151. package/src/store/reducers/QuestionaireReducer.js +29 -0
  152. package/src/store/reducers/ReportsReducer.js +24 -0
  153. package/src/store/reducers/SkeletonReducer.js +20 -0
  154. package/src/store/reducers/ThemeReducer.js +106 -0
  155. package/src/store/reducers/TranslationReducer.js +126 -0
  156. package/src/store/reducers/dashboardEditorSlice.js +77 -0
  157. package/src/store/reducers/districtHealthDashboardSlice.js +58 -0
  158. package/src/store/reducers/immunizationSlice.js +234 -0
  159. package/src/store/slices/dashboardPagesSlice.js +51 -0
  160. package/src/utils/.gitkeep +0 -0
  161. package/src/utils/FormConstants.js +2629 -0
  162. package/src/utils/GujaratTopoChart.jsx +483 -0
  163. package/src/utils/UUIDgenerator.js +8 -0
  164. package/src/utils/appointment-utils/appointment-utils.js +123 -0
  165. package/src/utils/feature.js +42 -0
  166. package/src/utils/getThemeColor.js +12 -0
  167. package/src/utils/localStorageHelper.js +11 -0
  168. package/src/utils/notifications/enable-push-notifications.js +27 -0
  169. package/src/utils/resolveAppliedStyle.js +11 -0
  170. package/src/utils/themeConfigs.js +1483 -0
  171. package/src/views/custom-components/.gitkeep +0 -0
  172. package/src/views/custom-components/AgIconButton/RIf.jsx +14 -0
  173. package/src/views/custom-components/AgIconButton/button.jsx +108 -0
  174. package/src/views/custom-components/AgIconButton/waterDrop.jsx +95 -0
  175. package/src/views/custom-components/AgIconButton/waterDrop.scss +37 -0
  176. package/src/views/custom-components/AlertPlaceholder.jsx +32 -0
  177. package/src/views/custom-components/AllFaIconsSelector.jsx +56 -0
  178. package/src/views/custom-components/CkEditor/CkEditor.js +102 -0
  179. package/src/views/custom-components/CustomAccordion.jsx +72 -0
  180. package/src/views/custom-components/CustomActionIcons.jsx +118 -0
  181. package/src/views/custom-components/CustomAutoComplete.jsx +188 -0
  182. package/src/views/custom-components/CustomCheckBox.jsx +60 -0
  183. package/src/views/custom-components/CustomConfirmationModal.jsx +118 -0
  184. package/src/views/custom-components/CustomCountrySelect.jsx +129 -0
  185. package/src/views/custom-components/CustomDatePicker.jsx +122 -0
  186. package/src/views/custom-components/CustomDropdown.jsx +191 -0
  187. package/src/views/custom-components/CustomFileUpload.jsx +387 -0
  188. package/src/views/custom-components/CustomFullCalendar.jsx +514 -0
  189. package/src/views/custom-components/CustomInfiniteScroll.jsx +126 -0
  190. package/src/views/custom-components/CustomRadioComponent.jsx +65 -0
  191. package/src/views/custom-components/CustomStatsComponent.jsx +114 -0
  192. package/src/views/custom-components/CustomSvgUpload.jsx +170 -0
  193. package/src/views/custom-components/CustomSwitch.jsx +37 -0
  194. package/src/views/custom-components/CustomTabPanel.jsx +19 -0
  195. package/src/views/custom-components/CustomTextArea.jsx +62 -0
  196. package/src/views/custom-components/CustomTextArea.scss +27 -0
  197. package/src/views/custom-components/CustomTextField.jsx +116 -0
  198. package/src/views/custom-components/CustomToggleSwitch.jsx +138 -0
  199. package/src/views/custom-components/CustomTooltip.jsx +51 -0
  200. package/src/views/custom-components/CustomZoomImage.jsx +134 -0
  201. package/src/views/custom-components/CustomizedTable/CustomizedTableV2.jsx +1407 -0
  202. package/src/views/custom-components/CustomizedTable/VirtualizeTableBody.jsx +295 -0
  203. package/src/views/custom-components/CustomizedTable/helper.jsx +159 -0
  204. package/src/views/custom-components/CustomizedTable.jsx +532 -0
  205. package/src/views/custom-components/EditInputField.jsx +174 -0
  206. package/src/views/custom-components/FieldDescription.jsx +22 -0
  207. package/src/views/custom-components/FileDisplayComponent.jsx +138 -0
  208. package/src/views/custom-components/FormItem.jsx +53 -0
  209. package/src/views/custom-components/GenericChart.jsx +80 -0
  210. package/src/views/custom-components/InfoBadge.jsx +60 -0
  211. package/src/views/custom-components/PostgresEditor.jsx +801 -0
  212. package/src/views/custom-components/ResizableEditAutocompleteField.jsx +249 -0
  213. package/src/views/custom-components/ResizableEditInputField.jsx +215 -0
  214. package/src/views/custom-components/ResizeableEditSelectField.jsx +197 -0
  215. package/src/views/custom-components/SideOverlay.jsx +113 -0
  216. package/src/views/custom-components/SideOverlay.scss +42 -0
  217. package/src/views/custom-components/calendar.scss +571 -0
  218. package/src/views/feature-components/.gitkeep +0 -0
  219. package/src/views/feature-components/Dashboard/DashboardUI.jsx +1043 -0
  220. package/src/views/feature-components/Dashboard/DhnddModal/AshaDataQualityVerificationModal.jsx +278 -0
  221. package/src/views/feature-components/Dashboard/PinFeatureModal.jsx +143 -0
  222. package/src/views/feature-components/Dashboard/QuickLinks.jsx +163 -0
  223. package/src/views/feature-components/Dashboard/Taskbar.jsx +56 -0
  224. package/src/views/feature-components/Dashboard/WebtasksFilterForm.jsx +109 -0
  225. package/src/views/feature-components/Dashboard/WidgetCard.jsx +161 -0
  226. package/src/views/feature-components/Dashboard/actionModal.jsx +263 -0
  227. package/src/views/feature-components/Dashboard/ekavachModal/HealthWorkerIncorrectDetailsModal.jsx +332 -0
  228. package/src/views/feature-components/Dashboard/ekavachModal/MoMaternalDeathVerifcationModal.jsx +275 -0
  229. package/src/views/feature-components/Dashboard/ekavachModal/MoVerficationForChildScreeningMoadal.jsx +566 -0
  230. package/src/views/feature-components/FeatureUsageAnalytics/FeatureUsageAnalytics.jsx +989 -0
  231. package/src/views/feature-components/Features/NewServerManagement.jsx +217 -0
  232. package/src/views/feature-components/Features/ServerManagement.scss +120 -0
  233. package/src/views/feature-components/ForgotPassword/ForgotPassword.jsx +226 -0
  234. package/src/views/feature-components/LocationDirective/LocationDirective.jsx +992 -0
  235. package/src/views/feature-components/LocationDirective/LocationDirectiveV2.jsx +909 -0
  236. package/src/views/feature-components/NotFound.jsx +66 -0
  237. package/src/views/feature-components/Onboarding/Onboarding.jsx +1400 -0
  238. package/src/views/feature-components/Skeletons.js +115 -0
  239. package/src/views/feature-components/Unauthorized.jsx +48 -0
  240. package/src/views/feature-components/VerifyRoute.jsx +88 -0
  241. package/src/views/feature-components/YearlyRecap/YearlyRecap.jsx +357 -0
  242. package/src/views/feature-components/YearlyRecap/components/RecapSlide.jsx +183 -0
  243. package/src/views/feature-components/YearlyRecap/languageTranslator/TranslationContext.js +5 -0
  244. package/src/views/feature-components/YearlyRecap/languageTranslator/TranslationProvider.jsx +26 -0
  245. package/src/views/feature-components/YearlyRecap/languageTranslator/i18n.js +46 -0
  246. package/src/views/feature-components/YearlyRecap/languageTranslator/translations.json +167 -0
  247. package/src/views/feature-components/YearlyRecap/slides/IntroSlide.jsx +233 -0
  248. package/src/views/feature-components/YearlyRecap/slides/MaternalHealthSlide.jsx +146 -0
  249. package/src/views/feature-components/YearlyRecap/slides/MetricSlide.jsx +227 -0
  250. package/src/views/feature-components/YearlyRecap/slides/OutroSlide.jsx +701 -0
  251. package/src/views/feature-components/YearlyRecap/slides/ReachSlide.jsx +273 -0
  252. package/src/views/feature-components/login/Login.jsx +840 -0
  253. package/src/views/feature-components/login/Login.scss +154 -0
  254. package/src/views/feature-components/login/LoginConfigurator.jsx +1149 -0
  255. package/src/views/feature-components/login/TwoFactorSetupModal.jsx +411 -0
  256. package/src/views/feature-components/login/simplifyMenu.js +45 -0
  257. package/src/views/feature-components/system-config/ManageSystemConfigs.jsx +284 -0
  258. package/src/views/feature-components/system-config/SystemConfig.jsx +299 -0
  259. package/src/views/feature-components/users/ChangePasswordModal.jsx +243 -0
  260. package/src/views/feature-components/users/PasswordField.jsx +56 -0
  261. package/dist/index.css +0 -1
  262. package/dist/index.js +0 -32001
  263. package/dist/index.js.map +0 -1
@@ -0,0 +1,332 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { Modal, Typography, IconButton, Button, Chip, Divider } from '@mui/material';
3
+ import Grid from '@mui/material/Grid2'; // Ensure you are using Grid2 as per your imports
4
+ import { useForm, FormProvider, useWatch } from 'react-hook-form';
5
+ import * as Yup from 'yup';
6
+ import { yupResolver } from '@hookform/resolvers/yup';
7
+ import PropTypes from 'prop-types';
8
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
9
+ import { faXmark, faUser, faPhone, faLocationDot } from '@fortawesome/free-solid-svg-icons';
10
+ import CustomCheckBox from '@/views/custom-components/CustomCheckBox';
11
+ import CustomTextField from '@/views/custom-components/CustomTextField';
12
+ import { showToast } from '@/common/toaster/toaster';
13
+ import { execute, executeAll } from '@/common/services/GlobalApis';
14
+
15
+ // --- Validation Schema ---
16
+ const validationSchema = Yup.object().shape({
17
+ currentMobileCorrect: Yup.boolean(),
18
+ mobileNumber: Yup.string().when('currentMobileCorrect', {
19
+ is: (val) => val === false, // If checkbox is NOT checked
20
+ then: () =>
21
+ Yup.string()
22
+ .required('Mobile number is required')
23
+ .matches(/^[0-9]{10}$/, 'Must be exactly 10 digits'),
24
+ otherwise: () => Yup.string().notRequired(), // If checked, ignore validation
25
+ }),
26
+ });
27
+
28
+ const HealthWorkerIncorrectDetailsModal = ({ open, onClose, task, onSave }) => {
29
+ const initialValues = {
30
+ currentMobileCorrect: false,
31
+ mobileNumber: '',
32
+ };
33
+ const [isLoading, setIsLoading] = useState(false);
34
+ const [callData, setCallData] = useState(null);
35
+ const methods = useForm({
36
+ mode: 'onChange',
37
+ resolver: yupResolver(validationSchema),
38
+ defaultValues: initialValues,
39
+ });
40
+
41
+ const {
42
+ control,
43
+ handleSubmit,
44
+ formState: { errors },
45
+ reset,
46
+ setValue,
47
+ clearErrors,
48
+ } = methods;
49
+
50
+ // Watch the checkbox to conditionally disable the input
51
+ const isNumberCorrect = useWatch({ control, name: 'currentMobileCorrect' });
52
+
53
+ // Reset form when modal opens
54
+ useEffect(() => {
55
+ if (open) {
56
+ reset(initialValues);
57
+ }
58
+ }, [open, reset]);
59
+
60
+ // Handle Input Logic: Clear errors/value when checkbox toggles
61
+ useEffect(() => {
62
+ if (isNumberCorrect) {
63
+ // If checked: Set value from record
64
+ const recordNumber = task?.details?.['Phone Number on Record'];
65
+ setValue('mobileNumber', recordNumber || '');
66
+ clearErrors('mobileNumber');
67
+ } else {
68
+ // If unchecked: Clear the field
69
+ setValue('mobileNumber', '');
70
+ }
71
+ }, [isNumberCorrect, task, setValue]);
72
+
73
+ // 1. INIT: Fetch Call Data when modal opens
74
+ useEffect(() => {
75
+ if (open && task?.taskId) {
76
+ const fetchCallData = async () => {
77
+ setIsLoading(true);
78
+ try {
79
+ const response = await execute({
80
+ code: 'incorrect_details_retrieve_call_data',
81
+ parameters: {
82
+ taskId: task.taskId,
83
+ },
84
+ });
85
+ if (response?.data?.result?.length > 0) {
86
+ setCallData(response?.data?.result[0]);
87
+ }
88
+ } catch (error) {
89
+ console.error(error);
90
+ showToast({ message: 'Error in loading call data', type: 'error' });
91
+ } finally {
92
+ setIsLoading(false);
93
+ }
94
+ };
95
+
96
+ fetchCallData();
97
+
98
+ // Reset form
99
+ reset({ currentMobileCorrect: false, mobileNumber: '' });
100
+ }
101
+ }, [open, task, reset]);
102
+
103
+ // 3. SUBMIT: Handle API execution
104
+ const onSubmit = async (data) => {
105
+ setIsLoading(true);
106
+
107
+ // Base Query
108
+ const queryDtos = [
109
+ {
110
+ code: 'incorrect_details_update',
111
+ parameters: {
112
+ taskId: task.taskId,
113
+ mobileNumber: data.mobileNumber,
114
+ },
115
+ sequence: 1,
116
+ },
117
+ ];
118
+
119
+ // Add logic based on Call Types (from init API)
120
+ if (callData && callData.callTypes) {
121
+ const callTypes = callData.callTypes.split(',');
122
+
123
+ callTypes.forEach((callType) => {
124
+ switch (callType) {
125
+ case 'ASHA_VERI':
126
+ queryDtos.push({
127
+ code: 'incorrect_details_update_insert_gvk_asha_verification_info',
128
+ parameters: { taskId: task?.taskId },
129
+ sequence: queryDtos.length + 1,
130
+ });
131
+ break;
132
+ case 'ASHA_TRAINING_VERI':
133
+ queryDtos.push({
134
+ code: 'incorrect_details_update_insert_gvk_training_verification_info',
135
+ parameters: { taskId: task?.taskId },
136
+ sequence: queryDtos.length + 1,
137
+ });
138
+ break;
139
+ default:
140
+ break;
141
+ }
142
+ });
143
+ }
144
+
145
+ try {
146
+ await executeAll(queryDtos);
147
+ const updatedTask = {
148
+ ...task,
149
+ selectedAction: 'VERIFIED',
150
+ };
151
+ await onSave(updatedTask);
152
+ // Pass the task back to parent on success, similar to $uibModalInstance.close($scope.task)
153
+ onClose(task);
154
+ } catch (error) {
155
+ console.error(error);
156
+ showToast({ message: 'Error in updating call data', type: 'error' });
157
+ } finally {
158
+ setIsLoading(false);
159
+ }
160
+ };
161
+
162
+ // Helper for Details
163
+ const DetailItem = ({ label, value, icon }) => {
164
+ if (!value) return null;
165
+ return (
166
+ <div className="flex flex-col mb-3">
167
+ <Typography
168
+ variant="caption"
169
+ className="text-gray-500 uppercase tracking-wider mb-1 flex items-center gap-2 text-[11px] font-semibold"
170
+ >
171
+ {icon && <FontAwesomeIcon icon={icon} className="text-gray-400" />}
172
+ {label}
173
+ </Typography>
174
+ <Typography variant="body2" className="font-medium text-gray-900 text-[14px]">
175
+ {value}
176
+ </Typography>
177
+ </div>
178
+ );
179
+ };
180
+
181
+ DetailItem.propTypes = {
182
+ label: PropTypes.string,
183
+ value: PropTypes.string,
184
+ icon: PropTypes.object,
185
+ };
186
+
187
+ const currentMobileCorrectChanged = () => {};
188
+ return (
189
+ <Modal open={open} onClose={onClose} className="flex items-center justify-center">
190
+ {/* Main Container */}
191
+ <Grid container className="bg-white shadow-2xl rounded-lg flex flex-col w-[90%] max-w-[600px] outline-none">
192
+ {/* Header */}
193
+ <div className="flex justify-between items-center p-5 border-b border-gray-100">
194
+ <Typography variant="h6" className="font-bold text-customBlue">
195
+ Health Workers Incorrect Details Updation
196
+ </Typography>
197
+ <IconButton onClick={onClose} size="small">
198
+ <FontAwesomeIcon icon={faXmark} className="text-gray-400 hover:text-gray-600" />
199
+ </IconButton>
200
+ </div>
201
+
202
+ <FormProvider {...methods}>
203
+ <form onSubmit={handleSubmit(onSubmit)} className="flex flex-col">
204
+ {/* Body Content */}
205
+ <div className="max-h-[60vh] overflow-y-auto w-full">
206
+ <div className="p-6">
207
+ {/* Read-Only Details Grid */}
208
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-2 mb-6">
209
+ <DetailItem
210
+ label="Health Worker"
211
+ value={task?.details?.['Name of Health Worker'] || 'N/A'}
212
+ icon={faUser}
213
+ />
214
+ <DetailItem label="Role" value={task?.details?.['Role'] || 'N/A'} />
215
+ <DetailItem
216
+ label="Phone on Record"
217
+ value={task?.details?.['Phone Number on Record'] || 'N/A'}
218
+ icon={faPhone}
219
+ />
220
+ <DetailItem
221
+ label="Last Contact Attempt"
222
+ value={task?.details?.['Last Contact Attempted on'] || 'N/A'}
223
+ />
224
+ <DetailItem label="Location" value={task?.details?.['Location'] || 'N/A'} icon={faLocationDot} />
225
+
226
+ {/* Issue Badge */}
227
+ {task?.details?.['Issue'] && (
228
+ <div className="flex flex-col mb-3">
229
+ <Typography
230
+ variant="caption"
231
+ className="text-gray-500 uppercase tracking-wider mb-1 font-semibold text-[11px]"
232
+ >
233
+ Reported Issue
234
+ </Typography>
235
+ <div>
236
+ <Chip
237
+ label={task?.details?.['Issue']}
238
+ color="warning"
239
+ size="small"
240
+ sx={{ borderRadius: '4px', height: '24px', fontSize: '12px', fontWeight: 600 }}
241
+ />
242
+ </div>
243
+ </div>
244
+ )}
245
+ </div>
246
+
247
+ <Divider className="mb-6" />
248
+
249
+ {/* Form Section */}
250
+ <div className="bg-gray-50 p-5 rounded border border-gray-200">
251
+ {/* Checkbox */}
252
+ <div className="mb-4">
253
+ <CustomCheckBox
254
+ name="currentMobileCorrect"
255
+ control={control}
256
+ className="my-2"
257
+ label={' Current mobile number is correct'}
258
+ labelSizeInRem="1rem"
259
+ onChange={() => currentMobileCorrectChanged()}
260
+ />
261
+ </div>
262
+
263
+ {/* Input Field */}
264
+ <div
265
+ className={`transition-opacity duration-300 ${isNumberCorrect ? 'opacity-50 pointer-events-none' : 'opacity-100'}`}
266
+ >
267
+ <CustomTextField
268
+ control={control}
269
+ name={`mobileNumber`}
270
+ errors={errors}
271
+ type="number"
272
+ placeholder="Updated Mobile Number"
273
+ />
274
+ {/* <Controller
275
+ name="mobileNumber"
276
+ control={control}
277
+ render={({ field }) => (
278
+ <TextField
279
+ {...field}
280
+ fullWidth
281
+ label="Updated Mobile Number"
282
+ placeholder="Enter 10-digit number"
283
+ variant="outlined"
284
+ size="small"
285
+ disabled={isNumberCorrect}
286
+ error={!!errors.mobileNumber}
287
+ helperText={errors.mobileNumber?.message}
288
+ inputProps={{ maxLength: 10 }}
289
+ sx={{ backgroundColor: 'white' }}
290
+ />
291
+ )}
292
+ /> */}
293
+ </div>
294
+ </div>
295
+ </div>
296
+ </div>
297
+
298
+ {/* Footer Buttons */}
299
+ <div className="p-4 px-6 bg-gray-50 border-t border-gray-100 flex justify-end gap-3 rounded-b-lg">
300
+ <Button
301
+ onClick={onClose}
302
+ variant="contained"
303
+ color="secondary"
304
+ // className="border-gray-300 text-gray-600 normal-case"
305
+ >
306
+ Cancel
307
+ </Button>
308
+ <Button
309
+ type="submit"
310
+ variant="contained"
311
+ color="primary"
312
+ disabled={isLoading}
313
+ // className="bg-blue-600 hover:bg-blue-700 normal-case shadow-none"
314
+ >
315
+ Save
316
+ </Button>
317
+ </div>
318
+ </form>
319
+ </FormProvider>
320
+ </Grid>
321
+ </Modal>
322
+ );
323
+ };
324
+
325
+ HealthWorkerIncorrectDetailsModal.propTypes = {
326
+ open: PropTypes.bool,
327
+ onClose: PropTypes.func,
328
+ task: PropTypes.object, // Passed from parent containing details
329
+ onSave: PropTypes.func,
330
+ };
331
+
332
+ export default HealthWorkerIncorrectDetailsModal;
@@ -0,0 +1,275 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import {
4
+ Modal,
5
+ Typography,
6
+ IconButton,
7
+ Button,
8
+ Divider,
9
+ MenuItem,
10
+ Select,
11
+ FormControl,
12
+ CircularProgress,
13
+ } from '@mui/material';
14
+ import { useForm, FormProvider, Controller } from 'react-hook-form';
15
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
16
+ import { faXmark, faSkull, faCalendar, faPhone, faLocationDot, faUserNurse } from '@fortawesome/free-solid-svg-icons';
17
+ import * as Yup from 'yup';
18
+ import { yupResolver } from '@hookform/resolvers/yup';
19
+
20
+ // --- Services/Utils (Mock Imports based on context) ---
21
+ import { execute } from '@/common/services/GlobalApis';
22
+ import { FormItem } from '@/views/custom-components/FormItem';
23
+ import CustomRadioGroup from '@/views/custom-components/CustomRadioComponent';
24
+ import { showToast } from '@/common/toaster/toaster';
25
+
26
+ // --- Validation Schema ---
27
+ const validationSchema = Yup.object().shape({
28
+ actionKey: Yup.string().required('Please select an action'),
29
+ // verbalAutopsy is required. We handle "true"/"false" strings from Radio and cast later if needed
30
+ verbalAutopsy: Yup.string().required('Please select a Verbal Autopsy option'),
31
+ });
32
+
33
+ // --- Detail Item Component ---
34
+ const DetailItem = ({ label, value, icon }) => {
35
+ if (!value) return null;
36
+ return (
37
+ <div className="flex flex-col mb-3">
38
+ <Typography
39
+ variant="caption"
40
+ className="text-gray-500 uppercase tracking-wider mb-1 flex items-center gap-2 text-[11px] font-semibold"
41
+ >
42
+ {icon && <FontAwesomeIcon icon={icon} className="text-gray-400" />}
43
+ {label}
44
+ </Typography>
45
+ <Typography variant="body2" className="font-medium text-gray-900 text-[14px]">
46
+ {value}
47
+ </Typography>
48
+ </div>
49
+ );
50
+ };
51
+ DetailItem.propTypes = {
52
+ label: PropTypes.string,
53
+ value: PropTypes.string,
54
+ icon: PropTypes.object,
55
+ };
56
+ const MoMaternalDeathVerifcationModal = ({ open, onClose, task, message, onSave }) => {
57
+ const [isLoading, setIsLoading] = useState(false);
58
+ const [actionsList, setActionsList] = useState([]);
59
+
60
+ // --- Form Setup ---
61
+ const methods = useForm({
62
+ mode: 'onChange',
63
+ resolver: yupResolver(validationSchema),
64
+ defaultValues: {
65
+ actionKey: null,
66
+ verbalAutopsy: '', // Default empty to force selection
67
+ },
68
+ });
69
+
70
+ const {
71
+ control,
72
+ handleSubmit,
73
+ reset,
74
+ formState: { errors },
75
+ } = methods;
76
+
77
+ // --- 1. Init: Fetch Actions & Reset ---
78
+ useEffect(() => {
79
+ if (open) {
80
+ // Reset form
81
+ reset({ actionKey: null, verbalAutopsy: '' });
82
+
83
+ const fetchActions = async () => {
84
+ try {
85
+ // Logic: QueryDAO.executeQuery({ code: 'mo_death_verification_mo_actions' ... })
86
+ const response = await execute({
87
+ code: 'mo_death_verification_mo_actions',
88
+ parameters: {},
89
+ });
90
+ if (response?.data?.result?.length > 0) {
91
+ setActionsList(response.data.result);
92
+ }
93
+ } catch (error) {
94
+ console.error('Failed to fetch actions', error);
95
+ showToast({ message: 'Unable to fetch actions', type: 'error' });
96
+ }
97
+ };
98
+
99
+ fetchActions();
100
+ }
101
+ }, [open, reset]);
102
+
103
+ // --- 2. Submit Logic ---
104
+ const onSubmit = async (data) => {
105
+ setIsLoading(true);
106
+
107
+ // Convert string "true"/"false" back to boolean for API if necessary
108
+ const isVerbalAutopsy = data.verbalAutopsy === 'true';
109
+
110
+ try {
111
+ await execute({
112
+ code: 'maternal_death_verification_mo_verbal_autospy_updation',
113
+ parameters: {
114
+ taskId: task.taskId,
115
+ verbalAutopsy: isVerbalAutopsy,
116
+ },
117
+ });
118
+ const selectedAction = actionsList?.find((action) => action?.actionKey === Number(data?.actionKey || '0'));
119
+ console.log(actionsList, selectedAction, data.actionKey);
120
+ const updatedTask = {
121
+ ...task,
122
+ isOtherDetailsRequired: selectedAction?.isOtherDetailsRequired,
123
+ selectedAction: Number(data.actionKey),
124
+ action: selectedAction,
125
+ };
126
+ await onSave(updatedTask);
127
+ onClose(updatedTask);
128
+ } catch (error) {
129
+ console.error(error);
130
+ showToast({ message: 'Unable to save task actions', type: 'error' });
131
+ } finally {
132
+ setIsLoading(false);
133
+ }
134
+ };
135
+
136
+ return (
137
+ <Modal open={open} onClose={() => onClose(null)} className="flex items-center justify-center">
138
+ {/* CHANGED: Replaced <Grid container ...> with <div ...>
139
+ The 'flex flex-col' classes already handle the layout logic previously done by Grid.
140
+ */}
141
+ <div className="bg-white shadow-2xl rounded-lg flex flex-col w-[90%] max-w-[700px] outline-none max-h-[90vh]">
142
+ {/* Header */}
143
+ <div className="flex justify-between items-center p-5 border-b border-gray-100 bg-gray-50 rounded-t-lg">
144
+ <Typography variant="h6" className="font-bold text-customBlue">
145
+ {message || 'Perform Action'}
146
+ </Typography>
147
+ <IconButton onClick={() => onClose(null)} size="small" disabled={isLoading}>
148
+ <FontAwesomeIcon icon={faXmark} className="text-gray-400 hover:text-gray-600" />
149
+ </IconButton>
150
+ </div>
151
+
152
+ <FormProvider {...methods}>
153
+ <form onSubmit={handleSubmit(onSubmit)} className="flex flex-col flex-1 overflow-hidden">
154
+ <div className="overflow-y-auto p-6">
155
+ {/* Title */}
156
+ <Typography
157
+ variant="subtitle1"
158
+ className="font-bold text-primary-600 mb-4 border-l-4 border-blue-500 pl-3"
159
+ >
160
+ Maternal Death Verification
161
+ </Typography>
162
+
163
+ {/* Details Grid */}
164
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-4 mb-6 bg-gray-50 p-4 rounded-md border border-gray-100">
165
+ <DetailItem label="Birth Date" value={task?.details?.['Birth date'] || 'N/A'} icon={faCalendar} />
166
+ <DetailItem label="Death Type" value={task?.details?.['Death Type'] || 'N/A'} icon={faSkull} />
167
+
168
+ <DetailItem label="Death Date" value={task?.details?.['Death date'] || 'N/A'} icon={faCalendar} />
169
+ <DetailItem
170
+ label="Last Delivery Date"
171
+ value={task?.details?.['Last delivery date'] || 'N/A'}
172
+ icon={faCalendar}
173
+ />
174
+
175
+ <DetailItem label="Death Reason" value={task?.details?.['Death Reason'] || 'N/A'} />
176
+ <DetailItem label="Location" value={task?.details?.['Location'] || 'N/A'} icon={faLocationDot} />
177
+
178
+ <DetailItem
179
+ label="Family Contact"
180
+ value={task?.details?.['Family Contact Detail'] || 'N/A'}
181
+ icon={faPhone}
182
+ />
183
+ <DetailItem label="FHW Name" value={task?.details?.['FHW Name'] || 'N/A'} icon={faUserNurse} />
184
+ </div>
185
+
186
+ <Divider className="mb-6" />
187
+
188
+ {/* Form Controls */}
189
+ <div className="space-y-6">
190
+ {/* 1. Action Dropdown */}
191
+ <Controller
192
+ name="actionKey"
193
+ control={control}
194
+ render={({ field }) => (
195
+ <>
196
+ <FormItem label="Action" required>
197
+ <FormControl fullWidth error={!!errors.actionKey} size="small">
198
+ <Select
199
+ {...field}
200
+ labelId="action-select-label"
201
+ value={field.value || ''}
202
+ onChange={(e) => field.onChange(e.target.value)}
203
+ >
204
+ <MenuItem value="">
205
+ <em>-- Select --</em>
206
+ </MenuItem>
207
+ {actionsList.map((action, index) => (
208
+ <MenuItem key={index} value={action.actionKey}>
209
+ {action.displayText}
210
+ </MenuItem>
211
+ ))}
212
+ </Select>
213
+ <p className="error-helper-text">{errors['actionKey']?.message}</p>
214
+ </FormControl>
215
+ </FormItem>
216
+ </>
217
+ )}
218
+ />
219
+
220
+ {/* 2. Verbal Autopsy Radio */}
221
+ <FormControl component="fieldset" className="w-full">
222
+ <FormItem label="Verbal Autopsy" required>
223
+ <CustomRadioGroup
224
+ control={control}
225
+ name={`verbalAutopsy`}
226
+ errors={errors}
227
+ options={[
228
+ { label: 'Yes', value: true },
229
+ { label: 'No', value: false },
230
+ ]}
231
+ direction="row"
232
+ />
233
+ </FormItem>
234
+ </FormControl>
235
+ </div>
236
+ </div>
237
+
238
+ {/* Footer */}
239
+ <div className="p-4 px-6 bg-gray-50 border-t border-gray-100 flex justify-end gap-3 rounded-b-lg">
240
+ <Button
241
+ onClick={() => onClose(null)}
242
+ variant="outlined"
243
+ color="inherit"
244
+ disabled={isLoading}
245
+ className="border-gray-300 text-gray-600 normal-case"
246
+ >
247
+ Cancel
248
+ </Button>
249
+ <Button
250
+ type="submit"
251
+ variant="contained"
252
+ color="primary"
253
+ disabled={isLoading}
254
+ startIcon={isLoading ? <CircularProgress size={16} color="inherit" /> : null}
255
+ className="bg-blue-600 hover:bg-blue-700 normal-case shadow-none px-6"
256
+ >
257
+ {isLoading ? 'Saving...' : 'Save'}
258
+ </Button>
259
+ </div>
260
+ </form>
261
+ </FormProvider>
262
+ </div>
263
+ </Modal>
264
+ );
265
+ };
266
+
267
+ MoMaternalDeathVerifcationModal.propTypes = {
268
+ open: PropTypes.bool,
269
+ onClose: PropTypes.func, // onClose(task) on success, onClose(null) on cancel
270
+ task: PropTypes.object,
271
+ message: PropTypes.string,
272
+ onSave: PropTypes.func,
273
+ };
274
+
275
+ export default MoMaternalDeathVerifcationModal;