{"version":3,"sources":["stores/manageProject/useManageProjectStore.ts","control/radio/useRadio.ts","control/radio/radio.tsx","constants/submittedType.ts","stores/notification/appNotificationStore.ts","stores/notification/appNotificationAction.ts","stores/manageMenu/useManageMenuAction.ts","component/web/layout/useLayout.ts","component/web/layout/logout.tsx","component/web/manageProject/tabManager/useTabManager.ts","control/tab/tab.tsx","component/web/manageProject/tabManager/tabManager.tsx","component/web/layout/notification/useNotification.ts","component/web/layout/notification/notification.tsx","constants/userManualLink.ts","component/web/layout/userManualDoc/userManualDoc.tsx","component/web/layout/RenderMenu.tsx","component/web/layout/layout.tsx","router/privateRoute.tsx","control/loading/loading.tsx","control/snackbar/snackbar.tsx","control/bgLoading/bgLoading.tsx","App.tsx","reportWebVitals.ts","themes/mainTheme.tsx","index.tsx","i18n/languageKey.ts","constants/submittedStep.ts","control/textfield/useTextfield.ts","control/textfield/textfield.tsx","services/authen/authenServiceURL.ts","stores/authen/authenStore.ts","control/loading/store/useLoadingStore.ts","stores/commentary/useCommentaryStore.ts","component/web/layout/layoutPublic.tsx","control/loading/store/useLoadingAction.ts","control/loading/useLoading.ts","stores/authen/authenAction.ts","constants/constants.ts","stores/appFolderAndTab/appFolderAndTabStore.ts","constants/submittedStatus.ts","router/useRouter.tsx","utilities/date.ts","services/web/useWebService.ts","constants/userGroup.ts","stores/language/languageStore.ts","services/authen/useLogin.ts","control/button/button.tsx","utilities/validate.ts","stores/appFolderAndTab/appFolderAndTabAction.ts","services/authen/useAuthenService.ts","services/um/umServiceURL.ts","utilities/axios.ts","stores/appAlertMessage/appAlertMessageStore.ts","stores/snackbar/snackbarStore.ts","stores/manageMenu/useManageMenuStore.ts","services/authen/usePDPA.ts","component/um/PDPA/ModalPDPA.tsx","services/web/webServiceURL.ts","component/web/layout/language/useLanguage.ts","component/web/layout/language/language.tsx","stores/language/languageAction.ts","i18n/useTranslate.ts","utilities/encryption.ts","stores/snackbar/snackbarAction.ts","i18n/i18n.ts","pages/Login.tsx","stores/appAlertMessage/appAlertMessageAction.ts","component/authen/login/Form.tsx","pages/ConnectLine.tsx","component/um/line/ConnectLineForm.tsx","services/um/useLineLogin.ts","control/tooltip/tooltip.tsx","utilities/browserDetect.ts","utilities/checkPermission.ts","control/dialog/useDialog.ts","control/dialog/dialog.tsx","component/web/playground/usePlayground.ts","component/web/playground/i18nPlayground/useI18nPlayground.ts","component/web/playground/i18nPlayground/i18nPlayground.tsx","control/virtualizedList/virtualizedList.tsx","component/web/playground/Table/TableExample.tsx","component/web/playground/dialogPlayground/useDialogPlayground.ts","component/web/playground/dialogPlayground/dialogPlayground.tsx","stores/playground/playgroundStore.ts","stores/playground/usePlaygroundAction.ts","component/web/playground/atomPlayground/useAtomPlayground.ts","component/web/playground/atomPlayground/atomPlayground.tsx","component/web/playground/formPlayground/useFormPlayground.ts","control/autocomplete/useAutocomplete.ts","control/autocomplete/autocomplete.tsx","control/datepicker/useDatepicker.ts","control/datepicker/datepicker.tsx","control/multiSelect/useMultiSelect.ts","control/multiSelect/multiSelect.tsx","component/web/playground/formPlayground/uploadFile/useUploadFileTest.ts","component/web/playground/formPlayground/uploadFile/uploadFileTest.tsx","control/datepicker/DateRangePicker.tsx","component/web/playground/formPlayground/formPlayground.tsx","component/web/playground/apiPlayground/useApiPlayground.ts","component/web/playground/apiPlayground/apiPlayground.tsx","component/web/playground/uploadFilePlayground/useUploadFilePlayground.ts","component/web/playground/uploadFilePlayground/uploadFilePlayground.tsx","component/web/playground/playground.tsx","constants/projectStatus.ts","component/web/manageProject/search/useSearch.ts","services/lookup/lookupServiceURL.ts","services/lookup/useLookupService.ts","component/web/manageProject/search/searchForm/useSearchForm.ts","control/checkbox/useCheckbox.ts","control/checkbox/checkbox.tsx","component/web/manageProject/search/searchForm/searchForm.tsx","control/accordion/useAccordion.ts","control/accordion/SearchAccordion.tsx","images/document.svg","services/web/useCertificates.ts","component/web/manageProject/search/DialogCoaButton.tsx","constants/pendingStatus.ts","component/web/manageProject/search/DialogPending.tsx","component/web/manageProject/search/searchResult/Item.tsx","component/web/manageProject/search/searchResult/Result.tsx","component/web/manageProject/search/search.tsx","component/web/manageProject/useManageProject.ts","component/web/manageProject/manageProject.tsx","control/richTextEditor/useRichTextEditorts.ts","control/treeCheckboxNew/useTreeCheckbox.ts","control/treeCheckboxNew/treeCheckbox.tsx","component/web/shareLogic/useChecklist.tsx","stores/checklist/useChecklistStore.ts","stores/checklist/useChecklistAction.ts","component/web/checklist/DialogChecklist.tsx","control/richTextEditor/richTextEditor.tsx","component/web/playground/RichText/showRichTextbox.tsx","component/um/dashboard/report/Items.tsx","component/um/dashboard/report/Report.tsx","control/select/useSelect.ts","control/select/select.tsx","services/um/lookups/useProjectType.ts","component/report/reviewer/Panel.tsx","utilities/prefixName.ts","component/report/closed/CustomPagination.tsx","component/report/closed/CustomNoRowsOverlay.tsx","component/report/reviewer/DataTable.tsx","component/report/reviewer/report.ts","services/um/useSearchReviewer.ts","pages/Reviewer.tsx","component/report/expired/DataTable.tsx","component/report/expired/Panel.tsx","services/um/useSearchExpired.ts","component/report/expired/report.ts","pages/Expired.tsx","component/report/closed/Panel.tsx","component/report/closed/report.ts","services/um/useSearchClosed.ts","component/report/closed/Table.tsx","pages/Closed.tsx","component/web/shareUI/uploadDoc/useUploadDoc.ts","component/web/shareUI/uploadDoc/uploadFile/useUploadFile.ts","component/web/shareUI/uploadDoc/uploadFile/uploadFile.tsx","component/web/shareUI/uploadDoc/UploadDocFile.tsx","utilities/email.ts","component/um/register-external/Form.tsx","services/um/useRegisterExternal.ts","services/um/useCheckEmail.ts","component/um/register-external/Content.tsx","component/um/register-external/Acceptance.tsx","pages/RegisterExternal.tsx","component/um/external-researcher/Panel.tsx","component/um/external-researcher/Status.tsx","component/um/external-researcher/Item.tsx","component/um/external-researcher/Result.tsx","services/um/useExternalResearcher.ts","pages/ExternalResearcher.tsx","services/um/useApproveExResearcher.ts","component/um/approve-external-researcher/Approve.tsx","component/um/approve-external-researcher/Infomation.tsx","component/um/approve-external-researcher/Form.tsx","component/um/approve-external-researcher/StatusBar.tsx","pages/ApproveExResearcher.tsx","services/um/usePreferenceForgotPassword.ts","component/um/forgot-password/Form.tsx","pages/ForgotPassword.tsx","services/um/lookups/useUsergroup.ts","component/um/officer/Panel.tsx","component/um/officer/Item.tsx","component/um/officer/EmptyData.tsx","component/um/officer/Result.tsx","pages/Officer.tsx","services/um/useDeleteOfficer.ts","services/um/useSearchOfficer.ts","services/um/lookups/useTitleName.ts","services/um/lookups/useUsergroupFilterREC.ts","services/um/lookups/useGroup.ts","services/um/lookups/usePosition.ts","component/um/usergroup/FieldObservable.tsx","services/um/useEditUsergroup.ts","control/uploadImage/useUploadImage.ts","control/uploadImage/uploadImage.tsx","utilities/pathImg.ts","component/um/usergroup/UploadLogo.tsx","services/um/useInfoChangePassword.ts","component/um/usergroup/DialogSetPassword.tsx","component/um/usergroup/Form.tsx","services/um/useAddUsergroup.ts","services/um/useCheckPersonnel.ts","pages/UsergroupAdd.tsx","pages/UsergroupEdit.tsx","services/um/usePreferenceChangePassword.ts","component/um/change-password/Form.tsx","services/um/usePreferencePasscode.ts","component/um/change-passcode/Form.tsx","services/um/usePreferenceProfile.ts","component/um/preference/UploadProfile.tsx","services/um/lookups/useAcademicPosition.ts","component/um/preference/Information.tsx","services/um/line/useGetSync.ts","component/um/preference/Line.tsx","component/um/preference/UploadLogo.tsx","component/um/preference/NotificationSetting.tsx","component/um/preference/Form.tsx","pages/Preference.tsx","services/um/useActivate.ts","component/authen/activate/Form.tsx","pages/Activate.tsx","pages/ActivateForgotPassword.tsx","component/um/dashboard/InProgress.tsx","component/um/dashboard/AverageStatusTime.tsx","component/um/dashboard/AverageProjectTime.tsx","services/um/useDashboard.ts","component/um/dashboard/overview/Items.tsx","component/um/dashboard/overview/Overview.tsx","component/um/dashboard/AverageFaculty.tsx","component/um/dashboard/AverageEachFaculty.tsx","component/um/dashboard/export-data/exportData.tsx","component/um/dashboard/consideration/Item.tsx","component/um/dashboard/consideration/Consideration .tsx","pages/Dashboard.tsx","pages/TestExport.tsx","services/um/lookups/useFaculty.ts","services/um/lookups/useProjectStatus.ts","services/um/lookups/useStatus.ts","component/report/firsttime/Panel.tsx","component/report/firsttime/DataTable.tsx","component/report/firsttime/report.ts","pages/FirstTime.tsx","services/um/useSearchFirstTime.ts","component/report/hold/Panel.tsx","component/report/hold/DataTable.tsx","component/report/hold/report.ts","pages/Hold.tsx","services/um/useSearchHold.ts","control/accordion/accordion.tsx","component/um/settingCertificate/officer.tsx","component/um/settingCertificate/UploadLogo.tsx","component/um/settingCertificate/Form.tsx","pages/SettingCertificate.tsx","services/um/useSettingCertificate.ts","services/um/lookups/useIRB.ts","component/um/setting-faculty/Panel.tsx","component/um/setting-faculty/Item.tsx","component/um/setting-faculty/Result.tsx","pages/SettingFaculty.tsx","services/um/useSearchSettingFaculty.ts","component/um/setting-faculty/Form.tsx","services/um/useSettingFaculty.ts","pages/SettingFacultyAdd.tsx","services/um/lookups/useIRBType.ts","component/um/settingREC/form.tsx","services/um/useSettingREC.ts","pages/SettingRECAdd.tsx","pages/settingRECEdit.tsx","component/um/settingDocument/Panel.tsx","services/um/useSettingDocument.ts","component/um/settingDocument/Order.tsx","component/um/settingDocument/FiledDraggable.tsx","component/um/settingDocument/Draggables.tsx","pages/SettingDocument.tsx","services/um/lookups/useSort.ts","component/um/settingREC/Item.tsx","component/um/settingREC/EmptyData.tsx","component/um/settingREC/Result.tsx","pages/SettingREC.tsx","component/um/settingDocument/Form.tsx","pages/SettingDocumentAdd.tsx","pages/SettingDocumentEdit.tsx","pages/SettingFacultyEdit.tsx","services/um/useSearchSettingConsideration.ts","services/um/useSettingConsideration.ts","component/um/setting-consideration/Panel.tsx","component/um/setting-consideration/Order.tsx","component/um/setting-consideration/FiledDraggable.tsx","component/um/setting-consideration/Draggables.tsx","pages/SettingConsideration.tsx","component/um/setting-consideration/Form.tsx","pages/SettingConsiderationEdit.tsx","pages/Landing.tsx","images/folder.svg","control/menuFolder/menuFolder.tsx","component/web/shareUI/editFormHeader/editFormHeader.tsx","stores/manageProject/useManageProjectAction.ts","constants/considerType.ts","component/web/project/useFolderAndTab.ts","component/web/project/page/closeProjectOfficer/useCloseProjectOfficer.ts","component/web/project/page/closeProjectOfficer/closeProjectOfficer.tsx","component/web/shareUI/displayUpdater/useDisplayUpdater.ts","constants/approveStatus.ts","component/web/shareLogic/useProjectHook.ts","component/web/project/page/requestNewProject/newProject/useNewProject.ts","component/web/shareUI/ethicsForm/ethicsFormTypes.ts","services/lookupClient/useLookupClient.ts","component/web/shareUI/ethicsForm/useEthicsForm.ts","component/web/shareUI/ethicsForm/ethicsForm.tsx","component/web/shareLogic/useZip.ts","component/web/shareUI/uploadDoc/uploadDoc.tsx","component/web/shareUI/remarkFromAdmin/useRemarkFromAdmin.ts","component/web/shareUI/remarkFromAdmin/remarkFromAdmin.tsx","component/web/project/page/_sharedPageComponent/buttonSubmittedWithdraw/useButtonSubmittedWithdraw.ts","component/web/project/page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw.tsx","component/web/project/page/pageAction.tsx","component/web/project/page/requestNewProject/newProject/newProject.tsx","component/web/project/page/resultOfConsider/useResultOfConsider.ts","component/web/project/page/resultOfConsider/resultOfConsider.tsx","component/web/project/page/resultOfConsider/projectNotAboutPeople/useResultOfConsider.ts","component/web/project/page/resultOfConsider/projectNotAboutPeople/resultOfConsider.tsx","component/web/project/page/noticeAdditionalDocument/useNoticeAdditional.ts","component/web/project/page/noticeAdditionalDocument/noticeAdditionalDocument.tsx","component/web/project/page/certificateStampDocument/useCertificateStampDocument.ts","component/web/project/page/certificateStampDocument/certificateStampDocument.tsx","component/web/project/page/resultOfConsiderPrevious/useResultOfConsiderPrevious.ts","component/web/project/page/resultOfConsiderPrevious/resultOfConsiderPrevious.tsx","component/web/project/flow/requestNewProject/researcher/researcher.tsx","component/web/project/flow/requestNewProject/researcher/useResearcher.tsx","component/web/shareLogic/useEditSynthesis.ts","component/web/shareUI/resultConsideration/useResultConsideration.ts","component/web/shareUI/modeAccordion/ModeAccordion.tsx","component/web/shareUI/resultConsideration/resultConsideration.tsx","component/web/project/page/synthesis/useSynthesis.ts","control/copyToClipboard/copyToclipboard.tsx","component/web/shareUI/displayUpdater/displayUpdater.tsx","control/exportToMSWord/exportToMSWord.tsx","component/web/project/page/synthesis/synthesisREC1.tsx","component/web/project/page/synthesis/synthesisREC2.tsx","component/web/shareUI/numberOfDoc2/useNumberOfDoc.ts","component/web/shareLogic/useFunctionHook.ts","component/web/shareUI/numberOfDoc2/numberOfDoc.tsx","component/web/project/page/additionalDocument/useAdditionDocument.ts","component/web/project/page/additionalDocument/additionalDocumentREC1.tsx","component/web/project/page/additionalDocument/additionalDocumentREC2.tsx","component/web/shareUI/ResearchDetail/useResearchDetail.ts","component/web/shareUI/ResearchDetail/researchDetail.tsx","services/history/historyServiceURL.ts","stores/history/useHistoryStore.ts","stores/history/useHistoryAction.ts","component/web/shareUI/documentTestResult/useDocumentTestResult.ts","component/web/shareUI/documentTestResult/documentTestResult.tsx","component/web/shareLogic/useVerifyDocumentProjectDetail.ts","component/web/project/page/verifyDocument/useVerifyDocument.ts","component/web/shareUI/ethicsForm/formResetList.ts","component/web/project/page/verifyDocument/verifyDocumentREC1.tsx","component/web/shareUI/designateReviewer/useDesignateReviewer.ts","component/web/shareUI/designateReviewer/designateReviewer.tsx","component/web/project/page/verifyDocument/verifyDocumentREC2.tsx","component/web/shareUI/defineType/useDefineType.ts","component/web/shareUI/defineType/defineType.tsx","component/web/shareUI/defineDirector/useDefineDirector.ts","component/web/shareUI/defineDirector/defineDirector.tsx","constants/committeeProjectRole.ts","component/web/project/page/defineProject/useDefineProject.ts","component/web/project/page/defineProject/defineProjectREC1.tsx","component/web/project/page/defineProject/defineProjectREC2.tsx","constants/researcherType.ts","component/web/project/page/generateCertificate/useGenerateCertificate.ts","component/web/shareUI/headCertificate/useHeadCertificate.ts","component/web/shareUI/headCertificate/headCertificate.tsx","component/web/project/page/generateCertificate/generateCertificateREC1.tsx","component/web/project/page/generateCertificate/generateCertificateREC2.tsx","component/web/project/page/defineSubmittedDate/useDefineSubmittedDate.ts","component/web/project/page/defineSubmittedDate/defineSubmittedDateREC1.tsx","component/web/project/page/defineSubmittedDate/defineSubmittedDateREC2.tsx","component/web/shareUI/commentDirector/useCommentDirector.ts","component/web/shareUI/commentDirector/commentDirector.tsx","stores/commentary/useCommentaryAction.ts","component/web/project/page/reviewerComment/useReviewerComment.ts","component/web/project/page/reviewerComment/reviewerCommentREC1.tsx","component/web/project/page/reviewerComment/reviewerCommentREC2.tsx","component/web/project/page/memoMessage/submitFirstConsideration/useMemoMessage.ts","component/web/project/page/memoMessage/submitFirstConsideration/memoMessage.tsx","component/web/project/page/synthesisReview/useSyntheticReview.ts","control/treeCheckbox/useTreeCheckbox.ts","control/treeCheckbox/treeCheckbox.tsx","component/web/project/page/synthesisReview/synthesisReviewREC1.tsx","component/web/project/page/synthesisReview/synthesisReviewREC2.tsx","component/web/shareUI/secretCodeForm/useSecretCodeForm.ts","component/web/shareUI/secretCodeForm/secretCodeForm.tsx","component/web/project/page/sign/useSignREC1.ts","component/web/project/page/sign/signREC1.tsx","component/web/project/page/sign/signREC2.tsx","component/web/project/page/signRepresent/useSignRepresent.ts","component/web/project/page/signRepresent/signRepresentREC1.tsx","component/web/project/page/signRepresent/signRepresentREC2.tsx","component/web/project/page/signVicePresident/useSignVicePresident.ts","component/web/project/page/signVicePresident/signVicePresidentREC2.tsx","component/web/project/page/signVicePresident/signVicePresidentREC1.tsx","component/web/project/page/sign/signMemoMessage/useSign.ts","component/web/project/page/sign/signMemoMessage/signREC2.tsx","component/web/project/page/sign/signMemoMessage/signREC1.tsx","component/web/project/page/signRepresent/signRepresentMemoMessage/useSignRepresent.ts","component/web/project/page/signRepresent/signRepresentMemoMessage/signRepresentREC2.tsx","component/web/project/page/signRepresent/signRepresentMemoMessage/signRepresentREC1.tsx","component/web/project/flow/requestNewProject/officer/officer.tsx","component/web/project/flow/requestNewProject/requestNewProject.tsx","component/web/project/flow/requestNewProject/useRequestNewProject.tsx","component/web/project/flow/requestNewProjectEditAfterReview/researcher/researcher.tsx","component/web/project/flow/requestNewProjectEditAfterReview/researcher/useResearcher.tsx","component/web/project/flow/requestNewProjectEditAfterReview/officer/officer.tsx","component/web/project/flow/requestNewProjectEditAfterReview/officer/useOfficer.tsx","component/web/project/flow/requestNewProjectEditAfterReview/requestNewProjectEditAfterReview.tsx","component/web/project/flow/requestNewProjectEditAfterReview/useRequestNewProjectEditAfterReview.tsx","component/web/project/page/requestNewProject/projectPhase/useProjectPhase.ts","component/web/project/page/requestNewProject/projectPhase/projectPhase.tsx","component/web/project/flow/projectPhase/researcher/researcher.tsx","component/web/project/flow/projectPhase/researcher/useResearcher.tsx","component/web/project/flow/projectPhase/officer/officer.tsx","component/web/project/flow/projectPhase/projectPhase.tsx","component/web/project/flow/projectPhase/useProjectPhase.tsx","component/web/project/page/requestNewProject/projectAmendment/useProjectAmendment.ts","component/web/project/page/requestNewProject/projectAmendment/projectAmendment.tsx","component/web/project/page/resultOfConsider/amendment/useResultOfConsider.ts","component/web/project/page/resultOfConsider/amendment/resultOfConsider.tsx","component/web/project/flow/projectAmendment/researcher/researcher.tsx","component/web/project/flow/projectAmendment/researcher/useResearcher.tsx","component/web/project/page/memoMessage/projectAmendment/useMemomessage.ts","component/web/project/page/memoMessage/projectAmendment/memoMessageREC1.tsx","component/web/project/page/memoMessage/projectAmendment/memoMessageREC2.tsx","component/web/project/flow/projectAmendment/officer/officer.tsx","component/web/project/flow/projectAmendment/projectAmendment.tsx","component/web/project/flow/projectAmendment/useProjectAmendment.tsx","component/web/project/flow/projectAmendmentEditAfterReview/researcher/researcher.tsx","component/web/project/flow/projectAmendmentEditAfterReview/researcher/useResearcher.tsx","component/web/project/flow/projectAmendmentEditAfterReview/officer/officer.tsx","component/web/project/flow/projectAmendmentEditAfterReview/officer/useOfficer.tsx","component/web/project/flow/projectAmendmentEditAfterReview/projectAmendmentEditAfterReview.tsx","component/web/project/flow/projectAmendmentEditAfterReview/useProjectAmendmentEditAfterReview.tsx","component/web/project/page/closeProjectResearcher/useCloseProjectResearcher.ts","component/web/project/page/closeProjectResearcher/closeProjectResearcher.tsx","component/web/project/page/resultOfConsider/closeProject/useResultOfConsider.ts","component/web/project/page/resultOfConsider/closeProject/resultOfConsider.tsx","component/web/project/flow/closeProject/researcher/researcher.tsx","component/web/project/flow/closeProject/researcher/useResearcher.tsx","component/web/project/page/verifyDocumentCloseProject/useVerifyDocument.ts","component/web/project/page/verifyDocumentCloseProject/verifyDocumentCloseProjectREC1.tsx","component/web/project/page/verifyDocumentCloseProject/verifyDocumentCloseProjectREC2.tsx","component/web/project/page/synthesis/closeProject/useSynthesis.ts","component/web/project/page/synthesis/closeProject/synthesis.tsx","component/web/project/page/synthesisReview/closeProject/useSynthesisReview.ts","component/web/project/page/synthesisReview/closeProject/synthesisReview.tsx","component/web/project/page/memoMessage/reportedCloseProject/useReportedCloseProject.ts","component/web/project/page/memoMessage/reportedCloseProject/reportedCloseProject.tsx","component/web/project/flow/closeProject/officer/officer.tsx","component/web/project/flow/closeProject/closeProject.tsx","component/web/project/flow/closeProject/useCloseProject.tsx","component/web/project/flow/projectPhaseEditAfterReview/researcher/researcher.tsx","component/web/project/flow/projectPhaseEditAfterReview/researcher/useResearcher.tsx","component/web/project/flow/projectPhaseEditAfterReview/officer/officer.tsx","component/web/project/flow/projectPhaseEditAfterReview/officer/useOfficer.tsx","component/web/project/flow/projectPhaseEditAfterReview/projectPhaseEditAfterReview.tsx","component/web/project/flow/projectPhaseEditAfterReview/useProjectPhaseEditAfterReview.tsx","component/web/project/page/requestNewProject/terminateProject/useTerminateProject.ts","component/web/project/page/requestNewProject/terminateProject/terminateProject.tsx","component/web/project/page/resultOfConsider/terminateProject/useResultOfConsider.ts","component/web/project/page/resultOfConsider/terminateProject/resultOfConsider.tsx","component/web/project/page/resultOfConsiderPrevious/terminateProject/useResultOfConsiderPrevious.ts","component/web/project/page/resultOfConsiderPrevious/terminateProject/resultOfConsiderPrevious.tsx","component/web/project/flow/terminateProject/researcher/researcher.tsx","component/web/project/flow/terminateProject/researcher/useResearcher.tsx","component/web/project/page/verifyDocumentTerminate/useVerifyDocument.ts","component/web/project/page/verifyDocumentTerminate/verifyDocumentREC1.tsx","component/web/project/page/verifyDocumentTerminate/verifyDocumentREC2.tsx","component/web/project/page/memoMessageTerminateProject/useMemomessageTerminate.ts","component/web/project/page/memoMessageTerminateProject/memoMessageTerminateREC1.tsx","component/web/project/page/memoMessageTerminateProject/memoMessageTerminateREC2.tsx","component/web/project/page/synthesis/terminateProject/useSynthesis.ts","component/web/project/page/synthesis/terminateProject/synthesis.tsx","component/web/project/page/synthesisReview/terminateProject/useSynthesisReview.ts","component/web/project/page/synthesisReview/terminateProject/synthesisReview.tsx","component/web/project/flow/terminateProject/officer/officer.tsx","component/web/project/flow/terminateProject/terminateProject.tsx","component/web/project/flow/terminateProject/useTerminateProject.tsx","component/web/project/page/requestNewProject/adverseEvent/useAdverseEvent.ts","component/web/project/page/requestNewProject/adverseEvent/adverseEvent.tsx","component/web/project/page/resultOfConsider/adverseEvent/useResultOfConsider.ts","component/web/project/page/resultOfConsider/adverseEvent/resultOfConsider.tsx","component/web/project/flow/adverseEvents/researcher/researcher.tsx","component/web/project/flow/adverseEvents/researcher/useResearcher.tsx","component/web/project/page/verifyDocument/adverseEvent/useVerifyDocument.ts","component/web/project/page/verifyDocument/adverseEvent/verifyDocumentREC1.tsx","component/web/project/page/verifyDocument/adverseEvent/verifyDocumentREC2.tsx","component/web/project/page/memoMessage/adverseEvent/useMemomessage.ts","component/web/project/page/memoMessage/adverseEvent/memoMessageREC1.tsx","component/web/project/page/memoMessage/adverseEvent/memoMessageREC2.tsx","component/web/project/flow/adverseEvents/officer/officer.tsx","component/web/project/flow/adverseEvents/adverseEvent.tsx","component/web/project/flow/adverseEvents/useAdverseEvent.tsx","component/web/project/useProjectManager.ts","component/web/project/dialog/requestConsiderDoc/useRequestConsiderDoc.ts","component/web/project/dialog/requestConsiderDoc/requestConsiderDoc.tsx","component/web/project/flow/reportedNonconformance/useReportedNonconformance.ts","component/web/project/page/requestNewProject/reportedAnonconformance/useReportedAnonconformance.ts","component/web/project/page/requestNewProject/reportedAnonconformance/reportedAnonconformance.tsx","component/web/project/flow/reportedNonconformance/researcher/researcher.tsx","component/web/project/page/memoMessageTerminateProject/reportedNonconformance/useReportedNonconformance.ts","component/web/project/page/memoMessageTerminateProject/reportedNonconformance/reportedNonconformance.tsx","component/web/project/flow/reportedNonconformance/officer/officer.tsx","component/web/project/flow/reportedNonconformance/reportedNonconformance.tsx","component/web/project/page/resultOfConsiderPrevious/closeProject/useResultOfConsiderPrevious.ts","component/web/project/page/resultOfConsiderPrevious/closeProject/resultOfConsiderPrevious.tsx","component/web/project/flow/closeProjectEditAfterReview/researcher/researcher.tsx","component/web/project/flow/closeProjectEditAfterReview/researcher/useResearcher.tsx","component/web/project/flow/closeProjectEditAfterReview/officer/officer.tsx","component/web/project/flow/closeProjectEditAfterReview/closeProjectEditAfterReview.tsx","component/web/project/flow/closeProjectEditAfterReview/useCloseProjectEditAfterReview.tsx","component/web/project/flow/terminateProjectEditAfterReview/researcher/researcher.tsx","component/web/project/flow/terminateProjectEditAfterReview/researcher/useResearcher.tsx","component/web/project/flow/terminateProjectEditAfterReview/officer/officer.tsx","component/web/project/flow/terminateProjectEditAfterReview/terminateProjectEditAfterReview.tsx","component/web/project/flow/terminateProjectEditAfterReview/useTerminateProjectEditAfterReview.tsx","component/web/project/page/requestNewProject/terminateProjectByAdmin/useTerminateProjectByAdmin.ts","component/web/project/page/requestNewProject/terminateProjectByAdmin/terminateProjectByAdmin.tsx","component/web/project/page/resultOfConsider/terminateProjectByAdmin/useResultOfConsider.ts","component/web/project/page/resultOfConsider/terminateProjectByAdmin/resultOfConsider.tsx","component/web/project/flow/terminateProjectByAdmin/researcher/researcher.tsx","component/web/project/flow/terminateProjectByAdmin/researcher/useResearcher.tsx","component/web/project/page/memoMessageTerminateProject/terminateProjectByAdmin/useMemomessageTerminate.ts","component/web/project/page/memoMessageTerminateProject/terminateProjectByAdmin/memoMessageTerminate.tsx","component/web/project/flow/terminateProjectByAdmin/officer/officer.tsx","component/web/project/flow/terminateProjectByAdmin/officer/useOfficer.tsx","component/web/project/flow/terminateProjectByAdmin/terminateProjectByAdmin.tsx","component/web/project/flow/terminateProjectByAdmin/useTerminateProjectByAdmin.tsx","component/web/project/page/requestNewProject/projectRenewal/useProjectRenewal.ts","component/web/project/page/requestNewProject/projectRenewal/projectRenewal.tsx","component/web/project/flow/requestProjectRenewal/researcher/researcher.tsx","component/web/project/flow/requestProjectRenewal/researcher/useResearcher.tsx","component/web/project/page/synthesisRenewal/useSynthesis.ts","component/web/project/page/synthesisRenewal/synthesisREC1.tsx","component/web/project/page/synthesisRenewal/synthesisREC2.tsx","component/web/project/page/verifyDocumentRenewal/useVerifyDocument.ts","component/web/project/page/verifyDocumentRenewal/verifyDocumentREC1.tsx","component/web/project/page/verifyDocumentRenewal/verifyDocumentREC2.tsx","component/web/project/page/reviewerCommentRenewal/useReviewerComment.ts","component/web/project/page/reviewerCommentRenewal/reviewerCommentREC1.tsx","component/web/project/page/reviewerCommentRenewal/reviewerCommentREC2.tsx","component/web/project/page/synthesisReviewRenewal/useSyntheticReview.ts","component/web/project/page/synthesisReviewRenewal/synthesisReviewREC1.tsx","component/web/project/page/synthesisReviewRenewal/synthesisReviewREC2.tsx","component/web/project/flow/requestProjectRenewal/officer/officer.tsx","component/web/project/flow/requestProjectRenewal/requestProjectRenewal.tsx","component/web/project/flow/requestProjectRenewal/useRequestProjectRenewal.tsx","component/web/project/flow/requestProjectRenewalEditAfterReview/researcher/researcher.tsx","component/web/project/flow/requestProjectRenewalEditAfterReview/researcher/useResearcher.tsx","component/web/project/flow/requestProjectRenewalEditAfterReview/officer/officer.tsx","component/web/project/flow/requestProjectRenewalEditAfterReview/requestProjectRenewalEditAfterReview.tsx","component/web/project/flow/requestProjectRenewalEditAfterReview/useRequestProjectRenewalEditAfterReview.tsx","component/web/project/flow/closeProjectByAdmin/useCloseProjectByAdmin.ts","component/web/project/page/requestNewProject/closeProjectByAdmin/useCloseProjectByAdmin.ts","component/web/project/page/requestNewProject/closeProjectByAdmin/closeProjectByAdmin.tsx","component/web/project/page/resultOfConsider/closeProjectByAdmin/useResultOfConsider.ts","component/web/project/page/resultOfConsider/closeProjectByAdmin/resultOfConsider.tsx","component/web/project/flow/closeProjectByAdmin/researcher/researcher.tsx","component/web/project/page/memoMessage/closeProjectByAdmin/useMemomessage.ts","component/web/project/page/memoMessage/closeProjectByAdmin/memoMessage.tsx","component/web/project/flow/closeProjectByAdmin/officer/officer.tsx","component/web/project/flow/closeProjectByAdmin/closeProjectByAdmin.tsx","component/web/project/page/requestNewProject/projectWithdraw/useProjectWithdraw.ts","component/web/project/page/requestNewProject/projectWithdraw/projectWithdraw.tsx","component/web/project/flow/projectWithdrawal/researcher/useResearcher.tsx","component/web/project/flow/projectWithdrawal/researcher/researcher.tsx","component/web/project/flow/projectWithdrawal/officer/useOfficer.tsx","component/web/project/page/verifyDocumentProjectWithdraw/useVerifyDocumentProjectWithdraw.ts","component/web/project/page/verifyDocumentProjectWithdraw/verifyDocumentProjectWithdrawREC1.tsx","component/web/project/page/verifyDocumentProjectWithdraw/verifyDocumentProjectWithdrawREC2.tsx","component/web/project/page/confirmProjectWithdraw/useConfirmProjectWithdraw.ts","component/web/project/page/confirmProjectWithdraw/confirmProjectWithdraw.tsx","component/web/project/flow/projectWithdrawal/officer/officer.tsx","component/web/project/flow/projectWithdrawal/useProjectWithdrawal.ts","component/web/project/flow/projectWithdrawal/projectWithdrawal.tsx","component/web/project/page/requestNewProject/submittedWithdraw/useSubmittedWithdraw.ts","component/web/project/page/requestNewProject/submittedWithdraw/submittedWithdraw.tsx","component/web/project/flow/submittedWithdrawal/researcher/useResearcher.tsx","component/web/project/flow/submittedWithdrawal/researcher/researcher.tsx","component/web/project/flow/submittedWithdrawal/officer/useOfficer.tsx","component/web/project/page/verifyDocumentSubmittedWithdraw/useVerifyDocumentSubmittedWithdraw.ts","component/web/project/page/verifyDocumentSubmittedWithdraw/verifyDocumentSubmittedWithdraw.tsx","component/web/project/page/confirmSubmittedWithdraw/useConfirmSubmittedWithdraw.ts","component/web/project/page/confirmSubmittedWithdraw/confirmSubmittedWithdraw.tsx","component/web/project/flow/submittedWithdrawal/officer/officer.tsx","component/web/project/flow/submittedWithdrawal/useSubmittedWithdrawal.ts","component/web/project/flow/submittedWithdrawal/submittedWithdrawal.tsx","component/web/project/projectManager.tsx","constants/webFunction.ts","services/manageExternalProject/useManageExternalProject.tsx","component/web/manageExternalProject/search/searchForm/SearchFormExternalProject.tsx","component/web/manageExternalProject/search/searchResult/ItemExternalProject.tsx","component/web/manageExternalProject/search/searchResult/ResultExternalProject.tsx","pages/ExternalProject.tsx","services/web/useVerifyDocument.ts","pages/DocumentVerifyHistory.tsx","services/um/lookups/useResearcherType.ts","services/manageExternalProject/searchFormExternalProjectType.tsx","component/web/manageExternalProject/search/addExternalProject/FormAddExternalProject.tsx","pages/AddExternalProject.tsx","component/web/manageProject/search/PendingHistory.tsx","component/web/shareUI/defineType/ConsiderTypeHistory.tsx","component/web/expertises/expertiseShareStyle.ts","component/web/shareLogic/useExpertises.ts","component/web/expertises/SearchExpertisesResults.tsx","component/web/expertises/SearchExpertises.tsx","pages/ManageExpertises.tsx","component/web/expertises/ExpertiseForm.tsx","component/web/committees/SearchCommittees.tsx","component/web/committees/committeeStyles.ts","component/web/shareLogic/useCommittees.ts","component/web/committees/ExpertInfo.tsx","component/web/committees/ProjectInfo.tsx","component/web/committees/SearchCommitteesResult.tsx","pages/committees/ManageCommittees.tsx","component/web/committees/CommitteeForm.tsx","pages/committees/CommitteeEdit.tsx","pages/checklist/ManageCheckList.tsx","component/web/checklist/CheckListMainTopicComponent.tsx","component/web/checklist/CheckListSubTopic.tsx","component/web/checklist/CheckListMainTopic.tsx","component/web/checklist/FiledDraggable.tsx","component/web/checklist/Draggables.tsx","component/web/checklist/ChecklistTopicForm.tsx","pages/checklist/AddEditCheckList.tsx","component/um/researcher/SearchResearcher.tsx","component/web/shareLogic/useResearcherHook.ts","component/um/researcher/SearchResearcherResult.tsx","pages/researcher/ManageResearcher.tsx","component/um/officer/UserHistoryUpload.tsx","router/routesConfig.tsx"],"names":["manageProjectStore","atom","key","default","projectData","documentTopic","parameterForSave","currentPageUpdater","useManageProjectStore","useRecoilValue","useRadio","props","name","required","validates","translate","useTranslate","mergeValidate","triggedValidate","selectRequired","errorMessage","get","field","useField","validate","composeValidators","ErrorRadio","withStyles","root","color","checked","Radio","MyRadioView","labelGroup","options","requiredHalfWidth","disabled","onChangeValue","tooltipLabel","tooltipPlacement","input","meta","isError","error","invalid","touched","classes","useStyles","theme","useTheme","FormControl","style","width","Typography","variant","className","label","title","placement","IconButton","size","palette","info","main","RadioGroup","row","value","onChange","evt","target","map","option","index","FormControlLabel","id","control","disableOption","icon","onClick","onClickIcon","padding","FormHelperText","errorText","MyRadio","others","myRadio","makeStyles","marginBottom","fontSize","submittedType","notificationStore","notificationInfo","useNotificationStore","useNotificationAction","setNotificationStore","useSetRecoilState","setNotificationInfo","prevState","useManageMenuAction","setManageMenuStore","manageMenuStore","setState","newState","setIsOpen","param","isOpen","clearStore","useLayout","router","useRouter","open","setOpen","React","useState","appNotificationAction","useAppNotificationAction","callWebService","useWebService","profileStore","useAuthenStore","profile","manageMenuAction","selectedMenu","setSelectedMenu","tabIndex","setTabIndex","useEffect","getNotification","userId","async","result","getNotificationInfo","handleTogleSidebar","handleSelectedMenu","menuID","handleClickProfile","goTo","RoutePath","preference","LogoutView","onClickLogout","aria-label","edge","clsx","menuButton","Logout","localStorage","clear","window","location","replace","process","marginRight","spacing","useTabManager","folderAndTabStore","useFolderAndTabStore","folderSelected","tabSelected","tabDirty","callbackDirty","tabIndexSelected","tabRenderList","appFolderAndTabAction","useAppFolderAndTabAction","checkPermissionHook","useCheckPermission","dialogRef","useRef","configDialog","setConfigDialog","setNewTab","newTabSelected","current","closeDialog","setSeletedTabIndex","setSeletedTab","onChangeTab","canSaveDraft","checkSaveDraft","openDialog","menuTab","tab10","content","type","onClickConfirm","onRefDialog","func","flexGrow","tabsRoot","maxWidth","tabRoot","border","borderColor","borderRadius","margin","backgroundColor","indicatorRoot","IconLabelTabs","tabList","setValue","Tabs","event","indicatorColor","textColor","scrollButtons","indicator","itm","Tab","languageStore","currentLanguage","languageKey","th","nameTH","nameEN","TabManagerView","onRef","TabManagerCtrl","useTabManagerModel","notiInfoList","setNotiInfo","openNotiList","appNotificationStore","useAppNotificationStore","anchorRef","history","useHistory","setNotification","updateWatchedNoti","updateWatchedNotification","notiID","notifyID","res","handleClose","contains","onClickList","notiInfo","encryptedProjectID","encryptionAES","projectID","encryptedSubmittedID","submittedID","path","generatePath","manageProjectEdit","push","pathname","state","reload","onclickClose","onclickToggle","prevOpen","onclickDeleteNoti","stopPropagation","deleteNotificationInfo","deleteAndGetNoti","NotificationView","StyledBadge","badge","right","top","background","paper","Badge","getDisplayNotiTitle","Grid","ref","aria-controls","undefined","aria-haspopup","badgeContent","notiCount","forEach","isWatched","getNotificationCount","Popper","zIndex","anchorEl","role","transition","disablePortal","TransitionProps","Grow","transformOrigin","Paper","maxHeight","overflowY","ClickAwayListener","onClickAway","MenuList","autoFocusItem","subheader","ListSubheader","component","align","fontWeight","onKeyDown","length","displayProject","projectNumber","projectNameTH","projectNameEN","Divider","MenuItem","menuItemWatched","menuItem","container","item","xs","alignItems","justify","paperProjectStatusMobile","whiteSpace","overflow","textOverflow","paddingTop","notifyMessageTH","notifyMessageEN","notiNotfound","display","height","Notification","useNotificationModel","useNotification","userManualLink","researcher","officer","executive","committee","UserManualDocView","UserManualDoc","permissionHook","isUserAdmin","constUserManualLink","isUserResearcher","isUserChairmanOnly","isUserViceChairman","isUserSecretary","isUserCommittee","listRoot","paddingBottom","borderLeft","primary","menuText","iconListRoot","minWidth","iconListSelectedRoot","RenderMenu","route","authenStore","permission","isDisplayMenu","allow","every","per","functionID","functionName_th","functionName_en","isSelectedMenu","List","ListItem","button","Link","to","selected","ListItemIcon","menuIcon","ListItemText","disableTypography","drawerWidth","LayoutView","children","useAuthenService","authenAction","useLocation","matchEdit","useRouteMatch","isEditpage","isCreatepage","manageProjectCreateRequest","isShowTab","isMobileView","useMediaQuery","breakpoints","down","CssBaseline","AppBar","position","appBar","appBarShift","Toolbar","alignContent","itemRole","noWrap","textPrimary","NO_NAME","userGroupName_th","userGroupName_en","getDisplayUserGroup","textAlign","marginLeft","Avatar","alt","name_en","src","image_path","cursor","name_th","getDisplayNameUser","Drawer","drawer","anchor","onClose","drawerPaper","verticalAlign","lstPrivateRoutes","lineHeight","contentMobile","contentShift","drawerHeader","containerBody","text","transitions","create","easing","sharp","duration","leavingScreen","easeOut","enteringScreen","hide","flexShrink","boxShadow","minHeight","mixins","toolbar","justifyContent","paddingLeft","paddingRight","Layout","layout","authenService","autAction","accessToken","getItem","loginType","getProfile","setProfile","checkGetprofile","PrivateRoute","Component","rest","renderRoute","routeProps","userPermission","valid","isPermission","render","left","divCenterScreen","marginTop","MyLoading","isShowLoading","animationData","loadingJSON","renderer","loop","autoplay","Alert","elevation","MySnackbarView","message","Snackbar","anchorOrigin","vertical","horizontal","autoHideDuration","severity","MySnackbar","BGLoading","centerPage","backgroundImage","transform","App","applicationAlertMessageModel","appAlertMessageRef","appAlertMessageStore","useAppAlertMessageStore","appAlertMessageAction","useAppAlertMessageAction","snackbarStore","useSnackbarStore","snackbarAction","useSnackbarAction","onRefAppAlertMessage","onAfterClose","closeAlertMessage","snackbarConfig","closeSnackbar","handleOpen","openSnackbar","useApplicationAlertMessage","loadingHook","useLoading","fallback","lstPublicRoutes","exact","ReactRouterRoute","Route","configLoading","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","mainTheme","createTheme","typography","fontFamily","textTransform","body1","body2","subtitle2","dark","secondary","grey","50","overrides","MuiGrid","overflowWrap","ReactDOM","basename","ThemeProvider","document","getElementById","en","submittedStep","useTextfield","textRequired","TextfieldView","handleValueChange","onEnter","maxLength","min","materialInputProps","defaultValue","resetButtom","onBlur","rowsMin","other","multiline","myLabel","getLabel","TextField","omit","autoComplete","inputProps","InputProps","inputRoot","endAdornment","e","onKeyPress","charCode","MyTextfield","isDraftNotRequire","myInput","example","login","pdpa","academicPositionID","academicPositionName_en","academicPositionName_th","academicPositionOther","email","facultyID","facultyName_en","facultyName_th","fax","homePhone","irb","mobilePhone","titleNameID","titleNameOther","titleName_en","titleName_th","userGroupId","username","isPhD","only_name_en","only_name_th","isCunet","titleNameOther_th","titleNameOther_en","academicPositionOther_th","academicPositionOther_en","loadingStore","isLoading","useLoadingStore","commentaryStore","selectedCommitteeID","useCommentaryStore","backgroundRepeat","backgroundAttachment","backgroundSize","LayoutPublic","useManageProjectAction","setLoadingStore","openLoading","closeLoading","loadTiming","loadingAction","useLoadingAction","clearTimeout","loadingOpen","getElementsByTagName","loadingClose","windowSplit","href","split","isComing","indexOf","curr","setTimeout","clearLoading","useAuthenAction","setAuthenStore","setImageProfile","pleaseSelectApproveStatus","renderMode","view","edit","tab1","stepID","constSubmittedStep","verifyDoc","tab1Chairman","tab1Committee","tab2","specifyProjectType","tab2Chairman","tab2Commitee","tab3","specifyAdditionalDoc","tab4","specifySchedule","tab4Chairman","tab5","commentary","tab5Commitee","tab5Chairman","tab6","synthesis","tab6Chairman","tab7","synthesisReview","tab8","certification","tab9","sign","tab11","memoMessage","tabConfirmProjectWithdraw","confirmProjectWithdraw","tab21","submit","tab22","tab23","tab24","tab25","tab26","tab12","statusColorConstant","status1","submittedStatusColor","statusID","status2","status3","status4","status18","status5","status6","status7","status8","status9","status10","status11","status12","status14","proceedingMemoMessage","waitingEditProject","statusReject","statusClose","status15","pendingBackgroundColor","resultOfConsideration","noScope","terminate","withdraw","status17","cerTopic","code","memorandumTopic","customFolder","createProject","isLastProcess","folderName_en","folderName_th","submittedStatusID","submittedTypeID","constSubmittedType","firstSubmitConsideration","docAdditional","closeProject","projectPhase","nextPhaseProject","projectAmendment","amendmentProject","projectRenewal","renewalProject","raeProject","nonconformance","terminateProject","adverseEvents","adverseEvent","closeProjectByAdmin","terminateProjectByAdmin","withdrawProject","withdrawalProject","withdrawSubmitted","withdrawalSubmitted","fileExt","pdf","doc","docx","tiff","png","jpg","xlsx","xls","fileExtUploadFilelist","isTitleName","dr","topicForStudent","topicForLecturer","topicIsExempt","no","topicIsUploadComment","fixPosition","shortName","appFolderAndTabStore","folderList","useAppFolderAndTabStore","submittedStatus","routerHistory","routePath","parameter","moment","locale","convertDateToDateString","date","format","convertDateToFormatTH","newDate","add","convertDateToFormatEN","dateForAPI","withoutTime","formatDateToString","sortDate","sortBy","Date","dateData","i","diff","toString","addDays","days","myDate","setDate","getDate","callApi","useCallApi","example1","data","axiosGet","url","webServiceURL","example2","createNewProject","axiosPut","params","updateFileProject","updateFileStamp","uploadFileTemp","axiosPost","err","getProjectByID","verifyProject","searchTbl","userGroupID","deleteTempFile","specifyReceiveDocumentDate","requestNumberOfDocument","commentaryProject","getCommentaryProjectCommitteeByID","committeeUserID","checkAdvisorDueDate","getSynthesisReview","synthesisReviewApproveWithCommentProject","synthesisReviewProject","synthesisProject","getSynthesisProjectByID","getCertificateByID","certificate","updateLanguage","signCertificate","getSignCertificate","getProjectFolder","projectApproveWithComment","projectAmendmentManagement","projectPhaseManagement","projectRenewalManagement","verifyProjectRenewal","reportedAdverseEvents","synthesisReviewProjectRenewal","verifyProjectTerminate","projectTerminateMemoMessage","getProjectTerminateMemoMessage","signMemomessage","verifyProjectAdverseEvent","projectAdverseEventMemoMessage","getProjectAdverseEventMemoMessage","getSignMemomessage","getProjectNonconformanceMemoMessage","projectNonconformanceMemoMessage","projectAmendmentMemoMessage","projectNotPeopleMemoMessage","getProjectAmendmentMemoMessage","getProjectNotPeopleMemoMessage","getFileHistory","fileID","fileReplaceID","synthesisReviewCloseProject","getCertificateCloseProject","certificateCloseProject","verifyEditAfterReviewCloseProject","userID","axiosDelete","getAllCommentaryProjectCommittee","synthesisReviewTerminatedProject","closeProjectByAdminNew","closeProjectByAdminMemoMessage","getCloseProjectByAdminMemoMessage","getProjectPageUpdater","deleteProject","saveProjectWithdraw","saveProjectWithdrawResubmit","getProjectWithdraw","saveVerifyProjectWithdraw","saveConfirmProjectWithdraw","updSubmittedCommittee","updateProjectDetail","addPendingAndResume","updateCertificataData","getHistoryPendingAndResume","updateProjectConsiderType","updateMemoMessagePaper","updateProjectReviewer","updateSynthesisApproveStatus","updateSynthesisCommentaryTopic","getConsiderTypeHistory","submittedId","submitAllCheckList","getHistoryCommentaryProjectCommittee","submitOnlyDocReceiveDate","getHistorySynthesis","getUserHistoryUpload","userGroup","defaultLanguage","useLanguageStore","useLogin","post","authenServiceURL","values","Number","token","urlProfile","ButtonView","MyButton","styleCustom","validators","allValues","reduce","validator","submitType","richEditorRequired","Object","emptyVal","JSON","stringify","chairman","secretary","validateEmail","test","validatePhone","format1","RegExp","format2","format3","validateMobilePhone","validateTextLength30","validateEN","uploadRequired","validateNumeralNoPrecision","validateTreeCheckboxRequireAtLeastOne","isParentSelected","parentSelected","filter","isChildSelected","childSelected","validateModeAccordionError","names","formProps","errKeys","keys","errors","isEmptyPage","uploadFile","uploadFileObj","documentTopicID","subTopicPageList","includes","validateMaxDocLength","useAlertMessageAction","setAppFolderAndTabStore","setListFolder","list","setSeletedFolder","setTabRenderList","setTabDirty","resetTabDirty","setDirty","postRegisterEx","getPreferencesProfile","putPreferencesProfile","getLookupTitle","getLookupAcademicPosition","getResearcherType","getExternalResearcher","getRequestExResearcher","putResultExResearcher","getLookupUserGroup","getLookupUserGroupFilterByREC","getLookupGroup","getLookupPosition","postAddOfficer","postPreferencesForgotPassword","postCheckEmail","postActivate","putPreferencesChangePassword","putPreferencesChangePasscode","postActivateOTP","postCheckPersonnel","postSearchResearcher","deleteResearcher","postImageProfile","postImageLogoProfile","getDBInprogress","getDBAverageStatus","getDBAverageProject","getDBAverageFaculty","getDBAverageEachFaculty","getDBOverview","getResultReviewer","getResultExpired","getExportData","getDataApproveStatus","postSearchHold","postLineLogin","getSearchSettingFaculty","getSettingFaculty","getIrb","getSettingCertificate","putSettingCertificate","postSettingCertificate","getSearchSettingDocument","getSettingDocument","postSettingDocument","putOrderSettingDocument","getSearchSettingConsideration","getSettingConsideration","putOrderSettingConsideration","getUserInfo","docRequire","putUserPassword","getExternalProject","postExternalProject","updateEmailSetting","searchCommittees","getCommitteeExpertByID","updateCommitteeExperiseByID","getProjectInfo","getCommitteeExpertInfo","getAllChecklist","deleteChecklist","orderChecklist","getChecklistBySubmittedID","ErrorType","ERROR_EXPIRE_TOKEN","response","status","TOKEN_EXPIRE","axiosBasic","axios","getHeaders","contentType","Authorization","getAxios","authorizationType","interceptors","request","use","config","Promise","reject","returnResponse","catchFunc","console","log","errorStatusCode","UNAUTHORIZED","openAlertMessage","expireDate","currentDate","getTime","headers","put","delete","useManageMenuStore","usePDPA","accept","getByUser","ModalPDPA","onAccept","consent","md","dangerouslySetInnerHTML","__html","fullWidth","uploadTemp","deleteTemp","getListAll","checkAdvisorDueDateByID","languageUpdate","updateCertificateData","getProjectFolderByID","signMemoMessage","projectAdverseEvent","updateMemoMessage","projectTerminateByAdmin","getCloseProjectbyAdminMemoMessage","getVerifyDocumentHistory","getCertificateByProjectId","checkListCommentary","getHistoryUpload","useLanguage","lang","onClickEN","setChangeLanguage","onClickTH","Language","language","highlight_lang","useLanguageStoreFunction","setLanguage","setCurrentLanguage","t","i18n","useTranslation","languageAction","replaceWords","resourcesWord","get2Element","createElement","changeLanguage","secretKey","encryption","stringencrypt","CryptoJS","SHA256","ciphertext","AES","encrypt","replaceEncryptedStr","decryptionAES","cryptoInfo","deReplaceCiphertextStr","replaceForDecryptStr","decrypted","decrypt","str","enc","Utf8","replaceAll","setSnackbarStore","initReactI18next","Backend","init","fallbackLng","backend","loadPath","lng","interpolation","escapeValue","rootContainer","typo","Login","accessTokenRef","loginTypeRef","profileRef","openPDPA","setOpenPDPA","PDPA","setPDPA","displayPW","setDisplayPW","dialogTwoRef","checkIsLogined","defaultOpenPage","defaultRoutePath","profileRes","displayControl","welcome","setItem","String","encodedDownloadLink","URLSearchParams","search","downloadLink","replacedDecryptStr","encodedWord","Base64","parse","decodeDownloadLink","assign","checkPDPA","password","salt","Buffer","from","getUserProfile","goToRegister","register","goToForgotPW","forgotPassword","onRefDialogTwo","lg","onClickDisplayControl","onSubmit","onClickForgotPW","onClickRegister","setAppAlertMessageStore","link","textDecoration","Form","handleSubmit","form","placeholder","val","txtLogin","change","liff","up","gridTypography","flexDirection","typographyWrap","imageTypography","checkIcon","dash","borderBottom","ConnectLine","showPassword","setShowPassword","useLineLogin","liffId","initLift","sm","lineID","closeWindow","onHandelShowPassword","loginButton","ConnectLineForm","initialValues","umServiceURL","TooltipView","onTooltipOpen","onClickTooltipClose","isMobileTablet","check","a","navigator","userAgent","vendor","opera","substr","BrowserDetect","mobileView","arrow","PopperProps","disableFocusListener","disableHoverListener","disableTouchListener","tooltip","tooltip_arrow","webView","Tooltip","FolderType","projectStore","constUserGroup","isUserChairman","president","vicePresident","reviewer","isCommitteeInProject","lstCommitteeInProject","isValid","chkProjectStepViewMode","haveAboveSubmitted","aroundSubmittedIDInfo","nextSubmittedID","currentSelectTab","currentFolderSelected","isProjectSuccess","submittedStatusInfo","isNonconformance","submitTypeInfo","isCloseProjectByAdmin","isWithdrawProject","isWithdrawSubmitted","projectCommitteeInfo","committeeInfo","isWithdrawSubmitByAdmin","isSubmitByAdmin","isWaitResearcherEdit","incorrectDocument","isViewMode","findCommentary","committeeCommentary","find","isDraftCommentary","isEditAfterReview","editAfterReview","exitAfterReview_AmendmentProject","editAfterReview_nextPhaseProject","editAfterReview_closeProject","editAfterReview_terminateProject","editAfterReview_renewalProject","isCloseProject","getTabListFunc","selectedFolder","committeeInProject","submitTypeID","isFlowApproveWithComment","isProjectNotAboutPeople","isNotAboutPeople","isNeedEditForm","tabAdminList","tabResearcherList","tabChairmanList","tabCommitteeList","constSubmittedStatus","complete","isUserSystemAdmin","systemAdmin","isAllowOfficerToEdit","allowOfficer","isAllowDefineDirector","getTabRenderList","projectStatus","isHideTabRecord","isDisApprove","presidentMustSave","getFolderRenderList","folderRenderList","chkShowUpdateDate","isDraft","isShowUpdateDate","chkDisplayBTNDeleteProject","some","checkDisabledProjectReviewer","checkDisabledProjectType","allowSteps","disabledCondition","useDialog","isActionReady","setIsActionReady","reachedBottom","onClickClose","setMainActionReady","ActionAlertMessage","txtClose","ActionAlertConfirm","txtConfirm","ActionAlertSaveCancel","ActionAlertAcceptCancel","DialogView","listInnerRef","scrollTop","scrollHeight","clientHeight","disableBackdropClick","onScroll","Math","ceil","contentText","renderContent","renderAction","Dialog","dialogModel","usePlayground","displayComponentKey","setDisplayComponentKey","onClickPlayground","useI18nPlayground","isTH","onClickChangeLang","I18nPlaygroundView","Switch","I18nPlayground","i18nPlaygroundModel","noRows","bottom","VirtualizedView","layoutStyle","rowCount","rowHeight","rowRenderer","onScrollEnd","rowPerpage","currentIndex","scrollToIndex","isGotoTop","onClickGotoTop","currentPage","gotoTop","setGotoTop","currentIndex2","setCurrentIndex2","_noRowsRenderer","overscanRowCount","onRowsRendered","overscanStartIndex","overscanStopIndex","startIndex","stopIndex","noRowsRenderer","TableExamView","onClickEdit","mockData","setMockData","count","records","field1","field2","field3","field4","field5","field6","field7","field8","field9","field10","createRecord","isSumItem","setIsSumItem","listItem","setListItem","getListTbl","pageNumber","rowsPerPage","items","totalRecords","parent","projectCode","TableExam","useDialogPlayground","dialogOneRef","onRefDialogOne","onClickDialogOne","onClickDialogTwo","onClickApplicationAlertMessage","DialogPlaygroundView","DialogPlayground","dialogPlaygroundModel","playgroundAtom","firstName","lastName","usePlaygroundAtom","usePlaygroundAtomFunction","setPlayground","setFirstName","useAtomPlayground","playgroundStore","playgroundAction","usePlaygroundAction","onClickSetFirstName","AtomPlaygroundView","AtomPlayground","atomPlayground","useFormPlayground","useMyAutocomplete","MyAutocompleteView","onOpenOpt","getValue","Autocomplete","noOptionsText","getOptionLabel","getOptionDisabled","getOptionSelected","PopperComponent","renderInput","InputLabelProps","shrink","onOpen","MyAutocomplete","myAutocomplete","useMyDatePicker","MyDatePickerView","minDate","maxDate","clearable","disabledWeekend","CalendarTodayOutlined","MuiPickersUtilsProvider","libInstance","utils","MomentUtils","DatePicker","inputVariant","animateYearScrolling","pickerHeaderFormat","yearOffset","shouldDisableDate","day","disable","MyDatePicker","myDatePicker","useDatepicker","useMultiSelect","MenuProps","PaperProps","ITEM_HEIGHT","getContentAnchorEl","MultipleSelectView","isCheckedAll","valueList","setValueList","checkAll","setCheckAll","dValue","require","isEqual","sort","Select","multiple","itmAll","afterCheckedAll","_value","OldList","displayEmpty","myStyle","renderValue","selectedItem","filtered","listLabel","join","myCheckAll","Checkbox","optionItm","MyMultiSelectCtrl","myMultiselect","formControl","chips","flexWrap","chip","noLabel","useUploadFile","requiredErrorMessage","onChangeUpload","initialData","topicID","refElementUpload","refElementTextField","lstFileUpload","setLstFileUpload","returnData","setReturnData","upload","fileList","callUploadFile","mainTopicID","formData","FormData","file","append","onClickUpload","click","files","lstFile","lstDisplayName","numFiles","numMaxUploadFile","lastModified","myNewListFile","fileToken","filename","newReturnData","onClickClear","newLstFile","onChangeInputPage","page","subTopicID","obj","subtopicID","newSubTopicPageList","UploadFileView","subTitleList","dataSource","Button","initialSubtopic","inputPage","hidden","inputRef","adornedEnd","button_end_icon","readOnly","UploadFile","uploadFileModel","clear_icon","boxSizing","DateRangePicker","minDates","maxDates","useForm","startMoreThanEnd","getFieldState","end","start","endLessThanStart","formVal","getState","startDate","subtopic","getUploadInit","uploadFileinit","idx","resItm","objUpload","FormPlaygroundView","mutators","arrayMutators","date1","date2","fields","FormPlayground","formPlayground","useApiPlayground","onClickCallPostApi","keyword","onClickCallGetApi","ApiPlaygroundView","ApiPlayground","useUploadFilePlayground","UploadFilePlaygroundView","UploadFilePlayground","uploadFilePlayground","PlaygroundView","sectionHeader","sectionContent","TableExample","Playground","playground","useSearch","setIsGotoTop","displayRole","isPage","setIsPage","isShowForm","setIsShowForm","paramSearch","setParamSearch","paramSearchRef","formatParams","sortModel","setSortModel","paginationModel","setPaginationModel","pageCount","pageSize","paginationMode","setKeyword","useQueryParam","setSubmittedType","setStatus","submittedStatusList","setSubmittedStatus","initialValueForm","setInitialValueForm","checkPermission","currentListIndexRef","authenStoreRef","searchParamRef","setSearchParam","keywordSearch","projectSubmitType","projectSubmittedStatusId","projectStatusId","sent","received","directorAssigned","waitingSentReviewer","waitSynthesis","proceedingCertificate","waitSign","resultConsideration","considering","waitingSetCopies","ProceedingMemoMessage","constProjectStatus","processing","sortingCol","sortingType","projectSubmitTypeId","submittedStatusId","createInitialFrom","defaultFormSearch","initialFrom","defaultSearch","isResearcher","isChairman","getListItem","listProjectSubmitTypeId","parseInt","listStatusID","listSubmissionID","paramsSearch","onlyMe","onlyPreliminary","researcherDraft","doAndDoneCommentary","searchValue","idDraft","is_draft","mode","onClickCreate","onClickSearch","handleClickGotoTop","handleScrollEnd","pendingProps","afterSubmitPending","projectTypeLutUrl","projectSubmitTypeLutUrl","requestConsiderDocUrl","facultyLutUrl","researcherTypeLutUrl","titleNameLutUrl","academicPositionLutUrl","documentTopicLutUrl","directorNameUrl","roleUrl","statusUrl","reviewerUrl","approveStatusUrl","commentaryTopicUrl","educationLevelUrl","approveStatusProjectRenewal","terminateCause","approveStatusByCloseProject","submittedStatusUrl","expertiseFaculty","getExpertisesLUT","searchExpertisesLUT","getExpertisesDetailByID","deleteLutExpertisesByID","updateExpertisesLUT","addExpertisesLUT","useLookupService","lookupServiceURL","callProjectTypeLut","callFacultyLut","callProjectSubmitTypeLut","callResearcherTypeLut","callTitleNameLut","callAcademicPositionLut","callDocumentTopicLut","irbID","callDirectorNameLut","callRoleLut","callStatusLut","callReviewerLut","callApproveStatusLut","callCommentaryTopicLut","callDocumentTopicCloseLut","callCommitteeLut","getEducationLevel","callApproveStatusLutProjectRenewal","isCommittee","getTerminateCause","callApproveStatusLutSubmitType","getRequestConsiderDoc","getApproveStatusByCloseProject","callSubmittedStatusLut","getExpertiseFaculty","useSearchForm","onGetListItem","callLookup","category","setCategory","submissionProcess","setSubmissionProcess","getCategory","getSubmissionProcess","getStatus","formatedData","isCondition","onClickSubmit","onClickClearForm","onChangeCategory","onChangeStatus","onChangeProjectName","handleEnterSearch","lutCategory","lutStatus","lutSubmissionProcess","isOfficer","useCheckbox","nameKeyValue","MyCheckboxView","isChecked","FormGroup","rootError","MyCheckbox","myCheckboxGroup","useCheckboxGroup","SearchView","initialValue","keywordSearchPlaceholder","btnSearch","Search","searchModel","useAccordion","Accordion","expanded","MuiAccordion","AccordionSummary","expandIcon","MuiAccordionSummary","AccordionDetails","MuiAccordionDetails","SearchAccordionView","isBack","onClickBack","iconControl","ArrowBackRounded","square","defaultExpanded","searchIcon","onFocus","SearchAccordion","_path","_extends","bind","arguments","source","prototype","hasOwnProperty","call","apply","this","SvgDocument","_ref","svgRef","titleId","viewBox","fill","xmlns","d","ForwardRef","useCeritificates","getCertificatesByProjectId","apiUrl","projecId","CustomLabel","styled","hasCoaNo","CustomButton","DialogCoaButton","pendingStatus","projectInfo","coaNo","certificates","setCertificates","certData","coa_no","received_date","certificate_id","PendingButton","ResumeButton","CloseButton","DialogPending","isProcessing","projectStatusID","isResume","pendingStatusID","pending","successRef","failRef","confirmRef","handleCloseDialog","handleOpenDialog","callPendingResume","conditionStatusID","resume","remarks","remark","catch","openConfirm","visibility","passcode","rows","header","btnEdit","multiLineEllipsis","paperFromSearch","headTbl","div","btnAdd","btnIcon","paperProjectCode","paperProjectStatus","hoverRow","cardBtn","pendingBtn","resumeBtn","paperList","submittedTypeCard","linkLabel","boxDate","isDirector","Item","checkStatusColor","submittedStatus_th","submittedStatus_en","projectStatusBackgroundColor","statusTextColor","rejected","closed","notScope","completed","getDisplayProjectStatus","displayStatus","projectStatus_th","projectStatus_en","getDisplayProjectName","displayProjectName","projectName_th","projectName_en","getDisplayResearcherName","displayResearcherName","researcherName_th","researcherTypeName_th","researcherName_en","researcherTypeName_en","getDisplaySubmittedDate","submittedDate","conditionSubmitTypeName","renderListElementMobile","submitTypeName","expectedDate","announceDate","approveStatusId","previousAnnounceDate","verifyDocDate","xl","SvgIcon","DocumentIcon","committeeDueDate","submitTypeName_th","submitTypeName_en","consider_type_name_th","consider_type_name_en","rowData","projectName","researcherName","encryptedData","projectPendingHistory","openPendingHistory","renderListElement","Result","startIcon","statusColorRef","addEventListener","handleScroll","passive","removeEventListener","wrappedElement","isBottom","el","getBoundingClientRect","innerHeight","Container","createStyles","useManageProjectType","ManageProjectView","screenHeight","ManageProject","manageProjectModel","useRichTextfield","useTreeCheckbox","nested","checkBox","TreeCheckboxView","isLangTH","labelRadioTH","labelRadioEN","onClickParentCheckbox","selectedList","setSelectedList","initial","parentID","handleClick","isParentCheckedFn","isChildrenCheckedFn","handleCheckedParent","newSelectedList","newParentList","newChildList","changeInputValue","handleCheckedChild","isAllChildChecked","topicData","checklistID","isAllChildCheckedFn","langValueList","dataForReturn","aria-labelledby","Collapse","in","timeout","unmountOnExit","disablePadding","childrenList","child","renderElement","TreeCheckboxCtrl","treeCheckboxModel","useChecklist","getAllTopic","getCheckListByTopicID","addNewCheckList","body","deleteCheckList","editAllCheckList","reOrderChecklist","checkList","checklistStore","checklist","useChecklistStore","useChecklistAction","setChecklistStore","setChecklist","getChecklist","committeeID","clearChecklist","ButtonForm","subChecklist","subTitle","btnStyle","DialogChecklist","setCheckList","setInitialValues","groupAppropriate","topicCheckList","checklistRef","isAppropriate","setIsAppropriate","openRef","setCheckListAction","checklistState","isHas","setIsHas","handleChangeValue","topic","newAppropriate","_","flattenDeep","isChecklistChose","checkListSelected","newData","f","c","MyRichTextFieldView","initialRichTextEditor","isHideToolbar","commentTitle","commentTitleID","topicCount","editorState","setEditorState","EditorState","createEmpty","MAX_LENGTH","textLength","blocksFromHtml","htmlToDraft","contentState","ContentState","createFromBlockArray","contentBlocks","entityMap","createWithContent","getInitialState","contentHtml","initialValueObj","getLengthOfSelectedText","currentSelection","getSelection","isCollapsed","currentContent","getCurrentContent","startKey","getStartKey","endKey","getEndKey","isStartAndEndBlockAreTheSame","startSelectedTextLength","getBlockForKey","getLength","getStartOffset","endSelectedTextLength","getEndOffset","keyAfterEnd","getKeyAfter","currentKey","calWidth","innerWidth","editorStyle","wrapperClassName","editorClassName","mainEditor","handleBeforeInput","getPlainText","handlePastedText","pastedText","currentContentLength","selectedTextLength","onEditorStateChange","rawObject","convertToRaw","htmlTag","draftToHtml","textValue","blocks","block","trim","toolbarHidden","MyRichTextFieldCtrl","richTextFieldModel","myRichText","richtextObj","boxItem","wordBreak","Items","Box","p","Report","dataList","useSelect","SelectView","onChangeSelect","displayIcon","slice","MySelectCtrl","mySelect","useProjectType","projectT","setProjectT","initialLoad","getProjectType","Panel","initialSearch","onReset","endDate","setEndDate","defaultProjectType","projectType","isAfter","handleStartDateChange","reset","alignSelf","setPrefixName","academicPosition","titleID","outline","CustomPagination","apiRef","useGridSlotComponentProps","Pagination","shape","pagination","setPage","CustomNoRowsOverlay","lineHeigh","overflowX","DataTable","setDataList","setDataFormat","getCommitte","convertData","committees","receiveDate","column","headerName","headerClassName","columns","autoHeight","rowsPerPageOptions","sortingOrder","disableColumnMenu","disableSelectionOnClick","components","NoRowsOverlay","viewerExport","committeeLength","workbook","Excel","worksheet","addWorksheet","pageSetup","paperSize","orientation","creator","lastModifiedBy","createHeader","arrName","arrHeader","getRow","arr","fromCharCode","colKey","getCell","setCellBorder","alignment","wrapText","pattern","fgColor","argb","makeRowITM","rowNumber","rowITM","addRow","setCellRight","setCellCenter","setContentBorder","isOddRow","setContentColor","lastRow","setLastContentBorder","createTable","rowGroupITM","createBody","mergeCells","font","bold","writeBuffer","xls64data","blob","Blob","URL","createObjectURL","reportDate","download","documentMode","StyleMedia","revokeObjectURL","useSearchReviewer","getReviewerData","umServinceURL","Reviewer","setRecords","setProjectType","setStartDate","subtract","loadData","getProjectTypeName","convertDate","initialize","convertExportData","zip","keyArr","nameArr","zipObject","commiteesExtract","considerType","maxBy","expiredDate","researcherTypeName","projectName_TH","projectName_EN","useSearchExpired","getExpiredData","expiredExport","Error","Expired","onClear","handleEndDateChange","closedExport","Table","setRows","closedDate","headerAlign","sortable","ClosedForm","searchClosed","useSearchClosed","setInitialValue","useResearchDetail","isExpanded","setExpanded","docLst","setDocLst","onClickAccordionChange","resetLstFileUpload","refElementUploadEdit","refGroupFileIndex","refDialog","refDialogDownload","lstFileChange","setLstFileChange","lstFileHistory","setLstFileHistory","dirty","IRB","listFile","onClickChange","currentListFileNum","checkExtension","listExtension","j","sCurExtension","substring","toLowerCase","checkFileExtension","extname","listFileName","duplicateFile","oldFile","checkDuplicateFile","isNewFile","newFileList","onChangeUploadEdit","fileGroupIndex","replaceFileID","deleteTempParam","currentValue","oldReplaceFile","alert","queryFileHistory","disabledBtn","latestDocument","onClickOpenFile","nameBtn","canEditUploadFile","multipleFiles","isPreventUpload","isDontWantHistory","renderIcon","iconPath","fileExtConst","getDisplayDate","getDisplayHistoryDate","isRequired","file_name_th","file_name_en","div_a","rel","editfileBtn","uploadObj","currentTarget","file_path","inx","fileName","updatedBy","updatedDate","UploadDocView","documentTitleList","renderUploadFile","UploadDocFile","uploadDocModel","useUploadDoc","spellWord","rootLink","buttonCheck","onClickDisplayPW","onClickDisplayCfPW","onChangeMobilePhone","onClickBackLink","onClickCheck","onChangeUsername","displayCfPW","canUse","fileInitial","topicInitial","Icon","onChkEmail","confirmPassword","isEmail","valueEmail","valBack","useRegisterExternal","cunet","useCheckEmail","postCheck","Content","acceptanceContentTH","acceptanceContentEN","Acceptance","onClickAccept","dialogAcceptance","RegisterExternal","setDisplaCfyPW","setCanUse","bufferData","setBufferData","onBack","fnCallback","phoneNumber","defaultSelect","waiting","approved","Status","chooseClass","registerDate","useExternalResearcher","ExternalResearcher","StringParam","setStatusID","ArrayParam","setIsExpanded","setData","setInitialSearch","onSearch","useApproveExReseacher","subject","reason","reasonReject","itemList","departments","departments_en","Approve","setReject","caseReject","Information","initFiles","containerBT","cancelButton","saveButton","renderApproveForm","renderButton","langReason","StatusBar","chooseWord","ApproveExResearcher","useParams","setInit","fetch","updateBy","save","goBack","renderForm","usePreferenceForgotPassword","formPropsRef","handleClickLogin","emailValue","cu_net","float","ForgotPassword","useUserGroup","setUserGroup","getLookup","action","groupID","lutUserGroup","ConstantUserGroup","usergroupID","recentTime","btnDelete","fullName","usergroup","onDelete","empty","EmptyData","isEmpty","sorting","select","officers","onSort","order","getFullName","officerItem","fullnameTH","fullnameEN","group","updateDate","createdDate","Member","deleteOfficer","useDeleteOfficer","setOfficers","searchOfficers","useCallback","orderyBy","useSearchOfficer","setUsergroupID","setOrder","confirmDelete","newOfficers","orderBy","useTitleName","useUsergroupFilterREC","usergroupFilterREC","setUsergroupFilterREC","useGroup","setGroup","usePosition","setPosition","FieldObservable","subscription","useEditUsergroup","officerInfo","setOfficer","getOfficer","putOfficer","useUploadImage","refElementHelperText","UploadImageView","labelTitle","buttonColor","UploadImage","useUploadImageModel","convertPathToNameImg","lastIndexOf","UploadLogo","usestyles","temp","setTemp","signatureTH","signatureEN","onUpload","formDataImage","image","direction","objectFit","useInfoChangePassword","changeUserPasswordById","newPassword","DialogSetPassword","setPasswordDialogRef","openSetPasswordDialog","onSetPasswordDialogRef","onSetSuccessRef","onSetFailRef","handleClickDisplayPassword","prev","handleClickDisplayConfirmPassword","confirmNewPassword","clearSetPasswordValues","buttonEmail","checkboxDoctor","divStyle","containerUpload","uploadTitle","uploadDescription","onCheck","onchangeRadioCUNET","readonly","initialUploadFile","userIRB","positionID","lookupTitleName","lookupPosition","lookupUserGroupInitial","lookupUserGroup","lookupGroup","irb_id","getDisableIRB","isDisableIRB","getDisableUserGroup","isDisableUserGroup","openHistoryUpload","documentInfo","Check","Clear","cunetID","InfoOutlined","positionDisable","nameTitleDisable","useAddUsergroup","postOfficer","useCheckPersonnel","personnelId","UsergroupAdd","checkEmail","setCheckEmail","setInitialUploadFile","createInitialValue","formValues","NAME_TH","SURNAME_TH","NAME_EN","SURNAME_EN","findPosition","ACAD_TITLE_1","DOCTORAL_TITLE","TITLE_ID","homeTelephone","OFFICE_PHONENUMBER","positionTitle","formatPosition","element","uploadFileInit","initDocument","docInfo","initialUpload","isPositionSpecified","isBothIrb","titleOtherTH","titleOtherEN","positionOtherTH","positionOtherEN","createdBy","isCUNET","onInitialCUData","titleOther","positionOther","usePreferenceChangePassword","onRefFormProps","onRefCloseDialog","preferenceChangePasswordHook","usePreferencePasscode","newPasscode","isPasscode","preferencePasscodeHook","confirmPasscode","handleClickDisplayPasscode","handleClickDisplayConfirmPasscode","confirmNewPasscode","usePreferenceProfile","getPreferanceProfile","positionTH","positionEN","titleTH","titleEN","putPreferanceProfile","postImage","postImageLogo","putEmailSetting","isEnable","isEnabled","UploadProfile","getNewProfile","onSave","useAcademicPosition","titleOptions","positionOptions","useGetSync","isSync","setSync","img","progressIcon","Line","checkSync","whenTrue","whenFalse","imgUpload_th","imgUpload_en","NotificationSetting","preferenceProfileHook","firstTime","setFirstTime","setIsEnabled","formState","enableEmail","elementUpload","gap","onSaveInformation","preferanceProfileHook","usePreferanceProfile","dialogChnagePasswordRef","dialogChnagePasscodeRef","initialForm","setInitialForm","getInitialForm","handleOpenDialogChangePassword","handleOpenDialogChangePasscode","handleClickConfirm","isShowChangPassword","onError","Profile","useActivate","onClickShowPassword","onClickShowPasswordCf","isShowPassword","isShowPasswordCf","txt","verify","payload","secretOrPublicKey","jwt","decoded","Activate","setIsShowPassword","setIsShowPasswordCf","fetchPDPA","goToLogin","ActivateForgot","x","y","datum","pointerEvents","legend","chart","tooltipContainer","InProgress","dataPie","dataLegend","pieColor","cx","cy","r","offset","stopColor","isValue","labels","labelComponent","flyoutComponent","renderInPortal","innerRadius","radius","colorScale","events","eventHandlers","onMouseOver","mutation","active","onMouseOut","stroke","UserGroupIDType","xName","CustomLabelLine","dataBar","selectUser","AverageStatusTime","dataChart","standardLine","barColor","x1","y1","x2","y2","domainPadding","containerComponent","voronoiBlacklist","axisLabelComponent","dy","dx","axis","tickLabels","dependentAxis","angle","grid","strokeWidth","dataLine","AverageProjectTime","projectList","setProjectList","sortData","TootipChartComponent","stroke-width","standalone","tickValues","tickFormat","axisLabel","tickLabelComponent","cornerRadius","pointerLength","useDashboard","getInprogress","searchParams","set","getAverageStatus","getAverageProject","getOverview","getAverageFaculty","getAverageEachFaculty","getDataToExport","watermark1","opacity","watermark2","isAll","Overview","number","center","AverageFaculty","projectListGraph","setProjectListGraph","listData","mouseFollowTooltips","voronoiDimension","activateLabels","tick","isInteger","toFixed","sortKey","sortOrder","facultyObj","AverageEachFaculty","faculty","exportData","data1","data2","header2","content2","data3","header3","content3","data4","header4","content4","worksheet_2","worksheet_3","worksheet_4","arrHeaderSheet2","arrHeaderSheet3","arrHeaderSheet4","textColumns","countDataGroup","startRowHeader","createHeaderSheet3","Consideration","dateRange","resultCard","Dashboard","dataExport","setDataExport","inProgress","setInprogress","approveStatus","setApproveStatus","averageStatus","setAverageStatus","averageProject","setAverageProject","averageFaculty","setAverageFaculty","averageEachFaculty","setAverageEachFaculty","overview","setOverview","setFacultyID","setFaculty","setUserGroupID","resultInprogress","resultAverageProject","resultOverview","resultAverageFaculty","resultExportData","resultDataApprove","fetchData","paramForEachFaculty","resultAverageEachFaculty","resultAverageStatus","gutterBottom","TestExport","useFaculty","getFaculty","useProjectStatus","setProjectStatus","getProjectStatusType","useStatus","statusList","setstatusList","defaultSubmitted","defaultFaculty","firstTimeDataList","setFirstTimeDataList","facultyName","educationLevelName","approveStatusName","submittedTypeName","firstTimeExport","FirstTime","searchFirstTime","useSearchFirstTime","getProjectSubmitTypeName","getFacultyName","holdExport","Hold","searchHold","useSearchHold","record","setRecord","degree","countDueDate","MyAccordionView","titleIcon","noPadding","MyAccordionCtrl","Officer","buttonSection","btnSubmit","SettingCertificate","certificateID","useSettingCertificate","getSettingCertificateed","detail_TH","description","detail_EN","condition_TH","condition","condition_EN","logoURL","detail_exempt_TH","descriptionExempt","detail_exempt_EN","condition_exempt_TH","conditionExempt","condition_exempt_EN","useIRB","setIrb","getIRB","lookup","paperSearch","recID","rec","SettingFaculty","searchSettingFaculty","useSearchSettingFaculty","setRecID","useStyle","useSettingFaculty","settingFaculty","setSettingFaculty","putSettingFaculty","postSettingFaculty","SettingFacultyAdd","optionDialog","useIRBType","irbTypeList","setIRBTypeList","onRefForm","onChangeREC","onChangeHomePhone","useSettingREC","settingREC","setSettingREC","getSettingRECByID","getSettingREC","potSettingREC","putSettingREC","getMasterRECByID","SettingRECAdd","refForm","addressTH","addressEN","telephone","headerCertificateEN","headerCertificateTH","headerMemorandumEN","headerMemorandumTH","organizationEN","organizationTH","batch","SettingRECEdit","defaultREC","defaultSubmittedType","useSettingDocument","putEditSettingDocument","documentID","listID","postDocRequire","Order","shortNameTH","shortNameEN","reLoadData","onChangeDocRequire","FiledDraggable","isDragDisabled","draggableId","provided","snapshot","innerRef","draggableProps","dragHandleProps","isDragging","draggableStyle","userSelect","documentRequire","controlFieldArray","Draggables","handleOrder","handleOrderNumberMode","onDragEnd","destination","reorder","endIndex","Array","removed","splice","onClickAdd","settingDocumentAdd","submitting","pristine","total","droppableId","droppableProps","isDraggingOver","SettingDocument","setRec","setIsDragDisabled","textResult","useSort","sorts","setSort","paperSection","recName","SettingREC","handleGetSettingREC","newDataList","formValuesRef","SettingDocumentAdd","uniqueId","isDisplayDocument","initDocumentInfo","SettingDocumentEdit","SettingFacultyEdit","useSettingConsideration","settingConsideration","setSettingConsideration","approveStatusID","putSettingConsideration","defaultMultiselect","SettingConsideration","searchSettingConsideration","useSearchSettingConsideration","setSubmittedTypeID","SettingConsiderationEdit","ParamSearchKey","Landing","_g","_g2","setLogged","manageProject","SvgFolder","enableBackground","iconColor","lastestIconColor","drawerOpen","drawerClose","listItemRoot","borderTopLeftRadius","borderBottomLeftRadius","listItemlastest","toggleFolderButton","getFolderIcon","Constants","firstSubmitConsideration_notScope","MiniDrawer","menuFolderList","onClickMenu","Fragment","AdminEditView","researcherFullname_th","researcherTypeInfo","researcherFullname_en","conditionShowStatusInfo","projectStatusInfo","researcherSubmittedStatusInfo","chkInProcessing","AdminEditCtrl","spacingButton","titleFont","contentFont","setManageProjectStore","setProjectData","setDocumentTopic","setParameterForSave","setUpdaterPage","manageProjectAction","folders","getCommentDirector","director","fullUsername_th","projectRoleInfo","isCommiteeHavePermission","chkExistCustomFolder","appFolderAndTab","customFolderOnly","lstCustomFolderID","haveFolderCustom","NaN","lstCustomFolder","isCustomFolder","selectedFolderID","loadCustomFolder","chkCustomFolderInfo","loadActionFolder","isProjectStatusComplete","actionFolderList","chkCustomFolder","loadFolder","folder","ignoreCustomFolder","linkFolder","actionFolder","mergeFolder","highlightFolder","lstFolder","selectFolder","loadCustomTab","returnVal","selectTab","loadTab","isNothaveCommitee","considerInfo","constConsiderType","exempt","isDisapprove","hideTabCommitteeComment","currentTabIndex","getFolderAndProject","isLoadProjectData","folderInfo","lstService","all","prjFolder","loadSequence","latestSubmittedID","resolve","isActionFolder","createProjectLoadTabAndFolder","loadTabAndFolder","isReloadProjectData","currentProjectID","currentSubmittedID","newProjectInfo","projectFolder","infoFolderAndProject","tabInfo","setTab","newTabId","isClose","reloadProjectData","reloadResponse","tabs","useCloseProjectOfficer","CloseProjectOfficerFormView","onClickSave","keepDirtyOnReinitialize","CloseProjectOfficerForm","closeProjectOfficerFormModel","useDisplayUpdater","approveStatusREC1","approveStatusREC2","projectAction","webService","getUpdater","saveUpdater","useProjectHook","isFlowEditAfterReview","hasPreviousFolder","previousSubmittedID","isSubmittedTypeNewProject","isSubmittedTypeEditAfterReview","isSynthesisApproveWithComment","approveWithComment","synthesisApproveStatusInfo","useRequestForm","formMode","projectSubmittedTypeID","onSaveComplete","projectHook","tabAndFolderHook","useFolderAndTab","selectedIrb","setSelectedIrb","projectIDRef","submittedIDRef","irbRef","parameterForSaveRef","submitValueRef","isDraftRef","researcherTypeRef","documentTopicRef","valuesForm","tabSelectedIndexRef","newTabSelectedRef","initialDataValue","setInitialDataValue","isApproveWithComment","handleChangeFaculty","getDocumentTopicLut","createInitialUploadFile","initialDataForm","isDr","titleName","otherTitleNameEN","otherTitleNameTH","otherAcademicPositionTH","otherAcademicPositionEN","getDocumentInfo","fileDataList","myFileData","subTopicLst","fileTokenInfo","fileExtension","pop","getParameterForSave","projectSubmitTypeID","requestPhase","numPhase","isTools","isPhase","researcherTypeID","researcherType","educationLevelID","educationLevel","isLanguage_th","langTH","isLanguage_en","langEN","isRequestCertificatePaper","isCertificatePaperList","handleSave","validateRequiredUploadFile","isRequirePDF","checkRequirePDF","checkSubtopic","handleClickConfirmSave","docTopic","mainTopic","handleSaveDraft","parameterEditAfterReview","pick","setNewUploadFile","handleAfterCloseCreateSuccess","filterTopicUpload","isDocTopic","submittType","isDisplay","fileInfo","sub","initFileItm","docItm","docFileInfo","replaceFileItm","lstReplaceFileGroup","latestFileList","replaceFile","replaceFileBy","callbackDirtyProcess","isDraftData","verifyDocument","handleDirtyChange","paramsDirty","onClickDeleteProject","onClickCancel","onChangeResearcherType","ResearcherType","useLookupClient","getYesNo","getRequest","getDocumentResult","getNeedDoc","getGroupsUser","useEthicsForm","callbackChangeFaculty","callbackChangeResearcherType","lookupClient","categoryProject","setCategoryProject","setResearcherType","titleNameList","setTitleNameList","academicPositionList","setAcademicPositionList","educationList","setEducationList","researcherTypeSelected","setResearcherTypeSelected","textRemaining","setTextRemaining","TH","EN","setIsPhase","setIsNeedEditForm","isShowAcademicPosition","setIsShowAcademicPosition","lookupFacultyResponse","getCategoryProject","getTitleName","getAcademicPosition","previousIsNeedEditForm","textRemainingTH","textRemainingEN","formatData","educationLevelLut","irbLut","isPhaseLut","isToolsLut","isCant","ethicsFormType","student","onChangeAcademicPosition","restart","onChangeTitleName","onChangeFaculty","onChangeIsPhase","onChangeIrb","onChangeCertificatePaper","onChangTextField","objText","onChangeNeedEditForm","EthicsFormView","headerLabel","hideAccordion","isDisableRIB","isDisablePhase","isDisableNumPhase","isShowNeedEditForm","isDisableNeedEditForm","isPhaseFormValue","isShowEducationLevel","canEditFaculty","fontDetail","line","EthicsForm","createFormModel","borderTop","useZip","generateZip","JSZip","JSZipUtils","folderName","binary","finally","interval","setInterval","generateAsync","saveAs","toLocaleString","clearInterval","isUseUploadfileEdit","handleConfirm","handleCancel","linkProps","zipDownload","isRequire","isEditting","setIsEditting","formStateRef","cancelRef","isResetFileUpload","setIsResetFileUpload","onClickParent","resultList","mappingResultNo","foundData","titleData","customName","onDownloadZip","CancelBtn","ConfirmBtn","UploadDocCtrl","useRemarkFromAdmin","RemarkFromAdmin","isShow","isStatus","isResubmitDate","resubmitDocDate","RemarkFromAdminCtrl","documentTestResultCtrlModel","useDocumentTestResult","useButtonSubmittedWithdraw","isShowButton","setStateIsShowButton","latestFolder","currentFolder","currentProjectStep","myselfNotWithdrawSubmitted","isPermissionUser","isLastFolder","prjSubmittedStatus","condition1","condition2","condition3","conditionDraft","draft","conditionShowButton","onClickWithdraw","cloneFolderList","customResult","ex","createFolderWithdrawSubmitted","ButtonSubmittedWithdrawView","ButtonSubmittedWithdraw","gridProps","model","PageActionView","onClickSaveDraft","isNotFirstSubmit","ButtonSign","ButtonClose","RequestFormView","btnClose","formValueRef","isNotCompleteDocument","isDisableDoc","isUploadEditMode","RequestFormCtrl","requestFormModel","gridBtn","useSynthesisReview","callbackSaveComplete","initialComment","setInitialComment","synthesisReviewInfoList","setSynthesisReviewInfo","isLoadedSynthesisReview","setIsLoadedSynthesisReview","synthesisReviewRemarkInfoList","setSynthesisReviewRemarkInfo","documentInfoList","setDocumentInfo","setInitialRichTextEditor","initialRichRemark","setInitialRichRemark","getSynthesisReviewData","getSynthesisData","createInitialData","createInitialComment","createInitialRichTextEditor","createInitialRichRemark","handleConfirmSave","isApproveWithCommentFlow","paramForSave","approveStatusName_th","approveStatusName_en","isCheckAll","isStamp","synthesisReviewInfo","synthesisReviewRemarkInfo","topicNo","commentInit","topicName_th","topicName_en","commentList","synthesisComment","childSelectedList","parentSelectedList","getInitialChildSelected","documentCertificate","commentRemarkList","synthesisRemark","remarkList","synthesisReviewRemark","documentItm","synthesisReviewCommentHtmlTag","synthesisReviewComment","synthesisReviewRemark_html","onSubmitForm","isNotHaveStampFileList","loginUserID","stampFileList","commentDirector","commentaryTopicId","comment","consideration","comment_htmltag","remark_htmltag","ResultOfConsiderView","isAdmin","isShowComment","approve","approveForContiueResearch","isShowCloseProjectButton","renderResearcherView","ResultConsider","useResultOfConsiderModel","useResultOfConsider","useMemomessageTerminate","setRequired","formRef","initialSuggestionNotice","setInitialSuggestionNotice","initialMemorandumFile","setInitialMemorandumFile","getApproveStatus","memoMessageDate","memoMessageCommentDate","approveStatusInfo","initialSugestionNotice","memoMessageComment_html","memoMessageComment","createInitialFileMemorandum","memoMessagePaperInfo","memorandumInfo","uploadFileMemoranduminit","fileListTH","signPathInfo","path_th","fileListEN","path_en","onClickBackToSearch","xmlHttp","XMLHttpRequest","onreadystatechange","readyState","DONE","send","MemoMessageView","isSignMemoMessage","isNotShowComment","memorandumFile","MemomessageCtrl","useMemomessageTerminateModel","useNoticeAdditional","NoticeAdditionalDocumentView","isIPadView","isRequestDocument","documentNumber","sendDocumentDate","getDisplaySendDocumentDate","documentRemark","NoticeAdditional","useNoticeAdditionalModel","useCertificateStampDoc","certificateData","setCertificateData","initialUploadFileCer","setInitialUploadFilecer","hideCertificate","useMemo","getCertificate","createInitialUploadFileCer","uploadFileCerinit","certificateInfo","certificateSignFileName_th","cerSign_th","certificateSignFileName_en","cerSign_en","cerTopicList","getCerTopic","onClickFileStamp","filePath","documentTopicList","CertificateStampDocView","uploadFileCerDoc","CertificateStampDoc","useCertificateStampDocumentModel","useCertificateStampDocument","useResultOfConsiderPrevious","acknowledgeAndDonotTakeAnyaAction","ResultConsiderPrevious","useResultOfConsiderPreviousModel","ResearcherView","projectMode","renderPage","Researcher","setInitialData","createInitialFormData","editInitialFormData","isRequestCertificatePager","academicPositionInfo","facultyInfo","educationLevelInfo","titleNameInfo","isLanguageTH","isLanguageEN","remarkFromAdmin","verifyDocumentRemark","useResearcher","useEditSynthesis","setIsEditSynthesisSuccess","editingInitial","useAccordionMode","currentStep","tabStep","isViceChairman","isSecretary","checkStep","conditionUseAccordion","updateApproveStatus","fieldNames","currentFormValues","projectIRB","reviewerID","progress_6_months","progress_12_months","generateApproveStatusParams","defineValueFromInit","currentFieldValue","fieldInitialValue","resetField","callback","synthesisList","contentValue","contenText","confirmField","updateCommentary","edittingVal","synthesisInfo","generateCommentaryParams","useResultConsideration","onChangStatus","isCommitee","editSynthesis","ModeAccordion","renderViewComponent","renderEditComponent","onConfirm","onCancel","additionIcon","handleEdit","isAddOtherLanguage","isDirty","onSubmitCancel","ResultConsiderationView","renderChild","disabledVal","ResultConsideration","resultConsiderationModel","useSynthesis","PageType","isOneComment","isExempt","setIsExempt","setReviewer","commentTitleList","setCommentTitleList","initialSynthesis","setInitialSynthesis","setSynthesisProject","setCommentList","setRemarkList","setIsRequired","isEditSynthsisSuccess","textRemainingRemark","setTextRemainingRemark","defaultRemarkRef","dataSourceForCopyToClipboard","setDataSourceForCopyToClipboard","dataSourceForExport","setDataSourceForExport","getReviewer","getCommentaryTopicLut","getAllCommentaryForExport","createInitialSynthesis","dataForCopyToClipboard","fullNameTH","fullReviewer_th","fullNameEN","fullReviewer_en","updateByNameTH","updatedByNameTH","updateByNameEN","updatedByNameEN","approveStatusNameTH","approveStatusNameEN","commentaryInfo","topicName_th_irb1","topicName_th_irb2","topicName_en_irb1","topicName_en_irb2","setInitialSynthesisInfo","setInitialRemarkSynthesisInfo","conditionRemark","synthesisRemarkInfo","textRemainingRemarkInitial","reviewerName_th","reviewerUserID","setInitialSubComment","synthesisInit","strTheRest","defaultTextSynthesisList","defaultHTMLSynthesisList","objComment","committeeCommentTopicInfo","fullName_th","fullName_en","saveCommentDate","countTextComment","textRemain","committeeRemarkInfo","isFolder","allCommentList","nameTopicTH1","nameTopicEN1","nameTopicTH2","nameTopicEN2","fullUsername_en","historyCommentary","reviewerList","isDisplayCopyToClipboard","checkIsDisplayCopyToClipboard","editInitialSynthesis","newFormValue","initValue","onChangRemark","CopyToClipboardView","pageType","tableRef","copySuccess","setCopySuccess","nameLabel","saveCommentDateLabel","commentInsteadBy","ReviewerCommentPage","SynthesisPage","spaceLine","commentItm","indexComment","queryCommandSupported","range","createRange","selectNodeContents","sel","removeAllRanges","addRange","execCommand","CopyToClipboard","DisplayUpdaterView","dateUtil","DisplayUpdater","ButtonExport","btnExport","ExportToMSWord","isSynthesis","ReactHtmlParser","commentHTML","replaceAllHtml","innerHTML","asBlob","SynthesisREC1View","isDisableReviewer","isRequiredSynthesize","showAsterisk","getDisplayCommitteeSaveDate","renderComment","isDisabled","renderCommitteeComment","renderFieldArray","btnGroup","SynthesisREC1","useSyntheticModel","SynthesisREC2View","SynthesisREC2","useNumberOfDoc","callbackFunc","changeToNull","onChangRequireDoc","getDisable","fieldName","disabledFieldNames","isDisable","getRequire","requiredFieldNames","NumberOfDocView","NumberOfDoc","numberOfDocModel","useAdditionDocument","disabledField","setDisabledField","requiredField","setRequiredField","paramsRef","isDefaultRequest","requireDoc","getInitialRequireDoc","initRequireDoc","isRequestDoc","funcCallBack","isRequest","onDirtyChange","AdditionalDocumentREC1View","isRequireDoc","isDocumentNumber","isSendDocumentDate","renderSnackbar","AdditionalDocumentREC1","useAdditionDocumentModel","AdditionalDocumentREC2View","AdditionalDocumentREC2","ResearchDetailView","ResearchDetailCtrl","researchDetailModel","checkHistoryDisplay","historyStore","displayVerifyDocHistory","displayConsiderTypeHistory","useHistoryAction","setHistoryStore","updateDisplayHistory","historyVerifyDoc","historyConsiderType","onChangeDocCompletely","onSubmitEdit","onClickModeEdit","selectedCompletely","setSelectedCompletely","historyStoreAction","useHistoryStore","documentLut","displayHistory","onChangeRadio","navigateToResultHistory","paramData","encryptedProjectData","documentVerifyHistory","DocumentTestResultView","DocumentTestResultCtrl","useVerifyDocumentProjectDetail","createInitialProjectDetail","lutIrb","updateProjectDetailFormatting","rawData","researcherUserID","submitStatusID","useVerifyDocument","isCompletely","setIsCompletely","reviewerLutRef","formHistoryRef","defaultCompletely","projectDetail","isCompletelyDoc","getSaveServiceParameter","sendEditData","Utils","paramDoc","processSaveData","selectedInfo","saveDataUploadDoc","changeTabOpt","isEditAfterReviewCloseProject","handleEditDocResult","handleEditDocReviewer","getEditDocParams","verifyProjectServiceParam","checkUseUploadEdit","isUseUploadEdit","projectDetailLabel","confirmEditDocResult","confirmEditDocReviewer","formatParam","confirmEditEthics","formattingParam","confirmEditUploadDoc","ethicsFormResetList","VerifyDocumentView","isNotDisableTestResult","canOfficerEdit","isDisabledTestResult","canOfficerSaveDraft","VerifyDocument","verifyDocumentModel","useDesignateReviewer","DesignateReviewerView","reqField","DesignateReviewer","designateReviewerModel","useDefineType","onChang","disabledDefineType","webServiceHook","processUpdate","createParamOfficerUpdate","formVals","considerTypeID","reviewerRemark","onChangeAccordion","panel","newExpanded","onChangProjectType","onChangeIsNotAboutPeople","handleSubmitOfficerEdit","navigateToLogs","considerTypeHistory","DefineTypeView","isShowFieldNotAboutPeople","renderHistoryIcon","DefineType","defineTypeModel","useDefineDirector","irbType","setDirector","setRole","setIsError","reqFieldForm","setReqFieldForm","directorRef","listTopicCommittee","folderAndTabHook","getDirector","getRole","conditionRequiredField","conditionReqFieldDirector","conditionReqFieldRole","conditionIRB2","createParamCommitteeUpdate","formValue","projectRoleID","listCommittee","accumulator","onClickRemove","newField","remove","filterCommittee","idex","validateField","lengthFields","onChangValDirector","isDuplicateIdx","onChangValRole","useModeAccordion","handleCancle","DefineDirectorView","renderBtnRemove","btn","disabledValue","DefineDirector","defineDirectorModel","committeeProjectRole","useDefineProject","isEditDirector","isReviewer","constCommitteeProjectRole","principalReviewer","DefineProjectView","isShowReviewer","isFlowNewProject","isDisableRole","DefineTypeForm","useDefineTypeModel","useDefineTypeForm","useGenerateCertificate","initialUploadCerDoc","setInitialUploadCerDoc","setInitialUploadFileCer","initialValuesOtherLanguage","setInitialValuesOtherLanguage","setdisabledFieldNames","documentTopicData","setDocumentTopicData","isUpdateSuccess","setIsUpdateSuccess","setIsAddOtherLanguage","valueRef","initail","docTopicData","getCarDoc","initialDataOtherLanguage","filterDocCertificate","docCertificateTH","docCertificateEN","objDocCer","dateReqCertificate","exportDate","dateCertificateExpire","certificateId","docsCertified_en","conditionEN","condition_en","detailEN","description_en","docsCertified_th","conditionTH","condition_th","detailTH","description_th","createInitialUploadFileCerDoc","reloadCertificate","lutTop","filterDocTopic","constResearcherType","uploadFileinitCerDoc","cerInfo","cer_th","certificateFileName_th","cer_en","certificateFileName_en","isReloadCertificate","handleClickOpenFile","isNull","isLanguageTh","isLanguageEn","certificateTopicList","myCerTopic","formatDocumentTopic","initialKeys","omitKeys","saveType","certificateServiceParam","onDateReqCertificateChange","certificateExpireDate","handleBackToSearch","handleSubmitUpdateData","certificateDataServiceTH","researcherNameTH","descriptionTH","certificateDataServiceEN","researcherNameEN","descriptionEN","certificateFieldNamesTH","certificateFieldNamesEN","handleCancelAddOtherLangauge","handleClickOtherLangauge","useCertificate","CertificateView","Certificate","certificateModel","useHeadCertificate","AddBtn","GenerateCertificateREC1View","currentSelectFolder","GenerateCertificateREC1","generateCertificate","GenerateCertificateREC2View","GenerateCertificateREC2","useSpecifyDateForm","minMaxDate","setMinMaxDate","displayField","setDisplayField","commentaryDateRef","advisorDateRef","isSubmittedReceiveDate","isDisplayField","docDate","commentaryDate","createInitialDataREC1","createInitialDataREC2","addDay","isCurrentDate","defaultAnnounceDate","receiveDocumentDate","sendCommentCommitteeDate","advisorDueDate","sendAdvisorDueDate","max","handleConfirmSubmitOnlyReceiveDate","conditionRequireAll","conditionMinDate","onDirtyChang","onChangDocDateREC1","formValAnnounceDate","onChangAnnounceDateREC1","subtractDay","newDocDate","formValDocDate","onChangDocDateREC2","onChangAnnounceDateREC2","onChangCommentDateREC1","onChangCommentDateREC2","handleChangAdvisorDateREC1","handleChangAdvisorDateREC2","validateForm","haveToFillAll","resetDateExceptDocDate","DefineSubmittedDateREC1View","disabledOtherDate","DefineSubmittedDateREC1","useDefineSubmittedDateModel","useDefineSubmittedDate","DefineSubmittedDateREC2View","DefineSubmittedDateREC2","useCommentDirector","callbackFunction","CommentDirectorView","initialcomment","renderTopic","num","CommentDirector","commentDirectorModel","useCommentaryAction","setCommentaryStore","setSelectedCommittedID","selectedCommitteID","useReviewerComment","isShowSubComment","setIsShowSubComment","setCommentaryProject","isCommitteeInfo","isDirectorEmptyRef","isLanguageRef","isDeadlineRef","dataForShowUpdateDate","setDataForShowUpdateDate","commentaryAction","showSaveDraft","checkIsDeadLine","getAllCommentary","topicIsExemption","setInitDirector","showUpdater","isDeadline","projectRoleName_th","projectRoleName_en","findRole","conditionGetCommentary","createTopicUpload","commentaryRemark","isDisableFrm","formatTopic","directorID","isDeadlineOfGeneralCommittee","generalCommitteeIdx","isGerneralCommittee","onChangeDirector","chang","ReviewerCommentREC1View","isAllChecklistChildSuccess","isAllChecklistSuccess","resultParent","objTrue","ReviewerCommentREC1","useReviewerCommentModel","ReviewerCommentREC2View","ReviewerCommentREC2","useMemoMessage","editRef","isCheckedOther","setIsCheckedOther","initialMemoMessagePaper","setInitialMemoMessagePaper","memoMessagePaper_th_html","memoMessagePaper_th","memoMessagePaper_en_html","memoMessagePaper_en","unSignPathInfo","suggestionNotice","comment_html","memoMessagePaper_TH","memoMessagePaper_EN","onClickCheckbox","handleSubmitUpdateMemo","memoMessagePaperTH","memoMessagePaperEN","memoMessagePaperTHHTML","memoMessagePaperENHTML","valueMessageTH","valueMessageEN","isEdit","MemoMessageCtrl","memoMessageModel","initialCommentRichTextEditor","setInitialCommentRichTextEditor","isEditStampFile","contextHtml","documentSelected","clickEditStampFile","cancelEditStampFile","saveEditStampFile","onClickFile","selectedListWithLang","setSelectedListWithLang","formChange","initFileLang","dataItm","setSelectedFileWithLang","fileIDSelectedLst","newLangValue","filterdDataOnlyPdf","childDataList","newSelectedListWithLang","handleChangeLang","fileItm","formatedValue","renderFileList","isCheckedTH","isCheckedEN","checkedRadioFn","handleClickFile","labelPlacement","SynthesisReviewREC1View","isHideDocumentCertificate","isSynthesisApprove","isDisplayTreeCheckboxSection","renderOfficerView","SynthesisReviewREC1","useSyntheticReviewModel","useSyntheticReview","SynthesisReviewREC2View","SynthesisReviewREC2","useSecretCodeForm","SecretCodeFormView","SecretCodeForm","secretCodeFormModel","useSignREC1","isNotShowSign","setIsNotShowSign","initialUploadFileCerSign","setInitialUploadFileCerSign","uploadFileinitCer","chkBtnSing","objUploadEn","objUploadTH","initialFileValue","createInitialFile","handleSubmitSecretCode","isSignBeHalfPresident","isSignBeHalfSecretary","signCertificateRequest","signUserID","isSignBehalfPresident","isSignBehalfSecretary","signUserPinCode","SignREC1View","isSigning","signFile","SignREC1","signREC1","SignREC2View","SignREC2","useSignRepresent","chairmanSign","secretarySign","conditionDialog","setDefaultPage","signBehalfCertificateRequest","SignRepresentREC1View","isFirstTime","SignRepresentREC1","signRepresent","SignRepresentREC2View","SignRepresentREC2","GroupsSign","isVicePresidentSigned","groupsUserLut","setGroupsUserLut","resultRef","setGroupsUserLutFunc","userGroupSign","vicePresidentSignInfo","signVicePresident","signVicePresidentForPresident","signVicePresidentForSecretary","userGroupsSign","optionGroupUserSign","secreatary","isSignPresident","isSignSecretary","initialMemorandumFileSign","setInitialMemorandumFileSign","createInitialFileData","memorandumFileSign","signREC2","useSign","OfficerView","renderSignRepresentElement","REC","isVicePresident","tabID","RequestNewProjectView","onCallbackSaveComplete","isChairmanVerifyDoc","isChkStepEditDirector","checkConditionBtnClose","RequestNewProject","requestNewProject","isFirstRender","appFolderAndTabInfo","handleCallbackSaveComplete","handleAfterClose","reloadProcess","isSelectedCustomFolder","handleSaveCloseProject","onClickCloseProject","CloseProjectOfficer","useRequestNewProject","useOfficerModel","useOfficer","requestNewProjectEditAfterReview","useRequestNewProjectEditAfterReview","ProjectPhaseView","ProjectPhase","useProjectPhase","createInitialMemorandumFile","terminateCauseList","setTerminateCause","getLutTerminateProjectCause","renderSign","renderSignRepresent","ProjectAmendmentView","ProjectAmendment","useProjectAmendment","useCloseProjectResearcher","loadDocumentTopic","lstDocumentTopic","documentTopicInfo","loadLatestFolder","resProject","CloseProjectResearcherView","CloseProjectResearcher","useCloseProjectFormModel","getMemoMessage","createInitialSuggestion","isApprove","setConsideration","getConsideration","getSynthesis","conditionRenderSynthesisView","updateAfterSubmitted","SynthesisView","reValidateMode","Synthesis","initialVal","SynthesisReviewView","rowsMax","SynthesisReview","useCloseProject","projectModeEdit","resultSynthesisReview","createInitialSuggestionModeEdit","createInitialPaper","ReportedCloseProjectView","ReportedCloseProject","reportedNonconformance","useReportedCloseProject","CloseProjectView","isBtnClose","CloseProject","closeProjectModel","ProjectPhaseEditAfterReviewView","ProjectPhaseEditAfterReview","useProjectPhaseEditAfterReviewModel","useProjectPhaseEditAfterReview","useTerminateProject","initialCommentCommitee","setInitialCommentCommitee","causeInfo","terminateCauseOther","causeRemark","initialCommentCommittee","ResultOfConsiderPreviousView","ResultOfConsiderPrevious","listTerminateCauseID","commentCommittee","lstTerminateCauseID","RequestProjectRenewalView","RequestProjectRenewal","requestProjectRenewalModel","approveStatusServiceResult","setApproveStatusServiceResult","selectItem","fieldMemoMessagePaperTH","fieldMemoMessagePaperEN","Constant","useProjectManager","matchPath","dialogRequestConsiderDocRef","firstRender","appFolderAndTabStoreRef","loadCustomFolderData","latestFolderIdx","updFolderAndTab","projectResult","submittedTypeInfo","getCustomFolderSubmitTypeInfo","customProjectRes","changeFolderProcess","manageClickActionFolder","onClickRequestConsider","getMode","onClickFolder","useSubmitDocConsider","bindRef","lstOption","setLSTOption","callLookupService","loadLookupRequestConsiderDoc","formatLookup","fn","close","createFolderCloseProject","createFolderProjectAmendment","createFolderNextPhaseProject","createFolderReportedAdverseEventsProject","createFolderProjectRenewal","createFolderTerminateProject","createFolderAdverseEvents","createFolderTerminateProjectByAdmin","createFolderCloseProjectByAdmin","createFolderWithdrawProject","SentDocOtherView","RequestConsiderDocView","RequestConsiderDoc","sentDocConsider","useRequestConsiderDoc","useReportedNonconformance","useReportedAnonconformance","paramSave","ReportedAnonconformanceView","ReportedAnonconformance","reportedAnonconformance","ReportedNonconformanceView","ReportedNonconformance","CloseProjectEditAfterReviewView","CloseProjectEditAfterReview","useCloseProjectEditAfterReview","TerminateProjectEditAfterReviewView","TerminateProjectEditAfterReview","terminateProjectEditAfterReviewModel","useTerminateProjectEditAfterReview","useTerminateProjectByAdmin","TerminateProjectByAdminView","TerminateProjectByAdmin","terminateProjectByAdminModel","useProjectRenewal","approveForContiueResearchWhenEdited","isDisableTestResult","isDisableTestRes","useRequestProjectRenewal","RequestProjectRenewalEditAfterReviewView","RequestProjectRenewalEditAfterReview","requestProjectRenewalEditAfterReviewModel","useRequestProjectRenewalEditAfterReview","useCloseProjectByAdmin","CloseProjectByAdminView","CloseProjectByAdmin","closeProjectByAdminModel","useMemomessage","Memomessage","memomessageModel","useProjectWithdraw","projectPageData","setProjectPageData","loadProjectPageData","initialProcessUpdate","initialProcessCreate","initVal","withdrawCause","getDocumentInfoForSave","onConfirmSave","uploadDocumentTopic","isHideUploadSection","isHide","conditionHideUploadSection","skipCheckRequiredUploadFile","countUploadFile","ProjectWithdrawView","ProjectWithdraw","projectWithdrawModel","researcherModel","useVerifyDocProjectWithdraw","DateUtils","verifyDocRemark","isVerifyDocumentCompleted","resubmittedDate","saveParam","VerifyDocProjectWithdrawView","VerifyDocumentProjectWithdraw","useVerifyDocumentProjectWithdraw","useConfirmProjectWithdraw","isDelete","onConfirmWithdraw","ConfirmProjectWithdrawView","ConfirmProjectWithdraw","officerModel","useProjectWithdrawal","ProjectWithdrawalView","ProjectWithdrawal","projectWithdrawal","useSubmittedWithdraw","SubmittedWithdrawView","SubmittedWithdraw","useVerifyDocumentSubmittedWithdraw","VerifySubmittedWithdrawView","useConfirmSubmittedWithdraw","ConfirmSubmittedWithdrawView","useSubmittedWithdrawal","ProjectManagerView","renderFlow","ProjectManager","projectManager","webFunction","useManageExternalProject","getData","pageNo","postNewProject","editProject","SearchFormExternalProject","keywordSearchRef","currentPageNoRef","allData","btnPopover","common","white","titleInCard","certificateDateTitle","certificateDateTitleMobile","certificateDate","coa","boxMobile","ItemExternalProject","dataItem","getList","handleDelete","handleClickEdit","manageExternalProjectFormEdit","projectNameTh","projectNameEn","TitleResult","ResultExternalProject","manageExternalProjectFormAdd","ExternalProject","allDataRef","divSearch","scrollY","cloneAllData","idxData","findIndex","getVerifyHistory","submittedTypeId","CustomHeader","CardHeader","CustomUnderlineGrid","DocumentVerifyHistory","verifiedInfo","setVerifiedInfo","setProjectInfo","firstRow","projectTypeTH","projectTypeEN","formatVerifiedData","historyList","verifiedData","docStatus","verify_doc_name_th","verify_doc_name_en","history_updated_date","verify_doc_remark","history_id","statusColor","verify_doc_color","rowNo","row_no","getDocumentVerifyHistory","Card","CardContent","useResearcherType","getResearcher","inbox","fullInput","btnSave","heigth","containerForm","boxBtn","infoIcon","FormAddExternalProject","certificateIDRef","defaultDate","prefixName","positionName","manageExternalProject","formattingInitialData","allValue","allValuseEdit","isShowOtherAcademicLevel","academicLevel","isShowOtherPrefix","prefixID","otherAcademicLevelTh","otherAcademicLevelEn","titleNameOtherTh","titleNameOtherEn","handleToManageExternalPage","AddExternalProject","PendingHistory","historyInfo","setHistoryInfo","statusName","status_name_th","updated_date","status_name_en","status_id","getPendingHistory","ConsiderTypeHistory","renderLanguages","thKey","enKey","renderDate","formatDate","modifiedInfo","considerColor","historyID","useExpertiseStyles","useExpertises","getLUT","searchLUT","getExpertiseByID","expertiseID","deleteExpertiseByID","updateExpertiseLUT","addExpertiseLUT","SearchExpertisesResults","searchResult","dialogDeleteRef","inUsedRef","idRef","expertiseHook","expertisesAdd","expertisesEdit","openConfirmDelete","expertiseNameTH","expertiseNameEN","CustomBtn","SearchExpertises","ManageExpertises","setSearchResult","expertisesHook","handleSearch","ExpertiseForm","saveRef","addSuccessIdRef","duplicateRef","duplicateMsg","setDuplicateMsg","dirtyRef","manageExpertises","bindSaveRef","bindSuccessRef","bindDuplicateRef","bindDirtyRef","afterCloseSuccess","hasValidationErrors","checkDirty","SearchCommittees","lutHook","initFaculty","setInitFaculty","initExpertise","setInitExpertise","getLut","expertise","initLut","useCommitteeStyles","useCommittees","getCommitteeByID","getExpertiseInfo","updateCommitteeExperise","isInProgress","isFinish","getExpertInfo","ExpertInfo","expertInfoRef","committeeHook","expertInfoList","setExpertInfoList","expertInfo","openExpertInfo","ProjectInfo","success","projectInfoRef","projectInfoList","setProjectInfoList","currentStartDate","currentEndDate","openProjectInfo","GreyCard","PinkCard","DashText","SearchCommitteesResults","committeeEdit","cntExpertise","inprogress","noComment","ManageCommittees","initialFormValues","committeesHook","SearchCommitteesResult","CommitteeForm","initialEditAble","setInitialEditAble","expertList","updatedUserId","disabledAdd","setDisabledAdd","setCommitteeInfo","idKey","isEN","initialEditableForm","facultyVal","expertVal","returnRes","expertData","responseInfo","bindCancelRef","confirmCancel","manageCommittees","handleChangeDisabledAdd","renderExpertiseObj","exData","expertiseState","handleAddExpertise","handleRemoveExpertise","keyIndex","handleBack","updatedUserID","handleConfirmSubmit","CommitteeEdit","titleContainer","ManageCheckList","commentatyTopic","setCommentaryTopic","commentatyLutTopic","allTopic","encryptedtopicID","addEditCheckList","handleClickToEditForm","btnAddData","inputText","CheckListMainTopicComponent","editCheckList","topicChecklistID","addChecklistID","editMode","handleEditCheckList","setEditCheckList","handleDeleteCheckList","setAddNewSubCheckList","setAddChecklistID","pushForm","CheckOutlined","nameCheckListTH","nameCheckListEN","CloseOutlined","cloneDeep","DeleteOutlineOutlined","btnOrder","subPaper","CheckListSubTopic","addNewSubCheckList","parentFields","dropProvided","editCheckListID","handleAddSubCheckList","setEditSubCheckList","setEditCheckListID","isAdd","nameChildren","indexChildren","sdragProvided","CheckListMainTopic","newID","getItemStyle","editSubCheckList","setEditMode","newCheckList","handleConfirmAddSubCheckList","handleConfirmDelete","handleConfirmEdit","dropSnapshot","idDiv","checklistByID","checkListByID","parentIndexString","parentIndex","newC","reloadData","ChecklistTopicForm","addChecklist","newCheckListTH","newCheckListEN","subChecklistTopic","subData","nameCheckList","handleClickAddCheckList","AddEditCheckList","SearchResearcher","useResearcherHook","searchResearcher","rowPerPage","deleteResearcherByID","CustomPaper","HeaderTypo","SearchResearcherResult","submitSearch","dialogSuccessRef","deleteUserRef","researcherHook","ManageResearcher","elRef","resetPage","lazy","imgPDF","UserHistoryUpload","b","valueOf","menuName","menuLabelKey","activate","activateForgotPassword","subRoute","landing","constWebFunction","dashboard","allowAccessGroupID","hold","expired","Closed","ManageProjectManager","manageResearcher","manageExternalResearcher","externalResearcher","approveExResearcher","manageUser","userGroupEdit","UsergroupEdit","userGroupAdd","userGroupHistoryUpload","manageFaculty","settingFacultyAdd","settingFacultyEdit","manageREC","settingRECAdd","settingRECEdit","manageProjectSubmittedType","settingDocument","settingDocumentEdit","manageEditResultOfConsideration","settingConsiderationEdit","manageCheckList","manageCertificateAndStamp","settingCertificate","RichTextBox","testExport","AllExport","PreferenceProfile"],"mappings":"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","file":"static/js/main.509501fd.chunk.js","sourcesContent":["import { atom, useRecoilValue } from 'recoil'\r\nimport { responseLookupServiceTypes } from '../../services/lookup/types'\r\nimport * as RESServiceType from '../../services/web/types/responseWebServiceTypes'\r\nexport type ManageProjectStoreType = {\r\n projectData: RESServiceType.GetProjectResultType | null | undefined\r\n documentTopic: responseLookupServiceTypes.ResultDocumentTopicLut[] | null\r\n parameterForSave: any\r\n\r\n currentPageUpdater?: {\r\n name_th: string\r\n name_en: string\r\n date: string //\"YYYY-MM-DDTHH:mm:ss\"\r\n } | null\r\n}\r\nexport const manageProjectStore = atom({\r\n key: 'manageProjectStore',\r\n default: {\r\n projectData: null,\r\n documentTopic: null,\r\n parameterForSave: null,\r\n currentPageUpdater: null, //คนที่อัปเดตล่าสุดในแต่ละ Tab ที่เปิดอยู่\r\n },\r\n})\r\n\r\nconst useManageProjectStore = () => {\r\n const appAlertMessageState = useRecoilValue(manageProjectStore)\r\n return {\r\n ...appAlertMessageState,\r\n }\r\n}\r\n\r\nexport default useManageProjectStore\r\n","import { useField } from 'react-final-form'\r\nimport useTranslate from '../../i18n/useTranslate'\r\nimport { composeValidators, selectRequired } from '../../utilities/validate'\r\nimport { UseRadioProps } from './radioType'\r\n\r\nexport type FieldRequired = boolean | { showAsterisk?: boolean; triggedValidate?: boolean; errorMessage?: string }\r\n\r\nfunction useRadio(props: UseRadioProps) {\r\n const { name, required, validates = [] } = props\r\n const translate = useTranslate()\r\n let mergeValidate = validates\r\n if ((typeof required === 'boolean' && required) || (typeof required === 'object' && required.triggedValidate)) {\r\n mergeValidate = [\r\n selectRequired(typeof required === 'object' ? required.errorMessage : `${translate.get('MESSAGE.M016')}`),\r\n ...mergeValidate,\r\n ]\r\n }\r\n /* Validate */\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate),\r\n })\r\n\r\n return { field }\r\n}\r\n\r\nexport default useRadio\r\n","import React, { Fragment } from 'react'\r\nimport Radio, { RadioProps } from '@material-ui/core/Radio'\r\nimport RadioGroup from '@material-ui/core/RadioGroup'\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel'\r\nimport FormControl from '@material-ui/core/FormControl'\r\nimport { FormHelperText, withStyles, Typography } from '@material-ui/core'\r\nimport { MyRadioViewProps, RadioCtrlProps } from './radioType'\r\nimport useRadio from './useRadio'\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles'\r\nimport Tooltip from '../tooltip/tooltip'\r\nimport InfoIcon from '@material-ui/icons/Info'\r\nimport IconButton from '@material-ui/core/IconButton'\r\n\r\n// const theme = createMuiTheme({\r\n// palette: {\r\n// primary: {\r\n// main: '#ff7f50',\r\n// },\r\n// },\r\n// typography: {\r\n// fontFamily: 'Prompt, sans-serif',\r\n// },\r\n// overrides: {\r\n// MuiFormLabel: {\r\n// root: {\r\n// fontSize: '18px',\r\n// color: '#bfbfbf',\r\n// '&$focused': {\r\n// color: '#ff7f50',\r\n// },\r\n// '&$error': {\r\n// color: ' #ff4d4f',\r\n// },\r\n// '&$disabled': {\r\n// color: '#e0e0e0',\r\n// },\r\n// },\r\n// },\r\n// },\r\n// })\r\n\r\nconst ErrorRadio = withStyles({\r\n root: {\r\n color: '#d50000',\r\n '&$checked': {\r\n color: '#d50000',\r\n },\r\n },\r\n checked: {},\r\n})((props: RadioProps) => )\r\n\r\nlet MyRadioView: React.FC = ({\r\n labelGroup,\r\n options = [],\r\n field,\r\n required,\r\n requiredHalfWidth,\r\n disabled,\r\n onChangeValue,\r\n tooltipLabel,\r\n tooltipPlacement = 'bottom',\r\n}) => {\r\n const { input, meta } = field\r\n const isError = meta.error && meta.invalid && meta.touched ? true : false\r\n const classes = useStyles(isError)\r\n const theme = useTheme()\r\n const getLabel = () => {\r\n return (\r\n \r\n {labelGroup || ''} {required && }\r\n {tooltipLabel && tooltipLabel !== '' && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {/* {labelGroup} */}\r\n {/* \r\n {required && labelGroup ? labelGroup + '*' : labelGroup || ''}\r\n */}\r\n {getLabel()}\r\n {\r\n input.onChange(evt.target.value)\r\n if (onChangeValue) {\r\n onChangeValue(evt.target.value)\r\n }\r\n }}\r\n >\r\n {options.map((option, index) => (\r\n \r\n {/* */}\r\n {option.name} }\r\n value={option.id}\r\n control={\r\n meta.error && meta.touched ? : \r\n }\r\n disabled={disabled || option.disableOption}\r\n style={option.style && { ...option.style }}\r\n />\r\n\r\n {option.icon && (\r\n {\r\n if (option.onClickIcon) {\r\n option.onClickIcon(option.id)\r\n }\r\n }}\r\n style={{ padding: '0px' }}\r\n // disabled={option.disableIcon}\r\n >\r\n {option.icon}\r\n \r\n )}\r\n {/* */}\r\n \r\n ))}\r\n \r\n {meta.error && meta.touched && meta.error}\r\n \r\n )\r\n}\r\n\r\nlet MyRadio: React.FC = ({ name, ...others }) => {\r\n const myRadio = useRadio({\r\n name,\r\n ...others,\r\n })\r\n return \r\n}\r\n\r\nexport default MyRadio\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n label: {\r\n marginBottom: 5,\r\n color: (isError: any) => {\r\n if (isError) {\r\n return '#ff4d4f'\r\n } else {\r\n return ''\r\n }\r\n },\r\n },\r\n errorText: {\r\n fontSize: '12px',\r\n color: '#ff4d4f',\r\n },\r\n}))\r\n","enum submittedType {\r\n firstSubmitConsideration = 1, //ส่งพิจารณาครั้งแรก\r\n nextPhaseProject = 2, //โครงการระยะถัดไป\r\n renewalProject = 3, //ขอต่ออายุโครงการ\r\n amendmentProject = 4, //ขอแก้ไขโครงการ\r\n adverseEvent = 5, //รายงานเหตุการณ์ที่ไม่พึงประสงค์\r\n nonconformance = 6, //รายงานที่ไม่เป็นไปตามข้อกำหนด\r\n closeProject = 7, //ขอปิดโครงการ\r\n terminateProject = 8, //ขอยุติโครงการ\r\n editAfterReview = 9, //แก้ไขหลังพิจารณา\r\n editAfterReview_nextPhaseProject = 10, //แก้ไขหลังพิจารณา (โครงการระยะถัดไป)\r\n exitAfterReview_AmendmentProject = 11, //แก้ไขหลังพิจารณา (ขอแก้ไขโครงการ)\r\n withdrawalProject = 12, //ถอนโครงการ (การถอนทั้งโครงการ )\r\n withdrawalSubmitted = 13, //ถอนโครงการ (การถอนเฉพาะการยื่นครั้งนั้น )\r\n // editAfterReview_CloseProject = 14, //แก้ไขหลังพิจารณา (ขอปิดโครงการ)\r\n editAfterReview_closeProject = 14, //แก้ไขหลังพิจารณา (ขอปิดโครงการ)\r\n editAfterReview_terminateProject = 15, //แก้ไขหลังพิจารณา (ขอยุติโครงการ)\r\n firstSubmitConsideration_notScope = 16, //ส่งพิจารณาครั้งแรก (ไม่เข้าข่าย)\r\n closeProjectByAdmin = 17, //ขอปิดโครงการ (โดยเจ้าหน้าที่)\r\n terminateProjectByAdmin = 18, //ขอยุติโครงการ (โดยเจ้าหน้าที่)\r\n editAfterReview_renewalProject = 19, //แก้ไขหลังพิจารณา (ต่ออายุ)\r\n}\r\nexport default submittedType\r\n","import { atom, useRecoilValue } from 'recoil'\r\nimport { NotificationInfoResult } from '../../services/web/types/responseWebServiceTypes'\r\nexport type NotificationStoreType = {\r\n notificationInfo: NotificationInfoResult[] | null\r\n}\r\nexport const notificationStore = atom({\r\n key: 'notificationStore',\r\n default: {\r\n notificationInfo: null,\r\n },\r\n})\r\n\r\nconst useNotificationStore = () => {\r\n const notificationState = useRecoilValue(notificationStore)\r\n return {\r\n ...notificationState,\r\n }\r\n}\r\n\r\nexport default useNotificationStore\r\n","import { useSetRecoilState } from 'recoil'\r\nimport { NotificationInfoResult } from '../../services/web/types/responseWebServiceTypes'\r\n\r\nimport { notificationStore } from './appNotificationStore'\r\n\r\n// type AlertMessageParamType = {\r\n// title?: string\r\n// message: string\r\n// }\r\nconst useNotificationAction = () => {\r\n const setNotificationStore = useSetRecoilState(notificationStore)\r\n\r\n const setNotificationInfo = (notificationInfo: NotificationInfoResult[]) => {\r\n setNotificationStore((prevState) => ({\r\n ...prevState,\r\n notificationInfo: notificationInfo,\r\n }))\r\n }\r\n\r\n // const closeAlertMessage = () => {\r\n // setAppAlertMessageStore((prevState) => ({\r\n // ...prevState,\r\n // isOpen: false,\r\n // title: '',\r\n // message: '',\r\n // }))\r\n // }\r\n\r\n return {\r\n setNotificationInfo,\r\n }\r\n}\r\n\r\nexport default useNotificationAction\r\n","import { useSetRecoilState } from 'recoil'\r\n\r\nimport { manageMenuStore, ManageMenuStoreType } from './useManageMenuStore'\r\n\r\nconst useManageMenuAction = () => {\r\n const setManageMenuStore = useSetRecoilState(manageMenuStore)\r\n\r\n const setState = (newState: Partial) => {\r\n setManageMenuStore((prevState) => ({\r\n ...prevState,\r\n ...newState,\r\n }))\r\n }\r\n\r\n const setIsOpen = (param?: boolean) => {\r\n setManageMenuStore((prevState) => ({\r\n ...prevState,\r\n isOpen: param,\r\n }))\r\n }\r\n\r\n const clearStore = () => {\r\n setManageMenuStore((prevState) => ({\r\n ...prevState,\r\n isOpen: null,\r\n }))\r\n }\r\n return { setState, setIsOpen, clearStore }\r\n}\r\n\r\nexport default useManageMenuAction\r\n","import React from 'react'\r\nimport { UseLayoutProps } from './layoutType'\r\nimport useWebService from '../../../services/web/useWebService'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport useAppNotificationAction from '../../../stores/notification/appNotificationAction'\r\nimport useRouter from '../../../router/useRouter'\r\nimport { RoutePath } from '../../../router/routesConfig'\r\nimport useManageMenuAction from '../../../stores/manageMenu/useManageMenuAction'\r\n\r\nconst useLayout = (props: UseLayoutProps) => {\r\n const router = useRouter()\r\n const [open, setOpen] = React.useState(false)\r\n const appNotificationAction = useAppNotificationAction()\r\n const callWebService = useWebService()\r\n const profileStore = useAuthenStore()\r\n const { profile } = profileStore\r\n const manageMenuAction = useManageMenuAction()\r\n\r\n const [selectedMenu, setSelectedMenu] = React.useState('private_playground')\r\n const [tabIndex, setTabIndex] = React.useState(0)\r\n React.useEffect(() => {\r\n getNotification()\r\n }, [profile.userId])\r\n const handleTogleSidebar = () => {\r\n setOpen(!open)\r\n manageMenuAction.setIsOpen(!open)\r\n }\r\n const handleSelectedMenu = (menuID: string) => {\r\n setSelectedMenu(menuID)\r\n }\r\n\r\n const getNotification = async () => {\r\n if (profile.userId) {\r\n const res = await callWebService.getNotificationInfo(profile.userId)\r\n\r\n let result = [...res.result]\r\n // const mock = {\r\n // notifyID: 9999,\r\n // // notifyMessageEN: 'Exceeded The deadline for submitting hard copy documents.',\r\n // // notifyMessageTH: 'เลยกำหนดส่งเอกสาร Hard Copy แล้ว',\r\n // notifyMessageEN: 'Exceeded The deadline for submitting hard copy documents.',\r\n // notifyMessageTH: 'ใบรับรองหมดอายุแล้ว',\r\n // notifyType: 'HARD_COPY',\r\n // projectID: 131,\r\n // projectNameEN: 'TEST-COMMENT-WITH-APPROVE-ADMIN',\r\n // projectNameTH: 'TEST-COMMENT-WITH-APPROVE-ADMIN',\r\n // projectNumber: '640060',\r\n // submittedID: 191,\r\n // }\r\n // for (let i = 0; i < 5; i++) {\r\n // if (i === 0 || i === 1) {\r\n // result.push({ ...mock, isWatched: true })\r\n // } else {\r\n // result.push(mock)\r\n // }\r\n // }\r\n appNotificationAction.setNotificationInfo(result)\r\n }\r\n }\r\n\r\n // const handleChangeTab = (event: React.ChangeEvent<{}>, newValue: number) => {\r\n // setTabIndex(newValue)\r\n // }\r\n\r\n const handleClickProfile = () => {\r\n router.goTo(RoutePath.preference)\r\n }\r\n\r\n return { open, handleTogleSidebar, selectedMenu, handleSelectedMenu, tabIndex, handleClickProfile }\r\n}\r\n\r\nexport default useLayout\r\n","import clsx from 'clsx'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\n\r\ntype LogoutViewType = {\r\n onClickLogout: () => void\r\n}\r\nconst LogoutView = (props: LogoutViewType) => {\r\n const { onClickLogout } = props\r\n const classes = useStyles()\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst Logout = () => {\r\n const handleClickLogout = () => {\r\n localStorage.clear()\r\n window.location.replace(process.env.PUBLIC_URL)\r\n }\r\n return \r\n}\r\n\r\nexport default Logout\r\nconst useStyles = makeStyles((theme) => ({\r\n menuButton: {\r\n marginRight: theme.spacing(2),\r\n },\r\n}))\r\n","import * as manageProjectType from './tabManagerType'\r\nimport React from 'react'\r\nimport useAppFolderAndTabAction from '../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useFolderAndTabStore, { TabSelectedType } from '../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { DialogType } from '../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport { menuTab } from '../../../../constants/constants'\r\nimport useCheckPermission from '../../../../utilities/checkPermission'\r\n\r\nconst useTabManager = (props: manageProjectType.UseManageProject) => {\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const { folderSelected, tabSelected, tabDirty, callbackDirty, tabIndexSelected, tabRenderList } = folderAndTabStore\r\n\r\n const translate = useTranslate()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const checkPermissionHook = useCheckPermission()\r\n\r\n // const [tabIndex, setTabIndex] = React.useState(0)\r\n const dialogRef = React.useRef>()\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const handleChangeTab = (tabIndex: number, newTabSelected: TabSelectedType) => {\r\n const canSaveDraft = checkPermissionHook.checkSaveDraft()\r\n if (tabSelected.id !== newTabSelected.id) {\r\n if (tabDirty) {\r\n dialogRef.current?.openDialog()\r\n if (tabSelected.id === menuTab.tab10.id || !canSaveDraft) {\r\n //กรณีเป็นแท็บลงนามแทนจะไม่มี saveDraft จึงให้เป็นการเปลี่ยน tab โดยไม่ต้องบันทึกข้อมูล\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n setNewTab(tabIndex, newTabSelected)\r\n\r\n dialogRef.current?.closeDialog()\r\n },\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_DRAFT_BEFORE_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n if (callbackDirty) {\r\n callbackDirty(tabIndex, newTabSelected)\r\n // setNewTab(tabIndex, newTabSelected)\r\n }\r\n\r\n dialogRef.current?.closeDialog()\r\n },\r\n })\r\n }\r\n } else {\r\n setNewTab(tabIndex, newTabSelected)\r\n }\r\n }\r\n }\r\n const setNewTab = (tabIndex: number, newTabSelected: any) => {\r\n dialogRef.current?.closeDialog()\r\n // setTabIndex(tabIndex)\r\n appFolderAndTabAction.setSeletedTabIndex(tabIndex)\r\n appFolderAndTabAction.setSeletedTab(newTabSelected as { id: number; nameTH: string })\r\n }\r\n\r\n return { tabIndex: tabIndexSelected, configDialog, onChangeTab: handleChangeTab, onRefDialog }\r\n}\r\n\r\nexport default useTabManager\r\n","import React from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Tabs from '@material-ui/core/Tabs'\r\nimport Tab from '@material-ui/core/Tab'\r\nimport { Typography } from '@material-ui/core'\r\nimport useTranslate from '../../i18n/useTranslate'\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n tabsRoot: {\r\n '& .MuiTabScrollButton-root': {\r\n color: 'black',\r\n },\r\n '& .MuiTab-root': {\r\n maxWidth: 'unset',\r\n },\r\n },\r\n tabRoot: {\r\n border: '1px solid',\r\n borderColor: '#bfbdbd',\r\n borderRadius: '10px 10px 0px 0px',\r\n margin: '0px 1px',\r\n '&.Mui-selected': {\r\n backgroundColor: ' #db5f8e',\r\n color: '#fff',\r\n borderColor: '#db5f8e',\r\n },\r\n },\r\n indicatorRoot: {\r\n backgroundColor: 'unset',\r\n },\r\n}))\r\n\r\nexport default function IconLabelTabs(props: any) {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const { onChangeTab, tabIndex = 0, tabList } = props\r\n const [value, setValue] = React.useState(0)\r\n\r\n const handleChange = (event: React.ChangeEvent<{}>, newValue: number) => {\r\n setValue(newValue)\r\n }\r\n\r\n return (\r\n {\r\n const tabSelected = tabList[tabIndex]\r\n onChangeTab(tabIndex, tabSelected)\r\n }}\r\n indicatorColor=\"secondary\"\r\n textColor=\"primary\"\r\n aria-label=\"icon label tabs example\"\r\n variant=\"scrollable\"\r\n scrollButtons=\"auto\"\r\n classes={{\r\n root: classes.tabsRoot,\r\n indicator: classes.indicatorRoot,\r\n }}\r\n >\r\n {tabList.map((itm: any) => {\r\n return (\r\n \r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.nameTH\r\n : itm.nameEN}\r\n \r\n }\r\n />\r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import * as manageTypes from './tabManagerType'\r\nimport useTabManager from './useTabManager'\r\nimport MyTabs from '../../../../control/tab/tab'\r\nimport useFolderAndTabStore from '../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport Dialog from '../../../../control/dialog/dialog'\r\n\r\n//View\r\nconst TabManagerView = (props: manageTypes.ManageProjectView) => {\r\n const { onChangeTab, tabIndex, onRefDialog, configDialog } = props\r\n\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const { tabRenderList } = folderAndTabStore\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst TabManagerCtrl = (props: manageTypes.ManageProjectType) => {\r\n const {} = props\r\n const useTabManagerModel = useTabManager(props)\r\n return \r\n}\r\n\r\nexport default TabManagerCtrl\r\n","import React from 'react'\r\nimport { NotificationType } from './notification'\r\nimport useAppNotificationStore from '../../../../stores/notification/appNotificationStore'\r\nimport { NotificationInfoResult } from '../../../../services/web/types/responseWebServiceTypes'\r\nimport { encryptionAES } from '../../../../utilities/encryption'\r\nimport { RoutePath } from '../../../../router/routesConfig'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\nimport useWebService from '../../../../services/web/useWebService'\r\nimport useAuthenStore from '../../../../stores/authen/authenStore'\r\nimport useAppNotificationAction from '../../../../stores/notification/appNotificationAction'\r\n\r\nexport default (props: NotificationType) => {\r\n const [notiInfoList, setNotiInfo] = React.useState()\r\n const [openNotiList, setOpen] = React.useState(false)\r\n const appNotificationStore = useAppNotificationStore()\r\n const callWebService = useWebService()\r\n const profileStore = useAuthenStore()\r\n const appNotificationAction = useAppNotificationAction()\r\n\r\n const anchorRef = React.useRef(null)\r\n const history = useHistory()\r\n\r\n React.useEffect(() => {\r\n setNotification()\r\n }, [appNotificationStore.notificationInfo])\r\n\r\n const setNotification = () => {\r\n if (appNotificationStore.notificationInfo) {\r\n setNotiInfo(appNotificationStore.notificationInfo)\r\n }\r\n }\r\n const handleClickList = (notiInfo: NotificationInfoResult) => (event: any) => {\r\n handleClose(event)\r\n // deleteAndGetNoti(notiInfo.notifyID)\r\n updateWatchedNoti(notiInfo.notifyID)\r\n const encryptedProjectID = encryptionAES(`${notiInfo.projectID}`)\r\n const encryptedSubmittedID = encryptionAES(`${notiInfo.submittedID}`)\r\n\r\n const path = generatePath(RoutePath.manageProjectEdit, {\r\n projectID: encryptedProjectID,\r\n submittedID: encryptedSubmittedID,\r\n })\r\n\r\n history.push({\r\n pathname: path,\r\n state: {\r\n // location state\r\n // irb: row.irb,\r\n // mode: renderMode.view,\r\n },\r\n })\r\n window.location.reload()\r\n }\r\n const updateWatchedNoti = async (notifyID: number) => {\r\n await callWebService.updateWatchedNotification({ notiID: notifyID })\r\n getNotificationInfo()\r\n }\r\n const deleteAndGetNoti = async (notifyID: number) => {\r\n await callWebService.deleteNotificationInfo(notifyID)\r\n getNotificationInfo()\r\n }\r\n const getNotificationInfo = async () => {\r\n if (profileStore.profile.userId) {\r\n const res = await callWebService.getNotificationInfo(profileStore.profile.userId) //profileStore\r\n\r\n appNotificationAction.setNotificationInfo(res.result)\r\n }\r\n }\r\n\r\n const handleClose = (event: any) => {\r\n if (anchorRef && anchorRef.current) {\r\n //@ts-ignore\r\n if (anchorRef.current.contains(event.target)) {\r\n return\r\n }\r\n }\r\n\r\n setOpen(false)\r\n }\r\n const handleToggle = () => {\r\n setOpen((prevOpen) => !prevOpen)\r\n }\r\n const handleClickDeleteNoti = (notiInfo: NotificationInfoResult) => (event: any) => {\r\n event.stopPropagation()\r\n\r\n deleteAndGetNoti(notiInfo.notifyID)\r\n }\r\n return {\r\n notiInfoList,\r\n openNotiList,\r\n anchorRef,\r\n onClickList: handleClickList,\r\n onclickClose: handleClose,\r\n onclickToggle: handleToggle,\r\n onclickDeleteNoti: handleClickDeleteNoti,\r\n }\r\n}\r\n","import React from 'react'\r\nimport DeleteForeverIcon from '@material-ui/icons/DeleteForever'\r\nimport useNotification from './useNotification'\r\nimport { makeStyles, useTheme, withStyles } from '@material-ui/core/styles'\r\nimport {\r\n ClickAwayListener,\r\n Divider,\r\n Grid,\r\n Grow,\r\n IconButton,\r\n ListSubheader,\r\n MenuItem,\r\n MenuList,\r\n Paper,\r\n Popper,\r\n Typography,\r\n} from '@material-ui/core'\r\nimport Badge from '@material-ui/core/Badge'\r\nimport BellIcon from '@material-ui/icons/Notifications'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport ClearIcon from '@material-ui/icons/Clear'\r\nimport Tooltip from '../../../../control/tooltip/tooltip'\r\n\r\ntype NotificationView = NotificationType & ReturnType\r\nconst NotificationView: React.FC = (props) => {\r\n const { notiInfoList, openNotiList, anchorRef, onClickList, onclickClose, onclickToggle, onclickDeleteNoti } = props\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const translate = useTranslate()\r\n\r\n const StyledBadge = withStyles((theme) => ({\r\n badge: {\r\n right: -3,\r\n top: 13,\r\n border: `2px solid ${theme.palette.background.paper}`,\r\n padding: '0 4px',\r\n },\r\n }))(Badge)\r\n\r\n const getDisplayNotiTitle = () => {\r\n let title = 'การแจ้งเตือน'\r\n // const titleEN = 'Notification'\r\n\r\n if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n title = 'การแจ้งเตือน'\r\n } else {\r\n title = 'Notification'\r\n }\r\n return title\r\n }\r\n const getNotificationCount = () => {\r\n let notiCount: number = 0\r\n notiInfoList?.forEach((itm) => {\r\n if (!itm.isWatched) {\r\n notiCount += 1\r\n }\r\n })\r\n\r\n return notiCount\r\n }\r\n\r\n return (\r\n \r\n {' '}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {({ TransitionProps, placement }) => (\r\n \r\n \r\n \r\n \r\n \r\n {getDisplayNotiTitle()}\r\n \r\n \r\n }\r\n onKeyDown={() => {}}\r\n >\r\n {notiInfoList &&\r\n notiInfoList.length > 0 &&\r\n notiInfoList.map((itm) => {\r\n let displayProject = ''\r\n if (itm?.projectNumber) {\r\n if (\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ) {\r\n displayProject = `โครงการเลขที่ ${itm.projectNumber}`\r\n } else {\r\n displayProject = `Project Number ${itm.projectNumber}`\r\n }\r\n } else {\r\n displayProject = itm.projectNameTH\r\n if (\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ) {\r\n displayProject = `ชื่อโครงการ ${itm.projectNameTH}`\r\n } else {\r\n displayProject = `Project Name ${itm.projectNameEN}`\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {!itm.isWatched && (\r\n \r\n )}\r\n \r\n \r\n {/* {`Project Number ${itm.projectNumber}`} */}\r\n \r\n
\r\n \r\n {displayProject}\r\n \r\n \r\n {translate.languageStore.currentLanguage ===\r\n translate.languageKey.th\r\n ? itm.notifyMessageTH\r\n : itm.notifyMessageEN}\r\n \r\n
\r\n
\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n\r\n {!notiInfoList ||\r\n (notiInfoList.length === 0 && (\r\n <>\r\n \r\n\r\n \r\n {translate.languageStore.currentLanguage ===\r\n translate.languageKey.th\r\n ? `ไม่พบการแจ้งเตือน`\r\n : `No notification`}\r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n\r\nexport type NotificationType = {\r\n // projectMode: 'CREATE' | 'EDIT'\r\n // callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Notification: React.FC = (props) => {\r\n const useNotificationModel = useNotification(props)\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n },\r\n menuItem: {\r\n padding: '20px',\r\n width: '385px',\r\n backgroundColor: '#f3f9fd8c',\r\n },\r\n\r\n menuItemWatched: {\r\n padding: '20px',\r\n width: '385px',\r\n backgroundColor: 'white',\r\n },\r\n paperProjectStatusMobile: {\r\n // padding: '10px',\r\n height: '10px',\r\n width: '10px',\r\n borderRadius: '20px',\r\n },\r\n notiNotfound: {\r\n padding: '20px',\r\n width: '385px',\r\n backgroundColor: 'white',\r\n color: '#bdbdbd',\r\n },\r\n}))\r\n\r\nexport default Notification\r\n","const userManualLink = {\r\n researcher: `${process.env.PUBLIC_URL}/document/UM_Researcher.pdf`,\r\n officer: `${process.env.PUBLIC_URL}/document/UM_Officer.pdf`,\r\n executive: `${process.env.PUBLIC_URL}/document/UM_Executive.pdf`,\r\n committee: `${process.env.PUBLIC_URL}/document/UM_Director.pdf`,\r\n}\r\nexport default userManualLink\r\n","import React from 'react'\r\nimport Tooltip from '../../../../control/tooltip/tooltip'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport DocIcon from '@material-ui/icons/Description'\r\n\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport useCheckPermission from '../../../../utilities/checkPermission'\r\nimport constUserManualLink from '../../../../constants/userManualLink'\r\n\r\ntype UserManualDocViewProps = UserManualDocProps & { onClick: () => void }\r\nconst UserManualDocView: React.FC = (props) => {\r\n const { onClick } = props\r\n\r\n const translate = useTranslate()\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\ntype UserManualDocProps = {}\r\nconst UserManualDoc: React.FC = (props) => {\r\n const permissionHook = useCheckPermission()\r\n const onClick = () => {\r\n if (permissionHook.isUserAdmin()) {\r\n window.open(constUserManualLink.officer, '_blank')\r\n } else if (permissionHook.isUserResearcher()) {\r\n window.open(constUserManualLink.researcher, '_blank')\r\n } else if (\r\n permissionHook.isUserChairmanOnly() ||\r\n permissionHook.isUserViceChairman() ||\r\n permissionHook.isUserSecretary()\r\n ) {\r\n window.open(constUserManualLink.executive, '_blank')\r\n } else if (permissionHook.isUserCommittee()) {\r\n window.open(constUserManualLink.committee, '_blank')\r\n }\r\n }\r\n return \r\n}\r\n\r\nexport default UserManualDoc\r\n","import { Fragment, FC } from 'react'\r\nimport { Link } from 'react-router-dom'\r\nimport List from '@material-ui/core/List'\r\nimport ListItem from '@material-ui/core/ListItem'\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon'\r\nimport ListItemText from '@material-ui/core/ListItemText'\r\nimport clsx from 'clsx'\r\n\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport { RoutesType } from '../../../router/routesConfig'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\ninterface RenderMenuProps {\r\n handleSelectedMenu: (menuID: string) => void\r\n route: RoutesType\r\n index: number\r\n selectedMenu: string\r\n}\r\nconst RenderMenu: FC = ({ handleSelectedMenu, route, index, selectedMenu }) => {\r\n const classes = useStyles()\r\n const authenStore = useAuthenStore()\r\n const translate = useTranslate()\r\n // const userGroupID = authenStore.profile.userGroupId || 0\r\n const permission = authenStore.profile?.permission ?? []\r\n const display = route.isDisplayMenu\r\n // const allow = (route.allowAccessGroupID || []).indexOf(userGroupID) > -1\r\n let allow: boolean = false\r\n let name: any = ''\r\n permission.every((per) => {\r\n if (route?.functionID && route.functionID === per.functionID) {\r\n allow = true\r\n name = translate.languageStore.currentLanguage == 'th' ? per.functionName_th : per.functionName_en\r\n return false //break\r\n }\r\n return true //continue\r\n })\r\n\r\n const isSelectedMenu = route.menuID === selectedMenu\r\n\r\n if (display && allow) {\r\n return (\r\n \r\n \r\n {\r\n handleSelectedMenu(route.menuID)\r\n }}\r\n >\r\n \r\n {route.menuIcon}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n } else {\r\n return null\r\n }\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n listRoot: {\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n },\r\n selectedMenu: {\r\n borderLeft: `4px solid ${theme.palette.primary.main}`,\r\n color: theme.palette.primary.main,\r\n },\r\n menuText: {\r\n fontSize: '14px ',\r\n },\r\n iconListRoot: {\r\n minWidth: '40px',\r\n },\r\n iconListSelectedRoot: {\r\n color: theme.palette.primary.main,\r\n },\r\n}))\r\n\r\nexport default RenderMenu\r\n","import React, { Fragment } from 'react'\r\nimport useLayout from './useLayout'\r\nimport clsx from 'clsx'\r\nimport { makeStyles, useTheme, withStyles } from '@material-ui/core/styles'\r\nimport Drawer from '@material-ui/core/Drawer'\r\nimport CssBaseline from '@material-ui/core/CssBaseline'\r\nimport AppBar from '@material-ui/core/AppBar'\r\nimport Toolbar from '@material-ui/core/Toolbar'\r\nimport List from '@material-ui/core/List'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport ListItem from '@material-ui/core/ListItem'\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon'\r\nimport ListItemText from '@material-ui/core/ListItemText'\r\nimport { Link } from 'react-router-dom'\r\nimport { lstPrivateRoutes, RoutePath, RoutesType } from '../../../router/routesConfig'\r\nimport { LayoutViewProps } from './layoutType'\r\nimport MenuOpenIcon from '@material-ui/icons/MenuOpen'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp'\r\nimport { ClickAwayListener, Grid, Grow, ListSubheader, MenuItem, MenuList, Paper, Popper } from '@material-ui/core'\r\nimport { Redirect, useHistory, useLocation, useRouteMatch } from 'react-router-dom'\r\nimport Badge from '@material-ui/core/Badge'\r\nimport BellIcon from '@material-ui/icons/Notifications'\r\nimport Avatar from '@material-ui/core/Avatar'\r\nimport Typography from '@material-ui/core/Typography'\r\n\r\nimport useAuthenService from '../../../services/authen/useAuthenService'\r\nimport authenAction from '../../../stores/authen/authenAction'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport LogoutBTN from './logout'\r\n\r\nimport TabManager from '../manageProject/tabManager/tabManager'\r\nimport Language from './language/language'\r\nimport Notification from './notification/notification'\r\nimport UserManualDoc from './userManualDoc/userManualDoc'\r\nimport RenderMenu from './RenderMenu'\r\nimport { env } from 'process'\r\nconst drawerWidth = 240\r\n\r\ntype MatchParams = {\r\n id: string\r\n}\r\n\r\nconst StyledBadge = withStyles((theme) => ({\r\n badge: {\r\n right: -3,\r\n top: 13,\r\n border: `2px solid ${theme.palette.background.paper}`,\r\n padding: '0 4px',\r\n },\r\n}))(Badge)\r\n\r\nconst LayoutView: React.FC> = ({\r\n children,\r\n open,\r\n selectedMenu,\r\n // tabIndex,\r\n // onChangeTab,\r\n handleTogleSidebar,\r\n handleSelectedMenu,\r\n handleClickProfile,\r\n}) => {\r\n const authenService = useAuthenService()\r\n const autAction = authenAction()\r\n const authenStore = useAuthenStore()\r\n\r\n const translate = useTranslate()\r\n\r\n const history = useHistory()\r\n let location = useLocation()\r\n const matchEdit = useRouteMatch(RoutePath.manageProjectEdit)\r\n const isEditpage = matchEdit?.path === RoutePath.manageProjectEdit\r\n const isCreatepage = location.pathname === RoutePath.manageProjectCreateRequest\r\n\r\n const isShowTab = isEditpage || isCreatepage\r\n\r\n const classes = useStyles({ isShowTab })\r\n const theme = useTheme()\r\n // const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('sm'))\r\n\r\n const getDisplayNameUser = () => {\r\n const NO_NAME = '???? ????'\r\n let name = NO_NAME\r\n\r\n if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n name = authenStore.profile?.name_th ?? NO_NAME\r\n } else {\r\n name = authenStore.profile?.name_en ?? NO_NAME\r\n }\r\n return name\r\n }\r\n const getDisplayUserGroup = () => {\r\n const NO_NAME = '???? ????'\r\n let name = NO_NAME\r\n\r\n if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n name = authenStore.profile?.userGroupName_th ?? NO_NAME\r\n } else {\r\n name = authenStore.profile?.userGroupName_en ?? NO_NAME\r\n }\r\n return name\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n {getDisplayUserGroup()}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {!isMobileView && (\r\n \r\n \r\n
\r\n \r\n {getDisplayNameUser()}\r\n \r\n
\r\n
\r\n
\r\n )}\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n {/* {}}\r\n aria-label=\"disabled tabs example\"\r\n >\r\n \r\n \r\n \r\n */}\r\n {isShowTab && }\r\n {/* {isShowTab && } */}\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n {lstPrivateRoutes.map((route, index) => (\r\n \r\n ))}\r\n
\r\n
\r\n {process.env.REACT_APP_VERSION}\r\n
\r\n \r\n \r\n
\r\n \r\n {children}\r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nconst Layout: React.FC = ({ children }) => {\r\n const history = useHistory()\r\n const layout = useLayout({})\r\n const authenService = useAuthenService()\r\n const autAction = authenAction()\r\n React.useEffect(() => {\r\n const checkGetprofile = async () => {\r\n const accessToken = localStorage.getItem('accessToken')\r\n const loginType = localStorage.getItem('loginType')\r\n if (accessToken && loginType) {\r\n const getProfile = await authenService.getProfile(accessToken, loginType as unknown as 1 | 2)\r\n autAction.setProfile(getProfile.result)\r\n }\r\n // else {\r\n // history.replace(RoutePath.login, null)\r\n // }\r\n }\r\n checkGetprofile()\r\n }, [])\r\n\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n height: '100%'\r\n },\r\n textPrimary: {\r\n color: theme.palette.text.primary,\r\n },\r\n appBar: {\r\n backgroundColor: 'white',\r\n transition: theme.transitions.create(['margin', 'width'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n },\r\n appBarShift: {\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n marginLeft: drawerWidth,\r\n transition: theme.transitions.create(['margin', 'width'], {\r\n easing: theme.transitions.easing.easeOut,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n menuButton: {\r\n marginRight: theme.spacing(2),\r\n },\r\n hide: {\r\n display: 'none',\r\n },\r\n drawer: {\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n },\r\n drawerPaper: {\r\n width: drawerWidth,\r\n boxShadow: '0px 0px 5px 0px rgb(0 0 0 / 75%)',\r\n // overflowY: 'unset'\r\n },\r\n drawerHeader: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n // padding: theme.spacing(7, 1),\r\n padding: (props: { isShowTab: boolean }) => {\r\n if (props.isShowTab) {\r\n return theme.spacing(7, 1)\r\n } else {\r\n return theme.spacing(0, 1)\r\n }\r\n },\r\n [theme.breakpoints.down('md')]: {\r\n minHeight: '64px',\r\n },\r\n // necessary for content to be below app bar\r\n ...theme.mixins.toolbar,\r\n justifyContent: 'flex-end',\r\n },\r\n content: {\r\n flexGrow: 1,\r\n // padding: theme.spacing(3),\r\n // paddingTop: theme.spacing(10),\r\n transition: theme.transitions.create('margin', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n marginLeft: -drawerWidth,\r\n height: 'calc(100% - 110px)',\r\n zIndex: 0,\r\n backgroundColor: 'inherit',\r\n width: '100%'\r\n },\r\n contentShift: {\r\n transition: theme.transitions.create('margin', {\r\n easing: theme.transitions.easing.easeOut,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n marginLeft: 0,\r\n },\r\n contentMobile: {\r\n padding: theme.spacing(3),\r\n width: '100%',\r\n [theme.breakpoints.down('md')]: {\r\n padding: theme.spacing(1),\r\n },\r\n },\r\n listRoot: {\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n },\r\n selectedMenu: {\r\n borderLeft: `4px solid ${theme.palette.primary.main}`,\r\n color: theme.palette.primary.main,\r\n },\r\n menuText: {\r\n fontSize: '14px ',\r\n },\r\n iconListRoot: {\r\n minWidth: '40px',\r\n },\r\n iconListSelectedRoot: {\r\n color: theme.palette.primary.main,\r\n },\r\n containerBody: {\r\n padding: theme.spacing(3),\r\n [theme.breakpoints.down('sm')]: {\r\n paddingLeft: '0px',\r\n paddingRight: '0px',\r\n },\r\n // height: 'calc(100% - 70px)',\r\n // overflowY: 'auto'\r\n \r\n },\r\n itemRole: {\r\n display: 'block',\r\n [theme.breakpoints.down('sm')]: {\r\n display: 'none',\r\n },\r\n },\r\n}))\r\n\r\nexport default Layout\r\n","import { Route, Redirect, RouteProps, RouteComponentProps } from 'react-router-dom'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport { RoutePath } from './routesConfig'\r\n\r\nconst PrivateRoute = (props: RouteProps & { functionID?: number }) => {\r\n const { component: Component, ...rest } = props\r\n\r\n const authenStore = useAuthenStore()\r\n\r\n const isPermission = (userPermission: ReturnType['profile']['permission']) => {\r\n let valid = false //No permision\r\n if (userPermission.length > 0) {\r\n if (props.functionID === 99) {\r\n valid = true\r\n } else {\r\n userPermission.every((per) => {\r\n if (per.functionID === props.functionID) {\r\n valid = true\r\n return false //break loop\r\n }\r\n return true //continue loop\r\n })\r\n }\r\n }\r\n return valid\r\n }\r\n\r\n const renderRoute = (routeProps: RouteComponentProps) => {\r\n const accessToken = localStorage.getItem('accessToken')\r\n if (accessToken && isPermission(authenStore.profile?.permission ?? [])) {\r\n // if (accessToken) {\r\n return Component && \r\n }\r\n return \r\n }\r\n return renderRoute(routeProps)} />\r\n}\r\n\r\nexport default PrivateRoute\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport Lottie from 'lottie-react'\r\nimport loadingJSON from './loading.json'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n backgroundColor: '#ffffff80',\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n zIndex: 9999,\r\n },\r\n\r\n divCenterScreen: {\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n // marginTop: '-125px', //โลมา\r\n // marginLeft: '-125px', //โลมา\r\n marginTop: '-65px',\r\n marginLeft: '-175px',\r\n },\r\n}))\r\n\r\ntype MyLoadingProps = {\r\n isShowLoading?: boolean\r\n // rootStyle?: any\r\n}\r\nconst MyLoading = ({ isShowLoading = true }: MyLoadingProps) => {\r\n const classes = useStyles()\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default MyLoading\r\n","import React from 'react'\r\nimport Button from '@material-ui/core/Button'\r\nimport Snackbar from '@material-ui/core/Snackbar'\r\nimport MuiAlert, { AlertProps, Color } from '@material-ui/lab/Alert'\r\nimport useSnackbar from './useSnackbar'\r\n\r\nlet Alert = (props: AlertProps) => {\r\n return \r\n}\r\n\r\ntype MySnackbarViewType = ReturnType & { message: string; type: Color }\r\nexport let MySnackbarView = (props: MySnackbarViewType) => {\r\n const { handleClose, open, message, type } = props\r\n\r\n return (\r\n \r\n \r\n {message}\r\n \r\n \r\n )\r\n}\r\n\r\nlet MySnackbar = () => {\r\n const snackbar = useSnackbar()\r\n return \r\n}\r\nexport default MySnackbar\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport Lottie from 'lottie-react'\r\nimport loadingJSON from '../loading/loading.json'\r\n\r\nconst BGLoading = () => {\r\n const classes = useStyles()\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default BGLoading\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n position: 'absolute',\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'auto',\r\n backgroundImage: `url(${process.env.PUBLIC_URL + '/img/pink_bg.png'})`,\r\n },\r\n centerPage: {\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n },\r\n}))\r\n","import { Suspense, useEffect, useRef } from 'react'\r\nimport './App.css'\r\nimport Layout from './component/web/layout/layout'\r\nimport { Route, Switch } from 'react-router-dom'\r\nimport { lstPrivateRoutes, lstPublicRoutes } from './router/routesConfig'\r\nimport Dialog from './control/dialog/dialog'\r\nimport useAppAlertMessageStore from './stores/appAlertMessage/appAlertMessageStore'\r\nimport useAppAlertMessageAction from './stores/appAlertMessage/appAlertMessageAction'\r\nimport PrivateRoute from './router/privateRoute'\r\nimport Loading from './control/loading/loading'\r\nimport useLoading from './control/loading/useLoading'\r\nimport { MySnackbarView } from './control/snackbar/snackbar'\r\nimport useSnackbarStore from './stores/snackbar/snackbarStore'\r\nimport useSnackbarAction from './stores/snackbar/snackbarAction'\r\nimport { QueryParamProvider } from 'use-query-params'\r\nimport BGLoading from './control/bgLoading/bgLoading'\r\n\r\nconst useApplicationAlertMessage = () => {\r\n const appAlertMessageRef = useRef>()\r\n\r\n const appAlertMessageStore = useAppAlertMessageStore()\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n\r\n const snackbarStore = useSnackbarStore()\r\n const snackbarAction = useSnackbarAction()\r\n useEffect(() => {\r\n if (appAlertMessageRef.current) {\r\n if (appAlertMessageStore.isOpen) {\r\n appAlertMessageRef.current.openDialog()\r\n } else {\r\n appAlertMessageRef.current.closeDialog()\r\n }\r\n }\r\n }, [appAlertMessageStore.isOpen])\r\n const handleRefAppAlertMessage = (func: Record) => {\r\n appAlertMessageRef.current = func\r\n }\r\n const handleAfterClose = () => {\r\n appAlertMessageAction.closeAlertMessage()\r\n }\r\n return {\r\n title: appAlertMessageStore.title,\r\n message: appAlertMessageStore.message,\r\n onRefAppAlertMessage: handleRefAppAlertMessage,\r\n onAfterClose: handleAfterClose,\r\n snackbarConfig: {\r\n open: snackbarStore.isOpen,\r\n handleClose: snackbarAction.closeSnackbar,\r\n handleOpen: snackbarAction.openSnackbar,\r\n message: snackbarStore.message,\r\n type: snackbarStore.type,\r\n },\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n acceptanceContentTH: string\r\n acceptanceContentEN: string\r\n }\r\n}\r\n\r\nfunction App() {\r\n const applicationAlertMessageModel = useApplicationAlertMessage()\r\n const loadingHook = useLoading()\r\n return (\r\n }>\r\n \r\n {lstPublicRoutes.map((route) => {\r\n return (\r\n \r\n )\r\n })}\r\n\r\n \r\n \r\n {lstPrivateRoutes.map((route) => {\r\n return (\r\n \r\n )\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default App\r\n","import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","// import { createMuiTheme } from '@material-ui/core/styles'\r\nimport { createTheme } from '@material-ui/core/styles'\r\n\r\nconst muiTheme = createTheme({\r\n typography: {\r\n // Use the system font.\r\n fontFamily: 'Prompt, sans-serif',\r\n button: {\r\n textTransform: 'none',\r\n },\r\n body1: {\r\n fontSize: '16px',\r\n },\r\n body2: {\r\n fontSize: '16px',\r\n },\r\n subtitle2: {\r\n fontSize: '16px',\r\n },\r\n },\r\n palette: {\r\n primary: {\r\n main: '#db5f8e',\r\n dark: '#e8548c',\r\n // light: '#ff9873',\r\n // contrastText: '#F9F9F9',\r\n },\r\n secondary: {\r\n main: '#be3144',\r\n },\r\n text: {\r\n primary: '#21211F',\r\n secondary: '#333131',\r\n },\r\n background: {\r\n default: '#ffffff',\r\n },\r\n grey: {\r\n 50: 'rgba(0, 0, 0, 0.25)',\r\n },\r\n },\r\n overrides: {\r\n MuiGrid: {\r\n root: {\r\n overflowWrap: 'break-word',\r\n },\r\n }\r\n }\r\n})\r\n\r\nconst mainTheme = {\r\n ...muiTheme,\r\n}\r\n\r\nexport default mainTheme\r\n","import ReactDOM from 'react-dom'\r\nimport './index.css'\r\nimport App from './App'\r\nimport reportWebVitals from './reportWebVitals'\r\nimport { BrowserRouter } from 'react-router-dom'\r\nimport { RecoilRoot } from 'recoil'\r\nimport { ThemeProvider } from '@material-ui/core/styles'\r\nimport './i18n/i18n'\r\nimport mainTheme from './themes/mainTheme'\r\n\r\nconst closeConsole = () => {\r\n window.console.clear()\r\n console.log(\r\n '%cCU-REC',\r\n 'font-weight: bold; font-size: 50px; color: #e76813; text-shadow: 1px 1px 0px black, 1px -1px 0px black, -1px 1px 0px black, -1px -1px 0px black',\r\n )\r\n window.console.log = function () {\r\n window.console.log = function () {\r\n return false\r\n }\r\n }\r\n\r\n window.console.warn = function () {\r\n window.console.warn = function () {\r\n return false\r\n }\r\n }\r\n\r\n window.console.error = function () {\r\n window.console.error = function () {\r\n return false\r\n }\r\n }\r\n window.console.info = function () {\r\n window.console.info = function () {\r\n return false\r\n }\r\n }\r\n}\r\n\r\nif (process.env.REACT_APP_ENVIRONMENT !== 'DEV') {\r\n // closeConsole()\r\n}\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root'),\r\n)\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals()\r\n","export default {\r\n th: 'th',\r\n en: 'en',\r\n}\r\n","enum submittedStep {\r\n submit = 1, //ยื่นเอกสาร, แก้ไขเอกสาร\r\n verifyDoc = 2, //ตรวจสอบเอกสาร\r\n specifyProjectType = 3, //กำหนดประเภทโครงการและกรรมการ\r\n specifyAdditionalDoc = 4, //กำหนดขอชุดโครงการที่ต้องส่ง\r\n specifySchedule = 5, //ชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n commentary = 6, //บันทึกข้อคิดเห็นของกรรมการ\r\n synthesis = 7, //สังเคราะห์ข้อคิดเห็น\r\n synthesisReview = 8, //ออกผลการพิจารณา\r\n certification = 9, //ออกใบรับรอง\r\n sign = 10, //ลงนาม\r\n memoMessage = 11, //บันทึกข้อความ\r\n confirmProjectWithdraw = 12, //รับทราบการถอน\r\n}\r\nexport default submittedStep\r\n","import { useField } from 'react-final-form'\r\nimport useTranslate from '../../i18n/useTranslate'\r\nimport { composeValidators, textRequired } from '../../utilities/validate'\r\nimport { UseTextfieldProps } from './textfieldType'\r\n\r\nexport type FieldRequired = boolean | { showAsterisk?: boolean; triggedValidate?: boolean; errorMessage?: string }\r\n\r\nfunction useTextfield(props: UseTextfieldProps) {\r\n const { name, required, validates = [] } = props\r\n const translate = useTranslate()\r\n let mergeValidate = validates\r\n if ((typeof required === 'boolean' && required) || (typeof required === 'object' && required.triggedValidate)) {\r\n mergeValidate = [\r\n textRequired(typeof required === 'object' ? required.errorMessage : `${translate.get('MESSAGE.M015')}`),\r\n ...mergeValidate,\r\n ]\r\n }\r\n /* Validate */\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate),\r\n })\r\n\r\n return { field }\r\n}\r\n\r\nexport default useTextfield\r\n","import React, { Fragment } from 'react'\r\nimport TextField from '@material-ui/core/TextField'\r\nimport FormHelperText from '@material-ui/core/FormHelperText'\r\nimport FormControl from '@material-ui/core/FormControl'\r\nimport useTextfield from './useTextfield'\r\nimport { omit } from 'lodash'\r\nimport { TextfieldViewProps, MyTextfieldProps } from './textfieldType'\r\nimport { Grid, Typography } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\n\r\nlet TextfieldView: React.FC = ({\r\n handleValueChange,\r\n onEnter,\r\n field,\r\n required,\r\n maxLength,\r\n min,\r\n materialInputProps = {},\r\n type,\r\n icon,\r\n defaultValue,\r\n resetButtom = false,\r\n onBlur,\r\n rowsMin = 1,\r\n error = false,\r\n fontSize,\r\n ...other\r\n}) => {\r\n const { input, meta } = field\r\n const isError = (meta.error && meta.invalid && meta.touched) || error ? true : false\r\n const classes = useStyles(isError)\r\n const getLabel = () => {\r\n // const isDisable = materialInputProps?.disabled\r\n const myLabel = required ? (\r\n \r\n \r\n {materialInputProps.label || ''}{' '}\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n {materialInputProps.label || ''}\r\n \r\n \r\n )\r\n return (\r\n \r\n {myLabel}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {getLabel()}\r\n \r\n // \r\n // \r\n // ),\r\n // }}\r\n\r\n InputProps={{\r\n classes: {\r\n root: classes.inputRoot,\r\n disabled: classes.disabled,\r\n },\r\n endAdornment: {icon && icon},\r\n }}\r\n onChange={(e) => {\r\n const value = e.target.value ? e.target.value : null\r\n input.onChange(value)\r\n handleValueChange && handleValueChange(e.target.value)\r\n }}\r\n onKeyPress={(e) => {\r\n if (e.charCode === 13) {\r\n if (onEnter) {\r\n onEnter()\r\n }\r\n }\r\n }}\r\n type={type}\r\n onBlur={(e) => onBlur && onBlur(e.target.value)}\r\n />\r\n \r\n {/* {!materialInputProps?.disabled && meta.error && meta.touched && meta.error} */}\r\n {isError && meta.error}\r\n \r\n \r\n )\r\n}\r\n\r\nlet MyTextfield: React.FC = ({\r\n handleValueChange,\r\n onEnter,\r\n name,\r\n required,\r\n validates,\r\n maxLength,\r\n min,\r\n isDraftNotRequire,\r\n rowsMin = 1,\r\n fontSize,\r\n ...others\r\n}) => {\r\n const myInput = useTextfield({\r\n name,\r\n required,\r\n validates,\r\n isDraftNotRequire,\r\n fontSize,\r\n })\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport default MyTextfield\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n label: {\r\n // fontWeight: 'bold',\r\n marginBottom: 10,\r\n color: (isError: any) => {\r\n if (isError) {\r\n return '#ff4d4f'\r\n } else {\r\n return ''\r\n }\r\n },\r\n // fontSize: '16px',\r\n },\r\n errorText: {\r\n // fontFamily: 'prompt',\r\n fontSize: '12px',\r\n color: '#ff4d4f',\r\n },\r\n inputRoot: {\r\n '&$disabled': {\r\n color: '#000000',\r\n backgroundColor: '#F0F0F0C6',\r\n },\r\n borderRadius: '8px',\r\n },\r\n disabled: {},\r\n}))\r\n","export const example = 'https://docker.geotalent.co.th/wfh-api-dev/api/lookup/reason'\r\nexport const login = `${process.env.REACT_APP_CU_IRB_API_URL}/auth/login` //'https://gdev.geotalent.co.th/VirtualRunAPI/api/lookup/employee'\r\nexport const test = `${process.env.REACT_APP_CU_IRB_API_URL}/xxxxxxxxxx`\r\n\r\nexport const getProfile = `${process.env.REACT_APP_CU_IRB_API_URL}/users/getProfile`\r\nexport const pdpa = `${process.env.REACT_APP_CU_IRB_API_URL}/users/pdpa/info`\r\n","import { atom, useRecoilValue } from 'recoil'\r\n\r\nexport type PermissionFuncInfo = {\r\n functionID: number\r\n functionName_th: number\r\n functionName_en: number\r\n}\r\n\r\nexport type ProfileType = {\r\n academicPositionID: number | null\r\n academicPositionName_en: string | null\r\n academicPositionName_th: string | null\r\n academicPositionOther: string | null\r\n email: string | null\r\n facultyID: number | null\r\n facultyName_en: string | null\r\n facultyName_th: string | null\r\n fax: string | null\r\n homePhone: string | null\r\n irb: number | null\r\n mobilePhone: string | null\r\n name_en: string | null\r\n name_th: string | null\r\n titleNameID: number | null\r\n titleNameOther: string | null\r\n titleName_en: string | null\r\n titleName_th: string | null\r\n userGroupId: number | null\r\n userGroupName_en: string | null\r\n userGroupName_th: string | null\r\n userId: number | null\r\n username: string | null\r\n image_path: string | null\r\n permission: Array\r\n isPhD: boolean | null\r\n only_name_en: string | null\r\n only_name_th: string | null\r\n isCunet: boolean | null\r\n titleNameOther_th: string | null\r\n titleNameOther_en: string | null\r\n academicPositionOther_th: string | null\r\n academicPositionOther_en: string | null\r\n}\r\n\r\nexport type AuthenStoreType = {\r\n profile: ProfileType\r\n}\r\nexport const authenStore = atom({\r\n key: 'authenStore',\r\n default: {\r\n profile: {\r\n academicPositionID: null,\r\n academicPositionName_en: null,\r\n academicPositionName_th: null,\r\n academicPositionOther: null,\r\n email: null,\r\n facultyID: null,\r\n facultyName_en: null,\r\n facultyName_th: null,\r\n fax: null,\r\n homePhone: null,\r\n irb: null,\r\n mobilePhone: null,\r\n name_en: null,\r\n name_th: null,\r\n titleNameID: null,\r\n titleNameOther: null,\r\n titleName_en: null,\r\n titleName_th: null,\r\n userGroupId: null,\r\n userGroupName_en: null,\r\n userGroupName_th: null,\r\n userId: null,\r\n username: null,\r\n image_path: null,\r\n permission: [],\r\n isPhD: null,\r\n only_name_en: null,\r\n only_name_th: null,\r\n isCunet: null,\r\n titleNameOther_th: null,\r\n titleNameOther_en: null,\r\n academicPositionOther_th: null,\r\n academicPositionOther_en: null,\r\n },\r\n },\r\n})\r\n\r\nconst useAuthenStore = () => {\r\n const authenState = useRecoilValue(authenStore)\r\n return {\r\n ...authenState,\r\n }\r\n}\r\n\r\nexport default useAuthenStore\r\n","import { atom, useRecoilValue } from 'recoil'\r\nexport type LoadingStoreType = {\r\n isLoading: boolean\r\n}\r\nexport const loadingStore = atom({\r\n key: 'loadingStore',\r\n default: {\r\n isLoading: false,\r\n },\r\n})\r\n\r\nconst useLoadingStore = () => {\r\n const loadingState = useRecoilValue(loadingStore)\r\n return {\r\n ...loadingState,\r\n }\r\n}\r\n\r\nexport default useLoadingStore\r\n","import { atom, useRecoilValue } from 'recoil'\r\n\r\nexport type CommentaryStoreType = {\r\n selectedCommitteeID: number | null\r\n}\r\nexport const commentaryStore = atom({\r\n key: 'commentaryStore',\r\n default: {\r\n selectedCommitteeID: null\r\n },\r\n})\r\n\r\nconst useCommentaryStore = () => {\r\n const commentaryState = useRecoilValue(commentaryStore)\r\n return {\r\n ...commentaryState,\r\n }\r\n}\r\n\r\nexport default useCommentaryStore\r\n","import { FC } from 'react'\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport clsx from 'clsx'\r\nimport CssBaseline from '@material-ui/core/CssBaseline'\r\nimport AppBar from '@material-ui/core/AppBar'\r\nimport Toolbar from '@material-ui/core/Toolbar'\r\nimport { Grid } from '@material-ui/core'\r\nimport Language from './language/language'\r\n\r\ntype LayoutPublicProps = {\r\n children: React.ReactNode\r\n}\r\nconst LayoutPublic: FC = ({ children }) => {\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {/* */}\r\n {/* */}\r\n \r\n {/* */}\r\n {/* */}\r\n \r\n \r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n \r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n \r\n \r\n \r\n \r\n\r\n
\r\n
\r\n \r\n {children}\r\n \r\n
\r\n
\r\n )\r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n // display: 'flex',\r\n backgroundImage: `url(${process.env.PUBLIC_URL + '/img/pink_bg.png'})`,\r\n // height: '100%',\r\n backgroundRepeat: 'no-repeat',\r\n backgroundAttachment: 'fixed',\r\n backgroundSize: 'cover',\r\n },\r\n textPrimary: {\r\n color: theme.palette.text.primary,\r\n },\r\n appBar: {\r\n backgroundColor: 'white',\r\n transition: theme.transitions.create(['margin', 'width'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n },\r\n contentMobile: {\r\n backgroundColor: '#fff',\r\n padding: theme.spacing(3),\r\n width: '100%',\r\n [theme.breakpoints.down('md')]: {\r\n padding: theme.spacing(0),\r\n },\r\n },\r\n content: {\r\n flexGrow: 1,\r\n\r\n [theme.breakpoints.down(960)]: {\r\n backgroundColor: '#fff',\r\n },\r\n // padding: theme.spacing(3),\r\n transition: theme.transitions.create('margin', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n },\r\n main: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n position: 'absolute',\r\n top: '65px',\r\n width: '100%',\r\n // height: 'calc(100% - 65px)',\r\n },\r\n containerBody: {\r\n // flexGrow: 1,\r\n padding: theme.spacing(2),\r\n [theme.breakpoints.down('sm')]: {\r\n // paddingLeft: '0px',\r\n // paddingRight: '0px',\r\n padding: '0px',\r\n },\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n // height: '1500px',\r\n // position: 'relative',\r\n // height: 'auto',\r\n // minHeight: '100% !important',\r\n },\r\n drawerHeader: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n padding: theme.spacing(0, 1),\r\n // padding: (props: { isShowTab: boolean }) => {\r\n // if (props.isShowTab) {\r\n // return theme.spacing(7, 1)\r\n // } else {\r\n // return theme.spacing(0, 1)\r\n // }\r\n // },\r\n [theme.breakpoints.down('md')]: {\r\n minHeight: '64px',\r\n },\r\n // necessary for content to be below app bar\r\n ...theme.mixins.toolbar,\r\n justifyContent: 'flex-end',\r\n },\r\n}))\r\n\r\nexport default LayoutPublic\r\n","import { useSetRecoilState } from 'recoil'\r\n\r\nimport { loadingStore } from './useLoadingStore'\r\n\r\nconst useManageProjectAction = () => {\r\n const setLoadingStore = useSetRecoilState(loadingStore)\r\n\r\n const openLoading = () => {\r\n setLoadingStore((prevState) => ({\r\n ...prevState,\r\n isLoading: true,\r\n }))\r\n }\r\n\r\n const closeLoading = () => {\r\n setLoadingStore((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n }))\r\n }\r\n return { openLoading, closeLoading }\r\n}\r\n\r\nexport default useManageProjectAction\r\n","import { useRef, useEffect } from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\nimport useLoadingAction from './store/useLoadingAction'\r\nimport useLoadingStore from './store/useLoadingStore'\r\n\r\nconst useLoading = () => {\r\n const loadTiming = useRef()\r\n const loadingAction = useLoadingAction()\r\n const loadingStore = useLoadingStore()\r\n const location = useLocation()\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (loadTiming.current) {\r\n clearTimeout(loadTiming.current)\r\n loadTiming.current = null\r\n }\r\n }\r\n }, [])\r\n\r\n const loadingOpen = () => {\r\n document.getElementsByTagName('body')[0].style.cursor = 'wait'\r\n if (loadTiming.current) clearTimeout(loadTiming.current)\r\n if (!loadingStore.isLoading) {\r\n loadingAction.openLoading()\r\n }\r\n }\r\n\r\n const loadingClose = () => {\r\n const windowSplit = window.location.href.split('/manage-project')?.[1] === ''\r\n const isComing = location.pathname.indexOf('/manage-project/') > -1\r\n const curr = document.getElementsByTagName('body')[0].style.cursor\r\n\r\n if (windowSplit && isComing && curr === 'default') {\r\n return\r\n }\r\n\r\n document.getElementsByTagName('body')[0].style.cursor = 'default'\r\n loadTiming.current = setTimeout(() => {\r\n loadingAction.closeLoading()\r\n }, 1000)\r\n }\r\n\r\n const clearLoading = () => {\r\n document.getElementsByTagName('body')[0].style.cursor = 'default'\r\n loadingAction.closeLoading()\r\n }\r\n\r\n return {\r\n configLoading: { isShowLoading: loadingStore.isLoading },\r\n loadingOpen,\r\n loadingClose,\r\n clearLoading,\r\n }\r\n}\r\n\r\nexport default useLoading\r\n","import { useSetRecoilState } from 'recoil'\r\n\r\nimport { authenStore, PermissionFuncInfo } from './authenStore'\r\n\r\ntype ProfileParamType = {\r\n academicPositionID: number | null\r\n academicPositionName_en: string | null\r\n academicPositionName_th: string | null\r\n academicPositionOther: string | null\r\n email: string | null\r\n facultyID: number | null\r\n facultyName_en: string | null\r\n facultyName_th: string | null\r\n fax: string | null\r\n homePhone: string | null\r\n irb: number\r\n mobilePhone: string | null\r\n name_en: string\r\n name_th: string\r\n titleNameID: number | null\r\n titleNameOther: string | null\r\n titleName_en: string | null\r\n titleName_th: string | null\r\n userGroupId: number\r\n userGroupName_en: string\r\n userGroupName_th: string\r\n userId: number | null\r\n username: string\r\n image_path: string\r\n permission: Array\r\n isPhD: boolean | null\r\n only_name_en: string | null\r\n only_name_th: string | null\r\n isCunet: boolean | null\r\n titleNameOther_th: string | null\r\n titleNameOther_en: string | null\r\n academicPositionOther_th: string | null\r\n academicPositionOther_en: string | null\r\n}\r\n\r\nconst useAuthenAction = () => {\r\n const setAuthenStore = useSetRecoilState(authenStore)\r\n\r\n const setProfile = (value: ProfileParamType) => {\r\n setAuthenStore((prevState) => ({\r\n ...prevState,\r\n profile: {\r\n ...value,\r\n image_path: value.image_path ? value.image_path : null,\r\n },\r\n }))\r\n }\r\n\r\n const setImageProfile = (path: string) => {\r\n setAuthenStore((prevState) => ({\r\n ...prevState,\r\n profile: {\r\n ...prevState.profile,\r\n image_path: path,\r\n },\r\n }))\r\n }\r\n\r\n return {\r\n setProfile,\r\n setImageProfile,\r\n }\r\n}\r\n\r\nexport default useAuthenAction\r\n","import constSubmittedStep from './submittedStep'\r\nimport constSubmittedType from './submittedType'\r\n\r\nexport const pleaseSelectApproveStatus = {\r\n //ถ้าเปลี่ยนตรงนี้จะต้องเปลี่ยนที่ Service ด้วยใช้ชื่อตัวแปลไปค้นหาที่ service ได้เลย\r\n th: '{{---กรุณาเลือกผลการพิจารณา---}}',\r\n en: '{{---Please select ethic review result---}}',\r\n}\r\n\r\nexport const renderMode = {\r\n view: 'VIEW',\r\n edit: 'EDIT',\r\n}\r\n\r\nexport const menuTab = {\r\n //stepID = lut_submitted_step\r\n tab1: {\r\n nameTH: 'ตรวจสอบเอกสาร',\r\n nameEN: 'Inspect documents',\r\n id: 0,\r\n stepID: constSubmittedStep.verifyDoc,\r\n },\r\n tab1Chairman: {\r\n nameTH: 'รายละเอียดโครงการ',\r\n nameEN: 'Project detail',\r\n id: 0,\r\n stepID: constSubmittedStep.verifyDoc,\r\n },\r\n tab1Committee: {\r\n nameTH: 'รายละเอียดโครงการ',\r\n nameEN: 'Project detail',\r\n id: 0,\r\n stepID: constSubmittedStep.verifyDoc,\r\n },\r\n tab2: {\r\n nameTH: 'กำหนดประเภทโครงการและกรรมการ',\r\n nameEN: 'Define project type and assign committee',\r\n id: 1,\r\n stepID: constSubmittedStep.specifyProjectType,\r\n },\r\n tab2Chairman: {\r\n nameTH: 'กำหนดประเภทโครงการและกรรมการ',\r\n nameEN: 'Define project type and assign committee',\r\n id: 1,\r\n stepID: constSubmittedStep.specifyProjectType,\r\n },\r\n tab2Commitee: {\r\n nameTH: 'ประเภทโครงการและรายชื่อกรรมการ',\r\n nameEN: 'Project type and list of committees',\r\n id: 1,\r\n stepID: constSubmittedStep.specifyProjectType,\r\n },\r\n tab3: {\r\n nameTH: 'กำหนดขอชุดโครงการที่ต้องส่ง',\r\n nameEN: 'Specify number of copies of project documents',\r\n id: 2,\r\n stepID: constSubmittedStep.specifyAdditionalDoc,\r\n },\r\n tab4: {\r\n nameTH: 'ชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก',\r\n nameEN: \"Documents' project complete and Submit principal reviewer's comment\",\r\n id: 3,\r\n stepID: constSubmittedStep.specifySchedule,\r\n },\r\n tab4Chairman: {\r\n nameTH: 'ชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก',\r\n nameEN: \"Documents' project complete and Submit principal reviewer's comment\",\r\n id: 3,\r\n stepID: constSubmittedStep.specifySchedule,\r\n },\r\n tab5: {\r\n nameTH: 'บันทึกข้อคิดเห็นของกรรมการ',\r\n nameEN: \"Compose committees' comment\",\r\n id: 4,\r\n stepID: constSubmittedStep.commentary,\r\n },\r\n tab5Commitee: {\r\n nameTH: 'บันทึกข้อคิดเห็น',\r\n nameEN: 'Compose comment',\r\n id: 4,\r\n stepID: constSubmittedStep.commentary,\r\n },\r\n tab5Chairman: {\r\n nameTH: 'ข้อคิดเห็นของกรรมการ',\r\n nameEN: \"Compose committees' comment\",\r\n id: 4,\r\n stepID: constSubmittedStep.commentary,\r\n },\r\n tab6: {\r\n nameTH: 'สังเคราะห์/ลงความเห็น',\r\n nameEN: 'Synthesize comments',\r\n id: 5,\r\n stepID: constSubmittedStep.synthesis,\r\n },\r\n tab6Chairman: {\r\n nameTH: 'สังเคราะห์/ลงความเห็น',\r\n nameEN: 'Synthesize comments',\r\n id: 5,\r\n stepID: constSubmittedStep.synthesis,\r\n },\r\n tab7: {\r\n nameTH: 'ออกผลการพิจารณา',\r\n nameEN: 'Review result',\r\n id: 6,\r\n stepID: constSubmittedStep.synthesisReview,\r\n },\r\n tab8: {\r\n nameTH: 'ออกใบรับรอง',\r\n nameEN: 'Generate certificate',\r\n id: 7,\r\n stepID: constSubmittedStep.certification,\r\n },\r\n tab9: {\r\n nameTH: 'ลงนาม',\r\n nameEN: 'Sign',\r\n id: 8,\r\n stepID: constSubmittedStep.sign,\r\n },\r\n tab10: {\r\n nameTH: 'ลงนามแทน',\r\n nameEN: 'Sign on behalf of president and secretary',\r\n id: 9,\r\n stepID: constSubmittedStep.sign,\r\n },\r\n tab11: {\r\n nameTH: 'ออกใบบันทึกข้อความ',\r\n nameEN: 'Sign on behalf of president and secretary',\r\n id: 10,\r\n stepID: constSubmittedStep.memoMessage,\r\n },\r\n tabConfirmProjectWithdraw: {\r\n nameTH: 'รับทราบการถอน',\r\n nameEN: 'Confirm project withdraw',\r\n id: 11,\r\n stepID: constSubmittedStep.confirmProjectWithdraw,\r\n },\r\n\r\n //tab21 เป็นต้นไปจะเป็นของ researcher\r\n tab21: {\r\n nameTH: 'ยื่นเอกสารโครงการ',\r\n nameEN: `Submit project's document`,\r\n id: 21,\r\n stepID: constSubmittedStep.submit,\r\n },\r\n tab22: {\r\n nameTH: 'แจ้งขอชุดโครงการที่ต้องส่ง',\r\n nameEN: 'Inform number of copies of project documents',\r\n id: 22,\r\n stepID: 99,\r\n },\r\n tab23: {\r\n nameTH: 'ผลการพิจารณา',\r\n nameEN: 'Review result',\r\n id: 23,\r\n stepID: 99,\r\n },\r\n tab24: {\r\n nameTH: 'ใบรับรองและเอกสารประทับตรารับรอง',\r\n nameEN: 'Certificates and certified documents',\r\n id: 24,\r\n stepID: 99,\r\n },\r\n tab25: {\r\n nameTH: 'ยื่นเอกสารแก้ไข',\r\n nameEN: 'Submit revised document',\r\n id: 25,\r\n stepID: constSubmittedStep.submit,\r\n },\r\n tab26: {\r\n nameTH: 'ผลการพิจารณา (ครั้งก่อน)',\r\n nameEN: 'Previous review result',\r\n id: 26,\r\n stepID: 99,\r\n },\r\n tab12: {\r\n nameTH: 'สังเคราะห์/ลงความเห็น',\r\n nameEN: 'Post a comment',\r\n id: 5,\r\n stepID: constSubmittedStep.synthesis,\r\n },\r\n}\r\n\r\nexport const menuFolder = {\r\n folder1: {\r\n nameTH: 'ส่งพิจารณาครั้งแรก',\r\n id: 0,\r\n isLastProcess: true,\r\n },\r\n folder2: {\r\n nameTH: 'แก้ไขหลังพิจารณา',\r\n id: 1,\r\n isLastProcess: false,\r\n },\r\n folder3: {\r\n nameTH: 'ปิด / ยุติโครงการ',\r\n id: 2,\r\n isLastProcess: false,\r\n },\r\n}\r\n\r\nexport const submitTypeLut = [\r\n { id: '1', name: 'ปิด' },\r\n { id: '2', name: 'ยุติโครงการ' },\r\n]\r\n\r\nexport const statusColorConstant = {\r\n status1: {\r\n //ร่าง\r\n textColor: '#000000',\r\n backgroundColor: '#e0e0e0',\r\n submittedStatusColor: '#BEBEBE',\r\n statusID: 1,\r\n },\r\n status2: {\r\n //ส่งเรื่องแล้ว\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#F5E151',\r\n statusID: 2,\r\n },\r\n status3: {\r\n //รับเรื่องแล้ว\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#ffd18f',\r\n statusID: 3,\r\n },\r\n status4: {\r\n //กำหนดกรรมการแล้ว\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#EC8F14',\r\n statusID: 4,\r\n },\r\n status18: {\r\n //รอส่งผู้ทบทวน\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#ff5000',\r\n statusID: 18,\r\n },\r\n status5: {\r\n //รอสังเคราะห์ความเห็น\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#746CB0',\r\n statusID: 5,\r\n },\r\n status6: {\r\n //ดำเนินการทำใบรับรอง\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#4ab4f6',\r\n statusID: 6,\r\n },\r\n status7: {\r\n //รอลงนาม\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#5DABA7',\r\n statusID: 7,\r\n },\r\n status8: {\r\n //ดำเนินการเสร็จสมบูรณ์\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#76E4B7',\r\n statusID: 8,\r\n },\r\n status9: {\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#CB793A',\r\n statusID: 9,\r\n },\r\n status10: {\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#CB793A',\r\n statusID: 10,\r\n },\r\n status11: {\r\n //เอกสารไม่ครบหรือไม่ถูกต้อง\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#C1292E',\r\n statusID: 11,\r\n },\r\n status12: {\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#FF0000',\r\n statusID: 12,\r\n },\r\n status14: {\r\n //กำลังพิจารณา\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#9D7DB1',\r\n statusID: 14,\r\n },\r\n proceedingMemoMessage: {\r\n //ดำเนินการทำใบบันทึกข้อความ\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#2c7dcb',\r\n statusID: 15,\r\n },\r\n waitingEditProject: {\r\n //รอแก้ไขโครงการ\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#FFC300',\r\n statusID: 16,\r\n researcher: {\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#FFAC07',\r\n },\r\n },\r\n statusReject: {\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#ff0000',\r\n statusID: 4,\r\n },\r\n statusClose: {\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#4f2828',\r\n statusID: 3,\r\n },\r\n status15: {\r\n // กำลังดำเนินการ\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#FFAC07',\r\n statusID: 1,\r\n pendingBackgroundColor: '#8D8D8D',\r\n },\r\n resultOfConsideration: {\r\n //ดำเนินการออกผลพิจารณา\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#2d5983',\r\n statusID: 13,\r\n },\r\n noScope: {\r\n //ไม่เข้าข้าย\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#e57373',\r\n statusID: 5,\r\n },\r\n terminate: {\r\n //ยุติโครงการ\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#a8865d',\r\n statusID: 6,\r\n },\r\n withdraw: {\r\n //ถอนโครงการ\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#800000',\r\n statusID: 7,\r\n },\r\n status17: {\r\n //กำหนดกรรมการแล้ว\r\n textColor: '#FFFFFF',\r\n backgroundColor: '#ff9100',\r\n statusID: 17,\r\n },\r\n}\r\n\r\nexport const configCertificate = {\r\n descriptionIRB1: {\r\n id: 1,\r\n nameTH: 'คณะกรรมการพิจารณาจริยธรรมการวิจัยในคน กลุ่มสหสถาบัน ชุดที่ 1 จุฬาลงกรณ์มหาวิทยาลัย ได้พิจารณาโดยใช้หลักของ Belmont Report 1979, Declaration of Helsinki 2013, Council for International Organizations of Medical Sciences (CIOM) 2016, มาตรฐานคณะกรรมการจริยธรรมการวิจัยในคน (มคจค.) 2560, นโยบายแห่งชาติและแนวทางปฏิบัติการวิจัยในมนุษย์ 2558 อนุมัติให้ดำเนินการศึกษาวิจัยเรื่องดังกล่าวได้',\r\n nameEN: 'The Research Ethics Review Committee for Research Involving Human Research Participants, Group I, Chulalongkorn University, Thailand, has approved constituted in accordance with Belmont Report 1979, Declaration of Helsinki 2013, Council for International Organizations of Medical Sciences (CIOM) 2016, Standards of Research Ethics Committee (SREC) 2017, and National Policy and guidelines for Human Research 2015.',\r\n },\r\n descriptionIRB1Exempt: {\r\n id: 2,\r\n nameTH: 'โครงการวิจัยนี้ได้รับการยกเว้นการทบทวนจริยธรรมการวิจัยโดยใช้หลักของ Office for Human Research Protections (OHRP Exempt Categories) 45 CFR part 46.101(b) โดยมีเงื่อนไขว่าผู้วิจัยดำเนินการวิจัยอย่างเคร่งครัดตามที่ปรากฏในโครงการวิจัยฉบับที่ส่งให้คณะกรรมการฯ พิจารณา หากมีการเปลี่ยนแปลงต้องแจ้งคณะกรรมการฯ ก่อนมีการดำเนินการวิจัยต่อไป',\r\n nameEN: 'This Research proposal is exempted for ethics review in compliance with the Office for Human Research Protections (OHRP Exempt Categories) 45 CFR part 46.101(b). Certified under condition: To conduct this research project, the researcher (s) must strictly adhere to research proposal approved by the committee. If there is any amendment, it must be sent to the committee for review before carrying on the project.',\r\n },\r\n descriptionIRB2: {\r\n id: 3,\r\n nameTH: 'คณะกรรมการพิจารณาจริยธรรมการวิจัยในคน กลุ่มสหสถาบัน ชุดที่ 2 สังคมศาสตร์ มนุษยศาสตร์ และศิลปกรรมศาสตร์ จุฬาลงกรณ์มหาวิทยาลัย พิจารณาจริยธรรมการวิจัยโดยยึดหลัก ของ Declaration of Helsinki, the Belmont report, CIOMS guidelines และ The international conference on harmonization – Good clinical practice (ICH-GCP) อนุมัติให้ดำเนินการศึกษาวิจัยเรื่องดังกล่าวได้',\r\n nameEN: 'The Research Ethics Review Committee for Research Involving Human Subjects: The Second Allied Academic Group in Social Sciences, Humanities and Fine and Applied Arts at Chulalongkorn University, based on Declaration of Helsinki, the Belmont report, CIOMS guidelines and the Principle of the international conference on harmonization – Good clinical practice (ICH-GCP) has approved the execution of the aforementioned research project.',\r\n },\r\n conditionIRB1: {\r\n id: 4,\r\n nameTH: `1. ข้าพเจ้ารับทราบว่าเป็นการผิดจริยธรรม หากดำเนินการเก็บข้อมูลการวิจัยก่อนได้รับการอนุมัติจากคณะกรรมการพิจารณาจริยธรรมการวิจัยฯ\r\n2. หากใบรับรองโครงการวิจัยหมดอายุ การดำเนินการวิจัยต้องยุติ เมื่อต้องการต่ออายุต้องขออนุมัติใหม่ล่วงหน้าไม่ต่ำกว่า 1 เดือน พร้อมส่งรายงานความก้าวหน้าการวิจัย\r\n3. ต้องดำเนินการวิจัยตามที่ระบุไว้ในโครงการวิจัยอย่างเคร่งครัด\r\n4. ใช้เอกสารข้อมูลสำหรับกลุ่มประชากรหรือผู้มีส่วนร่วมในการวิจัย ใบยินยอมของกลุ่มประชากรหรือผู้มีส่วนร่วมในการวิจัย และเอกสารเชิญเข้าร่วมวิจัย (ถ้ามี) เฉพาะที่ประทับตราคณะกรรมการเท่านั้น\r\n5. หากเกิดเหตุการณ์ไม่พึงประสงค์ร้ายแรงในสถานที่เก็บข้อมูลที่ขออนุมัติจากคณะกรรมการ ต้องรายงานคณะกรรมการภายใน 5 วันทำการ\r\n6. หากมีการเปลี่ยนแปลงการดำเนินการวิจัย ให้ส่งคณะกรรมการพิจารณารับรองก่อนดำเนินการ\r\n7. หากยุติโครงการวิจัยก่อนกำหนดต้องแจ้งคณะกรรมการฯ ภายใน 2 สัปดาห์พร้อมคำชี้แจง\r\n8. โครงการวิจัยไม่เกิน 1 ปี ส่งแบบรายงานสิ้นสุดโครงการวิจัย (AF 01-15) และบทคัดย่อผลการวิจัยภายใน 30 วัน เมื่อโครงการวิจัยเสร็จสิ้น สำหรับโครงการวิจัยที่เป็นวิทยานิพนธ์ให้ส่งบทคัดย่อผลการวิจัย ภายใน 30 วัน เมื่อโครงการวิจัยเสร็จสิ้น\r\n9. โครงการวิจัยที่มีหลายระยะ จะรับรองโครงการเป็นระยะ เมื่อดำเนินการวิจัยในระยะแรกเสร็จสิ้นแล้ว ให้ดำเนินการส่งรายงานความก้าวหน้า พร้อมโครงการวิจัยและเอกสารที่เกี่ยวข้องในระยะถัดไป\r\n10. คณะกรรมการฯ สงวนสิทธิ์ในการตรวจเยี่ยมเพื่อติดตามการดำเนินการวิจัย\r\n11. สำหรับโครงการวิจัยจากภายนอก ผู้บริหารส่วนงาน กำกับการดำเนินการวิจัย`,\r\n nameEN: `The approved investigator must comply with the following conditions:\r\n1. It’s unethical to collect data of research participants before the project has been approved by the committee.\r\n2. The research/project activities must end on the approval expired date. To renew the approval, it can be applied one month prior to the expired date with submission of progress report.\r\n3. Strictly conduct the research/project activities as written in the proposal.\r\n4. Using only the documents that bearing the RECCU’s seal of approval: research tools, information sheet, consent form, invitation letter for research participation (if applicable).\r\n5. Report to the RECCU for any serious adverse events within 5 working days. \r\n6. Report to the RECCU for any amendment of the research project prior to conduct the research activities.\r\n7. Report to the RECCU for termination of the research project within 2 weeks with reasons.\r\n8. Final report (AF 01-15) and abstract is required for a one year (or less) research/project and report within 30 days after the completion of the research/project. \r\n9. Research project with several phases; approval will be approved phase by phase, progress report and relevant documents for the next phase must be submitted for review. \r\n10. The committee reserves the right to site visit to follow up how the research project being conducted.\r\n11. For external research proposal the dean or head of department oversees how the research being conducted.`,\r\n },\r\n conditionIRB1Exempt: {\r\n id: 5,\r\n nameTH: `โครงการวิจัยไม่เกิน 1 ปี ส่งแบบรายงานสิ้นสุดโครงการวิจัย (AF 01-15) และบทคัดย่อผลการวิจัยภายใน 30 วัน เมื่อโครงการวิจัยเสร็จสิ้น สำหรับโครงการวิจัยที่เป็นวิทยานิพนธ์ให้ส่งบทคัดย่อผลการวิจัย ภายใน 30 วัน เมื่อโครงการวิจัยเสร็จสิ้น`,\r\n nameEN: `Final report (AF 01-15) and abstract is required for a one year (or less) research/project and report within 30 days after the completion of the research/project.`,\r\n },\r\n conditionIRB2: {\r\n id: 6,\r\n nameTH: `1. ผู้วิจัยรับทราบว่าเป็นการผิดจริยธรรม หากดำเนินการเก็บข้อมูลการวิจัยก่อนได้รับการอนุมัติจากคณะกรรมการพิจารณาจริยธรรมการวิจัยฯ\r\n2. หากใบรับรองโครงการวิจัยหมดอายุ การดำเนินการวิจัยต้องยุติ เมื่อต้องการต่ออายุต้องขออนุมัติใหม่ล่วงหน้าไม่ต่ำกว่า 1 เดือน พร้อมส่งรายงานความก้าวหน้าการวิจัย\r\n3. ต้องดำเนินการวิจัยตามที่ระบุไว้ในโครงการวิจัยอย่างเคร่งครัด\r\n4. ใช้เอกสารข้อมูลสำหรับกลุ่มตัวอย่าง/ผู้มีส่วนร่วมในการวิจัย ใบยินยอมของกลุ่มตัวอย่างหรือผู้มีส่วนร่วมในการวิจัย และเอกสารเชิญเข้าร่วมวิจัย (ถ้ามี) เฉพาะที่ประทับตราคณะกรรมการเท่านั้น \r\n5. หากเกิดเหตุการณ์ไม่พึงประสงค์ร้ายแรงในสถานที่เก็บข้อมูลที่ขออนุมัติจากคณะกรรมการ ต้องรายงานคณะกรรมการภายใน 5 วันทำการ\r\n6. หากมีการเปลี่ยนแปลงการดำเนินการวิจัย ให้ส่งคณะกรรมการพิจารณารับรองก่อนดำเนินการ\r\n7. โครงการวิจัยไม่เกิน 1 ปี ส่งแบบรายงานสิ้นสุดโครงการวิจัย (AF 03-13) และบทคัดย่อผลการวิจัยภายใน 30 วัน เมื่อโครงการวิจัยเสร็จสิ้น สำหรับโครงการวิจัยที่เป็นวิทยานิพนธ์ให้ส่งบทคัดย่อผลการวิจัย ภายใน 30 วัน เมื่อโครงการวิจัยเสร็จสิ้น ทั้งนี้เพื่อเป็นหลักฐานในการปิดโครงการ\r\n8. โครงการวิจัยที่ได้รับการอนุมัติโครงการโดยการพิจารณาทบทวนแบบกรณียกเว้น (Exemption review) ปฏิบัติติตามเงื่อนไข ข้อ 1,6 และ 7 เท่านั้น`,\r\n nameEN: `1. The researcher has acknowledged that it is unethical if he/she collects information for the research before the application for an ethics review has been approved by the Research Ethics Review Committee.\r\n2. If the certificate of the research project expires, the research execution must come to a halt. If the researcher wishes to reapply for approval, he/she has to submit an application for a new certificate at least one month in advance, together with a research progress report.\r\n3. The researcher must conduct the research strictly in accordance with what is specified in the research project.\r\n4. The researcher must only use documents that provide information for the research sampling population/participants, their letters of consent and the letters inviting them to take part in the research (if any) that have been endorsed with the seal of the Committee. \r\n5. If any seriously untoward incident happens to the place where the research information, which has requested the approval of the Committee, is kept, the researcher must report this to the Committee within five working days.\r\n6. If there is any change in the research procedure, the researcher must submit the change for review by the Committee before he/she can continue with his/her research.\r\n7. For a research project of less than one year the researcher must submit a report of research termination (AF 03-13) and an abstract of the research outcome within thirty days of the research being completed. For a research project which is a thesis, the researcher must submit an abstract of the research outcome within thirty days of the research being completed. This is to be used as evidence of the termination of the project.\r\n8. A research project which has passed the Exemption Review, must observe only the conditions in 1, 6 and 7.`,\r\n },\r\n}\r\n\r\nexport const cerTopic = [\r\n {\r\n code: null,\r\n id: 0,\r\n name_en: 'Thai language',\r\n name_th: 'ภาษาไทย',\r\n },\r\n {\r\n code: null,\r\n id: 1,\r\n name_en: 'English language',\r\n name_th: 'ภาษาอังกฤษ',\r\n },\r\n]\r\n\r\nexport const memorandumTopic = [\r\n {\r\n code: null,\r\n id: 0,\r\n name_en: 'Thai language',\r\n name_th: 'ภาษาไทย',\r\n },\r\n {\r\n code: null,\r\n id: 1,\r\n name_en: 'English language',\r\n name_th: 'ภาษาอังกฤษ',\r\n },\r\n]\r\n\r\ntype CutomFolderType = {\r\n folderName_en: string\r\n folderName_th: string\r\n submittedID: number\r\n submittedStatusID: number\r\n id: number\r\n isLastProcess: boolean\r\n}\r\n\r\nexport const customFolder = {\r\n createProject: {\r\n nameTH: 'ส่งพิจารณาครั้งแรก',\r\n id: 0,\r\n isLastProcess: true,\r\n folderName_en: 'Submit for first consideration',\r\n folderName_th: 'ส่งพิจารณาครั้งแรก',\r\n submittedID: 0,\r\n submittedStatusID: 0,\r\n submittedTypeID: constSubmittedType.firstSubmitConsideration,\r\n },\r\n docAdditional: {\r\n folderName_en: 'Sent other types of documents',\r\n folderName_th: 'ยื่นเอกสารเพื่อพิจารณา',\r\n submittedID: -999,\r\n submittedStatusID: -999,\r\n id: -999,\r\n isLastProcess: false,\r\n submittedTypeID: -999,\r\n } as CutomFolderType,\r\n closeProject: {\r\n folderName_en: 'Close project',\r\n folderName_th: 'ปิดโครงการ',\r\n submittedID: -998,\r\n submittedStatusID: -998,\r\n id: -998,\r\n isLastProcess: false,\r\n submittedTypeID: constSubmittedType.closeProject,\r\n },\r\n projectPhase: {\r\n folderName_en: 'Project phase',\r\n folderName_th: 'โครงการระยะถัดไป',\r\n submittedID: -997,\r\n submittedStatusID: -997,\r\n id: -997,\r\n isLastProcess: false,\r\n submittedTypeID: constSubmittedType.nextPhaseProject,\r\n },\r\n projectAmendment: {\r\n folderName_en: 'Project amendment after approval',\r\n folderName_th: 'แก้ไขโครงการหลังได้รับอนุมัติ',\r\n submittedID: -996,\r\n submittedStatusID: -996,\r\n id: -996,\r\n isLastProcess: false,\r\n submittedTypeID: constSubmittedType.amendmentProject,\r\n },\r\n projectRenewal: {\r\n folderName_en: 'Project Renewal',\r\n folderName_th: 'ขอต่ออายุโครงการ',\r\n submittedID: -995,\r\n submittedStatusID: -995,\r\n id: -995,\r\n isLastProcess: false,\r\n submittedTypeID: constSubmittedType.renewalProject,\r\n },\r\n raeProject: {\r\n folderName_en: 'Reported a nonconformance',\r\n folderName_th: 'รายงานไม่เป็นไปตามข้อกำหนด',\r\n submittedID: -994,\r\n submittedStatusID: -994,\r\n id: -994,\r\n isLastProcess: false,\r\n submittedTypeID: constSubmittedType.nonconformance,\r\n } as CutomFolderType,\r\n terminateProject: {\r\n folderName_en: 'Terminate Project',\r\n folderName_th: 'ยุติโครงการ',\r\n submittedID: -993,\r\n submittedStatusID: -993,\r\n id: -993,\r\n isLastProcess: false,\r\n submittedTypeID: constSubmittedType.terminateProject,\r\n },\r\n adverseEvents: {\r\n folderName_en: 'Adverse events',\r\n folderName_th: 'รายงานเหตุการณ์ที่ไม่พึงประสงค์',\r\n submittedID: -992,\r\n submittedStatusID: -992,\r\n id: -992,\r\n isLastProcess: false,\r\n submittedTypeID: constSubmittedType.adverseEvent,\r\n },\r\n closeProjectByAdmin: {\r\n folderName_en: 'Request for close project (admin)',\r\n folderName_th: 'ขอปิดโครงการ (โดยเจ้าหน้าที่)',\r\n submittedID: -991,\r\n submittedStatusID: -991,\r\n id: -991,\r\n isLastProcess: false,\r\n submittedTypeID: constSubmittedType.closeProjectByAdmin,\r\n },\r\n terminateProjectByAdmin: {\r\n folderName_en: 'Request for terminate project (admin)',\r\n folderName_th: 'ขอยุติโครงการ (โดยเจ้าหน้าที่)',\r\n submittedID: -990,\r\n submittedStatusID: -990,\r\n id: -990,\r\n isLastProcess: false,\r\n submittedTypeID: constSubmittedType.terminateProjectByAdmin,\r\n },\r\n withdrawProject: {\r\n folderName_en: 'Project withdrawal (all projects)',\r\n folderName_th: 'ถอนโครงการ (การถอนทั้งโครงการ)',\r\n submittedID: -989,\r\n submittedStatusID: -989,\r\n id: -989,\r\n isLastProcess: false,\r\n submittedTypeID: constSubmittedType.withdrawalProject,\r\n },\r\n withdrawSubmitted: {\r\n folderName_en: 'Project withdrawal (Submitted)',\r\n folderName_th: 'ถอนโครงการ (การถอนเฉพาะครั้งนั้น)',\r\n submittedID: -988,\r\n submittedStatusID: -988,\r\n id: -988,\r\n isLastProcess: false,\r\n submittedTypeID: constSubmittedType.withdrawalSubmitted,\r\n },\r\n}\r\n\r\nexport const educationLevel = [\r\n {\r\n id: 1,\r\n name_th: 'ปริญญาตรี',\r\n name_en: 'Bachelor Degree',\r\n },\r\n {\r\n id: 2,\r\n name_th: 'ปริญญาโท',\r\n name_en: 'Masters Degree',\r\n },\r\n {\r\n id: 3,\r\n name_th: 'ปริญญาเอก',\r\n name_en: 'Doctoral Degree',\r\n },\r\n]\r\n\r\nexport const fileExt = {\r\n pdf: '.pdf',\r\n doc: '.doc',\r\n docx: '.docx',\r\n tiff: '.tiff',\r\n png: '.png',\r\n jpg: '.jpg',\r\n xlsx: '.xlsx',\r\n xls: '.xls',\r\n}\r\n\r\nexport const fileExtUploadFilelist = ['.pdf', '.doc', '.docx', '.tiff', '.png', '.jpg']\r\n\r\nexport const isTitleName = {\r\n dr: {\r\n nameTH: 'ดร.',\r\n nameEN: 'Dr.',\r\n value: 1,\r\n },\r\n}\r\n\r\nexport const topicForStudent = [\r\n {\r\n id: 7,\r\n name_th: 'เอกสารอนุมัติหัวข้อวิทยานิพนธ์ (สำหรับนิสิตระดับบัณฑิตศึกษา)',\r\n name_en: 'Thesis Title Approval Document',\r\n },\r\n {\r\n id: 10,\r\n name_th: 'บันทึกข้อความสำหรับโครงร่างวิทยานิพนธ์ (สำหรับนิสิตระดับบัณฑิตศึกษา)',\r\n name_en: 'A Cover Letter for Thesis Proposals',\r\n },\r\n {\r\n id: 16,\r\n name_th: 'เอกสารอนุมัติหัวข้อวิทยานิพนธ์ (สำหรับนิสิตระดับบัณฑิตศึกษา)',\r\n name_en: 'Thesis Title Approval Document',\r\n },\r\n {\r\n id: 23,\r\n name_th: 'สำเนาบทคัดย่อ (Abstract) (ที่มีการลงนามครบถ้วนสำหรับนิสิตระดับบัณฑิตศึกษา)',\r\n name_en: 'Abstract (Prepared by researcher)',\r\n },\r\n]\r\n\r\nexport const topicForLecturer = [\r\n {\r\n id: 29,\r\n name_th: 'บันทึกข้อความสำหรับข้อเสนอโครงการวิจัย (สำหรับอาจารย์/นักวิจัย)',\r\n name_en: 'A Cover Letter for Non-Thesis Research Projects',\r\n },\r\n]\r\nexport const topicIsExempt = [\r\n {\r\n id: 1,\r\n name_en: 'Suggestion / Notice',\r\n name_th: 'ข้อคิดเห็น / ข้อสังเกต',\r\n no: null,\r\n irb: null,\r\n },\r\n]\r\n\r\nexport const topicIsUploadComment = [\r\n {\r\n id: 1,\r\n no: null,\r\n name_en: 'Record the opinions of the main reviewer.',\r\n name_th: 'บันทึกความคิดเห็นของผู้ทบทวนหลัก',\r\n },\r\n]\r\n\r\nexport const fixPosition = [\r\n { id: '1', name: 'อาจารย์', shortName: 'อ.' },\r\n { id: '2', name: 'ผู้ช่วยศาสตราจารย์', shortName: 'ผศ.' },\r\n { id: '3', name: 'รองศาสตราจารย์', shortName: 'รศ.' },\r\n { id: '4', name: 'ศาสตราจารย์', shortName: 'ศ.' },\r\n { id: '5', name: 'ศาสตราจารย์กิตติคุณ', shortName: 'ศ.กิตติคุณ' },\r\n { id: '6', name: 'อื่นๆ', shortName: 'etc.' },\r\n { id: '7', name: 'ไม่ระบุ', shortName: '' },\r\n]\r\n","import { atom, useRecoilValue } from 'recoil'\r\nexport type FolderType = {\r\n id: number | null\r\n folderName_th: string | null\r\n folderName_en: string | null\r\n submittedID: number | null\r\n submittedStatusID?: number\r\n isLastProcess?: boolean\r\n submittedTypeID?: number\r\n}\r\nexport type TabSelectedType = {\r\n id: number | null\r\n nameTH: string | null\r\n nameEN: string | null\r\n stepID: number | null\r\n}\r\nexport type appFolderAndTabStoreType = {\r\n folderList: Array\r\n folderSelected: FolderType\r\n // folderRenderList: any[]\r\n tabSelected: TabSelectedType\r\n tabRenderList: TabRenderListType[]\r\n tabDirty: boolean\r\n tabIndexSelected: number | null\r\n callbackDirty?: (tabIndex?: number, newTabSelected?: TabSelectedType, isFolder?: boolean) => void\r\n}\r\nexport type TabRenderListType = { id: number; nameTH: string; nameEN: string; stepID: number }\r\nexport const appFolderAndTabStore = atom({\r\n key: 'appFolderAndTabStore',\r\n default: {\r\n folderList: [],\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n tabSelected: {\r\n id: null,\r\n nameTH: null,\r\n nameEN: null,\r\n stepID: null,\r\n },\r\n tabIndexSelected: 0,\r\n tabRenderList: [],\r\n tabDirty: false,\r\n callbackDirty: undefined,\r\n },\r\n})\r\n\r\nconst useAppFolderAndTabStore = () => {\r\n const appFolderAndTabState = useRecoilValue(appFolderAndTabStore)\r\n return {\r\n ...appFolderAndTabState,\r\n }\r\n}\r\n\r\nexport default useAppFolderAndTabStore\r\n","enum submittedStatus {\r\n draft = 1, //ร่าง\r\n sent = 2, //ส่งเรื่องแล้ว\r\n received = 3, //รับเรื่องแล้ว\r\n directorAssigned = 4, //กำหนดกรรมการแล้ว\r\n waitSynthesis = 5, //รอสังเคราะห์ความเห็น\r\n proceedingCertificate = 6, //ดำเนินการทำใบรับรอง\r\n waitSign = 7, //รอลงนาม\r\n complete = 8, //ดำเนินการเสร็จสมบูรณ์\r\n incorrectDocument = 11, //เอกสารไม่ครบหรือไม่ถูกต้อง, รอผู้วิจัยแก้ไขเอกสาร\r\n resultConsideration = 13, //ดำเนินการออกผลพิจารณา\r\n considering = 14, //กำลังพิจารณา\r\n ProceedingMemoMessage = 15, //ดำเนินการทำใบบันทึกข้อความ\r\n waitingEditProject = 16, //รอแก้ไขโครงการ\r\n waitingSetCopies = 17, //รอกำหนดชุดเอกสาร\r\n waitingSentReviewer = 18, //รอส่งผู้ทบทวน\r\n}\r\nexport default submittedStatus\r\n","import { useHistory } from 'react-router'\r\n// type x = {\r\n// sss: T\r\n// }\r\nconst useRouter = () => {\r\n const routerHistory = useHistory()\r\n const goTo = (routePath: string, parameter?: TParam) => {\r\n routerHistory.push(routePath, parameter)\r\n }\r\n return { goTo }\r\n}\r\n\r\nexport default useRouter\r\n","import 'moment/locale/th'\r\nimport moment, { Moment } from 'moment'\r\nimport { sortBy } from 'lodash'\r\nmoment.locale('en')\r\n\r\nexport const createDate = () => moment().set('hour', 0).set('minute', 0).set('second', 0).set('millisecond', 0).toDate()\r\n\r\nexport const resetTime = (date: string) =>\r\n moment(date).set('hour', 0).set('minute', 0).set('second', 0).set('millisecond', 0).toDate()\r\n\r\nexport const convertDateToDateString = (date: Moment, format = 'YYYY-MM-DD') => {\r\n if (date) return moment(date).format(format)\r\n}\r\n\r\nexport const convertDateToFormatTH = (date: string | Moment, format = 'DD MMM YYYY') => {\r\n moment.locale('th')\r\n let newDate = moment(date).add(543, 'year').format(format)\r\n\r\n // if (date) return moment(date).format(format)\r\n if (newDate) return newDate\r\n else return '-'\r\n}\r\nexport const convertDateToFormatEN = (date: string | Moment, format = 'DD MMM YYYY') => {\r\n moment.locale('en')\r\n let newDate = moment(date).format(format)\r\n if (newDate) return newDate\r\n else return '-'\r\n}\r\n\r\nexport const dateForAPI = (date?: string | Moment | null, withoutTime?: boolean) => {\r\n if (date) {\r\n if (withoutTime) {\r\n return moment(date).format('YYYY-MM-DD')\r\n }\r\n return moment(date).format('YYYY-MM-DD HH:mm:ss')\r\n }\r\n}\r\n\r\nexport const formatDateToString = (date: string[]) => {\r\n const sortDate = sortBy(date, (item) => new Date(item))\r\n let dateData: string[][] = []\r\n let i = 0\r\n\r\n sortDate.forEach((item, index) => {\r\n if (index === 0) {\r\n dateData[i] = [item]\r\n } else {\r\n const diff = moment(sortDate[index]).diff(moment(sortDate[index - 1]), 'days')\r\n if (diff === 1) {\r\n dateData[i] = [...dateData[i], item]\r\n } else {\r\n const y = i + 1\r\n dateData[y] = [item]\r\n i++\r\n }\r\n }\r\n })\r\n\r\n const arrDate = dateData.map((item) => {\r\n if (item.length > 1) {\r\n return `${moment(item[0]).format('DD')}-${moment(item[item.length - 1])\r\n .add(543, 'year')\r\n .format('DD MMM YYYY')}`\r\n } else {\r\n return `${moment(item[0]).add(543, 'year').format('DD MMM YYYY')}`\r\n }\r\n })\r\n\r\n return arrDate.toString().replace(/,/g, ', ')\r\n}\r\n\r\nexport const formatDateToString2 = (date: string[]) => {\r\n const sortedDate = date.sort()\r\n let dateMin = 0,\r\n dateCheck = parseInt(moment(sortedDate[0]).format('DD')), //เก็บวันที่ ณ ปัจจุบัน\r\n dateMax = 0,\r\n index = 0,\r\n dateStore: string[] = [],\r\n dateText = ''\r\n\r\n // เงื่อนไขถ้ามีการส่งวันที่เข้ามามากกว่า 1 วัน\r\n if (sortedDate.length > 1) {\r\n sortedDate.forEach((item, key) => {\r\n if (parseInt(moment(item).format('DD')) === dateCheck + 1) {\r\n dateCheck = parseInt(moment(item).format('DD'))\r\n dateMax = dateCheck\r\n if (key + 1 === sortedDate.length) {\r\n if (dateMin !== 0) {\r\n dateStore[index] = `${dateMin}-${dateMax} ${moment(sortedDate[0])\r\n .add(543, 'year')\r\n .format('MMM YYYY')}`\r\n index++\r\n } else {\r\n dateStore[index] = `${dateCheck} ${moment(item).add(543, 'year').format('MMM YYYY')}`\r\n index++\r\n }\r\n }\r\n } else {\r\n if (key === 0) {\r\n dateMin = parseInt(moment(item).format('DD'))\r\n dateCheck = dateMin\r\n } else if (dateMax !== 0) {\r\n dateStore[index] = `${dateMin}-${dateMax} ${moment(sortedDate[0])\r\n .add(543, 'year')\r\n .format('MMM YYYY')}`\r\n index++\r\n dateCheck = parseInt(moment(item).format('DD'))\r\n dateMax = 0\r\n dateMin = 0\r\n if (key + 1 === sortedDate.length) {\r\n dateStore[index] = `${dateCheck} ${moment(item).add(543, 'year').format('MMM YYYY')}`\r\n }\r\n } else if (dateMax === 0) {\r\n dateStore[index] = `${dateCheck} ${moment(item).add(543, 'year').format('MMM YYYY')}`\r\n index++\r\n dateMin = parseInt(moment(item).format('DD'))\r\n dateCheck = dateMin\r\n }\r\n }\r\n })\r\n dateStore.forEach((item, key) => {\r\n dateText += `${item}`\r\n if (key + 1 !== dateStore.length) {\r\n dateText += `, `\r\n }\r\n })\r\n return { dateCancel: dateText }\r\n } else {\r\n date.forEach((item) => {\r\n const date = parseInt(moment(item).format('DD'))\r\n return { dateCancel: `${date} ${moment(item).add(543, 'year').format('MMM YYYY')}` }\r\n })\r\n }\r\n}\r\n\r\nexport const addDays = (date: Date, days: number) => {\r\n let myDate = new Date(date)\r\n myDate.setDate(myDate.getDate() + days)\r\n return myDate\r\n}\r\n","import { requestWebServiceTypes, responseWebServiceTypes } from './types'\r\nimport * as webServiceURL from './webServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\nimport {\r\n PendingAndResumeType,\r\n SynthesisReviewProjectRequestType,\r\n UpdateProjectDetailType,\r\n} from './types/requestWebServiceTypes'\r\nimport useLoading from '../../control/loading/useLoading'\r\n\r\nconst useWebService = () => {\r\n const callApi = useCallApi()\r\n const loadingHook = useLoading()\r\n\r\n const example1 = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.example,\r\n })\r\n return data\r\n }\r\n const example2 = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.example,\r\n })\r\n return data\r\n }\r\n\r\n const createNewProject = async (params: requestWebServiceTypes.CreateProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.createProject,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const updateFileProject = async (params: requestWebServiceTypes.UpdateFileProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.updateFileProject,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const updateFileStamp = async (params: requestWebServiceTypes.UpdateFileStampRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.updateFileStamp,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const uploadFileTemp = async (params: FormData) => {\r\n try {\r\n loadingHook.loadingOpen()\r\n const { data } = await callApi.axiosPost({\r\n url: webServiceURL.uploadTemp,\r\n params: params,\r\n })\r\n return data\r\n } catch (err) {\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const getProjectByID = async (projectID: number, submittedID: number) => {\r\n const url = `${webServiceURL.getProjectByID}/${projectID}/${submittedID}`\r\n const { data } = await callApi.axiosGet({\r\n url: url,\r\n })\r\n return data\r\n }\r\n\r\n const verifyProject = async (params: requestWebServiceTypes.VerifyProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.verifyProject,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const verifyProjectAdverseEvent = async (params: requestWebServiceTypes.VerifyProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.verifyProjectAdverseEvent,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const verifyProjectRenewal = async (params: requestWebServiceTypes.VerifyProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.verifyProjectRenewal,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const verifyEditAfterReviewCloseProject = async (params: requestWebServiceTypes.VerifyProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.verifyEditAfterReviewCloseProject,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const verifyProjectTerminate = async (params: requestWebServiceTypes.VerifyProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.verifyProjectTerminate,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const specifyProjectType = async (params: requestWebServiceTypes.SpecifyProjectTypeRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.specifyProjectType,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const updSubmittedCommittee = async (params: requestWebServiceTypes.UpdSubmittedCommitteeType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.updSubmittedCommittee,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const searchTbl = async (params: requestWebServiceTypes.ListRequestType, userGroupID: string) => {\r\n const { data } = await callApi.axiosPost({\r\n url: webServiceURL.getListAll,\r\n params: { ...params, userGroupID },\r\n })\r\n return data\r\n }\r\n\r\n const deleteTempFile = async (params: requestWebServiceTypes.DeleteTempType) => {\r\n const { data } = await callApi.axiosPost({\r\n url: webServiceURL.deleteTemp,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const specifyReceiveDocumentDate = async (params: requestWebServiceTypes.SpecifyReceiveDocumentDateRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.specifyReceiveDocumentDate,\r\n params: params,\r\n })\r\n return data\r\n }\r\n const requestNumberOfDocument = async (params: requestWebServiceTypes.RequestNumberOfDocType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.requestNumberOfDocument,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const commentaryProject = async (params: requestWebServiceTypes.CommentaryProjectType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.commentaryProject,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getCommentaryProjectCommitteeByID = async (submittedID: number, committeeUserID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getCommentaryProjectCommitteeByID + `/${submittedID}/${committeeUserID}`,\r\n })\r\n return data\r\n }\r\n const getAllCommentaryProjectCommittee = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getAllCommentaryProjectCommittee + `/${submittedID}`,\r\n })\r\n return data\r\n }\r\n const checkAdvisorDueDate = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${webServiceURL.checkAdvisorDueDateByID}?submitedID=${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const getSynthesisReview = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getSynthesisReview + `/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const synthesisReviewApproveWithCommentProject = async (param: SynthesisReviewProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.synthesisReviewApproveWithCommentProject,\r\n params: param,\r\n })\r\n return data\r\n }\r\n const synthesisReviewProject = async (param: SynthesisReviewProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.synthesisReviewProject,\r\n params: param,\r\n })\r\n return data\r\n }\r\n\r\n const synthesisReviewProjectRenewal = async (param: SynthesisReviewProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.synthesisReviewProjectRenewal,\r\n params: param,\r\n })\r\n return data\r\n }\r\n\r\n const synthesisReviewCloseProject = async (param: SynthesisReviewProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.synthesisReviewCloseProject,\r\n params: param,\r\n })\r\n return data\r\n }\r\n\r\n const synthesisReviewTerminatedProject = async (param: SynthesisReviewProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.synthesisReviewTerminatedProject,\r\n params: param,\r\n })\r\n return data\r\n }\r\n\r\n const synthesisProject = async (params: requestWebServiceTypes.SynthesisProjectType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.synthesisProject,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getSynthesisProjectByID = async (submittedID: Number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getSynthesisProjectByID + `/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const getCertificateByID = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getCertificateByID + `/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const certificate = async (params: requestWebServiceTypes.CertificateType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.certificate,\r\n params: params,\r\n })\r\n return data\r\n }\r\n const updateLanguage = async (params: requestWebServiceTypes.LanguageParamsType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.languageUpdate,\r\n params,\r\n })\r\n return data\r\n }\r\n const updateCertificataData = async (params: requestWebServiceTypes.CertificateDataType) => {\r\n const result = await callApi.axiosPut({\r\n url: webServiceURL.updateCertificateData,\r\n params,\r\n })\r\n return { result }\r\n }\r\n const getSignCertificate = async (projectID: number, submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getSignCertificate + `/${projectID}/${submittedID}`,\r\n })\r\n return data\r\n }\r\n const getSignMemomessage = async (projectID: number, submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getSignMemomessage + `/${projectID}/${submittedID}`,\r\n })\r\n return data\r\n }\r\n const signCertificate = async (params: requestWebServiceTypes.SignCertificateType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.signCertificate,\r\n params: params,\r\n })\r\n return data\r\n }\r\n const signMemomessage = async (params: requestWebServiceTypes.SignMemomessageType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.signMemoMessage,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getProjectFolder = async (projectID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getProjectFolderByID + `/${projectID}`,\r\n })\r\n return data\r\n }\r\n\r\n const getFileHistory = async (fileID: number, fileReplaceID: number) => {\r\n const { data } = await callApi.axiosPost({\r\n url: webServiceURL.getFileHistory,\r\n params: {\r\n fileID,\r\n fileReplaceID\r\n },\r\n })\r\n return data\r\n }\r\n\r\n const projectApproveWithComment = async (params: requestWebServiceTypes.EditAfterReviewRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.projectApproveWithComment,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const closeProject = async (params: requestWebServiceTypes.CloseProject) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.closeProject,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const closeProjectByAdmin = async (params: requestWebServiceTypes.CloseProjectByAdmin) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.closeProjectByAdmin,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const closeProjectByAdminNew = async (params: requestWebServiceTypes.CloseProjectByAdminNew) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.closeProjectByAdmin,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const projectAmendmentManagement = async (params: requestWebServiceTypes.CreateProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n // url: 'http://localhost:8000/api/project/projectAmendmentManagement', //webServiceURL.projectAmendmentManagement,\r\n url: webServiceURL.projectAmendmentManagement,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const projectPhaseManagement = async (params: requestWebServiceTypes.ProjectPhaseRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.projectPhase,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const projectRenewalManagement = async (params: requestWebServiceTypes.ProjectRenewalRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.projectRenewal,\r\n params: params,\r\n })\r\n return data\r\n }\r\n const terminateProject = async (params: requestWebServiceTypes.CreateProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.terminateProject,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const terminateProjectByAdmin = async (params: requestWebServiceTypes.CreateProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.projectTerminateByAdmin,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const adverseEvent = async (params: requestWebServiceTypes.CreateProjectRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.projectAdverseEvent,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const reportedAdverseEvents = async (params: requestWebServiceTypes.ReportedAdverseEventsRequestType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.reportedAdverseEvents,\r\n params: params,\r\n })\r\n return data\r\n }\r\n const projectTerminateMemoMessage = async (params: requestWebServiceTypes.ProjectTerminateMemomessageType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.projectTerminateMemoMessage,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getProjectTerminateMemoMessage = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getProjectTerminateMemoMessage + `/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const getProjectNonconformanceMemoMessage = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getProjectNonconformanceMemoMessage + `/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const projectNonconformanceMemoMessage = async (\r\n params: requestWebServiceTypes.ProjectNonconformanceMemoMessageType,\r\n ) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.projectNonconformanceMemoMessage,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const closeProjectByAdminMemoMessage = async (\r\n params: requestWebServiceTypes.CloseProjectByAdminMemoMessageType,\r\n ) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.closeProjectByAdminMemoMessage,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getCloseProjectByAdminMemoMessage = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getCloseProjectbyAdminMemoMessage + `/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const projectAdverseEventMemoMessage = async (\r\n params: requestWebServiceTypes.ProjectAdverseEventMemomessageType,\r\n ) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.projectAdverseEventMemoMessage,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getProjectAdverseEventMemoMessage = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getProjectAdverseEventMemoMessage + `/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const projectAmendmentMemoMessage = async (params: requestWebServiceTypes.ProjectAmendmentMemomessageType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.projectAmendmentMemoMessage,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const projectNotPeopleMemoMessage = async (params: requestWebServiceTypes.ProjectNotPeopleMemoMessageType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.projectNotPeopleMemoMessage,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getProjectAmendmentMemoMessage = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getProjectAmendmentMemoMessage + `/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const getProjectNotPeopleMemoMessage = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getProjectNotPeopleMemoMessage + `/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const updateMemoMessagePaper = async (params: requestWebServiceTypes.UpdateMemoMessageType) => {\r\n const result = await callApi.axiosPut({\r\n url: webServiceURL.updateMemoMessage,\r\n params,\r\n })\r\n return { result }\r\n }\r\n\r\n const getCertificateCloseProject = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getCertificateCloseProject + `/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const certificateCloseProject = async (params: requestWebServiceTypes.CertificateCloseProjectType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.certificateCloseProject,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getNotificationInfo = async (userID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: webServiceURL.getNotificationInfo + `/${userID}`,\r\n })\r\n return data\r\n }\r\n\r\n const deleteNotificationInfo = async (notiID: number) => {\r\n const { data } = await callApi.axiosDelete({\r\n url: webServiceURL.deleteNotificationInfo + `/${notiID}`,\r\n })\r\n return data\r\n }\r\n\r\n const updateWatchedNotification = async (params: { notiID: number }) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.updateWatchedNotification,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getProjectPageUpdater = async (projectID: number, submittedID: number, stepID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${webServiceURL.getProjectPageUpdater}/${projectID}/${submittedID}/${stepID}`,\r\n })\r\n return data\r\n }\r\n\r\n const deleteProject = async (projectID: number) => {\r\n const { data } = await callApi.axiosDelete({\r\n url: `${webServiceURL.deleteProject}/${projectID}`,\r\n })\r\n return data\r\n }\r\n\r\n const saveProjectWithdraw = async (params: requestWebServiceTypes.SaveProjectWithdrawType) => {\r\n const { data } = await callApi.axiosPost({\r\n url: webServiceURL.saveProjectWithdraw,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const saveProjectWithdrawResubmit = async (params: requestWebServiceTypes.SaveProjectWithdrawType) => {\r\n const { data } = await callApi.axiosPost({\r\n url: webServiceURL.saveProjectWithdrawResubmit,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const saveVerifyProjectWithdraw = async (params: requestWebServiceTypes.SaveVerifyProjectWithdrawType) => {\r\n const { data } = await callApi.axiosPost({\r\n url: webServiceURL.saveVerifyProjectWithdraw,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const saveConfirmProjectWithdraw = async (params: requestWebServiceTypes.SaveConfirmProjectWithdraw) => {\r\n const { data } = await callApi.axiosPost({\r\n url: webServiceURL.saveConfirmProjectWithdraw,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getProjectWithdraw = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet<\r\n responseWebServiceTypes.ServiceResult\r\n >({\r\n url: `${webServiceURL.getProjectWithdraw}/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const updateProjectDetail = async (params: UpdateProjectDetailType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.updateProjectDetail,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const addPendingAndResume = async (params: PendingAndResumeType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: webServiceURL.addPendingAndResume,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getHistoryPendingAndResume = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${webServiceURL.getHistoryPendingAndResume}/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const updateProjectConsiderType = async (params: requestWebServiceTypes.UpdateProjectConsiderType) => {\r\n const response = await callApi.axiosPut({\r\n url: webServiceURL.updateProjectConsiderType,\r\n params: params,\r\n })\r\n return response\r\n }\r\n\r\n const updateProjectReviewer = async (params: requestWebServiceTypes.UpdateProjectReviewer) => {\r\n const response = await callApi.axiosPut({\r\n url: webServiceURL.updateProjectReviewer,\r\n params: params,\r\n })\r\n return response\r\n }\r\n\r\n const updateSynthesisApproveStatus = async (params: Partial) => {\r\n const response = await callApi.axiosPut({\r\n url: webServiceURL.updateSynthesisApproveStatus,\r\n params: params,\r\n })\r\n return response\r\n }\r\n\r\n const updateSynthesisCommentaryTopic = async (params: any) => {\r\n const response = await callApi.axiosPut({\r\n url: webServiceURL.updateSynthesisCommentaryTopic,\r\n params: params,\r\n })\r\n return response\r\n }\r\n\r\n const getConsiderTypeHistory = async (submittedId: number) => {\r\n const response = await callApi.axiosGet({\r\n url: `${webServiceURL.getConsiderTypeHistory}?submittedID=${submittedId}`,\r\n })\r\n return response\r\n }\r\n\r\n const submitAllCheckList = async (params: requestWebServiceTypes.CheckListCommentaryType) => {\r\n const response = await callApi.axiosPost({\r\n url: webServiceURL.checkListCommentary,\r\n params,\r\n })\r\n return response\r\n }\r\n\r\n const getHistoryCommentaryProjectCommittee = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${webServiceURL.getHistoryCommentaryProjectCommittee}/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const getHistorySynthesis = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${webServiceURL.getHistorySynthesis}/${submittedID}`,\r\n })\r\n return data\r\n }\r\n\r\n const submitOnlyDocReceiveDate = async (params: requestWebServiceTypes.SubmitOnlyDocumentReceiveDate) => {\r\n const { data } = await callApi.axiosPut>({\r\n url: webServiceURL.submitOnlyDocReceiveDate,\r\n params: params,\r\n })\r\n return data\r\n }\r\n\r\n const getUserHistoryUpload = async (fileID: number | null, userID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${webServiceURL.getHistoryUpload}/${fileID}/${userID}`,\r\n })\r\n return data\r\n }\r\n\r\n return {\r\n example1,\r\n example2,\r\n createNewProject,\r\n updateFileProject,\r\n updateFileStamp,\r\n uploadFileTemp,\r\n getProjectByID,\r\n verifyProject,\r\n specifyProjectType,\r\n searchTbl,\r\n deleteTempFile,\r\n specifyReceiveDocumentDate,\r\n requestNumberOfDocument,\r\n commentaryProject,\r\n getCommentaryProjectCommitteeByID,\r\n checkAdvisorDueDate,\r\n getSynthesisReview,\r\n synthesisReviewApproveWithCommentProject,\r\n synthesisReviewProject,\r\n synthesisProject,\r\n getSynthesisProjectByID,\r\n getCertificateByID,\r\n certificate,\r\n updateLanguage,\r\n signCertificate,\r\n getSignCertificate,\r\n getProjectFolder,\r\n projectApproveWithComment,\r\n closeProject,\r\n closeProjectByAdmin,\r\n projectAmendmentManagement,\r\n projectPhaseManagement,\r\n projectRenewalManagement,\r\n verifyProjectRenewal,\r\n reportedAdverseEvents,\r\n synthesisReviewProjectRenewal,\r\n terminateProject,\r\n verifyProjectTerminate,\r\n projectTerminateMemoMessage,\r\n getProjectTerminateMemoMessage,\r\n signMemomessage,\r\n adverseEvent,\r\n verifyProjectAdverseEvent,\r\n projectAdverseEventMemoMessage,\r\n getProjectAdverseEventMemoMessage,\r\n getSignMemomessage,\r\n getProjectNonconformanceMemoMessage,\r\n projectNonconformanceMemoMessage,\r\n projectAmendmentMemoMessage,\r\n projectNotPeopleMemoMessage,\r\n getProjectAmendmentMemoMessage,\r\n getProjectNotPeopleMemoMessage,\r\n getFileHistory,\r\n synthesisReviewCloseProject,\r\n getCertificateCloseProject,\r\n certificateCloseProject,\r\n verifyEditAfterReviewCloseProject,\r\n getNotificationInfo,\r\n deleteNotificationInfo,\r\n updateWatchedNotification,\r\n getAllCommentaryProjectCommittee,\r\n synthesisReviewTerminatedProject,\r\n terminateProjectByAdmin,\r\n closeProjectByAdminNew,\r\n closeProjectByAdminMemoMessage,\r\n getCloseProjectByAdminMemoMessage,\r\n getProjectPageUpdater,\r\n deleteProject,\r\n saveProjectWithdraw,\r\n saveProjectWithdrawResubmit,\r\n getProjectWithdraw,\r\n saveVerifyProjectWithdraw,\r\n saveConfirmProjectWithdraw,\r\n updSubmittedCommittee,\r\n updateProjectDetail,\r\n addPendingAndResume,\r\n updateCertificataData,\r\n getHistoryPendingAndResume,\r\n updateProjectConsiderType,\r\n updateMemoMessagePaper,\r\n updateProjectReviewer,\r\n updateSynthesisApproveStatus,\r\n updateSynthesisCommentaryTopic,\r\n getConsiderTypeHistory,\r\n submitAllCheckList,\r\n getHistoryCommentaryProjectCommittee,\r\n submitOnlyDocReceiveDate,\r\n getHistorySynthesis,\r\n getUserHistoryUpload,\r\n }\r\n}\r\n\r\nexport default useWebService\r\n","enum userGroup {\r\n researcher = 1,\r\n officer = 2,\r\n president = 3,\r\n reviewer = 4,\r\n committee = 5,\r\n vicePresident = 6,\r\n secretary = 7,\r\n systemAdmin = 8,\r\n}\r\nexport default userGroup\r\n","import { atom } from 'recoil'\r\nimport { useRecoilValue } from 'recoil'\r\nimport { defaultLanguage } from '../../i18n/i18n'\r\n\r\nexport const languageStore = atom({\r\n key: 'languageStore',\r\n default: {\r\n currentLanguage: defaultLanguage,\r\n },\r\n})\r\n\r\nconst useLanguageStore = () => {\r\n const languageState = useRecoilValue(languageStore)\r\n return {\r\n ...languageState,\r\n }\r\n}\r\n\r\nexport default useLanguageStore\r\n","import * as authenServiceURL from './authenServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\nimport useLoading from '../../control/loading/useLoading'\r\nimport { PermissionFuncInfo } from '../../stores/authen/authenStore'\r\n\r\nexport type LoginFormT = {\r\n type: string\r\n username: string\r\n password: string\r\n salt: string\r\n}\r\n\r\nexport type ProfileT = {\r\n academicPositionID: number\r\n academicPositionName_en: string\r\n academicPositionName_th: string\r\n academicPositionOther: string\r\n email: string\r\n facultyID: number\r\n facultyName_en: string\r\n facultyName_th: string\r\n fax: string\r\n homePhone: string\r\n irb: number\r\n mobilePhone: string\r\n name_en: string\r\n name_th: string\r\n titleNameID: number\r\n titleNameOther: string\r\n titleName_en: string\r\n titleName_th: string\r\n userGroupId: number\r\n userGroupName_en: string\r\n userGroupName_th: string\r\n userId: number\r\n username: string\r\n image_path: string\r\n imgUpload_th: string | null\r\n imgUpload_en: string | null\r\n permission: Array\r\n isPhD: boolean\r\n only_name_en: string | null\r\n only_name_th: string | null\r\n isCunet: boolean | null\r\n titleNameOther_th: string | null\r\n titleNameOther_en: string | null\r\n academicPositionOther_th: string | null\r\n academicPositionOther_en: string | null\r\n}\r\n\r\nconst useLogin = () => {\r\n const callApi = useCallApi()\r\n const loadingHook = useLoading()\r\n\r\n const post = async (values: LoginFormT) => {\r\n const { data } = await callApi.axiosPost({\r\n url: authenServiceURL.login,\r\n params: { ...values, type: Number(values.type) },\r\n })\r\n return data\r\n }\r\n\r\n const getProfile = async (token: string, loginType?: 1 | 2) => {\r\n let urlProfile = authenServiceURL.getProfile\r\n if (loginType) {\r\n urlProfile = `${urlProfile}/${loginType}`\r\n }\r\n const { data } = await callApi.axiosGet<{ result: ProfileT }>({\r\n url: urlProfile,\r\n token: token,\r\n })\r\n return data.result\r\n }\r\n\r\n return { post, getProfile }\r\n}\r\n\r\nexport default useLogin\r\n","import React from 'react'\r\nimport Button, { ButtonProps } from '@material-ui/core/Button'\r\n\r\nexport let ButtonView: React.FC = ({ ...other }) => {\r\n return \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n overflowY: 'scroll',\r\n },\r\n paper: {\r\n width: '100%',\r\n margin: '3rem 0px',\r\n padding: '2rem 0px',\r\n [theme.breakpoints.down('sm')]: {\r\n height: '100%',\r\n margin: '0px',\r\n },\r\n },\r\n}))\r\n\r\nexport default ModalPDPA\r\n","export const example = 'https://docker.geotalent.co.th/wfh-api-dev/api/lookup/reason'\r\nexport const test = `${process.env.REACT_APP_CU_IRB_API_URL}/xxxxxxxxxx`\r\nexport const createProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/NewProject`\r\nexport const updateFileProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/updateFileProject`\r\nexport const updateFileStamp = `${process.env.REACT_APP_CU_IRB_API_URL}/project/updateFileStamp`\r\nexport const uploadTemp = `${process.env.REACT_APP_CU_IRB_API_URL}/upload/upload-temp`\r\nexport const deleteTemp = `${process.env.REACT_APP_CU_IRB_API_URL}/upload/delete-temp`\r\nexport const getProjectByID = `${process.env.REACT_APP_CU_IRB_API_URL}/project/information`\r\nexport const verifyProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/verifyProject`\r\nexport const specifyProjectType = `${process.env.REACT_APP_CU_IRB_API_URL}/project/specifyProjectType`\r\nexport const getListAll = `${process.env.REACT_APP_CU_IRB_API_URL}/project/list`\r\nexport const specifyReceiveDocumentDate = `${process.env.REACT_APP_CU_IRB_API_URL}/project/specifyReceiveDocumentDate`\r\nexport const requestNumberOfDocument = `${process.env.REACT_APP_CU_IRB_API_URL}/project/requestNumberOfDocument`\r\nexport const commentaryProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/commentaryProject`\r\nexport const getCommentaryProjectCommitteeByID = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getCommentaryProjectCommitteeByID`\r\nexport const checkAdvisorDueDateByID = `${process.env.REACT_APP_CU_IRB_API_URL}/project/checkAdvisorDueDate`\r\nexport const getSynthesisReview = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getSynthesisReview` //https://gdev.geotalent.co.th/CU-IRB-API/api/project/getSynthesisReview/115\r\nexport const synthesisReviewProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/synthesisReviewProject`\r\nexport const synthesisReviewApproveWithCommentProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/synthesisReviewApproveWithComment`\r\nexport const synthesisProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/synthesisProject`\r\nexport const getSynthesisProjectByID = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getSynthesisProjectByID`\r\nexport const getCertificateByID = `${process.env.REACT_APP_CU_IRB_API_URL}/project/certificate`\r\nexport const certificate = `${process.env.REACT_APP_CU_IRB_API_URL}/project/certificate`\r\nexport const languageUpdate = `${process.env.REACT_APP_CU_IRB_API_URL}/project/updateLanguage`\r\nexport const updateCertificateData = `${process.env.REACT_APP_CU_IRB_API_URL}/project/update/beforeDataCertificate`\r\nexport const signCertificate = `${process.env.REACT_APP_CU_IRB_API_URL}/project/signCertificate`\r\nexport const getSignCertificate = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getSignCertificate`\r\nexport const getProjectFolderByID = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getProjectFolder`\r\nexport const getFileHistory = `${process.env.REACT_APP_CU_IRB_API_URL}/project/fileHistory`\r\nexport const projectApproveWithComment = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectApproveWithComment`\r\nexport const closeProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/closeProject`\r\nexport const closeProjectByAdmin = `${process.env.REACT_APP_CU_IRB_API_URL}/project/closeProjectByAdmin`\r\nexport const saveProjectWithdraw = `${process.env.REACT_APP_CU_IRB_API_URL}/project/submitDocumentProjectWithdraw`\r\nexport const saveProjectWithdrawResubmit = `${process.env.REACT_APP_CU_IRB_API_URL}/project/resubmitDocumentProjectWithdraw`\r\nexport const saveVerifyProjectWithdraw = `${process.env.REACT_APP_CU_IRB_API_URL}/project/verifyDocumentProjectWithdraw`\r\nexport const getProjectWithdraw = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getProjectWithdraw`\r\nexport const saveConfirmProjectWithdraw = `${process.env.REACT_APP_CU_IRB_API_URL}/project/confirmProjectWithdraw`\r\nexport const submitOnlyDocReceiveDate = `${process.env.REACT_APP_CU_IRB_API_URL}/project/submitOnlyDocumentReceiveDate`\r\n\r\nexport const projectPhase = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectPhaseManagement`\r\nexport const projectAmendmentManagement = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectAmendmentManagement`\r\nexport const projectRenewal = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectRenewalManagement`\r\nexport const verifyProjectRenewal = `${process.env.REACT_APP_CU_IRB_API_URL}/project/verifyProjectRenewal`\r\nexport const reportedAdverseEvents = `${process.env.REACT_APP_CU_IRB_API_URL}/project/reportedAdverseEvents`\r\nexport const synthesisReviewProjectRenewal = `${process.env.REACT_APP_CU_IRB_API_URL}/project/synthesisReviewProjectRenewal`\r\nexport const terminateProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectTerminate`\r\nexport const verifyProjectTerminate = `${process.env.REACT_APP_CU_IRB_API_URL}/project/verifyProjectTerminate`\r\nexport const projectTerminateMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectTerminateMemoMessage`\r\nexport const getProjectTerminateMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getProjectTerminateMemoMessage`\r\nexport const projectNonconformanceMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectNonconformanceMemoMessage`\r\nexport const getProjectNonconformanceMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getProjectNonconformanceMemoMessage`\r\nexport const signMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/signMemoMessage`\r\nexport const projectAdverseEvent = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectAdverseEvent`\r\nexport const verifyProjectAdverseEvent = `${process.env.REACT_APP_CU_IRB_API_URL}/project/verifyProjectAdverseEvent`\r\n\r\nexport const projectAdverseEventMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectAdverseEventMemoMessage`\r\nexport const getProjectAdverseEventMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getProjectAdverseEventMemoMessage`\r\nexport const getSignMemomessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getSignMemoMessage`\r\nexport const projectAmendmentMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectAmendmentMemoMessage`\r\nexport const projectNotPeopleMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectNotPeopleMemoMessage`\r\nexport const getProjectAmendmentMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getProjectAmendmentMemoMessage`\r\nexport const getProjectNotPeopleMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getProjectNotPeopleMemoMessage`\r\nexport const synthesisReviewCloseProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/synthesisReviewCloseProject`\r\nexport const synthesisReviewTerminatedProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/synthesisReviewTerminatedProject`\r\nexport const getCertificateCloseProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/certificateCloseProject`\r\nexport const certificateCloseProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/certificateCloseProject`\r\nexport const verifyEditAfterReviewCloseProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/verifyProjectClose`\r\nexport const updateMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/update/memoMessage`\r\n\r\nexport const getNotificationInfo = `${process.env.REACT_APP_CU_IRB_API_URL}/bot/getNotificationInfo`\r\nexport const deleteNotificationInfo = `${process.env.REACT_APP_CU_IRB_API_URL}/bot/deleteNotificationInfo`\r\nexport const updateWatchedNotification = `${process.env.REACT_APP_CU_IRB_API_URL}/bot/updateWatchedNotification`\r\nexport const getAllCommentaryProjectCommittee = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getAllCommentaryProjectCommittee`\r\nexport const projectTerminateByAdmin = `${process.env.REACT_APP_CU_IRB_API_URL}/project/projectTerminateByAdmin`\r\nexport const closeProjectByAdminMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/closeProjectbyAdminMemoMessage`\r\nexport const getCloseProjectbyAdminMemoMessage = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getCloseProjectbyAdminMemoMessage`\r\n\r\nexport const getProjectPageUpdater = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getLatestModify` ///project_id/submitted_id/step_id\r\nexport const deleteProject = `${process.env.REACT_APP_CU_IRB_API_URL}/project/project`\r\nexport const updSubmittedCommittee = `${process.env.REACT_APP_CU_IRB_API_URL}/project/updateSubmittedCommittee`\r\n\r\nexport const getVerifyDocumentHistory = `${process.env.REACT_APP_CU_IRB_API_URL}/project/historyDocument`\r\nexport const getCertificateByProjectId = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getCertificates`\r\nexport const updateProjectDetail = `${process.env.REACT_APP_CU_IRB_API_URL}/project/updateProject`\r\nexport const updateProjectConsiderType = `${process.env.REACT_APP_CU_IRB_API_URL}/project/updateConsiderType`\r\nexport const updateProjectReviewer = `${process.env.REACT_APP_CU_IRB_API_URL}/project/updateProjectReviewer`\r\nexport const updateSynthesisApproveStatus = `${process.env.REACT_APP_CU_IRB_API_URL}/project/update/synthesisApproveStatus`\r\nexport const updateSynthesisCommentaryTopic = `${process.env.REACT_APP_CU_IRB_API_URL}/project/update/synthesisCommentaryTopic`\r\nexport const addPendingAndResume = `${process.env.REACT_APP_CU_IRB_API_URL}/project/addPendingAndResume`\r\nexport const getHistoryPendingAndResume = `${process.env.REACT_APP_CU_IRB_API_URL}/project/historyPendingAndResume`\r\nexport const getConsiderTypeHistory = `${process.env.REACT_APP_CU_IRB_API_URL}/project/history/considerType`\r\n\r\nexport const checkListCommentary = `${process.env.REACT_APP_CU_IRB_API_URL}/checklist/checklist-commentary`\r\n\r\nexport const getHistoryCommentaryProjectCommittee = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getHistoryCommentaryProjectCommittee`\r\nexport const getHistorySynthesis = `${process.env.REACT_APP_CU_IRB_API_URL}/project/getHistorySynthesis`\r\nexport const getHistoryUpload = `${process.env.REACT_APP_CU_IRB_API_URL}/users/fileHistory`\r\n","//Lib\r\n\r\n//Constant\r\nimport languageKey from '../../../../i18n/languageKey'\r\n\r\n//Store & Action\r\n\r\n//External Type\r\nimport { LanguageType } from './language'\r\n\r\n//External Hook\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\n\r\nconst useLanguage = (props: LanguageType) => {\r\n //Store & Action\r\n\r\n //External Hook\r\n const translate = useTranslate()\r\n\r\n const handleClickEN = () => {\r\n if (translate.languageStore.currentLanguage !== languageKey.en) {\r\n translate.setChangeLanguage(languageKey.en)\r\n }\r\n }\r\n const handleClickTH = () => {\r\n if (translate.languageStore.currentLanguage !== languageKey.th) {\r\n translate.setChangeLanguage(languageKey.th)\r\n }\r\n }\r\n return {\r\n lang: translate.languageStore.currentLanguage,\r\n onClickEN: handleClickEN,\r\n onClickTH: handleClickTH,\r\n }\r\n}\r\n\r\nexport default useLanguage\r\n","import clsx from 'clsx'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { Grid } from '@material-ui/core'\r\nimport IconButton from '@material-ui/core/IconButton'\r\n\r\nimport languageKey from '../../../../i18n/languageKey'\r\nimport useLanguage from './useLanguage'\r\n\r\nexport type LanguageType = {}\r\nconst Language = (props: LanguageType) => {\r\n const classes = useStyles()\r\n const language = useLanguage(props)\r\n return (\r\n \r\n \r\n \r\n EN\r\n \r\n \r\n \r\n |\r\n \r\n \r\n \r\n TH\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default Language\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n highlight_lang: {\r\n color: theme.palette.primary.main,\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n","import { useSetRecoilState } from 'recoil'\r\nimport { languageStore } from './languageStore'\r\nconst useLanguageStoreFunction = () => {\r\n const setLanguage = useSetRecoilState(languageStore)\r\n\r\n const setCurrentLanguage = (key: string) => {\r\n setLanguage((prevState) => ({\r\n ...prevState,\r\n currentLanguage: key,\r\n }))\r\n }\r\n\r\n return {\r\n setCurrentLanguage,\r\n }\r\n}\r\n\r\nexport default useLanguageStoreFunction\r\n","import React from 'react'\r\nimport useLanguageStore from '../stores/language/languageStore'\r\nimport useLanguageStoreFunction from '../stores/language/languageAction'\r\nimport { useTranslation } from 'react-i18next'\r\nimport languageKey from './languageKey'\r\nconst useTranslate = () => {\r\n const { t, i18n } = useTranslation()\r\n const languageStore = useLanguageStore()\r\n const languageAction = useLanguageStoreFunction()\r\n\r\n const get = (key: string, replaceWords?: Array): string => {\r\n let resourcesWord = t(key)\r\n if (replaceWords !== undefined && replaceWords !== null) {\r\n replaceWords.forEach((text, index) => {\r\n resourcesWord = resourcesWord.replace('{' + index + '}', text)\r\n })\r\n }\r\n\r\n return resourcesWord\r\n }\r\n const get2Element = (key: string, replaceWords?: Array): HTMLElement => {\r\n let resourcesWord = t(key)\r\n if (replaceWords !== undefined && replaceWords !== null) {\r\n replaceWords.forEach((text, index) => {\r\n resourcesWord = resourcesWord.replace('{' + index + '}', text)\r\n })\r\n }\r\n const element = React.createElement('label', { dangerouslySetInnerHTML: { __html: resourcesWord } })\r\n //@ts-ignore\r\n return element\r\n }\r\n const setChangeLanguage = (languageKey: string) => {\r\n languageAction.setCurrentLanguage(languageKey)\r\n i18n.changeLanguage(languageKey)\r\n }\r\n return {\r\n //props\r\n languageStore,\r\n languageKey,\r\n\r\n //function\r\n get, //ใช้แสดง resource word\r\n get2Element,\r\n setChangeLanguage, //ใช้เปลี่ยน ภาษา\r\n }\r\n}\r\n\r\nexport default useTranslate\r\n","import CryptoJS from 'crypto-js'\r\nconst secretKey = 'secretKeyCUIRB@1234'\r\nconst encryption = (stringencrypt: string) => {\r\n // const secretKey = 'secretKeyCUIRB@1234'\r\n const encryptSecretKey = CryptoJS.SHA256(stringencrypt).toString()\r\n // CryptoJS.AES.encrypt(stringencrypt, secretKey).toString()\r\n return encryptSecretKey\r\n // var bytes = CryptoJS.AES.decrypt(encryptSecretKey, secretKey)\r\n // var originalText = bytes.toString(CryptoJS.enc.Utf8)\r\n}\r\n\r\nconst encryptionAES = (value: string) => {\r\n const ciphertext = CryptoJS.AES.encrypt(`${value}`, secretKey).toString()\r\n\r\n const replaceStr = replaceEncryptedStr(ciphertext)\r\n\r\n return replaceStr\r\n}\r\n\r\nconst decryptionAES = (cryptoInfo: string) => {\r\n const deReplaceCiphertextStr = replaceForDecryptStr(cryptoInfo)\r\n const decrypted = CryptoJS.AES.decrypt(deReplaceCiphertextStr, secretKey)\r\n if (decrypted) {\r\n try {\r\n const str = decrypted.toString(CryptoJS.enc.Utf8)\r\n if (str.length > 0) {\r\n return str\r\n } else {\r\n return 'error 1'\r\n }\r\n } catch (e) {\r\n return 'error 2'\r\n }\r\n }\r\n return 'error 3'\r\n}\r\n\r\nconst replaceEncryptedStr = (ciphertext: string) => {\r\n const replaceEncryptStr = ciphertext.toString().replaceAll('+', 'xMl3Jk').replaceAll('/', 'Por21Ld')\r\n return replaceEncryptStr\r\n}\r\n\r\nconst replaceForDecryptStr = (ciphertext: string) => {\r\n const replaceDecryptStr = ciphertext.toString().replaceAll('xMl3Jk', '+').replaceAll('Por21Ld', '/')\r\n return replaceDecryptStr\r\n}\r\n\r\nexport { encryption, encryptionAES, decryptionAES, replaceForDecryptStr }\r\n","import { useSetRecoilState } from 'recoil'\r\n\r\nimport { snackbarStore, SnackbarStoreType } from './snackbarStore'\r\n\r\nexport type TypeUserSnackbarAction = ReturnType\r\n\r\nconst useSnackbarAction = () => {\r\n const setSnackbarStore = useSetRecoilState(snackbarStore)\r\n\r\n const openSnackbar = (props?: Pick) => {\r\n setSnackbarStore((prevState) => ({\r\n ...prevState,\r\n isOpen: true,\r\n message: props?.message || '',\r\n type: props?.type || 'success',\r\n }))\r\n }\r\n const closeSnackbar = () => {\r\n setSnackbarStore((prevState) => ({\r\n ...prevState,\r\n isOpen: false,\r\n }))\r\n }\r\n\r\n return {\r\n openSnackbar,\r\n closeSnackbar,\r\n }\r\n}\r\n\r\nexport default useSnackbarAction\r\n","import i18n from 'i18next'\r\nimport { initReactI18next } from 'react-i18next'\r\nimport Backend from 'i18next-http-backend'\r\nimport languageKey from './languageKey'\r\n\r\nexport const defaultLanguage = languageKey.th\r\n\r\ni18n.use(initReactI18next)\r\n .use(Backend) // passes i18n down to react-i18next\r\n .init({\r\n fallbackLng: defaultLanguage === languageKey.th ? languageKey.en : languageKey.th,\r\n backend: {\r\n // for all available options read the backend's repository readme file\r\n loadPath: `${process.env.PUBLIC_URL}/language/{{lng}}.json`,\r\n },\r\n lng: defaultLanguage,\r\n interpolation: {\r\n escapeValue: false, // react already safes from xss\r\n },\r\n })\r\n\r\nexport default i18n\r\n","import { useRef } from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Container from '@material-ui/core/Container'\r\n\r\nimport { Paper, Typography } from '@material-ui/core'\r\n\r\nimport Form from '../component/authen/login/Form'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport LayoutPublic from '../component/web/layout/layoutPublic'\r\nimport { useLocation, useHistory } from 'react-router-dom'\r\nimport { useState } from 'react'\r\nimport useLogin, { LoginFormT, ProfileT } from '../services/authen/useLogin'\r\nimport authenAction from '../stores/authen/authenAction'\r\nimport { RoutePath, lstPrivateRoutes } from '../router/routesConfig'\r\nimport { encryption, replaceForDecryptStr } from '../utilities/encryption'\r\nimport usePDPA from '../services/authen/usePDPA'\r\nimport ModalPDPA from '../component/um/PDPA/ModalPDPA'\r\n\r\nimport useLoading from '../control/loading/useLoading'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport React from 'react'\r\nimport useAuthenService from '../services/authen/useAuthenService'\r\nimport { addDays } from '../utilities/date'\r\nimport { enc } from 'crypto-js'\r\nconst Login = () => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const location = useLocation()\r\n\r\n const loadingHook = useLoading()\r\n const autAction = authenAction()\r\n const authenService = useAuthenService()\r\n const accessTokenRef = useRef()\r\n const loginTypeRef = useRef()\r\n const profileRef = useRef()\r\n const [openPDPA, setOpenPDPA] = useState(false)\r\n const [PDPA, setPDPA] = useState('')\r\n\r\n const { post, getProfile } = useLogin()\r\n const { getByUser, accept } = usePDPA()\r\n\r\n const [displayPW, setDisplayPW] = useState(false)\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n\r\n React.useEffect(() => {\r\n // const now = new Date('')\r\n // console.log('now', now)\r\n\r\n // console.log('now.getTime()', now.getTime())\r\n\r\n // var timestamp = 1634025166199\r\n // var date = new Date(timestamp)\r\n // console.log(date.getTime())\r\n // console.log(date)\r\n\r\n // const expireDate = addDays(new Date(), 7)\r\n // console.log('expireDate', expireDate)\r\n\r\n // var date = new Date(expireDate.getTime())\r\n // console.log('timeStamp==>', expireDate.getTime())\r\n // console.log('myDate==>', date)\r\n checkIsLogined()\r\n }, [])\r\n\r\n const defaultOpenPage = (userPermission: ProfileT['permission']) => {\r\n if (userPermission.length > 0) {\r\n const functionID = userPermission[0].functionID\r\n let defaultRoutePath = ''\r\n lstPrivateRoutes.every((itm) => {\r\n if (itm.functionID === functionID) {\r\n defaultRoutePath = itm.path\r\n return false\r\n }\r\n return true\r\n })\r\n\r\n history.push(defaultRoutePath)\r\n } else {\r\n //No permision\r\n history.replace(RoutePath.login, null)\r\n }\r\n }\r\n\r\n const checkIsLogined = async () => {\r\n console.log('============Login.tsx===============')\r\n const accessToken = localStorage.getItem('accessToken')\r\n if (accessToken) {\r\n // const mockCurrentDate = new Date('October 21, 2021 11:13:00')\r\n const expireDate = localStorage.getItem('tokenExpireDate')\r\n const currentDate = new Date()\r\n\r\n if (expireDate && currentDate.getTime() > Number(expireDate)) {\r\n console.log('Token Has Expire')\r\n localStorage.clear()\r\n history.replace(RoutePath.login, null)\r\n } else {\r\n const loginType = localStorage.getItem('loginType')\r\n const profileRes = await getProfile(accessToken, loginType as unknown as 1 | 2)\r\n if (profileRes && profileRes.userId) {\r\n defaultOpenPage(profileRes.permission ?? [])\r\n } else {\r\n history.replace(RoutePath.login, null)\r\n }\r\n }\r\n }\r\n }\r\n\r\n const displayControl = () => {\r\n setDisplayPW(!displayPW)\r\n }\r\n\r\n const decodeDownloadLink = (encodedDownloadLink: string): any => {\r\n let downloadLink = ''\r\n try {\r\n const replacedDecryptStr = replaceForDecryptStr(encodedDownloadLink)\r\n const encodedWord = enc.Base64.parse(replacedDecryptStr)\r\n downloadLink = enc.Utf8.stringify(encodedWord)\r\n } catch (err) {\r\n console.log('err', err)\r\n }\r\n\r\n return downloadLink\r\n }\r\n\r\n const welcome = () => {\r\n if (profileRef.current && accessTokenRef.current) {\r\n const expireDate = addDays(new Date(), 7)\r\n localStorage.setItem('accessToken', accessTokenRef.current)\r\n localStorage.setItem('loginType', String(loginTypeRef.current))\r\n localStorage.setItem('tokenExpireDate', String(expireDate.getTime()))\r\n\r\n autAction.setProfile(profileRef.current)\r\n\r\n defaultOpenPage(profileRef.current?.permission ?? [])\r\n\r\n const urlParams = new URLSearchParams(location.search)\r\n const encodedDownloadLink = urlParams.get('download_link')\r\n\r\n if (encodedDownloadLink) {\r\n const downloadLink = decodeDownloadLink(encodedDownloadLink)\r\n window.location.assign(downloadLink)\r\n }\r\n }\r\n }\r\n\r\n const getUserProfile = async (token: string, loginType: 1 | 2) => {\r\n const profileRes = await getProfile(token, loginType)\r\n profileRef.current = profileRes\r\n loginTypeRef.current = String(loginType)\r\n\r\n checkPDPA(`${profileRes.userId}`)\r\n }\r\n\r\n const checkPDPA = async (userId: string) => {\r\n welcome()\r\n console.log('WAIT PDPA FOR OPEN COMMENT')\r\n //WAIT PDPA FOR OPEN COMMENT\r\n // const getPDPA = await getByUser(userId)\r\n // if (getPDPA.isCurrentVersion) {\r\n // welcome()\r\n // } else {\r\n // const template = lang === 'th' ? getPDPA.template_th : getPDPA.template_en\r\n // setOpenPDPA(true)\r\n // setPDPA(template)\r\n // }\r\n }\r\n\r\n const login = async (values: LoginFormT) => {\r\n try {\r\n loadingHook.loadingOpen()\r\n const loginType = Number(values.type) as 1 | 2\r\n const result = await post({\r\n ...values,\r\n password: encryption(values.password),\r\n salt: Buffer.from(values.password).toString('base64'),\r\n })\r\n if (result.message === 'incorrect') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('UM.LOGIN.INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n if (result.message === 'not permission') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('UM.LOGIN.NOT-PERMISSION'),\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n if (result.accessToken) {\r\n accessTokenRef.current = result.accessToken\r\n getUserProfile(result.accessToken, loginType)\r\n }\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const onClose = () => {\r\n setOpenPDPA(false)\r\n setPDPA('')\r\n }\r\n\r\n const onAccept = async () => {\r\n const result = await accept(`${profileRef.current?.userId}`)\r\n\r\n if (result.message === 'success') {\r\n welcome()\r\n }\r\n }\r\n\r\n const goToRegister = () => {\r\n history.push(RoutePath.register)\r\n }\r\n\r\n const goToForgotPW = () => {\r\n history.push(RoutePath.forgotPassword)\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const renderLogin = () => {\r\n const accessToken = localStorage.getItem('accessToken')\r\n if (accessToken) {\r\n return
\r\n } else {\r\n return (\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {translate.get('UM.LOGIN.HEADER')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n )\r\n }\r\n }\r\n\r\n return renderLogin()\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n rootContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n minHeight: 'calc(100vh - 96px)',\r\n [theme.breakpoints.down('sm')]: {\r\n margin: '0px',\r\n padding: '0px',\r\n },\r\n },\r\n root: {\r\n width: '100%',\r\n [theme.breakpoints.down('sm')]: {\r\n height: '100%',\r\n },\r\n },\r\n item: {\r\n [theme.breakpoints.down('sm')]: {\r\n height: '100%',\r\n },\r\n },\r\n paper: {\r\n width: '100%',\r\n // maxHeight: 'calc(100vh - 80px)',\r\n\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'transparent',\r\n boxShadow: 'none',\r\n },\r\n },\r\n container: {\r\n padding: '1.5rem',\r\n },\r\n typo: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default Login\r\n","import { useSetRecoilState } from 'recoil'\r\n\r\nimport { appAlertMessageStore } from './appAlertMessageStore'\r\n\r\ntype AlertMessageParamType = {\r\n title?: string\r\n message: string\r\n}\r\nconst useAlertMessageAction = () => {\r\n const setAppAlertMessageStore = useSetRecoilState(appAlertMessageStore)\r\n\r\n const openAlertMessage = (param: AlertMessageParamType) => {\r\n setAppAlertMessageStore((prevState) => ({\r\n ...prevState,\r\n isOpen: true,\r\n title: param.title ?? '',\r\n message: param.message,\r\n }))\r\n }\r\n const closeAlertMessage = () => {\r\n setAppAlertMessageStore((prevState) => ({\r\n ...prevState,\r\n isOpen: false,\r\n title: '',\r\n message: '',\r\n }))\r\n }\r\n\r\n return {\r\n openAlertMessage,\r\n closeAlertMessage,\r\n }\r\n}\r\n\r\nexport default useAlertMessageAction\r\n","import { FC } from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\n\r\nimport { Grid, Typography, IconButton, makeStyles, Button } from '@material-ui/core'\r\nimport Visibility from '@material-ui/icons/Visibility'\r\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\r\n\r\nimport Radio from '../../../control/radio/radio'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport { LoginFormT } from '../../../services/authen/useLogin'\r\n\r\ninterface FormProps {\r\n onSubmit: (values: LoginFormT) => void\r\n onClickDisplayControl: () => void\r\n onClickForgotPW: () => void\r\n onClickRegister: () => void\r\n displayPW: boolean\r\n}\r\nconst Form: FC = ({ onSubmit, onClickDisplayControl, onClickForgotPW, onClickRegister, displayPW }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n\r\n return (\r\n \r\n \r\n \r\n {translate.get('UM.LOGIN.TITLE')}\r\n \r\n \r\n\r\n \r\n \r\n {({ handleSubmit, form }) => {\r\n return (\r\n
\r\n \r\n \r\n \r\n {translate.get('UM.LOGIN.USER-STATUS')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n if (val) {\r\n const txtLogin = val.replace(/[ก-๙]|\\s/g, '')\r\n form.change('username', txtLogin)\r\n }\r\n }}\r\n required\r\n />\r\n \r\n \r\n \r\n {displayPW ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n handleValueChange={(val: string) => {\r\n if (val) {\r\n const txtLogin = val.replace(/[ก-๙]|\\s/g, '')\r\n form.change('password', txtLogin)\r\n }\r\n }}\r\n required\r\n />\r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.LOGIN.FORGOT-PASSWORD')}\r\n \r\n \r\n \r\n\r\n \r\n \r\n {translate.get('UM.LOGIN.LOGIN')}\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.LOGIN.DES_REGISTER')}\r\n \r\n \r\n {translate.get('UM.LOGIN.REGISTER')}\r\n \r\n {/* \r\n {translate.get('UM.LOGIN.FORGOT-PASSWORD')}\r\n */}\r\n \r\n \r\n \r\n
\r\n )\r\n }}\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n title: {\r\n margin: '16px 0px',\r\n },\r\n typo: {\r\n fontWeight: 'bold',\r\n },\r\n link: {\r\n color: '#0022FF',\r\n cursor: 'pointer',\r\n textDecoration: 'underline',\r\n },\r\n}))\r\n\r\nexport default Form\r\n","import { useState, useEffect, useRef } from 'react'\r\nimport { makeStyles, Grid, Paper, Container, Avatar } from '@material-ui/core'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport ConnectLineForm from '../component/um/line/ConnectLineForm'\r\nimport { encryption } from '../utilities/encryption'\r\nimport useLineLogin, { ConnectLineType } from '../services/um/useLineLogin'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport CheckIcon from '@material-ui/icons/Check'\r\ndeclare global {\r\n interface Window {\r\n liff: any\r\n }\r\n}\r\n\r\nconst liff = window.liff\r\n\r\nfunction ConnectLine() {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const [showPassword, setShowPassword] = useState(false)\r\n const { postLineLogin } = useLineLogin()\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n\r\n useEffect(() => {\r\n async function initLift() {\r\n await liff.init({ liffId: process.env.REACT_APP_LIFF_ID })\r\n }\r\n initLift()\r\n }, [])\r\n\r\n const onSubmit = async (value: ConnectLineType) => {\r\n const profile = await liff.getProfile()\r\n const result = await postLineLogin({\r\n username: value.username,\r\n password: encryption(value.password),\r\n salt: Buffer.from(value.password).toString('base64'),\r\n lineID: profile.userId,\r\n })\r\n\r\n if (result.message === 'incorrect') {\r\n setConfigDialog({\r\n title: '',\r\n content: `${translate.get('UM.LINE.MESSAGE.INCORRECT')}`,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n if (result.message === 'success') {\r\n setConfigDialog({\r\n title: '',\r\n content: `${translate.get('UM.LINE.MESSAGE.SUCCESS')}`,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n\r\n ///ปิด broweser\r\n liff.closeWindow()\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const onHandelShowPassword = () => {\r\n setShowPassword(!showPassword)\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n\r\n \r\n \r\n \r\n\r\n
\r\n {`${translate.get('UM.LINE.CONNECT_LINE_FORM.HEADER')}`}\r\n
\r\n\r\n
\r\n
\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n height: '100vh',\r\n },\r\n item: {\r\n [theme.breakpoints.up('md')]: {\r\n padding: '56px',\r\n },\r\n },\r\n container: {\r\n padding: '2rem',\r\n [theme.breakpoints.down('sm')]: {\r\n padding: '0',\r\n },\r\n },\r\n paper: {\r\n backgroundColor: '#F7F7F7',\r\n [theme.breakpoints.down('sm')]: {\r\n height: '100%',\r\n },\r\n },\r\n gridTypography: {\r\n padding: '16px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n margin: theme.spacing(0, 2),\r\n\r\n [theme.breakpoints.down('xs')]: {\r\n margin: theme.spacing(0),\r\n padding: '0',\r\n },\r\n },\r\n typography: {\r\n fontWeight: 'bold',\r\n color: '#1bb71f',\r\n fontFamily: 'prompt',\r\n fontSize: '30px',\r\n backgroundColor: '#F7F7F7',\r\n zIndex: 1,\r\n },\r\n typographyWrap: {\r\n width: 320,\r\n display: 'flex',\r\n position: 'relative',\r\n alignItems: 'center',\r\n margin: theme.spacing(3, 0),\r\n justifyContent: 'space-between',\r\n\r\n [theme.breakpoints.down('xs')]: {\r\n width: 150,\r\n },\r\n },\r\n imageTypography: {\r\n backgroundColor: '#F7F7F7',\r\n zIndex: 1,\r\n },\r\n checkIcon: {\r\n zIndex: 1,\r\n width: 24,\r\n height: 24,\r\n color: 'white',\r\n borderRadius: '50%',\r\n backgroundColor: '#db5f8e',\r\n },\r\n dash: {\r\n top: '50%',\r\n width: '100%',\r\n position: 'absolute',\r\n borderBottom: '3px dashed #db5f8e',\r\n },\r\n}))\r\n\r\nexport default ConnectLine\r\n","import { useState, useEffect } from 'react'\r\nimport { makeStyles, Grid, Typography, Paper, Button, IconButton } from '@material-ui/core'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport Visibility from '@material-ui/icons/Visibility'\r\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\r\nimport { ConnectLineType } from '../../../services/um/useLineLogin'\r\ninterface ConnectLineForm {\r\n onSubmit: (values: ConnectLineType) => void\r\n onHandelShowPassword: () => void\r\n showPassword: boolean\r\n}\r\n\r\nconst ConnectLineForm = ({ onSubmit, onHandelShowPassword, showPassword }: ConnectLineForm) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n return (\r\n \r\n \r\n \r\n {({ handleSubmit, form }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {showPassword ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n {'เข้าสู่ระบบ'}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: '16px',\r\n },\r\n loginButton: {\r\n backgroundColor: '#db5f8e',\r\n color: '#fff',\r\n border: '#db5f8e',\r\n },\r\n}))\r\n\r\nexport default ConnectLineForm\r\n","import useCallApi from '../../utilities/axios'\r\nimport { encryption } from '../../utilities/encryption'\r\nimport * as umServiceURL from './umServiceURL'\r\n\r\nexport type ConnectLineType = {\r\n username: string\r\n password: string\r\n salt: string\r\n lineID: string\r\n}\r\nconst useLineLogin = () => {\r\n const callApi = useCallApi()\r\n\r\n const postLineLogin = async (value: ConnectLineType) => {\r\n const { data } = await callApi.axiosPost({\r\n url: umServiceURL.postLineLogin,\r\n params: { ...value },\r\n })\r\n\r\n return data\r\n }\r\n\r\n return { postLineLogin }\r\n}\r\n\r\nexport default useLineLogin\r\n","import React from 'react'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport MuiTooltip, { TooltipProps } from '@material-ui/core/Tooltip'\r\nimport ClickAwayListener from '@material-ui/core/ClickAwayListener'\r\nimport * as BrowserDetect from '../../utilities/browserDetect'\r\n\r\ntype TooltipViewType = TooltipType & {\r\n open: boolean\r\n onTooltipOpen: () => void\r\n onClickTooltipClose: () => void\r\n}\r\n\r\nconst TooltipView: React.FC = (props) => {\r\n const { open, title, placement = 'bottom', onTooltipOpen, onClickTooltipClose } = props\r\n const isMobileTablet = BrowserDetect.mobileAndTabletCheck()\r\n const classes = useStyles()\r\n\r\n const mobileView = (\r\n \r\n \r\n {props.children}\r\n \r\n \r\n )\r\n\r\n const webView = (\r\n \r\n {props.children}\r\n \r\n )\r\n\r\n return (isMobileTablet && mobileView) || webView\r\n}\r\n\r\ntype TooltipType = {\r\n title: TooltipProps['title']\r\n placement?: TooltipProps['placement']\r\n}\r\nconst Tooltip: React.FC = (props) => {\r\n const [open, setOpen] = React.useState(false)\r\n\r\n const handleTooltipOpen = () => {\r\n setOpen(true)\r\n }\r\n const handleClickTooltipClose = () => {\r\n setOpen(false)\r\n }\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport default Tooltip\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n tooltip: {\r\n fontFamily: theme.typography.fontFamily,\r\n fontSize: '16px',\r\n boxShadow: 'rgb(0 0 0 / 35%) 0px 5px 15px',\r\n backgroundColor: 'white',\r\n color: theme.palette.text.primary,\r\n padding: '10px',\r\n },\r\n tooltip_arrow: {\r\n '&::before': {\r\n // boxShadow: 'rgb(0 0 0 / 35%) 0px 5px 15px',\r\n backgroundColor: 'white',\r\n },\r\n },\r\n}))\r\n","export const mobileCheck = function () {\r\n let check = false\r\n ;(function (a) {\r\n if (\r\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(\r\n a,\r\n ) ||\r\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(\r\n a.substr(0, 4),\r\n )\r\n )\r\n check = true\r\n //@ts-ignore\r\n })(navigator.userAgent || navigator.vendor || window.opera)\r\n return check\r\n}\r\n\r\nexport const mobileAndTabletCheck = () => {\r\n let check = false\r\n\r\n ;(function (a) {\r\n if (\r\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(\r\n a,\r\n ) ||\r\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(\r\n a.substr(0, 4),\r\n )\r\n )\r\n check = true\r\n //@ts-ignore\r\n })(navigator.userAgent || navigator.vendor || window.opera)\r\n return check\r\n}\r\n","import useAuthenStore from '../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore from '../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\n// --- Contants --- //\r\nimport {\r\n // menuFolder,\r\n menuTab,\r\n customFolder,\r\n} from '../constants/constants'\r\nimport constSubmittedStatus from '../constants/submittedStatus'\r\nimport constSubmittedType from '../constants/submittedType'\r\nimport constSubmittedStep from '../constants/submittedStep'\r\nimport constUserGroup from '../constants/userGroup'\r\n\r\nimport { GetProjectResultType } from '../services/web/types/responseWebServiceTypes'\r\nimport submittedType from '../constants/submittedType'\r\nimport submittedStatus from '../constants/submittedStatus'\r\nimport useCommentaryStore from '../stores/commentary/useCommentaryStore'\r\nimport useManageProjectStore from '../stores/manageProject/useManageProjectStore'\r\n\r\nexport enum FolderType {\r\n NewProject = 'ส่งพิจารณาครั้งแรก',\r\n EditAfterReview = 'แก้ไขหลังพิจารณา',\r\n CloseProject = 'ปิดโครงการ',\r\n}\r\ntype TabListType = {\r\n nameTH: string\r\n id: number\r\n stepID: number\r\n}\r\ntype GetTabFuncReturnType = {\r\n tabAdminList: TabListType[] | []\r\n tabResearcherList: TabListType[] | []\r\n tabChairmanList: TabListType[] | []\r\n tabCommitteeList: TabListType[] | []\r\n}\r\nconst useCheckPermission = () => {\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const authenStore = useAuthenStore()\r\n const { profile } = authenStore\r\n const commentaryStore = useCommentaryStore()\r\n const projectStore = useManageProjectStore()\r\n\r\n const irb = () => {\r\n return profile.irb \r\n }\r\n\r\n const isUserSystemAdmin = () => {\r\n //ผู้ดูแลระบบ\r\n const isPermission: boolean = profile.userGroupId === constUserGroup.systemAdmin\r\n return isPermission\r\n }\r\n\r\n const isUserAdmin = () => {\r\n //เจ้าหน้าที่\r\n const isPermission: boolean = profile.userGroupId === constUserGroup.officer\r\n return isPermission\r\n }\r\n const isUserChairman = () => {\r\n //ประธาน รอง เลขา และผู้ทบทวนเบื้องต้น\r\n const isPermission: boolean =\r\n profile.userGroupId === constUserGroup.president ||\r\n profile.userGroupId === constUserGroup.vicePresident ||\r\n profile.userGroupId === constUserGroup.secretary ||\r\n profile.userGroupId === constUserGroup.reviewer\r\n return isPermission\r\n }\r\n\r\n const isUserSecretary = () => {\r\n //เลขา\r\n const isPermission: boolean = profile.userGroupId === constUserGroup.secretary\r\n return isPermission\r\n }\r\n const isUserChairmanOnly = () => {\r\n //เลขา\r\n const isPermission: boolean =\r\n profile.userGroupId === constUserGroup.president || profile.userGroupId === constUserGroup.reviewer\r\n return isPermission\r\n }\r\n const isUserViceChairman = () => {\r\n //รองประธาน\r\n const isPermission: boolean = profile.userGroupId === constUserGroup.vicePresident\r\n return isPermission\r\n }\r\n\r\n const isUserCommittee = () => {\r\n //กรรมการ\r\n const isPermission: boolean = profile.userGroupId === constUserGroup.committee\r\n return isPermission\r\n }\r\n\r\n const isUserResearcher = () => {\r\n //นักวิจัย\r\n const isPermission: boolean = profile.userGroupId === constUserGroup.researcher\r\n return isPermission\r\n }\r\n\r\n const isCommitteeInProject = (lstCommitteeInProject: GetProjectResultType['committeeInfo']) => {\r\n let isValid = false\r\n const lstFilterCommittee = lstCommitteeInProject.filter((itm) => {\r\n return itm.userID === profile.userId\r\n })\r\n if (lstFilterCommittee.length > 0) {\r\n isValid = true\r\n }\r\n\r\n return isValid\r\n }\r\n\r\n const chkProjectStepViewMode = (projectData?: GetProjectResultType | null) => {\r\n const haveAboveSubmitted: boolean =\r\n projectData?.aroundSubmittedIDInfo.nextSubmittedID !== null &&\r\n projectData?.aroundSubmittedIDInfo.nextSubmittedID !== undefined\r\n const currentSelectTab = appFolderAndTabStore.tabSelected\r\n const currentFolderSelected = appFolderAndTabStore.folderSelected\r\n const stepID = projectData?.stepID\r\n const isProjectSuccess = projectData?.submittedStatusInfo?.value === 8\r\n const isNonconformance = projectData?.submitTypeInfo?.value === submittedType.nonconformance //รายงานไม่เป็นไปตามข้อกำหนด\r\n const terminateProjectByAdmin = projectData?.submitTypeInfo?.value === submittedType.terminateProjectByAdmin //ขอยุติโครงการ (โดยเจ้าหน้าที่)\r\n const isCloseProjectByAdmin = projectData?.submitTypeInfo?.value === submittedType.closeProjectByAdmin //รายงานไม่เป็นไปตามข้อกำหนด\r\n const isWithdrawProject = projectData?.submitTypeInfo?.value === submittedType.withdrawalProject\r\n const isWithdrawSubmitted = projectData?.submitTypeInfo?.value === submittedType.withdrawalSubmitted\r\n\r\n const projectCommitteeInfo = projectData?.committeeInfo ?? []\r\n const isWithdrawSubmitByAdmin = projectData?.isSubmitByAdmin && isWithdrawProject\r\n const isWaitResearcherEdit = projectData?.submittedStatusInfo?.value === submittedStatus.incorrectDocument\r\n\r\n // console.log(`projectData`, projectData)\r\n // console.log(`currentSelectTab`, currentSelectTab)\r\n let isViewMode = true\r\n switch (stepID) {\r\n case constSubmittedStep.submit:\r\n if (isUserResearcher()) {\r\n isViewMode = false\r\n } else if (\r\n isUserAdmin() &&\r\n (isNonconformance ||\r\n terminateProjectByAdmin ||\r\n isCloseProjectByAdmin ||\r\n isWithdrawProject ||\r\n isWithdrawSubmitted)\r\n ) {\r\n isViewMode = false\r\n }\r\n\r\n if (\r\n isUserResearcher() &&\r\n (terminateProjectByAdmin || isCloseProjectByAdmin || isNonconformance || isWithdrawSubmitByAdmin)\r\n ) {\r\n isViewMode = true\r\n }\r\n\r\n break\r\n\r\n case constSubmittedStep.verifyDoc:\r\n if (isUserAdmin()) {\r\n isViewMode = false\r\n }\r\n\r\n break\r\n\r\n case constSubmittedStep.specifyProjectType:\r\n if (isUserAdmin()) {\r\n isViewMode = false\r\n } else if (isUserChairman()) {\r\n isViewMode = false\r\n }\r\n break\r\n\r\n case constSubmittedStep.specifyAdditionalDoc:\r\n if (isUserAdmin()) {\r\n isViewMode = false\r\n }\r\n\r\n break\r\n case constSubmittedStep.specifySchedule:\r\n if (isUserAdmin()) {\r\n isViewMode = false\r\n }\r\n\r\n break\r\n case constSubmittedStep.commentary:\r\n if (isUserAdmin()) {\r\n isViewMode = false\r\n } else if (isUserCommittee()) {\r\n isViewMode = false\r\n } else if (isCommitteeInProject(projectCommitteeInfo)) {\r\n isViewMode = false\r\n }\r\n\r\n break\r\n\r\n case constSubmittedStep.synthesis:\r\n if (isUserAdmin()) {\r\n isViewMode = false\r\n } else if (isUserChairman()) {\r\n isViewMode = false\r\n }\r\n break\r\n\r\n case constSubmittedStep.synthesisReview:\r\n if (isUserAdmin()) {\r\n isViewMode = false\r\n }\r\n\r\n break\r\n case constSubmittedStep.certification:\r\n if (isUserAdmin()) {\r\n isViewMode = false\r\n }\r\n\r\n break\r\n case constSubmittedStep.sign:\r\n //รองประธานจะไม่เห็น\r\n if (isUserAdmin()) {\r\n isViewMode = false\r\n } else if (isUserChairman()) {\r\n isViewMode = false\r\n if (isUserViceChairman()) {\r\n isViewMode = false\r\n }\r\n }\r\n break\r\n case constSubmittedStep.memoMessage:\r\n //รองประธานจะไม่เห็น\r\n if (isUserAdmin()) {\r\n isViewMode = false\r\n } else {\r\n isViewMode = true\r\n }\r\n break\r\n case constSubmittedStep.confirmProjectWithdraw:\r\n if (isUserChairman() || isUserAdmin()) {\r\n //แก็งผู้บริหาร หรือเจ้าหน้าที่สามารถกดปุ่มถอนเพิ่อรับทราบการถอนได้\r\n isViewMode = false\r\n }\r\n break\r\n default:\r\n if (isUserResearcher()) {\r\n isViewMode = false\r\n }\r\n break\r\n }\r\n\r\n if (stepID) {\r\n const findCommentary = projectData?.committeeCommentary?.find(\r\n (data) => data.committeeUserID === commentaryStore.selectedCommitteeID,\r\n )\r\n if (currentSelectTab?.stepID !== stepID) {\r\n isViewMode = true\r\n }\r\n if (\r\n stepID === constSubmittedStep.synthesis &&\r\n currentSelectTab?.stepID === constSubmittedStep.commentary &&\r\n findCommentary &&\r\n findCommentary.isDraftCommentary === true\r\n ) {\r\n isViewMode = false\r\n }\r\n }\r\n\r\n if (isProjectSuccess) {\r\n //project ดำเนินการเสร็จสมบูรณ์แล้ว\r\n if (\r\n currentFolderSelected.id === customFolder.projectAmendment.id ||\r\n currentFolderSelected.id === customFolder.projectPhase.id ||\r\n currentFolderSelected.id === customFolder.projectRenewal.id ||\r\n currentFolderSelected.id === customFolder.raeProject.id ||\r\n currentFolderSelected.id === customFolder.terminateProject.id ||\r\n currentFolderSelected.id === customFolder.adverseEvents.id ||\r\n currentFolderSelected.id === customFolder.closeProject.id ||\r\n currentFolderSelected.id === customFolder.closeProjectByAdmin.id ||\r\n currentFolderSelected.id === customFolder.terminateProjectByAdmin.id ||\r\n currentFolderSelected.id === customFolder.withdrawProject.id ||\r\n currentFolderSelected.id === customFolder.withdrawSubmitted.id\r\n ) {\r\n //#1 กรณีที่เป็น custom folder จากฝั่ง front จะเข้า if นี้ก็คือ จะให้เป็นmode edit\r\n //#2 สาเหตุที่มาเช็คอยู่ภายใต้ if project ดำเนินการเสร็จสมบูรณ์แล้ว เนื่องจาก โครงการที่จะสามารถกดเพิ่ม custom folder ได้จะเป็นโครงการที่ต้องดำเนินการเสร็จสมบูรณืแล้ว\r\n isViewMode = false\r\n } else {\r\n isViewMode = true\r\n }\r\n }\r\n\r\n if (haveAboveSubmitted) {\r\n //ถ้ามี Folder อยู่ข้างบนตัวมัน มันจะกลายเป็น View Mode\r\n isViewMode = true\r\n }\r\n\r\n if (!isUserResearcher() && isWaitResearcherEdit) {\r\n // if (!isUserResearcher() && isWaitResearcherEdit && !isUserAdmin()) {\r\n //ถ้าสถานะเป็นรอผู้วิจัยแก้ไขเอกสาร\r\n isViewMode = false\r\n }\r\n\r\n return isViewMode\r\n }\r\n\r\n const isEditAfterReview = (submittedTypeID?: number) => {\r\n const isValid: boolean =\r\n submittedTypeID === constSubmittedType.editAfterReview ||\r\n submittedTypeID === constSubmittedType.exitAfterReview_AmendmentProject ||\r\n submittedTypeID === constSubmittedType.editAfterReview_nextPhaseProject ||\r\n submittedTypeID === constSubmittedType.editAfterReview_closeProject ||\r\n submittedTypeID === constSubmittedType.editAfterReview_terminateProject ||\r\n submittedTypeID === constSubmittedType.editAfterReview_renewalProject\r\n return isValid\r\n }\r\n\r\n const isCloseProject = (submittedTypeID?: number) => {\r\n const isValid: boolean = submittedTypeID === constSubmittedType.closeProject\r\n return isValid\r\n }\r\n\r\n const getTabListFunc = (selectedFolder?: any, projectData?: GetProjectResultType): GetTabFuncReturnType => {\r\n const stepID = projectData?.stepID\r\n const committeeInProject = projectData?.committeeInfo ?? []\r\n const submitTypeID = projectData?.submitTypeInfo?.value\r\n const submittedStatusID = projectData?.submittedStatusInfo?.value\r\n const isFlowApproveWithComment = projectData?.isFlowApproveWithComment ?? false\r\n const isProjectNotAboutPeople = projectData?.isNotAboutPeople ?? false\r\n let isNeedEditForm = projectData?.isNeedEditForm\r\n if (projectData?.isNeedEditForm === undefined || projectData?.isNeedEditForm === null) {\r\n isNeedEditForm = true\r\n }\r\n\r\n let tabAdminList: TabListType[] = []\r\n let tabResearcherList: TabListType[] = []\r\n let tabChairmanList: TabListType[] = []\r\n let tabCommitteeList: TabListType[] = []\r\n switch (stepID) {\r\n case constSubmittedStep.submit:\r\n tabAdminList = [menuTab.tab1]\r\n tabChairmanList = [menuTab.tab1Chairman]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21]\r\n // if (selectedFolder.folderName_th.indexOf(FolderType.EditAfterReview) !== -1) {\r\n // //@ts-ignore\r\n // if (isFlowApproveWithComment) {\r\n // tabAdminList = [menuTab.tab26, menuTab.tab1]\r\n // tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n // tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n // tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n // } else if (submitTypeID === submittedType.editAfterReview.id) {\r\n // //แก้ไขหลังพิจารณา\r\n // tabResearcherList = [menuTab.tab26, menuTab.tab25]\r\n // tabAdminList = [menuTab.tab26, menuTab.tab1]\r\n // tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n // tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n // }\r\n // }\r\n if (isFlowApproveWithComment) {\r\n tabAdminList = [menuTab.tab26, menuTab.tab1]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n } else if (isEditAfterReview(submitTypeID)) {\r\n //แก้ไขหลังพิจารณา\r\n tabResearcherList = [menuTab.tab26, menuTab.tab25]\r\n tabAdminList = [menuTab.tab26, menuTab.tab1]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n }\r\n\r\n if (submitTypeID === constSubmittedType.nonconformance) {\r\n tabAdminList = [menuTab.tab21]\r\n }\r\n\r\n if (\r\n submitTypeID === constSubmittedType.terminateProjectByAdmin ||\r\n submitTypeID === constSubmittedType.closeProjectByAdmin\r\n ) {\r\n tabAdminList = [menuTab.tab21]\r\n tabResearcherList = []\r\n }\r\n\r\n break\r\n\r\n case constSubmittedStep.verifyDoc:\r\n tabAdminList = [menuTab.tab1]\r\n tabChairmanList = [menuTab.tab1Chairman]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21]\r\n\r\n // if (selectedFolder.folderName_th.indexOf(FolderType.EditAfterReview) !== -1) {\r\n // //@ts-ignore\r\n // if (isFlowApproveWithComment) {\r\n // tabAdminList = [menuTab.tab26, menuTab.tab1]\r\n // tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n // tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n // tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n // } else if (submitTypeID === submittedType.editAfterReview.id) {\r\n // //แก้ไขหลังพิจารณา\r\n // tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n // tabAdminList = [menuTab.tab26, menuTab.tab1]\r\n // tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n // tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n // }\r\n // }\r\n if (isFlowApproveWithComment) {\r\n tabAdminList = [menuTab.tab26, menuTab.tab1]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n } else if (isEditAfterReview(submitTypeID)) {\r\n //แก้ไขหลังพิจารณา\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n tabAdminList = [menuTab.tab26, menuTab.tab1]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n }\r\n break\r\n\r\n case constSubmittedStep.specifyProjectType:\r\n tabAdminList = [menuTab.tab1, menuTab.tab2]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab2Chairman]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21]\r\n // if (selectedFolder.folderName_th.indexOf(FolderType.EditAfterReview) !== -1) {\r\n // //@ts-ignore\r\n // if (submitTypeID === submittedType.editAfterReview.id) {\r\n // //แก้ไขหลังพิจารณา\r\n // tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n // tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab2]\r\n // tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n // tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab2Chairman]\r\n // }\r\n // }\r\n //@ts-ignore\r\n if (isEditAfterReview(submitTypeID)) {\r\n //แก้ไขหลังพิจารณา\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab2]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab2Chairman]\r\n }\r\n break\r\n\r\n case constSubmittedStep.specifyAdditionalDoc:\r\n tabAdminList = [menuTab.tab1, menuTab.tab2, menuTab.tab3]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab2Chairman]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee]\r\n tabResearcherList = [menuTab.tab21]\r\n\r\n // if (selectedFolder.folderName_th.indexOf(FolderType.EditAfterReview) !== -1) {\r\n // //@ts-ignore\r\n // if (submitTypeID === submittedType.editAfterReview.id) {\r\n // //แก้ไขหลังพิจารณา\r\n // tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n // tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab2, menuTab.tab3]\r\n // tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee, menuTab.tab2Commitee]\r\n // tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab2Chairman]\r\n // }\r\n // }\r\n //@ts-ignore\r\n if (isEditAfterReview(submitTypeID)) {\r\n //แก้ไขหลังพิจารณา\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab2, menuTab.tab3]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee, menuTab.tab2Commitee]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab2Chairman]\r\n }\r\n\r\n break\r\n case constSubmittedStep.specifySchedule:\r\n tabAdminList = [menuTab.tab1, menuTab.tab2, menuTab.tab3, menuTab.tab4]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab2Chairman]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22]\r\n\r\n // if (selectedFolder.folderName_th.indexOf(FolderType.EditAfterReview) !== -1) {\r\n // //@ts-ignore\r\n // if (submitTypeID === submittedType.editAfterReview.id) {\r\n // //แก้ไขหลังพิจารณา\r\n // tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22]\r\n // tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab2, menuTab.tab3, menuTab.tab4]\r\n // tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee, menuTab.tab2Commitee]\r\n // tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab2Chairman]\r\n // }\r\n // }\r\n //@ts-ignore\r\n if (isEditAfterReview(submitTypeID)) {\r\n //แก้ไขหลังพิจารณา\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22]\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab2, menuTab.tab3, menuTab.tab4]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee, menuTab.tab2Commitee]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab2Chairman]\r\n }\r\n\r\n break\r\n case constSubmittedStep.commentary:\r\n tabAdminList = [menuTab.tab1, menuTab.tab2, menuTab.tab3, menuTab.tab4, menuTab.tab5]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab2Chairman, menuTab.tab4Chairman]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee, menuTab.tab5Commitee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22]\r\n\r\n // if (selectedFolder.folderName_th.indexOf(FolderType.EditAfterReview) !== -1) {\r\n // //@ts-ignore\r\n // if (submitTypeID === submittedType.editAfterReview.id) {\r\n // //แก้ไขหลังพิจารณา\r\n // tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22]\r\n // tabAdminList = [\r\n // menuTab.tab26,\r\n // menuTab.tab1,\r\n // menuTab.tab2,\r\n // menuTab.tab3,\r\n // menuTab.tab4,\r\n // menuTab.tab5,\r\n // ]\r\n // tabCommitteeList = [\r\n // menuTab.tab26,\r\n // menuTab.tab1Committee,\r\n // menuTab.tab2Commitee,\r\n // menuTab.tab5Commitee,\r\n // ]\r\n // tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab2Chairman]\r\n // }\r\n // }\r\n //@ts-ignore\r\n if (isEditAfterReview(submitTypeID)) {\r\n //แก้ไขหลังพิจารณา\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22]\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab2, menuTab.tab3, menuTab.tab4, menuTab.tab5]\r\n tabCommitteeList = [\r\n menuTab.tab26,\r\n menuTab.tab1Committee,\r\n menuTab.tab2Commitee,\r\n menuTab.tab5Commitee,\r\n ]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab2Chairman, menuTab.tab4Chairman]\r\n }\r\n\r\n //ประธานลองประธานเห็นหน้าบันทึกข้อคิดเห็นกรรมการได้เมื่อโดนกำหนดให้เป็นกรรมการ\r\n if (isCommitteeInProject(committeeInProject)) {\r\n tabChairmanList = [...tabChairmanList, menuTab.tab5Commitee]\r\n }\r\n\r\n break\r\n\r\n case constSubmittedStep.synthesis:\r\n tabAdminList = [menuTab.tab1, menuTab.tab2, menuTab.tab3, menuTab.tab4, menuTab.tab5, menuTab.tab6]\r\n tabChairmanList = [\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n ]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee, menuTab.tab5Commitee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22]\r\n //@ts-ignore\r\n if (isEditAfterReview(submitTypeID)) {\r\n //แก้ไขหลังพิจารณา\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22]\r\n tabAdminList = [\r\n menuTab.tab26,\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n ]\r\n tabCommitteeList = [\r\n menuTab.tab26,\r\n menuTab.tab1Committee,\r\n menuTab.tab2Commitee,\r\n menuTab.tab5Commitee,\r\n ]\r\n tabChairmanList = [\r\n menuTab.tab26,\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n ]\r\n }\r\n\r\n // if (isCloseProject(submitTypeID)) {\r\n if (isCloseProject(submitTypeID) || submitTypeID === constSubmittedType.terminateProject) {\r\n tabAdminList = [menuTab.tab1, menuTab.tab12]\r\n tabChairmanList = [menuTab.tab1, menuTab.tab12]\r\n // tabAdminList = [menuTab.tab1, menuTab.tab6]\r\n // tabChairmanList = [menuTab.tab1, menuTab.tab6]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21]\r\n }\r\n\r\n //ประธานลองประธานเห็นหน้าบันทึกข้อคิดเห็นกรรมการได้เมื่อโดนกำหนดให้เป็นกรรมการ\r\n // เปลี่ยนเมื่อ 1/2/2022 ให้แสดง tab บันทึกข้อมูลกรรมการทั้งหมดแทน เลยไม่ต้องแสดง tab ที่ไว้บันทึกข้อคิดเห็นแล้ว\r\n // if (isCommitteeInProject(committeeInProject)) {\r\n // const latestTapIdx = tabChairmanList.map((itm) => itm.id).indexOf(menuTab.tab5Chairman.id)\r\n // if (latestTapIdx !== -1) {\r\n // tabChairmanList.splice(latestTapIdx, 1, menuTab.tab5Commitee)\r\n // }\r\n // }\r\n\r\n break\r\n\r\n case constSubmittedStep.synthesisReview:\r\n tabAdminList = [\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n ]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22]\r\n tabChairmanList = [\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n ]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee, menuTab.tab5Commitee]\r\n if (submittedStatusID === constSubmittedStatus.complete) {\r\n //Complete\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22, menuTab.tab23]\r\n }\r\n\r\n if (isFlowApproveWithComment) {\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab7]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n } else if (isEditAfterReview(submitTypeID)) {\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22]\r\n //แก้ไขหลังพิจารณา\r\n if (submittedStatusID === constSubmittedStatus.complete) {\r\n //Complete\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22, menuTab.tab23]\r\n }\r\n\r\n tabAdminList = [\r\n menuTab.tab26,\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n ]\r\n tabCommitteeList = [\r\n menuTab.tab26,\r\n menuTab.tab1Committee,\r\n menuTab.tab2Commitee,\r\n menuTab.tab5Commitee,\r\n ]\r\n tabChairmanList = [\r\n menuTab.tab26,\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n ]\r\n }\r\n // else if (isCloseProject(submitTypeID)) {\r\n else if (isCloseProject(submitTypeID) || submitTypeID === constSubmittedType.terminateProject) {\r\n tabAdminList = [menuTab.tab1, menuTab.tab12, menuTab.tab7]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab12]\r\n // tabAdminList = [menuTab.tab1, menuTab.tab6, menuTab.tab7]\r\n // tabChairmanList = [menuTab.tab1Chairman, menuTab.tab6]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab23]\r\n }\r\n\r\n //ประธานรองประธานเห็นหน้าบันทึกข้อคิดเห็นกรรมการได้เมื่อโดนกำหนดให้เป็นกรรมการ\r\n // เปลี่ยนเมื่อ 1/2/2022 ให้แสดง tab บันทึกข้อมูลกรรมการทั้งหมดแทน เลยไม่ต้องแสดง tab ที่ไว้บันทึกข้อคิดเห็นแล้ว\r\n // if (isCommitteeInProject(committeeInProject)) {\r\n // const latestTapIdx = tabChairmanList.map((itm) => itm.id).indexOf(menuTab.tab6Chairman.id)\r\n // if (latestTapIdx !== -1) {\r\n // tabChairmanList.splice(latestTapIdx, 0, menuTab.tab5Commitee)\r\n // }\r\n // }\r\n\r\n break\r\n case constSubmittedStep.certification:\r\n tabAdminList = [\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n menuTab.tab8,\r\n ]\r\n tabChairmanList = [\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n ]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee, menuTab.tab5Commitee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22, menuTab.tab23]\r\n\r\n //@ts-ignore\r\n if (isFlowApproveWithComment) {\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab7, menuTab.tab8]\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n } else if (isEditAfterReview(submitTypeID)) {\r\n //แก้ไขหลังพิจารณา\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22, menuTab.tab23]\r\n tabAdminList = [\r\n menuTab.tab26,\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n menuTab.tab8,\r\n ]\r\n tabCommitteeList = [\r\n menuTab.tab26,\r\n menuTab.tab1Committee,\r\n menuTab.tab2Commitee,\r\n menuTab.tab5Commitee,\r\n ]\r\n tabChairmanList = [\r\n menuTab.tab26,\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab6Chairman,\r\n ]\r\n }\r\n\r\n //ประธานลองประธานเห็นหน้าบันทึกข้อคิดเห็นกรรมการได้เมื่อโดนกำหนดให้เป็นกรรมการ\r\n // เปลี่ยนเมื่อ 1/2/2022 ให้แสดง tab บันทึกข้อมูลกรรมการทั้งหมดแทน เลยไม่ต้องแสดง tab ที่ไว้บันทึกข้อคิดเห็นแล้ว\r\n // if (isCommitteeInProject(committeeInProject)) {\r\n // const latestTapIdx = tabChairmanList.map((itm) => itm.id).indexOf(menuTab.tab6Chairman.id)\r\n // if (latestTapIdx !== -1) {\r\n // tabChairmanList.splice(latestTapIdx, 0, menuTab.tab5Commitee)\r\n // }\r\n // }\r\n\r\n break\r\n case constSubmittedStep.sign:\r\n tabAdminList = [\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n menuTab.tab8,\r\n menuTab.tab10,\r\n ]\r\n tabChairmanList = [\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n menuTab.tab9,\r\n ]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee, menuTab.tab5Commitee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22, menuTab.tab23]\r\n if (isUserViceChairman()) {\r\n tabChairmanList = [\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n menuTab.tab10,\r\n ]\r\n }\r\n if (submittedStatusID === constSubmittedStatus.complete) {\r\n //Complete\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22, menuTab.tab23, menuTab.tab24]\r\n }\r\n\r\n //@ts-ignore\r\n if (isFlowApproveWithComment) {\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab7, menuTab.tab8, menuTab.tab10]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab9]\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n\r\n if (isUserViceChairman()) {\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab10]\r\n }\r\n\r\n if (submittedStatusID === constSubmittedStatus.complete) {\r\n //Complete\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab24]\r\n }\r\n } else if (isEditAfterReview(submitTypeID)) {\r\n //แก้ไขหลังพิจารณา\r\n\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22, menuTab.tab23]\r\n tabAdminList = [\r\n menuTab.tab26,\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n menuTab.tab8,\r\n menuTab.tab10,\r\n ]\r\n tabCommitteeList = [\r\n menuTab.tab26,\r\n menuTab.tab1Committee,\r\n menuTab.tab2Commitee,\r\n menuTab.tab5Commitee,\r\n ]\r\n tabChairmanList = [\r\n menuTab.tab26,\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n menuTab.tab9,\r\n ]\r\n if (isUserViceChairman()) {\r\n tabChairmanList = [\r\n menuTab.tab26,\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n menuTab.tab10,\r\n ]\r\n }\r\n if (submittedStatusID === constSubmittedStatus.complete) {\r\n //Complete\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22, menuTab.tab23, menuTab.tab24]\r\n }\r\n }\r\n\r\n // if (isCloseProject(submitTypeID)) {\r\n if (isCloseProject(submitTypeID) || submitTypeID === constSubmittedType.terminateProject) {\r\n //ลงนามใบบันทึกข้อความ\r\n tabAdminList = [menuTab.tab1, menuTab.tab12, menuTab.tab7, menuTab.tab11, menuTab.tab10]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab12, menuTab.tab9]\r\n // tabAdminList = [menuTab.tab1, menuTab.tab6, menuTab.tab7, menuTab.tab11, menuTab.tab10]\r\n // tabChairmanList = [menuTab.tab1Chairman, menuTab.tab6, menuTab.tab9]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab23]\r\n\r\n if (isUserChairmanOnly() || isUserViceChairman()) {\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab12, menuTab.tab10]\r\n // tabChairmanList = [menuTab.tab1Chairman, menuTab.tab6, menuTab.tab10]\r\n }\r\n // if (isUserSecretary() || isUserViceChairman()) {\r\n // tabChairmanList = [menuTab.tab1Chairman, menuTab.tab6Chairman, menuTab.tab10]\r\n // }\r\n }\r\n\r\n if (\r\n submitTypeID === constSubmittedType.editAfterReview_closeProject ||\r\n submitTypeID === constSubmittedType.editAfterReview_terminateProject\r\n ) {\r\n //ลงนามใบบันทึกข้อความ\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab11, menuTab.tab10]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab9]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab23]\r\n\r\n // if (isUserSecretary() || isUserViceChairman()) {\r\n // tabChairmanList = [menuTab.tab1Chairman, menuTab.tab1Chairman, menuTab.tab10]\r\n // }\r\n if (isUserChairmanOnly() || isUserViceChairman()) {\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab1Chairman, menuTab.tab10]\r\n }\r\n }\r\n\r\n //ประธานลองประธานเห็นหน้าบันทึกข้อคิดเห็นกรรมการได้เมื่อโดนกำหนดให้เป็นกรรมการ\r\n // เปลี่ยนเมื่อ 1/2/2022 ให้แสดง tab บันทึกข้อมูลกรรมการทั้งหมดแทน เลยไม่ต้องแสดง tab ที่ไว้บันทึกข้อคิดเห็นแล้ว\r\n // if (isCommitteeInProject(committeeInProject)) {\r\n // const latestTapIdx = tabChairmanList.map((itm) => itm.id).indexOf(menuTab.tab6Chairman.id)\r\n // if (latestTapIdx !== -1) {\r\n // tabChairmanList.splice(latestTapIdx, 0, menuTab.tab5Commitee)\r\n // }\r\n // }\r\n\r\n if (submitTypeID === constSubmittedType.firstSubmitConsideration && isProjectNotAboutPeople) {\r\n //ยื่นครั้งแรกไม่เกี่ยวกับคน\r\n tabAdminList = [menuTab.tab1, menuTab.tab2, menuTab.tab11, menuTab.tab10]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab2Chairman, menuTab.tab11, menuTab.tab9]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab23]\r\n\r\n if (isUserChairmanOnly() || isUserViceChairman()) {\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab2Chairman, menuTab.tab11, menuTab.tab10]\r\n }\r\n }\r\n\r\n if (\r\n submitTypeID === constSubmittedType.adverseEvent ||\r\n submitTypeID === constSubmittedType.nonconformance\r\n ) {\r\n //ลงนามใบบันทึกข้อความ\r\n //รายงานเหตุการณ์ที่ไม่พึงประสงค์ รายงานที่ไม่เป็นไปตามข้อกำหนด\r\n tabAdminList = [menuTab.tab1, menuTab.tab11, menuTab.tab10]\r\n tabChairmanList = [menuTab.tab1, menuTab.tab11, menuTab.tab9]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab23]\r\n // if (isUserSecretary() || isUserViceChairman()) {\r\n // tabChairmanList = [menuTab.tab1, menuTab.tab11, menuTab.tab10]\r\n // }\r\n if (isUserChairmanOnly() || isUserViceChairman()) {\r\n tabChairmanList = [menuTab.tab1, menuTab.tab11, menuTab.tab10]\r\n }\r\n }\r\n\r\n if (submitTypeID === constSubmittedType.amendmentProject) {\r\n //ขอแก้ไขโครงการหลังได้รับอนุมัติ\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22, menuTab.tab23]\r\n tabChairmanList = [\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n menuTab.tab9,\r\n ]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee, menuTab.tab5Commitee]\r\n if (isNeedEditForm) {\r\n tabAdminList = [\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n menuTab.tab8,\r\n menuTab.tab10,\r\n ]\r\n } else {\r\n tabAdminList = [\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n menuTab.tab11,\r\n menuTab.tab10,\r\n ]\r\n\r\n if (isUserChairmanOnly() || isUserViceChairman()) {\r\n tabChairmanList = [\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n menuTab.tab10,\r\n ]\r\n }\r\n }\r\n\r\n if (submittedStatusID === constSubmittedStatus.complete) {\r\n //Complete\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22, menuTab.tab23, menuTab.tab24]\r\n }\r\n\r\n if (isFlowApproveWithComment) {\r\n // tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab7, menuTab.tab8, menuTab.tab10]\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab23]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab9]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n if (isNeedEditForm) {\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab7, menuTab.tab8, menuTab.tab10]\r\n if (submittedStatusID === constSubmittedStatus.complete) {\r\n //Complete\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22, menuTab.tab23, menuTab.tab24]\r\n }\r\n } else {\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab7, menuTab.tab11, menuTab.tab10]\r\n }\r\n }\r\n }\r\n if (submitTypeID === constSubmittedType.exitAfterReview_AmendmentProject) {\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22, menuTab.tab23]\r\n tabChairmanList = [\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n menuTab.tab9,\r\n ]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee, menuTab.tab5Commitee]\r\n\r\n if (isNeedEditForm) {\r\n tabAdminList = [\r\n menuTab.tab26,\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n menuTab.tab8,\r\n menuTab.tab10,\r\n ]\r\n if (submittedStatusID === constSubmittedStatus.complete) {\r\n //Complete\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22, menuTab.tab23, menuTab.tab24]\r\n }\r\n } else {\r\n tabAdminList = [\r\n menuTab.tab26,\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n menuTab.tab11,\r\n menuTab.tab10,\r\n ]\r\n\r\n if (isUserChairmanOnly() || isUserViceChairman()) {\r\n tabChairmanList = [\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n menuTab.tab10,\r\n ]\r\n }\r\n }\r\n\r\n if (isFlowApproveWithComment) {\r\n // tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab7, menuTab.tab11, menuTab.tab10]\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab23]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman, menuTab.tab9]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n\r\n if (isNeedEditForm) {\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab7, menuTab.tab8, menuTab.tab10]\r\n if (submittedStatusID === constSubmittedStatus.complete) {\r\n //Complete\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22, menuTab.tab23, menuTab.tab24]\r\n }\r\n } else {\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab7, menuTab.tab11, menuTab.tab10]\r\n }\r\n }\r\n }\r\n\r\n //ยุติโครงการโดยเจ้าหน้าที่\r\n\r\n if (submitTypeID === constSubmittedType.terminateProjectByAdmin) {\r\n //ลงนามใบบันทึกข้อความ\r\n tabAdminList = [menuTab.tab21, menuTab.tab11, menuTab.tab10]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab9]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab23]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab23]\r\n\r\n if (isUserChairmanOnly() || isUserViceChairman()) {\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab10]\r\n }\r\n }\r\n\r\n if (submitTypeID === constSubmittedType.closeProjectByAdmin) {\r\n tabResearcherList = [menuTab.tab21, menuTab.tab23]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab9]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee, menuTab.tab5Commitee]\r\n tabAdminList = [menuTab.tab21, menuTab.tab11, menuTab.tab10]\r\n\r\n if (isUserChairmanOnly() || isUserViceChairman()) {\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab10]\r\n }\r\n }\r\n\r\n break\r\n\r\n case constSubmittedStep.memoMessage:\r\n tabAdminList = [menuTab.tab1Chairman, menuTab.tab11]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab11]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab23]\r\n\r\n if (submitTypeID === constSubmittedType.firstSubmitConsideration && isProjectNotAboutPeople) {\r\n tabAdminList = [menuTab.tab1, menuTab.tab2, menuTab.tab11]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab2Chairman, menuTab.tab11]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab23]\r\n }\r\n\r\n // if (isCloseProject(submitTypeID)) {\r\n if (isCloseProject(submitTypeID) || submitTypeID === constSubmittedType.terminateProject) {\r\n tabAdminList = [menuTab.tab1, menuTab.tab12, menuTab.tab7, menuTab.tab11]\r\n tabChairmanList = [menuTab.tab1Chairman, menuTab.tab12]\r\n // tabAdminList = [menuTab.tab1, menuTab.tab6, menuTab.tab7, menuTab.tab11]\r\n // tabChairmanList = [menuTab.tab1Chairman, menuTab.tab6]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab23]\r\n }\r\n if (submitTypeID === constSubmittedType.amendmentProject) {\r\n tabAdminList = [\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n menuTab.tab11,\r\n ]\r\n tabChairmanList = [\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n ]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee, menuTab.tab5Commitee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab22, menuTab.tab23]\r\n\r\n if (isFlowApproveWithComment) {\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab7, menuTab.tab11]\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab23]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n }\r\n }\r\n\r\n if (submitTypeID === constSubmittedType.exitAfterReview_AmendmentProject) {\r\n tabAdminList = [\r\n menuTab.tab26,\r\n menuTab.tab1,\r\n menuTab.tab2,\r\n menuTab.tab3,\r\n menuTab.tab4,\r\n menuTab.tab5,\r\n menuTab.tab6,\r\n menuTab.tab7,\r\n menuTab.tab11,\r\n ]\r\n tabChairmanList = [\r\n menuTab.tab1Chairman,\r\n menuTab.tab2Chairman,\r\n menuTab.tab4Chairman,\r\n menuTab.tab5Chairman,\r\n menuTab.tab6Chairman,\r\n ]\r\n tabCommitteeList = [menuTab.tab1Committee, menuTab.tab2Commitee, menuTab.tab5Commitee]\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab22, menuTab.tab23]\r\n\r\n if (isFlowApproveWithComment) {\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab7, menuTab.tab11]\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab23]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n }\r\n }\r\n\r\n if (\r\n submitTypeID === constSubmittedType.editAfterReview_closeProject ||\r\n submitTypeID === constSubmittedType.editAfterReview_terminateProject\r\n ) {\r\n tabAdminList = [menuTab.tab26, menuTab.tab1, menuTab.tab11]\r\n tabChairmanList = [menuTab.tab26, menuTab.tab1Chairman]\r\n tabCommitteeList = [menuTab.tab26, menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab26, menuTab.tab21, menuTab.tab23]\r\n }\r\n\r\n if (submitTypeID === constSubmittedType.terminateProjectByAdmin) {\r\n tabAdminList = [menuTab.tab21, menuTab.tab11]\r\n tabChairmanList = [menuTab.tab1Chairman]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21, menuTab.tab23]\r\n }\r\n\r\n break\r\n\r\n case constSubmittedStep.confirmProjectWithdraw:\r\n tabAdminList = [menuTab.tab1, menuTab.tabConfirmProjectWithdraw]\r\n tabChairmanList = [menuTab.tab1, menuTab.tabConfirmProjectWithdraw]\r\n tabCommitteeList = [menuTab.tab21]\r\n tabResearcherList = [menuTab.tab21]\r\n\r\n if (projectData?.isSubmitByAdmin) {\r\n tabAdminList = [menuTab.tab21, menuTab.tabConfirmProjectWithdraw]\r\n }\r\n\r\n break\r\n default:\r\n tabAdminList = []\r\n tabResearcherList = [menuTab.tab25]\r\n tabChairmanList = []\r\n tabCommitteeList = []\r\n if (submitTypeID === constSubmittedType.closeProject) {\r\n tabAdminList = [menuTab.tab1]\r\n tabChairmanList = [menuTab.tab1Chairman]\r\n tabCommitteeList = [menuTab.tab1Committee]\r\n tabResearcherList = [menuTab.tab21]\r\n }\r\n\r\n if (submitTypeID === constSubmittedType.terminateProjectByAdmin) {\r\n tabAdminList = [menuTab.tab21]\r\n tabChairmanList = []\r\n tabCommitteeList = []\r\n tabResearcherList = []\r\n }\r\n\r\n break\r\n }\r\n\r\n return { tabAdminList, tabResearcherList, tabChairmanList, tabCommitteeList }\r\n }\r\n\r\n const getTabRenderList = (\r\n projectStatus?: number | null,\r\n selectedFolder?: any,\r\n isHideTabRecord?: boolean,\r\n isDisApprove?: boolean,\r\n presidentMustSave?: boolean,\r\n projectData?: GetProjectResultType,\r\n ) => {\r\n let tabRenderList: any[] = []\r\n //** This Function Is Check UserGroup */\r\n if (isUserResearcher()) {\r\n //Researcher\r\n if (projectStatus) {\r\n const { tabResearcherList } = getTabListFunc(selectedFolder, projectData)\r\n tabRenderList = tabResearcherList\r\n } else {\r\n const projectStepID = projectData?.stepID\r\n if (projectStepID) {\r\n const { tabResearcherList } = getTabListFunc(selectedFolder, projectData)\r\n tabRenderList = tabResearcherList\r\n } else {\r\n //NEW CREATE PROJECT\r\n tabRenderList = [menuTab.tab21]\r\n }\r\n }\r\n } else if (isUserAdmin()) {\r\n //All ADMIN\r\n const { tabAdminList } = getTabListFunc(selectedFolder, projectData)\r\n tabRenderList = tabAdminList\r\n if (isHideTabRecord) {\r\n //กรณีเลือกประเภทโครงการเป็น Exempt => ไม่ต้อง Require กรรมการ => ถ้าไม่กำหนดกรรมการมา => ไม่ต้องกำหนดวันที่กรรมการลงความเห็น(disable) และ ไม่ต้องแสดง tab บันทึกข้อคิดเห็นของกรรมการ\r\n tabRenderList = tabRenderList.filter((item) => {\r\n return item.id !== menuTab.tab5.id\r\n })\r\n }\r\n\r\n if (isDisApprove) {\r\n tabRenderList = tabRenderList.filter((item) => {\r\n return item.id < menuTab.tab8.id\r\n })\r\n }\r\n } else if (isUserChairman()) {\r\n const { tabChairmanList } = getTabListFunc(selectedFolder, projectData)\r\n tabRenderList = tabChairmanList\r\n } else if (isUserCommittee()) {\r\n //All กรรการ\r\n\r\n const { tabCommitteeList } = getTabListFunc(selectedFolder, projectData)\r\n tabRenderList = tabCommitteeList\r\n if (!presidentMustSave) {\r\n //กรณี login เข้ามาเป็นกรรมการแต่ไม่ได้เป็นกรรมการของโปรเจคนั้น ไม่ต้องแสดง tab บันทึกข้อคิดเห็นของกรรมการ\r\n tabRenderList = tabRenderList.filter((item) => {\r\n return item.id !== menuTab.tab5.id\r\n })\r\n }\r\n }\r\n // console.log('tabRenderList>>>>', tabRenderList)\r\n return { tabRenderList: tabRenderList }\r\n }\r\n\r\n const getFolderRenderList = (projectStatus?: number | null) => {\r\n let folderRenderList: any[] = []\r\n\r\n if (isUserResearcher()) {\r\n //Researcher\r\n if (projectStatus) {\r\n folderRenderList = [customFolder.createProject]\r\n } else {\r\n //new create project\r\n folderRenderList = [customFolder.createProject]\r\n }\r\n } else {\r\n //All Ofiicer\r\n folderRenderList = [customFolder.createProject]\r\n }\r\n\r\n return { folderRenderList: folderRenderList }\r\n }\r\n\r\n const chkShowUpdateDate = (projectData?: GetProjectResultType | null) => {\r\n const isViewMode = chkProjectStepViewMode(projectData)\r\n const isDraft = projectData?.isDraft\r\n let isShowUpdateDate = false\r\n\r\n if (isViewMode) {\r\n isShowUpdateDate = true\r\n } else {\r\n if (isDraft) {\r\n isShowUpdateDate = true\r\n } else {\r\n isShowUpdateDate = false\r\n }\r\n }\r\n\r\n return isShowUpdateDate\r\n }\r\n\r\n const chkDisplayBTNDeleteProject = (submittedTypeID: number) => {\r\n return [\r\n submittedType.firstSubmitConsideration,\r\n\r\n submittedType.nextPhaseProject,\r\n submittedType.renewalProject,\r\n submittedType.amendmentProject,\r\n submittedType.adverseEvent,\r\n submittedType.closeProject,\r\n submittedType.terminateProject,\r\n submittedType.withdrawalProject,\r\n ].some((id) => id == submittedTypeID)\r\n }\r\n\r\n const isAllowOfficerToEdit = (projectData: GetProjectResultType | null | undefined) => {\r\n const allowOfficer = [\r\n constSubmittedStep.submit,\r\n constSubmittedStep.verifyDoc,\r\n constSubmittedStep.specifyProjectType,\r\n ]\r\n return projectData?.stepID ? isUserAdmin() && allowOfficer.includes(projectData?.stepID) : false\r\n }\r\n\r\n const isAllowDefineDirector = (projectData: GetProjectResultType | null | undefined) => {\r\n return (\r\n (projectData?.stepID === constSubmittedStep.specifyAdditionalDoc ||\r\n projectData?.stepID === constSubmittedStep.specifySchedule ||\r\n projectData?.stepID === constSubmittedStep.commentary) &&\r\n !isUserCommittee()\r\n )\r\n }\r\n\r\n const checkSaveDraft = () => {\r\n const data = projectStore.projectData\r\n const currentSelectTab = appFolderAndTabStore.tabSelected\r\n return currentSelectTab?.stepID === data?.stepID\r\n }\r\n\r\n const checkDisabledProjectReviewer = (projectData: GetProjectResultType | null | undefined) => {\r\n const allowOfficer = [\r\n constSubmittedStep.specifyProjectType,\r\n constSubmittedStep.specifyAdditionalDoc,\r\n constSubmittedStep.specifySchedule,\r\n constSubmittedStep.commentary,\r\n ]\r\n return projectData?.stepID ? !allowOfficer.includes(projectData?.stepID) : true\r\n }\r\n\r\n const checkDisabledProjectType = (projectData: GetProjectResultType | null | undefined) => {\r\n const allowSteps = [\r\n constSubmittedStep.specifyAdditionalDoc,\r\n constSubmittedStep.specifySchedule,\r\n constSubmittedStep.commentary,\r\n constSubmittedStep.synthesis,\r\n ]\r\n let disabledCondition = true\r\n if (projectData?.stepID) {\r\n disabledCondition = !(\r\n allowSteps.includes(projectData?.stepID) &&\r\n (isUserAdmin() || isUserSecretary() || isUserChairmanOnly() || isUserViceChairman())\r\n )\r\n }\r\n return disabledCondition\r\n }\r\n\r\n return {\r\n irb,\r\n isUserSystemAdmin,\r\n isUserAdmin,\r\n isUserChairman,\r\n isUserViceChairman,\r\n isUserSecretary,\r\n isUserCommittee,\r\n isUserResearcher,\r\n isUserChairmanOnly,\r\n isAllowOfficerToEdit,\r\n isAllowDefineDirector,\r\n chkProjectStepViewMode,\r\n getTabRenderList,\r\n getFolderRenderList,\r\n isCommitteeInProject,\r\n chkShowUpdateDate,\r\n chkDisplayBTNDeleteProject,\r\n checkDisabledProjectReviewer,\r\n checkSaveDraft,\r\n checkDisabledProjectType,\r\n }\r\n}\r\nexport default useCheckPermission\r\n","import { useState, useEffect } from 'react'\r\nimport { DialogType } from './dialog'\r\nconst useDialog = (props: Omit) => {\r\n const { onRef, onAfterClose } = props\r\n const [isOpen, setIsOpen] = useState(false)\r\n const [isActionReady, setIsActionReady] = useState(false)\r\n\r\n useEffect(() => {\r\n onRef({\r\n openDialog,\r\n closeDialog,\r\n })\r\n\r\n if (!props.reachedBottom) {\r\n setIsActionReady(true)\r\n } else {\r\n setIsActionReady(false)\r\n }\r\n }, [isOpen])\r\n\r\n // useEffect(() => {\r\n // if (!props.reachedBottom) {\r\n // setIsActionReady(true)\r\n // } else {\r\n // setIsActionReady(false)\r\n // }\r\n // }, [isOpen])\r\n\r\n const openDialog = () => {\r\n setIsOpen(true)\r\n }\r\n const closeDialog = () => {\r\n setIsOpen(false)\r\n onAfterClose?.()\r\n }\r\n const handleClickClose = () => {\r\n closeDialog()\r\n }\r\n\r\n const setMainActionReady = () => {\r\n setIsActionReady(true)\r\n }\r\n\r\n return {\r\n isOpen,\r\n isActionReady,\r\n onClickClose: handleClickClose,\r\n setMainActionReady,\r\n }\r\n}\r\n\r\nexport default useDialog\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport MuiDialog from '@material-ui/core/Dialog'\r\nimport MuiDialogActions from '@material-ui/core/DialogActions'\r\nimport MuiDialogContent from '@material-ui/core/DialogContent'\r\nimport MuiDialogTitle from '@material-ui/core/DialogTitle'\r\nimport useDialog from './useDialog'\r\nimport Button from '../button/button'\r\nimport useTranslate from '../../i18n/useTranslate'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { useRef } from 'react'\r\n\r\ntype ActionAlertType = {\r\n txtConfirm?: string\r\n txtClose?: string\r\n isActionReady: boolean\r\n onClickConfirm?: () => void\r\n onClickClose?: () => void\r\n}\r\nconst ActionAlertMessage = (props: ActionAlertType) => {\r\n const translate = useTranslate()\r\n const { txtClose = translate.get('BUTTON.CLOSE'), onClickClose } = props\r\n\r\n return (\r\n \r\n )\r\n}\r\nconst ActionAlertConfirm = (props: ActionAlertType) => {\r\n const translate = useTranslate()\r\n const {\r\n txtConfirm = translate.get('BUTTON.CONFIRM'),\r\n txtClose = translate.get('BUTTON.CLOSE'),\r\n onClickConfirm,\r\n onClickClose,\r\n } = props\r\n\r\n return (\r\n <>\r\n \r\n {txtClose}\r\n \r\n \r\n {txtConfirm}\r\n \r\n \r\n )\r\n}\r\n\r\nconst ActionAlertSaveCancel = (props: ActionAlertType) => {\r\n const translate = useTranslate()\r\n const {\r\n txtConfirm = translate.get('BUTTON.SAVE'),\r\n txtClose = translate.get('BUTTON.CANCEL'),\r\n isActionReady,\r\n onClickConfirm,\r\n onClickClose,\r\n } = props\r\n\r\n return (\r\n <>\r\n \r\n {txtClose}\r\n \r\n \r\n {txtConfirm}\r\n \r\n \r\n )\r\n}\r\n\r\nconst ActionAlertAcceptCancel = (props: ActionAlertType) => {\r\n const translate = useTranslate()\r\n const {\r\n txtConfirm = translate.get('BUTTON.ACCEPT'),\r\n txtClose = translate.get('BUTTON.CANCEL'),\r\n isActionReady,\r\n onClickConfirm,\r\n onClickClose,\r\n } = props\r\n\r\n return (\r\n <>\r\n \r\n {txtClose}\r\n \r\n \r\n {txtConfirm}\r\n \r\n \r\n )\r\n}\r\n\r\ntype DialogViewType = ReturnType & DialogType\r\nconst DialogView = (props: DialogViewType) => {\r\n const {\r\n isOpen,\r\n type = 'alert-message',\r\n maxWidth = 'sm',\r\n title,\r\n content,\r\n onClickConfirm,\r\n onClickClose,\r\n isActionReady,\r\n } = props\r\n const classes = useStyles()\r\n\r\n const renderContent = () => {\r\n switch (type) {\r\n case 'alert-confirm':\r\n return content\r\n case 'dialog-element':\r\n return <>{content}\r\n case 'dialog-element-accept':\r\n return <>{content}\r\n default:\r\n //alert-message\r\n return {content}\r\n }\r\n }\r\n\r\n const renderAction = () => {\r\n switch (type) {\r\n case 'alert-confirm':\r\n return (\r\n \r\n )\r\n case 'alert-message':\r\n return \r\n case 'dialog-element':\r\n return (\r\n \r\n )\r\n case 'dialog-element-accept':\r\n return (\r\n \r\n )\r\n default:\r\n //alert-message\r\n return <>\r\n }\r\n }\r\n\r\n const listInnerRef = useRef({\r\n scrollTop: 0,\r\n scrollHeight: 0,\r\n clientHeight: 0,\r\n })\r\n\r\n const onScroll = () => {\r\n if (listInnerRef.current) {\r\n const { scrollTop, scrollHeight, clientHeight } = listInnerRef.current\r\n if (Math.ceil(scrollTop) + clientHeight >= scrollHeight) {\r\n props.setMainActionReady()\r\n }\r\n }\r\n }\r\n\r\n return (\r\n \r\n {title}\r\n \r\n {renderContent()}\r\n \r\n {/*
test
*/}\r\n {renderAction()}\r\n \r\n )\r\n}\r\n\r\nexport type DialogType = {\r\n title?: string\r\n content?: string | JSX.Element\r\n type?: 'alert-message' | 'alert-confirm' | 'dialog-element' | 'dialog-element-accept' | ''\r\n maxWidth?: 'lg' | 'md' | 'sm' | 'xl' | 'xs' | false\r\n onRef: (func: Record) => void\r\n onClickConfirm?: () => void\r\n onAfterClose?: () => void\r\n reachedBottom?: boolean\r\n}\r\nconst Dialog = (props: DialogType) => {\r\n const dialogModel = useDialog(props)\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n minWidth: '600px',\r\n [theme.breakpoints.down('xs')]: {\r\n minWidth: '320px',\r\n },\r\n },\r\n\r\n title: {\r\n color: 'white',\r\n backgroundColor: theme.palette.primary.main,\r\n padding: '8px 24px',\r\n },\r\n contentText: {\r\n color: theme.palette.text.primary,\r\n },\r\n}))\r\n\r\nexport default Dialog\r\n","import { useState } from 'react'\r\n\r\nconst usePlayground = (props: {}) => {\r\n const [displayComponentKey, setDisplayComponentKey] = useState('Default')\r\n\r\n const handleClickPlayground = (key: string) => () => {\r\n setDisplayComponentKey(key)\r\n }\r\n\r\n return {\r\n displayComponentKey,\r\n\r\n onClickPlayground: handleClickPlayground,\r\n }\r\n}\r\n\r\nexport default usePlayground\r\n","import useTranslate from '../../../../i18n/useTranslate'\r\nconst useI18nPlayground = () => {\r\n const translate = useTranslate()\r\n const handleClickChangeLang = () => {\r\n const thLang = translate.languageStore.currentLanguage !== translate.languageKey.th\r\n if (thLang) {\r\n translate.setChangeLanguage(translate.languageKey.th)\r\n } else {\r\n translate.setChangeLanguage(translate.languageKey.en)\r\n }\r\n }\r\n return {\r\n isTH: translate.languageStore.currentLanguage === translate.languageKey.th,\r\n onClickChangeLang: handleClickChangeLang,\r\n }\r\n}\r\n\r\nexport default useI18nPlayground\r\n","import Switch from '@material-ui/core/Switch'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport useI18nPlayground from './useI18nPlayground'\r\nimport { useTranslation } from 'react-i18next'\r\ntype I18nPlaygroundViewType = ReturnType\r\nconst I18nPlaygroundView = (props: I18nPlaygroundViewType) => {\r\n const { isTH, onClickChangeLang } = props\r\n const translate = useTranslate()\r\n return (\r\n
\r\n

Language

\r\n
\r\n EN\r\n \r\n TH\r\n
\r\n
{translate.get('login.username')}
\r\n
\r\n )\r\n}\r\n\r\nconst I18nPlayground = () => {\r\n const i18nPlaygroundModel = useI18nPlayground()\r\n return \r\n}\r\n\r\nexport default I18nPlayground\r\n","import React, { useRef } from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { List, AutoSizer } from 'react-virtualized'\r\nimport './gotoTop.css'\r\n// const listStyle = { overflowX: false, overflowY: false }; //สั่งปิด scrollbar พื้นฐานของ html เพื่อจะใช้ scrollbar ตัวที่เรา custom เอง\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n noRows: {\r\n // position: 'absolute',\r\n top: 0,\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '1em',\r\n color: '#bdbdbd',\r\n },\r\n}))\r\n\r\nconst VirtualizedView = (props: any) => {\r\n const {\r\n layoutStyle = {},\r\n rowCount,\r\n rowHeight,\r\n rowRenderer,\r\n onScrollEnd,\r\n rowPerpage,\r\n currentIndex,\r\n scrollToIndex,\r\n isGotoTop,\r\n onClickGotoTop,\r\n } = props\r\n const currentPage = useRef(1)\r\n // const refList = useRef()\r\n const [gotoTop, setGotoTop] = React.useState(false)\r\n const [currentIndex2, setCurrentIndex2] = React.useState()\r\n let classes = useStyles()\r\n\r\n const _noRowsRenderer = () => {\r\n return
ไม่พบข้อมูล
\r\n }\r\n\r\n return (\r\n // \r\n // \r\n <>\r\n {/* {\r\n // if (onClickGotoTop) {\r\n // onClickGotoTop()\r\n // }\r\n // setGotoTop(true)\r\n // setCurrentIndex2()\r\n }}\r\n > */}\r\n\r\n \r\n {(\r\n { height, width }, //ได้ width height มาตาม div ที่ครอบมัน\r\n ) => (\r\n // \r\n {\r\n const { overscanStartIndex, overscanStopIndex, startIndex, stopIndex } = props\r\n }}\r\n onScroll={(props: any) => {\r\n const { clientHeight, scrollHeight, scrollTop } = props\r\n\r\n if (scrollHeight - scrollTop === clientHeight) {\r\n if (onScrollEnd) {\r\n // onScrollEnd(rowPerpage * (currentPage.current + 1))\r\n onScrollEnd(rowPerpage * (currentIndex + 1), currentIndex + 1)\r\n }\r\n currentPage.current = currentPage.current + 1\r\n }\r\n }}\r\n noRowsRenderer={_noRowsRenderer}\r\n />\r\n\r\n // \r\n )}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default VirtualizedView\r\n","import React from 'react'\r\nimport { GridCellParams, GridColumnHeaderParams, GridColumns } from '@material-ui/data-grid'\r\nimport Table from '../../../../control/table/table'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport DeleteIcon from '@material-ui/icons/Delete'\r\nimport { ReturnPagingAndSortType } from '../../../../control/table/tableType'\r\nimport VirtualizedList from '../../../../control/virtualizedList/virtualizedList'\r\n// import VirtualizedList from '../../../../control/virtualizedList/virtualizedList2'\r\nimport Grid from '@material-ui/core/Grid'\r\n// import { mockData } from './mockData'\r\n// import ScrollBar from '../Containers/ScrollBar';\r\nimport ListItem from '@material-ui/core/ListItem'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport Checkbox from '@material-ui/core/Checkbox'\r\nimport InfoIcon from '@material-ui/icons/Info'\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport LinearProgress from '@material-ui/core/LinearProgress'\r\nimport useWebService from '../../../../services/web/useWebService'\r\nimport useLoading from '../../../../control/loading/useLoading'\r\nimport * as searchTypes from '../../manageProject/search/searchType'\r\nimport useAuthenStore from '../../../../stores/authen/authenStore'\r\n\r\nconst columns: GridColumns = [\r\n { field: 'id', headerName: 'ID', width: 200 },\r\n { field: 'name', headerName: 'fullName', width: 400 },\r\n { field: 'email', headerName: 'email', width: 400 },\r\n {\r\n field: 'teamID',\r\n headerName: 'teamID',\r\n type: 'number',\r\n width: 90,\r\n },\r\n {\r\n field: 'teamName',\r\n headerName: 'teamName',\r\n description: 'This column has a value getter and is not sortable.',\r\n sortable: false,\r\n flex: 1,\r\n // valueGetter: (params: any) => `${params.getValue('firstName') || ''} ${params.getValue('lastName') || ''}`,\r\n },\r\n {\r\n field: 'button',\r\n sortable: false,\r\n filterable: false,\r\n align: 'center',\r\n width: 200,\r\n disableClickEventBubbling: true,\r\n renderCell: (params: GridCellParams) => {\r\n return (\r\n
\r\n {}}>\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n },\r\n renderHeader: (params: GridColumnHeaderParams) =>
,\r\n },\r\n]\r\n\r\nconst rows = [\r\n {\r\n id: '228',\r\n name: 'สงกรณ์ เสียงสืบชาติ (พี่ไก่)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'songkorn.s@cdg.co.th',\r\n department: 'GM',\r\n },\r\n {\r\n id: 'O00001',\r\n name: 'รุจิภา บุญจุบัน (โอ)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'roochipa.b@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00002',\r\n name: 'ศุภกร อังอำนวยศิริ (บอย)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'supakorn.a@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00005',\r\n name: 'ปวริศ โกวิทวีรธรรม (เต้)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'pawarit.k@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00009',\r\n name: 'อนวัช ชัยศักดิ์ (แชมป์)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'anawach.c@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00010',\r\n name: 'วรมินทร์ สัตยาธาร (มิน)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'woramin.s@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00012',\r\n name: 'ธนะวัฒน์ ปิ่นรัตน์ (ฟลอย)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'thanawat.p@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00016',\r\n name: 'เบญจมาศ กันพรรค์ (ปู)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'benjamart.k@geotalent.co.th',\r\n department: 'HRD',\r\n },\r\n {\r\n id: 'O00017',\r\n name: 'กิตติคุณ เอกเอี่ยมพันธุ์ (มอส)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'kittikun.e@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00022',\r\n name: 'ศิริวัฒน์ แสงบัลลังค์ (บอม)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'siriwat.s@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00025',\r\n name: 'เฉลิมพล วิรัชชัย (เบิร์ด)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'chalermpol.v@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00028',\r\n name: 'สุรสิทธิ พูนสวัสดิ์ (เก็ต)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'surasit.p@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00030',\r\n name: 'ถิรวัฒน์ จักษ์ตรีมงคล (โจ)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'tirawat.j@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00035',\r\n name: 'สริมน ธีรรัตน์บงกช (แพร)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'sarimon.t@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00036',\r\n name: 'เอกราช ประสงค์ทรัพย์ (เอก)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'ekkarat.p@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00038',\r\n name: 'สัณหณัฐ งามฉายวงศ์ (บิ๊ก)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'sanhanat.n@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00043',\r\n name: 'เพ็ญพิชชา พัฒนจิตรศิลป์ (เฟิร์น)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'phenphitcha.p@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00044',\r\n name: 'ภานุ แถวไธสง (นุ)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'panu.t@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00049',\r\n name: 'รัตนทัต พลูวังกาญจน์ (ณัฐ)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'rattanatut.p@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00050',\r\n name: 'บุลากร สะสันเทียะ (เอ็ม)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'bulagorn.s@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00051',\r\n name: 'สุริยา วงค์คะสุ่ม (โจ้)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'suriya.w@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00052',\r\n name: 'ศิวะรักษ์ ดีแก้ว (เล็ก)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'siwarak.d@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00054',\r\n name: 'อานนท์ แฮวอู (บอย)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'anon.h@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00055',\r\n name: 'ชัยวัฒน์ บ้านเนิน (ชิน)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'chaiwat.b@geotalent.co.th',\r\n department: 'HRD',\r\n },\r\n {\r\n id: 'O00056',\r\n name: 'ชานนท์ จันทรมาตย์ (นนท์)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'chanon.cha@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00059',\r\n name: 'รสริน สุขสมบัติ (ก้อย)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'rossarin.s@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00060',\r\n name: 'อาจหาญ เสนฤทธิ์ (กั๊ก)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'artharn.s@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00061',\r\n name: 'โกศล ท่วงที (โจ้)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'koson.t@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00066',\r\n name: 'ธัญญทิพย์ อภินันทน์ (อ้อ)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'thunyatip.a@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00068',\r\n name: 'มัลลิกา โสภา (ปุ๋ย)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'mallika.s@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00074',\r\n name: 'ณัฐกานต์ พัฒนโพธิ์ (พีท)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'nutthakan.p@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00076',\r\n name: 'ณัฐสุภา จำรัส (แปม)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'nutsupha.c@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00077',\r\n name: 'กมลชนก เลิศเรืองรอง (พลอยลี่)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'kamonchanok.l@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00078',\r\n name: 'เกียรติมังกร ศรีขจร (มังกร)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'kiatmangkorn.s@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00080',\r\n name: 'ชัยธวัช หงษ์บุญ (จั๊ม)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'chaitawat.h@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00082',\r\n name: 'สมศักดิ์ แก้วอรสาร (เจ)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'somsak.k@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00083',\r\n name: 'ศรุต เบญจรัฐเดช (พี)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'sarut.b@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00084',\r\n name: 'รภัทร เบญญากุลนันท์ (ป่าน)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'rapat.b@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00085',\r\n name: 'สมชาย คงทรัพย์ (ชาย)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'somchai.kh@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00086',\r\n name: 'ชลิดา แก้วเมธากุล (ไอซ์)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'chalida.k@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00087',\r\n name: 'ศศิวรรณ ฉ่ำชาวนา (ชมพู่)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'sasiwan.c@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00088',\r\n name: 'จิราภรณ์ ฟูใจ (แพรว)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'jiraporn.f@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00089',\r\n name: 'จีรพัฒน์ ศรีพุ่มเงิน (บอส)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'jeerapat.s@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00091',\r\n name: 'วิธวินท์ กุลธรรมโยธิน (อ้ำ)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'wittawin.k@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00092',\r\n name: 'วาสิตา เล็กใบ (ป่าน)',\r\n teamID: '2',\r\n teamName: 'สีส้ม',\r\n colorCode: '#f70',\r\n email: 'wasita.l@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n {\r\n id: 'O00093',\r\n name: 'ณัฐดนัย ไชยกาล (แชมป์)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'natdanai.c@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00094',\r\n name: 'พรภัทร์ สันติบุปผากุล (พัตเตอร์)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'pornpat.s@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00095',\r\n name: 'ภิธาภรณ์ ภิระบรรณ์ (แก้ม)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'phithaporn.p@geotalent.co.th',\r\n department: 'DMD',\r\n },\r\n {\r\n id: 'O00096',\r\n name: 'ศรวณีย์ พรเจริญ (ลูกศร)',\r\n teamID: '1',\r\n teamName: 'สีดำ',\r\n colorCode: '#000',\r\n email: 'sornvanee.p@geotalent.co.th',\r\n department: 'WMD',\r\n },\r\n]\r\n\r\nfunction createRecord(count: number = 5) {\r\n let records = []\r\n\r\n for (let i = 0; i < count; i++) {\r\n records.push({\r\n field1: `name_${i}`,\r\n field2: 'https://40thptt.pttplc.com/Storage/Uploads/Milestone/milestone-40th.png?width=201&height=132&mode=pad&scale=both&format=png',\r\n field3: 'กรุงเทพ',\r\n field4: 'สาธร',\r\n field5: '13 กม.',\r\n field6: 'นาย ธีรวัฒน์',\r\n field7: 'PTT-00056',\r\n field8: 'WMD',\r\n field9: 'Web-Programer',\r\n field10: '0820648361',\r\n })\r\n }\r\n return records\r\n}\r\n\r\nconst TableExamView = (props: any) => {\r\n const { onClickEdit } = props\r\n const rowPerpage = 10\r\n const currentPage = React.useRef(1)\r\n const [mockData, setMockData] = React.useState(createRecord(rowPerpage))\r\n const callWebService = useWebService()\r\n const { configLoading, loadingClose, loadingOpen } = useLoading()\r\n const [isSumItem, setIsSumItem] = React.useState(0)\r\n const [listItem, setListItem] = React.useState([])\r\n const authenStore = useAuthenStore()\r\n\r\n React.useEffect(() => {\r\n const params = {\r\n userId: 1,\r\n pageNumber: 1, //param && param?.pageNumber ? param?.pageNumber : 1,\r\n rowsPerPage: 10,\r\n }\r\n getListTbl(params)\r\n }, [])\r\n const getListTbl = async (param: searchTypes.ListRequestType) => {\r\n loadingOpen()\r\n const res = await callWebService.searchTbl(param, `${authenStore.profile.userGroupId}`)\r\n\r\n const list = res.result.items.map((item, index) => {\r\n return {\r\n id: index,\r\n ...item,\r\n }\r\n })\r\n setIsSumItem(res.result.totalRecords)\r\n\r\n setListItem(list)\r\n loadingClose()\r\n }\r\n\r\n const rowRenderer = (props: any) => {\r\n const {\r\n key, // Unique key within array of rows\r\n index, // Index of row within collection\r\n style, // Style object to be applied to row (to position it)\r\n parent,\r\n } = props\r\n // let selected = (selectedIndex === index);\r\n // if(listResult && listResult.length === 1){\r\n // selected = true;\r\n // }\r\n return (\r\n // \r\n\r\n
\r\n \r\n \r\n \r\n {/* //onClick={handleClickList(mockData[index])}> */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* */}\r\n
\r\n // \r\n )\r\n }\r\n const handleScrollEnd = (rowPerpage: number) => {\r\n // setMockData(createRecord(rowPerpage))\r\n const param = {} //formatParams.current\r\n\r\n const params = {\r\n // userId:\r\n // profileStore && profileStore.profile && profileStore.profile.userId\r\n // ? profileStore.profile.userId\r\n // : undefined,\r\n userId: 1,\r\n pageNumber: 1, //param && param?.pageNumber ? param?.pageNumber : 1,\r\n rowsPerPage: rowPerpage,\r\n // keywordSearch: param && param.keywordSearch ? param.keywordSearch : undefined,\r\n // projectStatusId: param && param.projectStatusId ? param.projectStatusId : undefined,\r\n // projectSubmitTypeId: param && param.projectSubmitTypeId ? param.projectSubmitTypeId : undefined,\r\n // sortingCol: param && param.sortingCol ? param.sortingCol : undefined,\r\n // sortingType: param && param.sortingType ? param.sortingType : undefined,\r\n }\r\n getListTbl(params)\r\n }\r\n return (\r\n
\r\n \r\n\r\n {/* {\r\n // console.log('onclickSort', params)\r\n }}\r\n onChangePage={(params: ReturnPagingAndSortType) => {\r\n // console.log('onChangePage', params)\r\n }}\r\n //form service\r\n pagination={{\r\n page: 0,\r\n pageCount: 10,\r\n pageSize: 10,\r\n paginationMode: 'server',\r\n rowCount: 100,\r\n }}\r\n sortModel={[{ field: 'name', sort: 'asc' }]}\r\n currentPage={0}\r\n /> */}\r\n
\r\n )\r\n}\r\n\r\nconst TableExam = (props: any) => {\r\n // const tableEaxamModel = useTableExam()\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport default TableExam\r\n","import { useRef } from 'react'\r\nimport useAppAlertMessageAction from '../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nconst useDialogPlayground = () => {\r\n const dialogOneRef = useRef>()\r\n const dialogTwoRef = useRef>()\r\n\r\n const translate = useTranslate()\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n\r\n const handleRefDialogOne = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogOneRef.current = func\r\n }\r\n const handleRefDialogTwo = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const handleClickDialogOne = () => {\r\n dialogOneRef.current?.openDialog()\r\n }\r\n const handleClickDialogTwo = () => {\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n const handleClickApplicationAlertMessage = () => {\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: 'Test Alert Message Application.',\r\n })\r\n }\r\n return {\r\n //props\r\n //Event\r\n onRefDialogOne: handleRefDialogOne,\r\n onRefDialogTwo: handleRefDialogTwo,\r\n onClickDialogOne: handleClickDialogOne,\r\n onClickDialogTwo: handleClickDialogTwo,\r\n onClickApplicationAlertMessage: handleClickApplicationAlertMessage,\r\n }\r\n}\r\n\r\nexport default useDialogPlayground\r\n","import useDialogPlayground from './useDialogPlayground'\r\nimport Dialog from '../../../../control/dialog/dialog'\r\nimport Button from '../../../../control/button/button'\r\n\r\ntype DialogPlaygroundType = ReturnType\r\nconst DialogPlaygroundView = (props: DialogPlaygroundType) => {\r\n const { onRefDialogOne, onRefDialogTwo, onClickDialogOne, onClickDialogTwo, onClickApplicationAlertMessage } = props\r\n return (\r\n
\r\n

Dialog

\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nconst DialogPlayground = () => {\r\n const dialogPlaygroundModel = useDialogPlayground()\r\n return \r\n}\r\n\r\nexport default DialogPlayground\r\n","import { atom } from 'recoil'\r\nimport { useRecoilValue } from 'recoil'\r\n\r\nexport const playgroundAtom = atom({\r\n key: 'playgroundAtom',\r\n default: {\r\n profile: {\r\n firstName: 'Siriwat',\r\n lastName: 'Saengbanlang',\r\n },\r\n role: '',\r\n },\r\n})\r\n\r\nconst usePlaygroundAtom = () => {\r\n const playground = useRecoilValue(playgroundAtom)\r\n return {\r\n ...playground,\r\n }\r\n}\r\n\r\nexport default usePlaygroundAtom\r\n","import { useSetRecoilState } from 'recoil'\r\nimport { playgroundAtom } from './playgroundStore'\r\nconst usePlaygroundAtomFunction = () => {\r\n const setPlayground = useSetRecoilState(playgroundAtom)\r\n\r\n const setFirstName = (value: string) => {\r\n setPlayground((prevState) => ({\r\n ...prevState,\r\n profile: {\r\n ...prevState.profile,\r\n firstName: `${value}`,\r\n },\r\n }))\r\n }\r\n\r\n return {\r\n setFirstName,\r\n }\r\n}\r\n\r\nexport default usePlaygroundAtomFunction\r\n","import usePlaygroundAtom from '../../../../stores/playground/playgroundStore'\r\nimport usePlaygroundAction from '../../../../stores/playground/usePlaygroundAction'\r\n\r\nconst useAtomPlayground = () => {\r\n const playgroundStore = usePlaygroundAtom()\r\n const playgroundAction = usePlaygroundAction()\r\n\r\n const handleClickSetFirstName = () => {\r\n playgroundAction.setFirstName(`Chanon`)\r\n }\r\n return {\r\n onClickSetFirstName: handleClickSetFirstName,\r\n playgroundStore,\r\n }\r\n}\r\n\r\nexport default useAtomPlayground\r\n","import useAtomPlayground from './useAtomPlayground'\r\nimport Button from '../../../../control/button/button'\r\n\r\ntype DialogPlaygroundType = ReturnType\r\nconst AtomPlaygroundView = (props: DialogPlaygroundType) => {\r\n const { playgroundStore, onClickSetFirstName } = props\r\n return (\r\n
\r\n

Use Atom Example:

\r\n
\r\n \r\n Set First Name\r\n \r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nconst AtomPlayground = () => {\r\n const atomPlayground = useAtomPlayground()\r\n return \r\n}\r\n\r\nexport default AtomPlayground\r\n","const useFormPlayground = () => {\r\n const handleSubmit = (val: any) => {}\r\n return {\r\n onSubmit: handleSubmit,\r\n }\r\n}\r\n\r\nexport default useFormPlayground\r\n","import { useField } from 'react-final-form'\r\nimport useTranslate from '../../i18n/useTranslate'\r\nimport { composeValidators, selectRequired } from '../../utilities/validate'\r\nimport { useType } from './autocompleteType'\r\n\r\nexport type FieldRequired = boolean | { showAsterisk?: boolean; triggedValidate?: boolean; errorMessage?: string }\r\n\r\nconst useMyAutocomplete = (props: useType) => {\r\n const { name, required, validates = [] } = props\r\n const translate = useTranslate()\r\n let mergeValidate = validates\r\n if ((typeof required === 'boolean' && required) || (typeof required === 'object' && required?.triggedValidate)) {\r\n mergeValidate = [\r\n selectRequired(typeof required === 'object' ? required.errorMessage : `${translate.get('MESSAGE.M016')}`),\r\n ...mergeValidate,\r\n ]\r\n }\r\n\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate),\r\n })\r\n\r\n return { field }\r\n}\r\n\r\nexport default useMyAutocomplete\r\n","import React from 'react'\r\nimport { FormControl, FormHelperText, Grid, Typography, Popper } from '@material-ui/core'\r\nimport TextField from '@material-ui/core/TextField'\r\nimport Autocomplete from '@material-ui/lab/Autocomplete'\r\nimport useMyAutocomplete from './useAutocomplete'\r\nimport { TOptions, MyAutocompleteViewProps, MyAutocompleteProps } from './autocompleteType'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { omit } from 'lodash'\r\nimport ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown'\r\nlet MyAutocompleteView: React.FC = ({\r\n onChangeValue,\r\n onOpenOpt,\r\n materialInputProps,\r\n field,\r\n options,\r\n required,\r\n error = false,\r\n zIndex,\r\n}) => {\r\n const { input, meta } = field\r\n let isError = false\r\n if (required || error) {\r\n isError = (meta.error && meta.invalid && meta.touched) || error ? true : false\r\n }\r\n const classes = useStyles(isError)\r\n const getLabel = () => {\r\n const myLabel = required ? (\r\n \r\n \r\n {materialInputProps.label || ''}{' '}\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n {materialInputProps.label || ''}\r\n \r\n \r\n )\r\n return (\r\n \r\n {myLabel}\r\n \r\n )\r\n }\r\n\r\n const getValue = () => {\r\n //ทำแบบนี้เพราะเวลาเปลี่ยนภาษา label จะได้เปลี่ยนตาม\r\n const val: any = input.value ?? null\r\n if (val && val !== '') {\r\n const opt = options ?? []\r\n const filter = opt.filter((itm) => String(itm.value) === String(val.value))\r\n if (filter?.length !== 0) {\r\n return { ...val, label: filter[0].label }\r\n }\r\n }\r\n\r\n return input.value\r\n }\r\n return (\r\n \r\n {getLabel()}\r\n\r\n ไม่มีข้อมูล}\r\n options={options}\r\n getOptionLabel={(option) => (option.label ? option.label : '')}\r\n disabled={materialInputProps?.disabled}\r\n getOptionDisabled={(option: any) => option.disabled === true}\r\n getOptionSelected={(option: any, value: any) => {\r\n if (!value) return false\r\n return option.value === value.value\r\n }}\r\n value={getValue() ? getValue() : null}\r\n PopperComponent={(props) => (\r\n \r\n )}\r\n renderInput={(params) => {\r\n return (\r\n <>\r\n \r\n {' '}\r\n \r\n \r\n ),\r\n }\r\n : {\r\n ...params.InputProps,\r\n classes: {\r\n root: classes.inputRoot,\r\n },\r\n }\r\n }\r\n />\r\n {isError && meta.error}\r\n \r\n )\r\n }}\r\n onChange={(e, value: TOptions) => {\r\n input.onChange(value)\r\n\r\n if (onChangeValue) {\r\n onChangeValue(value)\r\n }\r\n }}\r\n onOpen={onOpenOpt}\r\n />\r\n \r\n )\r\n}\r\n\r\nlet MyAutocomplete: React.FC = ({ name, required, validates, options, ...others }) => {\r\n const myAutocomplete = useMyAutocomplete({ name, required, validates })\r\n return \r\n}\r\n\r\nexport default MyAutocomplete\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n label: {\r\n marginBottom: 10,\r\n color: (isError: any) => {\r\n if (isError) {\r\n return '#ff4d4f'\r\n } else {\r\n return ''\r\n }\r\n },\r\n },\r\n errorText: {\r\n fontSize: '12px',\r\n color: '#ff4d4f',\r\n },\r\n inputRoot: {\r\n '&$disabled': {\r\n color: '#000000',\r\n backgroundColor: '#F0F0F0C6',\r\n },\r\n borderRadius: '8px !important',\r\n },\r\n disabled: {},\r\n}))\r\n","import { composeValidators, selectRequired } from '../../utilities/validate'\r\nimport { useField } from 'react-final-form'\r\nimport { UseDatePickerProps } from './datepickerType'\r\n\r\nconst useMyDatePicker = ({ name, required, validates = [] }: UseDatePickerProps) => {\r\n let mergeValidate = validates\r\n if ((typeof required === 'boolean' && required) || (typeof required === 'object' && required?.triggedValidate)) {\r\n mergeValidate = [\r\n selectRequired(typeof required === 'object' ? required.errorMessage : undefined),\r\n ...mergeValidate,\r\n ]\r\n }\r\n\r\n const field = useField(name, { validate: composeValidators(...mergeValidate) })\r\n return { field }\r\n}\r\n\r\nexport default useMyDatePicker\r\n","import React, { Fragment } from 'react'\r\nimport { MuiPickersUtilsProvider, DatePicker } from 'material-ui-thai-datepickers'\r\n// import { MuiPickersUtilsProvider, DatePicker } from '@material-ui/pickers'\r\nimport moment from 'moment'\r\nimport MomentUtils from '@date-io/moment'\r\nimport 'moment/locale/th'\r\nimport { FormControl, FormHelperText, Grid, Typography } from '@material-ui/core'\r\nimport useDatepicker from './useDatepicker'\r\nimport { DatePickerViewProps, MyDatePickerProps } from './datepickerType'\r\nimport useLanguageStore from '../../stores/language/languageStore'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { CalendarTodayOutlined } from '@material-ui/icons'\r\n\r\nmoment.locale('en') // set to eng\r\n///view\r\n\r\nconst MyDatePickerView: React.FC = ({\r\n onChangeValue,\r\n required,\r\n label,\r\n field,\r\n disabled,\r\n minDate,\r\n maxDate,\r\n clearable = true,\r\n disabledWeekend = false,\r\n icon = ,\r\n size = 'small',\r\n ...others\r\n}) => {\r\n const { input, meta } = field\r\n const isError = meta.error && meta.invalid && meta.touched ? true : false\r\n const classes = useStyles(isError)\r\n\r\n const languageStore = useLanguageStore()\r\n\r\n React.useEffect(() => {\r\n if (languageStore.currentLanguage === 'th') {\r\n moment.locale('th') // set to thai\r\n } else {\r\n moment.locale('en') // set to eng\r\n }\r\n }, [languageStore.currentLanguage])\r\n\r\n const getLabel = () => {\r\n const myLabel = required ? (\r\n \r\n \r\n {label}\r\n \r\n \r\n \r\n *\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n {label || ''}\r\n \r\n \r\n )\r\n return (\r\n \r\n {myLabel}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n \r\n {getLabel()}\r\n\r\n {/* */}\r\n {\r\n input.onChange(newDate?.format('YYYY-MM-DD'))\r\n if (onChangeValue) {\r\n onChangeValue(String(newDate?.format('YYYY-MM-DD')))\r\n }\r\n }}\r\n inputVariant={'outlined'}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n InputProps={{\r\n endAdornment: {icon && icon},\r\n }}\r\n size={size}\r\n onClose={input.onBlur} //เพื่อให้ onTouch จาก react final form เห็น\r\n animateYearScrolling\r\n variant=\"dialog\"\r\n format=\"DD MMM YYYY\"\r\n pickerHeaderFormat=\"ddd D MMMM\"\r\n yearOffset={languageStore.currentLanguage === 'th' ? 543 : undefined}\r\n disabled={disabled}\r\n clearable={clearable}\r\n minDate={disabled ? undefined:minDate}\r\n maxDate={disabled ? undefined:maxDate}\r\n shouldDisableDate={\r\n disabledWeekend\r\n ? (date) => {\r\n return moment(date).day() === 0 || moment(date).day() === 6\r\n }\r\n : () => false\r\n }\r\n error={isError}\r\n className={classes.disable}\r\n />\r\n\r\n {isError && meta.error}\r\n \r\n \r\n )\r\n}\r\n\r\n//Combind Logic&View Component\r\n\r\nlet MyDatePicker: React.FC = ({ required, name, ...others }) => {\r\n const myDatePicker = useDatepicker({ required, name })\r\n return \r\n}\r\n\r\nexport default MyDatePicker\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n label: {\r\n marginBottom: 10,\r\n color: (isError: any) => {\r\n if (isError) {\r\n return '#ff4d4f'\r\n } else {\r\n return ''\r\n }\r\n },\r\n },\r\n errorText: {\r\n fontSize: '12px',\r\n color: '#ff4d4f',\r\n },\r\n disable: {\r\n '& .Mui-disabled': {\r\n color: '#000000',\r\n backgroundColor: '#F0F0F0C6',\r\n },\r\n },\r\n}))\r\n","import { useField } from 'react-final-form'\r\nimport { composeValidators, selectRequired } from '../../utilities/validate'\r\n// import { useType } from './multiSelectType'\r\n\r\nexport type FieldRequired = boolean | { showAsterisk?: boolean; triggedValidate?: boolean; errorMessage?: string }\r\n\r\nconst useMultiSelect = (props: any) => {\r\n const { name, required, validates = [] } = props\r\n let mergeValidate = validates\r\n if ((typeof required === 'boolean' && required) || (typeof required === 'object' && required.triggedValidate)) {\r\n mergeValidate = [\r\n selectRequired(typeof required === 'object' ? required.errorMessage : undefined),\r\n ...mergeValidate,\r\n ]\r\n }\r\n\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate),\r\n })\r\n\r\n return { field }\r\n}\r\n\r\nexport default useMultiSelect\r\n","import React from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport MenuItem from '@material-ui/core/MenuItem'\r\nimport FormControl from '@material-ui/core/FormControl'\r\nimport ListItemText from '@material-ui/core/ListItemText'\r\nimport Select from '@material-ui/core/Select'\r\nimport Checkbox from '@material-ui/core/Checkbox'\r\nimport { MyMultiSelectCtrlType, MultipleSelectViewType } from './multiSelectType'\r\nimport useMultiSelect from './useMultiSelect'\r\nimport { FormHelperText, Grid, Typography } from '@material-ui/core'\r\nimport useTranslate from '../../i18n/useTranslate'\r\n\r\nconst ITEM_HEIGHT = 48\r\nconst ITEM_PADDING_TOP = 8\r\n// const MenuProps = {\r\n// PaperProps: {\r\n// style: {\r\n// maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP,\r\n// width: 250,\r\n// },\r\n// },\r\n// }\r\n\r\nconst MenuProps = {\r\n PaperProps: {\r\n style: {\r\n maxHeight: ITEM_HEIGHT * 6.5 + ITEM_PADDING_TOP,\r\n width: 250,\r\n },\r\n },\r\n getContentAnchorEl: null,\r\n}\r\n\r\nlet MultipleSelectView: React.FC = ({\r\n handleValueChange,\r\n field,\r\n required,\r\n maxLength,\r\n materialInputProps = {},\r\n icon,\r\n defaultValue,\r\n resetButtom = false,\r\n label = '',\r\n option,\r\n disabled,\r\n placeholder,\r\n size = 'small',\r\n isCheckedAll = false,\r\n ...props\r\n}) => {\r\n const { input, meta } = field\r\n\r\n let isError = meta.error && meta.invalid && meta.touched ? true : false\r\n const classes = useStyles(isError)\r\n const [valueList, setValueList] = React.useState([])\r\n const [checkAll, setCheckAll] = React.useState(false)\r\n const translate = useTranslate()\r\n\r\n React.useEffect(() => {\r\n if (!input.value) {\r\n setValueList([])\r\n }\r\n }, [input.value])\r\n\r\n React.useEffect(() => {\r\n if (defaultValue) {\r\n setValueList(defaultValue as string[])\r\n // setCheckAll(true)\r\n }\r\n }, [defaultValue])\r\n\r\n React.useEffect(() => {\r\n if (option && option?.length > 0) {\r\n if (defaultValue) {\r\n const dValue = option.map((itm) => itm.value as string)\r\n const _ = require('lodash')\r\n if (_.isEqual(defaultValue.sort(), dValue?.sort())) {\r\n setCheckAll(true)\r\n } else {\r\n setCheckAll(false)\r\n }\r\n }\r\n }\r\n }, [option])\r\n\r\n const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {\r\n const value = event.target.value as any[]\r\n if (value.some((itmAll) => itmAll === 'all')) {\r\n const afterCheckedAll = !checkAll\r\n setCheckAll(afterCheckedAll)\r\n\r\n let _value: any[] | undefined = []\r\n if (afterCheckedAll) {\r\n _value = option?.map((item) => item.value)\r\n }\r\n\r\n input.onChange(_value)\r\n setValueList(_value as string[])\r\n } else {\r\n const OldList = option?.map((item) => item.value)\r\n const _ = require('lodash')\r\n if (_.isEqual(value.sort(), OldList?.sort())) {\r\n setCheckAll(true)\r\n } else {\r\n setCheckAll(false)\r\n }\r\n input.onChange(value)\r\n setValueList(value as string[])\r\n }\r\n }\r\n\r\n const getLabel = () => {\r\n const myLabel = required ? (\r\n \r\n \r\n {label || ''}\r\n \r\n \r\n \r\n {label ? `*` : ''}\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n {label || ''}\r\n \r\n \r\n )\r\n return (\r\n \r\n {myLabel}\r\n \r\n )\r\n }\r\n\r\n return (\r\n
\r\n \r\n {getLabel()}\r\n 0 ? valueList : []}\r\n onChange={handleChange}\r\n displayEmpty={true}\r\n className={disabled ? classes.disable : classes.myStyle}\r\n renderValue={(selected) => {\r\n const selectedItem = selected as any[]\r\n if (selectedItem && selectedItem.length > 0) {\r\n var filtered = option?.filter(function (e) {\r\n return selectedItem.indexOf(e.value) > -1\r\n })\r\n\r\n let listLabel: any[] = []\r\n if (filtered) {\r\n listLabel = filtered.map((itm: any) => {\r\n return itm.label\r\n })\r\n }\r\n return
{(listLabel as string[]).join(', ')}
\r\n } else {\r\n return \r\n }\r\n }}\r\n MenuProps={{\r\n ...MenuProps,\r\n anchorOrigin: {\r\n vertical: 'bottom',\r\n horizontal: 'left',\r\n },\r\n }}\r\n >\r\n {isCheckedAll && (\r\n \r\n \r\n \r\n \r\n )}\r\n {option &&\r\n option.map((optionItm) => (\r\n \r\n -1} />\r\n \r\n \r\n ))}\r\n \r\n
\r\n {isError && meta.error}\r\n
\r\n )\r\n}\r\n\r\nlet MyMultiSelectCtrl: React.FC = ({\r\n handleValueChange,\r\n name,\r\n required,\r\n validates,\r\n maxLength,\r\n ...props\r\n}) => {\r\n const myMultiselect = useMultiSelect({\r\n name,\r\n required,\r\n validates,\r\n })\r\n return \r\n}\r\n\r\nexport default MyMultiSelectCtrl\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n formControl: {\r\n margin: theme.spacing(1),\r\n minWidth: 120,\r\n maxWidth: 300,\r\n },\r\n chips: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n chip: {\r\n margin: 2,\r\n },\r\n noLabel: {\r\n marginTop: theme.spacing(3),\r\n },\r\n myCheckAll: {\r\n backgroundColor: '#00000014',\r\n },\r\n label: {\r\n marginBottom: 10,\r\n color: (isError: any) => {\r\n if (isError) {\r\n return '#ff4d4f'\r\n } else {\r\n return ''\r\n }\r\n },\r\n },\r\n input: {\r\n maxWidth: '100%',\r\n whiteSpace: 'pre-wrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n display: '-webkit-box',\r\n '-webkit-line-clamp': 1,\r\n '-webkit-box-orient': 'vertical',\r\n },\r\n myStyle: {\r\n borderRadius: '8px !important',\r\n },\r\n disable: { backgroundColor: '#F0F0F0C6', borderRadius: '8px ' },\r\n errorText: {\r\n fontSize: '12px',\r\n color: '#ff4d4f',\r\n },\r\n}))\r\n","import React, { useRef, useState } from 'react'\r\nimport { useField } from 'react-final-form'\r\nimport { FieldValidator } from 'final-form'\r\nimport {\r\n UseUploadFileType,\r\n MyFileType,\r\n SubTopicPageList,\r\n ReturnDataType,\r\n NewReturnListFileType,\r\n UploadResponseType,\r\n} from './uploadFileTypeTest'\r\nimport { composeValidators, uploadRequired } from '../../../../../utilities/validate'\r\nimport useAppAlertMessageAction from '../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\n\r\nconst useUploadFile = (props: UseUploadFileType) => {\r\n const { required, requiredErrorMessage, validates = [], onChangeUpload, initialData, topicID } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const refElementUpload = useRef()\r\n const refElementTextField = useRef()\r\n const [lstFileUpload, setLstFileUpload] = useState()\r\n const [returnData, setReturnData] = useState()\r\n\r\n const { name } = props\r\n\r\n React.useEffect(() => {\r\n initialData.forEach((upload: any) => {\r\n if (upload.uploadFileObj.documentTopicID === topicID) {\r\n if (upload.uploadFileObj.fileList.length > 0) {\r\n setLstFileUpload(upload.uploadFileObj.fileList)\r\n }\r\n }\r\n })\r\n }, [JSON.stringify(initialData)])\r\n const mergeValidate = () => {\r\n let validate: Array> = []\r\n if (typeof required === 'boolean' && required) {\r\n validate = [uploadRequired(requiredErrorMessage), ...validates]\r\n }\r\n\r\n return validate\r\n }\r\n\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate()),\r\n })\r\n\r\n const handleClickUpload = () => {\r\n refElementUpload.current.click()\r\n }\r\n const handleChangeUpload = async (event: any, mainTopicID: number) => {\r\n const fileList: FileList = event.target.files\r\n let lstFile: Array = []\r\n let lstDisplayName: Array = []\r\n const numFiles = fileList.length\r\n const numMaxUploadFile = Number(process.env.REACT_APP_MAX_UPLOAD_FILE_DOCUMENT)\r\n if (numFiles > 0) {\r\n for (let i = 0; i < numFiles; i++) {\r\n const file: MyFileType = fileList[i]\r\n file.fileID = `${i}_${fileList[i].lastModified}_${fileList[i].name}`\r\n if (fileList[i].size > 5242880 || numFiles > numMaxUploadFile) {\r\n //5 mb to byte (1 mb = 1048576 byte)\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n message: translate.get('ALERT.CONTENT.UPLOAD_NOT_EXCEED_FILE', [String(numMaxUploadFile)]),\r\n })\r\n\r\n lstFile = []\r\n lstDisplayName = []\r\n\r\n break\r\n }\r\n lstFile.push(file)\r\n lstDisplayName.push(file.name)\r\n }\r\n }\r\n\r\n // --- ############################################################################## --- //\r\n\r\n const uploadRes = await callUploadFile(lstFile, mainTopicID)\r\n let myNewListFile: NewReturnListFileType[]\r\n\r\n myNewListFile = uploadRes.map((itm: UploadResponseType) => {\r\n return {\r\n documentTopicID: mainTopicID,\r\n fileToken: `${itm.fileToken}`,\r\n filename: itm.filename,\r\n fileID: `${itm.fileToken}`,\r\n }\r\n })\r\n setLstFileUpload(myNewListFile)\r\n const newReturnData = { ...returnData, fileList: myNewListFile, documentTopicID: mainTopicID }\r\n setReturnData(newReturnData)\r\n field.input.onChange(newReturnData)\r\n refElementTextField.current.value = lstDisplayName.join(', ')\r\n }\r\n\r\n const callUploadFile = async (fileList: Array, mainTopicID: number) => {\r\n var formData = new FormData()\r\n fileList.forEach((file: MyFileType) => {\r\n formData.append('files', file)\r\n })\r\n\r\n const res = await callWebService.uploadFileTemp(formData)\r\n return res.result\r\n\r\n // setDocLst(lstDisplayName)\r\n }\r\n const handleClickClear = (file: any) => {\r\n // file: MyFileType\r\n let currentValue: ReturnDataType = field.input.value as unknown as ReturnDataType\r\n const newLstFile = currentValue.fileList?.filter((itm) => itm.fileID !== file.fileID)\r\n let newReturnData = { ...returnData, fileList: newLstFile }\r\n if (newLstFile?.length === 0) {\r\n newReturnData = { ...returnData, fileList: newLstFile, subTopicPageList: [] } //กรณีลบไฟล์ออกหมดจะให้เคลียร์ค่า page ออกด้วย\r\n } else {\r\n newReturnData = { ...returnData, fileList: newLstFile }\r\n }\r\n setReturnData(newReturnData)\r\n field.input.onChange(newReturnData)\r\n setLstFileUpload(newLstFile)\r\n refElementTextField.current.value = newLstFile?.join(', ')\r\n }\r\n\r\n const handleChangeInputPage = (page: string, subTopicID: number, mainTopicID?: number | null) => {\r\n let obj = { page: page, subtopicID: subTopicID }\r\n\r\n // --- Logic --- //\r\n //1. delete old value\r\n //2. push new value\r\n let newReturnData = null\r\n if (returnData?.subTopicPageList && returnData?.subTopicPageList?.length > 0) {\r\n const deletedOldSubTopicList = returnData.subTopicPageList.filter((itm: SubTopicPageList) => {\r\n //delete old value\r\n return itm.mainTopicID != mainTopicID || itm.subTopicID != subTopicID\r\n })\r\n let newSubTopicPageList = [...deletedOldSubTopicList, { ...obj }] //push new value\r\n newReturnData = { ...returnData, subTopicPageList: newSubTopicPageList }\r\n setReturnData(newReturnData)\r\n field.input.onChange(newReturnData)\r\n } else {\r\n newReturnData = { ...returnData, subTopicPageList: [obj] }\r\n setReturnData(newReturnData)\r\n field.input.onChange(newReturnData)\r\n }\r\n }\r\n return {\r\n refElementUpload,\r\n refElementTextField,\r\n field,\r\n lstFileUpload,\r\n onClickUpload: handleClickUpload,\r\n onChangeUpload: handleChangeUpload,\r\n onClickClear: handleClickClear,\r\n onChangeInputPage: handleChangeInputPage,\r\n }\r\n}\r\n\r\nexport default useUploadFile\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport Button from '@material-ui/core/Button'\r\nimport TextField from '@material-ui/core/TextField'\r\nimport FormHelperText from '@material-ui/core/FormHelperText'\r\nimport FormControl from '@material-ui/core/FormControl'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport useUploadFile from './useUploadFileTest'\r\nimport { UploadFileViewType, UploadFileType, NewReturnListFileType } from './uploadFileTypeTest'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Typography, withStyles } from '@material-ui/core'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\n\r\nexport type UplodeFileObjYype = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subTopicID: number\r\n }[]\r\n }\r\n}\r\nconst UploadFileView = (props: UploadFileViewType) => {\r\n const {\r\n disabled,\r\n required,\r\n label = '',\r\n name,\r\n field: { meta },\r\n refElementUpload,\r\n refElementTextField,\r\n onClickUpload,\r\n onChangeUpload,\r\n onClickClear,\r\n title,\r\n subTitleList,\r\n lstFileUpload,\r\n dataSource,\r\n topicID,\r\n initialData,\r\n onChangeInputPage,\r\n } = props\r\n const isError = !disabled && meta.error && meta.touched ? true : false\r\n const classes = useStyles(isError)\r\n const translate = useTranslate()\r\n const renderIcon = (file: NewReturnListFileType) => {\r\n return (\r\n \r\n )\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n {dataSource?.no}. {dataSource?.code} {dataSource?.name_th}{' '}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.UPLOAD')}\r\n \r\n \r\n \r\n {lstFileUpload?.map((itm: NewReturnListFileType) => {\r\n return (\r\n \r\n \r\n \r\n \r\n {renderIcon(itm)}\r\n \r\n {dataSource?.code} {itm.filename}\r\n \r\n \r\n \r\n {\r\n onClickClear(itm)\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n {lstFileUpload && lstFileUpload.length > 0 && subTitleList && subTitleList.length > 0 && (\r\n \r\n \r\n \r\n โปรดกรอกหน้าที่อยู่ของเอกสารดังนี้(กรณีไม่มีกรุณาเว้นว่างไว้){' '}\r\n \r\n \r\n \r\n หน้า\r\n \r\n {subTitleList?.map((itm: any, index: number) => {\r\n const uploadObj = initialData.filter(\r\n (itm: UplodeFileObjYype) => itm.uploadFileObj.documentTopicID === topicID,\r\n )\r\n const initialSubtopic = uploadObj[0].uploadFileObj.subTopicPageList\r\n return (\r\n <>\r\n \r\n {`${itm.no}. ${itm.name_th}`}\r\n \r\n \r\n {\r\n onChangeInputPage(e.target.value, itm.id, dataSource?.id)\r\n }}\r\n />\r\n \r\n \r\n )\r\n })}\r\n \r\n )}\r\n \r\n\r\n {\r\n onChangeUpload(e, topicID)\r\n }}\r\n hidden\r\n />\r\n
\r\n ),\r\n readOnly: true,\r\n }}\r\n type=\"text\"\r\n />\r\n \r\n {isError && meta.error}\r\n \r\n \r\n )\r\n}\r\n\r\nconst UploadFile = (props: UploadFileType) => {\r\n const {} = props\r\n const uploadFileModel = useUploadFile(props)\r\n return \r\n}\r\n\r\nexport default UploadFile\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n input: {\r\n '&>input': {\r\n cursor: 'default !important',\r\n },\r\n },\r\n button: {\r\n padding: '7px 16px',\r\n borderRadius: '0px 5px 5px 0px',\r\n },\r\n button_end_icon: {\r\n paddingRight: '0px',\r\n },\r\n clear_icon: {\r\n margin: theme.spacing(1),\r\n },\r\n label: {\r\n marginBottom: 10,\r\n color: (isError: any) => {\r\n if (isError) {\r\n return '#ff4d4f'\r\n } else {\r\n return ''\r\n }\r\n },\r\n },\r\n errorText: {\r\n fontSize: '12px',\r\n color: '#ff4d4f',\r\n },\r\n inputPage: {\r\n boxSizing: 'border-box',\r\n padding: '15px',\r\n },\r\n}))\r\n","import { Grid, Typography } from '@material-ui/core'\r\nimport moment from 'moment'\r\nimport { FC } from 'react'\r\nimport { useForm } from 'react-final-form'\r\nimport useTranslate from '../../i18n/useTranslate'\r\nimport DatePicker from './datepicker'\r\n\r\nconst DateRangePicker: FC<{\r\n names: {\r\n start: string\r\n end: string\r\n }\r\n label: string\r\n minDates?: {\r\n start?: Date\r\n end?: Date\r\n }\r\n maxDates?: {\r\n start?: Date\r\n end?: Date\r\n }\r\n}> = ({ names, label, minDates, maxDates }) => {\r\n const form = useForm()\r\n const translate = useTranslate()\r\n\r\n const handleChangeStart = () => {\r\n const formVal = form.getState().values\r\n const startDate = moment(formVal[names.start])\r\n const endDate = moment(formVal[names.end])\r\n if (startDate > endDate) {\r\n startMoreThanEnd()\r\n }\r\n if (formVal[names.start] && !formVal[names.end]) {\r\n form.getFieldState(names.end)?.change(formVal[names.start])\r\n }\r\n }\r\n\r\n const handleChangeEnd = () => {\r\n const formVal = form.getState().values\r\n const startDate = moment(formVal[names.start])\r\n const endDate = moment(formVal[names.end])\r\n if (endDate < startDate) {\r\n endLessThanStart()\r\n }\r\n if (formVal[names.end] && !formVal[names.start]) {\r\n form.getFieldState(names.start)?.change(formVal[names.end])\r\n }\r\n }\r\n\r\n const startMoreThanEnd = () => {\r\n form.getFieldState(names.end)?.change(form.getFieldState(names.start)?.value)\r\n }\r\n\r\n const endLessThanStart = () => {\r\n form.getFieldState(names.start)?.change(form.getFieldState(names.end)?.value)\r\n }\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n \r\n \r\n \r\n   {translate.get('LABEL.END_DATE')}  \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default DateRangePicker\r\n","import useFormPlayground from './useFormPlayground'\r\nimport Button from '../../../../control/button/button'\r\nimport { Form } from 'react-final-form'\r\nimport TextField from '../../../../control/textfield/textfield'\r\nimport Autocomplete from '../../../../control/autocomplete/autocomplete'\r\nimport DatePicker from '../../../../control/datepicker/datepicker'\r\nimport MultiSelect from '../../../../control/multiSelect/multiSelect'\r\n\r\nimport UploadFile from './uploadFile/uploadFileTest'\r\nimport { validateEmail } from '../../../../utilities/validate'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport { Grid } from '@material-ui/core'\r\nimport DateRangePicker from '../../../../control/datepicker/DateRangePicker'\r\nimport moment from 'moment'\r\nconst data = [\r\n {\r\n id: 10,\r\n no: 1,\r\n value: 'บันทึกข้อความแจ้งความประสงค์ยื่นเสนอข้อเสนอโครงการวิจัย/โครงร่างวิทยานิพนธ์ เพื่อขอรับการพิจารณาด้านจริยธรรมการวิจัยในคน',\r\n name_en:\r\n 'บันทึกข้อความแจ้งความประสงค์ยื่นเสนอข้อเสนอโครงการวิจัย/โครงร่างวิทยานิพนธ์ เพื่อขอรับการพิจารณาด้านจริยธรรมการวิจัยในคน',\r\n code: null,\r\n subtopic: [],\r\n },\r\n {\r\n id: 11,\r\n no: 2,\r\n name_th: 'แบบฟอร์มขอรับการพิจารณาจริยธรรมการวิจัยในคน',\r\n name_en: 'แบบฟอร์มขอรับการพิจารณาจริยธรรมการวิจัยในคน',\r\n code: 'AF 03-07',\r\n subtopic: [],\r\n },\r\n {\r\n id: 12,\r\n no: 3,\r\n name_th: 'เอกสารข้อมูลสำหรับกลุ่มตัวอย่าง/ผู้มีส่วนร่วมในการวิจัย',\r\n name_en: 'เอกสารข้อมูลสำหรับกลุ่มตัวอย่าง/ผู้มีส่วนร่วมในการวิจัย',\r\n code: 'AF 04-07',\r\n subtopic: [],\r\n },\r\n {\r\n id: 13,\r\n no: 4,\r\n name_th: 'หนังสือยินยอมของกลุ่มตัวอย่าง/ผู้มีส่วนร่วมในการวิจัย',\r\n name_en: 'หนังสือยินยอมของกลุ่มตัวอย่าง/ผู้มีส่วนร่วมในการวิจัย',\r\n code: 'AF 05-07',\r\n subtopic: [],\r\n },\r\n {\r\n id: 14,\r\n no: 5,\r\n name_th: 'บันทึกข้อความขอยกเว้นหนังสือยินยอม/การขอความยินยอม',\r\n name_en: 'บันทึกข้อความขอยกเว้นหนังสือยินยอม/การขอความยินยอม',\r\n code: 'AF 07-07',\r\n subtopic: [],\r\n },\r\n {\r\n id: 15,\r\n no: 6,\r\n name_th:\r\n 'แผนการดำเนินงานตลอดโครงการ ได้แก่ ตารางกำหนดช่วงระยะเวลา กิจกรรมการวิจัยทุกขั้นตอน รวมทั้งประมาณการด้านเวลาในการขอรับการพิจารณาจริยธรรมการวิจัยในคน',\r\n name_en:\r\n 'แผนการดำเนินงานตลอดโครงการ ได้แก่ ตารางกำหนดช่วงระยะเวลา กิจกรรมการวิจัยทุกขั้นตอน รวมทั้งประมาณการด้านเวลาในการขอรับการพิจารณาจริยธรรมการวิจัยในคน',\r\n code: null,\r\n subtopic: [],\r\n },\r\n {\r\n id: 16,\r\n no: 7,\r\n name_th: 'ประวัติและประสบการณ์ของผู้วิจัยซึ่งแสดงว่ามีความสามารถดำเนินโครงการวิจัยนี้ได้',\r\n name_en: 'ประวัติและประสบการณ์ของผู้วิจัยซึ่งแสดงว่ามีความสามารถดำเนินโครงการวิจัยนี้ได้',\r\n code: null,\r\n subtopic: [],\r\n },\r\n {\r\n id: 17,\r\n no: 8,\r\n name_th:\r\n 'ข้อเสนอโครงการวิจัยฉบับสมบูรณ์/โครงร่างวิทยานิพนธ์ฉบับสมบูรณ์ พิมพ์สองหน้า ซึ่งครอบคลุมเนื้อหา ดังต่อไปนี้',\r\n name_en:\r\n 'ข้อเสนอโครงการวิจัยฉบับสมบูรณ์/โครงร่างวิทยานิพนธ์ฉบับสมบูรณ์ พิมพ์สองหน้า ซึ่งครอบคลุมเนื้อหา ดังต่อไปนี้',\r\n code: null,\r\n subtopic: [\r\n {\r\n id: 1,\r\n no: 1,\r\n name_th: 'ชื่อโครงการวิจัยเป็นภาษาไทยและภาษาอังกฤษ',\r\n name_en: 'ชื่อโครงการวิจัยเป็นภาษาไทยและภาษาอังกฤษ',\r\n code: null,\r\n },\r\n {\r\n id: 2,\r\n no: 2,\r\n name_th: 'ความสำคัญและที่มาของปัญหาที่ทำวิจัย',\r\n name_en: 'ความสำคัญและที่มาของปัญหาที่ทำวิจัย',\r\n code: null,\r\n },\r\n {\r\n id: 3,\r\n no: 3,\r\n name_th: 'การทบทวนวรรณกรรม วัตถุประสงค์ และขอบเขตของโครงการวิจัย',\r\n name_en: 'การทบทวนวรรณกรรม วัตถุประสงค์ และขอบเขตของโครงการวิจัย',\r\n code: null,\r\n },\r\n {\r\n id: 4,\r\n no: 4,\r\n name_th: 'กระบวนการวิจัยและขั้นตอนการดำเนินงาน (โปรดเน้นวิธีสุ่ม/เลือกตัวอย่างและวิธีเก็บข้อมูล)',\r\n name_en: 'กระบวนการวิจัยและขั้นตอนการดำเนินงาน (โปรดเน้นวิธีสุ่ม/เลือกตัวอย่างและวิธีเก็บข้อมูล)',\r\n code: null,\r\n },\r\n {\r\n id: 5,\r\n no: 5,\r\n name_th:\r\n 'กลุ่มตัวอย่าง/ผู้มีส่วนร่วมในการวิจัย เกณฑ์การคัดเลือกผู้มีส่วนร่วมในการวิจัยและเกณฑ์พิจารณาให้ผู้มีส่วนร่วมในการวิจัยออกจากโครงการ และอื่น ๆ (โปรดระบุเกณฑ์การคัดเลือกตัวอย่างเข้าและเกณฑ์การคัดเลือกตัวอย่างออกจากการวิจัยอย่างละเอียด)',\r\n name_en:\r\n 'กลุ่มตัวอย่าง/ผู้มีส่วนร่วมในการวิจัย เกณฑ์การคัดเลือกผู้มีส่วนร่วมในการวิจัยและเกณฑ์พิจารณาให้ผู้มีส่วนร่วมในการวิจัยออกจากโครงการ และอื่น ๆ (โปรดระบุเกณฑ์การคัดเลือกตัวอย่างเข้าและเกณฑ์การคัดเลือกตัวอย่างออกจากการวิจัยอย่างละเอียด)',\r\n code: null,\r\n },\r\n {\r\n id: 6,\r\n no: 6,\r\n name_th: 'รายละเอียดเกี่ยวกับวิธีการติดต่อและวิธีการเข้าถึงผู้มีส่วนร่วมในการวิจัย',\r\n name_en: 'รายละเอียดเกี่ยวกับวิธีการติดต่อและวิธีการเข้าถึงผู้มีส่วนร่วมในการวิจัย',\r\n code: null,\r\n },\r\n {\r\n id: 7,\r\n no: 7,\r\n name_th:\r\n 'วิธีการพิทักษ์สิทธิ ป้องกันความเสี่ยง และรักษาความลับของกลุ่มตัวอย่าง/ผู้มีส่วนร่วมในการวิจัย',\r\n name_en:\r\n 'วิธีการพิทักษ์สิทธิ ป้องกันความเสี่ยง และรักษาความลับของกลุ่มตัวอย่าง/ผู้มีส่วนร่วมในการวิจัย',\r\n code: null,\r\n },\r\n { id: 8, no: 8, name_th: 'รายการเอกสารอ้างอิง', name_en: 'รายการเอกสารอ้างอิง', code: null },\r\n {\r\n id: 9,\r\n no: 9,\r\n name_th: 'ประมาณการด้านงบประมาณหมวดต่าง ๆ ที่ผู้วิจัยได้รับ/จะได้รับทุน หรือใช้ทุนส่วนตัว',\r\n name_en: 'ประมาณการด้านงบประมาณหมวดต่าง ๆ ที่ผู้วิจัยได้รับ/จะได้รับทุน หรือใช้ทุนส่วนตัว',\r\n code: null,\r\n },\r\n {\r\n id: 10,\r\n no: 10,\r\n name_th:\r\n 'เครื่องมือวิจัย เช่น แบบสอบถาม โปรแกรมดำเนินการทดลอง คู่มือ ฯลฯ ที่ผ่านการพิจารณาจากผู้ทรงคุณวุฒิแล้ว',\r\n name_en:\r\n 'เครื่องมือวิจัย เช่น แบบสอบถาม โปรแกรมดำเนินการทดลอง คู่มือ ฯลฯ ที่ผ่านการพิจารณาจากผู้ทรงคุณวุฒิแล้ว',\r\n code: null,\r\n },\r\n {\r\n id: 11,\r\n no: 11,\r\n name_th: 'เอกสารอื่นๆ เช่น เอกสารประชาสัมพันธ์ แผ่นพับโฆษณา แผ่นปลิวโฆษณา ฯลฯ',\r\n name_en: 'เอกสารอื่นๆ เช่น เอกสารประชาสัมพันธ์ แผ่นพับโฆษณา แผ่นปลิวโฆษณา ฯลฯ',\r\n code: null,\r\n },\r\n ],\r\n },\r\n]\r\n\r\nconst response = [\r\n {\r\n documentTopicID: 10,\r\n filename: 'TestExportReport_2052564.pdf',\r\n subtopic: [],\r\n },\r\n {\r\n documentTopicID: 10,\r\n filename: 'TestExportReport_10452564.pdf',\r\n subtopic: [],\r\n },\r\n {\r\n documentTopicID: 17,\r\n filename: 'ExportReport_14052564.pdf',\r\n subtopic: [\r\n {\r\n subtopicID: 1,\r\n page: 1,\r\n },\r\n {\r\n subtopicID: 2,\r\n page: 2,\r\n },\r\n {\r\n subtopicID: 3,\r\n page: 33,\r\n },\r\n {\r\n subtopicID: 4,\r\n page: 4,\r\n },\r\n {\r\n subtopicID: 5,\r\n page: 5,\r\n },\r\n {\r\n subtopicID: 6,\r\n page: 6,\r\n },\r\n {\r\n subtopicID: 7,\r\n page: 7,\r\n },\r\n {\r\n subtopicID: 8,\r\n page: 88,\r\n },\r\n {\r\n subtopicID: 9,\r\n page: 99,\r\n },\r\n {\r\n subtopicID: 10,\r\n page: 11,\r\n },\r\n {\r\n subtopicID: 11,\r\n page: 12,\r\n },\r\n ],\r\n },\r\n]\r\n\r\nconst getUploadInit = () => {\r\n const uploadFileinit = data.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n\r\n uploadFileinit.forEach((itm) => {\r\n // if(itm.uploadFileObj.documentTopicID == )\r\n response.forEach((resItm) => {\r\n if (resItm.documentTopicID === itm.uploadFileObj.documentTopicID) {\r\n let objUpload = {\r\n documentTopicID: resItm.documentTopicID,\r\n fileToken: `${resItm.filename}_${resItm.documentTopicID}`, //fileToken\r\n filename: resItm.filename,\r\n fileID: `${resItm.filename}__${resItm.documentTopicID}`, //fileToken\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(objUpload)\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = resItm.subtopic\r\n }\r\n })\r\n })\r\n\r\n return uploadFileinit\r\n}\r\n\r\nconst mockData = [\r\n {\r\n value: 1,\r\n label: 'ร่าง',\r\n name_en: 'Draft',\r\n },\r\n {\r\n value: 2,\r\n label: 'ส่งเรื่องแล้ว',\r\n name_en: 'ส่งเรื่องแล้ว',\r\n },\r\n {\r\n value: 3,\r\n label: 'รับเรื่องแล้ว',\r\n name_en: 'รับเรื่องแล้ว',\r\n },\r\n {\r\n value: 4,\r\n label: 'กำหนดกรรมการแล้ว',\r\n name_en: 'กำหนดกรรมการแล้ว',\r\n },\r\n {\r\n value: 5,\r\n label: 'รอสังเคราะห์ความเห็น',\r\n name_en: 'รอสังเคราะห์ความเห็น',\r\n },\r\n {\r\n value: 6,\r\n label: 'ดำเนินการทำใบรับรอง',\r\n name_en: 'ดำเนินการทำใบรับรอง',\r\n },\r\n {\r\n value: 11,\r\n label: 'ร่าง',\r\n name_en: 'Draft',\r\n },\r\n {\r\n value: 12,\r\n label: 'ส่งเรื่องแล้ว',\r\n name_en: 'ส่งเรื่องแล้ว',\r\n },\r\n {\r\n value: 13,\r\n label: 'รับเรื่องแล้ว',\r\n name_en: 'รับเรื่องแล้ว',\r\n },\r\n {\r\n value: 14,\r\n label: 'กำหนดกรรมการแล้ว',\r\n name_en: 'กำหนดกรรมการแล้ว',\r\n },\r\n {\r\n value: 15,\r\n label: 'รอสังเคราะห์ความเห็น',\r\n name_en: 'รอสังเคราะห์ความเห็น',\r\n },\r\n {\r\n value: 16,\r\n label: 'ดำเนินการทำใบรับรอง',\r\n name_en: 'ดำเนินการทำใบรับรอง',\r\n },\r\n]\r\ntype DialogPlaygroundType = ReturnType\r\nconst FormPlaygroundView = (props: DialogPlaygroundType) => {\r\n const { onSubmit } = props\r\n return (\r\n
\r\n

Use Form Example:

\r\n
\r\n \r\n {({ handleSubmit, form }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n {({ fields }) =>\r\n fields.map((name, index) => (\r\n \r\n \r\n {}}\r\n subTitleList={data[index].subtopic}\r\n initialData={getUploadInit()}\r\n required\r\n />\r\n \r\n \r\n ))\r\n }\r\n \r\n\r\n \r\n \r\n )\r\n }}\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nconst FormPlayground = () => {\r\n const formPlayground = useFormPlayground()\r\n return \r\n}\r\n\r\nexport default FormPlayground\r\n","import useCallApi from '../../../../utilities/axios'\r\n\r\nconst useApiPlayground = () => {\r\n const callApi = useCallApi()\r\n const handleClickCallPostApi = async () => {\r\n const { data } = await callApi.axiosPost({\r\n url: 'https://gdev.geotalent.co.th/VirtualRunAPI/api/lookup/employee',\r\n params: {\r\n keyword: '',\r\n location: '',\r\n },\r\n })\r\n\r\n return data\r\n }\r\n\r\n const handleClickCallGetApi = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: 'https://docker.geotalent.co.th/wfh-api-dev/api/lookup/reason',\r\n })\r\n return data\r\n }\r\n\r\n return {\r\n onClickCallPostApi: handleClickCallPostApi,\r\n onClickCallGetApi: handleClickCallGetApi,\r\n }\r\n}\r\n\r\nexport default useApiPlayground\r\n","import useApiPlayground from './useApiPlayground'\r\nimport Button from '../../../../control/button/button'\r\nimport { Form } from 'react-final-form'\r\nimport TextField from '../../../../control/textfield/textfield'\r\nimport Autocomplete from '../../../../control/autocomplete/autocomplete'\r\n\r\ntype apiPlaygroundType = ReturnType\r\nconst ApiPlaygroundView = (props: apiPlaygroundType) => {\r\n const { onClickCallPostApi, onClickCallGetApi } = props\r\n return (\r\n
\r\n

Call Api Example : :

\r\n
\r\n \r\n Call Post Example\r\n \r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nconst ApiPlayground = () => {\r\n const formPlayground = useApiPlayground()\r\n return \r\n}\r\n\r\nexport default ApiPlayground\r\n","const useUploadFilePlayground = () => {\r\n return {}\r\n}\r\n\r\nexport default useUploadFilePlayground\r\n","import UploadFile from '../../../../control/uploadFile/uploadFile'\r\nimport useUploadFilePlayground from './useUploadFilePlayground'\r\nconst UploadFilePlaygroundView = () => {\r\n return (\r\n
\r\n

Upload File

\r\n
{/* */}
\r\n
\r\n )\r\n}\r\n\r\nconst UploadFilePlayground = () => {\r\n const uploadFilePlayground = useUploadFilePlayground()\r\n return \r\n}\r\n\r\nexport default UploadFilePlayground\r\n","import React, { useEffect } from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { RouteComponentProps } from 'react-router'\r\nimport usePlayground from './usePlayground'\r\nimport { DataGrid } from '@material-ui/data-grid'\r\n\r\nimport { PlaygroundViewProps } from './playgroundType'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport TextField from '../../../control/textfield/textfield'\r\nimport Button from '../../../control/button/button'\r\nimport { Form } from 'react-final-form'\r\nimport I18nPlayground from './i18nPlayground/i18nPlayground'\r\nimport Autocomplete from '../../../control/autocomplete/autocomplete'\r\nimport TableExample from './Table/TableExample'\r\nimport DialogPlayground from './dialogPlayground/dialogPlayground'\r\nimport AtomPlayground from './atomPlayground/atomPlayground'\r\nimport FormPlayground from './formPlayground/formPlayground'\r\nimport ApiPlayground from './apiPlayground/apiPlayground'\r\nimport UploadFilePlayground from './uploadFilePlayground/uploadFilePlayground'\r\nconst columns = [\r\n { field: 'id', headerName: 'ID', width: 70 },\r\n { field: 'firstName', headerName: 'First name', width: 130 },\r\n { field: 'lastName', headerName: 'Last name', width: 130 },\r\n {\r\n field: 'age',\r\n headerName: 'Age',\r\n type: 'number',\r\n width: 90,\r\n },\r\n {\r\n field: 'fullName',\r\n headerName: 'Full name',\r\n description: 'This column has a value getter and is not sortable.',\r\n sortable: false,\r\n width: 160,\r\n valueGetter: (params: any) => `${params.getValue('firstName') || ''} ${params.getValue('lastName') || ''}`,\r\n },\r\n]\r\n\r\nconst rows = [\r\n { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35 },\r\n { id: 2, lastName: 'Lannister', firstName: 'Cersei', age: 42 },\r\n { id: 3, lastName: 'Lannister', firstName: 'Jaime', age: 45 },\r\n { id: 4, lastName: 'Stark', firstName: 'Arya', age: 16 },\r\n { id: 5, lastName: 'Targaryen', firstName: 'Daenerys', age: null },\r\n { id: 6, lastName: 'Melisandre', firstName: null, age: 150 },\r\n { id: 7, lastName: 'Clifford', firstName: 'Ferrara', age: 44 },\r\n { id: 8, lastName: 'Frances', firstName: 'Rossini', age: 36 },\r\n { id: 9, lastName: 'Roxie', firstName: 'Harvey', age: 65 },\r\n { id: 11, lastName: 'Snow', firstName: 'Jon', age: 35 },\r\n { id: 21, lastName: 'Lannister', firstName: 'Cersei', age: 42 },\r\n { id: 31, lastName: 'Lannister', firstName: 'Jaime', age: 45 },\r\n { id: 41, lastName: 'Stark', firstName: 'Arya', age: 16 },\r\n { id: 51, lastName: 'Targaryen', firstName: 'Daenerys', age: null },\r\n { id: 61, lastName: 'Melisandre', firstName: null, age: 150 },\r\n { id: 71, lastName: 'Clifford', firstName: 'Ferrara', age: 44 },\r\n { id: 81, lastName: 'Frances', firstName: 'Rossini', age: 36 },\r\n { id: 91, lastName: 'Roxie', firstName: 'Harvey', age: 65 },\r\n]\r\n\r\nconst PlaygroundView: React.FC> = ({\r\n displayComponentKey,\r\n\r\n onClickPlayground,\r\n}) => {\r\n const classes = useStyles()\r\n\r\n const display = () => {\r\n switch (displayComponentKey) {\r\n case 'LANG':\r\n return \r\n case 'TABLE':\r\n return \r\n case 'DIALOG':\r\n return \r\n case 'ATOM':\r\n return \r\n case 'FORM':\r\n return \r\n case 'API':\r\n return \r\n case 'UPLOAD_FILE':\r\n return \r\n default:\r\n return \r\n }\r\n }\r\n return (\r\n <>\r\n
\r\n

Play Ground

\r\n\r\n
\r\n \r\n Language\r\n \r\n \r\n Dialog\r\n \r\n \r\n TABLE\r\n \r\n \r\n ATOM\r\n \r\n \r\n FORM\r\n \r\n \r\n CALL API\r\n \r\n \r\n Number Text Field\r\n \r\n \r\n Upload File\r\n \r\n
\r\n
{display()}
\r\n
\r\n \r\n )\r\n}\r\n\r\ntype PlaygroundType = RouteComponentProps\r\nconst Playground = (props: PlaygroundType) => {\r\n const playground = usePlayground({})\r\n return \r\n}\r\nexport default Playground\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n sectionHeader: {\r\n width: '100%',\r\n height: '170px',\r\n backgroundColor: 'pink',\r\n overflow: 'auto',\r\n },\r\n sectionContent: {\r\n width: '100%',\r\n height: 'calc(100% - 170px)',\r\n overflow: 'auto',\r\n },\r\n}))\r\n","enum projectStatus {\r\n processing = 1, // กำลังดำเนินการ\r\n completed = 2, // ดำเนินการเสร็จสมบูรณ์\r\n closed = 3, // ปิดโครงการ\r\n rejected = 4, // ไม่อนุมัติ\r\n notScope = 5, // ไม่เข้าข่าย\r\n terminate = 6, // ยุติโครงการ\r\n withdraw = 7, //ถอนโครงการ\r\n}\r\nexport default projectStatus\r\n","import { GridPageChangeParams, GridRowData, GridSortModel } from '@material-ui/data-grid'\r\nimport React, { useEffect } from 'react'\r\nimport * as searchTypes from './searchType'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../router/routesConfig'\r\nimport useAuthenStore from '../../../../stores/authen/authenStore'\r\nimport useWebService from '../../../../services/web/useWebService'\r\nimport { renderMode } from '../../../../constants/constants'\r\nimport constSubmittedStatus from '../../../../constants/submittedStatus'\r\nimport * as _ from 'lodash'\r\nimport useLoading from '../../../../control/loading/useLoading'\r\nimport { encryptionAES } from '../../../../utilities/encryption'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport constUserGroup from '../../../../constants/userGroup'\r\nimport { useQueryParam } from 'use-query-params'\r\nimport constProjectStatus from '../../../../constants/projectStatus'\r\nimport useCheckPermission from '../../../../utilities/checkPermission'\r\n\r\nconst useSearch = (props: searchTypes.UseSearchType) => {\r\n const {} = props\r\n const { configLoading, loadingClose, loadingOpen } = useLoading()\r\n const profileStore = useAuthenStore()\r\n // const [currentListIndex, setCurrentListIndex] = React.useState(1)\r\n const [isGotoTop, setIsGotoTop] = React.useState(false)\r\n const { profile } = profileStore\r\n const translate = useTranslate()\r\n const displayRole =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? profile.userGroupName_th?.replace('(', '').replace(')', '')\r\n : profile.userGroupName_en?.replace('(', '').replace(')', '')\r\n\r\n const [listItem, setListItem] = React.useState([])\r\n const [isSumItem, setIsSumItem] = React.useState(0)\r\n const [isPage, setIsPage] = React.useState(0)\r\n const [isShowForm, setIsShowForm] = React.useState(true)\r\n const history = useHistory()\r\n const callWebService = useWebService()\r\n const [paramSearch, setParamSearch] = React.useState()\r\n const paramSearchRef = React.useRef()\r\n const formatParams = React.useRef({})\r\n // const [isResearcher, setIsResearcher] = React.useState(false)\r\n const [sortModel, setSortModel] = React.useState([{ field: 'name', sort: 'asc' }])\r\n const [paginationModel, setPaginationModel] = React.useState({\r\n page: 0,\r\n pageCount: 10,\r\n pageSize: 10,\r\n paginationMode: 'server',\r\n rowCount: 100,\r\n })\r\n const [keyword, setKeyword] = useQueryParam('keyword')\r\n const [submittedType, setSubmittedType] = useQueryParam('submittedType')\r\n\r\n const [status, setStatus] = useQueryParam('status')\r\n const [submittedStatusList, setSubmittedStatus] = useQueryParam('submittedStatus')\r\n const rowPerpage = 10\r\n const [initialValueForm, setInitialValueForm] = React.useState()\r\n const checkPermission = useCheckPermission()\r\n\r\n const currentListIndexRef = React.useRef(1)\r\n const authenStoreRef = React.useRef>()\r\n const searchParamRef = React.useRef()\r\n\r\n const setSearchParam = (value: any) => {\r\n setKeyword(value.keywordSearch)\r\n setSubmittedType(value.projectSubmitType)\r\n setStatus(value.status)\r\n setSubmittedStatus(value.submittedStatus)\r\n }\r\n\r\n useEffect(() => {\r\n //don't set state here\r\n authenStoreRef.current = profileStore\r\n })\r\n\r\n useEffect(() => {\r\n if (profile.userId) {\r\n const param = formatParams.current\r\n let projectSubmittedStatusId\r\n let projectStatusId\r\n switch (profile.userGroupId) {\r\n case constUserGroup.officer: //เจ้าหน้าที่\r\n projectSubmittedStatusId = [\r\n // constSubmittedStatus.draft,\r\n constSubmittedStatus.sent,\r\n constSubmittedStatus.received,\r\n constSubmittedStatus.directorAssigned,\r\n constSubmittedStatus.waitingSentReviewer,\r\n constSubmittedStatus.waitSynthesis,\r\n constSubmittedStatus.proceedingCertificate,\r\n constSubmittedStatus.waitSign,\r\n constSubmittedStatus.incorrectDocument,\r\n constSubmittedStatus.resultConsideration,\r\n constSubmittedStatus.considering,\r\n constSubmittedStatus.waitingSetCopies,\r\n constSubmittedStatus.ProceedingMemoMessage,\r\n constSubmittedStatus.waitingEditProject,\r\n ]\r\n projectStatusId = [constProjectStatus.processing]\r\n break\r\n case constUserGroup.committee:\r\n projectSubmittedStatusId = [constSubmittedStatus.considering] // id กำลังพิจารณา\r\n projectStatusId = [constProjectStatus.processing]\r\n break\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (profile?.irb == 2) {\r\n projectSubmittedStatusId = [\r\n constSubmittedStatus.received,\r\n constSubmittedStatus.waitSynthesis,\r\n constSubmittedStatus.waitSign,\r\n constSubmittedStatus.considering,\r\n ]\r\n } else {\r\n projectSubmittedStatusId = [\r\n constSubmittedStatus.sent,\r\n constSubmittedStatus.received,\r\n //constSubmittedStatus.directorAssigned,\r\n constSubmittedStatus.waitSynthesis,\r\n constSubmittedStatus.proceedingCertificate,\r\n constSubmittedStatus.waitSign,\r\n //constSubmittedStatus.incorrectDocument,\r\n constSubmittedStatus.resultConsideration,\r\n constSubmittedStatus.considering,\r\n constSubmittedStatus.waitingSetCopies,\r\n //constSubmittedStatus.ProceedingMemoMessage,\r\n //constSubmittedStatus.waitingEditProject,\r\n ] // id รับเรื่องแล้ว,รอสังเคราะห์,รอลงนาม,กำลังพิจารณา\r\n }\r\n projectStatusId = [constProjectStatus.processing]\r\n break\r\n default:\r\n break\r\n }\r\n\r\n const params = {\r\n userId:\r\n profileStore && profileStore.profile && profileStore.profile.userId\r\n ? profileStore.profile.userId\r\n : undefined,\r\n sortingCol: param && param.sortingCol ? param.sortingCol : undefined,\r\n sortingType: param && param.sortingType ? param.sortingType : undefined,\r\n pageNumber: param && param.pageNumber ? param.pageNumber : 1,\r\n rowsPerPage: rowPerpage,\r\n keywordSearch: param && param.keywordSearch ? param.keywordSearch : undefined,\r\n projectSubmitTypeId: param && param.projectSubmitTypeId ? param.projectSubmitTypeId : undefined,\r\n projectStatusId: projectStatusId ? projectStatusId : undefined,\r\n submittedStatusId: projectSubmittedStatusId ? projectSubmittedStatusId : undefined,\r\n }\r\n setParamSearch(params)\r\n paramSearchRef.current = params\r\n\r\n if (typeof status === 'string') {\r\n params.projectStatusId = status.split(',').map(Number)\r\n }\r\n\r\n if (typeof submittedType === 'string') {\r\n params.projectSubmitTypeId = submittedType.split(',').map(Number)\r\n }\r\n\r\n if (typeof keyword === 'string') {\r\n params.keywordSearch = keyword\r\n }\r\n\r\n if (typeof submittedStatusList === 'string') {\r\n params.submittedStatusId = submittedStatusList.split(',').map(Number)\r\n }\r\n\r\n if (profile?.userGroupId) {\r\n getListTbl(params)\r\n }\r\n\r\n createInitialFrom()\r\n }\r\n }, [sortModel, paginationModel, profile.userId])\r\n\r\n const getListTbl = async (param: searchTypes.ListRequestType) => {\r\n searchParamRef.current = param\r\n loadingOpen()\r\n\r\n //ใช้เทคนิค useRef เพื่อให้ฟังก์ชันที่สามารถมองเห็นใน Store กรณีฟังก์ชันนี้เป็นการ callback function\r\n const res = await callWebService.searchTbl(param, `${authenStoreRef.current?.profile.userGroupId}`)\r\n const list = res.result.items.map((item, index) => {\r\n return {\r\n id: index,\r\n ...item,\r\n }\r\n })\r\n setIsSumItem(res.result.totalRecords)\r\n setListItem(list)\r\n loadingClose()\r\n }\r\n\r\n const getListItem = async (params: searchTypes.TReturnForm) => {\r\n //เมื่อกด search จะเข้า function นี้ก่อน\r\n const listProjectSubmitTypeId = params?.projectSubmitType?.map((itm: string) => {\r\n return parseInt(itm)\r\n })\r\n\r\n const listStatusID = params?.status?.map((itm: string) => {\r\n return parseInt(itm)\r\n })\r\n\r\n const listSubmissionID = params?.submittedStatus?.map((itm: string) => {\r\n return parseInt(itm)\r\n })\r\n\r\n const paramsSearch = {\r\n userId:\r\n profileStore && profileStore.profile && profileStore.profile.userId\r\n ? profileStore.profile.userId\r\n : undefined,\r\n pageNumber: 1,\r\n rowsPerPage: rowPerpage,\r\n keywordSearch: params && params.keywordSearch ? params.keywordSearch : undefined,\r\n projectSubmitTypeId:\r\n params && params.projectSubmitType && params.projectSubmitType.length > 0\r\n ? listProjectSubmitTypeId\r\n : undefined,\r\n projectStatusId: params && params.status && params.status.length > 0 ? listStatusID : undefined,\r\n submittedStatusId:\r\n params && params.submittedStatus && params.submittedStatus.length > 0 ? listSubmissionID : undefined,\r\n onlyMe: params.onlyMe,\r\n onlyPreliminary: params.onlyPreliminary,\r\n researcherDraft: params.researcherDraft,\r\n doAndDoneCommentary: params.doAndDoneCommentary,\r\n }\r\n formatParams.current = {\r\n ...paramsSearch,\r\n }\r\n\r\n const searchValue = {\r\n status: params && params.status && params.status.length > 0 ? listStatusID : undefined,\r\n keywordSearch: params && params.keywordSearch ? params.keywordSearch : undefined,\r\n projectSubmitType:\r\n params && params.projectSubmitType && params.projectSubmitType.length > 0\r\n ? listProjectSubmitTypeId\r\n : undefined,\r\n submittedStatus:\r\n params && params.submittedStatus && params.submittedStatus.length > 0 ? listSubmissionID : undefined,\r\n onlyMe: params?.onlyMe ? params?.onlyMe : false,\r\n researcherDraft: params?.researcherDraft ? params?.researcherDraft : false,\r\n doAndDoneCommentary: params?.doAndDoneCommentary ? params?.doAndDoneCommentary : false,\r\n }\r\n\r\n setIsGotoTop(true)\r\n // setCurrentListIndex(1)\r\n currentListIndexRef.current = 1\r\n setParamSearch(paramsSearch)\r\n paramSearchRef.current = paramsSearch\r\n\r\n setSearchParam(searchValue)\r\n getListTbl(paramsSearch)\r\n setIsPage(0)\r\n }\r\n\r\n const handleClickEdit = (row: GridRowData) => {\r\n const encryptedProjectID = encryptionAES(row.projectID)\r\n const encryptedSubmittedID = encryptionAES(row.submittedID)\r\n const idDraft = row.is_draft === 1 ? true : false\r\n\r\n const path = generatePath(RoutePath.manageProjectEdit, {\r\n projectID: encryptedProjectID,\r\n submittedID: encryptedSubmittedID,\r\n })\r\n\r\n if (idDraft) {\r\n // const pathEdit = generatePath(RoutePath.manageProjectEdit, {\r\n // projectID: encryptedProjectID,\r\n // submittedID: encryptedSubmittedID,\r\n // })\r\n history.push({\r\n pathname: path,\r\n state: {\r\n // location state\r\n irb: row.irb,\r\n mode: renderMode.edit,\r\n },\r\n })\r\n } else {\r\n // const pathView = generatePath(RoutePath.manageProjectEdit, {\r\n // projectID: encryptedProjectID,\r\n // submittedID: encryptedSubmittedID,\r\n // })\r\n history.push({\r\n pathname: path,\r\n state: {\r\n // location state\r\n irb: row.irb,\r\n mode: renderMode.view,\r\n },\r\n })\r\n }\r\n }\r\n const handleClickCreate = () => {\r\n history.push(RoutePath.manageProjectCreateRequest)\r\n }\r\n const handleClickSearch = () => {\r\n setIsShowForm(!isShowForm)\r\n }\r\n\r\n /**\r\n * process clear form\r\n */\r\n const handleClickClear = () => {\r\n const params = defaultSearch()\r\n defaultFormSearch()\r\n setIsGotoTop(true)\r\n currentListIndexRef.current = 1\r\n getListTbl(params)\r\n }\r\n\r\n const defaultFormSearch = () => {\r\n let submittedStatus\r\n let projectStatusId\r\n switch (profile.userGroupId) {\r\n case constUserGroup.officer: //เจ้าหน้าที่\r\n submittedStatus = [\r\n // constSubmittedStatus.draft.toString(),\r\n constSubmittedStatus.sent.toString(),\r\n constSubmittedStatus.received.toString(),\r\n constSubmittedStatus.directorAssigned.toString(),\r\n constSubmittedStatus.waitingSentReviewer.toString(),\r\n constSubmittedStatus.waitSynthesis.toString(),\r\n constSubmittedStatus.proceedingCertificate.toString(),\r\n constSubmittedStatus.waitSign.toString(),\r\n constSubmittedStatus.incorrectDocument.toString(),\r\n constSubmittedStatus.resultConsideration.toString(),\r\n constSubmittedStatus.considering.toString(),\r\n constSubmittedStatus.waitingSetCopies.toString(),\r\n constSubmittedStatus.ProceedingMemoMessage.toString(),\r\n constSubmittedStatus.waitingEditProject.toString(),\r\n ]\r\n projectStatusId = [constProjectStatus.processing.toString()]\r\n break\r\n case constUserGroup.committee: //กรรมการ\r\n submittedStatus = [constSubmittedStatus.considering.toString()] // id กำลังพิจารณา\r\n projectStatusId = [constProjectStatus.processing.toString()]\r\n break\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (profile?.irb == 2) {\r\n submittedStatus = [\r\n constSubmittedStatus.received.toString(),\r\n constSubmittedStatus.waitSynthesis.toString(),\r\n constSubmittedStatus.waitSign.toString(),\r\n constSubmittedStatus.considering.toString(),\r\n ]\r\n } else {\r\n submittedStatus = [\r\n constSubmittedStatus.sent.toString(),\r\n constSubmittedStatus.received.toString(),\r\n //constSubmittedStatus.directorAssigned.toString(),\r\n constSubmittedStatus.waitSynthesis.toString(),\r\n constSubmittedStatus.proceedingCertificate.toString(),\r\n constSubmittedStatus.waitSign.toString(),\r\n //constSubmittedStatus.incorrectDocument.toString(),\r\n constSubmittedStatus.resultConsideration.toString(),\r\n constSubmittedStatus.considering.toString(),\r\n constSubmittedStatus.waitingSetCopies.toString(),\r\n //constSubmittedStatus.ProceedingMemoMessage.toString(),\r\n //constSubmittedStatus.waitingEditProject.toString(),\r\n ] // id รับเรื่องแล้ว,รอสังเคราะห์,รอลงนาม,กำลังพิจารณา\r\n }\r\n\r\n projectStatusId = [constProjectStatus.processing.toString()]\r\n break\r\n default:\r\n break\r\n }\r\n type initialFrom = {\r\n submittedStatus: string[] | undefined\r\n status: string | string[] | undefined\r\n keywordSearch: number | undefined\r\n projectSubmitType: string | string[] | undefined\r\n }\r\n\r\n const initialFrom: initialFrom = {\r\n submittedStatus: submittedStatus ? submittedStatus : undefined,\r\n status: projectStatusId ? projectStatusId : undefined,\r\n keywordSearch: undefined,\r\n projectSubmitType: undefined,\r\n }\r\n\r\n setInitialValueForm(initialFrom)\r\n setSearchParam(initialFrom)\r\n }\r\n\r\n const defaultSearch = () => {\r\n let projectSubmittedStatusId\r\n let projectStatusId\r\n switch (profile.userGroupId) {\r\n case constUserGroup.officer: //เจ้าหน้าที่\r\n projectSubmittedStatusId = [\r\n // constSubmittedStatus.draft,\r\n constSubmittedStatus.sent,\r\n constSubmittedStatus.received,\r\n constSubmittedStatus.directorAssigned,\r\n constSubmittedStatus.waitingSentReviewer,\r\n constSubmittedStatus.waitSynthesis,\r\n constSubmittedStatus.proceedingCertificate,\r\n constSubmittedStatus.waitSign,\r\n constSubmittedStatus.incorrectDocument,\r\n constSubmittedStatus.resultConsideration,\r\n constSubmittedStatus.considering,\r\n constSubmittedStatus.waitingSetCopies,\r\n constSubmittedStatus.ProceedingMemoMessage,\r\n constSubmittedStatus.waitingEditProject,\r\n ]\r\n projectStatusId = [constProjectStatus.processing]\r\n break\r\n case constUserGroup.committee:\r\n projectSubmittedStatusId = [constSubmittedStatus.considering] // id กำลังพิจารณา\r\n projectStatusId = [constProjectStatus.processing]\r\n break\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (profile?.irb == 2) {\r\n projectSubmittedStatusId = [\r\n constSubmittedStatus.received,\r\n constSubmittedStatus.waitSynthesis,\r\n constSubmittedStatus.waitSign,\r\n constSubmittedStatus.considering,\r\n ]\r\n } else {\r\n projectSubmittedStatusId = [\r\n constSubmittedStatus.sent,\r\n constSubmittedStatus.received,\r\n //constSubmittedStatus.directorAssigned,\r\n constSubmittedStatus.waitSynthesis,\r\n constSubmittedStatus.proceedingCertificate,\r\n constSubmittedStatus.waitSign,\r\n //constSubmittedStatus.incorrectDocument,\r\n constSubmittedStatus.resultConsideration,\r\n constSubmittedStatus.considering,\r\n constSubmittedStatus.waitingSetCopies,\r\n //constSubmittedStatus.ProceedingMemoMessage,\r\n //constSubmittedStatus.waitingEditProject,\r\n ] // id รับเรื่องแล้ว,รอสังเคราะห์,รอลงนาม,กำลังพิจารณา\r\n }\r\n\r\n projectStatusId = [constProjectStatus.processing]\r\n break\r\n default:\r\n break\r\n }\r\n\r\n const params = {\r\n userId:\r\n profileStore && profileStore.profile && profileStore.profile.userId\r\n ? profileStore.profile.userId\r\n : undefined,\r\n sortingCol: undefined,\r\n sortingType: undefined,\r\n pageNumber: 1,\r\n rowsPerPage: rowPerpage,\r\n keywordSearch: undefined,\r\n projectSubmitTypeId: undefined,\r\n projectStatusId: projectStatusId ? projectStatusId : undefined,\r\n submittedStatusId: projectSubmittedStatusId,\r\n }\r\n setParamSearch(params)\r\n paramSearchRef.current = params\r\n\r\n return params\r\n }\r\n /**\r\n * end process clear form\r\n */\r\n\r\n ////////////////////////////////////////////////////////////////////////////\r\n\r\n const handleScrollEnd = (rowPerpage: number, currentIndex: number) => {\r\n setIsGotoTop(false)\r\n if (paramSearchRef.current) {\r\n currentListIndexRef.current = currentListIndexRef.current + 1\r\n getListTbl({ ...paramSearchRef.current, rowsPerPage: rowPerpage })\r\n // setCurrentListIndex(currentIndex)\r\n }\r\n }\r\n const handleClickGotoTop = () => {\r\n setIsGotoTop(true)\r\n }\r\n\r\n const createInitialFrom = () => {\r\n let submittedStatus\r\n let projectStatusId\r\n switch (profile.userGroupId) {\r\n case constUserGroup.officer: //เจ้าหน้าที่\r\n submittedStatus = [\r\n // constSubmittedStatus.draft.toString(),\r\n constSubmittedStatus.sent.toString(),\r\n constSubmittedStatus.received.toString(),\r\n constSubmittedStatus.directorAssigned.toString(),\r\n constSubmittedStatus.waitingSentReviewer.toString(),\r\n constSubmittedStatus.waitSynthesis.toString(),\r\n constSubmittedStatus.proceedingCertificate.toString(),\r\n constSubmittedStatus.waitSign.toString(),\r\n constSubmittedStatus.incorrectDocument.toString(),\r\n constSubmittedStatus.resultConsideration.toString(),\r\n constSubmittedStatus.considering.toString(),\r\n constSubmittedStatus.waitingSetCopies.toString(),\r\n constSubmittedStatus.ProceedingMemoMessage.toString(),\r\n constSubmittedStatus.waitingEditProject.toString(),\r\n ]\r\n projectStatusId = [constProjectStatus.processing.toString()]\r\n break\r\n case constUserGroup.committee: //กรรมการ\r\n submittedStatus = [constSubmittedStatus.considering.toString()] // id กำลังพิจารณา\r\n projectStatusId = [constProjectStatus.processing.toString()]\r\n break\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (profile?.irb == 2) {\r\n submittedStatus = [\r\n constSubmittedStatus.received.toString(),\r\n constSubmittedStatus.waitSynthesis.toString(),\r\n constSubmittedStatus.waitSign.toString(),\r\n constSubmittedStatus.considering.toString(),\r\n ]\r\n } else {\r\n submittedStatus = [\r\n constSubmittedStatus.sent.toString(),\r\n constSubmittedStatus.received.toString(),\r\n //constSubmittedStatus.directorAssigned.toString(),\r\n constSubmittedStatus.waitSynthesis.toString(),\r\n constSubmittedStatus.proceedingCertificate.toString(),\r\n constSubmittedStatus.waitSign.toString(),\r\n //constSubmittedStatus.incorrectDocument.toString(),\r\n constSubmittedStatus.resultConsideration.toString(),\r\n constSubmittedStatus.considering.toString(),\r\n constSubmittedStatus.waitingSetCopies.toString(),\r\n //constSubmittedStatus.ProceedingMemoMessage.toString(),\r\n //constSubmittedStatus.waitingEditProject.toString(),\r\n ] // id รับเรื่องแล้ว,รอสังเคราะห์,รอลงนาม,กำลังพิจารณา\r\n }\r\n\r\n projectStatusId = [constProjectStatus.processing.toString()]\r\n break\r\n default:\r\n break\r\n }\r\n type initialFrom = {\r\n submittedStatus: string[] | undefined\r\n status: string | string[] | undefined\r\n keywordSearch: number | undefined\r\n projectSubmitType: string | string[] | undefined\r\n }\r\n\r\n const initialFrom: initialFrom = {\r\n submittedStatus: submittedStatus ?? submittedStatus ? submittedStatus : undefined,\r\n status: status ?? (projectStatusId ? projectStatusId : undefined),\r\n keywordSearch: keyword ?? undefined,\r\n projectSubmitType: submittedType ?? undefined,\r\n }\r\n\r\n if (typeof status === 'string') {\r\n initialFrom.status = status.split(',')\r\n }\r\n\r\n if (typeof submittedType === 'string') {\r\n initialFrom.projectSubmitType = submittedType.split(',')\r\n }\r\n\r\n if (typeof submittedStatusList === 'string') {\r\n initialFrom.submittedStatus = submittedStatusList.split(',')\r\n }\r\n\r\n setInitialValueForm(initialFrom)\r\n setSearchParam(initialFrom)\r\n }\r\n\r\n return {\r\n displayRole,\r\n sortModel,\r\n isPage,\r\n isSumItem,\r\n listItem,\r\n isShowForm,\r\n isResearcher: checkPermission.isUserResearcher(),\r\n isChairman: checkPermission.isUserChairman(),\r\n rowPerpage,\r\n currentListIndexRef: currentListIndexRef,\r\n setListItem,\r\n getListItem,\r\n configLoading,\r\n isGotoTop,\r\n initialValueForm,\r\n onClickEdit: handleClickEdit,\r\n onClickCreate: handleClickCreate,\r\n onClickSearch: handleClickSearch,\r\n handleClickGotoTop,\r\n // onClickPagination: handleClickPagination,\r\n onClickClear: handleClickClear,\r\n // onClickSort: handleClickSort,\r\n handleScrollEnd: handleScrollEnd,\r\n pendingProps: {\r\n searchParamRef,\r\n afterSubmitPending: getListTbl,\r\n },\r\n }\r\n}\r\n\r\nexport default useSearch\r\n","export const example = 'https://docker.geotalent.co.th/wfh-api-dev/api/lookup/reason'\r\nexport const test = `${process.env.REACT_APP_CU_IRB_API_URL}/xxxxxxxxxx`\r\nexport const projectTypeLutUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/projectType`\r\nexport const projectSubmitTypeLutUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/projectSubmitType`\r\nexport const requestConsiderDocUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/requestConsiderDoc`\r\n\r\nexport const facultyLutUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/faculty`\r\nexport const researcherTypeLutUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/researcher`\r\nexport const titleNameLutUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/titleName`\r\nexport const academicPositionLutUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/academicPosition`\r\nexport const documentTopicLutUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/documentTopic`\r\n\r\nexport const directorNameUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/director`\r\nexport const roleUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/projectRole`\r\nexport const statusUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/projectStatus`\r\nexport const reviewerUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/principal`\r\nexport const approveStatusUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/approveStatus`\r\nexport const commentaryTopicUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/commentaryTopic` //หัวข้อคอมเม้นกรรมการ\r\nexport const committee = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/committee` //กรรมการลงความเห็น\r\nexport const educationLevelUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/educationLevel`\r\nexport const approveStatusProjectRenewal = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/approveStatusProjectRenewal`\r\nexport const terminateCause = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/cause`\r\nexport const approveStatusByCloseProject = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/approveStatusByCloseProject`\r\nexport const submittedStatusUrl = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/submittedStatus`\r\n\r\nexport const expertiseFaculty = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/expertiseFaculty`\r\n\r\nexport const getExpertisesLUT = `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/expertise`\r\nexport const searchExpertisesLUT = `${process.env.REACT_APP_CU_IRB_API_URL}/setting/search/lutExpertise`\r\nexport const getExpertisesDetailByID = `${process.env.REACT_APP_CU_IRB_API_URL}/setting/lutExpertiseDetail`\r\nexport const deleteLutExpertisesByID = `${process.env.REACT_APP_CU_IRB_API_URL}/setting/deleteLutExpertise`\r\nexport const updateExpertisesLUT = `${process.env.REACT_APP_CU_IRB_API_URL}/setting/updateLutExpertise`\r\nexport const addExpertisesLUT = `${process.env.REACT_APP_CU_IRB_API_URL}/setting/insertLutExpertise`","import { responseLookupServiceTypes } from './types'\r\nimport * as lookupServiceURL from './lookupServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nconst useLookupService = () => {\r\n const callApi = useCallApi()\r\n const example1 = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: lookupServiceURL.example,\r\n })\r\n return data\r\n }\r\n const example2 = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: lookupServiceURL.example,\r\n })\r\n return data\r\n }\r\n\r\n const callProjectTypeLut = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: lookupServiceURL.projectTypeLutUrl,\r\n })\r\n return data\r\n }\r\n\r\n const callFacultyLut = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: lookupServiceURL.facultyLutUrl,\r\n })\r\n return data\r\n }\r\n\r\n const callProjectSubmitTypeLut = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: lookupServiceURL.projectSubmitTypeLutUrl,\r\n })\r\n return data\r\n }\r\n\r\n const callResearcherTypeLut = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: lookupServiceURL.researcherTypeLutUrl,\r\n })\r\n return data\r\n }\r\n\r\n const callTitleNameLut = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: lookupServiceURL.titleNameLutUrl,\r\n })\r\n return data\r\n }\r\n\r\n const callAcademicPositionLut = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: lookupServiceURL.academicPositionLutUrl,\r\n })\r\n return data\r\n }\r\n const callDocumentTopicLut = async (irbID: number, submitTypeID?: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.documentTopicLutUrl}/${irbID}/${submitTypeID ? submitTypeID : ''}`,\r\n })\r\n return data\r\n }\r\n\r\n const callDocumentTopicCloseLut = async (irbID: number, submittedTypeID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.documentTopicLutUrl}/${irbID}/${submittedTypeID}`,\r\n })\r\n return data\r\n }\r\n\r\n const callDirectorNameLut = async (irb: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.directorNameUrl}/${irb}`,\r\n })\r\n return data\r\n }\r\n\r\n const callRoleLut = async (irbID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.roleUrl}/${irbID}`,\r\n })\r\n return data\r\n }\r\n\r\n const callStatusLut = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: lookupServiceURL.statusUrl,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const callSubmittedStatusLut = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: lookupServiceURL.submittedStatusUrl,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const callReviewerLut = async (irbID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.reviewerUrl}/${irbID}`,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const callApproveStatusLut = async (irbID: number, submitTypeID?: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.approveStatusUrl}/${irbID}/${submitTypeID ? submitTypeID : ''}`,\r\n })\r\n return data\r\n }\r\n type ApproveStatusSubmitType = { irbID: number; submitType: number }\r\n const callApproveStatusLutSubmitType = async ({ irbID, submitType }: ApproveStatusSubmitType) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.approveStatusUrl}/${irbID}/${submitType}`,\r\n })\r\n return data\r\n }\r\n\r\n const callApproveStatusLutProjectRenewal = async (irbID: number, isCommittee: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.approveStatusProjectRenewal}/${irbID}/${isCommittee}`,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const callCommentaryTopicLut = async (irbID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.commentaryTopicUrl}/${irbID}`,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const callCommitteeLut = async (submittedID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.committee}/${submittedID}`,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getEducationLevel = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.educationLevelUrl}`,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getTerminateCause = async (irb: number, submitType: Number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.terminateCause}/${irb}/${submitType}`,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getRequestConsiderDoc = async (userGroupID: number, projectID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.requestConsiderDocUrl}/${userGroupID}/${projectID}`,\r\n })\r\n return data\r\n }\r\n\r\n const getApproveStatusByCloseProject = async (irb: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.approveStatusByCloseProject}/${irb}`,\r\n })\r\n return data\r\n }\r\n\r\n const getExpertiseFaculty = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${lookupServiceURL.expertiseFaculty}`,\r\n })\r\n return data\r\n }\r\n\r\n return {\r\n example1,\r\n example2,\r\n callProjectTypeLut,\r\n callFacultyLut,\r\n callProjectSubmitTypeLut,\r\n callResearcherTypeLut,\r\n callTitleNameLut,\r\n callAcademicPositionLut,\r\n callDocumentTopicLut,\r\n callDirectorNameLut,\r\n callRoleLut,\r\n callStatusLut,\r\n callReviewerLut,\r\n callApproveStatusLut,\r\n callCommentaryTopicLut,\r\n callDocumentTopicCloseLut,\r\n callCommitteeLut,\r\n getEducationLevel,\r\n callApproveStatusLutProjectRenewal,\r\n getTerminateCause,\r\n callApproveStatusLutSubmitType,\r\n getRequestConsiderDoc,\r\n getApproveStatusByCloseProject,\r\n callSubmittedStatusLut,\r\n getExpertiseFaculty,\r\n }\r\n}\r\n\r\nexport default useLookupService\r\n","import React from 'react'\r\nimport * as searchTypes from './searchFormType'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { FormApi } from 'final-form'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\n\r\nconst useSearchForm = (props: searchTypes.UseSearchType) => {\r\n const { onGetListItem, onClickClear } = props\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const [category, setCategory] = React.useState([])\r\n const [status, setStatus] = React.useState([])\r\n const [submissionProcess, setSubmissionProcess] = React.useState([])\r\n const checkPermission = useCheckPermission()\r\n\r\n const {\r\n profile: { userGroupId },\r\n } = useAuthenStore()\r\n\r\n React.useEffect(() => {\r\n //ดักจับการเปลี่ยนภาษา\r\n if (userGroupId) {\r\n getCategory()\r\n getSubmissionProcess()\r\n getStatus()\r\n }\r\n }, [translate.languageStore.currentLanguage, userGroupId])\r\n\r\n const getCategory = async () => {\r\n const res = await callLookup.callProjectSubmitTypeLut()\r\n const filterCondition = res.result.filter((item) => {\r\n return item.isCondition\r\n })\r\n const formatedData = filterCondition.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n setCategory(formatedData)\r\n }\r\n\r\n const getStatus = async () => {\r\n const res = await callLookup.callStatusLut()\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n\r\n setStatus(formatedData)\r\n }\r\n\r\n const getSubmissionProcess = async () => {\r\n const res = await callLookup.callSubmittedStatusLut()\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n\r\n setSubmissionProcess(formatedData)\r\n }\r\n\r\n const handleClickSubmit = (val: any) => {\r\n onGetListItem(val)\r\n }\r\n const handleEnterSearch = (val: any) => {\r\n onGetListItem(val)\r\n }\r\n const handleClickClear = (form: FormApi>) => {\r\n // form.reset()\r\n // form.restart()\r\n onClickClear()\r\n }\r\n const handleChangCategory = (val: searchTypes.OptType) => {}\r\n const handleChangStatus = (val: searchTypes.OptType) => {}\r\n const handleChangProjectName = (val: any) => {}\r\n return {\r\n onClickSubmit: handleClickSubmit,\r\n onClickClearForm: handleClickClear,\r\n onChangeCategory: handleChangCategory,\r\n onChangeStatus: handleChangStatus,\r\n onChangeProjectName: handleChangProjectName,\r\n handleEnterSearch,\r\n lutCategory: category,\r\n lutStatus: status,\r\n lutSubmissionProcess: submissionProcess,\r\n isOfficer: checkPermission.isUserAdmin(),\r\n isCommittee: checkPermission.isUserCommittee(),\r\n irb: checkPermission.irb(),\r\n }\r\n}\r\n\r\nexport default useSearchForm\r\n","import React from 'react'\r\nimport { useField } from 'react-final-form'\r\nimport useTranslate from '../../i18n/useTranslate'\r\nimport { composeValidators, selectRequired } from '../../utilities/validate'\r\nimport { UseCheckboxGroupProps } from './checkboxType'\r\n\r\nexport type FieldRequired = boolean | { showAsterisk?: boolean; triggedValidate?: boolean; errorMessage?: string }\r\n\r\nfunction useCheckbox(props: UseCheckboxGroupProps) {\r\n const { name, required, validates = [], onChangeValue } = props\r\n const translate = useTranslate()\r\n let mergeValidate = validates\r\n if ((typeof required === 'boolean' && required) || (typeof required === 'object' && required.triggedValidate)) {\r\n mergeValidate = [\r\n selectRequired(typeof required === 'object' ? required.errorMessage : `${translate.get('MESSAGE.M016')}`),\r\n ...mergeValidate,\r\n ]\r\n }\r\n /* Validate */\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate),\r\n })\r\n\r\n const handleChange = (evt: any, nameKeyValue?: number) => {\r\n field.input.onChange(evt)\r\n\r\n // ---1. ยังไม่ถูกติ๊ก --- //\r\n\r\n // ---2. ถูกติ๊กอยู่ --- //\r\n if (onChangeValue) {\r\n onChangeValue(evt)\r\n }\r\n }\r\n\r\n return { field, onChange: handleChange }\r\n}\r\n\r\nexport default useCheckbox\r\n","import React from 'react'\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel'\r\nimport FormControl from '@material-ui/core/FormControl'\r\nimport { FormHelperText, Typography, FormGroup, Checkbox } from '@material-ui/core'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { MyCheckboxGroupViewProps, CheckboxGroupProps } from './checkboxType'\r\nimport useCheckboxGroup from './useCheckbox'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\n\r\nlet MyCheckboxView: React.FC = ({\r\n field,\r\n required,\r\n disabled = false,\r\n row = true,\r\n onChangeValue,\r\n label,\r\n onChange,\r\n}) => {\r\n const { meta, input } = field\r\n\r\n const isError = meta.error && meta.invalid && meta.touched ? true : false\r\n // const isError = meta.error && meta.invalid ? true : false\r\n\r\n const classes = useStyles(isError)\r\n const isChecked = input.value && typeof input.value === 'boolean' && input.value === true ? true : false\r\n const getLabel = () => {\r\n const myLabel = required ? (\r\n \r\n \r\n {label}\r\n \r\n \r\n \r\n *\r\n \r\n \r\n \r\n ) : (\r\n \r\n {label || ''}\r\n \r\n )\r\n return (\r\n \r\n {myLabel}\r\n \r\n )\r\n }\r\n return (\r\n \r\n \r\n {\r\n onChange(evt)\r\n if (onChangeValue) {\r\n onChangeValue(evt.target.value)\r\n }\r\n }}\r\n checked={isChecked}\r\n />\r\n }\r\n />\r\n \r\n\r\n {isError && meta.error}\r\n \r\n )\r\n}\r\n\r\nlet MyCheckbox: React.FC = ({ name, ...others }) => {\r\n const myCheckboxGroup = useCheckboxGroup({\r\n name,\r\n ...others,\r\n })\r\n return \r\n}\r\n\r\nexport default MyCheckbox\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n label: {\r\n // marginBottom: 10,\r\n // color: (isError: any) => {\r\n // console.log('isError', isError)\r\n // if (isError) {\r\n // return '#ff4d4f'\r\n // } else {\r\n // return ''\r\n // }\r\n // },\r\n },\r\n errorText: {\r\n fontSize: '12px',\r\n color: '#ff4d4f',\r\n },\r\n rootError: {\r\n color: 'red',\r\n '&$checked': {\r\n color: '#db5f8e',\r\n },\r\n },\r\n\r\n root: {\r\n color: '#848484',\r\n '&$checked': {\r\n color: '#db5f8e',\r\n },\r\n },\r\n checked: {},\r\n disabled: {\r\n color: '#00000042 !important',\r\n },\r\n}))\r\n","import * as searchTypes from './searchFormType'\r\nimport useSearch from './useSearchForm'\r\nimport MyTextfield from '../../../../../control/textfield/textfield'\r\nimport Button from '../../../../../control/button/button'\r\nimport { Form } from 'react-final-form'\r\nimport { useMediaQuery, Grid } from '@material-ui/core'\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles'\r\nimport MultiSelect from '../../../../../control/multiSelect/multiSelect'\r\nimport MyCheckbox from '../../../../../control/checkbox/checkbox'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\n//View\r\nconst SearchView = (props: searchTypes.SearchViewType) => {\r\n const classes = useStyles({})\r\n const {\r\n onClickSubmit,\r\n onClickClearForm,\r\n handleEnterSearch,\r\n lutCategory,\r\n lutStatus,\r\n lutSubmissionProcess,\r\n isResearcher,\r\n isChairman,\r\n isOfficer,\r\n isCommittee,\r\n irb,\r\n initialValue = {},\r\n } = props\r\n const translate = useTranslate()\r\n\r\n let keywordSearchPlaceholder: string = `${translate.get('LABEL.PROJECT_NAME')}, ${translate.get(\r\n 'LABEL.PROJECT_NUMBER',\r\n )}, ${translate.get('LABEL.COA_NO')}`\r\n if (!isResearcher) {\r\n keywordSearchPlaceholder += `, ${translate.get('LABEL.RESEARCHER_NAME')}`\r\n }\r\n\r\n return (\r\n \r\n {({ handleSubmit, form, values }) => {\r\n return (\r\n \r\n \r\n handleEnterSearch(values)}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {!isResearcher && (\r\n \r\n \r\n \r\n )}\r\n\r\n {isChairman && (\r\n \r\n \r\n \r\n )}\r\n {isChairman && irb == 2 && (\r\n \r\n \r\n \r\n )}\r\n {(isChairman || isOfficer) && (\r\n \r\n \r\n \r\n )}\r\n {isCommittee && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {\r\n onClickClearForm(form)\r\n }}\r\n color=\"default\"\r\n >\r\n {translate.get('BUTTON.RESET')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst Search = (props: searchTypes.SearchType) => {\r\n // const { isResearcher } = props\r\n const searchModel = useSearch(props)\r\n return \r\n}\r\n\r\nexport default Search\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: '15px',\r\n },\r\n btnSearch: {\r\n minWidth: '0px',\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n },\r\n}))\r\n","import { UseAccordionType } from './accordionType'\r\n\r\nconst useAccordion = (props: UseAccordionType) => {\r\n const {} = props\r\n\r\n return {}\r\n}\r\n\r\nexport default useAccordion\r\n","import React from 'react'\r\nimport { FormControlLabel, IconButton, makeStyles, Typography } from '@material-ui/core'\r\nimport { AccordionSummaryViewType, MyAccordionCtrlType } from './accordionType'\r\nimport useAccordion from './useAccordion'\r\nimport { withStyles } from '@material-ui/core/styles'\r\nimport MuiAccordion from '@material-ui/core/Accordion'\r\nimport MuiAccordionSummary from '@material-ui/core/AccordionSummary'\r\nimport MuiAccordionDetails from '@material-ui/core/AccordionDetails'\r\nimport SearchIcon from '@material-ui/icons/Search'\r\nimport SearchRoundedIcon from '@material-ui/icons/SearchRounded'\r\nimport { ArrowBackRounded } from '@material-ui/icons'\r\nconst Accordion = withStyles({\r\n root: {\r\n boxShadow: 'none',\r\n '&:not(:last-child)': {\r\n borderBottom: 0,\r\n },\r\n '&:before': {\r\n display: 'none',\r\n },\r\n '&$expanded': {\r\n margin: 'auto',\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordion)\r\n\r\nconst AccordionSummary = withStyles({\r\n root: {\r\n marginBottom: 1,\r\n minHeight: 56,\r\n '&$expanded': {\r\n minHeight: 56,\r\n },\r\n backgroundColor: '#fafafa',\r\n },\r\n content: {\r\n '&$expanded': {\r\n margin: '12px 0',\r\n },\r\n },\r\n expanded: {},\r\n\r\n expandIcon: {\r\n '&$expanded': {\r\n transform: 'rotate(360deg)',\r\n },\r\n transform: 'rotate(360deg)',\r\n },\r\n})(MuiAccordionSummary)\r\n\r\nconst AccordionDetails = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n border: '1px solid rgba(0, 0, 0, .125)',\r\n borderRadius: '8px',\r\n },\r\n}))(MuiAccordionDetails)\r\n\r\nconst SearchAccordionView: React.FC = ({\r\n title,\r\n children,\r\n isBack,\r\n onClickBack,\r\n onChange,\r\n}) => {\r\n const classes = useStyles()\r\n\r\n let iconControl = isBack ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n )\r\n\r\n return (\r\n {\r\n onChange?.(expanded)\r\n }}\r\n defaultExpanded\r\n >\r\n \r\n \r\n \r\n }\r\n >\r\n <>\r\n event.stopPropagation()}\r\n onFocus={(event) => event.stopPropagation()}\r\n control={iconControl}\r\n label={''}\r\n />\r\n \r\n {title}\r\n \r\n \r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nlet SearchAccordion: React.FC = ({ ...others }) => {\r\n const myAutocomplete = useAccordion(others)\r\n return \r\n}\r\n\r\nexport default SearchAccordion\r\nconst useStyles = makeStyles((theme) => ({\r\n icon: {\r\n border: '1px solid rgba(0, 0, 0, .125)',\r\n '&:hover': {\r\n backgroundColor: '#DB5F8E',\r\n },\r\n marginRight: '12px',\r\n },\r\n searchIcon: {\r\n width: '40px',\r\n height: '40px',\r\n\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n },\r\n}))\r\n","var _path;\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nfunction SvgDocument(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M5 3V2.25C4.58579 2.25 4.25 2.58579 4.25 3H5ZM19 21V21.75C19.4142 21.75 19.75 21.4142 19.75 21H19ZM5 21H4.25C4.25 21.4142 4.58579 21.75 5 21.75V21ZM14 3L14.5303 2.46967C14.3897 2.32902 14.1989 2.25 14 2.25V3ZM19 8H19.75C19.75 7.80109 19.671 7.61032 19.5303 7.46967L19 8ZM8 16.25C7.58579 16.25 7.25 16.5858 7.25 17C7.25 17.4142 7.58579 17.75 8 17.75V16.25ZM16 17.75C16.4142 17.75 16.75 17.4142 16.75 17C16.75 16.5858 16.4142 16.25 16 16.25V17.75ZM8 12.25C7.58579 12.25 7.25 12.5858 7.25 13C7.25 13.4142 7.58579 13.75 8 13.75V12.25ZM14 13.75C14.4142 13.75 14.75 13.4142 14.75 13C14.75 12.5858 14.4142 12.25 14 12.25V13.75ZM19 20.25H5V21.75H19V20.25ZM5.75 21V3H4.25V21H5.75ZM5 3.75H14V2.25H5V3.75ZM18.25 8V21H19.75V8H18.25ZM13.4697 3.53033L18.4697 8.53033L19.5303 7.46967L14.5303 2.46967L13.4697 3.53033ZM12.25 3V7H13.75V3H12.25ZM15 9.75H19V8.25H15V9.75ZM12.25 7C12.25 8.51878 13.4812 9.75 15 9.75V8.25C14.3096 8.25 13.75 7.69036 13.75 7H12.25ZM8 17.75H16V16.25H8V17.75ZM8 13.75H14V12.25H8V13.75Z\",\n fill: \"#393E46\"\n })));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgDocument);\nexport default __webpack_public_path__ + \"static/media/document.57e3c414.svg\";\nexport { ForwardRef as ReactComponent };","import useLoading from '../../control/loading/useLoading'\r\nimport useCallApi from '../../utilities/axios'\r\nimport { GetProjectCertificateResponse, ServiceResult } from './types/responseWebServiceTypes'\r\nimport { getCertificateByProjectId } from './webServiceURL'\r\n\r\nconst useCeritificates = () => {\r\n const callApi = useCallApi()\r\n const loadingHook = useLoading()\r\n\r\n const getCertificatesByProjectId = async (projecId: number) => {\r\n try {\r\n loadingHook.loadingOpen()\r\n const apiUrl = `${getCertificateByProjectId}/${projecId}`\r\n const { data } = await callApi.axiosGet>({\r\n url: apiUrl,\r\n })\r\n return data\r\n } catch (error) {\r\n /** Must Not Empty */\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n return {\r\n getCertificatesByProjectId,\r\n }\r\n}\r\n\r\nexport default useCeritificates\r\n","import Button from '@material-ui/core/Button'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography, { TypographyProps } from '@material-ui/core/Typography'\r\nimport { styled } from '@material-ui/styles'\r\nimport { FC, useRef, useState } from 'react'\r\nimport Dialog from '../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport { GetProjectCertificateResponse, ItemListType } from '../../../../services/web/types/responseWebServiceTypes'\r\nimport useCeritificates from '../../../../services/web/useCertificates'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../utilities/date'\r\n\r\nconst CustomLabel = styled((props: TypographyProps & { hasCoaNo: boolean }) => )(\r\n ({ hasCoaNo }) => ({\r\n color: hasCoaNo ? '#0062FF' : '#000000',\r\n textDecoration: hasCoaNo ? 'underline' : 'none',\r\n cursor: hasCoaNo ? 'pointer' : 'default',\r\n }),\r\n)\r\n\r\nconst CustomButton = styled(Button)({\r\n border: '1px solid #DB5F8E',\r\n boxShadow: '0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%)',\r\n})\r\n\r\nconst DialogCoaButton: FC<{\r\n projectInfo: ItemListType\r\n}> = ({ projectInfo }) => {\r\n const { coaNo, projectID } = projectInfo\r\n const translate = useTranslate()\r\n const { getCertificatesByProjectId } = useCeritificates()\r\n const dialogRef = useRef>()\r\n const [certificates, setCertificates] = useState([])\r\n\r\n const bindingDialogRef = (func: Record) => {\r\n dialogRef.current = { ...func }\r\n }\r\n\r\n const handleCloseDialog = () => {\r\n dialogRef?.current?.closeDialog()\r\n }\r\n\r\n const handleOpenCoa = async () => {\r\n if (coaNo && dialogRef?.current) {\r\n const response = await getCertificatesByProjectId(projectID)\r\n if (response?.result) {\r\n const result = response?.result\r\n setCertificates(result)\r\n }\r\n dialogRef?.current?.openDialog()\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {coaNo ?? '-'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.COA_NO')}\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.CERTIFICATE_RECEIVE_DATE')}\r\n \r\n \r\n \r\n \r\n {certificates.map((certData) => (\r\n \r\n \r\n \r\n \r\n {certData.coa_no}\r\n \r\n \r\n \r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? certData.received_date &&\r\n convertDateToFormatTH(certData.received_date)\r\n : certData.received_date &&\r\n convertDateToFormatEN(certData.received_date)}\r\n \r\n \r\n \r\n ))}\r\n \r\n
\r\n                                \r\n                                    {translate.get('BUTTON.CLOSE_MODAL')}\r\n                                \r\n                            \r\n                        \r\n                    \r\n                }\r\n            />\r\n        \r\n    )\r\n}\r\n\r\nexport default DialogCoaButton\r\n","enum pendingStatus {\r\n    pending = 1, // หยุดการทำงาน\r\n    resume = 2, // เริ่มการทำงาน\r\n}\r\nexport default pendingStatus\r\n","import Button from '@material-ui/core/Button'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { styled } from '@material-ui/styles'\r\nimport { FC, useRef } from 'react'\r\nimport { Form as FinalForm, FormProps } from 'react-final-form'\r\nimport pendingStatus from '../../../../constants/pendingStatus'\r\nimport projectStatus from '../../../../constants/projectStatus'\r\nimport { ButtonView } from '../../../../control/button/button'\r\nimport Dialog from '../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../control/loading/useLoading'\r\nimport MyTextfield from '../../../../control/textfield/textfield'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport { ItemListType } from '../../../../services/web/types/responseWebServiceTypes'\r\nimport useWebService from '../../../../services/web/useWebService'\r\nimport useAuthenStore from '../../../../stores/authen/authenStore'\r\nimport useCheckPermission from '../../../../utilities/checkPermission'\r\n\r\nconst PendingButton = styled(ButtonView)({\r\n    backgroundColor: '#379956',\r\n    color: '#fff',\r\n    height: '44px',\r\n    marginRight: '1px',\r\n    '&:hover': {\r\n        backgroundColor: '#37997C',\r\n    },\r\n})\r\n\r\nconst ResumeButton = styled(ButtonView)({\r\n    backgroundColor: '#A91D1D',\r\n    color: '#fff',\r\n    height: '44px',\r\n    marginRight: '1px',\r\n    '&:hover': {\r\n        backgroundColor: '#A91D38',\r\n    },\r\n})\r\n\r\nconst CloseButton = styled(Button)({\r\n    border: '1px solid #DB5F8E',\r\n    boxShadow: '0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%)',\r\n})\r\n\r\nconst DialogPending: FC<{ item: ItemListType; pendingProps: any }> = ({ item, pendingProps }) => {\r\n    const isProcessing = item.projectStatusID === projectStatus.processing\r\n    const isResume = item.pendingStatusID === pendingStatus.pending\r\n    const { addPendingAndResume } = useWebService()\r\n    const authenStore = useAuthenStore()\r\n    const translate = useTranslate()\r\n    const dialogRef = useRef>()\r\n    const successRef = useRef>()\r\n    const failRef = useRef>()\r\n    const confirmRef = useRef>()\r\n    const loadingHook = useLoading()\r\n    const checkPermissionHook = useCheckPermission()\r\n\r\n    const bindingDialogRef = (func: Record) => {\r\n        dialogRef.current = { ...func }\r\n    }\r\n\r\n    const handleCloseDialog = () => {\r\n        dialogRef?.current?.closeDialog()\r\n    }\r\n\r\n    const handleOpenDialog = async () => {\r\n        if (dialogRef?.current) {\r\n            dialogRef?.current?.openDialog()\r\n        }\r\n    }\r\n\r\n    const callPendingResume = async (formVal?: any) => {\r\n        confirmRef.current?.closeDialog()\r\n        loadingHook.loadingOpen()\r\n        const conditionStatusID = isResume ? pendingStatus.resume : pendingStatus.pending\r\n        await addPendingAndResume({\r\n            submittedID: item.submittedID,\r\n            statusID: conditionStatusID,\r\n            /**\r\n             * StatusID 1 is Pending\r\n             * StatusID 2 is Resume\r\n             */\r\n            remarks: formVal?.remark ?? null,\r\n            userID: authenStore.profile.userId,\r\n        })\r\n            .then(() => {\r\n                handleCloseDialog()\r\n                loadingHook.loadingClose()\r\n                successRef.current?.openDialog()\r\n            })\r\n            .catch(() => {\r\n                loadingHook.loadingClose()\r\n                failRef.current?.openDialog()\r\n            })\r\n    }\r\n\r\n    const validateForm = (values: FormProps) => {\r\n        const errors: any = {}\r\n        if (!values.remark || values.remark === '') {\r\n            errors.passcode = translate.get('MESSAGE.M023')\r\n        }\r\n\r\n        return errors\r\n    }\r\n\r\n    const onSetSuccessRef = (func: Record) => {\r\n        successRef.current = { ...func }\r\n    }\r\n\r\n    const onSetFailRef = (func: Record) => {\r\n        failRef.current = { ...func }\r\n    }\r\n\r\n    const onSetConfirmRef = (func: Record) => {\r\n        confirmRef.current = { ...func }\r\n    }\r\n\r\n    const afterSubmit = () => {\r\n        const param = pendingProps.searchParamRef.current\r\n        if (param) {\r\n            pendingProps.afterSubmitPending(param)\r\n        }\r\n    }\r\n\r\n    const openConfirm = () => {\r\n        confirmRef.current?.openDialog()\r\n    }\r\n\r\n    const renderButton = () => {\r\n        return item.pendingStatusID === pendingStatus.pending ? (\r\n            \r\n                {translate.get('BUTTON.RESUME')}\r\n            \r\n        ) : (\r\n            \r\n                {translate.get('BUTTON.PENDING')}\r\n            \r\n        )\r\n    }\r\n\r\n    return (\r\n        <>\r\n            {renderButton()}\r\n            \r\n                        {({ handleSubmit }) => {\r\n                            return (\r\n                                <>\r\n                                    \r\n                                    
\r\n                                    \r\n                                        \r\n                                            \r\n                                                {translate.get('BUTTON.CANCEL')}\r\n                                            \r\n                                        \r\n                                        \r\n                                            \r\n                                                {translate.get('BUTTON.SAVE')}\r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            )\r\n                        }}\r\n                    \r\n                }\r\n            />\r\n            \r\n            \r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default DialogPending\r\n","import { FC } from 'react'\r\nimport { Grid, IconButton, makeStyles, Paper, Typography, Tooltip, SvgIcon } from '@material-ui/core'\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport { ReactComponent as DocumentIcon } from '../../../../../images/document.svg'\r\nimport TooltipControl from '../../../../../control/tooltip/tooltip'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport { ItemListType } from '../../../../../services/web/types/responseWebServiceTypes'\r\n\r\nimport { ButtonView } from '../../../../../control/button/button'\r\nimport { TReturnList } from '../searchType'\r\nimport projectStatus from '../../../../../constants/projectStatus'\r\nimport { statusColorConstant } from '../../../../../constants/constants'\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport { useTheme } from '@material-ui/core/styles'\r\nimport DialogCoaButton from '../DialogCoaButton'\r\nimport DialogPending from '../DialogPending'\r\nimport pendingStatus from '../../../../../constants/pendingStatus'\r\nimport { encryptionAES } from '../../../../../utilities/encryption'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport submittedStatus from '../../../../../constants/submittedStatus'\r\n\r\ninterface ItemProps {\r\n    onClickEdit: (itm: any) => void\r\n    itm: TReturnList\r\n    pendingProps: any\r\n}\r\nconst Item: FC = ({ onClickEdit, itm, pendingProps }) => {\r\n    const translate = useTranslate()\r\n    const authenStore = useAuthenStore()\r\n    const { profile } = authenStore\r\n    const theme = useTheme()\r\n    const history = useHistory()\r\n    const isMobileView = useMediaQuery(theme.breakpoints.down('sm'))\r\n\r\n    const isDirector = profile.userGroupId === constUserGroup.committee\r\n    const classes = useStyles({ isDirector })\r\n\r\n    const isResearcher = profile.userGroupId === constUserGroup.researcher\r\n    const isProcessing = itm.projectStatusID === projectStatus.processing\r\n    const permissionHook = useCheckPermission()\r\n    const isOfficer = permissionHook.isUserAdmin()\r\n    const padding = isProcessing && !isResearcher ? '10px 25px 10px 25px' : '25px'\r\n    const submitTypeName =\r\n        translate.languageStore.currentLanguage === translate.languageKey.th\r\n            ? itm.submittedStatus_th ?? '-'\r\n            : itm.submittedStatus_en ?? '-'\r\n\r\n    const checkStatusColor = (itm: ItemListType) => {\r\n        let projectStatusBackgroundColor = ''\r\n        let statusTextColor = ''\r\n        let submittedStatusColor = ''\r\n\r\n        switch (itm.projectStatusID) {\r\n            case projectStatus.rejected:\r\n                // code block ไม่อนุมัติ\r\n                projectStatusBackgroundColor = statusColorConstant.statusReject.backgroundColor\r\n                // statusTextColor = statusColorConstant.statusReject.textColor\r\n                break\r\n            case projectStatus.closed:\r\n                // code block ปิดโครงการ\r\n                projectStatusBackgroundColor = statusColorConstant.statusClose.backgroundColor\r\n                // statusTextColor = statusColorConstant.statusClose.textColor\r\n                break\r\n            case projectStatus.notScope:\r\n                // code block ไม่เข้าข่าย\r\n                projectStatusBackgroundColor = statusColorConstant.noScope.backgroundColor\r\n                // statusTextColor = statusColorConstant.noScope.textColor\r\n                break\r\n            case projectStatus.terminate:\r\n                // code block ยุติโครงการ\r\n                projectStatusBackgroundColor = statusColorConstant.terminate.backgroundColor\r\n                // statusTextColor = statusColorConstant.terminate.textColor\r\n                break\r\n            case projectStatus.withdraw:\r\n                // code block //ถอนโครงการ\r\n                projectStatusBackgroundColor = statusColorConstant.withdraw.backgroundColor\r\n                // statusTextColor = statusColorConstant.withdraw.textColor\r\n                break\r\n            case projectStatus.processing:\r\n                // กำลังดำเนินการ\r\n                if (itm.pendingStatusID === pendingStatus.pending) {\r\n                    projectStatusBackgroundColor = statusColorConstant.status15.pendingBackgroundColor\r\n                } else {\r\n                    projectStatusBackgroundColor = statusColorConstant.status15.backgroundColor\r\n                }\r\n                // statusTextColor = statusColorConstant.status15.textColor\r\n                break\r\n            case projectStatus.completed:\r\n                // ดำเนินการเสร็จสิ้น\r\n                projectStatusBackgroundColor = statusColorConstant.status8.backgroundColor\r\n                // statusTextColor = statusColorConstant.status8.textColor\r\n                break\r\n            default:\r\n                // statusId = null (ร่าง)\r\n                projectStatusBackgroundColor = statusColorConstant.status1.backgroundColor\r\n                // statusTextColor = statusColorConstant.status1.textColor\r\n\r\n                break\r\n        }\r\n\r\n        switch (itm.submittedStatusID) {\r\n            case statusColorConstant.status1.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.status1.submittedStatusColor\r\n                projectStatusBackgroundColor = statusColorConstant.status1.backgroundColor\r\n                statusTextColor = statusColorConstant.status1.textColor\r\n                break\r\n\r\n            case statusColorConstant.status2.statusID:\r\n                // code block\r\n\r\n                submittedStatusColor = statusColorConstant.status2.backgroundColor\r\n                statusTextColor = statusColorConstant.status2.textColor\r\n\r\n                break\r\n            case statusColorConstant.status3.statusID:\r\n                submittedStatusColor = statusColorConstant.status3.backgroundColor\r\n                statusTextColor = statusColorConstant.status3.textColor\r\n\r\n                break\r\n            case statusColorConstant.status4.statusID:\r\n                submittedStatusColor = statusColorConstant.status4.backgroundColor\r\n                statusTextColor = statusColorConstant.status4.textColor\r\n\r\n                break\r\n            case statusColorConstant.status18.statusID:\r\n                submittedStatusColor = statusColorConstant.status18.backgroundColor\r\n                statusTextColor = statusColorConstant.status18.textColor\r\n\r\n                break\r\n            case statusColorConstant.status5.statusID:\r\n                submittedStatusColor = statusColorConstant.status5.backgroundColor\r\n                statusTextColor = statusColorConstant.status5.textColor\r\n\r\n                break\r\n            case statusColorConstant.status6.statusID:\r\n                submittedStatusColor = statusColorConstant.status6.backgroundColor\r\n                statusTextColor = statusColorConstant.status6.textColor\r\n\r\n                break\r\n            case statusColorConstant.status7.statusID:\r\n                submittedStatusColor = statusColorConstant.status7.backgroundColor\r\n                statusTextColor = statusColorConstant.status7.textColor\r\n\r\n                break\r\n            case statusColorConstant.status8.statusID:\r\n                submittedStatusColor = statusColorConstant.status8.backgroundColor\r\n                statusTextColor = statusColorConstant.status8.textColor\r\n\r\n                break\r\n            case statusColorConstant.status9.statusID:\r\n                submittedStatusColor = statusColorConstant.status9.backgroundColor\r\n                statusTextColor = statusColorConstant.status9.textColor\r\n\r\n                break\r\n            case statusColorConstant.status10.statusID:\r\n                submittedStatusColor = statusColorConstant.status10.backgroundColor\r\n                statusTextColor = statusColorConstant.status10.textColor\r\n\r\n                break\r\n            case statusColorConstant.status11.statusID:\r\n                submittedStatusColor = statusColorConstant.status11.backgroundColor\r\n                statusTextColor = statusColorConstant.status11.textColor\r\n\r\n                break\r\n            case statusColorConstant.status12.statusID:\r\n                submittedStatusColor = statusColorConstant.status12.backgroundColor\r\n                statusTextColor = statusColorConstant.status12.textColor\r\n                break\r\n            case statusColorConstant.status14.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.status14.backgroundColor\r\n                statusTextColor = statusColorConstant.status14.textColor\r\n                break\r\n            case statusColorConstant.status17.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.status17.backgroundColor\r\n                statusTextColor = statusColorConstant.status17.textColor\r\n                break\r\n            // case statusColorConstant.status15.statusID:\r\n            //     // กำลังดำเนินการ\r\n            //     submittedStatusColor = statusColorConstant.status15.backgroundColor\r\n            //     statusTextColor = statusColorConstant.status15.textColor\r\n            //     break\r\n            case statusColorConstant.resultOfConsideration.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.resultOfConsideration.backgroundColor\r\n                statusTextColor = statusColorConstant.resultOfConsideration.textColor\r\n                break\r\n            case statusColorConstant.noScope.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.noScope.backgroundColor\r\n                statusTextColor = statusColorConstant.noScope.textColor\r\n                break\r\n            case statusColorConstant.terminate.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.terminate.backgroundColor\r\n                statusTextColor = statusColorConstant.terminate.textColor\r\n                break\r\n            case statusColorConstant.withdraw.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.withdraw.backgroundColor\r\n                statusTextColor = statusColorConstant.withdraw.textColor\r\n                break\r\n            case statusColorConstant.proceedingMemoMessage.statusID:\r\n                // ดำเนินการทำใบบันทึกข้อความ\r\n                submittedStatusColor = statusColorConstant.proceedingMemoMessage.backgroundColor\r\n                statusTextColor = statusColorConstant.proceedingMemoMessage.textColor\r\n                break\r\n            case statusColorConstant.waitingEditProject.statusID:\r\n                // รอแก้ไขโครงการ\r\n                submittedStatusColor = statusColorConstant.waitingEditProject.backgroundColor\r\n                statusTextColor = statusColorConstant.waitingEditProject.textColor\r\n                break\r\n            default:\r\n                // statusId = null (ร่าง)\r\n                submittedStatusColor = statusColorConstant.status1.backgroundColor\r\n                statusTextColor = statusColorConstant.status1.textColor\r\n\r\n                break\r\n        }\r\n\r\n        return { submittedStatusColor, statusTextColor, projectStatusBackgroundColor }\r\n    }\r\n\r\n    const getDisplayProjectStatus = (val: ItemListType) => {\r\n        let displayStatus = ''\r\n        if (val.projectStatusID === projectStatus.processing && val.pendingStatusID === pendingStatus.pending) {\r\n            displayStatus = translate.get('LABEL.PENDING')\r\n        } else {\r\n            if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n                displayStatus = val.projectStatus_th ?? '-'\r\n            } else {\r\n                displayStatus = val.projectStatus_en ?? '-'\r\n            }\r\n        }\r\n        if (isResearcher && val.submittedStatusID === submittedStatus.waitingEditProject) {\r\n            // รอผู้วิจัยแก้ไขเอกสาร\r\n            displayStatus = translate.get('LABEL.RECEIVED_REVIEW_RESULT')\r\n        }\r\n        return displayStatus\r\n    }\r\n\r\n    const getDisplayProjectName = (val: any) => {\r\n        let displayProjectName = ''\r\n        if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n            displayProjectName = val.projectName_th ? val.projectName_th : '-'\r\n        } else {\r\n            displayProjectName = val.projectName_en ? val.projectName_en : '-'\r\n        }\r\n        return displayProjectName\r\n    }\r\n\r\n    const getDisplayResearcherName = (val: any) => {\r\n        let displayResearcherName = ''\r\n        if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n            displayResearcherName = val.researcherName_th ?? '-'\r\n            if (val.researcherTypeName_th) {\r\n                displayResearcherName += ` (${val.researcherTypeName_th ?? ''})`\r\n            }\r\n        } else {\r\n            displayResearcherName = val.researcherName_en ?? '-'\r\n            if (val.researcherTypeName_en) {\r\n                displayResearcherName += ` (${val.researcherTypeName_en ?? ''})`\r\n            }\r\n        }\r\n        return displayResearcherName\r\n    }\r\n\r\n    const getDisplaySubmittedDate = (val: any) => {\r\n        let display = '-'\r\n        if (val?.submittedDate) {\r\n            display =\r\n                translate.languageStore.currentLanguage === translate.languageKey.th\r\n                    ? convertDateToFormatTH(val.submittedDate)\r\n                    : convertDateToFormatEN(val.submittedDate)\r\n        }\r\n        return display\r\n    }\r\n\r\n    const openPendingHistory = (rowData: ItemListType) => {\r\n        const projectData = {\r\n            submittedID: rowData.submittedID,\r\n            th: {\r\n                projectName: rowData.projectName_th,\r\n                researcherName: rowData.researcherName_th,\r\n                submitTypeName: rowData.submitTypeName_th,\r\n            },\r\n            en: {\r\n                projectName: rowData.projectName_en,\r\n                researcherName: rowData.researcherName_en,\r\n                submitTypeName: rowData.submitTypeName_en,\r\n            },\r\n        }\r\n        const encryptedData = encryptionAES(JSON.stringify(projectData))\r\n\r\n        const path = generatePath(RoutePath.projectPendingHistory, {\r\n            projectData: encryptedData,\r\n        })\r\n        history.push({\r\n            pathname: path,\r\n        })\r\n    }\r\n\r\n    const conditionSubmitTypeName = () => {\r\n        let statusName =\r\n            translate.languageStore.currentLanguage === translate.languageKey.th\r\n                ? itm.submittedStatus_th ?? '-'\r\n                : itm.submittedStatus_en ?? '-'\r\n        // if (!isResearcher && itm.isSubmittedReceiveDate && itm.submittedStatusID === submittedStatus.directorAssigned) {\r\n        //     statusName = translate.get('LABEL.COMMENT_DEADLINE_WAIT')\r\n        // }\r\n        return statusName\r\n    }\r\n\r\n    const renderListElement = (itm: ItemListType, key?: number) => {\r\n        const { projectStatusBackgroundColor, submittedStatusColor, statusTextColor } = checkStatusColor(itm)\r\n\r\n        const isDirector = profile.userGroupId === constUserGroup.committee\r\n        const isResearcher = profile.userGroupId === constUserGroup.researcher\r\n        const isProcessing = itm.projectStatusID === projectStatus.processing\r\n        const isPause = itm.projectStatusID !== projectStatus.processing\r\n        const padding = isProcessing && !isResearcher ? '10px 25px 10px 25px' : '25px'\r\n        let submitTypeName = conditionSubmitTypeName()\r\n        const isTH = translate.languageStore.currentLanguage === translate.languageKey.th\r\n\r\n        let expectedDate = translate.get('LABEL.EXPECTED_ANNOUNCEMENT_DATE')\r\n\r\n        let announceDate = itm.announceDate\r\n\r\n        if(!announceDate) {\r\n            if (itm?.irb == 1 && itm?.approveStatusId == 8) {\r\n                if (itm?.submittedStatusID == 16) {\r\n                    expectedDate = translate.get('LABEL.ANNOUNCEMENT_DATE')\r\n                    announceDate = itm?.previousAnnounceDate\r\n                } else if (itm?.submittedStatusID == 2) {\r\n                    announceDate = null\r\n                } else {\r\n                    announceDate = itm?.verifyDocDate\r\n                }\r\n            }\r\n        }\r\n\r\n        return (\r\n            <>\r\n                \r\n                    \r\n                        \r\n                             onClickEdit(itm)}\r\n                            >\r\n                                {translate.get('BUTTON.EDIT')}\r\n                            \r\n                        \r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                {translate.get('LABEL.PROJECT_NUMBER')}\r\n                                            \r\n                                        \r\n                                        \r\n                                            \r\n                                                {itm?.projectNumber}\r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                                 \r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                {translate.get('LABEL.COA_NO')}\r\n                                            \r\n                                        \r\n                                        \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                                 \r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                {translate.get('LABEL.RESEARCHER_NAME')}\r\n                                            \r\n                                        \r\n                                        \r\n                                            \r\n                                                \r\n                                                    \r\n                                                        \r\n                                                    \r\n                                                \r\n                                                 {' '}\r\n                                                \r\n                                                    {getDisplayResearcherName(itm)}\r\n                                                \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                \r\n                                                    \r\n                                                        {translate.get('LABEL.SUBMITTED_DATE')}\r\n                                                    \r\n                                                \r\n                                                \r\n                                                    \r\n                                                        {getDisplaySubmittedDate(itm)}\r\n                                                    \r\n                                                \r\n                                            \r\n                                        \r\n                                        {!isResearcher && (\r\n                                            \r\n                                                \r\n                                                    \r\n                                                        {isDirector ? (\r\n                                                            \r\n                                                                \r\n                                                                    {translate.get('LABEL.COMMITTEE_MEETING_DATE')}\r\n                                                                \r\n                                                            \r\n                                                        ) : (\r\n                                                            \r\n                                                                {expectedDate}\r\n                                                            \r\n                                                        )}\r\n                                                    \r\n                                                    \r\n                                                        \r\n                                                            {isDirector\r\n                                                                ? itm.committeeDueDate\r\n                                                                    ? translate.languageStore.currentLanguage ===\r\n                                                                      translate.languageKey.th\r\n                                                                        ? convertDateToFormatTH(itm.committeeDueDate)\r\n                                                                        : convertDateToFormatEN(itm.committeeDueDate)\r\n                                                                    : '-'\r\n                                                                : announceDate\r\n                                                                ? translate.languageStore.currentLanguage ===\r\n                                                                  translate.languageKey.th\r\n                                                                    ? convertDateToFormatTH(announceDate)\r\n                                                                    : convertDateToFormatEN(announceDate)\r\n                                                                : '-'}\r\n                                                        \r\n                                                    \r\n                                                \r\n                                            \r\n                                        )}\r\n                                    \r\n                                \r\n                            \r\n                        \r\n                    \r\n                    \r\n                        \r\n                            \r\n                        \r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                {translate.get('LABEL.CERTIFICATE_SUBMISSION_TYPE')}\r\n                                            \r\n                                        \r\n                                        \r\n                                            \r\n                                                {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                                    ? itm.submitTypeName_th || '-'\r\n                                                    : itm.submitTypeName_en || '-'}\r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                                {itm.irb === 2 && \r\n                                    \r\n                                        \r\n                                            \r\n                                                {translate.get('LABEL.CONSIDER_TYPE')}\r\n                                            \r\n                                        \r\n                                        \r\n                                            \r\n                                                {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                                    ? itm.consider_type_name_th || '-'\r\n                                                    : itm.consider_type_name_en || '-'}\r\n                                            \r\n                                        \r\n                                    \r\n                                }\r\n                                \r\n                                    \r\n                                        \r\n                                            {itm.pendingStatusID && isOfficer && (\r\n                                                \r\n                                                     \r\n                                                    \r\n                                                         openPendingHistory(itm)}\r\n                                                            variant=\"body2\"\r\n                                                        >\r\n                                                            {translate.get('LABEL.PENDING_HISTORY')}\r\n                                                        \r\n                                                    \r\n                                                \r\n                                            )}\r\n                                        \r\n                                        {isProcessing && !isResearcher && (\r\n                                            \r\n                                                \r\n                                                    \r\n                                                         \r\n                                                    \r\n                                                    \r\n                                                        \r\n                                                            \r\n                                                                {submitTypeName}\r\n                                                            \r\n                                                        \r\n                                                    \r\n                                                \r\n                                            \r\n                                        )}\r\n                                         \r\n                                        \r\n                                            \r\n                                                \r\n                                                    \r\n                                                        {translate.get('LABEL.STATUS')}\r\n                                                    \r\n                                                \r\n                                                \r\n                                                    \r\n                                                        \r\n                                                            {getDisplayProjectStatus(itm)}\r\n                                                        \r\n                                                    \r\n                                                \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            \r\n                        \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    const renderListElementMobile = (itm: ItemListType, key?: number) => {\r\n        const { submittedStatusColor, projectStatusBackgroundColor, statusTextColor } = checkStatusColor(itm)\r\n\r\n        return (\r\n             onClickEdit(itm)}>\r\n                \r\n                    \r\n                        \r\n                            \r\n                        \r\n                    \r\n                    \r\n                        \r\n                            \r\n                                \r\n                                    {itm.projectCode ? itm.projectCode.split('.')[1] : ''}\r\n                                \r\n                            \r\n                        \r\n\r\n                        \r\n                            \r\n                                {getDisplayProjectName(itm)}\r\n                            \r\n                        \r\n                    \r\n\r\n                    \r\n                        \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    return isMobileView ? renderListElementMobile(itm) : renderListElement(itm)\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    icon: {\r\n        margin: theme.spacing(1),\r\n\r\n        width: 40,\r\n        height: 40,\r\n        backgroundColor: '#ece9e9',\r\n        transition: '0.3s',\r\n        '&:hover': {\r\n            backgroundColor: theme.palette.primary.main,\r\n            color: '#ffffff',\r\n        },\r\n    },\r\n    status: {\r\n        [theme.breakpoints.down('md')]: {\r\n            marginTop: '10px',\r\n        },\r\n    },\r\n    header: {\r\n        fontWeight: 'bold',\r\n    },\r\n\r\n    item: {\r\n        padding: theme.spacing(3),\r\n        marginBottom: '10px',\r\n        marginRight: '0px',\r\n        transition: '0.3s',\r\n        position: 'relative',\r\n        '&:hover': {\r\n            border: `1px solid ${theme.palette.primary.main}`,\r\n        },\r\n    },\r\n    btnEdit: {\r\n        height: '44px',\r\n        marginRight: '1px',\r\n        boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n    },\r\n    multiLineEllipsis: {\r\n        maxWidth: '100%',\r\n        overflow: 'hidden',\r\n        textOverflow: 'ellipsis',\r\n        display: '-webkit-box',\r\n        '-webkit-line-clamp': 1,\r\n        '-webkit-box-orient': 'vertical',\r\n    },\r\n\r\n    paper: {\r\n        height: 'calc(100% + 0px)',\r\n        width: '100%',\r\n    },\r\n    paperFromSearch: {\r\n        width: '100%',\r\n        padding: '30px',\r\n        marginBottom: '10px',\r\n    },\r\n    headTbl: {\r\n        paddingTop: '15px',\r\n        paddingBottom: '15px',\r\n        paddingLeft: '10px',\r\n        fontSize: '20px',\r\n    },\r\n    div: {\r\n        marginTop: '20px',\r\n        paddingRight: '10px',\r\n        cursor: 'pointer',\r\n    },\r\n    borderRadius: {\r\n        border: '2px solid rgba(0, 0, 0, .125)',\r\n        background: '#f1efef',\r\n    },\r\n    btnSearch: {\r\n        textAlign: 'right',\r\n        marginTop: '30px',\r\n        boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n    },\r\n    btnAdd: {\r\n        boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n        '&:hover': {\r\n            backgroundColor: '#ffffff',\r\n            boxShadow: 'none',\r\n        },\r\n    },\r\n    btnIcon: {\r\n        padding: '8px',\r\n        background: '#f1efef',\r\n    },\r\n    paperProjectCode: {\r\n        padding: '10px',\r\n        // background: '#f3f3f3',\r\n        width: '120px',\r\n        textAlign: 'center',\r\n        border: 'unset',\r\n    },\r\n    paperProjectStatus: {\r\n        width: 'auto',\r\n        textAlign: 'center',\r\n        border: '1px solid #FFAC07',\r\n    },\r\n    paperProjectStatusMobile: {\r\n        // padding: '10px',\r\n        height: '15px',\r\n        width: '15px',\r\n        borderRadius: '20px',\r\n    },\r\n    hoverRow: {\r\n        cursor: 'pointer',\r\n        '&:hover': { border: `1px solid ${theme.palette.primary.main} !important` },\r\n    },\r\n    // btnEdit: {\r\n    //     boxShadow: 'unset',\r\n    //     height: '44px',\r\n    //     marginRight: '1px',\r\n    // },\r\n    cardBtn: {\r\n        width: '90px',\r\n    },\r\n    pendingBtn: {\r\n        backgroundColor: '#379956',\r\n        color: '#fff',\r\n        height: '44px',\r\n        marginRight: '1px',\r\n        '&:hover': {\r\n            backgroundColor: '#37997C',\r\n        },\r\n    },\r\n    resumeBtn: {\r\n        backgroundColor: '#A91D1D',\r\n        color: '#fff',\r\n        height: '44px',\r\n        marginRight: '1px',\r\n        '&:hover': {\r\n            backgroundColor: '#37997C',\r\n        },\r\n    },\r\n    paperList: {\r\n        '&:hover': { border: `1px solid ${theme.palette.primary.main} !important` },\r\n    },\r\n    submittedTypeCard: {\r\n        height: '28.00000050900079px',\r\n        width: 'fit-content',\r\n        left: '0.0263671875px',\r\n        top: '0px',\r\n        borderRadius: '8px',\r\n        background: 'linear-gradient(0deg, #EEEEEE, #EEEEEE)',\r\n        border: '1px solid #DCDCDC',\r\n        display: 'flex',\r\n        alignItems: 'center',\r\n        justifyContent: 'center',\r\n        padding: '4px',\r\n    },\r\n    linkLabel: {\r\n        color: '#0062FF',\r\n        textDecoration: 'underline',\r\n        cursor: 'pointer',\r\n    },\r\n    boxDate: { marginLeft: (props: any) => `${props.isDirector ? '3.3px' : '-3px'}` },\r\n}))\r\n\r\nexport default Item\r\n","import { Grid, Typography } from '@material-ui/core'\r\nimport { FC } from 'react'\r\n// import { ResponseT } from '../../../services/um/useExternalResearcher'\r\nimport Item from './Item'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { TReturnList } from '../searchType'\r\nimport { Button } from '@material-ui/core'\r\nimport AddIcon from '@material-ui/icons/Add'\r\nimport useLoadingStore from '../../../../../control/loading/store/useLoadingStore'\r\n\r\ninterface ResultProps {\r\n    onClickEdit: (itm: any) => void\r\n    onClickCreate: () => void\r\n    pendingProps: any\r\n    data: TReturnList[]\r\n    isResearcher?: boolean\r\n    isSumItem?: number\r\n}\r\nconst Result: FC = ({ onClickEdit, onClickCreate, data, isResearcher, isSumItem, pendingProps }) => {\r\n    const translate = useTranslate()\r\n    const loadingStore = useLoadingStore()\r\n\r\n    return (\r\n        \r\n            {/* \r\n                {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${data.length}`])}\r\n             */}\r\n\r\n            \r\n                \r\n                    {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${isSumItem}`])}\r\n\r\n                    {isResearcher && (\r\n                        \r\n                            \r\n                                }\r\n                                    onClick={onClickCreate}\r\n                                >\r\n                                    {translate.get('LABEL.ADD_PROJECT')}\r\n                                \r\n                            \r\n                        \r\n                    )}\r\n                \r\n            \r\n\r\n            \r\n                {data.map((item) => {\r\n                    return (\r\n                        \r\n                            \r\n                        \r\n                    )\r\n                })}\r\n            \r\n            {!loadingStore.isLoading && data?.length === 0 && (\r\n                \r\n                    {translate.get('LABEL.NO_DATA_FOUND')}\r\n                \r\n            )}\r\n        \r\n    )\r\n}\r\n\r\nexport default Result\r\n","import * as searchTypes from './searchType'\r\nimport useSearch from './useSearch'\r\nimport SearchForm from './searchForm/searchForm'\r\n\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport { IconButton, Paper, Grid, Theme, createStyles, Typography, Tooltip, Container } from '@material-ui/core'\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../utilities/date'\r\nimport React from 'react'\r\nimport { ItemListType } from '../../../../services/web/types/responseWebServiceTypes'\r\nimport { statusColorConstant } from '../../../../constants/constants'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport useAuthenStore from '../../../../stores/authen/authenStore'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport { ButtonView } from '../../../../control/button/button'\r\nimport SearchAccordion from '../../../../control/accordion/SearchAccordion'\r\n\r\nimport constUserGroup from '../../../../constants/userGroup'\r\nimport projectStatus from '../../../../constants/projectStatus'\r\nimport Result from './searchResult/Result'\r\n\r\n// import {convertDateToFormatTH} from '../../../../utilities/date'\r\n//View\r\nconst SearchView = (props: searchTypes.SearchViewType) => {\r\n    const {\r\n        listItem,\r\n        isSumItem,\r\n        // isShowForm,\r\n        isResearcher,\r\n        isChairman,\r\n        rowPerpage,\r\n        // currentListIndex,\r\n        isGotoTop,\r\n        getListItem,\r\n        onClickEdit,\r\n        onClickCreate,\r\n        onClickSearch,\r\n        handleClickGotoTop,\r\n        // onClickPagination,\r\n        onClickClear,\r\n        // onClickSort,\r\n        handleScrollEnd,\r\n        initialValueForm,\r\n        currentListIndexRef,\r\n        pendingProps,\r\n    } = props\r\n    const theme = useTheme()\r\n    const statusColorRef = React.useRef('')\r\n    const classes = useStyles({ statusColorRef })\r\n    const isMobileView = useMediaQuery(theme.breakpoints.down('sm'))\r\n    const authenStore = useAuthenStore()\r\n    const { profile } = authenStore\r\n    const translate = useTranslate()\r\n\r\n    React.useEffect(() => {\r\n        window.addEventListener('scroll', handleScroll, { passive: true })\r\n        return () => {\r\n            window.removeEventListener('scroll', handleScroll)\r\n        }\r\n    }, [])\r\n\r\n    const handleScroll = (event: any) => {\r\n        const wrappedElement = document.getElementById('searchDiv')\r\n        if (isBottom(wrappedElement)) {\r\n            window.removeEventListener('scroll', handleScroll)\r\n            handleScrollEnd(rowPerpage * (currentListIndexRef.current + 1), currentListIndexRef.current + 1)\r\n            setTimeout(() => {\r\n                window.addEventListener('scroll', handleScroll, { passive: true })\r\n            }, 1000)\r\n        }\r\n    }\r\n\r\n    const isBottom = (el: any) => {\r\n        return el?.getBoundingClientRect().bottom - window.innerHeight * 0.01 <= window.innerHeight\r\n    }\r\n\r\n    const rowRenderer = (props: any) => {\r\n        const {\r\n            key, // Unique key within array of rows\r\n            index, // Index of row within collection\r\n            style, // Style object to be applied to row (to position it)\r\n        } = props\r\n\r\n        return (\r\n            \r\n                {isMobileView ? renderListElementMobile(listItem[index], key) : renderListElement(listItem[index], key)}\r\n            \r\n        )\r\n    }\r\n    const getDisplayResearcherName = (val: ItemListType) => {\r\n        let displayResearcherName = ''\r\n        if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n            displayResearcherName = val.researcherName_th ?? '-'\r\n            if (val.researcherTypeName_th) {\r\n                displayResearcherName += ` (${val.researcherTypeName_th ?? ''})`\r\n            }\r\n        } else {\r\n            displayResearcherName = val.researcherName_en ?? '-'\r\n            if (val.researcherTypeName_en) {\r\n                displayResearcherName += ` (${val.researcherTypeName_en ?? ''})`\r\n            }\r\n        }\r\n        return displayResearcherName\r\n    }\r\n    const getDisplayProjectName = (val: ItemListType) => {\r\n        let displayProjectName = ''\r\n        if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n            displayProjectName = val.projectName_th ? val.projectName_th : '-'\r\n        } else {\r\n            displayProjectName = val.projectName_en ? val.projectName_en : '-'\r\n        }\r\n        return displayProjectName\r\n    }\r\n    const getDisplayProjectStatus = (val: ItemListType) => {\r\n        let displayStatus = ''\r\n\r\n        // if (\r\n        //     val.projectStatusID === constProjectStatus.closed || //ปิดโครงการ\r\n        //     val.projectStatusID === constProjectStatus.rejected || //ไม่อนุมัติ\r\n        //     val.projectStatusID === constProjectStatus.notScope || //ไม่เข้าข่าย\r\n        //     val.projectStatusID === constProjectStatus.terminate //ยุติโครงการ\r\n        // ) {\r\n        //     if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n        //         displayStatus = val.projectStatus_th ?? '-'\r\n        //     } else {\r\n        //         displayStatus = val.projectStatus_en ?? '-'\r\n        //     }\r\n        // } else {\r\n        //     if (val.submittedStatus_th && val.submittedStatus_en) {\r\n        //         if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n        //             displayStatus = val.submittedStatus_th ?? '-'\r\n        //         } else {\r\n        //             displayStatus = val.submittedStatus_en ?? '-'\r\n        //         }\r\n        //     } else {\r\n        //         displayStatus = translate.get('LABEL.DRAFT')\r\n        //     }\r\n        // }\r\n        if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n            displayStatus = val.projectStatus_th ?? '-'\r\n        } else {\r\n            displayStatus = val.projectStatus_en ?? '-'\r\n        }\r\n        return displayStatus\r\n    }\r\n\r\n    const getDisplaySubmittedDate = (val: ItemListType) => {\r\n        let display = '-'\r\n        if (val?.submittedDate) {\r\n            display =\r\n                translate.languageStore.currentLanguage === translate.languageKey.th\r\n                    ? convertDateToFormatTH(val.submittedDate)\r\n                    : convertDateToFormatEN(val.submittedDate)\r\n        }\r\n        return display\r\n    }\r\n\r\n    const renderListElementMobile = (itm: ItemListType, key: number) => {\r\n        const { submittedStatusColor, projectStatusBackgroundColor, statusTextColor } = checkStatusColor(itm)\r\n\r\n        return (\r\n            \r\n                 onClickEdit(itm)}\r\n                >\r\n                    \r\n                        \r\n                            \r\n                                \r\n                            \r\n                        \r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                        {itm.projectCode ? itm.projectCode.split('.')[1] : ''}\r\n                                    \r\n                                \r\n                            \r\n\r\n                            \r\n                                \r\n                                    {getDisplayProjectName(itm)}\r\n                                \r\n                            \r\n                        \r\n\r\n                        \r\n                            \r\n                        \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n    const renderListElement = (itm: ItemListType, key: number) => {\r\n        const { projectStatusBackgroundColor, submittedStatusColor, statusTextColor } = checkStatusColor(itm)\r\n\r\n        const isDirector = profile.userGroupId === constUserGroup.committee\r\n        const isResearcher = profile.userGroupId === constUserGroup.researcher\r\n        const isProcessing = itm.projectStatusID === projectStatus.processing\r\n        const padding = isProcessing && !isResearcher ? '10px 25px 10px 25px' : '25px'\r\n        const submitTypeName =\r\n            translate.languageStore.currentLanguage === translate.languageKey.th\r\n                ? itm.submittedStatus_th ?? '-'\r\n                : itm.submittedStatus_en ?? '-'\r\n        return (\r\n            \r\n                 onClickEdit(itm)}\r\n                    className={classes.hoverRow}\r\n                >\r\n                    \r\n                        \r\n                            {translate.get('BUTTON.EDIT')}\r\n                        \r\n                        \r\n                            \r\n                                \r\n                                    {itm?.projectNumber}\r\n                                \r\n                            \r\n                        \r\n                        \r\n                            \r\n                                \r\n                                    {getDisplayResearcherName(itm)}\r\n                                \r\n                            \r\n\r\n                            \r\n                                \r\n                                    {getDisplayProjectName(itm)}\r\n                                \r\n                            \r\n                        \r\n\r\n                        \r\n                            \r\n                                \r\n                                    {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                        ? itm.submitTypeName_th || '-'\r\n                                        : itm.submitTypeName_en || '-'}\r\n                                \r\n                            \r\n\r\n                            \r\n                                \r\n                                    {translate.get('LABEL.SUBMITTED_DATE')} {getDisplaySubmittedDate(itm)}\r\n                                \r\n                            \r\n                        \r\n\r\n                        {!isResearcher && (\r\n                            \r\n                                \r\n                                    \r\n                                        {isDirector\r\n                                            ? translate.get('LABEL.COMMITTEE_MEETING_DATE')\r\n                                            : translate.get('LABEL.EXPECTED_ANNOUNCEMENT_DATE')}\r\n                                    \r\n                                \r\n\r\n                                \r\n                                    \r\n                                        {isDirector\r\n                                            ? itm.committeeDueDate\r\n                                                ? translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                                    ? convertDateToFormatTH(itm.committeeDueDate)\r\n                                                    : convertDateToFormatEN(itm.committeeDueDate)\r\n                                                : '-'\r\n                                            : itm.announceDate\r\n                                            ? translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                                ? convertDateToFormatTH(itm.announceDate)\r\n                                                : convertDateToFormatEN(itm.announceDate)\r\n                                            : '-'}\r\n                                    \r\n                                \r\n                            \r\n                        )}\r\n\r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                        {getDisplayProjectStatus(itm)}\r\n                                    \r\n                                \r\n                            \r\n\r\n                            {isProcessing && !isResearcher && (\r\n                                \r\n                                    \r\n                                        {/*  */}\r\n                                        \r\n                                            {submitTypeName}\r\n                                        \r\n                                        {/*  */}\r\n                                    \r\n                                \r\n                            )}\r\n                        \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n    const checkStatusColor = (itm: ItemListType) => {\r\n        let projectStatusBackgroundColor = ''\r\n        let statusTextColor = ''\r\n        let submittedStatusColor = ''\r\n\r\n        switch (itm.projectStatusID) {\r\n            case projectStatus.rejected:\r\n                // code block ไม่อนุมัติ\r\n                projectStatusBackgroundColor = statusColorConstant.statusReject.backgroundColor\r\n                // statusTextColor = statusColorConstant.statusReject.textColor\r\n                break\r\n            case projectStatus.closed:\r\n                // code block ปิดโครงการ\r\n                projectStatusBackgroundColor = statusColorConstant.statusClose.backgroundColor\r\n                // statusTextColor = statusColorConstant.statusClose.textColor\r\n                break\r\n            case projectStatus.notScope:\r\n                // code block ไม่เข้าข่าย\r\n                projectStatusBackgroundColor = statusColorConstant.noScope.backgroundColor\r\n                // statusTextColor = statusColorConstant.noScope.textColor\r\n                break\r\n            case projectStatus.terminate:\r\n                // code block ยุติโครงการ\r\n                projectStatusBackgroundColor = statusColorConstant.terminate.backgroundColor\r\n                // statusTextColor = statusColorConstant.terminate.textColor\r\n                break\r\n            case projectStatus.processing:\r\n                // กำลังดำเนินการ\r\n                projectStatusBackgroundColor = statusColorConstant.status15.backgroundColor\r\n                // statusTextColor = statusColorConstant.status15.textColor\r\n                break\r\n            case projectStatus.completed:\r\n                // ดำเนินการเสร็จสิ้น\r\n                projectStatusBackgroundColor = statusColorConstant.status8.backgroundColor\r\n                // statusTextColor = statusColorConstant.status8.textColor\r\n                break\r\n            case projectStatus.withdraw:\r\n                //ถอนโครงการ\r\n                projectStatusBackgroundColor = statusColorConstant.withdraw.backgroundColor\r\n                break\r\n            default:\r\n                // statusId = null (ร่าง)\r\n                projectStatusBackgroundColor = statusColorConstant.status1.backgroundColor\r\n                // statusTextColor = statusColorConstant.status1.textColor\r\n\r\n                break\r\n        }\r\n\r\n        switch (itm.submittedStatusID) {\r\n            case statusColorConstant.status1.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.status1.backgroundColor\r\n\r\n                statusTextColor = statusColorConstant.status1.textColor\r\n                break\r\n\r\n            case statusColorConstant.status2.statusID:\r\n                // code block\r\n\r\n                submittedStatusColor = statusColorConstant.status2.backgroundColor\r\n                statusTextColor = statusColorConstant.status2.textColor\r\n\r\n                break\r\n            case statusColorConstant.status3.statusID:\r\n                submittedStatusColor = statusColorConstant.status3.backgroundColor\r\n                statusTextColor = statusColorConstant.status3.textColor\r\n\r\n                break\r\n            case statusColorConstant.status4.statusID:\r\n                submittedStatusColor = statusColorConstant.status4.backgroundColor\r\n                statusTextColor = statusColorConstant.status4.textColor\r\n\r\n                break\r\n            case statusColorConstant.status18.statusID:\r\n                submittedStatusColor = statusColorConstant.status18.backgroundColor\r\n                statusTextColor = statusColorConstant.status18.textColor\r\n\r\n                break\r\n            case statusColorConstant.status5.statusID:\r\n                submittedStatusColor = statusColorConstant.status5.backgroundColor\r\n                statusTextColor = statusColorConstant.status5.textColor\r\n\r\n                break\r\n            case statusColorConstant.status6.statusID:\r\n                submittedStatusColor = statusColorConstant.status6.backgroundColor\r\n                statusTextColor = statusColorConstant.status6.textColor\r\n\r\n                break\r\n            case statusColorConstant.status7.statusID:\r\n                submittedStatusColor = statusColorConstant.status7.backgroundColor\r\n                statusTextColor = statusColorConstant.status7.textColor\r\n\r\n                break\r\n            case statusColorConstant.status8.statusID:\r\n                submittedStatusColor = statusColorConstant.status8.backgroundColor\r\n                statusTextColor = statusColorConstant.status8.textColor\r\n\r\n                break\r\n            case statusColorConstant.status9.statusID:\r\n                submittedStatusColor = statusColorConstant.status9.backgroundColor\r\n                statusTextColor = statusColorConstant.status9.textColor\r\n\r\n                break\r\n            case statusColorConstant.status10.statusID:\r\n                submittedStatusColor = statusColorConstant.status10.backgroundColor\r\n                statusTextColor = statusColorConstant.status10.textColor\r\n\r\n                break\r\n            case statusColorConstant.status11.statusID:\r\n                submittedStatusColor = statusColorConstant.status11.backgroundColor\r\n                statusTextColor = statusColorConstant.status11.textColor\r\n\r\n                break\r\n            case statusColorConstant.status12.statusID:\r\n                submittedStatusColor = statusColorConstant.status12.backgroundColor\r\n                statusTextColor = statusColorConstant.status12.textColor\r\n                break\r\n            case statusColorConstant.status14.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.status14.backgroundColor\r\n                statusTextColor = statusColorConstant.status14.textColor\r\n                break\r\n            case statusColorConstant.status17.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.status17.backgroundColor\r\n                statusTextColor = statusColorConstant.status17.textColor\r\n                break\r\n            // case statusColorConstant.status15.statusID:\r\n            //     // กำลังดำเนินการ\r\n            //     submittedStatusColor = statusColorConstant.status15.backgroundColor\r\n            //     statusTextColor = statusColorConstant.status15.textColor\r\n            //     break\r\n            case statusColorConstant.resultOfConsideration.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.resultOfConsideration.backgroundColor\r\n                statusTextColor = statusColorConstant.resultOfConsideration.textColor\r\n                break\r\n            case statusColorConstant.noScope.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.noScope.backgroundColor\r\n                statusTextColor = statusColorConstant.noScope.textColor\r\n                break\r\n            case statusColorConstant.terminate.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.terminate.backgroundColor\r\n                statusTextColor = statusColorConstant.terminate.textColor\r\n                break\r\n            case statusColorConstant.withdraw.statusID:\r\n                // code block\r\n                submittedStatusColor = statusColorConstant.withdraw.backgroundColor\r\n                statusTextColor = statusColorConstant.withdraw.textColor\r\n                break\r\n            case statusColorConstant.proceedingMemoMessage.statusID:\r\n                // ดำเนินการทำใบบันทึกข้อความ\r\n                submittedStatusColor = statusColorConstant.proceedingMemoMessage.backgroundColor\r\n                statusTextColor = statusColorConstant.proceedingMemoMessage.textColor\r\n                break\r\n            case statusColorConstant.waitingEditProject.statusID:\r\n                // รอแก้ไขโครงการ\r\n                submittedStatusColor = statusColorConstant.waitingEditProject.backgroundColor\r\n                statusTextColor = statusColorConstant.waitingEditProject.textColor\r\n                break\r\n            default:\r\n                // statusId = null (ร่าง)\r\n                submittedStatusColor = statusColorConstant.status1.backgroundColor\r\n                statusTextColor = statusColorConstant.status1.textColor\r\n\r\n                break\r\n        }\r\n\r\n        return { submittedStatusColor, statusTextColor, projectStatusBackgroundColor }\r\n    }\r\n\r\n    return (\r\n        \r\n            \r\n                \r\n                    \r\n                        \r\n                    \r\n                \r\n                \r\n                    \r\n                \r\n            \r\n        \r\n    )\r\n}\r\n\r\n//Controller\r\nconst Search = (props: searchTypes.SearchType) => {\r\n    const {} = props\r\n    const searchModel = useSearch({})\r\n    return \r\n}\r\n\r\nexport default Search\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n    createStyles({\r\n        item: {\r\n            // display: 'flex',\r\n            // alignItems: 'center',\r\n            padding: theme.spacing(3),\r\n            margin: theme.spacing(2, 0),\r\n            // border: '1px solid #bdbdbd',\r\n            // borderRadius: 4,\r\n            // transition: '0.3s',\r\n            // position: 'relative',\r\n            '&:hover': {\r\n                border: `1px solid ${theme.palette.primary.main}`,\r\n            },\r\n        },\r\n        paper: {\r\n            height: 'calc(100% + 0px)',\r\n            width: '100%',\r\n        },\r\n        paperFromSearch: {\r\n            width: '100%',\r\n            padding: '30px',\r\n            marginBottom: '10px',\r\n        },\r\n        headTbl: {\r\n            paddingTop: '15px',\r\n            paddingBottom: '15px',\r\n            paddingLeft: '10px',\r\n            fontSize: '20px',\r\n        },\r\n        div: {\r\n            marginTop: '20px',\r\n            paddingRight: '10px',\r\n            cursor: 'pointer',\r\n        },\r\n        borderRadius: {\r\n            border: '2px solid rgba(0, 0, 0, .125)',\r\n            background: '#f1efef',\r\n        },\r\n        btnSearch: {\r\n            textAlign: 'right',\r\n            marginTop: '30px',\r\n        },\r\n        btnAdd: {\r\n            '&:hover': {\r\n                backgroundColor: '#ffffff',\r\n                boxShadow: 'none',\r\n            },\r\n        },\r\n        btnIcon: {\r\n            padding: '8px',\r\n            background: '#f1efef',\r\n        },\r\n        paperProjectCode: {\r\n            padding: '10px',\r\n            // background: '#f3f3f3',\r\n            width: '120px',\r\n            textAlign: 'center',\r\n            border: 'unset',\r\n        },\r\n        paperProjectStatus: {\r\n            padding: '10px',\r\n\r\n            width: 'auto',\r\n            textAlign: 'center',\r\n            borderRadius: '20px',\r\n        },\r\n        paperProjectStatusMobile: {\r\n            // padding: '10px',\r\n            height: '15px',\r\n            width: '15px',\r\n            borderRadius: '20px',\r\n        },\r\n        hoverRow: {\r\n            cursor: 'pointer',\r\n            '&:hover': { border: '1px solid #db5f8e !important' },\r\n        },\r\n        btnEdit: {\r\n            boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n            height: '44px',\r\n            marginRight: '1px',\r\n        },\r\n        paperList: {\r\n            '&:hover': { border: '1px solid #db5f8e !important' },\r\n        },\r\n        multiLineEllipsis: {\r\n            maxWidth: '100%',\r\n            overflow: 'hidden',\r\n            textOverflow: 'ellipsis',\r\n            display: '-webkit-box',\r\n            '-webkit-line-clamp': 1,\r\n            '-webkit-box-orient': 'vertical',\r\n        },\r\n    }),\r\n)\r\n","import * as manageProjectType from './manageProjectType'\r\nconst useManageProjectType = (props: manageProjectType.UseManageProject) => {\r\n    return {}\r\n}\r\n\r\nexport default useManageProjectType\r\n","import * as manageTypes from './manageProjectType'\r\nimport Search from '../manageProject/search/search'\r\nimport useManageProjectType from './useManageProject'\r\nimport { Container, Grid, Typography, Button, makeStyles } from '@material-ui/core'\r\n\r\n//View\r\nconst ManageProjectView = (props: manageTypes.ManageProjectView) => {\r\n    const classes = useStyles()\r\n    const screenHeight = window.innerHeight\r\n    return (\r\n        // 
\r\n // \r\n //
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n//Controller\r\nconst ManageProject = (props: manageTypes.ManageProjectType) => {\r\n const manageProjectModel = useManageProjectType(props)\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n}))\r\n\r\nexport default ManageProject\r\n","import { useField } from 'react-final-form'\r\nimport { composeValidators, textRequired } from '../../utilities/validate'\r\nimport { UseTextfieldProps } from '../textfield/textfieldType'\r\nimport useTranslate from '../../i18n/useTranslate'\r\n\r\nexport type FieldRequired = boolean | { showAsterisk?: boolean; triggedValidate?: boolean; errorMessage?: string }\r\n\r\nfunction useRichTextfield(props: UseTextfieldProps) {\r\n const { name, required, validates = [] } = props\r\n const translate = useTranslate()\r\n\r\n let mergeValidate = validates\r\n if ((typeof required === 'boolean' && required) || (typeof required === 'object' && required.triggedValidate)) {\r\n mergeValidate = [\r\n textRequired(typeof required === 'object' ? required.errorMessage : `${translate.get('MESSAGE.M015')}`),\r\n ...mergeValidate,\r\n ]\r\n }\r\n /* Validate */\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate),\r\n })\r\n\r\n return { field }\r\n}\r\n\r\nexport default useRichTextfield\r\n","import { useField } from 'react-final-form'\r\nimport { composeValidators, selectRequired } from '../../utilities/validate'\r\nimport {} from './/treeCheckboxType'\r\n\r\nexport type FieldRequired = boolean | { showAsterisk?: boolean; triggedValidate?: boolean; errorMessage?: string }\r\n\r\nfunction useTreeCheckbox(props: any) {\r\n const { name, required, validates = [] } = props\r\n let mergeValidate = validates\r\n if ((typeof required === 'boolean' && required) || (typeof required === 'object' && required.triggedValidate)) {\r\n mergeValidate = [\r\n selectRequired(typeof required === 'object' ? required.errorMessage : undefined),\r\n ...mergeValidate,\r\n ]\r\n }\r\n /* Validate */\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate),\r\n })\r\n\r\n return { field }\r\n}\r\n\r\nexport default useTreeCheckbox\r\n","import React from 'react'\r\nimport useTreeCheckbox from './useTreeCheckbox'\r\nimport { makeStyles } from '@material-ui/core'\r\nimport List from '@material-ui/core/List'\r\nimport ListItem from '@material-ui/core/ListItem'\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon'\r\nimport ListItemText from '@material-ui/core/ListItemText'\r\nimport Collapse from '@material-ui/core/Collapse'\r\nimport Checkbox from '@material-ui/core/Checkbox'\r\nimport { FormHelperText } from '@material-ui/core'\r\nimport { FieldValidator } from 'final-form'\r\n\r\nexport type DataSourceType = {\r\n id: number\r\n name_th: string\r\n name_en: string\r\n checked: boolean\r\n children?: any[]\r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n backgroundColor: theme.palette.background.paper,\r\n },\r\n nested: {\r\n paddingLeft: theme.spacing(8),\r\n },\r\n errorText: {\r\n fontSize: '12px',\r\n color: '#ff4d4f',\r\n },\r\n rootError: {\r\n color: 'red',\r\n '&$checked': {\r\n color: '#db5f8e',\r\n },\r\n },\r\n checkBox: {\r\n marginTop: '-10px',\r\n },\r\n}))\r\nlet TreeCheckboxView: React.FC = ({\r\n dataSource,\r\n field,\r\n required,\r\n disabled,\r\n isLangTH = true,\r\n labelRadioTH = 'ไทย',\r\n labelRadioEN = 'อังกฤษ',\r\n onClickParentCheckbox,\r\n ...other\r\n}) => {\r\n const { input, meta } = field\r\n const isError = meta.error && meta.invalid && meta.touched ? true : false\r\n const classes = useStyles()\r\n\r\n const [open, setOpen] = React.useState(true)\r\n const [selectedList, setSelectedList] = React.useState({\r\n parentSelected: [],\r\n childSelected: [],\r\n })\r\n\r\n React.useEffect(() => {\r\n if (meta.initial) {\r\n if (meta.initial.childSelected.length > 0 || meta.initial.parentSelected.length > 0) {\r\n const parent = dataSource.map((item: any) => ({\r\n checked: item.checked,\r\n id: item.id,\r\n name_en: item.name_en,\r\n name_th: item.name_th,\r\n }))\r\n let children: { id: number; name_th: string; name_en: string; checked: boolean }[] = []\r\n dataSource.forEach((item: any) => {\r\n if (item.children.length > 0) {\r\n const obj = item.children.filter((itm: any) => itm.parentID === item.id)\r\n children.push(...obj)\r\n }\r\n })\r\n setSelectedList({\r\n ...selectedList,\r\n childSelected: children,\r\n parentSelected: parent,\r\n })\r\n }\r\n }\r\n }, [meta.initial])\r\n\r\n const handleClick = () => {\r\n setOpen(!open)\r\n }\r\n const isParentCheckedFn = (data: DataSourceType) => {\r\n const { parentSelected } = selectedList\r\n const isChecked =\r\n parentSelected.filter((itm: any) =>\r\n itm.checked !== undefined ? itm.id === data.id && itm.checked : itm.id === data.id,\r\n ).length > 0\r\n\r\n return isChecked\r\n }\r\n\r\n const isChildrenCheckedFn = (data: any) => {\r\n const { childSelected } = selectedList\r\n const isChecked =\r\n childSelected.filter((itm: any) =>\r\n itm.checked !== undefined ? itm.id === data.id && itm.checked : itm.id === data.id,\r\n ).length > 0\r\n\r\n return isChecked\r\n }\r\n\r\n const isAllChildCheckedFn = (parentID: number) => {\r\n const { childSelected } = selectedList\r\n const topicData = dataSource.filter((itm: any) => itm.id === parentID)\r\n\r\n const checklistID = topicData[0].children.map((item: any) => item.id)\r\n const allChildNum = topicData.length > 0 ? topicData[0].children.length : 0 //จำนวนลูกทั้งหมดที่มี\r\n const currentChildSelectedNum =\r\n childSelected.filter((itm: any) => itm.checked === true && checklistID.indexOf(itm.id) > -1).length + 1 //จำนวนลูกทั้งหมดที่ถูกติ๊กเลือกอยู่\r\n\r\n const isAllChildChecked = allChildNum === currentChildSelectedNum ? true : false\r\n\r\n return isAllChildChecked\r\n }\r\n\r\n const handleCheckedParent = (data: DataSourceType) => () => {\r\n const { parentSelected, childSelected } = selectedList\r\n const isChecked = isParentCheckedFn(data)\r\n let newSelectedList = {}\r\n // --- case 1 มีการติ๊กอยู่ (ให้เอาติ๊กออกพร้อมกับเอาติ๊กลูกออกทั้งหมด) --- //\r\n if (isChecked) {\r\n // const newParentList = parentSelected.filter((itm: any) =>\r\n // !itm.checked ? itm.id !== data.id && itm.checked : itm.id !== data.id,\r\n // )\r\n // const newChildList = childSelected.filter((itm: any) =>\r\n // !itm.checked ? itm.parentID !== data.id && itm.checked : itm.parentID !== data.id,\r\n // )\r\n const newParentList = parentSelected.map((itm: any) => {\r\n if (itm.id === data.id) {\r\n return { ...itm, checked: false }\r\n } else {\r\n return itm\r\n }\r\n })\r\n const newChildList = childSelected.map((itm: any) => {\r\n if (itm.parentID === data.id) {\r\n return { ...itm, checked: false }\r\n } else {\r\n return itm\r\n }\r\n })\r\n newSelectedList = {\r\n ...selectedList,\r\n parentSelected: newParentList,\r\n childSelected: newChildList,\r\n }\r\n }\r\n\r\n // --- case 2 ไม่ได้ติ๊กอยู่ (ให้ติ๊กพร้อมกับติ๊กลูกทั้งหมด) --- //\r\n else {\r\n if (data.children) {\r\n newSelectedList = {\r\n ...selectedList,\r\n parentSelected: [...parentSelected, { ...data, checked: true }],\r\n childSelected: [...childSelected, ...data.children.map((item) => ({ ...item, checked: true }))],\r\n }\r\n } else {\r\n newSelectedList = {\r\n ...selectedList,\r\n parentSelected: [...parentSelected, { ...data, checked: true }],\r\n childSelected: [...childSelected],\r\n }\r\n }\r\n }\r\n if (onClickParentCheckbox) {\r\n onClickParentCheckbox(data)\r\n }\r\n\r\n //@ts-ignore\r\n setSelectedList(newSelectedList)\r\n changeInputValue(newSelectedList)\r\n }\r\n\r\n const handleCheckedChild = (data: any) => () => {\r\n const { parentSelected, childSelected } = selectedList\r\n const isChecked = isChildrenCheckedFn(data)\r\n const isAllChildChecked = isAllChildCheckedFn(data.parentID)\r\n\r\n let newSelectedList = {}\r\n // --- case 1 มีการติ๊กอยู่ (ถ้าเอาติ๊กทั้งหมดออกจะเอาติ๊กพ่อออก) --- //\r\n if (isChecked) {\r\n // const newParentList = parentSelected.filter((itm: any) =>\r\n // !itm.checked ? itm.id !== data.parentID && itm.checked : itm.id !== data.parentID,\r\n // )\r\n // const newChildList = childSelected.filter((itm: any) =>\r\n // !itm.checked ? itm.id !== data.id && itm.checked : itm.id !== data.id,\r\n // )\r\n const newParentList = parentSelected.map((itm: any) => {\r\n if (itm.id === data.parentID) {\r\n return { ...itm, checked: false }\r\n } else {\r\n return itm\r\n }\r\n })\r\n const newChildList = childSelected.map((itm: any) => {\r\n if (itm.id === data.id) {\r\n return { ...itm, checked: false }\r\n } else {\r\n return itm\r\n }\r\n })\r\n newSelectedList = {\r\n ...selectedList,\r\n parentSelected: newParentList,\r\n childSelected: newChildList,\r\n }\r\n }\r\n // --- case 2 ไม่ได้ติ๊กอยู่ (ให้ติ๊กพร้อมกับเช็คว่าลูกทั้งหมดถูกติ๊กอยู่หรือไม่) --- //\r\n else {\r\n if (isAllChildChecked) {\r\n // true ติ๊กลูกทั้งหมด ถึงจะติ๊กพ่อ\r\n newSelectedList = {\r\n ...selectedList,\r\n childSelected: [\r\n ...childSelected.map((item: any) => {\r\n if (item.id === data.id) {\r\n return { ...item, checked: true }\r\n } else {\r\n return item\r\n }\r\n }),\r\n ],\r\n parentSelected: [\r\n ...parentSelected.map((item: any) => {\r\n if (item.id === data.parentID) {\r\n return { ...item, checked: true }\r\n } else {\r\n return item\r\n }\r\n }),\r\n ],\r\n }\r\n } else {\r\n // false ติ๊กลูกอันเดียว จะไม่ติ๊กพ่อ\r\n newSelectedList = {\r\n ...selectedList,\r\n childSelected: [\r\n ...childSelected.map((item: any) => {\r\n if (item.id === data.id) {\r\n return { ...item, checked: true }\r\n } else {\r\n return item\r\n }\r\n }),\r\n ],\r\n }\r\n }\r\n }\r\n\r\n //@ts-ignore\r\n setSelectedList(newSelectedList)\r\n changeInputValue(newSelectedList)\r\n }\r\n\r\n const changeInputValue = (newSelectedList: any, langValueList?: any) => {\r\n let dataForReturn = newSelectedList\r\n input.onChange(dataForReturn)\r\n }\r\n\r\n const renderChild = (childrenList: any) => {\r\n return childrenList.map((child: any) => {\r\n const isChecked = isChildrenCheckedFn(child)\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n })\r\n }\r\n const renderElement = (dataSource: DataSourceType[]) => {\r\n return dataSource.map((data) => {\r\n const isChecked = isParentCheckedFn(data)\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {renderChild(data.children)}\r\n \r\n \r\n \r\n )\r\n })\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {renderElement(dataSource)}\r\n \r\n \r\n {/* {!materialInputProps?.disabled && meta.error && meta.touched && meta.error} */}\r\n {isError && meta.error}\r\n \r\n \r\n )\r\n}\r\nexport type TreeCheckboxCtrlType = {\r\n dataSource: DataSourceType[]\r\n name: string\r\n style?: any\r\n disabled: boolean\r\n labelRadioEN: string\r\n labelRadioTH: string\r\n isLangTH: boolean\r\n required?: boolean\r\n validates?: FieldValidator[]\r\n\r\n onClickParentCheckbox: (selectedItem: DataSourceType) => void\r\n}\r\nlet TreeCheckboxCtrl: React.FC = ({ name, ...others }) => {\r\n const styleCustom = { minWidth: '125px', ...others?.style }\r\n const treeCheckboxModel = useTreeCheckbox({\r\n name,\r\n ...others,\r\n })\r\n return \r\n}\r\n\r\nexport default TreeCheckboxCtrl\r\n","import { responseLookupServiceTypes } from '../../../services/lookup/types'\r\nimport { commentaryTopicUrl } from '../../../services/lookup/lookupServiceURL'\r\nimport useCallApi from '../../../utilities/axios'\r\nimport { getAllChecklist, deleteChecklist, orderChecklist } from '../../../services/um/umServiceURL'\r\n\r\nexport type ResponseCheckListType = {\r\n message: string\r\n status: number\r\n result: CheckListType[]\r\n}\r\n\r\nexport type CheckListType = {\r\n checklistID: number\r\n nameTH: string\r\n nameEN: string\r\n irb: number\r\n children: SubCheckListType[]\r\n}\r\n\r\nexport type SubCheckListType = {\r\n checklistID: number\r\n nameTH: string\r\n nameEN: string\r\n}\r\n\r\nexport type RequestNewCheckList = {\r\n topicID: number\r\n parentID: number | null\r\n nameTH: string\r\n nameEN: string\r\n irb: number\r\n}\r\n\r\nexport type ResponseNewCheckListType = {\r\n message: string\r\n status: number\r\n result: number\r\n}\r\n\r\nconst useChecklist = () => {\r\n const callApi = useCallApi()\r\n\r\n const getAllTopic = async (irb: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${commentaryTopicUrl}/${irb}`,\r\n })\r\n return data\r\n }\r\n\r\n const getCheckListByTopicID = async (topicID: number, irb: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${getAllChecklist}/${topicID}/${irb}`,\r\n })\r\n\r\n return data.result\r\n }\r\n\r\n const addNewCheckList = async (body: RequestNewCheckList) => {\r\n const { data } = await callApi.axiosPost({\r\n url: getAllChecklist,\r\n params: body,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const deleteCheckList = async (topicID: number, checklistID: number, parentID: number | null) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${deleteChecklist}/${topicID}`,\r\n params: {\r\n checklistID,\r\n parentID,\r\n },\r\n })\r\n\r\n return data\r\n }\r\n\r\n const editAllCheckList = async (\r\n topicID: number,\r\n checklistID: number,\r\n parentID: number | null,\r\n nameTH: string,\r\n nameEN: string,\r\n ) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${getAllChecklist}/${topicID}`,\r\n params: {\r\n checklistID,\r\n parentID,\r\n nameTH,\r\n nameEN,\r\n },\r\n })\r\n\r\n return data\r\n }\r\n\r\n const reOrderChecklist = async (topicID: number, value: any) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${orderChecklist}/${topicID}`,\r\n params: value.checkList,\r\n })\r\n\r\n return data\r\n }\r\n return {\r\n getAllTopic,\r\n getCheckListByTopicID,\r\n addNewCheckList,\r\n deleteCheckList,\r\n editAllCheckList,\r\n reOrderChecklist,\r\n }\r\n}\r\n\r\nexport default useChecklist\r\n","import { atom, useRecoilValue } from 'recoil'\r\nimport { CheckListInTopicType } from '../../services/web/types/requestWebServiceTypes'\r\n\r\nexport type ChecklistStoreType = {\r\n checklist: CheckListInTopicType[]\r\n}\r\nexport const checklistStore = atom({\r\n key: 'checklistStore',\r\n default: {\r\n checklist: [],\r\n },\r\n})\r\n\r\nconst useChecklistStore = () => {\r\n const checklistState = useRecoilValue(checklistStore)\r\n return {\r\n ...checklistState,\r\n }\r\n}\r\n\r\nexport default useChecklistStore\r\n","import { useSetRecoilState } from 'recoil'\r\nimport { getChecklistBySubmittedID } from '../../services/um/umServiceURL'\r\nimport { CheckListInTopicType } from '../../services/web/types/requestWebServiceTypes'\r\nimport useCallApi from '../../utilities/axios'\r\nimport { checklistStore } from './useChecklistStore'\r\n\r\nconst useChecklistAction = () => {\r\n const setChecklistStore = useSetRecoilState(checklistStore)\r\n const callApi = useCallApi()\r\n\r\n const setChecklist = (param: CheckListInTopicType) => {\r\n setChecklistStore((prevState) => ({\r\n checklist: [...prevState.checklist.filter((item) => item.topicID !== param.topicID), param],\r\n }))\r\n }\r\n\r\n const getChecklist = async (submittedID: number, committeeID: number, irb: number) => {\r\n const { data } = await callApi.axiosPost({\r\n url: getChecklistBySubmittedID,\r\n params: { submittedID, committeeID, irb },\r\n })\r\n\r\n // console.log(data)\r\n setChecklistStore(() => ({\r\n checklist: [...data.result],\r\n }))\r\n }\r\n\r\n const clearChecklist = () => {\r\n setChecklistStore({\r\n checklist: [],\r\n })\r\n }\r\n\r\n return {\r\n setChecklist,\r\n getChecklist,\r\n clearChecklist,\r\n }\r\n}\r\n\r\nexport default useChecklistAction\r\n","import { Button, Grid, styled, makeStyles, Typography } from '@material-ui/core'\r\nimport { FC, useEffect, useRef, useState } from 'react'\r\nimport { Form } from 'react-final-form'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport MyRadio from '../../../control/radio/radio'\r\nimport TreeCheckbox, { DataSourceType } from '../../../control/treeCheckboxNew/treeCheckbox'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useManageProjectStore from '../../../stores/manageProject/useManageProjectStore'\r\nimport useCheckPermission from '../../../utilities/checkPermission'\r\nimport useChecklist from '../shareLogic/useChecklist'\r\nimport { validateTreeCheckboxRequireAtLeastOne } from '../../../utilities/validate'\r\nimport useChecklistAction from '../../../stores/checklist/useChecklistAction'\r\nimport useChecklistStore from '../../../stores/checklist/useChecklistStore'\r\nimport _ from 'lodash'\r\nimport { ParentType } from '../../../services/web/types/requestWebServiceTypes'\r\n\r\nconst ButtonForm = styled(Button)({\r\n fontSize: '18px',\r\n color: '#0062FF',\r\n textDecoration: 'underline',\r\n})\r\n\r\ntype InitialCheckList = {\r\n groupAppropriate: string\r\n topicCheckList: { childSelected: any[]; parentSelected: any[] }\r\n}\r\n\r\nconst DialogChecklist: FC<{\r\n title: string\r\n topicID: number\r\n committeeID: number\r\n disabled: boolean\r\n}> = ({ title, topicID, committeeID, disabled }) => {\r\n const [checklist, setCheckList] = useState([])\r\n const [initialValues, setInitialValues] = useState({\r\n groupAppropriate: '',\r\n topicCheckList: { childSelected: [], parentSelected: [] },\r\n })\r\n const checklistRef = useRef>()\r\n const translate = useTranslate()\r\n const { getCheckListByTopicID } = useChecklist()\r\n const classes = useStyles()\r\n\r\n const [isAppropriate, setIsAppropriate] = useState('1')\r\n const openRef = useRef(false)\r\n const successRef = useRef>()\r\n const failRef = useRef>()\r\n const { projectData } = useManageProjectStore()\r\n const checkPermissionHook = useCheckPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const { setChecklist: setCheckListAction, getChecklist } = useChecklistAction()\r\n const checklistState = useChecklistStore()\r\n\r\n const [isHas, setIsHas] = useState(false)\r\n\r\n const handleChangeValue = (val: string) => {\r\n setIsAppropriate(val)\r\n }\r\n\r\n const bindingRef = (func: Record) => {\r\n checklistRef.current = { ...func }\r\n }\r\n\r\n const handleCloseDialog = () => {\r\n checklistRef?.current?.closeDialog()\r\n openRef.current = false\r\n setIsAppropriate(initialValues.groupAppropriate)\r\n }\r\n\r\n const handleOpenDialog = async () => {\r\n checklistRef?.current?.openDialog()\r\n openRef.current = true\r\n let isChecklistChose: any[] = []\r\n checklistState.checklist.forEach((item) => {\r\n const checkListSelected = item.data.filter((itm) => itm.checked === true)\r\n isChecklistChose.push(...checkListSelected)\r\n })\r\n let response: any = []\r\n if (isChecklistChose.length > 0) {\r\n response = checklistState.checklist.find((topic) => topic.topicID === topicID)?.data\r\n } else {\r\n response = await getCheckListByTopicID(topicID, Number(projectData?.irb))\r\n }\r\n const result = response?.map((item: ParentType) => ({\r\n id: item.checklistID,\r\n checked: item.checked ? item.checked : false,\r\n name_th: item.nameTH,\r\n name_en: item.nameEN,\r\n children: item.children?.map((child) => ({\r\n id: child.checklistID,\r\n checked: child.checked ? child.checked : false,\r\n parentID: item.checklistID,\r\n name_en: child.nameEN,\r\n name_th: child.nameTH,\r\n })),\r\n }))\r\n\r\n setCheckList(result)\r\n }\r\n\r\n const handleSubmit = (val: any) => {\r\n if (val.groupAppropriate !== '2') {\r\n setCheckListAction({ topicID, data: [], isAppropriate: val.groupAppropriate })\r\n setCheckList([])\r\n } else if (val.groupAppropriate === '2') {\r\n const newData: any = checklist.map((item) => {\r\n const filterParent = val.topicCheckList.parentSelected.filter(\r\n (f: any) => f.id === item.id && f.checked,\r\n )[0]\r\n\r\n if (filterParent) {\r\n item.checked = true\r\n }\r\n\r\n const child = item.children?.map((c) => {\r\n const filterParent = val.topicCheckList.childSelected.filter(\r\n (f: any) => f.id === c.id && f.checked,\r\n )[0]\r\n\r\n if (filterParent) {\r\n c.checked = true\r\n }\r\n\r\n return {\r\n ...c,\r\n checklistID: c.id,\r\n nameTH: c.name_th,\r\n nameEN: c.name_en,\r\n }\r\n })\r\n\r\n return {\r\n ...item,\r\n nameTH: item.name_th,\r\n nameEN: item.name_en,\r\n checklistID: item.id,\r\n children: child,\r\n }\r\n })\r\n\r\n setCheckListAction({ topicID, data: newData, isAppropriate: val.groupAppropriate })\r\n }\r\n checklistRef?.current?.closeDialog()\r\n }\r\n\r\n const onSetSuccessRef = (func: Record) => {\r\n successRef.current = { ...func }\r\n }\r\n\r\n const onSetFailRef = (func: Record) => {\r\n failRef.current = { ...func }\r\n }\r\n\r\n useEffect(() => {\r\n if (committeeID) {\r\n const getAllChecklist = async () => {\r\n if (projectData) {\r\n await getChecklist(projectData.submittedID, committeeID, projectData.irb)\r\n }\r\n }\r\n getAllChecklist()\r\n }\r\n }, [disabled, committeeID])\r\n\r\n useEffect(() => {\r\n if (checklistState.checklist.length > 0) {\r\n const filter = checklistState.checklist.filter((item) => item.topicID === topicID).length > 0\r\n if (filter) {\r\n setIsHas(true)\r\n }\r\n }\r\n }, [checklistState])\r\n\r\n useEffect(() => {\r\n const parent = checklistState.checklist.map((topic) => {\r\n return topic.data.map((checklist: any) => ({\r\n id: checklist.checklistID,\r\n checked: checklist.checked,\r\n name_th: checklist.nameTH,\r\n name_en: checklist.nameEN,\r\n }))\r\n })\r\n const children = checklistState.checklist.map((topic) =>\r\n topic.data.map((checklist: any) =>\r\n checklist.children.map((child: any) => ({\r\n id: child.checklistID,\r\n checked: child.checked,\r\n name_th: child.nameTH,\r\n name_en: child.nameEN,\r\n })),\r\n ),\r\n )\r\n\r\n const newAppropriate =\r\n checklistState.checklist.filter((item) => item.topicID === topicID)[0]?.isAppropriate + ''\r\n handleChangeValue(newAppropriate)\r\n setInitialValues({\r\n groupAppropriate: newAppropriate,\r\n topicCheckList: { parentSelected: _.flattenDeep(parent), childSelected: _.flattenDeep(children) },\r\n })\r\n }, [openRef.current, checklistState.checklist])\r\n\r\n return (\r\n <>\r\n {isHas && {translate.get('LABEL.CHECKLIST_FORM')}}\r\n \r\n {({ handleSubmit }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n \r\n {isAppropriate === '2' && (\r\n <>\r\n \r\n \r\n Not Appropriate/Not clear\r\n *\r\n \r\n \r\n \r\n {}}\r\n isLangTH={\r\n translate.languageStore.currentLanguage ===\r\n translate.languageKey.th\r\n }\r\n />\r\n \r\n \r\n )}\r\n {isViewMode || disabled ? (\r\n \r\n \r\n \r\n {translate.get('BUTTON.CLOSE')}\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.EXTERNAL-REGISTER.OK')}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n }}\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n subChecklist: { paddingLeft: '15px' },\r\n errorText: {\r\n fontSize: '12px',\r\n color: '#ff4d4f',\r\n },\r\n subTitle: {\r\n fontWeight: 'bolder',\r\n color: 'black',\r\n },\r\n btnStyle: {\r\n paddingRight: '15px',\r\n },\r\n}))\r\n\r\nexport default DialogChecklist\r\n","import React from 'react'\r\nimport { FormHelperText, Grid, Typography } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { ContentState, EditorState, convertToRaw } from 'draft-js'\r\nimport { Editor } from 'react-draft-wysiwyg'\r\nimport draftToHtml from 'draftjs-to-html'\r\nimport htmlToDraft from 'html-to-draftjs'\r\nimport '../../../node_modules/react-draft-wysiwyg/dist/react-draft-wysiwyg.css'\r\nimport useRichTextfield from './useRichTextEditorts'\r\nimport useManageMenuStore from '../../stores/manageMenu/useManageMenuStore'\r\nimport DialogChecklist from '../../component/web/checklist/DialogChecklist'\r\n\r\nexport type InitialRichTextEditorType = {\r\n contentHtml: string\r\n contentText: string\r\n}\r\nlet MyRichTextFieldView: React.FC = ({\r\n field,\r\n required,\r\n maxLength = 9999999,\r\n materialInputProps = {},\r\n type,\r\n icon,\r\n initialRichTextEditor,\r\n disabled,\r\n isHideToolbar = false,\r\n label,\r\n commentTitle,\r\n commentTitleID,\r\n topicCount,\r\n topicID,\r\n committeeID,\r\n ...other\r\n}) => {\r\n const getInitialState = (content: any) => {\r\n const blocksFromHtml = htmlToDraft(`${content}`)\r\n const contentState = ContentState.createFromBlockArray(blocksFromHtml.contentBlocks, blocksFromHtml.entityMap)\r\n return EditorState.createWithContent(contentState)\r\n }\r\n\r\n const { input, meta } = field\r\n const isError = meta.error && meta.invalid && meta.touched ? true : false\r\n const classes = useStyles(isError)\r\n\r\n const [editorState, setEditorState] = React.useState(() => EditorState.createEmpty())\r\n const MAX_LENGTH = maxLength\r\n let textLength = React.useRef(0)\r\n\r\n const manageMenuStore = useManageMenuStore()\r\n const { isOpen } = manageMenuStore\r\n\r\n /// --- set initial --- ///\r\n React.useEffect(() => {\r\n setEditorState(getInitialState(initialRichTextEditor?.contentHtml ?? ''))\r\n const initialValueObj = {\r\n contentHtml: initialRichTextEditor?.contentHtml ?? '',\r\n contentText: initialRichTextEditor?.contentText ?? '',\r\n }\r\n\r\n input.onChange(initialValueObj)\r\n textLength.current = initialRichTextEditor?.contentHtml?.length\r\n }, [initialRichTextEditor])\r\n\r\n const getLabel = () => {\r\n // const myLabel = required ? materialInputProps.label + `*` : materialInputProps.label || ''\r\n const myLabel =\r\n required || (meta.error && meta.touched) ? (\r\n \r\n \r\n {label}\r\n \r\n \r\n \r\n {isError && meta.error} *\r\n \r\n \r\n \r\n ) : (\r\n \r\n {label || ''}\r\n \r\n )\r\n return (\r\n \r\n \r\n \r\n {myLabel}\r\n \r\n \r\n {commentTitle && commentTitle !== 'ข้อคิดเห็น / ข้อสังเกต' ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n )}\r\n \r\n )\r\n }\r\n const getLengthOfSelectedText = () => {\r\n const currentSelection = editorState.getSelection()\r\n const isCollapsed = currentSelection.isCollapsed()\r\n\r\n let length = 0\r\n\r\n if (!isCollapsed) {\r\n const currentContent = editorState.getCurrentContent()\r\n const startKey = currentSelection.getStartKey()\r\n const endKey = currentSelection.getEndKey()\r\n const startBlock = currentContent.getBlockForKey(startKey)\r\n const isStartAndEndBlockAreTheSame = startKey === endKey\r\n const startBlockTextLength = startBlock.getLength()\r\n const startSelectedTextLength = startBlockTextLength - currentSelection.getStartOffset()\r\n const endSelectedTextLength = currentSelection.getEndOffset()\r\n const keyAfterEnd = currentContent.getKeyAfter(endKey)\r\n\r\n if (isStartAndEndBlockAreTheSame) {\r\n length += currentSelection.getEndOffset() - currentSelection.getStartOffset()\r\n } else {\r\n let currentKey = startKey\r\n\r\n while (currentKey && currentKey !== keyAfterEnd) {\r\n if (currentKey === startKey) {\r\n length += startSelectedTextLength + 1\r\n } else if (currentKey === endKey) {\r\n length += endSelectedTextLength\r\n } else {\r\n length += currentContent.getBlockForKey(currentKey).getLength() + 1\r\n }\r\n\r\n currentKey = currentContent.getKeyAfter(currentKey)\r\n }\r\n }\r\n }\r\n\r\n return length\r\n }\r\n const handleBeforeInputFunc = () => {\r\n const currentContent = editorState.getCurrentContent()\r\n const currentContentLength = currentContent.getPlainText('').length\r\n const selectedTextLength = getLengthOfSelectedText()\r\n\r\n if (currentContentLength - selectedTextLength > MAX_LENGTH - 1) {\r\n return 'handled'\r\n }\r\n }\r\n\r\n const handlePastedTextFunc = (pastedText: any) => {\r\n const currentContent = editorState.getCurrentContent()\r\n const currentContentLength = currentContent.getPlainText('').length\r\n const selectedTextLength = getLengthOfSelectedText()\r\n\r\n if (currentContentLength + pastedText.length - selectedTextLength > MAX_LENGTH) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n }\r\n\r\n let calWidth = 0\r\n if (window.innerWidth >= 1920 && isOpen) {\r\n calWidth = window.innerWidth - 155\r\n } else {\r\n calWidth = window.innerWidth - 175\r\n }\r\n\r\n if (isOpen) {\r\n calWidth = calWidth - 260\r\n }\r\n return (\r\n
\r\n {/* \r\n {required ? label + '*' : label || ''}\r\n */}\r\n {getLabel()}\r\n 1100 ? 'home-editor' : classes.mainEditor}\r\n // editorClassName={'home-editor'}\r\n // placeholder={'แจ้งการพิจารณา'}\r\n //@ts-ignore\r\n handleBeforeInput={handleBeforeInputFunc}\r\n handlePastedText={handlePastedTextFunc}\r\n onEditorStateChange={(val) => {\r\n setEditorState(val)\r\n const content = val.getCurrentContent()\r\n const rawObject = convertToRaw(content)\r\n const htmlTag = draftToHtml(rawObject)\r\n const blocks = rawObject.blocks\r\n const textValue = blocks.map((block) => (!block.text.trim() && '\\n') || block.text).join('\\n')\r\n input.onChange({\r\n contentHtml: htmlTag,\r\n contentText: textValue,\r\n })\r\n textLength.current = textValue.length\r\n }}\r\n toolbarHidden={isHideToolbar}\r\n toolbar={{\r\n options: ['inline', 'fontSize', 'fontFamily', 'textAlign', 'colorPicker', 'list'],\r\n // options: [\r\n // 'inline',\r\n // 'blockType',\r\n // 'fontSize',\r\n // 'fontFamily',\r\n // 'list',\r\n // 'textAlign',\r\n // 'colorPicker',\r\n // 'link',\r\n // 'embedded',\r\n // 'emoji',\r\n // 'image',\r\n // 'remove',\r\n // 'history',\r\n // ],\r\n }}\r\n />\r\n {/* */}\r\n
\r\n )\r\n}\r\n\r\nlet MyRichTextFieldCtrl: React.FC = ({\r\n handleValueChange,\r\n name,\r\n required,\r\n validates,\r\n maxLength,\r\n isDraftNotRequire,\r\n ...others\r\n}) => {\r\n const richTextFieldModel = useRichTextfield({\r\n name,\r\n required,\r\n validates,\r\n isDraftNotRequire,\r\n }) //useTextfield({})\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport default MyRichTextFieldCtrl\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n label: {\r\n // fontWeight: 'bold',\r\n marginBottom: 10,\r\n color: (isError: any) => {\r\n if (isError) {\r\n return '#ff4d4f'\r\n } else {\r\n return ''\r\n }\r\n },\r\n // fontSize: '16px',\r\n },\r\n errorText: {\r\n // fontFamily: 'prompt',\r\n fontSize: '12px',\r\n color: '#ff4d4f',\r\n },\r\n mainEditor: {\r\n border: '1px solid #bdbdbd !important',\r\n padding: '5px !important',\r\n borderRadius: '2px !important',\r\n height: '200px !important',\r\n },\r\n}))\r\n","import React, { Fragment } from 'react'\r\nimport RichTextbox from '../../../../control/richTextEditor/richTextEditor'\r\nimport { Form, Field } from 'react-final-form'\r\nimport MyButton from '../../../../control/button/button'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { Grid } from '@material-ui/core'\r\n\r\nlet MyRichTextFieldView: React.FC = ({ ...other }) => {\r\n return (\r\n
\r\n {}}\r\n initialValues={{\r\n myRichText: [\r\n {\r\n richtextObj: { contentHtml: '', contentText: '' },\r\n },\r\n {\r\n richtextObj: { contentHtml: '', contentText: '' },\r\n },\r\n ],\r\n }}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n >\r\n {({ handleSubmit, form }) => {\r\n return (\r\n <>\r\n {/* */}\r\n\r\n \r\n {({ fields }) =>\r\n fields.map((name, index) => (\r\n \r\n {/* */}\r\n \r\n {/* */}\r\n \r\n ))\r\n }\r\n \r\n\r\n \r\n submit form\r\n \r\n \r\n )\r\n }}\r\n \r\n
\r\n )\r\n}\r\n\r\nlet MyRichTextFieldCtrl: React.FC = ({\r\n handleValueChange,\r\n name,\r\n required,\r\n validates,\r\n maxLength,\r\n isDraftNotRequire,\r\n ...others\r\n}) => {\r\n const richTextFieldModel = {} //useTextfield({})\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport default MyRichTextFieldCtrl\r\n","import { Box, Grid, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport { Height } from '@material-ui/icons'\r\nimport React, { FC } from 'react'\r\n\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\ninterface ItemProps {\r\n title: string\r\n path: string\r\n onClick: (path: string) => void\r\n}\r\nconst Items: FC = ({ title, path, onClick }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n return (\r\n \r\n onClick(path)}\r\n >\r\n {title}\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n boxItem: {\r\n wordBreak: 'break-word',\r\n height: '120px',\r\n cursor: 'pointer',\r\n fontWeight: 'bold',\r\n margin: ' 5px',\r\n border: '1px solid #bdbdbd',\r\n borderRadius: '6px',\r\n textAlign: 'center',\r\n '&:hover': {\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n color: 'white',\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n },\r\n}))\r\n\r\nexport default Items\r\n","import { FC } from 'react'\r\nimport { Grid } from '@material-ui/core'\r\nimport Item from './Items'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nconst Report: FC = ({}) => {\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n let dataList = [\r\n { title: translate.get('UM.REPORT.REVIEWER'), path: '/reviewer/' },\r\n { title: translate.get('UM.REPORT.FIRSTTIME'), path: '/firsttime/' },\r\n { title: translate.get('UM.REPORT.HOLD'), path: '/hold/' },\r\n { title: translate.get('UM.REPORT.EXPIRED'), path: '/expired/' },\r\n { title: translate.get('UM.REPORT.CLOSED'), path: '/closed/' },\r\n ]\r\n const onClick = (path: string) => {\r\n history.push(path)\r\n }\r\n\r\n return (\r\n \r\n {dataList.map((item, index) => {\r\n return (\r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nexport default Report\r\n","import { useField } from 'react-final-form'\r\nimport { composeValidators, selectRequired } from '../../utilities/validate'\r\n// import { useType } from './multiSelectType'\r\n\r\nexport type FieldRequired = boolean | { showAsterisk?: boolean; triggedValidate?: boolean; errorMessage?: string }\r\n\r\nconst useSelect = (props: any) => {\r\n const { name, required, validates = [] } = props\r\n let mergeValidate = validates\r\n if ((typeof required === 'boolean' && required) || (typeof required === 'object' && required.triggedValidate)) {\r\n mergeValidate = [\r\n selectRequired(typeof required === 'object' ? required.errorMessage : undefined),\r\n ...mergeValidate,\r\n ]\r\n }\r\n\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate),\r\n })\r\n\r\n return { field }\r\n}\r\n\r\nexport default useSelect\r\n","import React from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport MenuItem from '@material-ui/core/MenuItem'\r\nimport FormControl from '@material-ui/core/FormControl'\r\nimport ListItemText from '@material-ui/core/ListItemText'\r\nimport Select from '@material-ui/core/Select'\r\nimport { MySelectCtrlType, SelectViewType } from './selectType'\r\nimport useMultiSelect from './useSelect'\r\nimport { FormHelperText, Grid, Typography } from '@material-ui/core'\r\n\r\nconst ITEM_HEIGHT = 48\r\nconst ITEM_PADDING_TOP = 8\r\n\r\nconst MenuProps = {\r\n PaperProps: {\r\n style: {\r\n maxHeight: ITEM_HEIGHT * 6.5 + ITEM_PADDING_TOP,\r\n width: 250,\r\n },\r\n },\r\n getContentAnchorEl: null,\r\n}\r\n\r\nlet SelectView: React.FC = ({\r\n handleValueChange,\r\n onChangeSelect,\r\n field,\r\n required,\r\n maxLength,\r\n materialInputProps = {},\r\n icon,\r\n defaultValue,\r\n resetButtom = false,\r\n label = '',\r\n option,\r\n disabled,\r\n placeholder,\r\n size = 'small',\r\n ...props\r\n}) => {\r\n const { input, meta } = field\r\n\r\n const isError = meta.error && meta.invalid && meta.touched ? true : false\r\n const classes = useStyles(isError)\r\n const [valueList, setValueList] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n if (!input.value) {\r\n setValueList([])\r\n }\r\n }, [input.value])\r\n\r\n React.useEffect(() => {\r\n if (defaultValue) {\r\n setValueList(defaultValue as number[])\r\n }\r\n }, [JSON.stringify(defaultValue)])\r\n\r\n const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {\r\n const value = event.target.value as any\r\n input.onChange(value as any)\r\n setValueList([value] as number[])\r\n if (onChangeSelect) onChangeSelect(value as any)\r\n }\r\n\r\n const getLabel = () => {\r\n const displayIcon = icon && {icon}\r\n const myLabel = required ? (\r\n \r\n \r\n {label || ''}\r\n \r\n \r\n \r\n {label ? `*` : ''}\r\n \r\n \r\n  {displayIcon}\r\n \r\n ) : (\r\n \r\n \r\n {label || ''}\r\n \r\n  {displayIcon}\r\n \r\n )\r\n return (\r\n \r\n {myLabel}\r\n \r\n )\r\n }\r\n return (\r\n
\r\n \r\n {getLabel()}\r\n 0 ? valueList : []}\r\n onChange={handleChange}\r\n displayEmpty={true}\r\n className={disabled ? classes.disable : classes.myStyle}\r\n renderValue={(selected) => {\r\n const selectedItem = selected as any[]\r\n\r\n if (selectedItem && selectedItem.length > 0) {\r\n var filtered = option?.filter(function (e) {\r\n return selectedItem.indexOf(e.value) > -1\r\n })\r\n\r\n let listLabel: any[] = []\r\n if (filtered) {\r\n listLabel = filtered.slice(-1).map((itm: any) => {\r\n return itm.label\r\n })\r\n }\r\n\r\n return listLabel as string[]\r\n } else {\r\n return \r\n }\r\n }}\r\n MenuProps={{\r\n ...MenuProps,\r\n anchorOrigin: {\r\n vertical: 'bottom',\r\n horizontal: 'left',\r\n },\r\n }}\r\n >\r\n {option &&\r\n option.map((optionItm) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n {/* {!materialInputProps?.disabled && meta.error && meta.touched && meta.error} */}\r\n {isError && meta.error}\r\n \r\n
\r\n )\r\n}\r\n\r\nlet MySelectCtrl: React.FC = ({\r\n handleValueChange,\r\n name,\r\n required,\r\n validates,\r\n maxLength,\r\n ...props\r\n}) => {\r\n const mySelect = useMultiSelect({\r\n name,\r\n required,\r\n validates,\r\n })\r\n return \r\n}\r\n\r\nexport default MySelectCtrl\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n formControl: {\r\n margin: theme.spacing(1),\r\n minWidth: 120,\r\n maxWidth: 300,\r\n },\r\n chips: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n chip: {\r\n margin: 2,\r\n },\r\n noLabel: {\r\n marginTop: theme.spacing(3),\r\n },\r\n label: {\r\n marginBottom: 10,\r\n color: (isError: any) => {\r\n if (isError) {\r\n return '#ff4d4f'\r\n } else {\r\n return ''\r\n }\r\n },\r\n },\r\n myStyle: {\r\n borderRadius: '8px ',\r\n },\r\n disable: { backgroundColor: '#F0F0F0C6', borderRadius: '8px ' },\r\n errorText: {\r\n // fontFamily: 'prompt',\r\n fontSize: '12px',\r\n color: '#ff4d4f',\r\n },\r\n}))\r\n","import { useState, useEffect } from 'react'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useLookupService from '../../lookup/useLookupService'\r\n\r\nexport type OptType = {\r\n label: string\r\n value: string\r\n}\r\n\r\nconst useProjectType = () => {\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const [projectT, setProjectT] = useState([])\r\n\r\n const getProjectType = async () => {\r\n const res = await callLookup.callProjectTypeLut()\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n\r\n setProjectT(formatedData)\r\n }\r\n\r\n const initialLoad = () => {\r\n getProjectType()\r\n }\r\n useEffect(() => {\r\n initialLoad()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n return { projectT }\r\n}\r\n\r\nexport default useProjectType\r\n","import { Button, Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { FC, useState } from 'react'\r\nimport { Form } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport MyDatePicker from '../../../control/datepicker/datepicker'\r\nimport { ReviewerSearchForm } from '../../../services/um/useSearchReviewer'\r\nimport Select from '../../../control/select/select'\r\nimport { FormApi } from 'final-form'\r\nimport CalendarTodayIcon from '@material-ui/icons/CalendarToday'\r\nimport moment from 'moment'\r\nimport useProjectType from '../../../services/um/lookups/useProjectType'\r\ninterface PanelProps {\r\n onSubmit: (values: ReviewerSearchForm) => void\r\n initialSearch: ReviewerSearchForm\r\n onReset: (form: any) => void\r\n}\r\nconst Panel: FC = ({ onSubmit, initialSearch, onReset }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const { projectT } = useProjectType()\r\n const [endDate, setEndDate] = useState(moment(new Date()).format('YYYY-MM-DD'))\r\n let defaultProjectType = initialSearch.projectType ? [initialSearch.projectType] : undefined\r\n\r\n const handleStartDateChange = (form: FormApi, value: string | null) => {\r\n if (value && endDate) {\r\n let isStartAfter = moment(value).isAfter(endDate)\r\n if (isStartAfter) {\r\n form.change('endDate', new Date(value))\r\n }\r\n }\r\n }\r\n\r\n const handleEndDateChange = (value: string | null) => {\r\n setEndDate(value)\r\n }\r\n\r\n return (\r\n \r\n
\r\n {({ handleSubmit, form, values }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n handleStartDateChange(form, val)}\r\n icon={}\r\n required\r\n />\r\n \r\n \r\n handleEndDateChange(val)}\r\n icon={}\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n {\r\n form.reset()\r\n onReset(form)\r\n }}\r\n >\r\n {translate.get('BUTTON.RESET')}\r\n \r\n \r\n\r\n \r\n \r\n {translate.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default Panel\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n },\r\n container: {\r\n padding: '1.7rem',\r\n },\r\n reset: {\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n padding: '0px 1.5rem',\r\n alignSelf: 'center',\r\n },\r\n}))\r\n","type prefix = {\r\n name?: {\r\n th?: string\r\n en?: string\r\n }\r\n academicPosition?: {\r\n th?: string\r\n en?: string\r\n }\r\n titleID?: number | null\r\n title?: {\r\n th?: string\r\n en?: string\r\n }\r\n isPhD?: boolean\r\n}\r\n\r\nexport const setPrefixName = ({ name, academicPosition, titleID, title, isPhD }: prefix) => {\r\n const drTH = 'ดร.'\r\n const drEN = 'Dr.'\r\n\r\n let result = {\r\n th: '',\r\n en: '',\r\n }\r\n\r\n //th\r\n if (academicPosition?.th && isPhD) {\r\n result.th = `${academicPosition?.th} ${drTH}${name?.th}`\r\n }\r\n\r\n if (academicPosition?.th && !isPhD) {\r\n result.th = `${academicPosition?.th} ${name?.th}`\r\n }\r\n\r\n if (academicPosition?.th === null && isPhD) {\r\n result.th = `${drTH}${name?.th}`\r\n }\r\n\r\n if (academicPosition?.th === null && !isPhD && titleID) {\r\n result.th = `${title?.th}${name?.th}`\r\n }\r\n\r\n if (academicPosition?.th === null && !isPhD && titleID === null && title?.th) {\r\n result.th = `${title?.th}${name?.th}`\r\n }\r\n\r\n if (academicPosition?.th === null && !isPhD && titleID === null && title?.th === null) {\r\n result.th = `${name?.th}`\r\n }\r\n\r\n //en\r\n if (academicPosition?.en && isPhD) {\r\n result.en = `${academicPosition?.en} ${drEN}${name?.en}`\r\n }\r\n\r\n if (academicPosition?.en && !isPhD) {\r\n result.en = `${academicPosition?.en} ${name?.en}`\r\n }\r\n\r\n if (academicPosition?.en === null && isPhD) {\r\n result.en = `${drEN}${name?.en}`\r\n }\r\n\r\n if (academicPosition?.en === null && !isPhD && titleID) {\r\n result.en = `${title?.en}${name?.en}`\r\n }\r\n\r\n if (academicPosition?.en === null && !isPhD && titleID === null && title?.en) {\r\n result.en = `${title?.en}${name?.en}`\r\n }\r\n\r\n if (academicPosition?.en === null && !isPhD && titleID === null && title?.en === null) {\r\n result.en = `${name?.en}`\r\n }\r\n\r\n return result\r\n}\r\n","import Pagination from '@material-ui/lab/Pagination'\r\nimport { useGridSlotComponentProps } from '@mui/x-data-grid'\r\nimport { makeStyles, IconButton } from '@material-ui/core'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nconst CustomPagination = () => {\r\n const { state, apiRef } = useGridSlotComponentProps()\r\n const classes = useStyles()\r\n\r\n return (\r\n apiRef.current.setPage(value - 1)}\r\n />\r\n )\r\n}\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n '& .header-table': {\r\n backgroundColor: '#DB5F8E',\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiDataGrid-iconSeparator': {\r\n display: 'none',\r\n },\r\n\r\n '& .MuiDataGrid-sortIcon': {\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiBadge-anchorOriginTopRightRectangle': {\r\n display: 'none',\r\n },\r\n '& .MuiDataGrid-cell:focus-within': {\r\n outline: 'none',\r\n },\r\n },\r\n}))\r\n\r\nexport default CustomPagination\r\n","import { GridOverlay } from '@mui/x-data-grid'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nconst CustomNoRowsOverlay = () => {\r\n const translate = useTranslate()\r\n\r\n return (\r\n \r\n
{`${translate.get('UM.CLOSED.DATA_TABLE.NO_ROWS')}`}
\r\n
\r\n )\r\n}\r\n\r\nexport default CustomNoRowsOverlay\r\n","import { FC, useEffect, useState } from 'react'\r\nimport { DataGrid, GridColDef } from '@mui/x-data-grid'\r\nimport { makeStyles } from '@material-ui/core'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport _ from 'lodash'\r\nimport { CommitteesType, ReviewerResponseType } from '../../../services/um/useSearchReviewer'\r\nimport { setPrefixName } from '../../../utilities/prefixName'\r\nimport CustomPagination from '../../report/closed/CustomPagination'\r\nimport CustomNoRowsOverlay from '../../report/closed/CustomNoRowsOverlay'\r\nimport { CustomSortingASCcending, CustomSortingDescending } from '../../report/closed/CusromSorting'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../utilities/date'\r\ninterface DataTableProps {\r\n data: ReviewerResponseType[]\r\n}\r\n\r\ntype ReviewerDataRowsType = {\r\n id: number\r\n name: string\r\n projectNumber: string\r\n projectType: string\r\n projectNameTH: string\r\n projectNameEN: string\r\n committee: string\r\n receiveDate: string\r\n}\r\n\r\nconst DataTable: FC = ({ data }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const [dataList, setDataList] = useState([])\r\n\r\n useEffect(() => {\r\n setDataFormat()\r\n }, [data, lang])\r\n\r\n const getCommitte = (data: CommitteesType[]) => {\r\n let result = data.map((item, index) => {\r\n return setPrefixName(item)[lang]\r\n })\r\n return result.join(', ')\r\n }\r\n\r\n const setDataFormat = () => {\r\n let convertData: ReviewerDataRowsType[] = data.map((itm) => {\r\n getCommitte(itm.committees)\r\n return {\r\n id: itm.projectID,\r\n name: setPrefixName(itm)[lang],\r\n projectNumber: itm.projectNumber,\r\n projectNameTH: itm.projectName.th,\r\n projectNameEN: itm.projectName.en,\r\n projectType: itm.projectType.name[lang],\r\n committee: getCommitte(itm.committees),\r\n receiveDate:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? convertDateToFormatTH(itm.receiveDate)\r\n : convertDateToFormatEN(itm.receiveDate),\r\n }\r\n })\r\n\r\n setDataList(convertData)\r\n }\r\n\r\n const column: GridColDef[] = [\r\n {\r\n field: 'projectNumber',\r\n headerName: translate.get('UM.REVIEWER.DATA_TABLE.COLUMN1'),\r\n width: 200,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'name',\r\n headerName: translate.get('UM.REVIEWER.DATA_TABLE.COLUMN2'),\r\n width: 330,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'projectType',\r\n headerName: translate.get('UM.REVIEWER.DATA_TABLE.COLUMN3'),\r\n type: 'string',\r\n width: 200,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'projectNameTH',\r\n headerName: translate.get('UM.REVIEWER.DATA_TABLE.COLUMN4'),\r\n type: 'string',\r\n width: 300,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'projectNameEN',\r\n headerName: translate.get('UM.REVIEWER.DATA_TABLE.COLUMN5'),\r\n type: 'string',\r\n width: 300,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'committee',\r\n headerName: translate.get('UM.REVIEWER.DATA_TABLE.COLUMN6'),\r\n type: 'string',\r\n width: 370,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'receiveDate',\r\n headerName: translate.get('UM.REVIEWER.DATA_TABLE.COLUMN7'),\r\n type: 'string',\r\n width: 200,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n ]\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n '& .super-app-theme--fffff': {\r\n backgroundColor: '#DB5F8E',\r\n '&:hover': {\r\n backgroundColor: '#DB5F8E',\r\n },\r\n },\r\n '& .super-app-theme--header': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n '& .MuiDataGrid-columnSeparator': {\r\n visibility: 'hidden',\r\n },\r\n '& .MuiDataGrid-row': {\r\n lineHeigh: '70px',\r\n },\r\n\r\n '& .header-table': {\r\n backgroundColor: '#DB5F8E',\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiDataGrid-iconSeparator': {\r\n display: 'none',\r\n },\r\n '& .MuiDataGrid-sortIcon': {\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiBadge-anchorOriginTopRightRectangle': {\r\n display: 'none',\r\n },\r\n '& .MuiDataGrid-cell:focus-within': {\r\n outline: 'none',\r\n },\r\n '& .MuiDataGrid-row, .MuiDataGrid-root .MuiDataGrid-cell, .rendering-zone': { 'max-height': 'none !important' },\r\n '.MuiDataGrid-root .MuiDataGrid-window': { position: 'relative !important' },\r\n '.MuiDataGrid-root .MuiDataGrid-viewport': { 'max-height': 'none !important' },\r\n '.MuiDataGrid-root': { height: 'auto !important' },\r\n width: '100%',\r\n marginTop: 16,\r\n overflowX: 'hidden',\r\n },\r\n}))\r\n\r\nexport default DataTable\r\n","import * as Excel from 'exceljs'\r\nimport moment from 'moment'\r\n\r\ntype ContentT = {\r\n projectID: string\r\n researcherName: string\r\n considerType: string\r\n projectNameTH: string\r\n projectNameEN: string\r\n committee: string[]\r\n receiveDate: string\r\n [key: string]: any\r\n}\r\ntype ExportProps = {\r\n header: {\r\n projectType: string\r\n startDate: string\r\n endDate: string\r\n keyword: string\r\n }\r\n content: ContentT[]\r\n committeeLength: number\r\n translate: (value: string) => string //ไม่สามารถเรียกในหน้านี้ได้ ผิด react rule\r\n}\r\nconst viewerExport = ({ header, content, committeeLength, translate }: ExportProps) => {\r\n let startRowHeader = 9\r\n const workbook = new Excel.Workbook()\r\n const worksheet = workbook.addWorksheet('sheet', {\r\n pageSetup: {\r\n paperSize: 9, //follow documentation the 9 value is A4\r\n orientation: 'portrait',\r\n },\r\n })\r\n workbook.creator = 'CU_IRB-WEB'\r\n workbook.lastModifiedBy = 'CU_IRB-WEB'\r\n\r\n const createTopic = () => {\r\n const endCell = 'I'\r\n worksheet.mergeCells(`A1:${endCell}1`)\r\n worksheet.getCell('A1').value = translate('EXPORT.EXCEL.VIEWER-REPORT-NAME')\r\n worksheet.getCell('A1').alignment = { horizontal: 'center' }\r\n worksheet.getCell('A1').font = { bold: true }\r\n worksheet.getCell('A1').fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00F1BBCF',\r\n },\r\n }\r\n\r\n worksheet.mergeCells(`A3:B3`)\r\n worksheet.getCell('A3').value = `${translate('EXPORT.EXCEL.PROJECT-TYPE')} ${header.projectType}`\r\n worksheet.getCell('A3').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A4:B4`)\r\n worksheet.getCell('A4').value = `${translate('EXPORT.EXCEL.START-DATE')} ${header.startDate}`\r\n worksheet.getCell('A4').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A5:B5`)\r\n worksheet.getCell('A5').value = `${translate('EXPORT.EXCEL.END-DATE')} ${header.endDate}`\r\n worksheet.getCell('A5').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A6:B6`)\r\n worksheet.getCell('A6').value = `${translate('EXPORT.EXCEL.KEYWORD')} ${header.keyword}`\r\n worksheet.getCell('A6').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n }\r\n\r\n const setCellBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n top: { style: 'thin' },\r\n left: { style: 'thin' },\r\n bottom: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const createHeader = () => {\r\n const startCode = 70\r\n\r\n let arrName: { name: string; key: string; width: number }[] = []\r\n for (let i = 1; i <= committeeLength; i++) {\r\n arrName.push({\r\n name: `${translate('EXPORT.EXCEL.COMMITTEE')} ${i}`,\r\n key: `committee${i}`,\r\n width: 50,\r\n })\r\n }\r\n\r\n let arrHeader = [\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-ID'),\r\n key: 'projectID',\r\n width: 10,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.RESEARCHER-NAME'),\r\n key: 'researcherName',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.CONSIDER-TYPE'),\r\n key: 'considerType',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-NAME-TH'),\r\n key: 'projectNameTH',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-NAME-EN'),\r\n key: 'projectNameEN',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.DATE_OF_RECEIPT'),\r\n key: 'receiveDate',\r\n width: 30,\r\n },\r\n ...arrName,\r\n ]\r\n\r\n worksheet.columns = arrHeader.map((itm) => ({ key: itm.key, width: itm.width }))\r\n worksheet.getRow(startRowHeader).values = arrHeader.map((itm) => itm.name)\r\n\r\n let arr: string[] = []\r\n for (let i = startCode; startCode + committeeLength > 90 ? i <= 90 : i <= startCode + committeeLength; i++) {\r\n arr.push(`${String.fromCharCode(i)}${startRowHeader}`)\r\n }\r\n\r\n ;[\r\n `A${startRowHeader}`,\r\n `B${startRowHeader}`,\r\n `C${startRowHeader}`,\r\n `D${startRowHeader}`,\r\n `E${startRowHeader}`,\r\n `F${startRowHeader}`,\r\n ...arr,\r\n ].forEach((colKey, index) => {\r\n if (index < 11) {\r\n setCellBorder(colKey)\r\n worksheet.getCell(colKey).alignment = { vertical: 'middle', horizontal: 'center', wrapText: true }\r\n worksheet.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00DB5F8E',\r\n },\r\n }\r\n }\r\n })\r\n }\r\n\r\n const setCellRight = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'right' }\r\n }\r\n\r\n const setCellCenter = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'center' }\r\n }\r\n const setContentBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n left: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const setLastContentBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n left: { style: 'thin' },\r\n bottom: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const setContentColor = (colKey: string) => {\r\n worksheet.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00F1BBCF',\r\n },\r\n }\r\n }\r\n\r\n const makeRowITM = (rowNumber: number, rowITM: ContentT & { isOddRow: boolean; lastRow: boolean }) => {\r\n worksheet.addRow(rowITM)\r\n\r\n const startCode = 70\r\n\r\n let arr: string[] = []\r\n for (let i = startCode; startCode + committeeLength > 90 ? i <= 90 : i <= startCode + committeeLength; i++) {\r\n arr.push(`${String.fromCharCode(i)}${rowNumber}`)\r\n }\r\n\r\n const arrColKey = [`A${rowNumber}`, `B${rowNumber}`, `C${rowNumber}`, `D${rowNumber}`, `E${rowNumber}`, ...arr]\r\n\r\n arrColKey.forEach((colKey, index) => {\r\n if (index < 10) {\r\n if (index === 0) {\r\n setCellRight(colKey) //number format\r\n }\r\n if (index === 2) {\r\n setCellCenter(colKey) //consider type มีแค่สามอย่าง ขนาดพอๆกันเลยอยู่ตรงกลางได้\r\n }\r\n\r\n setContentBorder(colKey)\r\n if (rowITM.isOddRow) {\r\n setContentColor(colKey)\r\n }\r\n if (rowITM.lastRow) {\r\n setLastContentBorder(colKey)\r\n }\r\n }\r\n })\r\n }\r\n\r\n const createBody = () => {\r\n try {\r\n content.forEach((rowGroupITM, index) => {\r\n makeRowITM(index + (startRowHeader + 1), {\r\n lastRow: content.length === index + 1 ? true : false,\r\n isOddRow: (index + 1) % 2 === 0 ? false : true,\r\n ...rowGroupITM,\r\n })\r\n })\r\n } catch (err) {\r\n console.log('Error Generate Row Excel file export: ', err)\r\n }\r\n }\r\n\r\n const createTable = () => {\r\n createHeader()\r\n createBody()\r\n }\r\n\r\n const processColumns = () => {\r\n createTopic()\r\n createTable()\r\n }\r\n\r\n processColumns()\r\n workbook.xlsx.writeBuffer().then(function (xls64data) {\r\n const blob = new Blob([xls64data], {\r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n })\r\n const url = window.URL.createObjectURL(blob)\r\n const anchor = document.createElement('a')\r\n\r\n const reportDate = moment(new Date()).format('yyyyMMDD')\r\n\r\n anchor.href = url\r\n anchor.download = `${translate('EXPORT.EXCEL.VIEWER-REPORT-NAME')}_${reportDate}.xlsx`\r\n //@ts-ignore\r\n var isIE = /*@cc_on!@*/ false || !!document.documentMode\r\n //@ts-ignore\r\n var isEdge = !isIE && !!window.StyleMedia\r\n if (isEdge) {\r\n anchor.click()\r\n } else {\r\n anchor.click()\r\n }\r\n window.URL.revokeObjectURL(url)\r\n })\r\n}\r\n\r\nexport default viewerExport\r\n","import * as umServinceURL from './umServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nexport type TransT = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport type OptType = {\r\n label: string\r\n value: string\r\n}\r\n\r\nexport type CommitteesType = {\r\n id: number\r\n academicPosition: TransT\r\n title: TransT\r\n isPhD: boolean\r\n name: TransT\r\n titleID: number | null\r\n}\r\n\r\nexport type ReviewerResponseType = {\r\n projectID: number\r\n projectNumber: string\r\n projectName: TransT\r\n projectType: {\r\n id: string\r\n name: TransT\r\n }\r\n name: TransT\r\n title: TransT\r\n academicPosition: TransT\r\n isPhD: boolean\r\n committees: CommitteesType[]\r\n titleID: number\r\n receiveDate: string\r\n}\r\n\r\nexport type ReviewerSearchProps = {\r\n userID?: number\r\n keyword?: string\r\n projectType?: number\r\n startDate: string\r\n endDate: string\r\n}\r\n\r\nexport type ReviewerSearchForm = {\r\n keyword?: string\r\n projectType?: number\r\n startDate: Date | string\r\n endDate: Date | string\r\n}\r\n\r\nconst useSearchReviewer = () => {\r\n const callApi = useCallApi()\r\n\r\n const getReviewerData = async (values: ReviewerSearchProps) => {\r\n const { data } = await callApi.axiosPost({\r\n url: umServinceURL.getResultReviewer,\r\n params: values,\r\n })\r\n return data\r\n }\r\n\r\n return { getReviewerData }\r\n}\r\n\r\nexport default useSearchReviewer\r\n","import { Button, Container, Grid, IconButton, makeStyles, Typography } from '@material-ui/core'\r\nimport { FC, useEffect, useState } from 'react'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport Panel from '../component/report/reviewer/Panel'\r\nimport DataTable from '../component/report/reviewer/DataTable'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport moment from 'moment'\r\nimport GetAppRoundedIcon from '@material-ui/icons/GetAppRounded'\r\nimport viewerExport from '../component/report/reviewer/report'\r\nimport useSearchReviewer, {\r\n ReviewerSearchProps,\r\n ReviewerSearchForm,\r\n ReviewerResponseType,\r\n CommitteesType,\r\n} from '../services/um/useSearchReviewer'\r\nimport useProjectType from '../services/um/lookups/useProjectType'\r\nimport { maxBy, zipObject } from 'lodash'\r\nimport { useHistory } from 'react-router'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../utilities/date'\r\nimport { useQueryParam } from 'use-query-params'\r\nimport { FormApi } from 'final-form'\r\n\r\ninterface ReviewerProps {}\r\nconst Reviewer: FC = ({}) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const { getReviewerData } = useSearchReviewer()\r\n const authenStore = useAuthenStore()\r\n const [dataList, setDataList] = useState([])\r\n const [records, setRecords] = useState(0)\r\n const { projectT } = useProjectType()\r\n const [keyword, setKeyword] = useQueryParam('keyword')\r\n const [projectType, setProjectType] = useQueryParam('projectType')\r\n const [startDate, setStartDate] = useQueryParam('startDate')\r\n const [endDate, setEndDate] = useQueryParam('endDate')\r\n const initialSearch: ReviewerSearchForm = {\r\n keyword: keyword,\r\n projectType: projectType,\r\n startDate: startDate\r\n ? moment(startDate).format('YYYY-MM-DD')\r\n : moment().subtract(1, 'year').format('YYYY-MM-DD'),\r\n endDate: endDate ? moment(endDate).format('YYYY-MM-DD') : moment().format('YYYY-MM-DD'),\r\n }\r\n\r\n const onSubmit = async (value: ReviewerSearchForm) => {\r\n const param: ReviewerSearchProps = {\r\n userID: authenStore.profile.userId ?? 0,\r\n keyword: value.keyword,\r\n projectType: value.projectType,\r\n startDate: moment(value.startDate).format('YYYY-MM-DD'), //'2021-08-01',\r\n endDate: moment(value.endDate).format('YYYY-MM-DD'), //'2021-09-10',\r\n }\r\n setSearchParam(value)\r\n loadData(param)\r\n }\r\n\r\n const setSearchParam = (value: ReviewerSearchForm) => {\r\n setKeyword(value.keyword)\r\n setProjectType(value.projectType)\r\n setStartDate(moment(value.startDate).format('YYYY-MM-DD') ?? '')\r\n setEndDate(moment(value.endDate).format('YYYY-MM-DD') ?? '')\r\n }\r\n\r\n const loadData = async (param: ReviewerSearchProps) => {\r\n const data = await getReviewerData(param)\r\n setRecords(data.length)\r\n setDataList(data)\r\n }\r\n\r\n const initialLoad = () => {\r\n const param: ReviewerSearchProps = {\r\n userID: authenStore.profile.userId ?? 0,\r\n keyword: initialSearch.keyword,\r\n projectType: initialSearch.projectType,\r\n startDate: moment(initialSearch.startDate).format('YYYY-MM-DD'), //'2021-08-01',\r\n endDate: moment(initialSearch.endDate).format('YYYY-MM-DD'), //'2021-09-10',\r\n }\r\n setSearchParam(initialSearch)\r\n loadData(param)\r\n }\r\n\r\n const onReset = (form: FormApi>) => {\r\n let param = {\r\n startDate: moment().subtract(1, 'year').format('YYYY-MM-DD'),\r\n endDate: moment().format('YYYY-MM-DD'),\r\n }\r\n form.initialize(param)\r\n setSearchParam(param)\r\n }\r\n\r\n const getProjectTypeName = (value?: number) => {\r\n let result = null\r\n if (value) {\r\n result = projectT.find((item) => item.value === projectType?.toString())?.label\r\n }\r\n return result ?? '-'\r\n }\r\n\r\n const commiteesExtract = (values: CommitteesType[]) => {\r\n let keyArr: string[] = []\r\n const nameArr = values.map((item, i) => {\r\n keyArr.push(`committee${i + 1}`)\r\n return item.name[lang]\r\n })\r\n const zip = zipObject(keyArr, nameArr)\r\n return zip\r\n }\r\n\r\n const handleExportExcel = () => {\r\n let convertExportData = dataList.map((itm) => {\r\n const zip = commiteesExtract(itm.committees)\r\n\r\n return {\r\n projectID: itm.projectNumber,\r\n researcherName: itm.name[lang],\r\n considerType: itm.projectType.name[lang],\r\n projectNameTH: itm.projectName['th'],\r\n projectNameEN: itm.projectName['en'],\r\n committee: itm.committees.map((item) => item.name[lang]),\r\n receiveDate:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? convertDateToFormatTH(itm.receiveDate)\r\n : convertDateToFormatEN(itm.receiveDate),\r\n ...zip,\r\n }\r\n })\r\n\r\n const committeeLength = maxBy(convertExportData, (i) => i.committee.length)?.committee.length || 1\r\n\r\n viewerExport({\r\n header: {\r\n projectType: getProjectTypeName(projectType),\r\n startDate: convertDate(moment(startDate).format('YYYY-MM-DD')),\r\n endDate: convertDate(moment(endDate).format('YYYY-MM-DD')),\r\n keyword: keyword ?? '-',\r\n },\r\n content: convertExportData,\r\n committeeLength: committeeLength,\r\n translate: (value: string) => translate.get(value),\r\n })\r\n }\r\n\r\n const convertDate = (date: string | null) => {\r\n if (lang === 'th' && date) {\r\n return convertDateToFormatTH(date)\r\n } else if (lang === 'en' && date) {\r\n return convertDateToFormatEN(date)\r\n } else {\r\n return '-'\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (authenStore.profile.userId) {\r\n initialLoad()\r\n }\r\n }, [authenStore.profile.userId])\r\n\r\n const onBack = () => {\r\n history.push('/dashboard')\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${dataList.length}`])}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n onClick={handleExportExcel}\r\n >\r\n {translate.get('BUTTON.EXPORT')}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\nexport default Reviewer\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n container: {\r\n marginTop: '20px',\r\n width: '100%',\r\n },\r\n}))\r\n","import { FC, useEffect, useState } from 'react'\r\nimport { makeStyles } from '@material-ui/core'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport _ from 'lodash'\r\nimport { ExpiredResponseType } from '../../../services/um/useSearchExpired'\r\nimport { setPrefixName } from '../../../utilities/prefixName'\r\nimport { convertDateToFormatTH, convertDateToFormatEN } from '../../../utilities/date'\r\nimport { DataGrid, GridColDef } from '@mui/x-data-grid'\r\nimport CustomPagination from '../../report/closed/CustomPagination'\r\nimport CustomNoRowsOverlay from '../../report/closed/CustomNoRowsOverlay'\r\nimport { CustomSortingASCcending, CustomSortingDescending } from '../../report/closed/CusromSorting'\r\ninterface DataTableProps {\r\n data: ExpiredResponseType[]\r\n}\r\n\r\ntype ExpiredDataRowType = {\r\n id: number\r\n projectNumber: string\r\n expiredDate: string\r\n name: string\r\n researcherName: string\r\n projectType: string\r\n projectName_TH: string\r\n projectName_EN: string\r\n}\r\n\r\nconst DataTable: FC = ({ data }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const [dataList, setDataList] = useState([])\r\n\r\n useEffect(() => {\r\n setDataFormat()\r\n }, [data, lang])\r\n\r\n const convertDate = (date: string | null) => {\r\n if (lang === 'th' && date) {\r\n return convertDateToFormatTH(date)\r\n } else if (lang === 'en' && date) {\r\n return convertDateToFormatEN(date)\r\n } else {\r\n return '-'\r\n }\r\n }\r\n\r\n const setDataFormat = () => {\r\n let convertData: ExpiredDataRowType[] = data.map((itm) => {\r\n return {\r\n id: itm.projectID,\r\n projectNumber: itm.projectNumber ?? '-',\r\n expiredDate: convertDate(itm.expiredDate) ?? '-',\r\n name: setPrefixName(itm)[lang] ?? '-',\r\n researcherName: itm.researcherTypeName[lang] ?? '-',\r\n projectType: itm.projectType.name[lang] ?? '-',\r\n projectName_TH: itm.projectName.th ?? '-',\r\n projectName_EN: itm.projectName.en ?? '-',\r\n }\r\n })\r\n\r\n setDataList(convertData)\r\n }\r\n\r\n const column: GridColDef[] = [\r\n {\r\n field: 'projectNumber',\r\n headerName: translate.get('UM.EXPIRED.DATA_TABLE.COLUMN1'),\r\n width: 200,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'expiredDate',\r\n headerName: translate.get('UM.EXPIRED.DATA_TABLE.COLUMN2'),\r\n width: 180,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'name',\r\n headerName: translate.get('UM.EXPIRED.DATA_TABLE.COLUMN3'),\r\n width: 300,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'researcherName',\r\n headerName: translate.get('UM.EXPIRED.DATA_TABLE.COLUMN4'),\r\n type: 'string',\r\n width: 200,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'projectType',\r\n headerName: translate.get('UM.EXPIRED.DATA_TABLE.COLUMN5'),\r\n type: 'string',\r\n width: 200,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'projectName_TH',\r\n headerName: translate.get('UM.EXPIRED.DATA_TABLE.COLUMN6'),\r\n type: 'string',\r\n width: 300,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n {\r\n field: 'projectName_EN',\r\n headerName: translate.get('UM.EXPIRED.DATA_TABLE.COLUMN7'),\r\n type: 'string',\r\n width: 400,\r\n headerClassName: 'super-app-theme--header',\r\n },\r\n ]\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n '& .super-app-theme--header': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n '& .MuiDataGrid-columnSeparator': {\r\n visibility: 'hidden',\r\n },\r\n\r\n '& .header-table': {\r\n backgroundColor: '#DB5F8E',\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiDataGrid-iconSeparator': {\r\n display: 'none',\r\n },\r\n '& .MuiDataGrid-sortIcon': {\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiBadge-anchorOriginTopRightRectangle': {\r\n display: 'none',\r\n },\r\n '& .MuiDataGrid-cell:focus-within': {\r\n outline: 'none',\r\n },\r\n width: '100%',\r\n marginTop: 16,\r\n },\r\n}))\r\n\r\nexport default DataTable\r\n","import { Button, Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { FC, useState } from 'react'\r\nimport { Form } from 'react-final-form'\r\nimport MyDatePicker from '../../../control/datepicker/datepicker'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport Select from '../../../control/select/select'\r\nimport { FormApi } from 'final-form'\r\nimport { ExpiredSearchForm } from '../../../services/um/useSearchExpired'\r\nimport CalendarTodayIcon from '@material-ui/icons/CalendarToday'\r\nimport moment from 'moment'\r\nimport useProjectType from '../../../services/um/lookups/useProjectType'\r\ninterface PanelProps {\r\n onSubmit: (values: ExpiredSearchForm) => void\r\n initialSearch: ExpiredSearchForm\r\n onReset: (form: any) => void\r\n}\r\nconst Panel: FC = (props) => {\r\n const { onSubmit, initialSearch, onReset } = props\r\n const translate = useTranslate()\r\n const { projectT } = useProjectType()\r\n const classes = useStyles()\r\n const [endDate, setEndDate] = useState(moment(new Date()).format('YYYY-MM-DD'))\r\n let defaultProjectType = initialSearch.projectType ? [initialSearch.projectType] : undefined\r\n\r\n const handleStartDateChange = (form: FormApi, value: string | null) => {\r\n if (value && endDate) {\r\n let isStartAfter = moment(value).isAfter(endDate)\r\n if (isStartAfter) {\r\n form.change('endDate', new Date(value))\r\n }\r\n }\r\n }\r\n\r\n const handleEndDateChange = (value: string | null) => {\r\n setEndDate(value)\r\n }\r\n\r\n return (\r\n \r\n
\r\n {({ handleSubmit, form, values }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n handleStartDateChange(form, val)}\r\n icon={}\r\n required\r\n />\r\n \r\n \r\n handleEndDateChange(val)}\r\n icon={}\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n {\r\n form.reset()\r\n onReset(form)\r\n }}\r\n >\r\n {translate.get('BUTTON.RESET')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default Panel\r\nconst useStyles = makeStyles(() => ({\r\n root: { width: '100%' },\r\n container: {\r\n padding: '1.7rem',\r\n },\r\n reset: {\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n padding: '0px 1.5rem',\r\n alignSelf: 'center',\r\n },\r\n}))\r\n","import { useEffect, useState } from 'react'\r\nimport * as umServinceURL from './umServiceURL'\r\nimport useTranslate from '../../i18n/useTranslate'\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nexport type TransT = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport type OptType = {\r\n label: string\r\n value: string\r\n}\r\n\r\nexport type ExpiredResponseType = {\r\n projectID: number\r\n projectNumber: string\r\n expiredDate: string\r\n projectName: TransT\r\n projectType: {\r\n id: number\r\n name: TransT\r\n }\r\n name: TransT\r\n title: TransT\r\n academicPosition: TransT\r\n isPhD: boolean\r\n researcherTypeName: TransT\r\n titleID: number\r\n}\r\n\r\nexport type ExpiredSearchForm = {\r\n keyword?: string\r\n projectType?: number\r\n startDate: Date | string\r\n endDate: Date | string\r\n}\r\n\r\nexport type ExpiredSearchProps = {\r\n userID?: number\r\n keyword?: string\r\n projectType?: number\r\n startDate: string\r\n endDate: string\r\n}\r\n\r\nconst useSearchExpired = () => {\r\n const callApi = useCallApi()\r\n\r\n const getExpiredData = async (values: ExpiredSearchProps) => {\r\n const { data } = await callApi.axiosPost({\r\n url: umServinceURL.getResultExpired,\r\n params: values,\r\n })\r\n\r\n return data\r\n }\r\n\r\n return { getExpiredData }\r\n}\r\n\r\nexport default useSearchExpired\r\n","import * as Excel from 'exceljs'\r\nimport moment from 'moment'\r\n\r\ntype ContentT = {\r\n projectID: string\r\n endDate: string\r\n projectType: string\r\n researcherName: string\r\n position: string\r\n projectNameTH: string\r\n projectNameEN: string\r\n}\r\ntype ExportProps = {\r\n header: {\r\n projectType: string\r\n startDate: string\r\n endDate: string\r\n keyword: string\r\n }\r\n content: ContentT[]\r\n translate: (value: string) => string //ไม่สามารถเรียกในหน้านี้ได้ ผิด react rule\r\n}\r\nconst expiredExport = ({ header, content, translate }: ExportProps) => {\r\n let startRowHeader = 8\r\n const workbook = new Excel.Workbook()\r\n const worksheet = workbook.addWorksheet('sheet', {\r\n pageSetup: {\r\n paperSize: 9, //follow documentation the 9 value is A4\r\n orientation: 'portrait',\r\n },\r\n })\r\n workbook.creator = 'CU_IRB-WEB'\r\n workbook.lastModifiedBy = 'CU_IRB-WEB'\r\n\r\n const createTopic = () => {\r\n const endCell = 'G'\r\n worksheet.mergeCells(`A1:${endCell}1`)\r\n worksheet.getCell('A1').value = translate('EXPORT.EXCEL.EXPIRED-REPORT-NAME')\r\n worksheet.getCell('A1').alignment = { horizontal: 'center' }\r\n worksheet.getCell('A1').font = { bold: true }\r\n worksheet.getCell('A1').fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00F1BBCF',\r\n },\r\n }\r\n\r\n worksheet.mergeCells(`A3:B3`)\r\n worksheet.getCell('A3').value = `${translate('EXPORT.EXCEL.PROJECT-TYPE')} ${header.projectType}`\r\n worksheet.getCell('A3').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A4:B4`)\r\n worksheet.getCell('A4').value = `${translate('EXPORT.EXCEL.START-DATE')} ${header.startDate}`\r\n worksheet.getCell('A4').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A5:B5`)\r\n worksheet.getCell('A5').value = `${translate('EXPORT.EXCEL.END-DATE')} ${header.endDate}`\r\n worksheet.getCell('A5').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A6:B6`)\r\n worksheet.getCell('A6').value = `${translate('EXPORT.EXCEL.KEYWORD')} ${header.keyword}`\r\n worksheet.getCell('A6').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n }\r\n\r\n const setCellBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n top: { style: 'thin' },\r\n left: { style: 'thin' },\r\n bottom: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const createHeader = () => {\r\n let arrHeader = [\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-ID'),\r\n key: 'projectID',\r\n width: 10,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.EXPIRED-DATE'),\r\n key: 'endDate',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.RESEARCHER-NAME'),\r\n key: 'researcherName',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.POSITION'),\r\n key: 'position',\r\n width: 30,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-TYPE'),\r\n key: 'projectType',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-NAME-TH'),\r\n key: 'projectNameTH',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-NAME-EN'),\r\n key: 'projectNameEN',\r\n width: 50,\r\n },\r\n ]\r\n\r\n worksheet.columns = arrHeader.map((itm) => ({ key: itm.key, width: itm.width }))\r\n worksheet.getRow(startRowHeader).values = arrHeader.map((itm) => itm.name)\r\n ;[\r\n `A${startRowHeader}`,\r\n `B${startRowHeader}`,\r\n `C${startRowHeader}`,\r\n `D${startRowHeader}`,\r\n `E${startRowHeader}`,\r\n `F${startRowHeader}`,\r\n `G${startRowHeader}`,\r\n ].forEach((colKey, index) => {\r\n if (index < 8) {\r\n setCellBorder(colKey)\r\n worksheet.getCell(colKey).alignment = { vertical: 'middle', horizontal: 'center', wrapText: true }\r\n worksheet.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00DB5F8E',\r\n },\r\n }\r\n }\r\n })\r\n }\r\n\r\n const setCellRight = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'right' }\r\n }\r\n\r\n const setCellCenter = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'center' }\r\n }\r\n const setContentBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n left: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const setLastContentBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n left: { style: 'thin' },\r\n bottom: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const setContentColor = (colKey: string) => {\r\n worksheet.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00F1BBCF',\r\n },\r\n }\r\n }\r\n\r\n const makeRowITM = (rowNumber: number, rowITM: ContentT & { isOddRow: boolean; lastRow: boolean }) => {\r\n worksheet.addRow(rowITM)\r\n\r\n const arrColKey = [\r\n `A${rowNumber}`,\r\n `B${rowNumber}`,\r\n `C${rowNumber}`,\r\n `D${rowNumber}`,\r\n `E${rowNumber}`,\r\n `F${rowNumber}`,\r\n `G${rowNumber}`,\r\n ]\r\n\r\n arrColKey.forEach((colKey, index) => {\r\n if (index < 8) {\r\n if (index === 0) {\r\n setCellRight(colKey) //number format\r\n }\r\n if (index === 1 || index === 3 || index === 4) {\r\n setCellCenter(colKey) //consider type มีแค่สามอย่าง ขนาดพอๆกันเลยอยู่ตรงกลางได้\r\n }\r\n\r\n setContentBorder(colKey)\r\n if (rowITM.isOddRow) {\r\n setContentColor(colKey)\r\n }\r\n if (rowITM.lastRow) {\r\n setLastContentBorder(colKey)\r\n }\r\n }\r\n })\r\n }\r\n\r\n const createBody = () => {\r\n try {\r\n content.forEach((rowGroupITM, index) => {\r\n makeRowITM(index + (startRowHeader + 1), {\r\n lastRow: content.length === index + 1 ? true : false,\r\n isOddRow: (index + 1) % 2 === 0 ? false : true,\r\n ...rowGroupITM,\r\n })\r\n })\r\n } catch (err) {\r\n console.log('Error Generate Row Excel file export: ', err)\r\n throw new Error(err)\r\n }\r\n }\r\n\r\n const createTable = () => {\r\n createHeader()\r\n createBody()\r\n }\r\n\r\n const processColumns = () => {\r\n createTopic()\r\n createTable()\r\n }\r\n\r\n processColumns()\r\n workbook.xlsx.writeBuffer().then(function (xls64data) {\r\n const blob = new Blob([xls64data], {\r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n })\r\n const url = window.URL.createObjectURL(blob)\r\n const anchor = document.createElement('a')\r\n\r\n const reportDate = moment(new Date()).format('yyyyMMDD')\r\n\r\n anchor.href = url\r\n anchor.download = `${translate('EXPORT.EXCEL.EXPIRED-REPORT-NAME')}_${reportDate}.xlsx`\r\n //@ts-ignore\r\n var isIE = /*@cc_on!@*/ false || !!document.documentMode\r\n var isEdge = !isIE && !!window.StyleMedia\r\n if (isEdge) {\r\n anchor.click()\r\n } else {\r\n anchor.click()\r\n }\r\n window.URL.revokeObjectURL(url)\r\n })\r\n}\r\n\r\nexport default expiredExport\r\n","import { Button, Container, Grid, IconButton, Typography } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/styles'\r\nimport { FC, useState, useEffect } from 'react'\r\nimport { useHistory } from 'react-router'\r\nimport DataTable from '../component/report/expired/DataTable'\r\nimport Panel from '../component/report/expired/Panel'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport useSearchExpired, {\r\n ExpiredResponseType,\r\n ExpiredSearchForm,\r\n ExpiredSearchProps,\r\n} from '../services/um/useSearchExpired'\r\nimport moment, { lang } from 'moment'\r\nimport expiredExport from '../component/report/expired/report'\r\nimport GetAppRoundedIcon from '@material-ui/icons/GetAppRounded'\r\nimport useProjectType from '../services/um/lookups/useProjectType'\r\nimport ArrowBackRounded from '@material-ui/icons/ArrowBackRounded'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../utilities/date'\r\nimport { useQueryParam } from 'use-query-params'\r\nimport { FormApi } from 'final-form'\r\nimport { setPrefixName } from '../utilities/prefixName'\r\n\r\nconst Expired: FC = (props) => {\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const classes = useStyles()\r\n const history = useHistory()\r\n const authenStore = useAuthenStore()\r\n const [dataList, setDataList] = useState([])\r\n const [records, setRecords] = useState(0)\r\n const { getExpiredData } = useSearchExpired()\r\n const { projectT } = useProjectType()\r\n const [keyword, setKeyword] = useQueryParam('keyword')\r\n const [projectType, setProjectType] = useQueryParam('projectType')\r\n const [startDate, setStartDate] = useQueryParam('startDate')\r\n const [endDate, setEndDate] = useQueryParam('endDate')\r\n const initialSearch: ExpiredSearchForm = {\r\n keyword: keyword,\r\n projectType: projectType,\r\n startDate: startDate\r\n ? moment(startDate).format('YYYY-MM-DD')\r\n : moment().subtract(1, 'year').format('YYYY-MM-DD'),\r\n endDate: endDate ? moment(endDate).format('YYYY-MM-DD') : moment().format('YYYY-MM-DD'),\r\n }\r\n\r\n const onSubmit = async (value: ExpiredSearchForm) => {\r\n const param: ExpiredSearchProps = {\r\n userID: authenStore.profile.userId ?? 0,\r\n keyword: value.keyword,\r\n projectType: value.projectType,\r\n startDate: moment(value.startDate).format('YYYY-MM-DD'), //'2021-08-01',\r\n endDate: moment(value.endDate).format('YYYY-MM-DD'), //'2021-09-10',\r\n }\r\n setSearchParam(value)\r\n loadData(param)\r\n }\r\n\r\n const setSearchParam = (value: ExpiredSearchForm) => {\r\n setKeyword(value.keyword)\r\n setProjectType(value.projectType)\r\n setStartDate(moment(value.startDate).format('YYYY-MM-DD') ?? '')\r\n setEndDate(moment(value.endDate).format('YYYY-MM-DD') ?? '')\r\n }\r\n\r\n const loadData = async (param: ExpiredSearchProps) => {\r\n const data = await getExpiredData(param)\r\n setRecords(data.length)\r\n setDataList(data)\r\n }\r\n\r\n const initialLoad = () => {\r\n const param: ExpiredSearchProps = {\r\n userID: authenStore.profile.userId ?? 0,\r\n keyword: keyword,\r\n projectType: projectType,\r\n startDate: startDate\r\n ? moment(startDate).format('YYYY-MM-DD')\r\n : moment().subtract(1, 'year').format('YYYY-MM-DD'),\r\n endDate: endDate ? moment(endDate).format('YYYY-MM-DD') : moment().format('YYYY-MM-DD'),\r\n }\r\n setSearchParam(initialSearch)\r\n loadData(param)\r\n }\r\n\r\n const onReset = (form: FormApi>) => {\r\n let param = {\r\n startDate: moment().subtract(1, 'year').format('YYYY-MM-DD'),\r\n endDate: moment().format('YYYY-MM-DD'),\r\n }\r\n form.initialize(param)\r\n setSearchParam(param)\r\n }\r\n\r\n const getProjectTypeName = (value?: number) => {\r\n let result = null\r\n if (value) {\r\n result = projectT.find((item) => item.value === projectType?.toString())?.label\r\n }\r\n return result ?? '-'\r\n }\r\n\r\n useEffect(() => {\r\n if (authenStore.profile.userId) {\r\n initialLoad()\r\n }\r\n }, [authenStore.profile.userId])\r\n\r\n const handleExportExcel = () => {\r\n let convertExportData = dataList.map((itm) => {\r\n return {\r\n projectID: itm.projectNumber ?? '-',\r\n endDate: convertDate(moment(itm.expiredDate).format('YYYY-MM-DD')) ?? '-',\r\n projectType: itm.projectType.name[lang] ?? '-',\r\n researcherName: setPrefixName(itm)[lang] ?? '-',\r\n position: itm.researcherTypeName[lang] ?? '-',\r\n projectNameTH: itm.projectName['th'] ?? '-',\r\n projectNameEN: itm.projectName['en'] ?? '-',\r\n }\r\n })\r\n\r\n expiredExport({\r\n header: {\r\n projectType: getProjectTypeName(projectType),\r\n startDate: convertDate(moment(startDate).format('YYYY-MM-DD')),\r\n endDate: convertDate(moment(endDate).format('YYYY-MM-DD')),\r\n keyword: keyword ?? '-',\r\n },\r\n content: convertExportData,\r\n translate: (value: string) => translate.get(value),\r\n })\r\n }\r\n const onBack = () => {\r\n history.push('/dashboard')\r\n }\r\n\r\n const convertDate = (date: string | null) => {\r\n if (lang === 'th' && date) {\r\n return convertDateToFormatTH(date)\r\n } else if (lang === 'en' && date) {\r\n return convertDateToFormatEN(date)\r\n } else {\r\n return '-'\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${records}`])}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n onClick={handleExportExcel}\r\n >\r\n {translate.get('BUTTON.EXPORT')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n container: {\r\n marginTop: '20px',\r\n width: '100%',\r\n },\r\n}))\r\nexport default Expired\r\n","import useTranslate from '../../../i18n/useTranslate'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport { Button, Grid, makeStyles } from '@material-ui/core'\r\n\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport MySelect from '../../../control/select/select'\r\nimport MyDatePicker from '../../../control/datepicker/datepicker'\r\n\r\nimport useProjectType from '../../../services/um/lookups/useProjectType'\r\nimport { ClosedKeywordType } from '../../../services/um/useSearchClosed'\r\nimport CalendarTodayIcon from '@material-ui/icons/CalendarToday'\r\nimport { FormApi } from 'final-form'\r\nimport { useState } from 'react'\r\nimport moment from 'moment'\r\n\r\ntype ClosePanelComponentProps = {\r\n onSubmit: (value: ClosedKeywordType) => void\r\n initialValue: ClosedKeywordType\r\n onClear: (form: any) => void\r\n}\r\n\r\nconst Panel = ({ onSubmit, initialValue, onClear }: ClosePanelComponentProps) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const { projectT } = useProjectType()\r\n const [endDate, setEndDate] = useState(moment(new Date()).format('YYYY-MM-DD'))\r\n let defaultProjectType = initialValue.projectType ? [initialValue.projectType] : undefined\r\n\r\n const handleStartDateChange = (form: FormApi, value: string | null) => {\r\n if (value && endDate) {\r\n let isStartAfter = moment(value).isAfter(endDate)\r\n if (isStartAfter) {\r\n form.change('endDate', new Date(value))\r\n }\r\n }\r\n }\r\n\r\n const handleEndDateChange = (value: string | null) => {\r\n setEndDate(value)\r\n }\r\n\r\n return (\r\n \r\n \r\n {({ handleSubmit, form, values }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n handleStartDateChange(form, val)}\r\n size=\"small\"\r\n icon={}\r\n required\r\n />\r\n \r\n \r\n }\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n onClear(form)}\r\n >\r\n {translate.get('BUTTON.RESET')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n container: {\r\n padding: '1.7rem',\r\n },\r\n root: {\r\n width: '100%',\r\n },\r\n}))\r\n\r\nexport default Panel\r\n","import * as Excel from 'exceljs'\r\nimport moment from 'moment'\r\n\r\ntype ContentT = {\r\n projectID: string\r\n receiveDate: string\r\n endDate: string\r\n projectType: string\r\n researcherName: string\r\n position: string\r\n projectNameTH: string\r\n projectNameEN: string\r\n}\r\ntype ExportProps = {\r\n header: {\r\n projectType: string\r\n startDate: string\r\n endDate: string\r\n keyword: string\r\n }\r\n content: ContentT[]\r\n translate: (value: string) => string //ไม่สามารถเรียกในหน้านี้ได้ ผิด react rule\r\n}\r\nconst closedExport = ({ header, content, translate }: ExportProps) => {\r\n let startRowHeader = 8\r\n const workbook = new Excel.Workbook()\r\n const worksheet = workbook.addWorksheet('sheet', {\r\n pageSetup: {\r\n paperSize: 9, //follow documentation the 9 value is A4\r\n orientation: 'portrait',\r\n },\r\n })\r\n workbook.creator = 'CU_IRB-WEB'\r\n workbook.lastModifiedBy = 'CU_IRB-WEB'\r\n\r\n const createTopic = () => {\r\n const endCell = 'H'\r\n worksheet.mergeCells(`A1:${endCell}1`)\r\n worksheet.getCell('A1').value = translate('EXPORT.EXCEL.CLOSED-REPORT-NAME')\r\n worksheet.getCell('A1').alignment = { horizontal: 'center' }\r\n worksheet.getCell('A1').font = { bold: true }\r\n worksheet.getCell('A1').fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00F1BBCF',\r\n },\r\n }\r\n\r\n worksheet.mergeCells(`A3:B3`)\r\n worksheet.getCell('A3').value = `${translate('EXPORT.EXCEL.PROJECT-TYPE')} ${header.projectType}`\r\n worksheet.getCell('A3').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A4:B4`)\r\n worksheet.getCell('A4').value = `${translate('EXPORT.EXCEL.START-DATE')} ${header.startDate}`\r\n worksheet.getCell('A4').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A5:B5`)\r\n worksheet.getCell('A5').value = `${translate('EXPORT.EXCEL.END-DATE')} ${header.endDate}`\r\n worksheet.getCell('A5').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A6:B6`)\r\n worksheet.getCell('A6').value = `${translate('EXPORT.EXCEL.KEYWORD')} ${header.keyword}`\r\n worksheet.getCell('A6').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n }\r\n\r\n const setCellBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n top: { style: 'thin' },\r\n left: { style: 'thin' },\r\n bottom: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const createHeader = () => {\r\n let arrHeader = [\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-ID'),\r\n key: 'projectID',\r\n width: 10,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.RECEIVE-DATE'),\r\n key: 'receiveDate',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.END-DATE'),\r\n key: 'endDate',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.RESEARCHER-NAME'),\r\n key: 'researcherName',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.POSITION'),\r\n key: 'position',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-TYPE'),\r\n key: 'projectType',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-NAME-TH'),\r\n key: 'projectNameTH',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-NAME-EN'),\r\n key: 'projectNameEN',\r\n width: 50,\r\n },\r\n ]\r\n\r\n worksheet.columns = arrHeader.map((itm) => ({ key: itm.key, width: itm.width }))\r\n worksheet.getRow(startRowHeader).values = arrHeader.map((itm) => itm.name)\r\n ;[\r\n `A${startRowHeader}`,\r\n `B${startRowHeader}`,\r\n `C${startRowHeader}`,\r\n `D${startRowHeader}`,\r\n `E${startRowHeader}`,\r\n `F${startRowHeader}`,\r\n `G${startRowHeader}`,\r\n `H${startRowHeader}`,\r\n ].forEach((colKey, index) => {\r\n if (index < 10) {\r\n setCellBorder(colKey)\r\n worksheet.getCell(colKey).alignment = { vertical: 'middle', horizontal: 'center', wrapText: true }\r\n worksheet.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00DB5F8E',\r\n },\r\n }\r\n }\r\n })\r\n }\r\n\r\n const setCellRight = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'right' }\r\n }\r\n\r\n const setCellCenter = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'center' }\r\n }\r\n const setContentBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n left: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const setLastContentBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n left: { style: 'thin' },\r\n bottom: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const setContentColor = (colKey: string) => {\r\n worksheet.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00F1BBCF',\r\n },\r\n }\r\n }\r\n\r\n const makeRowITM = (rowNumber: number, rowITM: ContentT & { isOddRow: boolean; lastRow: boolean }) => {\r\n worksheet.addRow(rowITM)\r\n\r\n const arrColKey = [\r\n `A${rowNumber}`,\r\n `B${rowNumber}`,\r\n `C${rowNumber}`,\r\n `D${rowNumber}`,\r\n `E${rowNumber}`,\r\n `F${rowNumber}`,\r\n `G${rowNumber}`,\r\n `H${rowNumber}`,\r\n ]\r\n\r\n arrColKey.forEach((colKey, index) => {\r\n if (index < 8) {\r\n if (index === 0) {\r\n setCellRight(colKey) //number format\r\n }\r\n if (index === 1 || index === 2 || index === 4) {\r\n setCellCenter(colKey) //consider type มีแค่สามอย่าง ขนาดพอๆกันเลยอยู่ตรงกลางได้\r\n }\r\n\r\n setContentBorder(colKey)\r\n if (rowITM.isOddRow) {\r\n setContentColor(colKey)\r\n }\r\n if (rowITM.lastRow) {\r\n setLastContentBorder(colKey)\r\n }\r\n }\r\n })\r\n }\r\n\r\n const createBody = () => {\r\n try {\r\n content.forEach((rowGroupITM, index) => {\r\n makeRowITM(index + (startRowHeader + 1), {\r\n lastRow: content.length === index + 1 ? true : false,\r\n isOddRow: (index + 1) % 2 === 0 ? false : true,\r\n ...rowGroupITM,\r\n })\r\n })\r\n } catch (err) {\r\n console.log('Error Generate Row Excel file export: ', err)\r\n throw new Error(err)\r\n }\r\n }\r\n\r\n const createTable = () => {\r\n createHeader()\r\n createBody()\r\n }\r\n\r\n const processColumns = () => {\r\n createTopic()\r\n createTable()\r\n }\r\n\r\n processColumns()\r\n workbook.xlsx.writeBuffer().then(function (xls64data) {\r\n const blob = new Blob([xls64data], {\r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n })\r\n const url = window.URL.createObjectURL(blob)\r\n const anchor = document.createElement('a')\r\n\r\n const reportDate = moment(new Date()).format('yyyyMMDD')\r\n\r\n anchor.href = url\r\n anchor.download = `${translate('EXPORT.EXCEL.CLOSED-REPORT-NAME')}_${reportDate}.xlsx`\r\n //@ts-ignore\r\n var isIE = /*@cc_on!@*/ false || !!document.documentMode\r\n var isEdge = !isIE && !!window.StyleMedia\r\n if (isEdge) {\r\n anchor.click()\r\n } else {\r\n anchor.click()\r\n }\r\n window.URL.revokeObjectURL(url)\r\n })\r\n}\r\n\r\nexport default closedExport\r\n","import useCallApi from '../../utilities/axios'\r\n\r\nexport type ClosedKeywordType = {\r\n keyword?: string\r\n projectType?: number | null\r\n startDate: string | Date\r\n endDate: string | Date\r\n userID: number | null\r\n}\r\n\r\nexport type ClosedDataListType = {\r\n projectID: number\r\n projectNumber: string\r\n closedDate: string\r\n receiveDate: string\r\n projectName: Translation\r\n projectType: {\r\n id: number\r\n name: Translation\r\n }\r\n name: Translation\r\n title: Translation\r\n academicPosition: Translation\r\n isPhD: boolean\r\n researcherTypeName: Translation\r\n}\r\n\r\ntype Translation = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport const useSearchClosed = () => {\r\n const callApi = useCallApi()\r\n\r\n const searchClosed = async (values: ClosedKeywordType) => {\r\n const { data } = await callApi.axiosPost({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/dashboard/search/project/closed`,\r\n params: { ...values },\r\n })\r\n\r\n return data\r\n }\r\n\r\n return {\r\n searchClosed,\r\n }\r\n}\r\n","import { useState, useEffect } from 'react'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport _ from 'lodash'\r\nimport { makeStyles } from '@material-ui/core'\r\nimport { ClosedDataListType } from '../../../services/um/useSearchClosed'\r\nimport { convertDateToFormatTH, convertDateToFormatEN } from '../../../utilities/date'\r\nimport { DataGrid, GridColDef } from '@mui/x-data-grid'\r\nimport CustomNoRowsOverlay from './CustomNoRowsOverlay'\r\nimport CustomPagination from './CustomPagination'\r\nimport { CustomSortingDescending, CustomSortingASCcending } from './CusromSorting'\r\nimport { setPrefixName } from '../../../utilities/prefixName'\r\n\r\ntype DataRowsType = {\r\n id: number\r\n projectNumber: string\r\n receiveDate: string\r\n closedDate: string\r\n name: string\r\n position: string\r\n projectType: string\r\n projectNameTH: string\r\n projectNameEN: string\r\n}\r\n\r\ntype ClosePanelComponentProps = {\r\n dataList: ClosedDataListType[]\r\n}\r\n\r\nconst Table = ({ dataList }: ClosePanelComponentProps) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const [rows, setRows] = useState([])\r\n\r\n useEffect(() => {\r\n convertData()\r\n }, [dataList, lang])\r\n\r\n const convertData = () => {\r\n if (dataList.length > 0) {\r\n let rows = dataList.map((item: ClosedDataListType) => {\r\n return {\r\n id: item.projectID,\r\n projectNumber: item.projectNumber,\r\n receiveDate: convertDate(item.receiveDate),\r\n closedDate: convertDate(item.closedDate),\r\n name: setPrefixName(item)[lang] ?? '-',\r\n position: item.researcherTypeName[lang] ?? '-',\r\n projectNameTH: item.projectName.th ?? '-',\r\n projectNameEN: item.projectName.en ?? '-',\r\n projectType: item.projectType.name[lang] ?? '-',\r\n }\r\n })\r\n setRows(rows)\r\n } else {\r\n setRows([])\r\n }\r\n }\r\n\r\n const convertDate = (date: string | null) => {\r\n if (lang === 'th' && date) {\r\n return convertDateToFormatTH(date)\r\n } else if (lang === 'en' && date) {\r\n return convertDateToFormatEN(date)\r\n } else {\r\n return '-'\r\n }\r\n }\r\n\r\n const column: GridColDef[] = [\r\n {\r\n field: 'projectNumber',\r\n headerName: `${translate.get('UM.CLOSED.DATA_TABLE.COLUMN1')}`,\r\n width: 180,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n sortable: true,\r\n },\r\n {\r\n field: 'receiveDate',\r\n headerName: `${translate.get('UM.CLOSED.DATA_TABLE.COLUMN2')}`,\r\n width: 180,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n sortable: true,\r\n },\r\n {\r\n field: 'closedDate',\r\n headerName: `${translate.get('UM.CLOSED.DATA_TABLE.COLUMN3')}`,\r\n width: 180,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n sortable: true,\r\n },\r\n {\r\n field: 'name',\r\n headerName: `${translate.get('UM.CLOSED.DATA_TABLE.COLUMN4')}`,\r\n width: 300,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n sortable: true,\r\n },\r\n {\r\n field: 'position',\r\n headerName: `${translate.get('UM.CLOSED.DATA_TABLE.COLUMN5')}`,\r\n width: 250,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n sortable: true,\r\n },\r\n {\r\n field: 'projectType',\r\n headerName: `${translate.get('UM.CLOSED.DATA_TABLE.COLUMN6')}`,\r\n width: 200,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n sortable: true,\r\n },\r\n {\r\n field: 'projectNameTH',\r\n headerName: `${translate.get('UM.CLOSED.DATA_TABLE.COLUMN7')}`,\r\n width: 400,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n sortable: true,\r\n },\r\n {\r\n field: 'projectNameEN',\r\n headerName: `${translate.get('UM.CLOSED.DATA_TABLE.COLUMN8')}`,\r\n width: 400,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n sortable: true,\r\n },\r\n ]\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n '& .super-app-theme--fffff': {\r\n backgroundColor: '#DB5F8E',\r\n '&:hover': {\r\n backgroundColor: '#DB5F8E',\r\n },\r\n },\r\n '& .super-app-theme--header': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n '& .MuiDataGrid-columnSeparator': {\r\n visibility: 'hidden',\r\n },\r\n '& .MuiDataGrid-row': {\r\n lineHeigh: '70px',\r\n },\r\n\r\n '& .header-table': {\r\n backgroundColor: '#DB5F8E',\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiDataGrid-iconSeparator': {\r\n display: 'none',\r\n },\r\n '& .MuiDataGrid-sortIcon': {\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiBadge-anchorOriginTopRightRectangle': {\r\n display: 'none',\r\n },\r\n '& .MuiDataGrid-cell:focus-within': {\r\n outline: 'none',\r\n },\r\n\r\n width: '100%',\r\n marginTop: 16,\r\n\r\n overflowX: 'hidden',\r\n },\r\n}))\r\n\r\nexport default Table\r\n","import { useState, useEffect } from 'react'\r\n\r\nimport { Grid, Typography, makeStyles, IconButton, Container, Button } from '@material-ui/core'\r\n\r\nimport GetAppRoundedIcon from '@material-ui/icons/GetAppRounded'\r\nimport moment from 'moment'\r\n\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport ClosePanel from '../component/report/closed/Panel'\r\nimport closedExport from '../component/report/closed/report'\r\nimport { useSearchClosed, ClosedKeywordType, ClosedDataListType } from '../services/um/useSearchClosed'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\nimport { convertDateToFormatTH, convertDateToFormatEN } from '../utilities/date'\r\nimport { setPrefixName } from './../utilities/prefixName'\r\nimport Table from '../component/report/closed/Table'\r\nimport ArrowBackRounded from '@material-ui/icons/ArrowBackRounded'\r\nimport { useHistory } from 'react-router'\r\nimport { useQueryParam } from 'use-query-params'\r\nimport useProjectType from '../services/um/lookups/useProjectType'\r\n\r\nconst ClosedForm = ({}) => {\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const classes = useStyles()\r\n const history = useHistory()\r\n\r\n const { searchClosed } = useSearchClosed()\r\n const [dataList, setDataList] = useState([])\r\n const authenStore = useAuthenStore()\r\n const { projectT } = useProjectType()\r\n const [keyword, setKeyword] = useQueryParam('keyword')\r\n const [projectType, setProjectType] = useQueryParam('projectType')\r\n const [startDate, setStartDate] = useQueryParam('startDate')\r\n const [endDate, setEndDate] = useQueryParam('endDate')\r\n\r\n const setSearchParam = (value: ClosedKeywordType) => {\r\n setKeyword(value.keyword)\r\n setProjectType(value.projectType)\r\n setStartDate(moment(value.startDate).format('YYYY-MM-DD') ?? '')\r\n setEndDate(moment(value.endDate).format('YYYY-MM-DD') ?? '')\r\n }\r\n const [initialValue, setInitialValue] = useState({\r\n keyword: keyword,\r\n projectType: projectType,\r\n startDate: startDate\r\n ? moment(startDate).format('YYYY-MM-DD')\r\n : moment().subtract(1, 'year').format('YYYY-MM-DD'),\r\n endDate: endDate ? moment(endDate).format('YYYY-MM-DD') : moment().format('YYYY-MM-DD'),\r\n userID: authenStore.profile.userId ?? 0,\r\n })\r\n\r\n useEffect(() => {\r\n if (authenStore.profile.userId) {\r\n onSubmit(initialValue)\r\n }\r\n }, [authenStore.profile.userId])\r\n\r\n const onSubmit = async (value: ClosedKeywordType) => {\r\n setInitialValue(value)\r\n const data = await searchClosed({\r\n keyword: value.keyword,\r\n projectType: value.projectType ? Number(value.projectType) : null,\r\n startDate: value.startDate,\r\n endDate: value.endDate,\r\n userID: authenStore.profile.userId ?? 0,\r\n })\r\n setDataList(data)\r\n setSearchParam(value)\r\n }\r\n\r\n const onClear = async (form: any) => {\r\n form.reset()\r\n setInitialValue({\r\n startDate: moment().subtract(1, 'year').format('YYYY-MM-DD'),\r\n endDate: moment().format('YYYY-MM-DD'),\r\n userID: authenStore.profile.userId ?? 0,\r\n })\r\n }\r\n const getProjectTypeName = (value?: number | null) => {\r\n let result = null\r\n if (value) {\r\n result = projectT.find((item) => item.value === projectType?.toString())?.label\r\n }\r\n return result ?? '-'\r\n }\r\n\r\n const handleExportExcel = () => {\r\n closedExport({\r\n header: {\r\n projectType: getProjectTypeName(projectType),\r\n startDate: convertDate(moment(startDate).format('YYYY-MM-DD')),\r\n endDate: convertDate(moment(endDate).format('YYYY-MM-DD')),\r\n keyword: keyword ?? '-',\r\n },\r\n content: dataList.map((item) => {\r\n return {\r\n projectID: item.projectNumber,\r\n receiveDate: convertDate(item.receiveDate),\r\n endDate: convertDate(item.closedDate),\r\n researcherName: setPrefixName(item)[lang] ?? '-',\r\n position: item.researcherTypeName[lang] ?? '-',\r\n projectNameTH: item.projectName['th'] ?? '-',\r\n projectNameEN: item.projectName['en'] ?? '-',\r\n projectType: item.projectType.name[lang] ?? '-',\r\n }\r\n }),\r\n translate: (value: string) => translate.get(value),\r\n })\r\n }\r\n\r\n const convertDate = (date: string | null) => {\r\n if (lang === 'th' && date) {\r\n return convertDateToFormatTH(date)\r\n } else if (lang === 'en' && date) {\r\n return convertDateToFormatEN(date)\r\n } else {\r\n return '-'\r\n }\r\n }\r\n\r\n const onBack = () => {\r\n history.push('/dashboard')\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${dataList.length}`])}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n onClick={handleExportExcel}\r\n >\r\n {translate.get('BUTTON.EXPORT')}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n },\r\n container: {\r\n margin: '15px 0px',\r\n width: '100%',\r\n },\r\n}))\r\n\r\nexport default ClosedForm\r\n","import React from 'react'\r\nimport { UseResearchDetailType } from './uploadDocType'\r\n\r\nconst useResearchDetail = (props: UseResearchDetailType) => {\r\n const [isExpanded, setExpanded] = React.useState(true)\r\n const [docLst, setDocLst] = React.useState()\r\n\r\n const handleClickAccordionChange = (isExpanded: boolean) => {\r\n setExpanded(isExpanded)\r\n }\r\n const onChangeUpload = async (fileList: Array, mainTopicID: number) => {}\r\n return { isExpanded, docLst, onClickAccordionChange: handleClickAccordionChange, onChangeUpload }\r\n}\r\n\r\nexport default useResearchDetail\r\n","import React, { useRef, useState } from 'react'\r\nimport { useField } from 'react-final-form'\r\nimport { FieldValidator } from 'final-form'\r\nimport {\r\n UseUploadFileType,\r\n MyFileType,\r\n SubTopicPageList,\r\n ReturnDataType,\r\n NewReturnListFileType,\r\n UploadResponseType,\r\n} from './uploadFileType'\r\nimport { composeValidators, uploadRequired } from '../../../../../utilities/validate'\r\nimport useAppAlertMessageAction from '../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { requestWebServiceTypes } from '../../../../../services/web/types/index'\r\nimport { useForm } from 'react-final-form'\r\nimport path from 'path'\r\nimport { fileExtUploadFilelist } from '../../../../../constants/constants'\r\n\r\nconst useUploadFile = (props: UseUploadFileType) => {\r\n const {\r\n required,\r\n requiredErrorMessage,\r\n validates = [],\r\n // onChangeUpload,\r\n initialData,\r\n topicID,\r\n name,\r\n disabled,\r\n resetLstFileUpload,\r\n } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const refElementUpload = useRef()\r\n const refElementUploadEdit = useRef()\r\n const refGroupFileIndex = useRef() //index ของไฟล์ที่อยู่ภายในหัวข้อนั้น ๆ\r\n const refElementTextField = useRef()\r\n const refDialog = useRef>()\r\n const refDialogDownload = useRef>()\r\n const [lstFileUpload, setLstFileUpload] = useState()\r\n const [lstFileChange, setLstFileChange] = useState([])\r\n const [lstFileHistory, setLstFileHistory] = useState([])\r\n const [returnData, setReturnData] = useState()\r\n const form = useForm()\r\n\r\n const { values, dirty } = form.getState()\r\n const { IRB } = values\r\n\r\n React.useEffect(() => {\r\n setLstFileUpload([]) //clear data first\r\n if (initialData) {\r\n initialData?.forEach((upload: any) => {\r\n if (upload.uploadFileObj.documentTopicID === topicID) {\r\n if (upload.uploadFileObj.fileList.length > 0) {\r\n let listFile = upload.uploadFileObj.fileList.map((item: any) => {\r\n return {\r\n ...item,\r\n documentTopicID: topicID,\r\n }\r\n })\r\n setLstFileUpload(listFile)\r\n }\r\n setReturnData({ ...upload.uploadFileObj })\r\n }\r\n })\r\n } else {\r\n setLstFileUpload([])\r\n setReturnData(undefined)\r\n }\r\n }, [JSON.stringify(initialData)])\r\n\r\n React.useEffect(() => {\r\n if (!disabled) {\r\n //clear file when IRB Change\r\n if (lstFileUpload && lstFileUpload?.length > 0 && dirty) {\r\n setLstFileUpload([])\r\n setReturnData(undefined)\r\n }\r\n }\r\n }, [IRB?.value])\r\n\r\n React.useEffect(() => {\r\n setLstFileUpload([]) //clear data first\r\n if (initialData) {\r\n initialData?.forEach((upload: any) => {\r\n if (upload.uploadFileObj.documentTopicID === topicID) {\r\n if (upload.uploadFileObj.fileList.length > 0) {\r\n let listFile = upload.uploadFileObj.fileList.map((item: any) => {\r\n return {\r\n ...item,\r\n documentTopicID: topicID,\r\n }\r\n })\r\n setLstFileUpload(listFile)\r\n }\r\n setReturnData({ ...upload.uploadFileObj })\r\n }\r\n })\r\n } else {\r\n setLstFileUpload([])\r\n setReturnData(undefined)\r\n }\r\n }, [resetLstFileUpload])\r\n\r\n const mergeValidate = () => {\r\n let validate: Array> = []\r\n if (typeof required === 'boolean' && required) {\r\n validate = [uploadRequired(requiredErrorMessage), ...validates]\r\n }\r\n\r\n return validate\r\n }\r\n\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate()),\r\n })\r\n\r\n const handleClickUpload = () => {\r\n refElementUpload.current.click()\r\n }\r\n const checkDuplicateFile = (lstFile: Array) => {\r\n const listFileName = lstFile.map((file) => {\r\n return file.name\r\n })\r\n\r\n const duplicateFile = lstFileUpload?.filter(function (oldFile) {\r\n return listFileName.indexOf(oldFile.filename) > -1\r\n })\r\n\r\n if (duplicateFile && duplicateFile?.length > 0) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n }\r\n\r\n const checkFileExtension = (event: any, accept: string) => {\r\n const name = event.target.files[0].name\r\n const listExtension = accept.split(',')\r\n\r\n for (var j = 0; j < listExtension.length; j++) {\r\n var sCurExtension = listExtension[j]\r\n if (\r\n name.substring(name.length - sCurExtension.length, name.length).toLowerCase() ===\r\n sCurExtension.toLowerCase()\r\n ) {\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n const handleClickChange = (index: any) => {\r\n refElementUploadEdit.current.click()\r\n refGroupFileIndex.current = index\r\n }\r\n\r\n const handleChangeUploadEdit = async (event: any, mainTopicID: number) => {\r\n const fileList: FileList = event.target.files\r\n let lstFile: Array = []\r\n let lstDisplayName: Array = []\r\n const numFiles = fileList.length\r\n const numMaxUploadFile = Number(process.env.REACT_APP_MAX_UPLOAD_FILE_DOCUMENT)\r\n\r\n if (numFiles > 0) {\r\n for (let i = 0; i < numFiles; i++) {\r\n const file: MyFileType = fileList[i]\r\n //file.fileID = `${i}_${fileList[i].lastModified}_${fileList[i].name}`\r\n if (fileList[i].size > 5242880 || numFiles > numMaxUploadFile) {\r\n //5 mb to byte (1 mb = 1048576 byte)\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n message: translate.get('ALERT.CONTENT.UPLOAD_NOT_EXCEED_FILE', [String(numMaxUploadFile)]),\r\n })\r\n\r\n lstFile = []\r\n lstDisplayName = []\r\n\r\n break\r\n }\r\n const fileExt = path.extname(`${fileList[i].name}`)\r\n if (fileExtUploadFilelist.indexOf(fileExt) === -1) {\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n message: translate.get('LABEL.UPLOAD_NOT_EXCEED_5_MB'),\r\n })\r\n\r\n lstFile = []\r\n lstDisplayName = []\r\n\r\n break\r\n }\r\n lstFile.push(file)\r\n lstDisplayName.push(file.name)\r\n }\r\n }\r\n\r\n const uploadRes = await callUploadFile(lstFile, mainTopicID)\r\n let myNewListFile: NewReturnListFileType[]\r\n myNewListFile = uploadRes.map((itm: UploadResponseType) => {\r\n return {\r\n no: null,\r\n date: new Date(),\r\n fileToken: `${itm.fileToken}`,\r\n filename: itm.filename,\r\n // fileID: `${itm.fileToken}`,\r\n path: itm.path,\r\n isNewFile: true,\r\n documentTopicID: mainTopicID,\r\n }\r\n })\r\n\r\n if (myNewListFile && myNewListFile.length > 0) {\r\n let newLstFile = JSON.parse(JSON.stringify(lstFileUpload))\r\n\r\n if (lstFileUpload) {\r\n const fileGroupIndex = refGroupFileIndex.current as number\r\n setLstFileChange([...lstFileChange, newLstFile[fileGroupIndex]])\r\n\r\n myNewListFile[0].replaceFileID = newLstFile[fileGroupIndex].fileID\r\n\r\n newLstFile[fileGroupIndex] = myNewListFile[0]\r\n }\r\n\r\n //@ts-ignore\r\n setLstFileUpload(newLstFile) // fordisplay\r\n //@ts-ignore\r\n let newReturnData = { ...returnData, fileList: newLstFile }\r\n if (newLstFile.length === 0) {\r\n newReturnData = { ...returnData, fileList: newLstFile, subTopicPageList: [] } //กรณีลบไฟล์ออกหมดจะให้เคลียร์ค่า page ออกด้วย\r\n } else {\r\n newReturnData = { ...returnData, fileList: newLstFile }\r\n }\r\n setReturnData(newReturnData)\r\n field.input.onChange(newReturnData)\r\n setLstFileUpload(newLstFile)\r\n refElementTextField.current.value = newLstFile?.join(', ')\r\n }\r\n }\r\n\r\n const handleChangeUpload = async (event: any, mainTopicID: number, accept: string) => {\r\n const fileList: FileList = event.target.files\r\n let lstFile: Array = []\r\n let lstDisplayName: Array = []\r\n const currentListFileNum = lstFileUpload ? lstFileUpload.length : 0\r\n const numFiles = fileList.length\r\n const numMaxUploadFile = Number(process.env.REACT_APP_MAX_UPLOAD_FILE_DOCUMENT)\r\n if (numFiles > 0) {\r\n const checkExtension = checkFileExtension(event, accept)\r\n if (!checkExtension) {\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n message: translate.get('ALERT.CONTENT.UPLOAD_INVALID_FILE_EXTENSION'),\r\n })\r\n }\r\n if (checkExtension) {\r\n for (let i = 0; i < numFiles; i++) {\r\n const file: MyFileType = fileList[i]\r\n file.fileID = `${i}_${fileList[i].lastModified}_${fileList[i].name}`\r\n if (fileList[i].size > 5242880 || numFiles + currentListFileNum > numMaxUploadFile) {\r\n //5 mb to byte (1 mb = 1048576 byte)\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n message: translate.get('ALERT.CONTENT.UPLOAD_NOT_EXCEED_FILE', [String(numMaxUploadFile)]),\r\n })\r\n\r\n lstFile = []\r\n lstDisplayName = []\r\n\r\n break\r\n }\r\n const fileExt = path.extname(`${fileList[i].name}`)\r\n if (fileExtUploadFilelist.indexOf(fileExt) === -1) {\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n message: translate.get('LABEL.UPLOAD_NOT_EXCEED_5_MB'),\r\n })\r\n\r\n lstFile = []\r\n lstDisplayName = []\r\n\r\n break\r\n }\r\n lstFile.push(file)\r\n lstDisplayName.push(file.name)\r\n }\r\n }\r\n }\r\n\r\n // --- ############################################################################## --- //\r\n\r\n const isDuplicateFile = checkDuplicateFile(lstFile)\r\n if (isDuplicateFile) {\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n message: translate.get('ALERT.CONTENT.UPLOAD_FILE_DUPLICATED'),\r\n })\r\n } else {\r\n const uploadRes = await callUploadFile(lstFile, mainTopicID)\r\n let myNewListFile: NewReturnListFileType[]\r\n myNewListFile = uploadRes.map((itm: UploadResponseType) => {\r\n return {\r\n documentTopicID: mainTopicID,\r\n fileToken: `${itm.fileToken}`,\r\n filename: itm.filename,\r\n //fileID: `${itm.fileToken}`,\r\n path: itm.path,\r\n isNewFile: true,\r\n }\r\n })\r\n\r\n //@ts-ignore\r\n setLstFileUpload([...lstFileUpload, ...myNewListFile]) // fordisplay\r\n //@ts-ignore\r\n let newFileList = returnData ? [...returnData?.fileList, ...myNewListFile] : [...myNewListFile]\r\n const newReturnData = {\r\n ...returnData,\r\n //@ts-ignore\r\n fileList: newFileList,\r\n documentTopicID: mainTopicID,\r\n }\r\n setReturnData(newReturnData)\r\n field.input.onChange(newReturnData)\r\n refElementTextField.current.value = lstDisplayName.join(', ')\r\n }\r\n }\r\n\r\n const callUploadFile = async (fileList: Array, mainTopicID: number) => {\r\n var formData = new FormData()\r\n fileList.forEach((file: MyFileType, index: number) => {\r\n formData.append('files', file)\r\n })\r\n\r\n const res = await callWebService.uploadFileTemp(formData)\r\n return res.result\r\n }\r\n const handleClickClear = async (file: any) => {\r\n const deleteTempParam: requestWebServiceTypes.DeleteTempType = {\r\n fileToken: [file.fileToken],\r\n }\r\n const { status } = await callWebService.deleteTempFile(deleteTempParam)\r\n\r\n if (status === 1) {\r\n let currentValue: ReturnDataType = field.input.value as unknown as ReturnDataType\r\n let newLstFile: any = []\r\n if (file.replaceFileID) {\r\n let oldReplaceFile = lstFileChange?.filter(\r\n (itm: any) => itm.fileID === file.replaceFileID || itm.replaceFileID === file.replaceFileID,\r\n )\r\n newLstFile = currentValue.fileList?.map((itm) => {\r\n if (itm.replaceFileID === file.replaceFileID) {\r\n return oldReplaceFile?.[0] || itm\r\n } else {\r\n return itm\r\n }\r\n })\r\n } else if (file.isNewFile) {\r\n newLstFile = currentValue.fileList?.filter((itm) => itm.fileToken !== file.fileToken)\r\n } else {\r\n newLstFile = currentValue.fileList?.filter((itm) => itm.fileID !== file.fileID)\r\n }\r\n\r\n let newReturnData = { ...returnData, fileList: newLstFile }\r\n if (newLstFile.length === 0) {\r\n newReturnData = { ...returnData, fileList: newLstFile, subTopicPageList: [] } //กรณีลบไฟล์ออกหมดจะให้เคลียร์ค่า page ออกด้วย\r\n } else {\r\n newReturnData = { ...returnData, fileList: newLstFile }\r\n }\r\n setReturnData(newReturnData)\r\n field.input.onChange(newReturnData)\r\n setLstFileUpload(newLstFile)\r\n refElementTextField.current.value = newLstFile?.join(', ')\r\n } else {\r\n alert(translate.get('MESSAGE.M010'))\r\n }\r\n }\r\n\r\n const handleChangeInputPage = (page: string, subTopicID: number, mainTopicID?: number | null) => {\r\n let obj = { page: page, subtopicID: subTopicID }\r\n\r\n // --- Logic --- //\r\n //1. delete old value\r\n //2. push new value\r\n let newReturnData = null\r\n if (returnData?.subTopicPageList && returnData?.subTopicPageList?.length > 0) {\r\n const deletedOldSubTopicList = returnData.subTopicPageList.filter((itm: SubTopicPageList) => {\r\n //delete old value\r\n return itm.mainTopicID != mainTopicID || itm.subTopicID != subTopicID\r\n })\r\n\r\n let newSubTopicPageList = [...deletedOldSubTopicList, { ...obj }].filter(\r\n //@ts-ignore\r\n (itm) => itm.subtopicID !== subTopicID,\r\n ) //push new value\r\n newReturnData = { ...returnData, subTopicPageList: [...newSubTopicPageList, obj] }\r\n setReturnData(newReturnData)\r\n field.input.onChange(newReturnData)\r\n } else {\r\n newReturnData = { ...returnData, subTopicPageList: [obj] }\r\n setReturnData(newReturnData)\r\n field.input.onChange(newReturnData)\r\n }\r\n }\r\n\r\n const queryFileHistory = async (fileID: any, fileReplaceID: any) => {\r\n const { result } = await callWebService.getFileHistory(fileID, fileReplaceID)\r\n setLstFileHistory(result)\r\n }\r\n\r\n // const handleClickFile = (filename: string, filePath: string) => {\r\n // const fileExt = path.extname(`${filename}`)\r\n\r\n // if (onClickFile) {\r\n // onClickFile(filename, fileExt, filePath)\r\n // } else {\r\n // window.open(filePath)\r\n // }\r\n // }\r\n\r\n return {\r\n refElementUpload,\r\n refElementUploadEdit,\r\n refElementTextField,\r\n refDialog,\r\n refDialogDownload,\r\n field,\r\n lstFileUpload,\r\n lstFileHistory,\r\n onClickUpload: handleClickUpload,\r\n onClickChange: handleClickChange,\r\n onChangeUpload: handleChangeUpload,\r\n onChangeUploadEdit: handleChangeUploadEdit,\r\n onClickClear: handleClickClear,\r\n onChangeInputPage: handleChangeInputPage,\r\n queryFileHistory: queryFileHistory,\r\n resetLstFileUpload,\r\n }\r\n}\r\n\r\nexport default useUploadFile\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport Button from '@material-ui/core/Button'\r\nimport TextField from '@material-ui/core/TextField'\r\nimport FormHelperText from '@material-ui/core/FormHelperText'\r\nimport FormControl from '@material-ui/core/FormControl'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport useUploadFile from './useUploadFile'\r\nimport { UploadFileViewType, UploadFileType, NewReturnListFileType } from './uploadFileType'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Typography, SvgIcon } from '@material-ui/core'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport { Fragment } from 'react'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport path from 'path'\r\nimport { fileExt as fileExtConst } from '../../../../../constants/constants'\r\nimport { ReactComponent as DocumentIcon } from '../../../../../images/document.svg'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport { styled } from '@material-ui/styles'\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nexport type UplodeFileObjYype = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subTopicID: number\r\n }[]\r\n }\r\n}\r\nconst UploadFileView = (props: UploadFileViewType) => {\r\n const {\r\n disabled,\r\n required,\r\n // label = '',\r\n name,\r\n field: { meta },\r\n refElementUploadEdit,\r\n refElementUpload,\r\n refElementTextField,\r\n refDialog,\r\n refDialogDownload,\r\n onClickUpload,\r\n onClickChange,\r\n onChangeUpload,\r\n onChangeUploadEdit,\r\n onClickClear,\r\n queryFileHistory,\r\n // title,\r\n subTitleList,\r\n lstFileUpload = [],\r\n lstFileHistory,\r\n dataSource,\r\n topicID,\r\n initialData,\r\n onChangeInputPage,\r\n disabledBtn = false,\r\n latestDocument,\r\n // isRenderLatestDocument,\r\n onClickOpenFile,\r\n nameBtn,\r\n accept = '.png,.jpeg,.tiff,.pdf,.doc,.docx',\r\n canEditUploadFile,\r\n multipleFiles = true,\r\n } = props\r\n const translate = useTranslate()\r\n const isError = !disabled && meta.error && meta.touched ? true : false\r\n const classes = useStyles(isError)\r\n const { profile } = useAuthenStore()\r\n const isPreventUpload = !multipleFiles && lstFileUpload.length >= 1\r\n const { pathname } = useLocation()\r\n const isDontWantHistory = pathname.includes('settingDocument') || pathname.includes('officer')\r\n\r\n const renderLatestDocumentElement = () => {\r\n let latestDocumentElement\r\n latestDocument?.map((itm) => {\r\n if (itm.topicID === topicID) {\r\n latestDocumentElement = (\r\n \r\n \r\n \r\n {translate.get('LABEL.OLD_FILE')}\r\n \r\n {itm.fileInfo.map((file) => {\r\n return (\r\n \r\n \r\n \r\n {renderIcon(file.filename)}\r\n \r\n \r\n {dataSource?.code} {file.filename}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n \r\n )\r\n }\r\n })\r\n return latestDocumentElement\r\n }\r\n const renderIcon = (filename: any) => {\r\n const fileExt = path.extname(`${filename || ''}`)\r\n let iconPath = ''\r\n switch (fileExt) {\r\n case fileExtConst.pdf:\r\n iconPath = '/img/icons/pdf.png'\r\n break\r\n case fileExtConst.doc:\r\n iconPath = '/img/icons/word.png'\r\n break\r\n case fileExtConst.docx:\r\n iconPath = '/img/icons/word.png'\r\n break\r\n case fileExtConst.tiff:\r\n iconPath = '/img/icons/other_docs.png'\r\n break\r\n case fileExtConst.png:\r\n iconPath = '/img/icons/other_docs.png'\r\n break\r\n case fileExtConst.jpg:\r\n iconPath = '/img/icons/other_docs.png'\r\n break\r\n case fileExtConst.xls:\r\n iconPath = '/img/icons/excel.png'\r\n break\r\n case fileExtConst.xlsx:\r\n iconPath = '/img/icons/excel.png'\r\n break\r\n default:\r\n iconPath = '/img/icons/pdf.png'\r\n break\r\n }\r\n\r\n return (\r\n \r\n )\r\n }\r\n\r\n const getDisplayDate = (val: any) => {\r\n let display = ''\r\n if (val) {\r\n display =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? 'ล่าสุดวันที่ ' + convertDateToFormatTH(val)\r\n : 'Last updated ' + convertDateToFormatEN(val)\r\n }\r\n return display\r\n }\r\n\r\n const getDisplayHistoryDate = (val: any) => {\r\n let display = '-'\r\n if (val) {\r\n display =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? convertDateToFormatTH(val)\r\n : convertDateToFormatEN(val)\r\n }\r\n return display\r\n }\r\n\r\n const bindingDialogRef = (func: Record) => {\r\n refDialog.current = { ...func }\r\n }\r\n const handleOpenDialog = async (fileID: any, replaceFileID: any) => {\r\n refDialog?.current?.openDialog()\r\n await queryFileHistory(fileID, replaceFileID)\r\n }\r\n const handleCloseDialog = () => {\r\n refDialog?.current?.closeDialog()\r\n }\r\n\r\n const bindingDialogDownloadRef = (func: Record) => {\r\n refDialogDownload.current = { ...func }\r\n }\r\n const handleOpenDialogDownload = async () => {\r\n refDialogDownload?.current?.openDialog()\r\n }\r\n\r\n const handleCloseDialogDownload = () => {\r\n refDialogDownload?.current?.closeDialog()\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {dataSource?.no}\r\n {dataSource?.no ? '.' : ''} {dataSource?.code}{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? dataSource?.name_th\r\n : dataSource?.name_en}{' '}\r\n \r\n {profile?.userGroupId == 1 && (dataSource?.file_name_th || dataSource?.file_name_en) && (\r\n \r\n )}\r\n \r\n \r\n {!disabledBtn && (\r\n \r\n \r\n {nameBtn ? nameBtn : translate.get('BUTTON.UPLOAD')}\r\n \r\n \r\n )}\r\n\r\n {/* {renderLatestDocumentElement()} */}\r\n \r\n \r\n {lstFileUpload?.map((itm: NewReturnListFileType, index: number) => {\r\n return (\r\n \r\n \r\n \r\n \r\n {renderIcon(itm.filename)}\r\n \r\n {(onClickOpenFile && (\r\n {\r\n onClickOpenFile(itm.path ?? '', itm.filename)\r\n }}\r\n >\r\n {dataSource?.code} {itm.filename}\r\n \r\n )) || (\r\n \r\n {dataSource?.code}\r\n {itm.filename}\r\n \r\n )}\r\n \r\n \r\n {getDisplayDate(itm.date)}\r\n \r\n {itm.replaceFileID && !isDontWantHistory && (\r\n {\r\n handleOpenDialog(itm.fileID, itm.replaceFileID)\r\n }}\r\n size=\"small\"\r\n >\r\n \r\n \r\n )}\r\n \r\n {!disabled && (\r\n \r\n {(!itm.isNewFile && (\r\n {\r\n onClickChange(index)\r\n }}\r\n size={'small'}\r\n style={{ height: '30px', right: '5px' }}\r\n >\r\n {nameBtn ? nameBtn : translate.get('BUTTON.EDIT')}\r\n \r\n )) || (\r\n {\r\n onClickClear(itm)\r\n }}\r\n size={'small'}\r\n style={{ height: '30px', right: '5px' }}\r\n >\r\n {nameBtn ? nameBtn : translate.get('BUTTON.DELETE')}\r\n \r\n )}\r\n {/* {!disabled && (\r\n {\r\n onClickClear(itm)\r\n }}\r\n >\r\n \r\n \r\n )} */}\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n })}\r\n {lstFileUpload && lstFileUpload.length === 0 && (\r\n \r\n {translate.get('LABEL.NO_FILE_UPLOAD')}\r\n \r\n )}\r\n \r\n \r\n {lstFileUpload && lstFileUpload.length > 0 && subTitleList && subTitleList.length > 0 && (\r\n \r\n \r\n {translate.get('LABEL.PLEASE_FILL_IN_ADDRESS')}\r\n \r\n \r\n {translate.get('LABEL.PAGE')}\r\n \r\n\r\n {subTitleList?.map((itm: any, index: number) => {\r\n let uploadObj = []\r\n let initialSubtopic = []\r\n if (initialData.length > 0) {\r\n uploadObj = initialData?.filter(\r\n (itm: UplodeFileObjYype) => itm.uploadFileObj.documentTopicID === topicID,\r\n )\r\n initialSubtopic = uploadObj?.[0].uploadFileObj.subTopicPageList\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n {itm.no}\r\n {'. '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en}\r\n \r\n \r\n \r\n {\r\n onChangeInputPage(e.target.value, itm.id, dataSource?.id)\r\n }}\r\n />\r\n \r\n \r\n )\r\n })}\r\n \r\n )}\r\n \r\n {\r\n onChangeUploadEdit(e, topicID)\r\n }}\r\n onClick={(event) => {\r\n //@ts-ignore\r\n event.currentTarget.value = null\r\n }}\r\n hidden\r\n />\r\n\r\n {\r\n onChangeUpload(e, topicID, accept)\r\n }}\r\n onClick={(event) => {\r\n //@ts-ignore\r\n event.currentTarget.value = null\r\n }}\r\n hidden\r\n />\r\n \r\n ),\r\n readOnly: true,\r\n }}\r\n type=\"text\"\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.LANGUAGE_THAI')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {\r\n window.open(\r\n `${dataSource?.file_path}/${dataSource?.file_name_th}` ||\r\n '',\r\n )\r\n }}\r\n size={'small'}\r\n style={{ height: '30px' }}\r\n >\r\n {nameBtn ? nameBtn : translate.get('BUTTON.DOWNLOAD_BUTTON')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.LANGUAGE_ENG')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {\r\n window.open(\r\n `${dataSource?.file_path}/${dataSource?.file_name_en}` ||\r\n '',\r\n )\r\n }}\r\n size={'small'}\r\n style={{ height: '30px' }}\r\n >\r\n {nameBtn ? nameBtn : translate.get('BUTTON.DOWNLOAD_BUTTON')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n                                \r\n                                    {translate.get('BUTTON.CLOSE_MODAL')}\r\n                                \r\n                            \r\n                        \r\n                    \r\n                }\r\n            />\r\n            \r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.FILE_NAME')}\r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.FILE_TIME')}\r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.FILE_UPLOAD_BY')}\r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.FILE_UPLOAD_DATE')}\r\n                                        \r\n                                    \r\n                                \r\n                            \r\n                            {lstFileHistory &&\r\n                                lstFileHistory?.map((item: any, inx: number) => (\r\n                                    \r\n                                        \r\n                                            \r\n                                                {renderIcon(item.fileName)}\r\n                                                \r\n                                                    \r\n                                                        {item.fileName}\r\n                                                    \r\n                                                \r\n                                            \r\n                                            \r\n                                                {lstFileHistory.length - inx}\r\n                                            \r\n                                            \r\n                                                {item.updatedBy}\r\n                                            \r\n                                            \r\n                                                {getDisplayHistoryDate(item.updatedDate)}\r\n                                            \r\n                                        \r\n                                    \r\n                                ))}\r\n                            \r\n                                
\r\n                                \r\n                                    {translate.get('BUTTON.CLOSE_MODAL')}\r\n                                \r\n                            \r\n                        \r\n                    \r\n                }\r\n            />\r\n            \r\n                {isError && meta.error}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nconst CustomButton = styled(Button)({\r\n    border: '1px solid #DB5F8E',\r\n    boxShadow: '0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%)',\r\n})\r\n\r\nconst UploadFile = (props: UploadFileType) => {\r\n    const uploadFileModel = useUploadFile(props)\r\n    return \r\n}\r\n\r\nexport default UploadFile\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    input: {\r\n        '&>input': {\r\n            cursor: 'default !important',\r\n        },\r\n    },\r\n    button: {\r\n        padding: '7px 16px',\r\n        borderRadius: '0px 5px 5px 0px',\r\n    },\r\n    button_end_icon: {\r\n        paddingRight: '0px',\r\n    },\r\n    clear_icon: {\r\n        margin: theme.spacing(1),\r\n    },\r\n    label: {\r\n        // fontWeight: 'bold',\r\n        marginBottom: 10,\r\n        color: (isError: any) => {\r\n            if (isError) {\r\n                return '#ff4d4f'\r\n            } else {\r\n                return ''\r\n            }\r\n        },\r\n    },\r\n    errorText: {\r\n        fontSize: '12px',\r\n        color: '#ff4d4f',\r\n    },\r\n    inputPage: {\r\n        boxSizing: 'border-box',\r\n        padding: '15px',\r\n    },\r\n    div_a: {\r\n        color: 'blue',\r\n        textDecoration: 'underline blue',\r\n        cursor: 'pointer',\r\n        '&:active': {\r\n            color: 'red',\r\n            textDecoration: 'underline red',\r\n        },\r\n    },\r\n    multiLineEllipsis: {\r\n        maxWidth: '100%',\r\n        overflow: 'hidden',\r\n        textOverflow: 'ellipsis',\r\n        display: '-webkit-box',\r\n        '-webkit-line-clamp': 1,\r\n        '-webkit-box-orient': 'vertical',\r\n    },\r\n    editfileBtn: {\r\n        backgroundColor: '#e57600',\r\n        color: '#fff',\r\n        height: '44px',\r\n        marginRight: '1px',\r\n        '&:hover': {\r\n            backgroundColor: '#ff8300',\r\n        },\r\n    },\r\n}))\r\n","import React from 'react'\r\n\r\nimport { Grid } from '@material-ui/core'\r\nimport { ResearchDetailViewType, ResearchDetailCtrlType } from './uploadDocType'\r\nimport useUploadDoc from './useUploadDoc'\r\n\r\nimport UploadFile from './uploadFile/uploadFile'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\n\r\nconst UploadDocView: React.FC = ({ ...props }) => {\r\n    const translate = useTranslate()\r\n    const {\r\n        documentTitleList,\r\n        isViewMode,\r\n        initialData,\r\n        name = 'uploadFile',\r\n        disabledBtn = false,\r\n        latestDocument,\r\n        onClickOpenFile,\r\n        accept = 'image/png,image/jpeg,image/tiff,.pdf,.doc,.docx,.jpg,.png',\r\n        required,\r\n        validates,\r\n        nameBtn,\r\n        multipleFiles,\r\n    } = props\r\n    const renderUploadFile = (name: string, index: number) => {\r\n        return (\r\n             {}}\r\n                subTitleList={documentTitleList[index].subtopic}\r\n                initialData={initialData ? [initialData[index]] : []}\r\n                disabled={isViewMode}\r\n                disabledBtn={disabledBtn}\r\n                latestDocument={latestDocument}\r\n                required={required}\r\n                onClickOpenFile={onClickOpenFile}\r\n                nameBtn={nameBtn === undefined ? nameBtn : translate.get('BUTTON.UPLOAD')}\r\n                accept={accept}\r\n                validates={validates}\r\n            />\r\n        )\r\n    }\r\n    return (\r\n        \r\n            \r\n                {(\r\n                    { fields }, //loop from initialData\r\n                ) =>\r\n                    fields.map((name, index) => (\r\n                        // \r\n                        \r\n                            {documentTitleList &&\r\n                                documentTitleList.length > 0 &&\r\n                                documentTitleList[index] &&\r\n                                renderUploadFile(name, index)}\r\n                        \r\n                        // \r\n                    ))\r\n                }\r\n            \r\n        \r\n    )\r\n}\r\n\r\nlet UploadDocFile: React.FC = (props: ResearchDetailCtrlType) => {\r\n    const uploadDocModel = useUploadDoc(props)\r\n    return \r\n}\r\n\r\nexport default UploadDocFile\r\n","export const spellWord = (value: string) => {\r\n    const reg = /([\\u0E00-\\u0E7F]+)/\r\n\r\n    if (reg.test(value)) {\r\n        const string = value.slice(0, value.length - 1)\r\n\r\n        return string\r\n    } else {\r\n        return value\r\n    }\r\n}\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport { Typography, IconButton, Grid } from '@material-ui/core'\r\nimport Button from '../../../control/button/button'\r\n\r\nimport Visibility from '@material-ui/icons/Visibility'\r\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\r\nimport { FC, useState } from 'react'\r\nimport { Form as FormT } from '../../../services/um/useRegisterExternal'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport UploadDocFile from '../../web/shareUI/uploadDoc/UploadDocFile'\r\nimport { ValidationErrors } from 'final-form'\r\nimport { textRequired, validateEmail } from '../../../utilities/validate'\r\n\r\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle'\r\nimport CancelIcon from '@material-ui/icons/Cancel'\r\nimport { spellWord } from '../../../utilities/email'\r\n\r\nimport isEmail from 'validator/lib/isEmail'\r\n\r\ninterface FormProps {\r\n    onClickSubmit: (values: FormT) => void\r\n    onClickDisplayPW: () => void\r\n    onClickDisplayCfPW: () => void\r\n    onChangeMobilePhone: (value: string, fnCallback: (valBack: string) => void) => void\r\n    onClickBackLink: () => void\r\n    onClickCheck: (value: string) => void\r\n    onChangeUsername: () => void\r\n    displayPW: boolean\r\n    displayCfPW: boolean\r\n    canUse: 'pass' | 'failed' | undefined\r\n}\r\nconst Form: FC = ({\r\n    onClickSubmit,\r\n    onClickDisplayPW,\r\n    onClickDisplayCfPW,\r\n    onChangeMobilePhone,\r\n    onClickBackLink,\r\n    onClickCheck,\r\n    onChangeUsername,\r\n    displayPW,\r\n    displayCfPW,\r\n    canUse,\r\n}) => {\r\n    const classes = useStyles()\r\n    const translate = useTranslate()\r\n\r\n    const [fileInitial] = useState([\r\n        {\r\n            uploadFileObj: {\r\n                fileList: [],\r\n                subTopicPageList: [],\r\n                documentTopicID: 99,\r\n            },\r\n        },\r\n    ])\r\n    const topicInitial = [\r\n        {\r\n            id: 99,\r\n            no: '',\r\n            name_th: 'โครงการวิจัยและเอกสารที่เกี่ยวข้อง',\r\n            name_en: 'Research projects and related documents',\r\n            code: '',\r\n            subtopic: [],\r\n        },\r\n    ]\r\n\r\n    const validateForm = (values: FormT) => {\r\n        const errors: ValidationErrors = {}\r\n\r\n        if (values.password && values.confirmPassword) {\r\n            if (values.confirmPassword !== values.password) {\r\n                errors.confirmPassword = translate.get('MESSAGE.M019')\r\n            }\r\n        }\r\n\r\n        if (values.email && !isEmail(values.email)) {\r\n            errors.email = translate.get('MESSAGE.M017')\r\n        }\r\n\r\n        return errors\r\n    }\r\n\r\n    const Icon = () => {\r\n        switch (canUse) {\r\n            case 'pass':\r\n                return \r\n            case 'failed':\r\n                return \r\n\r\n            default:\r\n                return <>\r\n        }\r\n    }\r\n\r\n    const onChkEmail = (val: string) => {\r\n        let error = false\r\n        if (val && !/^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$/.test(val)) {\r\n            error = true\r\n        }\r\n\r\n        return error\r\n    }\r\n\r\n    return (\r\n        \r\n            {({ handleSubmit, form, values }) => {\r\n                return (\r\n                    \r\n                        \r\n                            \r\n                                {translate.get('UM.EXTERNAL-REGISTER.ACCOUNT')}\r\n                            \r\n                            \r\n                                {translate.get('UM.EXTERNAL-REGISTER.TITLE_DES')}\r\n                            \r\n                        \r\n                        \r\n                            }\r\n                                handleValueChange={(valueEmail) => {\r\n                                    if (!valueEmail) {\r\n                                        onClickCheck(valueEmail)\r\n                                    } else {\r\n                                        const result = spellWord(valueEmail)\r\n                                        form.change('email', result)\r\n                                        onChangeUsername()\r\n                                    }\r\n                                }}\r\n                                error={onChkEmail(values.email)}\r\n                                required\r\n                                validates={[validateEmail(translate.get('MESSAGE.M017'))]}\r\n                            />\r\n                        \r\n                        \r\n                             onClickCheck(values.email)}\r\n                                style={{ height: '50px', bottom: onChkEmail(values.email) ? '17px' : '0px' }}\r\n                            >\r\n                                {translate.get('UM.EXTERNAL-REGISTER.CHECK')}\r\n                            \r\n                        \r\n                        \r\n                            \r\n                                        {displayPW ? (\r\n                                            \r\n                                        ) : (\r\n                                            \r\n                                        )}\r\n                                    \r\n                                }\r\n                                required\r\n                            />\r\n                        \r\n                        \r\n                            \r\n                                        {displayCfPW ? (\r\n                                            \r\n                                        ) : (\r\n                                            \r\n                                        )}\r\n                                    \r\n                                }\r\n                                required\r\n                                validates={[textRequired('test')]}\r\n                            />\r\n                        \r\n\r\n                        \r\n                            \r\n                                {translate.get('UM.EXTERNAL-REGISTER.PROFILE')}\r\n                            \r\n                        \r\n                        \r\n                            \r\n                        \r\n                        \r\n                            \r\n                        \r\n                        \r\n                            \r\n                                    onChangeMobilePhone(value, (valBack) => {\r\n                                        form.change('telephone', valBack)\r\n                                    })\r\n                                }\r\n                            />\r\n                        \r\n                        \r\n                            \r\n                        \r\n                        \r\n                            \r\n                        \r\n\r\n                        \r\n                            \r\n                                {translate.get('UM.EXTERNAL-REGISTER.CONSIDER')}\r\n                            \r\n                        \r\n                        \r\n                            \r\n                        \r\n\r\n                        \r\n                            \r\n                                {translate.get('UM.EXTERNAL-REGISTER.UPLOAD')} *\r\n                            \r\n                        \r\n                        \r\n                            \r\n                        \r\n\r\n                        \r\n                            \r\n                                {translate.get('UM.EXTERNAL-REGISTER.OTHER-ACCOUNT')}\r\n                            \r\n                        \r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                        {translate.get('UM.EXTERNAL-REGISTER.OK')}\r\n                                    \r\n                                \r\n                            \r\n                        \r\n                    \r\n                )\r\n            }}\r\n        \r\n    )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    root: {\r\n        width: '100%',\r\n        height: '100%',\r\n        padding: '1rem 0px',\r\n    },\r\n    link: {\r\n        color: '#0022FF',\r\n        cursor: 'pointer',\r\n        textDecoration: 'underline',\r\n    },\r\n    rootLink: {\r\n        alignSelf: 'center',\r\n    },\r\n    buttonCheck: {\r\n        alignSelf: 'flex-end',\r\n        marginBottom: '10px',\r\n        // paddingTop: '56px ',\r\n        [theme.breakpoints.down('xs')]: {\r\n            // padding: '0px',\r\n        },\r\n    },\r\n    typo: { fontWeight: 'bold', marginBottom: '10px' },\r\n}))\r\n\r\nexport default Form\r\n","import useLoading from '../../control/loading/useLoading'\r\nimport useCallApi from '../../utilities/axios'\r\nimport * as umServinceURL from './umServiceURL'\r\n\r\nexport type Form = {\r\n    email: string\r\n    password: string\r\n    confirmPassword: string\r\n    nameTH: string\r\n    nameEN: string\r\n    telephone?: string\r\n    reason: string\r\n    uploadFile?: any[]\r\n    PDPA: boolean\r\n}\r\nconst useRegisterExternal = () => {\r\n    const callApi = useCallApi()\r\n    const loadingHook = useLoading()\r\n\r\n    const post = async (values: Form) => {\r\n        try {\r\n            loadingHook.loadingOpen()\r\n            const { data } = await callApi.axiosPost({\r\n                url: umServinceURL.postRegisterEx,\r\n                params: { ...values, cunet: 0 },\r\n            })\r\n\r\n            return data\r\n        } catch (err) {\r\n        } finally {\r\n            loadingHook.loadingClose()\r\n        }\r\n    }\r\n    return { post }\r\n}\r\n\r\nexport default useRegisterExternal\r\n","import useLoading from '../../control/loading/useLoading'\r\nimport useCallApi from '../../utilities/axios'\r\nimport * as umServiceURL from './umServiceURL'\r\n\r\n// export type FormType = {\r\n//     username: string\r\n// }\r\n\r\nconst useCheckEmail = () => {\r\n    const callApi = useCallApi()\r\n    const loadingHook = useLoading()\r\n\r\n    const postCheck = async (username: string, type: number = 2) => {\r\n        try {\r\n            loadingHook.loadingOpen()\r\n            const { data } = await callApi.axiosPost({\r\n                url: umServiceURL.postCheckEmail,\r\n                params: { username, type },\r\n            })\r\n\r\n            return data\r\n        } finally {\r\n            loadingHook.loadingClose()\r\n        }\r\n    }\r\n    return { postCheck }\r\n}\r\n\r\nexport default useCheckEmail\r\n","import { Grid } from '@material-ui/core'\r\n\r\ninterface ContentProps {\r\n    lang: string\r\n}\r\nconst Content = ({ lang }: ContentProps) => {\r\n    return (\r\n        \r\n            \r\n                \r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default Content\r\n","import { useEffect, useRef } from 'react'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport Content from './Content'\r\n\r\ninterface AcceptanceProps {\r\n    isOpen: boolean\r\n    onClickAccept: () => void\r\n    onClickClose: () => void\r\n}\r\nconst Acceptance = ({ isOpen, onClickAccept, onClickClose }: AcceptanceProps) => {\r\n    const translate = useTranslate()\r\n    const dialogAcceptance = useRef>()\r\n\r\n    const onRefDialogAcceptance = (func: Record) => {\r\n        dialogAcceptance.current = func\r\n    }\r\n\r\n    useEffect(() => {\r\n        if (isOpen) dialogAcceptance.current?.openDialog()\r\n        else dialogAcceptance.current?.closeDialog()\r\n    }, [isOpen])\r\n\r\n    return (\r\n        <>\r\n            }\r\n                onClickConfirm={onClickAccept}\r\n                onAfterClose={onClickClose}\r\n                reachedBottom={true}\r\n            />\r\n        \r\n    )\r\n}\r\n\r\nexport default Acceptance\r\n","import Form from '../component/um/register-external/Form'\r\n\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Container from '@material-ui/core/Container'\r\nimport { Paper, Typography } from '@material-ui/core'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport useRegisterExternal, { Form as FormT } from '../services/um/useRegisterExternal'\r\nimport { useState, useRef } from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../router/routesConfig'\r\nimport { encryption } from '../utilities/encryption'\r\n\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport LayoutPublic from '../component/web/layout/layoutPublic'\r\n// import usePDPA from '../services/authen/usePDPA'\r\nimport useCheckEmail from '../services/um/useCheckEmail'\r\nimport Acceptance from '../component/um/register-external/Acceptance'\r\n\r\nconst RegisterExternal = () => {\r\n    const classes = useStyles({})\r\n    const translate = useTranslate()\r\n    const history = useHistory()\r\n    // const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n    const { post } = useRegisterExternal()\r\n    // const { get } = usePDPA()\r\n    const { postCheck } = useCheckEmail()\r\n\r\n    const [configDialog, setConfigDialog] =\r\n        useState>()\r\n    const dialogTwoRef = useRef>()\r\n    const [displayPW, setDisplayPW] = useState(false)\r\n    const [displayCfPW, setDisplaCfyPW] = useState(false)\r\n    // eslint-disable-next-line\r\n    const [PDPA, setPDPA] = useState('')\r\n    // eslint-disable-next-line\r\n    const [openPDPA, setOpenPDPA] = useState(false)\r\n\r\n    const [canUse, setCanUse] = useState<'pass' | 'failed' | undefined>(undefined)\r\n\r\n    const [isOpen, setIsOpen] = useState(false)\r\n    const [bufferData, setBufferData] = useState()\r\n\r\n    // const fetchPDPA = async () => {\r\n    //     const result = await get()\r\n    //     if (result) {\r\n    //         setPDPA(result[lang])\r\n    //     }\r\n    // }\r\n\r\n    const onRefDialogTwo = (func: Record) => {\r\n        dialogTwoRef.current = func\r\n    }\r\n\r\n    // const save = async (values: FormT) => {\r\n    //     const format = {\r\n    //         ...values,\r\n    //         password: encryption(values.password),\r\n    //         PDPA: true,\r\n    //     }\r\n\r\n    //     const result = await post(format)\r\n\r\n    //     if (result) {\r\n    //         setConfigDialog({\r\n    //             title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n    //             content: translate.get('UM.EXTERNAL-REGISTER.DIALOG.REGISTER_SUCCESS'),\r\n    //             type: 'alert-message',\r\n    //             onAfterClose: onBack,\r\n    //         })\r\n    //     }\r\n    // }\r\n\r\n    const onClickAccept = async () => {\r\n        const format = {\r\n            ...bufferData,\r\n            password: encryption(bufferData.password),\r\n            PDPA: true,\r\n        }\r\n\r\n        const result = await post(format)\r\n\r\n        if (result) {\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('UM.EXTERNAL-REGISTER.DIALOG.REGISTER_SUCCESS'),\r\n                type: 'alert-message',\r\n                onAfterClose: onBack,\r\n            })\r\n        }\r\n        dialogTwoRef.current?.openDialog()\r\n    }\r\n\r\n    const onClickClose = () => {\r\n        setIsOpen(false)\r\n    }\r\n\r\n    const onSubmit = async (values: FormT) => {\r\n        if (canUse !== 'pass') {\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('UM.EXTERNAL-REGISTER.DIALOG.INVALID_EMAIL'),\r\n                type: 'alert-message',\r\n            })\r\n\r\n            dialogTwoRef.current?.openDialog()\r\n        } else {\r\n            if (values.uploadFile?.[0].uploadFileObj.fileList.length < 1) {\r\n                setConfigDialog({\r\n                    title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                    content: translate.get('ALERT.CONTENT.UPLOAD_FILE_AT_LEAST_1_FILE'),\r\n                    type: 'alert-message',\r\n                })\r\n                dialogTwoRef.current?.openDialog()\r\n            } else {\r\n                setBufferData(values)\r\n                setIsOpen(true)\r\n            }\r\n        }\r\n    }\r\n\r\n    const onSwitchPW = () => {\r\n        setDisplayPW(!displayPW)\r\n    }\r\n\r\n    const onSwitchCfPW = () => {\r\n        setDisplaCfyPW(!displayCfPW)\r\n    }\r\n\r\n    const onChangeMobilePhone = (val: string, fnCallback: (valBack: string) => void) => {\r\n        if (val) {\r\n            let result = ''\r\n            const phoneNumber = val.replace(/[^\\d]/g, '')\r\n            if (phoneNumber.length < 4) {\r\n                result = phoneNumber\r\n            } else if (phoneNumber.length < 7) {\r\n                result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3)}`\r\n            } else {\r\n                result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3, 6)}-${phoneNumber.slice(6, 10)}`\r\n            }\r\n            fnCallback(result)\r\n        }\r\n    }\r\n\r\n    const onBack = () => {\r\n        history.push(RoutePath.login)\r\n    }\r\n\r\n    const onClickCheck = async (value: string) => {\r\n        const isChkErrorFormatEmail = onChkEmail(value)\r\n        if (!isChkErrorFormatEmail) {\r\n            if (!value) {\r\n                setCanUse(undefined)\r\n                return\r\n            }\r\n\r\n            const result = await postCheck(value, 1)\r\n\r\n            if (result.message === 'pass') {\r\n                setCanUse('pass')\r\n                return\r\n            }\r\n\r\n            if (result.cunet) {\r\n                setConfigDialog({\r\n                    title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                    content: translate.get('ALERT.CONTENT.ACCOUNT_BELONGS_CUNET'),\r\n                    // 'บัญชีนี้เป็นของ CU-NET หากท่านมีบัญชีของ CU-NET อยู่แล้ว สามารถ Login เพื่อเข้าสู่ระบบโดยไม่ต้องลงทะเบียนผู้วิจัย',\r\n                    type: 'alert-message',\r\n                    // onAfterClose: onBack,\r\n                })\r\n                setCanUse('failed')\r\n                dialogTwoRef.current?.openDialog()\r\n\r\n                return\r\n            }\r\n\r\n            if (result.message !== 'pass') {\r\n                setConfigDialog({\r\n                    title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                    content: translate.get('UM.EXTERNAL-REGISTER.DIALOG.PLEASE_RETYPE_EMAIL'),\r\n                    type: 'alert-message',\r\n                    // onAfterClose: onBack,\r\n                })\r\n                setCanUse('failed')\r\n                dialogTwoRef.current?.openDialog()\r\n\r\n                return\r\n            }\r\n        }\r\n    }\r\n\r\n    const onChkEmail = (val: string) => {\r\n        let error = false\r\n        // eslint-disable-next-line\r\n        if (val && !/^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$/.test(val)) {\r\n            error = true\r\n        }\r\n\r\n        return error\r\n    }\r\n\r\n    const onChangeUsername = () => {\r\n        setCanUse(undefined)\r\n    }\r\n\r\n    return (\r\n        \r\n            \r\n                \r\n                    \r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                \r\n\r\n                                \r\n                                    \r\n                                        {translate.get('UM.EXTERNAL-REGISTER.TITLE')}\r\n                                    \r\n                                \r\n\r\n                                \r\n                                    \r\n                                \r\n                                \r\n                                {/*  */}\r\n                            \r\n                            \r\n                        \r\n                    \r\n                \r\n            \r\n        \r\n    )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    rootContainer: {\r\n        display: 'flex',\r\n        alignItems: 'center',\r\n        minHeight: 'calc(100vh - 96px)',\r\n        [theme.breakpoints.down('sm')]: {\r\n            margin: '0px',\r\n            padding: '0px',\r\n        },\r\n    },\r\n    root: {\r\n        width: '100%',\r\n        [theme.breakpoints.down('sm')]: {\r\n            height: '100%',\r\n        },\r\n    },\r\n    item: {\r\n        [theme.breakpoints.down('sm')]: {\r\n            height: '100%',\r\n        },\r\n    },\r\n    paper: {\r\n        width: '100%',\r\n        margin: '2rem 0px',\r\n        [theme.breakpoints.down('sm')]: {\r\n            margin: '0px',\r\n        },\r\n    },\r\n    container: {\r\n        padding: '1.5rem',\r\n    },\r\n    typo: {\r\n        fontWeight: 'bold',\r\n    },\r\n}))\r\n\r\nexport default RegisterExternal\r\n","import { FC, useState } from 'react'\r\n\r\nimport { Grid } from '@material-ui/core'\r\nimport Button from '../../../control/button/button'\r\nimport { Form } from 'react-final-form'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport MultiSelect from '../../../control/multiSelect/multiSelect'\r\nimport { SearchFormT } from '../../../services/um/useExternalResearcher'\r\nimport { ValidationErrors } from 'final-form'\r\n\r\ninterface PanelProps {\r\n    onSubmit: (values: SearchFormT) => void\r\n    initialSearch: SearchFormT\r\n    onReset: (form: any) => void\r\n    onEnter: (values: SearchFormT) => void\r\n}\r\n\r\nconst Panel: FC = ({ onSubmit, initialSearch, onReset, onEnter }) => {\r\n    const translate = useTranslate()\r\n    const classes = useStyles()\r\n    const defaultSelect = initialSearch.statusID\r\n    const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n    const options = [\r\n        { label: { th: 'รอพิจารณา', en: 'Waitting' }, value: '1' },\r\n        { label: { th: 'อนุมัติ', en: 'Approved' }, value: '2' },\r\n        { label: { th: 'ไม่อนุมัติ', en: 'Reject' }, value: '3' },\r\n    ]\r\n\r\n    const validation = (values: SearchFormT) => {\r\n        const errors: ValidationErrors = {}\r\n\r\n        if (!values.statusID) {\r\n            errors.statusID = translate.get('MESSAGE.M016')\r\n        }\r\n        if (values.statusID && values.statusID.length === 0) {\r\n            errors.statusID = translate.get('MESSAGE.M016')\r\n        }\r\n\r\n        return errors\r\n    }\r\n\r\n    return (\r\n        
\r\n {({ handleSubmit, form, values }) => {\r\n return (\r\n \r\n \r\n onEnter(values)}\r\n />\r\n \r\n \r\n ({\r\n ...item,\r\n label: item.label[lang],\r\n }))}\r\n label={translate.get('UM.EXTERNAL-RESEARCHER.STATUS')}\r\n placeholder={translate.get('UM.EXTERNAL-RESEARCHER.STATUS')}\r\n size=\"small\"\r\n defaultValue={defaultSelect}\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n {\r\n form.reset()\r\n onReset(form)\r\n }}\r\n className={classes.btnSearch}\r\n >\r\n {translate.get('BUTTON.RESET')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: '15px',\r\n },\r\n clear: {\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n padding: '0px 1.5rem',\r\n alignSelf: 'center',\r\n },\r\n btnSearch: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n },\r\n}))\r\n\r\nexport default Panel\r\n","import { Grid, makeStyles } from '@material-ui/core'\r\nimport { FC } from 'react'\r\n\r\ninterface StatusProps {\r\n id: string\r\n name: string\r\n}\r\nconst Status: FC = ({ id, name }) => {\r\n const classes = useStyles()\r\n\r\n const chooseClass = (status: string) => {\r\n switch (status) {\r\n case '1':\r\n return classes.waiting\r\n case '2':\r\n return classes.approved\r\n case '3':\r\n return classes.reject\r\n\r\n default:\r\n break\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {name}\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n waiting: {\r\n backgroundColor: '#FCDC4D',\r\n borderRadius: '24px',\r\n color: '#CB793A',\r\n },\r\n approved: {\r\n backgroundColor: '#63cc63',\r\n borderRadius: '24px',\r\n color: '#0a5f04',\r\n },\r\n reject: {\r\n backgroundColor: '#e06464',\r\n borderRadius: '24px',\r\n color: '#8a0404',\r\n },\r\n container: {\r\n padding: '0.7rem',\r\n },\r\n}))\r\n\r\nexport default Status\r\n","import { FC } from 'react'\r\nimport { Grid, IconButton, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport VisibilityIcon from '@material-ui/icons/Visibility'\r\n\r\nimport Status from './Status'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { convertDateToFormatTH } from '../../../utilities/date'\r\n\r\nimport { ResponseT } from '../../../services/um/useExternalResearcher'\r\nimport { ButtonView } from '../../../control/button/button'\r\n\r\ninterface ItemProps {\r\n onClickEdit: (userID: string) => void\r\n data: ResponseT\r\n}\r\nconst Item: FC = ({ onClickEdit, data }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n const renderIcon = () => {\r\n if (data.status.id === '1') {\r\n return (\r\n onClickEdit(data.userID)}>\r\n {translate.get('BUTTON.EDIT')}\r\n \r\n )\r\n } else {\r\n return (\r\n onClickEdit(data.userID)} aria-label=\"edit\" className={classes.icon}>\r\n \r\n \r\n )\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {renderIcon()}\r\n \r\n \r\n \r\n {translate.get('UM.USERGROUP.FULLNAME')}\r\n \r\n \r\n {data.name[lang]}\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.EXTERNAL-RESEARCHER.REGISTER-DATE')}\r\n \r\n \r\n \r\n \r\n {convertDateToFormatTH(data.registerDate, 'DD MMMM YYYY')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n icon: {\r\n margin: theme.spacing(1),\r\n\r\n width: 40,\r\n height: 40,\r\n backgroundColor: '#ece9e9',\r\n transition: '0.3s',\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n },\r\n status: {\r\n [theme.breakpoints.down('md')]: {\r\n marginTop: '10px',\r\n },\r\n },\r\n header: {\r\n fontWeight: 'bold',\r\n },\r\n\r\n item: {\r\n padding: theme.spacing(3),\r\n marginBottom: '10px',\r\n marginRight: '0px',\r\n transition: '0.3s',\r\n position: 'relative',\r\n '&:hover': {\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n },\r\n btnEdit: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n height: '44px',\r\n marginRight: '1px',\r\n },\r\n multiLineEllipsis: {\r\n maxWidth: '100%',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n display: '-webkit-box',\r\n '-webkit-line-clamp': 1,\r\n '-webkit-box-orient': 'vertical',\r\n },\r\n}))\r\n\r\nexport default Item\r\n","import { Grid, Typography } from '@material-ui/core'\r\nimport { FC } from 'react'\r\nimport { ResponseT } from '../../../services/um/useExternalResearcher'\r\nimport Item from './Item'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useLoadingStore from '../../../control/loading/store/useLoadingStore'\r\n\r\ninterface ResultProps {\r\n onClickEdit: (userID: string) => void\r\n data: ResponseT[]\r\n}\r\nconst Result: FC = ({ onClickEdit, data }) => {\r\n const translate = useTranslate()\r\n const loadingStore = useLoadingStore()\r\n\r\n return (\r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${data.length}`])}\r\n \r\n \r\n {data.map((item) => {\r\n return (\r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n\r\n {!loadingStore.isLoading && data?.length === 0 && (\r\n \r\n {translate.get('LABEL.NO_DATA_FOUND')}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport default Result\r\n","import useCallApi from '../../utilities/axios'\r\nimport * as umServinceURL from './umServiceURL'\r\n\r\nexport type SearchFormT = {\r\n keyword: string\r\n statusID: string[]\r\n}\r\n\r\nexport type TransT = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport type ResponseT = {\r\n userID: string\r\n name: TransT\r\n registerDate: string\r\n status: {\r\n id: string\r\n name: TransT\r\n }\r\n}\r\n\r\nconst useExternalResearcher = () => {\r\n const callApi = useCallApi()\r\n const get = async (values: SearchFormT) => {\r\n const { data } = await callApi.axiosPost<{ result: ResponseT[] }>({\r\n url: umServinceURL.getExternalResearcher,\r\n params: values,\r\n })\r\n\r\n return data\r\n }\r\n\r\n return { get }\r\n}\r\n\r\nexport default useExternalResearcher\r\n","import React, { useEffect, useState } from 'react'\r\nimport { Container, Grid, makeStyles, Paper, Typography } from '@material-ui/core'\r\n\r\nimport Panel from '../component/um/external-researcher/Panel'\r\nimport Result from '../component/um/external-researcher/Result'\r\nimport useExternalResearcher, { ResponseT, SearchFormT } from '../services/um/useExternalResearcher'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { useQueryParam, StringParam, ArrayParam } from 'use-query-params'\r\nimport { FormApi } from 'final-form'\r\nimport { encryptionAES } from '../utilities/encryption'\r\nimport useLoading from '../control/loading/useLoading'\r\n\r\nconst ExternalResearcher = () => {\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const { get } = useExternalResearcher()\r\n const classes = useStyles()\r\n const loadingHook = useLoading()\r\n const [keyword, setKeyword] = useQueryParam('keyword', StringParam)\r\n const [statusID, setStatusID] = useQueryParam('statusID', ArrayParam)\r\n const [isExpanded, setIsExpanded] = useState(true)\r\n\r\n const [data, setData] = useState([])\r\n\r\n const [initialSearch, setInitialSearch] = useState({\r\n keyword: keyword ?? '',\r\n statusID: (statusID as string[]) ?? ['1'],\r\n })\r\n\r\n useEffect(() => {\r\n onSearch(initialSearch)\r\n }, [])\r\n\r\n const onSearch = async (values: SearchFormT) => {\r\n loadingHook.loadingOpen()\r\n const result = await get({ keyword: values.keyword || '', statusID: values.statusID || ['1'] })\r\n loadingHook.loadingClose()\r\n setKeyword(values.keyword || '')\r\n setStatusID(values.statusID || ['1'])\r\n setData(result.result)\r\n }\r\n\r\n const onEdit = (userID: string) => {\r\n history.push(`/external-researcher/${encryptionAES(userID)}/approve`)\r\n }\r\n\r\n const onReset = (form: FormApi>) => {\r\n let param = {\r\n keyword: '',\r\n statusID: ['1'],\r\n }\r\n form.initialize(param)\r\n setInitialSearch(param)\r\n onSearch(param)\r\n }\r\n\r\n const handleEnter = (values: SearchFormT) => {\r\n onSearch(values)\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default ExternalResearcher\r\nconst useStyles = makeStyles((theme) => ({\r\n paperFromSearch: {\r\n width: '100%',\r\n padding: '30px',\r\n marginBottom: '10px',\r\n },\r\n}))\r\n","import useTranslate from '../../i18n/useTranslate'\r\nimport useCallApi from '../../utilities/axios'\r\nimport * as umServinceURL from './umServiceURL'\r\n\r\nexport type InitFilesT = {\r\n documentTopicID: number\r\n fileList: {\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n subTopicPageList?: any\r\n}\r\n\r\nexport type FormT = {\r\n nameTH: string\r\n nameEN: string\r\n mobilePhone?: string\r\n email: string\r\n reason: string\r\n files: { uploadFileObj: InitFilesT }[]\r\n status: string\r\n reasonReject?: string\r\n result?: string\r\n departments?: string\r\n departments_en?: string\r\n langReason?: string\r\n}\r\n\r\nexport type ApproveT = {\r\n email?: string\r\n nameTH?: string\r\n nameEN?: string\r\n updateBy: string\r\n statusID: number\r\n reasonReject: string\r\n departments?: string\r\n departments_en?: string\r\n langReason?: string\r\n}\r\nconst useApproveExReseacher = () => {\r\n const t = useTranslate()\r\n const callApi = useCallApi()\r\n\r\n const put = async (values: ApproveT, userID: string) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServinceURL.putResultExResearcher}/${userID}`,\r\n params: { ...values, subject: t.get('UM.APPROVE-RESEARCHER.SUBJECT_MAIL') },\r\n })\r\n\r\n return data\r\n }\r\n\r\n const formatFile = (files: { uploadFileObj: InitFilesT }[]) => {\r\n const formatLink = files.map((item) => {\r\n const fileList = item.uploadFileObj.fileList.map((itemList) => ({\r\n ...itemList,\r\n path: `${process.env.REACT_APP_UPLOAD}${itemList.path}`,\r\n }))\r\n\r\n item.uploadFileObj.fileList = fileList\r\n\r\n return item\r\n })\r\n\r\n return formatLink\r\n }\r\n\r\n const get = async (userID: string) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${umServinceURL.getRequestExResearcher}/${userID}`,\r\n })\r\n\r\n const format = {\r\n userID: data.userID,\r\n nameTH: data.nameTH,\r\n nameEN: data.nameEN,\r\n mobilePhone: data.mobilePhone,\r\n email: data.username,\r\n reason: data.reason,\r\n status: `${data.statusID}`,\r\n reasonReject: data.reasonReject,\r\n files: formatFile(data.uploadFile),\r\n departments: data.departments,\r\n departments_en: data.departments_en,\r\n }\r\n\r\n return format\r\n }\r\n\r\n return { put, get }\r\n}\r\n\r\nexport default useApproveExReseacher\r\n","import { useState } from 'react'\r\nimport { Grid, Typography } from '@material-ui/core'\r\nimport Radio from '../../../control/radio/radio'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { useForm } from 'react-final-form'\r\n\r\nconst Approve = () => {\r\n const translate = useTranslate()\r\n const form = useForm()\r\n\r\n const [reject, setReject] = useState(false)\r\n\r\n const onChangeResult = (value: string) => {\r\n if (value === '2') {\r\n setReject(false)\r\n if (form.getFieldState('reasonReject')?.value || form.getFieldState('langReason')?.value) {\r\n form.change('reasonReject', null)\r\n form.change('langReason', 'th')\r\n }\r\n } else setReject(true)\r\n }\r\n\r\n const caseReject = () => {\r\n if (reject) {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {translate.get('UM.APPROVE-RESEARCHER.RESULT')}\r\n \r\n \r\n \r\n \r\n \r\n\r\n {caseReject()}\r\n \r\n )\r\n}\r\n\r\nexport default Approve\r\n","import { FC } from 'react'\r\nimport { Grid, Typography } from '@material-ui/core'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport UploadDocFile from '../../web/shareUI/uploadDoc/UploadDocFile'\r\nimport { InitFilesT } from '../../../services/um/useApproveExResearcher'\r\n\r\ninterface InformationProps {\r\n initFiles: { uploadFileObj: InitFilesT }[]\r\n}\r\nconst Information: FC = ({ initFiles }) => {\r\n const translate = useTranslate()\r\n const topicInitial = [\r\n {\r\n id: 99,\r\n no: '',\r\n name_th: 'โครงการวิจัยและเอกสารที่เกี่ยวข้อง',\r\n name_en: 'Research projects and related documents',\r\n code: '',\r\n subtopic: [],\r\n },\r\n ]\r\n return (\r\n \r\n \r\n \r\n {translate.get('UM.APPROVE-RESEARCHER.USER-TITLE')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {translate.get('UM.APPROVE-RESEARCHER.REASON-TITLE')}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {translate.get('UM.APPROVE-RESEARCHER.FILES')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default Information\r\n","import { FC } from 'react'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { AnyObject, Form as FinalForm } from 'react-final-form'\r\nimport { Button, Grid, makeStyles, Paper } from '@material-ui/core'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nimport Approve from './Approve'\r\nimport Information from './Infomation'\r\nimport { FormT } from '../../../services/um/useApproveExResearcher'\r\n\r\ntype Submit = (\r\n event?: Partial>,\r\n) => Promise | undefined\r\ninterface FormProps {\r\n onSubmit: (values: FormT) => void\r\n onBack: () => void\r\n initial: FormT\r\n}\r\n\r\nconst Form: FC = ({ onSubmit, onBack, initial }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n\r\n const renderApproveForm = () => {\r\n if (initial.status === '1') {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n }\r\n\r\n const renderButton = (handleSubmit: Submit) => {\r\n if (initial.status === '1') {\r\n return (\r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n )\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {({ handleSubmit }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {renderApproveForm()}\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n {renderButton(handleSubmit)}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paper: {\r\n width: '100%',\r\n margin: '1rem 0px 1.5rem',\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'unset',\r\n boxShadow: 'unset',\r\n },\r\n },\r\n container: {\r\n padding: '1.5rem',\r\n },\r\n containerBT: {\r\n justifyContent: 'flex-end',\r\n [theme.breakpoints.down('sm')]: {\r\n justifyContent: 'center',\r\n },\r\n },\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n },\r\n saveButton: {\r\n border: 'solid 1px #db5f8e',\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n },\r\n}))\r\n\r\nexport default Form\r\n","import { Grid, makeStyles } from '@material-ui/core'\r\nimport { FC } from 'react'\r\n\r\nimport ErrorIcon from '@material-ui/icons/Error'\r\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\ninterface StatusBarProps {\r\n id: string\r\n reason?: string\r\n}\r\nconst StatusBar: FC = ({ id, reason }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n\r\n const chooseClass = (status: string) => {\r\n switch (status) {\r\n case '2':\r\n return classes.approved\r\n case '3':\r\n return classes.reject\r\n\r\n default:\r\n break\r\n }\r\n }\r\n\r\n const chooseWord = (status: string) => {\r\n switch (status) {\r\n case '2':\r\n return (\r\n \r\n \r\n {translate.get('UM.APPROVE-RESEARCHER.APPROVED')}\r\n \r\n )\r\n case '3':\r\n return (\r\n \r\n \r\n {translate.get('UM.APPROVE-RESEARCHER.REJECTED')} {reason}\r\n \r\n )\r\n\r\n default:\r\n break\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {chooseWord(id)}\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n approved: {\r\n padding: '1rem',\r\n margin: '1rem',\r\n borderRadius: '5px',\r\n backgroundColor: '#58e68754',\r\n },\r\n reject: {\r\n padding: '1rem',\r\n margin: '1rem',\r\n borderRadius: '5px',\r\n backgroundColor: '#e6585854',\r\n },\r\n}))\r\n\r\nexport default StatusBar\r\n","import { useState, useRef, useEffect } from 'react'\r\nimport { useHistory, useParams } from 'react-router-dom'\r\nimport { Grid, Container, Typography } from '@material-ui/core'\r\n\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport useLoading from '../control/loading/useLoading'\r\n\r\nimport useApproveExReseacher, { FormT } from '../services/um/useApproveExResearcher'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\n\r\nimport Form from '../component/um/approve-external-researcher/Form'\r\nimport StatusBar from '../component/um/approve-external-researcher/StatusBar'\r\nimport { decryptionAES } from '../utilities/encryption'\r\n\r\nconst ApproveExResearcher = () => {\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const params = useParams<{ id: string }>()\r\n const { get, put } = useApproveExReseacher()\r\n const loadingHook = useLoading()\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n const [init, setInit] = useState()\r\n\r\n useEffect(() => {\r\n fetch()\r\n }, [])\r\n\r\n const fetch = async () => {\r\n const result = await get(decryptionAES(params.id))\r\n\r\n if (result.userID) {\r\n setInit(result)\r\n }\r\n }\r\n\r\n const save = async (values: FormT) => {\r\n loadingHook.loadingOpen()\r\n const result = await put(\r\n {\r\n email: values.email,\r\n nameTH: values.nameTH,\r\n nameEN: values.nameEN,\r\n statusID: Number(values.result || 1),\r\n updateBy: String(authenStore.profile.userId),\r\n reasonReject: values.reasonReject ?? '',\r\n departments: values.departments,\r\n langReason: values.result === '2' ? '' : values.langReason,\r\n },\r\n decryptionAES(params.id),\r\n )\r\n\r\n if (result.message === 'success') {\r\n loadingHook.loadingClose()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: onBack,\r\n })\r\n }\r\n\r\n if (result.message !== 'success') {\r\n loadingHook.loadingClose()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const onSubmit = (values: FormT) => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => save(values),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onBack = () => {\r\n history.goBack()\r\n }\r\n\r\n const renderForm = () => {\r\n if (init) {\r\n return (\r\n <>\r\n \r\n
\r\n \r\n )\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {translate.get('UM.APPROVE-RESEARCHER.MENU')}\r\n \r\n {renderForm()}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default ApproveExResearcher\r\n","import React from 'react'\r\nimport useCallApi from '../../utilities/axios'\r\nimport * as umServinceURL from './umServiceURL'\r\nimport useTranslate from '../../i18n/useTranslate'\r\n\r\nexport type FormParam = {\r\n email: string\r\n}\r\n\r\nconst usePreferenceForgotPassword = () => {\r\n const callApi = useCallApi()\r\n const t = useTranslate()\r\n\r\n const postPreferencesForgotPassword = async (email: string) => {\r\n const { data } = await callApi.axiosPost({\r\n url: umServinceURL.postPreferencesForgotPassword,\r\n authorizationType: 'authorization',\r\n params: {\r\n subject: t.get('UM.FORGOTPASSWORD.SUBJECT_SEND_EMAI'),\r\n email: email,\r\n },\r\n })\r\n return data\r\n }\r\n\r\n return {\r\n postPreferencesForgotPassword,\r\n }\r\n}\r\n\r\nexport default usePreferenceForgotPassword\r\n","import { useRef, useState } from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { Form as FinalForm, FormRenderProps } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useRouter from '../../../router/useRouter'\r\nimport { RoutePath } from '../../../router/routesConfig'\r\nimport Button from '../../../control/button/button'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport usePreferenceForgotPassword, { FormParam } from '../../../services/um/usePreferenceForgotPassword'\r\nimport Dialog, { DialogType } from '../../../control/dialog/dialog'\r\nimport { validateEmail } from '../../../utilities/validate'\r\nimport { spellWord } from '../../../utilities/email'\r\n\r\nconst Form = () => {\r\n const classes = useStyles()\r\n const router = useRouter()\r\n const t = useTranslate()\r\n const dialogTwoRef = useRef>()\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const { postPreferencesForgotPassword } = usePreferenceForgotPassword()\r\n\r\n const formPropsRef = useRef()\r\n\r\n const onFormProps = (func: FormRenderProps) => {\r\n formPropsRef.current = func\r\n }\r\n\r\n const validateForm = (values: FormParam) => {\r\n const errors: any = {}\r\n if (!values.email) {\r\n errors.email = t.get('MESSAGE.M017')\r\n }\r\n return errors\r\n }\r\n\r\n const handleClickLogin = () => {\r\n router.goTo(RoutePath.login)\r\n }\r\n\r\n const handleClickSubmit = async (value: FormParam) => {\r\n const emailValue = value?.email?.trim() ?? null\r\n if (emailValue && emailValue.length > 0) {\r\n const result = await postPreferencesForgotPassword(value.email)\r\n if (result.cu_net === true) {\r\n setConfigDialog({\r\n title: t.get('ALERT.TITLE.NOTIFICATION'),\r\n content: t.get('ALERT.CONTENT.USER_CUNET'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => handleClickLogin(),\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n return\r\n } else if (result?.id) {\r\n setConfigDialog({\r\n title: t.get('UM.FORGOTPASSWORD.FORGOT_PASS_WORD'),\r\n content: t.get('MESSAGE.M018'),\r\n type: 'alert-message',\r\n onAfterClose: () => handleClickLogin(),\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n setConfigDialog({\r\n title: t.get('UM.FORGOTPASSWORD.FORGOT_PASS_WORD'),\r\n content: t.get('MESSAGE.M021'),\r\n type: 'alert-message',\r\n onAfterClose: () => handleClickLogin(),\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {t.get('UM.FORGOTPASSWORD.FORGOT_PASS_WORD')}\r\n \r\n \r\n \r\n {(props: FormRenderProps) => {\r\n onFormProps(props)\r\n return (\r\n \r\n \r\n {\r\n const result = spellWord(valueEmail)\r\n props.form.change('email', result)\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {t.get('UM.FORGOTPASSWORD.LOGIN')}\r\n \r\n \r\n \r\n \r\n {t.get('UM.FORGOTPASSWORD.OK')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '667px',\r\n padding: '48px',\r\n },\r\n typo: {\r\n fontWeight: 'bold',\r\n },\r\n login: {\r\n cursor: 'pointer',\r\n textDecoration: 'underline',\r\n color: '#0022FF',\r\n },\r\n title: {\r\n margin: '16px 0px',\r\n },\r\n}))\r\n\r\nexport default Form\r\n","import LayoutPublic from '../component/web/layout/layoutPublic'\r\nimport FormComponent from '../component/um/forgot-password/Form'\r\nimport Container from '@material-ui/core/Container'\r\nimport { Grid, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport useTranslate from '../i18n/useTranslate'\r\n\r\nconst ForgotPassword = () => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n\r\n return (\r\n <>\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {translate.get('UM.FORGOTPASSWORD.HEADER')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n rootContainer: {\r\n minHeight: 'calc(100vh - 96px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n [theme.breakpoints.down('sm')]: {\r\n margin: '0px',\r\n padding: '0px',\r\n },\r\n },\r\n root: {\r\n width: '100%',\r\n [theme.breakpoints.down('sm')]: {\r\n height: '100%',\r\n },\r\n },\r\n item: {\r\n [theme.breakpoints.down('sm')]: {\r\n height: '100%',\r\n },\r\n },\r\n paper: {\r\n width: '100%',\r\n\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'transparent',\r\n boxShadow: 'none',\r\n },\r\n },\r\n container: {\r\n padding: '1.5rem',\r\n },\r\n typo: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default ForgotPassword\r\n","import { useState, useEffect } from 'react'\r\nimport useCallApi from '../../../utilities/axios'\r\nimport * as umServinceURL from '../umServiceURL'\r\n\r\ntype Lookup = {\r\n id: number\r\n name_th: string\r\n name_en: string\r\n}\r\n\r\nconst useUserGroup = () => {\r\n const callApi = useCallApi()\r\n const [userGroup, setUserGroup] = useState([])\r\n\r\n useEffect(() => {\r\n getLookup()\r\n }, [])\r\n\r\n const getLookup = async () => {\r\n try {\r\n const { data } = await callApi.axiosGet({\r\n url: umServinceURL.getLookupUserGroup,\r\n })\r\n setUserGroup(data.result as Lookup[])\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n\r\n return { userGroup }\r\n}\r\n\r\nexport default useUserGroup\r\n","import { Form } from 'react-final-form'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { Grid } from '@material-ui/core'\r\nimport Button from '../../../control/button/button'\r\n\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\n\r\nimport Select from '../../../control/select/select'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useUserGroup from '../../../services/um/lookups/useUsergroup'\r\nimport ConstantUserGroup from '../../../constants/userGroup'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\n\r\ninterface Props {\r\n initialValues?: any\r\n onSearch: (values: any) => void\r\n onReset: () => void\r\n onEnter: (values: any) => void\r\n}\r\n\r\nconst Panel: React.FC = ({ initialValues, onSearch, onReset, onEnter }) => {\r\n const classes = useStyles()\r\n const t = useTranslate()\r\n const { userGroup } = useUserGroup()\r\n const authenStore = useAuthenStore()\r\n const groupID = authenStore.profile.userGroupId\r\n\r\n const lang = t.languageStore.currentLanguage as 'th' | 'en'\r\n const lutUserGroup = userGroup\r\n .map((item) => ({\r\n value: item.id.toString(),\r\n label: lang === 'en' ? item.name_en : item.name_th,\r\n }))\r\n .filter((item) => {\r\n if (groupID === ConstantUserGroup.researcher) {\r\n //ถ้า user เป็นนักวิจัยดูได้\r\n return item\r\n } else {\r\n //เจ้าหน้าที่เพิ่มนักวิจัยไม่ได้ ต้องสมัครมาเอง\r\n return item.value !== ConstantUserGroup.researcher.toString() && item\r\n }\r\n })\r\n\r\n return (\r\n \r\n {({ handleSubmit, form, values }) => (\r\n \r\n \r\n \r\n onEnter(values)}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n const param = {\r\n usergroupID: null,\r\n keyword: null,\r\n }\r\n form.initialize(param)\r\n onReset()\r\n }}\r\n className={classes.btnSearch}\r\n >\r\n {t.get('BUTTON.RESET')}\r\n \r\n \r\n \r\n \r\n {t.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n padding: theme.spacing(3),\r\n border: '1px solid #bdbdbd',\r\n borderRadius: 4,\r\n },\r\n action: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n alignItems: 'center',\r\n },\r\n button: {\r\n marginLeft: theme.spacing(2),\r\n },\r\n\r\n root: {\r\n padding: '15px',\r\n },\r\n btnSearch: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n },\r\n}))\r\n\r\nexport default Panel\r\n","import { useHistory } from 'react-router-dom'\r\n\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { Paper } from '@material-ui/core'\r\nimport { ButtonView } from '../../../control/button/button'\r\n\r\ninterface Props {\r\n id: number\r\n fullName: string\r\n username: string\r\n group: string\r\n usergroup: string\r\n statusID: number\r\n irb: number\r\n updateDate: string\r\n onDelete: (userID: string | number) => void\r\n}\r\n\r\nconst Item: React.FC = ({ id, fullName, username, usergroup, onDelete }) => {\r\n const classes = useStyles()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const onEdit = () => {\r\n history.push(`/officer/${id}/edit`)\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.EDIT')}\r\n \r\n \r\n \r\n onDelete(id)}>\r\n {translate.get('BUTTON.DELETE')}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.USERGROUP.FULLNAME')}\r\n \r\n \r\n \r\n {fullName}\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.USERGROUP.USERNAME')}\r\n \r\n \r\n \r\n {username}\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.USERGROUP.OFFICER.USERGROUP-LABEL')}\r\n \r\n \r\n \r\n {usergroup}\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n item: {\r\n width: '100%',\r\n padding: theme.spacing(3),\r\n margin: theme.spacing(2, 0),\r\n '&:hover': {\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n },\r\n icon: {\r\n marginRight: theme.spacing(1),\r\n width: 40,\r\n height: 40,\r\n backgroundColor: '#ece9e9',\r\n transition: '0.3s',\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n },\r\n recentTime: {\r\n position: 'absolute',\r\n top: 2,\r\n right: 4,\r\n color: 'grey',\r\n },\r\n\r\n header: {\r\n fontWeight: 'bold',\r\n },\r\n btnEdit: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n height: '44px',\r\n marginRight: '1px',\r\n },\r\n btnDelete: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n height: '44px',\r\n marginRight: '1px',\r\n backgroundColor: theme.palette.secondary.main,\r\n color: theme.palette.background.default,\r\n '&:hover': {\r\n backgroundColor: theme.palette.secondary.main,\r\n },\r\n },\r\n multiLineEllipsis: {\r\n maxWidth: '100%',\r\n whiteSpace: 'pre-wrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n display: '-webkit-box',\r\n '-webkit-line-clamp': 1,\r\n '-webkit-box-orient': 'vertical',\r\n },\r\n}))\r\n\r\nexport default Item\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\ninterface Props {\r\n isEmpty: boolean\r\n}\r\n\r\nconst EmptyData: React.FC = ({ children, isEmpty }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n\r\n return isEmpty ? (\r\n \r\n {translate.get('UM.USERGROUP.EMPTY-CONTENT')}\r\n \r\n ) : (\r\n <>{children}\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n empty: {\r\n padding: theme.spacing(1),\r\n height: '100%',\r\n // borderRadius: 4,\r\n // border: '1px solid #bdbdbd',\r\n },\r\n}))\r\n\r\nexport default EmptyData\r\n","import isEmpty from 'lodash/isEmpty'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { useHistory } from 'react-router-dom'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport Button from '@material-ui/core/Button'\r\nimport AddIcon from '@material-ui/icons/Add'\r\n\r\nimport Item from './Item'\r\nimport EmptyData from './EmptyData'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { Officer, Order } from '../../../services/um/useSearchOfficer'\r\n\r\ninterface Props {\r\n order: Order\r\n officers: Officer[]\r\n onDelete: (userID: number | string) => void\r\n onSort: (value: Order) => void\r\n}\r\n\r\nconst Result: React.FC = ({ officers, onDelete, onSort, order }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const history = useHistory()\r\n\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n // const handleChange = (event: React.ChangeEvent<{ value: any }>) => {\r\n // onSort(event.target.value)\r\n // }\r\n\r\n const GotoAddOfficer = () => {\r\n history.push('/officer/add')\r\n }\r\n\r\n const getFullName = (officerItem: typeof officers[0]) => {\r\n let name = officerItem.fullnameTH\r\n if (translate.languageStore.currentLanguage === translate.languageKey.en) {\r\n name = officerItem.fullnameEN\r\n }\r\n return name\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${officers.length}`])}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n \r\n {translate.get('UM.USERGROUP.ADD-BUTTON-LABEL')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* \r\n \r\n {translate.get('UM.USERGROUP.SORTING-LABEL')}\r\n \r\n \r\n \r\n {sorts.map((item) => (\r\n {item.label[lang]}\r\n ))}\r\n \r\n \r\n */}\r\n \r\n \r\n {officers.map((officer) => {\r\n // const newData = {\r\n // ...officer,\r\n // title: officer.title.name,\r\n // name: { th: officer.nameTH, en: officer.nameEN },\r\n // academicPosition: { th: officer.position.name.th, en: officer.position.name.en },\r\n // titleID: officer.title.id,\r\n // }\r\n\r\n return (\r\n \r\n )\r\n })}\r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n margin: theme.spacing(2, 0),\r\n },\r\n typo: {\r\n fontWeight: 'bold',\r\n },\r\n sorting: {\r\n margin: theme.spacing(2, 0),\r\n },\r\n select: {\r\n height: 40,\r\n },\r\n}))\r\n\r\nexport default Result\r\n","import { useState, useRef } from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport Container from '@material-ui/core/Container'\r\nimport orderBy from 'lodash/orderBy'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport { useQueryParam } from 'use-query-params'\r\n\r\nimport Panel from '../component/um/officer/Panel'\r\nimport Result from '../component/um/officer/Result'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\n\r\nimport { useSearchOfficer, Keyword, Order } from '../services/um/useSearchOfficer'\r\nimport { useDeleteOfficer } from '../services/um/useDeleteOfficer'\r\nimport { Grid } from '@material-ui/core'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\n\r\nconst Member = () => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const { deleteOfficer } = useDeleteOfficer()\r\n const { officers, setOfficers, searchOfficers } = useSearchOfficer()\r\n const [keyword, setKeyword] = useQueryParam('keyword')\r\n const [usergroupID, setUsergroupID] = useQueryParam('usergroup')\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n const [order, setOrder] = useState('desc')\r\n\r\n const onSearch = (values: Keyword) => {\r\n setKeyword(values.keyword)\r\n setUsergroupID(values.usergroupID)\r\n searchOfficers(values, order)\r\n }\r\n\r\n const onSort = (value: Order) => {\r\n const newOfficers = orderBy(officers, ['updatedDate', 'createdDate'], [order])\r\n setOrder(value)\r\n setOfficers(newOfficers)\r\n }\r\n\r\n const onReset = () => {\r\n searchOfficers()\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const onDelete = (userID: number | string) => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('UM.USERGROUP.DELETE-ALERT-CONTENT'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => confirmDelete(userID),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const confirmDelete = async (userID: string | number) => {\r\n const { result } = await deleteOfficer(userID)\r\n\r\n if (result?.message == 'success') {\r\n searchOfficers()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.DELETE_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n }\r\n\r\n const handleEnter = (values: Keyword) => {\r\n onSearch(values)\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n typo: {\r\n fontWeight: 'bold',\r\n },\r\n paper: {\r\n padding: theme.spacing(2),\r\n },\r\n title: {\r\n marginBottom: '0px',\r\n },\r\n}))\r\n\r\nexport default Member\r\n","import useCallApi from '../../utilities/axios'\r\n\r\nexport function useDeleteOfficer() {\r\n const callApi = useCallApi()\r\n\r\n const deleteOfficer = async (userID: number | string) => {\r\n try {\r\n const { data } = await callApi.axiosDelete({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/users/officer/${userID}`,\r\n // params: null,\r\n })\r\n return { result: data }\r\n } catch (error) {\r\n return { error }\r\n }\r\n }\r\n\r\n return { deleteOfficer }\r\n}\r\n","import { useState, useEffect, useCallback } from 'react'\r\nimport useAuthenStore from '../../stores/authen/authenStore'\r\n\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nexport type Keyword = {\r\n keyword: string\r\n irb: string\r\n usergroupID: string\r\n}\r\n\r\nexport type Officer = {\r\n userID: number\r\n username: string\r\n nameTH: string\r\n nameEN: string\r\n fullnameEN: string\r\n fullnameTH: string\r\n mobilePhone: string\r\n email: string\r\n irb: number\r\n updatedDate: string\r\n createdDate: string\r\n title: {\r\n id: number\r\n name: Translation\r\n otherName: Translation\r\n }\r\n position: {\r\n id: number\r\n name: Translation\r\n otherName: Translation\r\n }\r\n isPhD: boolean\r\n status: {\r\n id: number\r\n name: Translation\r\n }\r\n usergroup: {\r\n id: number\r\n name: Translation\r\n }\r\n}\r\n\r\ntype Translation = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport type Order = 'desc' | 'asc'\r\n\r\nexport const useSearchOfficer = () => {\r\n const authenStore = useAuthenStore()\r\n const [officers, setOfficers] = useState([])\r\n\r\n const callApi = useCallApi()\r\n\r\n const searchOfficers = useCallback(\r\n async (values?: Keyword, orderyBy?: Order) => {\r\n // if (authenStore?.profile?.irb) {\r\n const { data } = await callApi.axiosPost({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/users/search/officer`,\r\n params: { ...values, irb: authenStore.profile.irb, orderyBy },\r\n })\r\n setOfficers(data)\r\n // }\r\n },\r\n [authenStore.profile.irb],\r\n )\r\n\r\n useEffect(() => {\r\n searchOfficers()\r\n }, [searchOfficers])\r\n\r\n return {\r\n officers,\r\n setOfficers,\r\n searchOfficers,\r\n }\r\n}\r\n","import { useState, useEffect } from 'react'\r\nimport useCallApi from '../../../utilities/axios'\r\nimport * as umServinceURL from '../umServiceURL'\r\n\r\nconst useTitleName = () => {\r\n const callApi = useCallApi()\r\n const [state, setState] = useState([])\r\n\r\n useEffect(() => {\r\n getLookup()\r\n }, [])\r\n\r\n const getLookup = async () => {\r\n try {\r\n const { data } = await callApi.axiosGet({\r\n url: umServinceURL.getLookupTitle,\r\n })\r\n setState(data.result)\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n\r\n return { state }\r\n}\r\n\r\nexport default useTitleName\r\n","import { useState, useEffect } from 'react'\r\nimport useCallApi from '../../../utilities/axios'\r\nimport * as umServinceURL from '../umServiceURL'\r\n\r\ntype Lookup = {\r\n id: number\r\n name_th: string\r\n name_en: string\r\n}\r\n\r\nconst useUsergroupFilterREC = () => {\r\n const callApi = useCallApi()\r\n const [usergroupFilterREC, setUsergroupFilterREC] = useState([])\r\n\r\n useEffect(() => {\r\n getLookup()\r\n }, [])\r\n\r\n const getLookup = async () => {\r\n try {\r\n const { data } = await callApi.axiosGet({\r\n url: umServinceURL.getLookupUserGroupFilterByREC,\r\n })\r\n setUsergroupFilterREC(data.result as Lookup[])\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n\r\n return { usergroupFilterREC }\r\n}\r\n\r\nexport default useUsergroupFilterREC\r\n","import { useState, useEffect } from 'react'\r\nimport useCallApi from '../../../utilities/axios'\r\nimport * as umServinceURL from '../umServiceURL'\r\n\r\nconst useGroup = () => {\r\n const callApi = useCallApi()\r\n const [group, setGroup] = useState([])\r\n\r\n useEffect(() => {\r\n getLookup()\r\n }, [])\r\n\r\n const getLookup = async () => {\r\n try {\r\n const { data } = await callApi.axiosGet({\r\n url: umServinceURL.getLookupGroup,\r\n })\r\n setGroup(data.result)\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n\r\n return { group }\r\n}\r\n\r\nexport default useGroup\r\n","import { useState, useEffect } from 'react'\r\nimport useCallApi from '../../../utilities/axios'\r\nimport * as umServinceURL from '../umServiceURL'\r\n\r\nconst usePosition = () => {\r\n const callApi = useCallApi()\r\n const [position, setPosition] = useState([])\r\n\r\n useEffect(() => {\r\n getLookup()\r\n }, [])\r\n\r\n const getLookup = async () => {\r\n try {\r\n const { data } = await callApi.axiosGet({\r\n url: umServinceURL.getLookupPosition,\r\n })\r\n setPosition(data.result)\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n\r\n return { position }\r\n}\r\n\r\nexport default usePosition\r\n","import React from 'react'\r\nimport { useField, FieldRenderProps } from 'react-final-form'\r\n\r\nimport { FieldSubscription } from 'final-form'\r\n\r\ntype FieldObservableType = {\r\n name: string\r\n subscription?: FieldSubscription\r\n children: (field: FieldRenderProps) => React.ReactNode | void\r\n}\r\n\r\nconst FieldObservable = ({\r\n children,\r\n name,\r\n subscription,\r\n}: FieldObservableType): React.ReactElement => {\r\n const field = useField(name, { subscription })\r\n return <>{children(field)}\r\n}\r\n\r\nexport default FieldObservable\r\n","import { useEffect, useState } from 'react'\r\nimport useCallApi from '../../utilities/axios'\r\nimport * as umServiceURL from './umServiceURL'\r\n\r\nexport type UplodeFileDocType = {\r\n uploadFileObj: {\r\n fileList: {\r\n replaceFileID: number | null\r\n fileID: number | null\r\n fileToken: string | null\r\n filename: string | null\r\n path: string\r\n date: string\r\n }[]\r\n }\r\n}\r\n\r\nexport type FormType = {\r\n username: string\r\n password: string\r\n nameTH: string\r\n nameEN: string\r\n homeTelephone: string\r\n mobilePhone: string\r\n usergroupID: number\r\n title: lookUps\r\n position: lookUps\r\n irb: number\r\n isPhD: boolean\r\n cunet: boolean\r\n titleOtherTH?: string\r\n titleOtherEN?: string\r\n titleID?: string\r\n positionOtherTH?: string\r\n positionOtherEN?: string\r\n positionID?: string\r\n cunetID?: string\r\n personnelId?: string\r\n isBothIrb: boolean\r\n documentInfo: UplodeFileDocType[]\r\n updateBy: string\r\n}\r\n\r\nexport type FormInitial = {\r\n username?: string\r\n nameTH?: string\r\n nameEN?: string\r\n homePhone?: string\r\n homeTelephone?: string\r\n mobilePhone?: string\r\n usergroupID?: number\r\n irb?: number | null\r\n isPhD?: boolean\r\n cunet?: string\r\n titleID?: string\r\n positionID?: string\r\n cunetID?: string\r\n positionOtherTH?: string\r\n positionOtherEN?: string\r\n titleOtherTH?: string\r\n titleOtherEN?: string\r\n title?: lookUps\r\n position?: lookUps\r\n signatureTH: string | null\r\n signatureEN: string | null\r\n isBothIrb: boolean\r\n documentInfo: UplodeFileDocType[]\r\n updateBy: string\r\n}\r\n\r\ntype lookUps = {\r\n id?: number | string\r\n name: {\r\n th?: string\r\n en?: string\r\n }\r\n}\r\n\r\nconst useEditUsergroup = (id: string) => {\r\n const callApi = useCallApi()\r\n const [officerInfo, setOfficer] = useState()\r\n\r\n useEffect(() => {\r\n if (id !== 'undefined') {\r\n getOfficer(id)\r\n }\r\n }, [])\r\n const putOfficer = async (values: FormType, userID: string) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServiceURL.postAddOfficer}/${userID}`,\r\n params: values,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getOfficer = async (userID: string) => {\r\n const { data } = await callApi.axiosGet({\r\n // url: `${umServiceURL.getAddOfficer}/${userID}`,\r\n url: `${umServiceURL.getUserInfo}/${userID}`,\r\n })\r\n setOfficer(data)\r\n return data\r\n }\r\n\r\n return { putOfficer, officerInfo }\r\n}\r\n\r\nexport default useEditUsergroup\r\n","import { useRef } from 'react'\r\nimport { useField } from 'react-final-form'\r\nimport { FieldValidator } from 'final-form'\r\nimport { UseUploadImageType } from './uploadImageType'\r\nimport { composeValidators, uploadRequired } from '../../utilities/validate'\r\nimport useTranslate from '../../i18n/useTranslate'\r\n\r\nconst useUploadImage = (props: UseUploadImageType) => {\r\n const translate = useTranslate()\r\n const refElementUpload = useRef()\r\n const refElementHelperText = useRef()\r\n\r\n const { required, validates = [], name } = props\r\n\r\n const handleClickUpload = () => {\r\n refElementUpload.current.click()\r\n }\r\n\r\n const handleChangeUpload = (event: React.ChangeEvent) => {\r\n props.onChange(event)\r\n }\r\n\r\n const mergeValidate = () => {\r\n let validate: Array> = []\r\n if (typeof required === 'boolean' && required) {\r\n validate = [uploadRequired(`${translate.get('UM.UPLOAD.REQUIRED')}`), ...validates]\r\n }\r\n\r\n return validate\r\n }\r\n\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate()),\r\n })\r\n\r\n return {\r\n refElementUpload,\r\n refElementHelperText,\r\n onClickUpload: handleClickUpload,\r\n onChangeUpload: handleChangeUpload,\r\n field,\r\n }\r\n}\r\n\r\nexport default useUploadImage\r\n","import React from 'react'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport Button from '@material-ui/core/Button'\r\nimport FormControl from '@material-ui/core/FormControl'\r\nimport FormHelperText from '@material-ui/core/FormHelperText'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { UploadImageViewType, UseUploadImageType } from './uploadImageType'\r\nimport useUploadImage from './useUploadImage'\r\nimport useTranslate from '../../i18n/useTranslate'\r\n\r\nconst UploadImageView = (props: UploadImageViewType) => {\r\n const {\r\n name,\r\n label,\r\n labelTitle,\r\n refElementUpload,\r\n onClickUpload,\r\n onChangeUpload,\r\n color,\r\n required = false,\r\n disabled = false,\r\n field: { meta },\r\n } = props\r\n const isError = !disabled && meta.error && meta.touched ? true : false\r\n const classes = useStyles(isError)\r\n const t = useTranslate()\r\n const buttonColor = color ? color : 'default'\r\n\r\n return (\r\n \r\n
\r\n \r\n {label}\r\n \r\n \r\n {required && ' *'}\r\n \r\n
\r\n \r\n \r\n {isError && meta.error}\r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nconst UploadImage = (props: UseUploadImageType) => {\r\n const useUploadImageModel = useUploadImage(props)\r\n return \r\n}\r\n\r\nexport default UploadImage\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n label: {\r\n marginBottom: 10,\r\n },\r\n}))\r\n","export const convertPathToNameImg = (path: string) => {\r\n if (path) {\r\n let startIndex = path.indexOf('\\\\') >= 0 ? path.lastIndexOf('\\\\') : path.lastIndexOf('/')\r\n let filename = path.substring(startIndex)\r\n if (filename.indexOf('\\\\') === 0 || filename.indexOf('/') === 0) {\r\n return filename.substring(1)\r\n }\r\n }\r\n}\r\n","import { Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { FC, useState, useEffect } from 'react'\r\nimport UploadImage from '../../../control/uploadImage/uploadImage'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useWebService from '../../../services/web/useWebService'\r\n\r\nimport { LanguageType } from '../../../services/um/useAddUsergroup'\r\nimport { convertPathToNameImg } from '../../../utilities/pathImg'\r\n\r\ninterface UploadLogoProps {\r\n initialValue?: any\r\n form: any\r\n}\r\nconst UploadLogo: FC = ({ initialValue, form }) => {\r\n const translate = useTranslate()\r\n const classes = usestyles()\r\n\r\n const callWebService = useWebService()\r\n const [temp, setTemp] = useState<{\r\n signatureTH: string | null\r\n signatureEN: string | null\r\n name_th: string | null\r\n name_en: string | null\r\n }>({\r\n signatureTH: null,\r\n signatureEN: null,\r\n name_th: null,\r\n name_en: null,\r\n })\r\n\r\n useEffect(() => {\r\n setTemp({\r\n signatureTH: initialValue?.signatureTH\r\n ? `${process.env.REACT_APP_UPLOAD}${initialValue?.signatureTH}`\r\n : null,\r\n signatureEN: initialValue?.signatureEN\r\n ? `${process.env.REACT_APP_UPLOAD}${initialValue?.signatureEN}`\r\n : null,\r\n name_th: convertPathToNameImg(initialValue?.signatureTH) || null,\r\n name_en: convertPathToNameImg(initialValue?.signatureEN) || null,\r\n })\r\n }, [])\r\n\r\n const onUpload = async (event: React.ChangeEvent, language: LanguageType) => {\r\n const file = event.target.files?.[0]\r\n const formDataImage = new FormData()\r\n if (file) {\r\n formDataImage.append('files', file)\r\n\r\n const { result } = await callWebService.uploadFileTemp(formDataImage)\r\n\r\n if (result.length > 0) {\r\n if (language === 'th') {\r\n setTemp({ ...temp, signatureTH: result[0].path, name_th: result[0].filename })\r\n form.change('signatureTH', result)\r\n } else {\r\n setTemp({ ...temp, signatureEN: result[0].path, name_en: result[0].filename })\r\n form.change('signatureEN', result)\r\n }\r\n }\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {translate.get('UM.UPLOAD.SIGNATURE_TH')}\r\n \r\n \r\n \r\n {temp.name_th ? temp.name_th : ''}\r\n \r\n \r\n onUpload(event, 'th')}\r\n color={'primary'}\r\n labelTitle={translate.get('BUTTON.UPLOAD')}\r\n />\r\n \r\n \r\n \r\n \r\n {translate.get('UM.UPLOAD.SIGNATURE_EN')}\r\n \r\n\r\n \r\n \r\n {temp.name_en ? temp.name_en : ''}\r\n \r\n \r\n onUpload(event, 'en')}\r\n color={'primary'}\r\n labelTitle={translate.get('BUTTON.UPLOAD')}\r\n />\r\n \r\n \r\n \r\n \r\n )\r\n}\r\nexport default UploadLogo\r\n\r\nconst usestyles = makeStyles((theme) => ({\r\n image: {\r\n display: 'flex',\r\n margin: '15px auto',\r\n objectFit: 'contain',\r\n },\r\n container: {\r\n padding: '8px 15px',\r\n },\r\n}))\r\n","import useCallApi from '../../utilities/axios'\r\nimport * as umServinceURL from './umServiceURL'\r\nimport { encryption } from '../../utilities/encryption'\r\n\r\nexport type ChangeUserPasswordProps = {\r\n userId: number\r\n newPassword: string\r\n}\r\n\r\nconst useInfoChangePassword = () => {\r\n const callApi = useCallApi()\r\n\r\n const changeUserPasswordById = async (param: ChangeUserPasswordProps) => {\r\n if (param.userId) {\r\n try {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServinceURL.putUserPassword}/${param.userId}`,\r\n authorizationType: 'authorization',\r\n params: {\r\n newPassword: encryption(param.newPassword)\r\n }\r\n })\r\n return data\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n }\r\n\r\n return {\r\n changeUserPasswordById\r\n }\r\n}\r\n\r\nexport default useInfoChangePassword\r\n","import Grid from '@material-ui/core/Grid'\r\nimport { FormApi, ValidationErrors } from 'final-form'\r\nimport { FC, useRef, useState } from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport Button from '../../../control/button/button'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { useParams } from 'react-router-dom'\r\nimport useInfoChangePassword from '../../../services/um/useInfoChangePassword'\r\nimport { IconButton } from '@material-ui/core'\r\nimport Visibility from '@material-ui/icons/Visibility'\r\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\r\n\r\ntype FormValue = {\r\n newPassword: string | null\r\n confirmNewPassword: string | null\r\n}\r\n\r\nconst DialogSetPassword: FC<{}> = () => {\r\n const translate = useTranslate()\r\n const setPasswordDialogRef = useRef>()\r\n const successRef = useRef>()\r\n const failRef = useRef>()\r\n const params = useParams<{ id: string }>()\r\n const { changeUserPasswordById } = useInfoChangePassword()\r\n\r\n const [displayPW, setDisplayPW] = useState({\r\n password: false,\r\n confirmPassword: false,\r\n })\r\n\r\n const initialValue = {\r\n password: null,\r\n confirmPassword: null,\r\n }\r\n\r\n const clearSetPasswordValues = (form: FormApi>) => {\r\n /** Clear password, confirmPassword */\r\n form.reset()\r\n }\r\n\r\n const submitSetPassword = async(formVal: FormValue) => {\r\n /** Call Service Set Password */\r\n const result = await changeUserPasswordById({\r\n userId: Number(params.id),\r\n newPassword: `${formVal.newPassword}`,\r\n })\r\n if (result.message === 'success') {\r\n closeDialog()\r\n successRef.current?.openDialog()\r\n } else {\r\n failRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const validateForm = (values: FormValue) => {\r\n const errors: ValidationErrors = {}\r\n\r\n if (values.newPassword && values.confirmNewPassword) {\r\n if (values.confirmNewPassword !== values.newPassword) {\r\n errors.confirmNewPassword = translate.get('MESSAGE.M019')\r\n }\r\n }\r\n\r\n return errors\r\n }\r\n\r\n const openSetPasswordDialog = () => {\r\n setPasswordDialogRef?.current?.openDialog()\r\n }\r\n\r\n const onSetPasswordDialogRef = (func: Record) => {\r\n setPasswordDialogRef.current = { ...func }\r\n }\r\n\r\n const onSetSuccessRef = (func: Record) => {\r\n successRef.current = { ...func }\r\n }\r\n\r\n const onSetFailRef = (func: Record) => {\r\n failRef.current = { ...func }\r\n }\r\n\r\n const closeDialog = () => {\r\n setPasswordDialogRef?.current?.closeDialog()\r\n }\r\n \r\n const handleClickDisplayPassword = () => {\r\n setDisplayPW((prev) => ({ ...prev, password: !prev.password }))\r\n }\r\n\r\n const handleClickDisplayConfirmPassword = () => {\r\n setDisplayPW((prev) => ({ ...prev, confirmPassword: !prev.confirmPassword }))\r\n }\r\n\r\n return (\r\n \r\n {({ handleSubmit, form }) => {\r\n return (\r\n <>\r\n \r\n \r\n {translate.get('BUTTON.SET_NEW_PASSWORD')}\r\n \r\n \r\n clearSetPasswordValues(form)}\r\n onClickConfirm={handleSubmit}\r\n content={\r\n \r\n \r\n \r\n {displayPW.password ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n handleValueChange={(val: string) => {\r\n if (val) {\r\n const txtLogin = val.replace(/[ก-๙]|\\s/g, '')\r\n form.change('newPassword', txtLogin)\r\n }\r\n }}\r\n required\r\n />\r\n \r\n \r\n \r\n {displayPW.confirmPassword ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n handleValueChange={(val: string) => {\r\n if (val) {\r\n const txtLogin = val.replace(/[ก-๙]|\\s/g, '')\r\n form.change('confirmNewPassword', txtLogin)\r\n }\r\n }}\r\n required\r\n />\r\n \r\n \r\n }\r\n />\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport default DialogSetPassword\r\n","import { FC, useEffect, useState } from 'react'\r\n\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport { Typography, Grid, IconButton, Button } from '@material-ui/core'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport Select from '../../../control/select/select'\r\nimport Radio from '../../../control/radio/radio'\r\nimport MyCheckbox from '../../../control/checkbox/checkbox'\r\nimport useTitleName from '../../../services/um/lookups/useTitleName'\r\nimport useUsergroupFilterREC from '../../../services/um/lookups/useUsergroupFilterREC'\r\nimport useUserGroup from '../../../services/um/lookups/useUsergroup'\r\n\r\nimport useGroup from '../../../services/um/lookups/useGroup'\r\nimport usePosition from '../../../services/um/lookups/usePosition'\r\nimport FieldObservable from './FieldObservable'\r\nimport useEditUsergroup, { FormInitial, FormType } from '../../../services/um/useEditUsergroup'\r\nimport { Check, Clear, InfoOutlined } from '@material-ui/icons'\r\nimport { FormApi } from 'final-form'\r\nimport { spellWord } from '../../../utilities/email'\r\nimport UploadLogo from './UploadLogo'\r\nimport checkPermission from '../../../utilities/checkPermission'\r\nimport { validateEmail } from '../../../utilities/validate'\r\nimport ConstantUserGroup from '../../../constants/userGroup'\r\nimport * as _ from 'lodash'\r\nimport Tooltip from '../../../control/tooltip/tooltip'\r\nimport DialogSetPassword from './DialogSetPassword'\r\nimport UploadDocFile from '../../web/shareUI/uploadDoc/UploadDocFile'\r\nimport { useHistory, useParams } from 'react-router-dom'\r\n\r\ninterface FormProps {\r\n initialValue?: any\r\n initialValues?: any\r\n onClickSubmit: (values: FormType) => void\r\n onChangeMobilePhone: (value: string, fnCallback: (valBack: string) => void) => void\r\n onClickBackLink: () => void\r\n onCheck?: (username: string, cunet?: string) => void\r\n onInitialCUData?: (personnelId: string, form: FormApi>) => void\r\n onChangeUsername?: () => void\r\n isChecked?: boolean | null\r\n onchangeRadioCUNET?: (form: FormApi>) => void\r\n readonly?: boolean\r\n mode?: string\r\n topicInitial: any\r\n initialUploadFile: FormInitial['documentInfo']\r\n}\r\ntype dataLookup = {\r\n id: number\r\n name_th: string\r\n name_en: string\r\n}\r\nexport type InitFiles = {\r\n fileList: {\r\n replaceFileID: number | null\r\n fileID: string | null\r\n fileToken: string | null\r\n filename: string | null\r\n path: string\r\n date: string\r\n }[]\r\n}\r\nconst Form: FC = ({\r\n onClickSubmit,\r\n onChangeMobilePhone,\r\n onClickBackLink,\r\n onCheck,\r\n isChecked,\r\n onChangeUsername,\r\n onchangeRadioCUNET,\r\n initialValue,\r\n readonly,\r\n mode,\r\n topicInitial,\r\n initialUploadFile,\r\n}) => {\r\n const [lstFileUpload, setLstFileUpload] = useState([])\r\n\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const params = useParams<{ id: string }>()\r\n\r\n const { state } = useTitleName()\r\n const { userGroup } = useUserGroup()\r\n const { usergroupFilterREC } = useUsergroupFilterREC()\r\n const { officerInfo } = useEditUsergroup(`${params.id}`)\r\n\r\n const { group } = useGroup()\r\n const { position } = usePosition()\r\n const permissionHook = checkPermission()\r\n\r\n const userIRB = initialValue?.irb?.toString()\r\n const groupID = initialValue?.usergroupID?.toString()\r\n const titleID = initialValue?.titleID?.toString()\r\n const positionID = initialValue?.positionID?.toString()\r\n\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n const lookupTitleName = state.map((item: dataLookup) => {\r\n return {\r\n value: item.id.toString(),\r\n label: lang === 'en' ? item.name_en : item.name_th,\r\n }\r\n })\r\n\r\n const lookupPosition = position.map((item: dataLookup) => {\r\n return {\r\n value: item.id.toString(),\r\n label: lang === 'en' ? item.name_en : item.name_th,\r\n }\r\n })\r\n\r\n const lookupUserGroupInitial = userGroup\r\n .map((item: dataLookup) => {\r\n return {\r\n value: item.id.toString(),\r\n label: lang === 'en' ? item.name_en : item.name_th,\r\n }\r\n })\r\n .filter((itm) => itm.value === groupID)\r\n\r\n const lookupUserGroup = usergroupFilterREC\r\n .map((item: dataLookup) => {\r\n return {\r\n value: item.id.toString(),\r\n label: lang === 'en' ? item.name_en : item.name_th,\r\n }\r\n })\r\n .filter((item) => {\r\n if (groupID === ConstantUserGroup.researcher.toString()) {\r\n //ถ้า user เป็นนักวิจัยดูได้\r\n return item\r\n } else {\r\n //เจ้าหน้าที่เพิ่มนักวิจัยไม่ได้ ต้องสมัครมาเอง\r\n return item.value !== ConstantUserGroup.researcher.toString() && item\r\n }\r\n })\r\n\r\n const lookupGroup = group.map((item: { irb_id: number; name_th: string; name_en: string }) => {\r\n return {\r\n value: item.irb_id.toString(),\r\n label: lang === 'en' ? item.name_en : item.name_th,\r\n }\r\n })\r\n\r\n const validateForm = (values: any) => {\r\n const errors: any = {}\r\n if (Number(values.usergroupID) === 3 || Number(values.usergroupID) === 6 || Number(values.usergroupID) === 7) {\r\n if (!values.signatureTH) {\r\n errors.signatureTH = `${translate.get('UM.UPLOAD.REQUIRED')}`\r\n }\r\n\r\n if (!values.signatureEN) {\r\n errors.signatureEN = `${translate.get('UM.UPLOAD.REQUIRED')}`\r\n }\r\n }\r\n\r\n return errors\r\n }\r\n\r\n const getDisableIRB = () => {\r\n let isDisableIRB = true\r\n if (permissionHook.isUserSystemAdmin()) {\r\n isDisableIRB = false\r\n }\r\n\r\n return isDisableIRB\r\n }\r\n\r\n const getDisableUserGroup = () => {\r\n let isDisableUserGroup = false\r\n if (groupID === ConstantUserGroup.researcher.toString()) {\r\n isDisableUserGroup = true\r\n }\r\n\r\n return isDisableUserGroup\r\n }\r\n\r\n const openHistoryUpload = () => {\r\n history.push(`/officer/fileHistory/${params.id}`)\r\n }\r\n\r\n useEffect(() => {\r\n const listFile = officerInfo?.documentInfo[0].uploadFileObj.fileList.filter(\r\n (item) => item.replaceFileID !== null,\r\n )\r\n setLstFileUpload(listFile)\r\n }, [officerInfo?.documentInfo])\r\n return (\r\n \r\n {({ handleSubmit, form, values }) => {\r\n const handleChangeTitleID = (val: string) => {\r\n if (val !== '5') {\r\n form.change('titleOtherTH', '')\r\n form.change('titleOtherEN', '')\r\n }\r\n }\r\n const handleChangePositionID = (val: string) => {\r\n if (val !== '6') {\r\n form.change('positionOtherTH', '')\r\n form.change('positionOtherEN', '')\r\n }\r\n }\r\n return (\r\n
\r\n \r\n \r\n \r\n {translate.get('UM.USERGROUP.HEADER')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.USERGROUP-ADD.PROFILE')}\r\n \r\n \r\n \r\n onchangeRadioCUNET && onchangeRadioCUNET(form)}\r\n requiredHalfWidth={true}\r\n disabled={mode === 'edit'}\r\n required\r\n />\r\n \r\n\r\n \r\n \r\n {isChecked === null || readonly || mode === 'edit' ? null : isChecked ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n handleValueChange={(value) => {\r\n const result = spellWord(value)\r\n form.change('username', result)\r\n onChangeUsername && onChangeUsername()\r\n }}\r\n />\r\n \r\n {!(readonly || mode === 'edit') && (\r\n \r\n onCheck && onCheck(values.username, values.cunetID)}\r\n >\r\n {translate.get('UM.EXTERNAL-REGISTER.CHECK')}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n onChangeSelect={handleChangePositionID}\r\n />\r\n \r\n\r\n name=\"positionID\">\r\n {({ input }) => {\r\n const positionDisable = input.value !== '6'\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n onChangeSelect={handleChangeTitleID}\r\n />\r\n \r\n\r\n name=\"titleID\">\r\n {({ input }) => {\r\n const nameTitleDisable = input.value !== '5'\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n onChangeMobilePhone(value, (valBack) => {\r\n form.change('homeTelephone', valBack)\r\n })\r\n }\r\n />\r\n \r\n \r\n \r\n onChangeMobilePhone(value, (valBack) => {\r\n form.change('mobilePhone', valBack)\r\n })\r\n }\r\n />\r\n \r\n {(Number(values.usergroupID) === 3 ||\r\n Number(values.usergroupID) === 6 ||\r\n Number(values.usergroupID) === 7) && (\r\n <>\r\n \r\n \r\n {translate.get('UM.UPLOAD.HEADER2')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n {mode === 'edit' && (\r\n <>\r\n \r\n \r\n {translate.get('BUTTON.RESET_PASSWORD')}\r\n \r\n
\r\n                                \r\n                                \r\n                            \r\n                        )}\r\n                        \r\n                            \r\n                                {translate.get('LABEL.UPLOAD_FILES')}\r\n                            \r\n\r\n                            \r\n                                ({translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE')})\r\n                            \r\n                        \r\n                        \r\n                            \r\n                        \r\n                        {lstFileUpload?.length > 0 && (\r\n                            \r\n                                \r\n                                    \r\n                                        {translate.get('UM.USERGROUP.OFFICER.UPLOAD-HISTORY')}\r\n                                    \r\n                                \r\n                            \r\n                        )}\r\n\r\n                        \r\n                            \r\n                                \r\n                                    {translate.get('BUTTON.CANCEL')}\r\n                                \r\n                            \r\n                            \r\n                                \r\n                                    {translate.get('BUTTON.SAVE')}\r\n                                \r\n                            \r\n                        \r\n                    
\r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n padding: '1rem 0px',\r\n },\r\n link: {\r\n color: '#0022FF',\r\n cursor: 'pointer',\r\n },\r\n rootLink: {\r\n alignSelf: 'center',\r\n },\r\n buttonEmail: {\r\n alignSelf: 'flex-end',\r\n marginBottom: '16px',\r\n },\r\n checkboxDoctor: {\r\n alignSelf: 'flex-end',\r\n marginBottom: '8px',\r\n },\r\n container: {\r\n padding: '24px',\r\n borderRadius: '8px',\r\n },\r\n divStyle: {\r\n margin: '0px 24px',\r\n },\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n },\r\n saveButton: {\r\n border: 'solid 1px #db5f8e',\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n },\r\n containerUpload: {\r\n marginTop: '25px',\r\n },\r\n uploadTitle: {\r\n fontWeight: 'bold',\r\n },\r\n uploadDescription: {\r\n color: 'red',\r\n paddingTop: '5px',\r\n paddingLeft: '10px',\r\n },\r\n linkLabel: {\r\n textDecoration: 'underline',\r\n color: '#0062FF',\r\n cursor: 'pointer',\r\n },\r\n}))\r\n\r\nexport default Form\r\n","import useTranslate from '../../i18n/useTranslate'\r\nimport useCallApi from '../../utilities/axios'\r\nimport * as umServiceURL from './umServiceURL'\r\n\r\nexport type UplodeFileDocType = {\r\n uploadFileObj: {\r\n fileList: {\r\n replaceFileID: number | null\r\n fileID: number | null\r\n fileToken: string | null\r\n filename: string | null\r\n path: string\r\n date: string\r\n }[]\r\n }\r\n}\r\n\r\nexport type FormType = {\r\n username: string\r\n password: string\r\n nameTH: string\r\n nameEN: string\r\n homeTelephone: string\r\n mobilePhone: string\r\n usergroupID: number\r\n title: lookUps\r\n position: lookUps\r\n irb: number\r\n isPhD: boolean\r\n cunet: boolean\r\n titleID?: string\r\n positionID?: string\r\n cunetID?: string\r\n positionOtherTH?: string\r\n positionOtherEN?: string\r\n titleOtherTH?: string\r\n titleOtherEN?: string\r\n signatureTH?: FileType[] | []\r\n signatureEN?: FileType[] | []\r\n isBothIrb: boolean\r\n documentInfo: UplodeFileDocType[]\r\n}\r\n\r\nexport type Form = {\r\n username: string\r\n password: string\r\n nameTH: string\r\n nameEN: string\r\n homeTelephone: string\r\n mobilePhone: string\r\n usergroupID: number\r\n title: lookUps\r\n position: lookUps\r\n irb: number\r\n isPhD: boolean\r\n cunet: boolean\r\n titleID?: string\r\n positionID?: string\r\n signatureTH?: FileType[] | []\r\n signatureEN?: FileType[] | []\r\n isBothIrb: boolean\r\n documentInfo: {\r\n replaceFileID: number | null\r\n fileID: number | null\r\n fileToken: string | null\r\n filename: string | null\r\n path: string\r\n date: string\r\n }[]\r\n createdBy: number | null\r\n}\r\n\r\nexport type FileType = {\r\n fileToken: string\r\n filename: string\r\n path: string\r\n}\r\n\r\nexport type LanguageType = 'th' | 'en'\r\n\r\ntype lookUps = {\r\n id?: number | string | null\r\n name: {\r\n th?: string\r\n en?: string\r\n }\r\n}\r\n\r\nconst useAddUsergroup = () => {\r\n const callApi = useCallApi()\r\n const t = useTranslate()\r\n\r\n const postOfficer = async (values: Form) => {\r\n const { data } = await callApi.axiosPost({\r\n url: umServiceURL.postAddOfficer,\r\n params: { ...values, subject: t.get('UM.ACTIVATE.SUBJECT_MAIL') },\r\n })\r\n\r\n return data\r\n }\r\n return { postOfficer }\r\n}\r\n\r\nexport default useAddUsergroup\r\n","import useLoading from '../../control/loading/useLoading'\r\nimport useCallApi from '../../utilities/axios'\r\nimport * as umServiceURL from './umServiceURL'\r\n\r\n// export type FormType = {\r\n// username: string\r\n// }\r\n\r\nconst useCheckPersonnel = () => {\r\n const callApi = useCallApi()\r\n const loadingHook = useLoading()\r\n\r\n const postCheckPersonnel = async (personnelId: string) => {\r\n try {\r\n loadingHook.loadingOpen()\r\n const { data } = await callApi.axiosPost({\r\n url: umServiceURL.postCheckPersonnel,\r\n // url: 'http://curecdev.research.chula.ac.th/curecapi-test/api/users/check/personnel',\r\n params: { personnelId },\r\n })\r\n\r\n return data\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n return { postCheckPersonnel }\r\n}\r\n\r\nexport default useCheckPersonnel\r\n","import Form from '../component/um/usergroup/Form'\r\nimport _ from 'lodash'\r\n\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport useAddUsergroup, { FormType, UplodeFileDocType } from '../services/um/useAddUsergroup'\r\nimport { useEffect, useRef, useState } from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport useCheckEmail from '../services/um/useCheckEmail'\r\nimport { Grid, makeStyles, Paper, Typography, Container } from '@material-ui/core'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport { RoutePath } from '../router/routesConfig'\r\nimport usePosition from '../services/um/lookups/usePosition'\r\nimport { fixPosition } from '../constants/constants'\r\nimport useCheckPersonnel from '../services/um/useCheckPersonnel'\r\nimport { FormInitial } from '../services/um/useEditUsergroup'\r\n\r\ntype dataLookup = {\r\n id: number\r\n name_th: string\r\n name_en: string\r\n}\r\nconst UsergroupAdd = () => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const { postOfficer } = useAddUsergroup()\r\n const { postCheck } = useCheckEmail()\r\n const { postCheckPersonnel } = useCheckPersonnel()\r\n const authenStore = useAuthenStore()\r\n const history = useHistory()\r\n const { position } = usePosition()\r\n const [initialValues, setInitialValues] = useState({\r\n cunetID: '1',\r\n irb: authenStore.profile.irb?.toString(),\r\n signatureTH: null,\r\n signatureEN: null,\r\n })\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const [checkEmail, setCheckEmail] = useState(null)\r\n const [initialUploadFile, setInitialUploadFile] = useState()\r\n const dialogTwoRef = useRef>()\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n const validateEmail = (email: string) => {\r\n const re =\r\n /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\r\n return re.test(email)\r\n }\r\n\r\n const onChangeUsername = () => {\r\n setCheckEmail(null)\r\n }\r\n\r\n const onchangeRadioCUNET = (form: any) => {\r\n setCheckEmail(null)\r\n form.change('username', '')\r\n }\r\n\r\n const topicInitial = [\r\n {\r\n id: undefined,\r\n no: '',\r\n name_th: '',\r\n name_en: '',\r\n },\r\n ]\r\n\r\n const initialUpload = async (initDocument?: FormInitial['documentInfo']) => {\r\n let uploadFileInit = topicInitial?.map(() => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: UplodeFileDocType) => {\r\n initDocument?.forEach((docInfo: any) => {\r\n itm.uploadFileObj?.fileList.push({\r\n ...docInfo,\r\n fileID: docInfo?.fileID,\r\n fileToken: `${docInfo?.fileToken}`,\r\n filename: `${docInfo?.filename}`,\r\n replaceFileID: docInfo?.replaceFileID ?? null,\r\n date: `${docInfo?.date}`,\r\n })\r\n })\r\n })\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const initialValue = {\r\n cunetID: '1',\r\n irb: authenStore.profile.irb,\r\n signatureTH: null,\r\n signatureEN: null,\r\n }\r\n\r\n const checkUserName = async (username: string, cunetID?: string) => {\r\n const isCUNET = cunetID === '1' // radio is select cu-net\r\n if (username) {\r\n const result = await postCheck(username, 2)\r\n if (isCUNET) {\r\n //เป็น cunet และสามารถ ลงทะเบียนได้\r\n if (result.message === 'pass' && result.cunet === true) {\r\n setCheckEmail(true)\r\n return\r\n }\r\n //เป็น cunet แต่ไม่สามารถลงทะเบียนได้ เพราะซ้ำกับในระบบ\r\n if (result.message === 'duplicate' && result.cunet === true) {\r\n setCheckEmail(false)\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('UM.USERGROUP-ADD.DIALOG.DUPLICATE_CUNET'),\r\n type: 'alert-message',\r\n })\r\n return dialogTwoRef.current?.openDialog()\r\n }\r\n //ไม่เป็น cu-net\r\n setCheckEmail(false)\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('UM.USERGROUP-ADD.DIALOG.NOT_CUNET'),\r\n type: 'alert-message',\r\n })\r\n return dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n if (result.message === 'pass') {\r\n //ภายนอก และเป็น email สามารถใช้งานได้\r\n if (validateEmail(username)) {\r\n setCheckEmail(true)\r\n return\r\n }\r\n //ภายนอก แต่ไม่เป็น email ไม่สามารถใช้งานได้\r\n setCheckEmail(false)\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('UM.USERGROUP-ADD.DIALOG.EMAIL'),\r\n type: 'alert-message',\r\n })\r\n return dialogTwoRef.current?.openDialog()\r\n }\r\n //username ซ้ำกับ user ที่มีในระบบ\r\n setCheckEmail(false)\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('UM.USERGROUP-ADD.DIALOG.DUPLICATE'),\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const save = async (values: FormType) => {\r\n const cunet = values.cunetID === '1'\r\n const isPhD = values.isPhD || false\r\n const isPositionSpecified = values.positionID === '7'\r\n const isBothIrb = values.isBothIrb\r\n const format = {\r\n ...values,\r\n title: {\r\n id: values.titleID,\r\n name: {\r\n th: values.titleOtherTH,\r\n en: values.titleOtherEN,\r\n },\r\n },\r\n position: {\r\n id: isPositionSpecified ? null : values.positionID,\r\n name: {\r\n th: values.positionOtherTH,\r\n en: values.positionOtherEN,\r\n },\r\n },\r\n cunet,\r\n isPhD,\r\n signatureTH: values.signatureTH ?? [],\r\n signatureEN: values.signatureEN ?? [],\r\n isBothIrb,\r\n createdBy: authenStore.profile.userId,\r\n documentInfo: [...values.documentInfo[0].uploadFileObj.fileList],\r\n }\r\n const result = await postOfficer(\r\n _.omit(format, ['cunetID', 'positionOtherTH', 'positionOtherEN', 'titleOtherTH', 'titleOtherEN']),\r\n )\r\n if (result) {\r\n if (result.status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: onBack,\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else if (result.status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.DUPLICATE_GROUP_USER'),\r\n type: 'alert-message',\r\n })\r\n }\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n }\r\n\r\n const onSubmit = async (values: FormType) => {\r\n if (!checkEmail) {\r\n setConfigDialog({\r\n title: translate.get('UM.USERGROUP-ADD.RECHECK'),\r\n content: translate.get('UM.USERGROUP-ADD.RECHECK_EMAIL'),\r\n type: 'alert-message',\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n return\r\n }\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => save(values),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onBack = () => {\r\n history.push(RoutePath.officer)\r\n }\r\n\r\n const onChangeMobilePhone = (val: string, fnCallback: (valBack: string) => void) => {\r\n if (val) {\r\n let result = ''\r\n const phoneNumber = val.replace(/[^\\d]/g, '')\r\n if (phoneNumber.length < 4) {\r\n result = phoneNumber\r\n } else if (phoneNumber.length < 7) {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3)}`\r\n } else {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3, 6)}-${phoneNumber.slice(6, 10)}`\r\n }\r\n fnCallback(result)\r\n }\r\n }\r\n const handleCUData = async (personnelId: string, form: any) => {\r\n const result = await postCheckPersonnel(personnelId)\r\n\r\n const formValues = form.getState().values\r\n\r\n if (result.data) {\r\n createInitialValue(result.data[0], formValues)\r\n } else {\r\n setInitialValues({ ...initialValues })\r\n }\r\n }\r\n\r\n const createInitialValue = (data: any, formValues: any) => {\r\n const initialData = {\r\n ...initialValues,\r\n ...formValues,\r\n nameTH: `${data.NAME_TH ?? null} ${data.SURNAME_TH ?? null}`,\r\n nameEN: `${data.NAME_EN ?? null} ${data.SURNAME_EN ?? null}`,\r\n positionID: findPosition(data.ACAD_TITLE_1), //เขาจะส่งมาเป็นตัวย่อ ต้องเอาไป แมทเอาเอง\r\n isPhD: data.DOCTORAL_TITLE ? true : false,\r\n titleID: data.TITLE_ID ?? null,\r\n homeTelephone: data.OFFICE_PHONENUMBER ?? null,\r\n }\r\n setInitialValues(initialData)\r\n }\r\n\r\n const findPosition = (positionTitle: string) => {\r\n const optPosition = formatPosition()\r\n const findPosition = optPosition.find((element) => element.shortName === positionTitle)\r\n\r\n return findPosition?.id\r\n }\r\n\r\n const formatPosition = () => {\r\n let lookupPosition = position.map((item: dataLookup) => {\r\n return {\r\n id: item.id.toString(),\r\n name: lang === 'en' ? item.name_en : item.name_th,\r\n shortName: '',\r\n }\r\n })\r\n\r\n lookupPosition = [\r\n { id: '7', name: translate.get('UM.USERGROUP-ADD.NOT_SPECIFIED'), shortName: '' },\r\n ...lookupPosition,\r\n { id: '6', name: translate.get('UM.USERGROUP-ADD.OTHER'), shortName: '' },\r\n ]\r\n\r\n fixPosition.forEach((itm) => {\r\n lookupPosition.forEach((item: any) => {\r\n if (itm.id === item.id) {\r\n item.shortName = itm.shortName\r\n }\r\n })\r\n })\r\n\r\n return lookupPosition\r\n }\r\n\r\n useEffect(() => {\r\n initialUpload()\r\n }, [])\r\n return (\r\n \r\n \r\n \r\n \r\n {translate.get('UM.USERGROUP-ADD.TITLE')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n // backgroundColor: 'red',\r\n },\r\n container: {\r\n padding: '24px',\r\n borderRadius: '8px',\r\n },\r\n item: {\r\n position: 'absolute',\r\n },\r\n paper: {\r\n width: '100%',\r\n margin: '2rem 0px',\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'unset',\r\n boxShadow: 'unset',\r\n margin: '0px',\r\n },\r\n },\r\n}))\r\n\r\nexport default UsergroupAdd\r\n","import Form from '../component/um/usergroup/Form'\r\n\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport { useEffect, useRef, useState } from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport { Typography, Grid, makeStyles, Paper, Container } from '@material-ui/core'\r\nimport useEditUsergroup, { FormInitial, FormType } from '../services/um/useEditUsergroup'\r\nimport { useParams } from 'react-router-dom'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\n\r\nconst UsergroupAdd = () => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const params = useParams<{ id: string }>()\r\n const authenStore = useAuthenStore()\r\n const history = useHistory()\r\n const { putOfficer, officerInfo } = useEditUsergroup(params.id)\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const [initialUploadFile, setInitialUploadFile] = useState()\r\n const dialogTwoRef = useRef>()\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const topicInitial = [\r\n {\r\n id: undefined,\r\n no: '',\r\n name_th: '',\r\n name_en: '',\r\n },\r\n ]\r\n\r\n const initialUpload = async (initDocument?: FormInitial['documentInfo']) => {\r\n setInitialUploadFile(initDocument)\r\n }\r\n\r\n const initialValue = officerInfo && {\r\n ...officerInfo,\r\n irb: authenStore.profile.irb,\r\n userGroupID: officerInfo.usergroupID,\r\n cunetID: officerInfo.cunet ? '1' : '2', //1 is cunet 2 is ภายนอก\r\n positionID: officerInfo.position?.id ? officerInfo.position.id.toString() : '7', //ถ้าส่งเป็น null คือไม่ระบุ\r\n positionOtherTH: officerInfo.position?.name.th,\r\n positionOtherEN: officerInfo.position?.name.en,\r\n titleID: officerInfo.title?.id?.toString(),\r\n titleOtherTH: officerInfo.title?.name.th,\r\n titleOtherEN: officerInfo.title?.name.en,\r\n signatureTH: officerInfo?.signatureTH || null,\r\n signatureEN: officerInfo?.signatureEN || null,\r\n isBothIrb: officerInfo.isBothIrb,\r\n }\r\n\r\n const save = async (values: any) => {\r\n const cunet = values.cunetID === '1'\r\n const isPhD = values.isPhD || false\r\n const format = {\r\n ...values,\r\n title: {\r\n id: values.titleID,\r\n name: {\r\n th: values.titleOther,\r\n en: values.titleOther,\r\n },\r\n },\r\n position: {\r\n id: values.positionID,\r\n name: {\r\n th: values.positionOther,\r\n en: values.positionOther,\r\n },\r\n },\r\n cunet,\r\n isPhD,\r\n signatureTH: values?.signatureTH ?? [],\r\n signatureEN: values?.signatureEN ?? [],\r\n documentInfo: [...values?.documentInfo[0]?.uploadFileObj?.fileList],\r\n updatedBy: authenStore.profile.userId,\r\n }\r\n const result = await putOfficer(format, params.id)\r\n\r\n if (result) {\r\n if (result.status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: onBack,\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else if (result.status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.DUPLICATE_GROUP_USER'),\r\n type: 'alert-message',\r\n })\r\n }\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n }\r\n const onSubmit = async (values: FormType) => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => save(values),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onBack = () => {\r\n history.goBack()\r\n }\r\n\r\n const onChangeMobilePhone = (val: string, fnCallback: (valBack: string) => void) => {\r\n if (val) {\r\n let result = ''\r\n const phoneNumber = val.replace(/[^\\d]/g, '')\r\n if (phoneNumber.length < 4) {\r\n result = phoneNumber\r\n } else if (phoneNumber.length < 7) {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3)}`\r\n } else {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3, 6)}-${phoneNumber.slice(6, 10)}`\r\n }\r\n fnCallback(result)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n initialUpload(officerInfo?.documentInfo)\r\n }, [officerInfo])\r\n return (\r\n \r\n \r\n {/* */}\r\n \r\n \r\n {translate.get('UM.USERGROUP-ADD.TITLE_EDIT')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* */}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n container: {\r\n padding: '24px',\r\n borderRadius: '8px',\r\n },\r\n item: {\r\n position: 'absolute',\r\n },\r\n paper: {\r\n width: '100%',\r\n margin: '2rem 0px',\r\n\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'unset',\r\n boxShadow: 'unset',\r\n margin: '0px',\r\n },\r\n },\r\n}))\r\n\r\nexport default UsergroupAdd\r\n","import React from 'react'\r\nimport useCallApi from '../../utilities/axios'\r\nimport * as umServinceURL from './umServiceURL'\r\nimport { encryption } from '../../utilities/encryption'\r\n\r\nexport type FormProps = {\r\n password: string\r\n newPassword: string\r\n confirmNewPassword: string\r\n}\r\n\r\nexport type ChangePasswordProps = {\r\n userId: number\r\n password: string\r\n newPassword: string\r\n}\r\n\r\nconst usePreferenceChangePassword = () => {\r\n const callApi = useCallApi()\r\n\r\n const putPreferencesChangePassword = async (param: ChangePasswordProps) => {\r\n if (param.userId) {\r\n try {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServinceURL.putPreferencesChangePassword}/${param.userId}`,\r\n authorizationType: 'authorization',\r\n params: {\r\n password: encryption(param.password),\r\n newPassword: encryption(param.newPassword)\r\n }\r\n })\r\n return data\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n }\r\n\r\n return {\r\n putPreferencesChangePassword\r\n }\r\n}\r\n\r\nexport default usePreferenceChangePassword\r\n","import { useState, useRef } from 'react'\r\nimport { Form as FinalForm, FormRenderProps } from 'react-final-form'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport usePreferenceChangePassword, {\r\n FormProps,\r\n ChangePasswordProps,\r\n} from '../../../services/um/usePreferenceChangePassword'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport Visibility from '@material-ui/icons/Visibility'\r\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\r\nimport Dialog, { DialogType } from '../../../control/dialog/dialog'\r\n\r\ntype FormComponentProps = {\r\n onRefFormProps?: (func: FormRenderProps) => void\r\n onRefCloseDialog?: () => void\r\n}\r\nconst Form = (props: FormComponentProps) => {\r\n const { onRefFormProps, onRefCloseDialog } = props\r\n const t = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const preferenceChangePasswordHook = usePreferenceChangePassword()\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const [displayPW, setDisplayPW] = useState({\r\n password: false,\r\n confirmPassword: false,\r\n })\r\n\r\n const validateForm = (values: FormProps) => {\r\n const errors: any = {}\r\n if (!values.password) {\r\n errors.password = t.get('LABEL.REQUIRE_FIELD')\r\n }\r\n if (!values.newPassword) {\r\n errors.newPassword = t.get('LABEL.REQUIRE_FIELD')\r\n }\r\n if (values.newPassword !== values.confirmNewPassword) {\r\n errors.confirmNewPassword = t.get('MESSAGE.M019')\r\n }\r\n return errors\r\n }\r\n\r\n const logout = () => {\r\n localStorage.clear()\r\n setTimeout(() => {\r\n window.location.replace(process.env.PUBLIC_URL)\r\n }, 1000)\r\n }\r\n\r\n const handleSubmitForm = async (value: FormProps) => {\r\n const param: ChangePasswordProps = {\r\n userId: authenStore.profile.userId ?? 0,\r\n password: value.password,\r\n newPassword: value.newPassword,\r\n }\r\n const result = await preferenceChangePasswordHook.putPreferencesChangePassword(param)\r\n if (result.message === 'success') {\r\n setConfigDialog({\r\n title: t.get('ALERT.TITLE.NOTIFICATION'),\r\n content: t.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n onRefCloseDialog?.()\r\n logout()\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n setConfigDialog({\r\n title: t.get('ALERT.TITLE.ERROR'),\r\n content: t.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: onRefCloseDialog,\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const handleClickDisplayPassword = () => {\r\n setDisplayPW((prev) => ({ ...prev, password: !prev.password }))\r\n }\r\n\r\n const handleClickDisplayConfirmPassword = () => {\r\n setDisplayPW((prev) => ({ ...prev, confirmPassword: !prev.confirmPassword }))\r\n }\r\n\r\n return (\r\n \r\n {(props: FormRenderProps) => {\r\n if (onRefFormProps) onRefFormProps(props)\r\n return (\r\n \r\n \r\n \r\n {displayPW.password ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n handleValueChange={(val: string) => {\r\n if (val) {\r\n const txtLogin = val.replace(/[ก-๙]|\\s/g, '')\r\n props.form.change('password', txtLogin)\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n {displayPW.confirmPassword ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n handleValueChange={(val: string) => {\r\n if (val) {\r\n const txtLogin = val.replace(/[ก-๙]|\\s/g, '')\r\n props.form.change('newPassword', txtLogin)\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n {displayPW.confirmPassword ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n handleValueChange={(val: string) => {\r\n if (val) {\r\n const txtLogin = val.replace(/[ก-๙]|\\s/g, '')\r\n props.form.change('confirmNewPassword', txtLogin)\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport default Form\r\n","import React from 'react'\r\nimport useCallApi from '../../utilities/axios'\r\nimport * as umServinceURL from './umServiceURL'\r\nimport { encryption } from '../../utilities/encryption'\r\n\r\nexport type FormProps = {\r\n passcode: string\r\n newPasscode: string\r\n confirmNewPasscode: string\r\n}\r\n\r\nexport type ChangePasscodeProps = {\r\n userId: number\r\n passcode: string\r\n newPasscode: string\r\n}\r\n\r\nconst usePreferencePasscode = () => {\r\n const callApi = useCallApi()\r\n\r\n const putPreferencesChangePasscode = async (param: ChangePasscodeProps) => {\r\n try {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServinceURL.putPreferencesChangePasscode}/${param.userId}`,\r\n params: {\r\n passcode: encryption(param.passcode),\r\n newPasscode: encryption(param.newPasscode)\r\n }\r\n })\r\n return data\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n\r\n return {\r\n putPreferencesChangePasscode\r\n }\r\n}\r\n\r\nexport default usePreferencePasscode\r\n","import { useState, useRef } from 'react'\r\nimport { Form as FinalForm, FormRenderProps } from 'react-final-form'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport usePreferencePasscode, { FormProps, ChangePasscodeProps } from '../../../services/um/usePreferencePasscode'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport Visibility from '@material-ui/icons/Visibility'\r\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport Dialog, { DialogType } from '../../../control/dialog/dialog'\r\n\r\ntype FormComponentProps = {\r\n onRefFormProps?: (func: FormRenderProps) => void\r\n onRefCloseDialog: () => void\r\n isPasscode: boolean\r\n}\r\nconst Form = (props: FormComponentProps) => {\r\n const { onRefFormProps, onRefCloseDialog, isPasscode } = props\r\n const t = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const preferencePasscodeHook = usePreferencePasscode()\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const [displayPW, setDisplayPW] = useState({\r\n passcode: false,\r\n confirmPasscode: false,\r\n })\r\n\r\n const validateForm = (values: FormProps) => {\r\n const errors: any = {}\r\n if (isPasscode && !values.passcode) {\r\n errors.passcode = t.get('MESSAGE.M023')\r\n }\r\n if (!values.newPasscode) {\r\n errors.newPasscode = t.get('MESSAGE.M023')\r\n }\r\n if (values.newPasscode !== values.confirmNewPasscode) {\r\n errors.confirmNewPasscode = t.get('MESSAGE.M019')\r\n }\r\n\r\n return errors\r\n }\r\n\r\n const handleSubmitForm = async (value: FormProps) => {\r\n const param: ChangePasscodeProps = {\r\n userId: authenStore.profile.userId ?? 0,\r\n passcode: value.passcode,\r\n newPasscode: value.newPasscode,\r\n }\r\n const result = await preferencePasscodeHook.putPreferencesChangePasscode(param)\r\n if (result.message === 'success') {\r\n setConfigDialog({\r\n title: t.get('ALERT.TITLE.NOTIFICATION'),\r\n content: t.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: onRefCloseDialog,\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n setConfigDialog({\r\n title: t.get('ALERT.TITLE.ERROR'),\r\n content: t.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: onRefCloseDialog,\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const handleClickDisplayPasscode = () => {\r\n setDisplayPW((prev) => ({ ...prev, passcode: !prev.passcode }))\r\n }\r\n\r\n const handleClickDisplayConfirmPasscode = () => {\r\n setDisplayPW((prev) => ({ ...prev, confirmPasscode: !prev.confirmPasscode }))\r\n }\r\n\r\n return (\r\n \r\n {(props: FormRenderProps) => {\r\n if (onRefFormProps) onRefFormProps(props)\r\n return (\r\n \r\n {isPasscode && (\r\n \r\n \r\n {displayPW.passcode ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n />\r\n \r\n )}\r\n \r\n \r\n {displayPW.confirmPasscode ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n {displayPW.confirmPasscode ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport default Form\r\n","import useCallApi from '../../utilities/axios'\r\nimport * as umServinceURL from './umServiceURL'\r\n\r\nexport type FormProps = {\r\n username: string\r\n email: string\r\n position: string\r\n positionTH: string\r\n positionEN: string\r\n academicPositionDr: string\r\n title: string\r\n titleTH: string\r\n titleEN: string\r\n nameTH: string\r\n nameEN: string\r\n telephone: string\r\n isPhD: boolean\r\n cu_net: boolean\r\n isPasscode: boolean\r\n signatureEN: string | null\r\n signatureTH: string | null\r\n usergroupID: number[]\r\n departments_en: string\r\n}\r\n\r\nexport type FormChangePasscodeProps = {\r\n passcode: string\r\n newPasscode: string\r\n}\r\n\r\nexport type ChangePasscodeProps = {\r\n id: number\r\n passcode: string\r\n newPasscode: string\r\n}\r\n\r\nconst usePreferenceProfile = () => {\r\n const callApi = useCallApi()\r\n const token = localStorage.getItem('accessToken')\r\n\r\n const getPreferanceProfile = async (userId: number | null) => {\r\n if (userId) {\r\n try {\r\n const { data } = await callApi.axiosGet({\r\n url: `${umServinceURL.getPreferencesProfile}/${userId}`,\r\n })\r\n\r\n return {\r\n ...data,\r\n position: data.position?.id,\r\n title: data.title?.id,\r\n positionTH: data.position?.name?.th,\r\n positionEN: data.position?.name?.en,\r\n titleTH: data.title?.name?.th,\r\n titleEN: data.title?.name?.en,\r\n }\r\n } catch (error) {\r\n console.log('error getPreferanceProfile', error)\r\n }\r\n }\r\n }\r\n\r\n const forgotPassword = async (email: string) => {\r\n try {\r\n const { data } = await callApi.axiosPost({\r\n url: `${umServinceURL.postPreferencesForgotPassword}`,\r\n authorizationType: 'authorization',\r\n params: {\r\n email: email,\r\n },\r\n })\r\n return data\r\n } catch (error) {\r\n console.log('error forgotPassword', error)\r\n }\r\n }\r\n\r\n const putPreferanceProfile = async (userId: number | null, param: FormProps) => {\r\n const format = {\r\n ...param,\r\n title: {\r\n id: Number(param.title),\r\n name: {\r\n th: param.titleTH ?? null,\r\n en: param.titleEN ?? null,\r\n },\r\n },\r\n position: {\r\n id: Number(param.position),\r\n name: {\r\n th: param.positionTH ?? null,\r\n en: param.positionEN ?? null,\r\n },\r\n },\r\n }\r\n if (userId) {\r\n try {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServinceURL.putPreferencesProfile}/${userId}`,\r\n params: format,\r\n })\r\n return data\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n }\r\n\r\n const postImage = async (formData: FormData) => {\r\n const { data } = await callApi.axiosPost({\r\n url: umServinceURL.postImageProfile,\r\n params: formData,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const postImageLogo = async (formData: FormData) => {\r\n const { data } = await callApi.axiosPost({\r\n url: umServinceURL.postImageLogoProfile,\r\n params: formData,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const putEmailSetting = async (isEnabled: boolean) => {\r\n const { data } = await callApi.axiosPut({\r\n url: umServinceURL.updateEmailSetting,\r\n params: {\r\n isEnable: isEnabled,\r\n },\r\n })\r\n\r\n return data\r\n }\r\n\r\n return {\r\n getPreferanceProfile,\r\n putPreferanceProfile,\r\n forgotPassword,\r\n postImage,\r\n postImageLogo,\r\n putEmailSetting,\r\n }\r\n}\r\n\r\nexport default usePreferenceProfile\r\n","import { FC, useState, useRef } from 'react'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nimport UploadImage from '../../../control/uploadImage/uploadImage'\r\nimport usePreferenceProfile from '../../../services/um/usePreferenceProfile'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport useAuthenAction from '../../../stores/authen/authenAction'\r\nimport Dialog, { DialogType } from '../../../control/dialog/dialog'\r\n\r\ninterface UploadProfileProps {\r\n getNewProfile: () => void\r\n}\r\nconst UploadProfile: FC = ({ getNewProfile }) => {\r\n const t = useTranslate()\r\n const authenAction = useAuthenAction()\r\n const authenStore = useAuthenStore()\r\n const { postImage } = usePreferenceProfile()\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n\r\n const onUpload = async (event: React.ChangeEvent) => {\r\n const file = event.target.files?.[0]\r\n\r\n if (file?.type.includes('image')) {\r\n if (file && file.size > 5242880) {\r\n //5 mb to byte (1 mb = 1048576 byte)\r\n setConfigDialog({\r\n title: `${t.get('ALERT.TITLE.WARNING')}`,\r\n content: `${t.get('ALERT.CONTENT.UPLOAD_NOT_EXCEED_5_MB')}`,\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n //@ts-ignore\r\n document.getElementById('imgUpload').value = ''\r\n },\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: `${t.get('UM.PROFILE.UPLOAD_PROFILE_HEADER')}`,\r\n content: `${t.get('UM.PROFILE.UPLOAD_PROFILE_CONFIRM')}`,\r\n type: 'alert-confirm',\r\n onClickConfirm: () => onSave(event),\r\n })\r\n }\r\n } else {\r\n // ต้องไม่สามารถอัพไฟล์อื่นที่ไม่ใช่รูปภาพได้\r\n setConfigDialog({\r\n title: `${t.get('ALERT.TITLE.WARNING')}`,\r\n content: `${t.get('ALERT.CONTENT.UPLOAD_IMG_FILE_ONLY')}`,\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n //@ts-ignore\r\n document.getElementById('imgUpload').value = ''\r\n },\r\n })\r\n }\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onSave = async (event: React.ChangeEvent) => {\r\n const file = event.target.files?.[0]\r\n const formDataImage = new FormData()\r\n if (file) {\r\n formDataImage.append('userID', String(authenStore.profile.userId))\r\n formDataImage.append('files', file)\r\n const upload = await postImage(formDataImage)\r\n\r\n if (upload) {\r\n setConfigDialog({\r\n title: `${t.get('UM.PROFILE.UPLOAD_PROFILE_HEADER')}`,\r\n content: `${t.get('UM.PROFILE.UPLOAD_PROFILE_SUCCESS')}`,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n await getNewProfile()\r\n }\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default UploadProfile\r\n","import { useState, useEffect } from 'react'\r\nimport useCallApi from '../../../utilities/axios'\r\nimport * as umServinceURL from '../umServiceURL'\r\n\r\nconst useAcademicPosition = () => {\r\n const callApi = useCallApi()\r\n const [state, setState] = useState([])\r\n\r\n useEffect(() => {\r\n getLookup()\r\n }, [])\r\n\r\n const getLookup = async () => {\r\n try {\r\n const { data } = await callApi.axiosGet({\r\n url: umServinceURL.getLookupAcademicPosition\r\n })\r\n setState(data.result)\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n\r\n return { state }\r\n}\r\n\r\nexport default useAcademicPosition\r\n","import { FC } from 'react'\r\nimport Grid from '@material-ui/core/Grid'\r\n\r\nimport { Typography, makeStyles, IconButton } from '@material-ui/core'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport MyCheckbox from '../../../control/checkbox/checkbox'\r\nimport Button from '../../../control/button/button'\r\n\r\nimport useTitleName from '../../../services/um/lookups/useTitleName'\r\nimport useAcademicPosition from '../../../services/um/lookups/useAcademicPosition'\r\nimport { validateEmail, validateMobilePhone } from '../../../utilities/validate'\r\nimport { useForm } from 'react-final-form'\r\nimport Select from '../../../control/select/select'\r\nimport Tooltip from '../../../control/tooltip/tooltip'\r\nimport { InfoOutlined } from '@material-ui/icons'\r\n\r\ninterface InformationProps {\r\n handleSubmit: (values: any) => void\r\n position: string\r\n title: string\r\n}\r\nconst Information: FC = ({ handleSubmit, position, title }) => {\r\n const t = useTranslate()\r\n const { state: titleOptions } = useTitleName()\r\n const { state: positionOptions } = useAcademicPosition()\r\n const classes = useStyles()\r\n const form = useForm()\r\n\r\n const lang = t.languageStore.currentLanguage\r\n\r\n const onChangeTelePhone = (val: string) => {\r\n if (val) {\r\n let result = ''\r\n const phoneNumber = val.replace(/[^\\d]/g, '')\r\n if (phoneNumber.length < 4) {\r\n result = phoneNumber\r\n } else if (phoneNumber.length < 7) {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3)}`\r\n } else {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3, 6)}-${phoneNumber.slice(6, 10)}`\r\n }\r\n form.change('telephone', result)\r\n }\r\n }\r\n\r\n const handleChangePosition = (val: string) => {\r\n if (val !== '6') {\r\n form.change('positionTH', null)\r\n form.change('positionEN', null)\r\n }\r\n }\r\n const handleChangeTitle = (val: string) => {\r\n if (val !== '5') {\r\n form.change('titleTH', null)\r\n form.change('titleEN', null)\r\n }\r\n }\r\n return (\r\n \r\n \r\n {t.get('UM.PROFILE.PI_ADN_ACCOUNT')}\r\n {t.get('UM.PROFILE.DATA_SHOW_ONSITE')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n return {\r\n value: item.id.toString(),\r\n label: item[lang === 'th' ? 'name_th' : 'name_en'],\r\n }\r\n })}\r\n label={t.get('UM.PROFILE.ACADEMIC_POSITION')}\r\n placeholder={t.get('UM.PROFILE.ACADEMIC_POSITION')}\r\n size=\"small\"\r\n defaultValue={[position]}\r\n icon={\r\n \r\n \r\n \r\n \r\n \r\n }\r\n onChangeSelect={handleChangePosition}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ({\r\n value: item.id.toString(),\r\n label: item[lang === 'th' ? 'name_th' : 'name_en'],\r\n }))}\r\n label={t.get('UM.PROFILE.PREFIX')}\r\n placeholder={t.get('UM.PROFILE.PREFIX')}\r\n size=\"small\"\r\n defaultValue={[title]}\r\n icon={\r\n \r\n \r\n \r\n \r\n \r\n }\r\n onChangeSelect={handleChangeTitle}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n saveButton: {\r\n border: 'solid 1px #db5f8e',\r\n float: 'right',\r\n },\r\n}))\r\nexport default Information\r\n","import { useEffect, useState } from 'react'\r\nimport useCallApi from '../../../utilities/axios'\r\n\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\n\r\ntype GetSync = {\r\n isSync: boolean\r\n lineID: string | null\r\n userID: string | number\r\n username: string\r\n}\r\n\r\nfunction useGetSync() {\r\n const callApi = useCallApi()\r\n const authenStore = useAuthenStore()\r\n const userID = authenStore.profile?.userId\r\n\r\n const [isSync, setSync] = useState(false)\r\n\r\n useEffect(() => {\r\n if (!userID) return\r\n\r\n async function fetch() {\r\n try {\r\n const { data } = await callApi.axiosGet({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/line/sync/${userID}`,\r\n })\r\n\r\n setSync(data.isSync)\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n\r\n fetch()\r\n }, [userID])\r\n\r\n return { isSync }\r\n}\r\n\r\nexport default useGetSync\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport AutorenewIcon from '@material-ui/icons/Autorenew'\r\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle'\r\n\r\nimport useGetSync from '../../../services/um/line/useGetSync'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nfunction Line() {\r\n const t = useTranslate()\r\n const classes = useStyles()\r\n const { isSync } = useGetSync()\r\n\r\n const checkSync = (whenTrue: any, whenFalse: any) => {\r\n return isSync ? whenTrue : whenFalse\r\n }\r\n\r\n return (\r\n \r\n \r\n {t.get('UM.PROFILE.CONNECT_LINE')}\r\n {t.get('UM.PROFILE.CONNECT_LINE_DESCRIPTION')}\r\n \r\n \r\n \"line-qr\"\r\n
\r\n {checkSync(\r\n ,\r\n ,\r\n )}\r\n {checkSync(\r\n {t.get('UM.PROFILE.SYNC_LINE_SYNCED')},\r\n {t.get('UM.PROFILE.SYNC_LINE_INPROGRESS')},\r\n )}\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n img: {\r\n width: 240,\r\n height: 240,\r\n },\r\n checkIcon: {\r\n fill: 'green',\r\n margin: theme.spacing(0, 1),\r\n },\r\n progressIcon: {\r\n fill: '#0a66b7',\r\n margin: theme.spacing(0, 1),\r\n },\r\n status: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n}))\r\n\r\nexport default Line\r\n","import { Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { FC, useState, useEffect, useRef } from 'react'\r\nimport UploadImage from '../../../control/uploadImage/uploadImage'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport usePreferenceProfile from '../../../services/um/usePreferenceProfile'\r\nimport Dialog, { DialogType } from '../../../control/dialog/dialog'\r\nimport { convertPathToNameImg } from '../../../utilities/pathImg'\r\n\r\nexport type LanguageType = 'th' | 'en'\r\n\r\ninterface UploadLogoProps {\r\n initialValue?: any\r\n form: any\r\n}\r\nconst UploadLogo: FC = ({ initialValue, form }) => {\r\n const translate = useTranslate()\r\n const classes = usestyles()\r\n const authenStore = useAuthenStore()\r\n const { postImageLogo } = usePreferenceProfile()\r\n const [temp, setTemp] = useState<{\r\n imgUpload_th: string | null\r\n imgUpload_en: string | null\r\n name_th: string | null\r\n name_en: string | null\r\n }>({\r\n imgUpload_th: null,\r\n imgUpload_en: null,\r\n name_th: null,\r\n name_en: null,\r\n })\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n\r\n useEffect(() => {\r\n setTemp({\r\n imgUpload_th: initialValue?.signatureTH || null,\r\n imgUpload_en: initialValue?.signatureEN || null,\r\n name_th: convertPathToNameImg(initialValue?.signatureTH) || null,\r\n name_en: convertPathToNameImg(initialValue?.signatureEN) || null,\r\n })\r\n }, [initialValue])\r\n\r\n const onUpload = async (event: React.ChangeEvent, language: LanguageType) => {\r\n const file = event.target.files?.[0]\r\n\r\n if (file) {\r\n setConfigDialog({\r\n title: `${translate.get('UM.UPLOAD.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.UPLOAD.MESSAGE.CONFIRM')}`,\r\n type: 'alert-confirm',\r\n onClickConfirm: () => onSave(event, language),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const onSave = async (event: React.ChangeEvent, language: LanguageType) => {\r\n const file = event.target.files?.[0]\r\n\r\n const formDataImage = new FormData()\r\n if (file) {\r\n formDataImage.append('userID', String(authenStore.profile.userId))\r\n formDataImage.append('language', language)\r\n formDataImage.append('files', file)\r\n\r\n const { result } = await postImageLogo(formDataImage)\r\n\r\n if (result.length > 0) {\r\n if (language === 'th') {\r\n setTemp({ ...temp, imgUpload_th: result[0].path, name_th: result[0].filename })\r\n form.change('imgUpload_th', result)\r\n } else {\r\n setTemp({ ...temp, imgUpload_en: result[0].path, name_en: result[0].filename })\r\n form.change('imgUpload_en', result)\r\n }\r\n setConfigDialog({\r\n title: `${translate.get('UM.UPLOAD.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.UPLOAD.MESSAGE.SUCCESS')}`,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n setConfigDialog({\r\n title: `${translate.get('UM.UPLOAD.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.UPLOAD.MESSAGE.ERROR')}`,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n return (\r\n \r\n \r\n {translate.get('UM.UPLOAD.SIGNATURE_TH')}\r\n \r\n \r\n \r\n {temp.name_th ? temp.name_th : ''}\r\n \r\n \r\n onUpload(event, 'th')}\r\n color={'primary'}\r\n labelTitle={translate.get('BUTTON.UPLOAD')}\r\n />\r\n \r\n \r\n \r\n \r\n {translate.get('UM.UPLOAD.SIGNATURE_EN')}\r\n \r\n \r\n \r\n {temp.name_en ? temp.name_en : ''}\r\n \r\n \r\n onUpload(event, 'en')}\r\n color={'primary'}\r\n labelTitle={translate.get('BUTTON.UPLOAD')}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\nexport default UploadLogo\r\n\r\nconst usestyles = makeStyles((theme) => ({\r\n image: {\r\n display: 'flex',\r\n margin: '15px auto',\r\n objectFit: 'contain',\r\n },\r\n container: {\r\n padding: '8px 15px',\r\n },\r\n}))\r\n","import { Grid, Switch, Typography } from '@material-ui/core'\r\nimport { ChangeEvent, FC, useState } from 'react'\r\nimport { FormSpy } from 'react-final-form'\r\nimport useLoading from '../../../control/loading/useLoading'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport usePreferenceProfile from '../../../services/um/usePreferenceProfile'\r\n\r\nconst NotificationSetting: FC<{}> = () => {\r\n const translate = useTranslate()\r\n const preferenceProfileHook = usePreferenceProfile()\r\n const loadingHook = useLoading()\r\n const [firstTime, setFirstTime] = useState(true)\r\n const [isEnabled, setIsEnabled] = useState(true)\r\n\r\n const handleChangeValue = async (event: ChangeEvent) => {\r\n const isChecked = event.target.checked\r\n setIsEnabled(event.target.checked)\r\n loadingHook.loadingOpen()\r\n await preferenceProfileHook.putEmailSetting(isChecked)\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const subscribeForm = (formState: any) => {\r\n if (formState.values.enableEmail !== undefined && firstTime) {\r\n setIsEnabled(formState.values.enableEmail)\r\n setFirstTime(false)\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {translate.get('UM.PROFILE.EMAIL_NOTIFICATION')}\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.OFF')}\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.ON')}\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default NotificationSetting\r\n","import { useRef, useEffect, useState, FC } from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport { Form as FinalForm, FormRenderProps } from 'react-final-form'\r\n\r\nimport Button from '../../../control/button/button'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport FormDialogChangePassword from '../change-password/Form'\r\nimport FormDialogChangePasscode from '../change-passcode/Form'\r\n\r\nimport usePreferanceProfile, { FormProps } from '../../../services/um/usePreferenceProfile'\r\n\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport constUserGroup from '../../../constants/userGroup'\r\nimport UploadProfile from './UploadProfile'\r\nimport Information from './Information'\r\nimport Line from './Line'\r\nimport UploadLogo from './UploadLogo'\r\nimport NotificationSetting from './NotificationSetting'\r\n\r\ninterface FormPrfProps {\r\n onSaveInformation: (values: FormProps) => void\r\n getNewProfile: () => void\r\n}\r\nconst Form: FC = ({ onSaveInformation, getNewProfile }) => {\r\n const classes = useStyles()\r\n const t = useTranslate()\r\n const preferanceProfileHook = usePreferanceProfile()\r\n\r\n const authenStore = useAuthenStore()\r\n // const authenAction = useAuthenAction()\r\n\r\n const dialogChnagePasswordRef = useRef>()\r\n const dialogChnagePasscodeRef = useRef>()\r\n // const [configDialog, setConfigDialog] =\r\n // useState>()\r\n // const dialogTwoRef = useRef>()\r\n const formPropsRef = useRef()\r\n\r\n const [initialForm, setInitialForm] = useState()\r\n\r\n useEffect(() => {\r\n getInitialForm()\r\n }, [authenStore.profile.userId])\r\n\r\n const getInitialForm = async () => {\r\n const data = await preferanceProfileHook.getPreferanceProfile(authenStore.profile.userId)\r\n\r\n setInitialForm(data)\r\n }\r\n\r\n const validateForm = (values: FormProps) => {\r\n const errors: any = {}\r\n if (!values.username) {\r\n errors.username = t.get('LABEL.REQUIRE_FIELD')\r\n }\r\n // if (!values.email) {\r\n // errors.email = t.get('LABEL.REQUIRE_FIELD')\r\n // }\r\n if (!values.nameTH) {\r\n errors.nameTH = t.get('LABEL.REQUIRE_FIELD')\r\n }\r\n if (!values.nameEN) {\r\n errors.nameEN = t.get('LABEL.REQUIRE_FIELD')\r\n }\r\n // if (!values.telephone) {\r\n // errors.telephone = t.get('LABEL.REQUIRE_FIELD')\r\n // }\r\n return errors\r\n }\r\n\r\n const onRefDialogChnagePassword = (func: Record) => {\r\n dialogChnagePasswordRef.current = func\r\n }\r\n\r\n const onRefDialogChangePasscode = (func: Record) => {\r\n dialogChnagePasscodeRef.current = func\r\n }\r\n\r\n const handleOpenDialogChangePassword = () => {\r\n dialogChnagePasswordRef.current?.openDialog()\r\n }\r\n\r\n const handleOpenDialogChangePasscode = () => {\r\n dialogChnagePasscodeRef.current?.openDialog()\r\n }\r\n\r\n const handleClickConfirm = () => {\r\n formPropsRef.current?.handleSubmit()\r\n getInitialForm()\r\n }\r\n\r\n const onRefFormProps = (func: FormRenderProps) => {\r\n formPropsRef.current = func\r\n }\r\n\r\n const onRefCloseDialog = () => {\r\n dialogChnagePasswordRef.current?.closeDialog()\r\n dialogChnagePasscodeRef.current?.closeDialog()\r\n getInitialForm()\r\n }\r\n\r\n const isShowChangPassword =\r\n authenStore.profile.userGroupId !== constUserGroup.researcher &&\r\n authenStore.profile.userGroupId !== constUserGroup.committee\r\n\r\n return (\r\n <>\r\n \r\n {({ handleSubmit, form, values }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {t.get('UM.PROFILE.PERSONAL_INFORMATION')}\r\n \r\n \r\n \r\n {t.get('UM.PROFILE.IMG_PROFILE')}\r\n \r\n {t.get('UM.PROFILE.CHANGE_IMG_ONSITE')}\r\n \r\n \r\n \r\n {\r\n e.target.src = `${process.env.PUBLIC_URL}/img/default.jpg`\r\n }}\r\n />\r\n
\r\n
\r\n \r\n
\r\n \r\n {t.get('UM.PROFILE.MAXIMUM_FILE_UPLOAD')}\r\n \r\n
\r\n
\r\n
\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {initialForm && !initialForm.cu_net && (\r\n \r\n {t.get('UM.PROFILE.PASSWORD')}\r\n \r\n {t.get('UM.PROFILE.CHANGE_PASSWORD_REDIRECT_TO_LOGIN_PAGE')}\r\n \r\n \r\n )}\r\n {initialForm && !initialForm.cu_net && (\r\n \r\n \r\n \r\n \r\n {t.get('UM.PROFILE.CHANGE_PASSWORD')}\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {isShowChangPassword && (\r\n <>\r\n \r\n {t.get('UM.PROFILE.PASSCODE')}\r\n \r\n {t.get('UM.PROFILE.PASSCODE_FOR_SIGN_NAME')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t.get('UM.PROFILE.CHANGE_PASSCODE')}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n {initialForm &&\r\n initialForm.usergroupID.filter((item) => {\r\n return item !== 1\r\n }).length > 0 && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {initialForm &&\r\n initialForm.usergroupID.filter((item) => {\r\n if (item === 3 || item === 6 || item === 7) {\r\n return item\r\n }\r\n }).length > 0 && (\r\n <>\r\n \r\n \r\n \r\n {`${t.get(\r\n 'UM.UPLOAD.HEADER2',\r\n )}`}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n )\r\n }}\r\n
\r\n\r\n \r\n }\r\n onClickConfirm={handleClickConfirm}\r\n />\r\n\r\n \r\n }\r\n onClickConfirm={handleClickConfirm}\r\n />\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n padding: {\r\n paddingTop: theme.spacing(2),\r\n paddingBottom: theme.spacing(2),\r\n },\r\n elementUpload: {\r\n display: 'flex',\r\n gap: '30px',\r\n [theme.breakpoints.down('md')]: {\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n },\r\n },\r\n uploadFile: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '10px',\r\n [theme.breakpoints.down('md')]: {\r\n alignItems: 'center',\r\n },\r\n },\r\n image: {\r\n borderRadius: '50%',\r\n },\r\n}))\r\n\r\nexport default Form\r\n","import { useState, useRef } from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport Container from '@material-ui/core/Container'\r\n\r\nimport FormComponent from '../component/um/preference/Form'\r\n// import Line from '../component/um/preference/Line'\r\n\r\nimport usePreferanceProfile, { FormProps } from '../services/um/usePreferenceProfile'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport useLogin from '../services/authen/useLogin'\r\nimport useAuthenAction from '../stores/authen/authenAction'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\n\r\nconst Profile = () => {\r\n const classes = useStyles()\r\n const t = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const authenAction = useAuthenAction()\r\n const { getProfile } = useLogin()\r\n const { putPreferanceProfile } = usePreferanceProfile()\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const getNewProfile = async () => {\r\n const token = localStorage.getItem('accessToken')\r\n let loginType = null as 1 | 2 | null\r\n if (localStorage.getItem('loginType') && localStorage.getItem('loginType') === '1') {\r\n loginType = 1\r\n } else if (localStorage.getItem('loginType') && localStorage.getItem('loginType') === '2') {\r\n loginType = 2\r\n }\r\n if (loginType) {\r\n const profileRes = await getProfile(`${token}`, loginType)\r\n authenAction.setProfile(profileRes)\r\n }\r\n }\r\n\r\n const onSaveInformation = async (values: FormProps) => {\r\n setConfigDialog({\r\n title: t.get('ALERT.TITLE.NOTIFICATION'),\r\n content: t.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => save(values),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const save = async (values: any) => {\r\n const result = await putPreferanceProfile(authenStore.profile.userId, values)\r\n if (result.message === 'success') {\r\n setConfigDialog({\r\n title: t.get('ALERT.TITLE.NOTIFICATION'),\r\n content: t.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: getNewProfile,\r\n })\r\n return\r\n } else {\r\n setConfigDialog({\r\n title: t.get('ALERT.TITLE.ERROR'),\r\n content: t.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {/* */}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n padding: theme.spacing(3),\r\n [theme.breakpoints.down('md')]: {\r\n padding: theme.spacing(2),\r\n },\r\n },\r\n container: {\r\n [theme.breakpoints.down('md')]: {\r\n padding: theme.spacing(1),\r\n },\r\n },\r\n}))\r\n\r\nexport default Profile\r\n","import useCallApi from '../../utilities/axios'\r\nimport { encryption } from '../../utilities/encryption'\r\nimport * as umServiceURL from './umServiceURL'\r\n\r\nexport type FormType = {\r\n userID?: string\r\n email: string\r\n password: string\r\n}\r\nconst useActivate = () => {\r\n const callApi = useCallApi()\r\n\r\n const postActivate = async (userID: number, password: string) => {\r\n const { data } = await callApi.axiosPost({\r\n url: umServiceURL.postActivate,\r\n params: { userID, password: encryption(password) },\r\n })\r\n\r\n return data\r\n }\r\n\r\n const postActivateOTP = async (userID: number, token: string) => {\r\n const { data } = await callApi.axiosPost({\r\n url: umServiceURL.postActivateOTP,\r\n params: { userID, token },\r\n })\r\n\r\n return data\r\n }\r\n return { postActivate, postActivateOTP }\r\n}\r\n\r\nexport default useActivate\r\n","import { FC } from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport { ValidationErrors } from 'final-form'\r\n\r\nimport Button from '../../../control/button/button'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { IconButton } from '@material-ui/core'\r\nimport Visibility from '@material-ui/icons/Visibility'\r\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\r\n\r\ntype FormParam = {\r\n email: string\r\n password: string\r\n confirmPassword: string\r\n}\r\ninterface FormProps {\r\n onClickSubmit: (values: FormParam) => void\r\n onClickShowPassword: () => void\r\n onClickShowPasswordCf: () => void\r\n isShowPassword: boolean\r\n isShowPasswordCf: boolean\r\n email?: string\r\n}\r\n\r\nconst Form: FC = ({\r\n onClickSubmit,\r\n onClickShowPassword,\r\n onClickShowPasswordCf,\r\n isShowPassword,\r\n isShowPasswordCf,\r\n email,\r\n}) => {\r\n const classes = useStyles()\r\n const t = useTranslate()\r\n\r\n const validateForm = (values: FormParam) => {\r\n const errors: ValidationErrors = {}\r\n\r\n if (values.password && values.confirmPassword) {\r\n if (values.confirmPassword !== values.password) {\r\n errors.confirmPassword = t.get('MESSAGE.M019')\r\n }\r\n }\r\n\r\n return errors\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {t.get('UM.ACTIVATE.HEADER')}\r\n \r\n \r\n \r\n {({ handleSubmit, form }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {isShowPassword ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n required\r\n handleValueChange={(val: string) => {\r\n if (val) {\r\n const txt = val.replace(/[ก-๙]|\\s/g, '')\r\n form.change('password', txt)\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n {isShowPasswordCf ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n required\r\n handleValueChange={(val: string) => {\r\n if (val) {\r\n const txt = val.replace(/[ก-๙]|\\s/g, '')\r\n form.change('confirmPassword', txt)\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {t.get('UM.ACTIVATE.OK')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n title: {\r\n margin: '16px 0px',\r\n },\r\n root: {\r\n width: '667px',\r\n padding: '48px',\r\n },\r\n typo: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default Form\r\n","import { useRef, useState, useEffect } from 'react'\r\nimport LayoutPublic from '../component/web/layout/layoutPublic'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport useActivate, { FormType } from '../services/um/useActivate'\r\nimport Form from '../component/authen/activate/Form'\r\nimport usePDPA from '../services/authen/usePDPA'\r\nimport * as jwt from 'jsonwebtoken'\r\n\r\nimport ModalPDPA from '../component/um/PDPA/ModalPDPA'\r\nimport { useHistory, useLocation } from 'react-router-dom'\r\nimport { RoutePath } from '../router/routesConfig'\r\nimport { Container, Grid, makeStyles, Paper, Typography } from '@material-ui/core'\r\n\r\ninterface VerifyProps {\r\n payload: string\r\n secretOrPublicKey: jwt.Secret\r\n options: jwt.VerifyOptions\r\n}\r\n\r\nexport const verify = ({ payload, secretOrPublicKey, options }: VerifyProps): any => {\r\n const verifyToken = jwt.verify(payload, secretOrPublicKey, options, function (err, decoded) {\r\n if (err) {\r\n return { error: 'invalid token' }\r\n }\r\n return { decoded: decoded }\r\n })\r\n\r\n return verifyToken\r\n}\r\n\r\nconst Activate = () => {\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const classes = useStyles()\r\n const { get } = usePDPA()\r\n const dialogTwoRef = useRef>()\r\n const location = useLocation()\r\n const { postActivate, postActivateOTP } = useActivate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const [isShowPassword, setIsShowPassword] = useState(false)\r\n const [isShowPasswordCf, setIsShowPasswordCf] = useState(false)\r\n\r\n const [PDPA, setPDPA] = useState('')\r\n const [openPDPA, setOpenPDPA] = useState(false)\r\n\r\n const URL = new URLSearchParams(location.search)\r\n const token = URL.get('token')\r\n\r\n const decrypt =\r\n token &&\r\n verify({\r\n payload: token,\r\n secretOrPublicKey: `7398996DFFEF03A0B2E8461D32747BB71D2D204C`,\r\n options: {},\r\n })\r\n\r\n useEffect(() => {\r\n fetchPDPA()\r\n }, [token])\r\n\r\n const fetchPDPA = async () => {\r\n if (token) {\r\n const { password, error } = await postActivateOTP(decrypt?.decoded?.id, token)\r\n\r\n if (password) {\r\n return history.push(RoutePath.login)\r\n }\r\n\r\n console.log('WAIT PDPA FOR OPEN COMMENT')\r\n // const result = await get()\r\n // if (result) {\r\n // setOpenPDPA(true)\r\n // setPDPA(result[lang])\r\n // }\r\n\r\n // if (error) {\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.ERROR'),\r\n // content: translate.get('ALERT.CONTENT.INVALID_TOKEN'),\r\n // type: 'alert-message',\r\n // onAfterClose: () => goToLogin(),\r\n // })\r\n // dialogTwoRef.current?.openDialog()\r\n // }\r\n }\r\n }\r\n const save = async (values: FormType) => {\r\n const result = await postActivate(decrypt?.decoded?.id, values.password)\r\n if (result) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => goToLogin(),\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n return result\r\n }\r\n\r\n const onSubmit = async (values: FormType) => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => save(values),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onSwitchShow = () => {\r\n setIsShowPassword(!isShowPassword)\r\n }\r\n const onSwitchShowCf = () => {\r\n setIsShowPasswordCf(!isShowPasswordCf)\r\n }\r\n\r\n const goToLogin = () => {\r\n history.push(RoutePath.login)\r\n }\r\n\r\n const onAccept = () => {\r\n setOpenPDPA(false)\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.ACTIVATE.TITLE')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n rootContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n minHeight: 'calc(100vh - 96px)',\r\n [theme.breakpoints.down('sm')]: {\r\n margin: '0px',\r\n padding: '0px',\r\n },\r\n },\r\n root: {\r\n width: '100%',\r\n [theme.breakpoints.down('sm')]: {\r\n height: '100%',\r\n },\r\n },\r\n item: {\r\n [theme.breakpoints.down('sm')]: {\r\n height: '100%',\r\n },\r\n },\r\n paper: {\r\n width: '100%',\r\n // maxHeight: 'calc(100vh - 80px)',\r\n\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'transparent',\r\n boxShadow: 'none',\r\n },\r\n },\r\n container: {\r\n padding: '1.5rem',\r\n },\r\n typo: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default Activate\r\n","import { useRef, useState } from 'react'\r\nimport LayoutPublic from '../component/web/layout/layoutPublic'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport useActivate, { FormType } from '../services/um/useActivate'\r\nimport Form from '../component/authen/activate/Form'\r\nimport { useHistory, useLocation } from 'react-router-dom'\r\nimport { RoutePath } from '../router/routesConfig'\r\nimport { verify } from './Activate'\r\nimport { Container, Grid, makeStyles, Paper, Typography } from '@material-ui/core'\r\n\r\nconst ActivateForgot = () => {\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const location = useLocation()\r\n const classes = useStyles()\r\n const { postActivate } = useActivate()\r\n\r\n const dialogTwoRef = useRef>()\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const [isShowPassword, setIsShowPassword] = useState(false)\r\n const [isShowPasswordCf, setIsShowPasswordCf] = useState(false)\r\n\r\n const URL = new URLSearchParams(location.search)\r\n const token = URL.get('token')\r\n\r\n const decrypt =\r\n token &&\r\n verify({\r\n payload: token,\r\n secretOrPublicKey: `F04507DDB0103B7D206FBCBD212ED26D74484430`,\r\n options: {},\r\n })\r\n\r\n const save = async (values: FormType) => {\r\n const result = await postActivate(decrypt?.decoded.id, values.password)\r\n if (result.message === 'not found') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => goToLogin(),\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n return\r\n }\r\n if (result) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => goToLogin(),\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n return result\r\n }\r\n\r\n const onSubmit = async (values: FormType) => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => save(values),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onSwitchShow = () => {\r\n setIsShowPassword(!isShowPassword)\r\n }\r\n const onSwitchShowCf = () => {\r\n setIsShowPasswordCf(!isShowPasswordCf)\r\n }\r\n\r\n const goToLogin = () => {\r\n history.push(RoutePath.login)\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.ACTIVATE.TITLE')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n rootContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n minHeight: 'calc(100vh - 96px)',\r\n [theme.breakpoints.down('sm')]: {\r\n margin: '0px',\r\n padding: '0px',\r\n },\r\n },\r\n root: {\r\n width: '100%',\r\n [theme.breakpoints.down('sm')]: {\r\n height: '100%',\r\n },\r\n },\r\n item: {\r\n [theme.breakpoints.down('sm')]: {\r\n height: '100%',\r\n },\r\n },\r\n paper: {\r\n width: '100%',\r\n\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'transparent',\r\n boxShadow: 'none',\r\n },\r\n },\r\n container: {\r\n padding: '1.5rem',\r\n },\r\n typo: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default ActivateForgot\r\n","import { makeStyles, Typography } from '@material-ui/core'\r\nimport { FC } from 'react'\r\nimport isEmpty from 'lodash/isEmpty'\r\nimport { VictoryPie, VictoryTooltip } from 'victory'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { ResponseInprogress } from '../../../services/um/useDashboard'\r\nimport EmptyData from '../officer/EmptyData'\r\n\r\ninterface InProgressProps {\r\n data: ResponseInprogress[]\r\n}\r\n\r\nconst InProgress: FC = ({ data }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n const dataPie = data.map((item) => {\r\n return {\r\n x: item.id,\r\n y: item.value,\r\n name: item.label[lang],\r\n }\r\n })\r\n\r\n const dataLegend = data.map((item) => {\r\n return {\r\n id: item.id,\r\n name: item.label[lang],\r\n fill: item.color[0],\r\n }\r\n })\r\n\r\n const pieColor = data.map((item) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n })\r\n\r\n const isValue = Object.values(data).every((item) => item.value === 0 || item.value === null)\r\n\r\n return (\r\n <>\r\n {translate.get('UM.DASHBOARD.ÏN_PROGRESS')}\r\n\r\n
\r\n \r\n ''}\r\n labelComponent={\r\n } />\r\n }\r\n innerRadius={110}\r\n radius={170}\r\n data={dataPie}\r\n colorScale={[`url(#gradient1)`, `url(#gradient2)`, `url(#gradient3)`]}\r\n events={[\r\n {\r\n target: 'data',\r\n eventHandlers: {\r\n onMouseOver: () => {\r\n return [\r\n {\r\n target: 'data',\r\n mutation: () => ({ radius: 190 }),\r\n },\r\n {\r\n target: 'labels',\r\n mutation: () => ({ active: true }),\r\n },\r\n ]\r\n },\r\n onMouseOut: () => {\r\n return [\r\n {\r\n target: 'data',\r\n mutation: () => null,\r\n },\r\n {\r\n target: 'labels',\r\n mutation: () => null,\r\n },\r\n ]\r\n },\r\n },\r\n },\r\n ]}\r\n padding={0}\r\n />\r\n\r\n {pieColor}\r\n \r\n
\r\n {isEmpty(data) || isValue ? null : (\r\n
\r\n {dataLegend.map((item) => {\r\n return (\r\n \r\n \r\n \r\n \r\n

{item.name}

\r\n
\r\n )\r\n })}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nconst CustomLabel = ({ x, y, datum }: any) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n return (\r\n \r\n \r\n
\r\n \r\n {datum.name}\r\n \r\n \r\n {datum.y}\r\n \r\n \r\n {translate.get('UM.DASHBOARD.UNIT_PROJECT')}\r\n \r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n chart: {\r\n width: '300px',\r\n height: '312px',\r\n margin: 'auto',\r\n display: 'block',\r\n },\r\n legend: {\r\n width: '100%',\r\n textAlign: 'center',\r\n },\r\n tooltipContainer: {\r\n position: 'relative',\r\n textAlign: 'center',\r\n },\r\n tooltipLabel: {},\r\n header: {\r\n margin: '0px 8px',\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default InProgress\r\n","import { Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { isEmpty } from 'lodash'\r\nimport { FC } from 'react'\r\nimport { Form } from 'react-final-form'\r\nimport {\r\n VictoryBar,\r\n VictoryChart,\r\n VictoryGroup,\r\n VictoryAxis,\r\n VictoryLabel,\r\n VictoryTooltip,\r\n VictoryLine,\r\n VictoryVoronoiContainer,\r\n} from 'victory'\r\nimport MySelectCtrl from '../../../control/select/select'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { ResponseStatus } from '../../../services/um/useDashboard'\r\nimport EmptyData from '../officer/EmptyData'\r\nimport Tooltip from '../../../control/tooltip/tooltip'\r\n\r\ninterface AverageStatusTimeProps {\r\n data: ResponseStatus[]\r\n onChange: (val: string) => void\r\n}\r\n\r\nexport enum UserGroupIDType {\r\n researcher = '1',\r\n officer = '2',\r\n chairman = '3',\r\n committee = '4',\r\n}\r\n\r\nconst AverageStatusTime: FC = ({ data, onChange }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n const dataLegend = data.map((item) => {\r\n return {\r\n id: item.id,\r\n name: item.label[lang],\r\n fill: item.color[0],\r\n }\r\n })\r\n\r\n let dataChart = data.map((item) => {\r\n return item.value.map((val: any) => {\r\n return { x: val.label[lang], y: val.value }\r\n })\r\n })\r\n if (data[0]?.value.length === 1) {\r\n dataChart = [\r\n [{ x: '..', y: 0 }, ...dataChart[0], { x: '.', y: 0 }],\r\n [{ x: '..', y: 0 }, ...dataChart[1], { x: '.', y: 0 }],\r\n [{ x: '..', y: 0 }, ...dataChart[2], { x: '.', y: 0 }],\r\n ]\r\n }\r\n\r\n const standardLine = data.map((item, index) => {\r\n let x = 0\r\n if (item.value.length > 1) {\r\n if (index === 1) {\r\n if (data[1].value.length === 2) {\r\n x += 0.14\r\n } else {\r\n x += 0.16\r\n }\r\n } else if (index === 2) {\r\n if (data[1].value.length < 3) {\r\n x += 0.143\r\n } else {\r\n x += 0.165\r\n }\r\n }\r\n } else {\r\n if (index === 0) {\r\n x += 0.9\r\n } else if (index === 1) {\r\n x += 0.05 + index\r\n }\r\n }\r\n return item.value.map((val: any, idx) => {\r\n if (idx === 0) {\r\n x += 0.9\r\n } else {\r\n x += 0\r\n }\r\n return { x: idx + x, y: val?.standardLine }\r\n })\r\n })\r\n\r\n const userGroupID = [\r\n {\r\n value: UserGroupIDType.researcher,\r\n label: translate.languageStore.currentLanguage === 'th' ? 'นักวิจัย' : 'Researcher',\r\n },\r\n {\r\n value: UserGroupIDType.officer,\r\n label: translate.languageStore.currentLanguage === 'th' ? 'เจ้าหน้าที่' : 'Officer',\r\n },\r\n {\r\n value: UserGroupIDType.chairman,\r\n label: translate.languageStore.currentLanguage === 'th' ? 'ประธาน/รองประธาน/เลขาธิการ' : 'Chairman',\r\n },\r\n {\r\n value: UserGroupIDType.committee,\r\n label: translate.languageStore.currentLanguage === 'th' ? 'กรรมการ' : 'Committee',\r\n },\r\n ]\r\n\r\n const barColor = data.map((item) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n })\r\n console.log(standardLine)\r\n return (\r\n <>\r\n \r\n {translate.get('UM.DASHBOARD.AVERAGE_STATUS')}\r\n\r\n \r\n
{}}>\r\n {() => (\r\n \r\n )}\r\n \r\n
\r\n
\r\n\r\n
\r\n \r\n }\r\n >\r\n \r\n }\r\n style={{\r\n axis: { stroke: '#D9D9D9' },\r\n tickLabels: { fontSize: '8px', padding: 5, fill: '#3B4859', fontFamily: 'Prompt' },\r\n }}\r\n />\r\n \r\n }\r\n style={{\r\n axis: { stroke: '#D9D9D9' },\r\n grid: { stroke: '#818e99', strokeWidth: 0.2 },\r\n tickLabels: { fontSize: '8px', padding: 5, fill: '#3B4859', fontFamily: 'Prompt' },\r\n }}\r\n />\r\n \r\n ''}\r\n data={dataChart[0]}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n name=\"bar1\"\r\n />\r\n ''}\r\n data={dataChart[1]}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n name=\"bar2\"\r\n />\r\n ''}\r\n data={dataChart[2]}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n name=\"bar3\"\r\n />\r\n \r\n {standardLine[0]?.map((item, idx) => {\r\n const dataLine = [\r\n {\r\n ...item,\r\n x:\r\n standardLine[0].length === 2\r\n ? 0.97 + idx\r\n : standardLine[0].length === 1\r\n ? 1.945\r\n : 0.822 + idx,\r\n },\r\n item,\r\n ]\r\n if (standardLine[0].length === 2) {\r\n dataLine.push({ ...item, x: 0.9 + idx })\r\n } else if (standardLine[0].length === 3) {\r\n dataLine.push({ ...item, x: 0.032 + item.x })\r\n } else if (standardLine[0].length > 3) {\r\n dataLine.push({ ...item, x: 0.6 + idx })\r\n }\r\n return (\r\n ''}\r\n labelComponent={\r\n data[0]?.value.length > 3 && idx === 2 ? (\r\n <>\r\n ) : (\r\n \r\n }\r\n />\r\n )\r\n }\r\n />\r\n )\r\n })}\r\n {standardLine[1]?.map((item, idx) => {\r\n let dataLine = [\r\n {\r\n ...item,\r\n x:\r\n standardLine[0].length === 2\r\n ? 0.973 + idx\r\n : standardLine[0].length === 1\r\n ? 2.1\r\n : 0.941 + idx,\r\n },\r\n item,\r\n ]\r\n if (standardLine[1].length === 2) {\r\n dataLine.push({ ...item, x: 0.974 + idx })\r\n } else if (standardLine[1].length === 3) {\r\n dataLine.push({ ...item, x: item.x })\r\n } else if (standardLine[1].length > 3) {\r\n dataLine.push({ ...item, x: 0.91 + idx })\r\n dataLine.push({ ...item, x: 1.19 + idx })\r\n }\r\n return (\r\n ''}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n />\r\n )\r\n })}\r\n {standardLine[2]?.map((item, idx) => {\r\n let dataLine =\r\n standardLine[0].length === 1\r\n ? [\r\n {\r\n ...item,\r\n x: standardLine[0].length === 1 ? 2.105 : 0,\r\n },\r\n ]\r\n : []\r\n if (standardLine[2].length === 1) {\r\n dataLine.push({ ...item, x: 2.25 })\r\n } else if (standardLine[2].length === 2) {\r\n dataLine.push(item)\r\n dataLine.push({ ...item, x: 1.11 + idx })\r\n } else if (standardLine[2].length === 3) {\r\n dataLine.push(item)\r\n dataLine.push({ ...item, x: 1.1 + idx })\r\n dataLine.push({ ...item, x: 0.116 + item.x })\r\n } else if (standardLine[2].length > 3) {\r\n dataLine.push({ ...item, x: 1.2 + idx })\r\n dataLine.push({ ...item, x: 1.48 + idx })\r\n }\r\n return (\r\n ''}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n />\r\n )\r\n })}\r\n \r\n {barColor}\r\n \r\n
\r\n
\r\n {dataLegend.map((item) => {\r\n return (\r\n \r\n \r\n \r\n \r\n

{item.name}

\r\n
\r\n )\r\n })}\r\n \r\n \r\n )\r\n}\r\n\r\nconst CustomLabel = (props: any) => {\r\n const { x, y, datum, label } = props\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n return (\r\n \r\n \r\n
\r\n {label}\r\n {`${datum.xName} ${datum.y} ${translate.get(\r\n 'UM.DASHBOARD.UNIT_DAY',\r\n )}`}\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nconst CustomLabelLine = (props: any) => {\r\n let { x, y, datum, dataBar } = props\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n if (datum.y === dataBar.y) {\r\n y -= 50\r\n } else if (datum.y + 1 === dataBar) {\r\n x -= 90\r\n }\r\n return (\r\n \r\n \r\n
\r\n \r\n {translate.get('UM.DASHBOARD.STANDARD_LINE')}\r\n \r\n \r\n {dataBar.x} {datum.y} {translate.get('UM.DASHBOARD.UNIT_DAY')}\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n chart: {\r\n display: 'block',\r\n\r\n padding: 0,\r\n margin: 0,\r\n },\r\n legend: {\r\n width: '100%',\r\n textAlign: 'center',\r\n },\r\n tooltipContainer: {\r\n position: 'relative',\r\n textAlign: 'center',\r\n },\r\n container: {\r\n margin: '0px',\r\n display: 'inline-block',\r\n borderRadius: '4px',\r\n backgroundColor: '#ffffff',\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n verticalAlign: 'middle',\r\n padding: '8px',\r\n },\r\n header: {\r\n margin: '0px 8px',\r\n fontWeight: 'bold',\r\n },\r\n tooltipLabel: {\r\n fontSize: '8px',\r\n },\r\n selectUser: {\r\n marginTop: '-45px',\r\n },\r\n}))\r\n\r\nexport default AverageStatusTime\r\n","import { useState, useEffect } from 'react'\r\nimport * as _ from 'lodash'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nimport { VictoryBar, VictoryChart, VictoryAxis, VictoryTooltip, VictoryLabel } from 'victory'\r\nimport { makeStyles, Typography } from '@material-ui/core'\r\nimport EmptyData from '../officer/EmptyData'\r\n\r\ntype AverageProjectType = {\r\n label: {\r\n th: string\r\n en: string\r\n }\r\n id: number\r\n value: number\r\n color: string[]\r\n}\r\n\r\ntype AverageProjectTimeComponentProps = {\r\n data: AverageProjectType[]\r\n}\r\n\r\nconst AverageProjectTime = ({ data }: AverageProjectTimeComponentProps) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n const [projectList, setProjectList] = useState([])\r\n\r\n useEffect(() => {\r\n const sortData = _.orderBy(data, ['id'], ['desc'])\r\n setProjectList(sortData)\r\n }, [data])\r\n\r\n const TootipChartComponent = ({ ...props }) => {\r\n const { x, y, datum, dx, dy } = props\r\n return (\r\n \r\n \r\n \r\n {`${datum.x} : ${datum.y} ${translate.get('UM.DASHBOARD.UNIT_DAY')}`}\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {translate.get('UM.DASHBOARD.AVERAGE_PROJECT')}\r\n
\r\n {projectList &&\r\n projectList.length > 0 &&\r\n projectList.map((item: AverageProjectType, index: number) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n\r\n \r\n \r\n ''}\r\n standalone={false}\r\n axisLabelComponent={\r\n \r\n }\r\n tickValues={projectList.map((item: AverageProjectType, index: number) => index + 1)}\r\n tickFormat={projectList.map((item: AverageProjectType) => item.label[lang])}\r\n style={{\r\n axisLabel: {\r\n fontSize: '8px',\r\n fill: '#B9B9B9',\r\n fontFamily: 'Prompt',\r\n },\r\n axis: { stroke: '#BDBDBD' },\r\n tickLabels: { fontSize: '8px', padding: 5, fill: '#3B4859', fontFamily: 'Prompt' },\r\n }}\r\n />\r\n ''}\r\n axisLabelComponent={\r\n \r\n }\r\n tickLabelComponent={}\r\n style={{\r\n axisLabel: {\r\n fontSize: '8px',\r\n fill: '#B9B9B9',\r\n fontFamily: 'Prompt',\r\n },\r\n grid: { stroke: '#BDBDBD', strokeWidth: '0.5' },\r\n axis: { stroke: '#BDBDBD' },\r\n tickLabels: { fontSize: '8px', padding: 5, fill: '#3B4859', fontFamily: 'Prompt' },\r\n }}\r\n />\r\n\r\n }\r\n />\r\n }\r\n style={{\r\n data: {\r\n fill: (datum) => {\r\n return `url(#myGradient${datum.index})`\r\n },\r\n width: 15,\r\n },\r\n }}\r\n data={projectList.map((item: AverageProjectType) => {\r\n return { x: item.label[lang], y: item.value }\r\n })}\r\n labels={() => ''}\r\n />\r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n header: {\r\n margin: '0px 8px',\r\n fontWeight: 'bold',\r\n },\r\n chart: {\r\n display: 'block',\r\n padding: 0,\r\n margin: 0,\r\n height: '340px',\r\n },\r\n}))\r\n\r\nexport default AverageProjectTime\r\n","import useCallApi from '../../utilities/axios'\r\nimport * as umServiceURL from './umServiceURL'\r\n\r\nexport type ParamType = {\r\n userID: string\r\n startDate: string\r\n endDate: string\r\n userGroupID: string\r\n}\r\n\r\nexport type ParamEachFacultyType = {\r\n userID: string\r\n startDate: string\r\n endDate: string\r\n userGroupID: string\r\n facultyID: number | null\r\n}\r\n\r\nexport type ParamDataToExportType = {\r\n userID: string\r\n startDate: string\r\n endDate: string\r\n}\r\n\r\ntype Translation = { th: string; en: string }\r\n\r\nexport type ResponseInprogress = {\r\n id: number\r\n value: number\r\n label: Translation\r\n color: string[]\r\n}\r\n\r\nexport type ResponseStatus = {\r\n id: number\r\n value: {\r\n id: number\r\n value: number\r\n label: Translation\r\n }[]\r\n label: Translation\r\n color: string[]\r\n}\r\n\r\nexport type ResponseOverview = {\r\n id: number\r\n number: number\r\n label: Translation\r\n}\r\n\r\nexport type ResponseFaculty = {\r\n id: number\r\n value: number\r\n label: Translation\r\n}\r\n\r\nexport type ResponseEachFaculty = {\r\n id: number\r\n value: {\r\n id: number\r\n value: number\r\n label: Translation\r\n standardLine: number\r\n }[]\r\n label: Translation\r\n color: string[]\r\n}\r\n\r\nexport type ResponseDataExport = {\r\n columns: { name: string; group: { name: string } | null }[]\r\n rows: any[][]\r\n}\r\n\r\nexport type ResponseDataApproveStatus = {\r\n id: number\r\n number: number\r\n label: Translation\r\n}\r\n\r\nconst useDashboard = () => {\r\n const callApi = useCallApi()\r\n const getInprogress = async (values: ParamType) => {\r\n const url = new URL(umServiceURL.getDBInprogress)\r\n url.searchParams.set('userID', values?.userID)\r\n url.searchParams.set('startDate', values?.startDate)\r\n url.searchParams.set('endDate', values?.endDate)\r\n url.searchParams.set('userGroupID', values?.userGroupID)\r\n const { data } = await callApi.axiosGet({\r\n url,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getAverageStatus = async (values: ParamType) => {\r\n const url = new URL(umServiceURL.getDBAverageStatus)\r\n url.searchParams.set('userID', values?.userID)\r\n url.searchParams.set('startDate', values?.startDate)\r\n url.searchParams.set('endDate', values?.endDate)\r\n url.searchParams.set('userGroupID', values?.userGroupID)\r\n const { data } = await callApi.axiosGet({\r\n url,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getAverageProject = async (values: ParamType) => {\r\n const url = new URL(umServiceURL.getDBAverageProject)\r\n url.searchParams.set('userID', values?.userID)\r\n url.searchParams.set('startDate', values?.startDate)\r\n url.searchParams.set('endDate', values?.endDate)\r\n url.searchParams.set('userGroupID', values?.userGroupID)\r\n const { data } = await callApi.axiosGet({\r\n url,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getOverview = async (values: ParamType) => {\r\n const url = new URL(umServiceURL.getDBOverview)\r\n url.searchParams.set('userID', values?.userID)\r\n url.searchParams.set('startDate', values?.startDate)\r\n url.searchParams.set('endDate', values?.endDate)\r\n url.searchParams.set('userGroupID', values?.userGroupID)\r\n const { data } = await callApi.axiosGet({\r\n url,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getAverageFaculty = async (values: ParamType) => {\r\n const url = new URL(umServiceURL.getDBAverageFaculty)\r\n url.searchParams.set('userID', values?.userID)\r\n url.searchParams.set('startDate', values?.startDate)\r\n url.searchParams.set('endDate', values?.endDate)\r\n url.searchParams.set('userGroupID', values?.userGroupID)\r\n const { data } = await callApi.axiosGet({\r\n url,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getAverageEachFaculty = async (values: ParamEachFacultyType) => {\r\n const url = new URL(umServiceURL.getDBAverageEachFaculty)\r\n url.searchParams.set('userID', values?.userID)\r\n url.searchParams.set('startDate', values?.startDate)\r\n url.searchParams.set('endDate', values?.endDate)\r\n url.searchParams.set('userGroupID', values?.userGroupID)\r\n url.searchParams.set('facultyID', String(values?.facultyID))\r\n const { data } = await callApi.axiosGet({\r\n url,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getDataToExport = async (values: ParamDataToExportType) => {\r\n const url = new URL(umServiceURL.getExportData)\r\n url.searchParams.set('userID', values.userID)\r\n url.searchParams.set('startDate', values.startDate)\r\n url.searchParams.set('endDate', values.endDate)\r\n const { data } = await callApi.axiosGet<{ data: ResponseDataExport[] }>({ url })\r\n\r\n return data.data\r\n }\r\n\r\n const getDataApproveStatus = async (values: ParamDataToExportType) => {\r\n const url = new URL(umServiceURL.getDataApproveStatus)\r\n url.searchParams.set('userID', values.userID)\r\n url.searchParams.set('startDate', values.startDate)\r\n url.searchParams.set('endDate', values.endDate)\r\n const { data } = await callApi.axiosGet({ url })\r\n\r\n return data\r\n }\r\n\r\n return {\r\n getInprogress,\r\n getAverageStatus,\r\n getAverageProject,\r\n getOverview,\r\n getAverageFaculty,\r\n getAverageEachFaculty,\r\n getDataToExport,\r\n getDataApproveStatus,\r\n }\r\n}\r\n\r\nexport default useDashboard\r\n","import { Box, Grid, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport React, { FC } from 'react'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\n\r\ninterface ItemProps {\r\n title: string\r\n value: number\r\n isAll: boolean\r\n}\r\nconst Items: FC = ({ title, value, isAll }) => {\r\n const classes = useStyles({ isAll })\r\n\r\n return (\r\n \r\n \r\n {value}\r\n \r\n {title}\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n typo: {\r\n color: '#ffffff',\r\n marginBottom: '8px',\r\n },\r\n watermark1: {\r\n opacity: '0.075',\r\n color: '#ffffff',\r\n position: 'absolute',\r\n top: '0',\r\n left: '30%',\r\n [theme.breakpoints.down('xs')]: {\r\n left: '35%',\r\n },\r\n },\r\n watermark2: {\r\n opacity: '0.075',\r\n color: '#ffffff',\r\n position: 'absolute',\r\n top: '10%',\r\n left: '50%',\r\n },\r\n boxItem: {\r\n height: '130px',\r\n position: 'relative',\r\n cursor: 'pointer',\r\n fontWeight: 'bold',\r\n margin: ' 8px',\r\n padding: '24px 24px 0px 24px',\r\n border: '1px solid #bdbdbd',\r\n borderRadius: '6px',\r\n background: (props: { isAll: boolean }) => {\r\n if (props.isAll) {\r\n return 'linear-gradient(#DB5F8E, #6E3047)'\r\n } else {\r\n return 'linear-gradient(#58A4B0, #2C5258)'\r\n }\r\n },\r\n },\r\n}))\r\n\r\nexport default Items\r\n","import { makeStyles } from '@material-ui/core'\r\nimport { FC } from 'react'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport { ResponseOverview } from '../../../../services/um/useDashboard'\r\nimport Items from './Items'\r\n\r\ninterface OverviewProps {\r\n data: ResponseOverview[]\r\n}\r\n\r\nconst Overview: FC = ({ data }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n let newData = data.slice(1)\r\n newData = newData.filter((itm) => {\r\n return itm.id !== 7 && itm.id !== 8\r\n })\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n {newData.map((item) => {\r\n if (item.id === 4) {\r\n //ไม่เข้าข่าย/ไม่อนุมัติ >>> data[7].label[lang] = ไม่เข้าข่าย\r\n return (\r\n
\r\n \r\n
\r\n )\r\n }\r\n if (item.id === 5) {\r\n //ยุติโครงการ/ปิดโครงการ >>> data[6].label[lang] = ปิดโครงการ\r\n return (\r\n
\r\n \r\n
\r\n )\r\n } else {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n }\r\n })}\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n width: '100%',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n content: {\r\n width: '16.66%',\r\n flexGrow: 1,\r\n\r\n overflow: 'hidden',\r\n [theme.breakpoints.down('md')]: {\r\n width: '25%',\r\n minWidth: '220px',\r\n maxWidth: '236px',\r\n },\r\n [theme.breakpoints.down('sm')]: {\r\n width: '33.33%',\r\n minWidth: '200px',\r\n maxWidth: '260px',\r\n },\r\n\r\n [theme.breakpoints.down('xs')]: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n },\r\n },\r\n}))\r\n\r\nexport default Overview\r\n","import { Typography, makeStyles, Grid } from '@material-ui/core'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport EmptyData from '../officer/EmptyData'\r\nimport _ from 'lodash'\r\nimport { VictoryAxis, VictoryBar, VictoryChart, VictoryLabel, VictoryTooltip, VictoryVoronoiContainer } from 'victory'\r\nimport { useEffect, useState } from 'react'\r\nimport { Pagination } from '@material-ui/lab'\r\n\r\ntype AverageFacultyType = {\r\n label: {\r\n th: string\r\n en: string\r\n }\r\n id: number\r\n value: number\r\n}\r\n\r\ntype AverageFacultyComponentProps = {\r\n data: AverageFacultyType[]\r\n onClick: (facultyID: number, faculty: string) => void\r\n}\r\n\r\nfunction AverageFaculty({ data, onClick }: AverageFacultyComponentProps) {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const [page, setPage] = useState(0)\r\n const pageCount = 10\r\n\r\n const [projectList, setProjectList] = useState([])\r\n const [projectListGraph, setProjectListGraph] = useState([])\r\n\r\n useEffect(() => {\r\n setProjectList(data)\r\n }, [data])\r\n\r\n useEffect(() => {\r\n const listData = [...projectList].slice(page * pageCount, (page + 1) * pageCount)\r\n setProjectListGraph(listData)\r\n }, [projectList, page])\r\n return (\r\n <>\r\n \r\n {translate.get('UM.DASHBOARD.AVERAGE_FACULTY')} \r\n\r\n \r\n {\r\n setPage(value - 1)\r\n onClick(0, '')\r\n }}\r\n />\r\n \r\n \r\n\r\n
\r\n \r\n '.'}\r\n mouseFollowTooltips={true}\r\n voronoiDimension={'x'}\r\n activateLabels={true}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n />\r\n }\r\n >\r\n ''}\r\n standalone={false}\r\n axisLabelComponent={\r\n \r\n }\r\n tickFormat={(tick) => {\r\n return tick.length > 24 ? `${tick.slice(0, 21)}...` : tick\r\n }}\r\n style={{\r\n axisLabel: {\r\n fontSize: '8px',\r\n fill: '#B9B9B9',\r\n fontFamily: 'Prompt',\r\n },\r\n axis: { stroke: '#BDBDBD' },\r\n tickLabels: {\r\n fontSize: '8px',\r\n padding: 4,\r\n fill: '#3B4859',\r\n fontFamily: 'Prompt',\r\n },\r\n }}\r\n // tickComponent={}\r\n />\r\n\r\n \r\n Number.isInteger(tick) ? tick : tick.toString().includes('e') ? null : tick.toFixed(1)\r\n }\r\n dependentAxis\r\n standalone={false}\r\n label={() => ''}\r\n axisLabelComponent={\r\n \r\n }\r\n tickLabelComponent={}\r\n style={{\r\n axisLabel: {\r\n fontSize: '8px',\r\n fill: '#B9B9B9',\r\n fontFamily: 'Prompt',\r\n },\r\n grid: { stroke: '#BDBDBD', strokeWidth: '0.5' },\r\n axis: { stroke: '#BDBDBD' },\r\n tickLabels: { fontSize: '8px', padding: 5, fill: '#3B4859', fontFamily: 'Prompt' },\r\n }}\r\n />\r\n\r\n }\r\n style={{\r\n data: {\r\n fill: () => {\r\n return `url(#myGradient_3)`\r\n },\r\n width: 15,\r\n },\r\n labels: { fontSize: '8px' },\r\n }}\r\n data={projectListGraph.map((item: AverageFacultyType) => {\r\n return { x: item.label[lang].toString(), y: item.value }\r\n })}\r\n labels={({ datum }) =>\r\n `${datum.y} ${translate.languageStore.currentLanguage === 'th' ? 'วัน' : 'day(s)'}`\r\n }\r\n events={[\r\n {\r\n target: 'data',\r\n eventHandlers: {\r\n onClick: () => {\r\n return [\r\n {\r\n target: 'data',\r\n mutation: ({ datum }) => {\r\n const facultyObj = projectListGraph.find(\r\n (facultyObj) => facultyObj.label[lang] === datum.xName,\r\n )\r\n onClick(Number(facultyObj?.id), String(facultyObj?.label[lang]))\r\n },\r\n },\r\n ]\r\n },\r\n },\r\n },\r\n ]}\r\n />\r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nconst CustomLabel = (props: any) => {\r\n const { x, y, datum, ...other } = props\r\n\r\n const classes = useStyles()\r\n\r\n if (props.center.x > 100) {\r\n return (\r\n \r\n \r\n
\r\n {datum.xName}\r\n
\r\n \r\n
\r\n )\r\n } else {\r\n return (\r\n \r\n \r\n
\r\n {datum.xName}\r\n
\r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n chart: {\r\n display: 'block',\r\n padding: 0,\r\n margin: 0,\r\n },\r\n header: {\r\n margin: '0px 8px',\r\n fontWeight: 'bold',\r\n },\r\n container: {\r\n margin: '0px',\r\n display: 'inline-block',\r\n borderRadius: '4px',\r\n backgroundColor: '#ffffff',\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n verticalAlign: 'middle',\r\n padding: '8px',\r\n },\r\n tooltipLabel: {\r\n fontSize: '8px',\r\n },\r\n}))\r\n\r\nexport default AverageFaculty\r\n","import { Typography, makeStyles } from '@material-ui/core'\r\nimport { isEmpty } from 'lodash'\r\nimport {\r\n VictoryAxis,\r\n VictoryBar,\r\n VictoryChart,\r\n VictoryGroup,\r\n VictoryLabel,\r\n VictoryLine,\r\n VictoryTooltip,\r\n VictoryVoronoiContainer,\r\n} from 'victory'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { ResponseEachFaculty } from '../../../services/um/useDashboard'\r\nimport EmptyData from '../officer/EmptyData'\r\n\r\ntype AverageEachFacultyComponentProps = {\r\n data: ResponseEachFaculty[]\r\n faculty: string\r\n}\r\n\r\nfunction AverageEachFaculty({ data, faculty }: AverageEachFacultyComponentProps) {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n const dataLegend = data.map((item) => {\r\n return {\r\n id: item.id,\r\n name: item.label[lang],\r\n fill: item.color[0],\r\n }\r\n })\r\n\r\n let dataChart = data.map((item) => {\r\n return item.value.map((val: any) => {\r\n return { x: val.label[lang], y: val.value }\r\n })\r\n })\r\n if (data[0]?.value.length === 1) {\r\n dataChart = [\r\n [{ x: '..', y: 0 }, ...dataChart[0], { x: '.', y: 0 }],\r\n [{ x: '..', y: 0 }, ...dataChart[1], { x: '.', y: 0 }],\r\n [{ x: '..', y: 0 }, ...dataChart[2], { x: '.', y: 0 }],\r\n ]\r\n }\r\n\r\n const standardLine = data.map((item, index) => {\r\n let x = 0\r\n if (item.value.length > 1) {\r\n if (index === 1) {\r\n if (data[1].value.length === 2) {\r\n x += 0.14\r\n } else {\r\n x += 0.16\r\n }\r\n } else if (index === 2) {\r\n if (data[1].value.length < 3) {\r\n x += 0.143\r\n } else {\r\n x += 0.165\r\n }\r\n }\r\n } else {\r\n if (index === 0) {\r\n x += 0.9\r\n } else if (index === 1) {\r\n x += 0.05 + index\r\n }\r\n }\r\n return item.value.map((val: any, idx) => {\r\n if (idx === 0) {\r\n x += 0.9\r\n } else {\r\n x += 0\r\n }\r\n return { x: idx + x, y: val?.standardLine }\r\n })\r\n })\r\n\r\n return (\r\n <>\r\n \r\n {translate.get('UM.DASHBOARD.AVERAGE_STATUS')}{' '}\r\n {`(${faculty ? faculty : translate.get('EXPORT.EXCEL.ALL-PROJECT-DATA')})`}\r\n \r\n\r\n
\r\n \r\n }\r\n >\r\n \r\n }\r\n style={{\r\n axis: { stroke: '#D9D9D9' },\r\n tickLabels: { fontSize: '8px', padding: 5, fill: '#3B4859', fontFamily: 'Prompt' },\r\n }}\r\n />\r\n \r\n }\r\n style={{\r\n axis: { stroke: '#D9D9D9' },\r\n grid: { stroke: '#818e99', strokeWidth: 0.2 },\r\n tickLabels: { fontSize: '8px', padding: 5, fill: '#3B4859', fontFamily: 'Prompt' },\r\n }}\r\n />\r\n \r\n ''}\r\n data={dataChart[0]}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n name=\"bar1\"\r\n />\r\n ''}\r\n data={dataChart[1]}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n name=\"bar2\"\r\n />\r\n ''}\r\n data={dataChart[2]}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n name=\"bar3\"\r\n />\r\n \r\n {standardLine[0]?.map((item, idx) => {\r\n const dataLine = [\r\n {\r\n ...item,\r\n x:\r\n standardLine[0].length === 2\r\n ? 0.97 + idx\r\n : standardLine[0].length === 1\r\n ? 1.945\r\n : 0.822 + idx,\r\n },\r\n item,\r\n ]\r\n if (standardLine[0].length === 2) {\r\n dataLine.push({ ...item, x: 0.9 + idx })\r\n } else if (standardLine[0].length === 3) {\r\n dataLine.push({ ...item, x: 0.032 + item.x })\r\n } else if (standardLine[0].length > 3) {\r\n dataLine.push({ ...item, x: 0.6 + idx })\r\n }\r\n return (\r\n ''}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n />\r\n )\r\n })}\r\n {standardLine[1]?.map((item, idx) => {\r\n let dataLine = [\r\n {\r\n ...item,\r\n x:\r\n standardLine[0].length === 2\r\n ? 0.973 + idx\r\n : standardLine[0].length === 1\r\n ? 2.1\r\n : 0.941 + idx,\r\n },\r\n item,\r\n ]\r\n if (standardLine[1].length === 2) {\r\n dataLine.push({ ...item, x: 0.974 + idx })\r\n } else if (standardLine[1].length === 3) {\r\n dataLine.push({ ...item, x: item.x })\r\n } else if (standardLine[1].length > 3) {\r\n dataLine.push({ ...item, x: 0.91 + idx })\r\n dataLine.push({ ...item, x: 1.19 + idx })\r\n }\r\n return (\r\n ''}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n />\r\n )\r\n })}\r\n {standardLine[2]?.map((item, idx) => {\r\n let dataLine =\r\n standardLine[0].length === 1\r\n ? [\r\n {\r\n ...item,\r\n x: standardLine[0].length === 1 ? 2.105 : 0,\r\n },\r\n ]\r\n : []\r\n if (standardLine[2].length === 1) {\r\n dataLine.push({ ...item, x: 2.25 })\r\n } else if (standardLine[2].length === 2) {\r\n dataLine.push(item)\r\n dataLine.push({ ...item, x: 1.11 + idx })\r\n } else if (standardLine[2].length === 3) {\r\n dataLine.push(item)\r\n dataLine.push({ ...item, x: 1.1 + idx })\r\n dataLine.push({ ...item, x: 0.116 + item.x })\r\n } else if (standardLine[2].length > 3) {\r\n dataLine.push({ ...item, x: 1.2 + idx })\r\n dataLine.push({ ...item, x: 1.48 + idx })\r\n }\r\n return (\r\n ''}\r\n labelComponent={\r\n \r\n }\r\n />\r\n }\r\n />\r\n )\r\n })}\r\n \r\n \r\n
\r\n\r\n
\r\n {dataLegend.map((item) => {\r\n return (\r\n \r\n \r\n \r\n \r\n

{item.name}

\r\n
\r\n )\r\n })}\r\n \r\n \r\n )\r\n}\r\n\r\nconst CustomLabel = ({ x, y, datum, label }: any) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n return (\r\n \r\n \r\n
\r\n {label}\r\n {`${datum.xName} ${datum.y} ${translate.get(\r\n 'UM.DASHBOARD.UNIT_DAY',\r\n )}`}\r\n
\r\n \r\n
\r\n )\r\n}\r\nconst CustomLabelLine = ({ x, y, datum, dataBar }: any) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n if (datum.y === dataBar.y) {\r\n y -= 50\r\n } else if (datum.y + 1 === dataBar) {\r\n x -= 90\r\n }\r\n return (\r\n \r\n \r\n
\r\n \r\n {translate.get('UM.DASHBOARD.STANDARD_LINE')}\r\n \r\n {`${dataBar.x} ${datum.y} ${translate.get(\r\n 'UM.DASHBOARD.UNIT_DAY',\r\n )}`}\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n chart: {\r\n display: 'block',\r\n padding: 0,\r\n margin: 0,\r\n },\r\n header: {\r\n margin: '0px 8px',\r\n fontWeight: 'bold',\r\n },\r\n container: {\r\n margin: '0px',\r\n display: 'inline-block',\r\n borderRadius: '4px',\r\n backgroundColor: '#ffffff',\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n verticalAlign: 'middle',\r\n padding: '8px',\r\n },\r\n tooltipLabel: {\r\n fontSize: '8px',\r\n },\r\n legend: {\r\n width: '100%',\r\n textAlign: 'center',\r\n paddingTop: '30px',\r\n },\r\n}))\r\n\r\nexport default AverageEachFaculty\r\n","import * as Excel from 'exceljs'\r\nimport moment from 'moment'\r\n\r\nexport type ExportProps = {\r\n data1: { header: { name: string; group: { name: string } | null }[]; content: any[] }\r\n data2: { header: { name: string; group: { name: string } | null }[]; content: any[] }\r\n data3: { header: { name: string; group: { name: string } | null }[]; content: any[] }\r\n data4: { header: { name: string; group: { name: string } | null }[]; content: any[] }\r\n translate: (value: string) => string\r\n}\r\n\r\nconst exportData = ({\r\n data1: { header, content },\r\n data2: { header: header2, content: content2 },\r\n data3: { header: header3, content: content3 },\r\n data4: { header: header4, content: content4 },\r\n translate,\r\n}: ExportProps) => {\r\n let startRowHeader = 1\r\n const workbook = new Excel.Workbook()\r\n const worksheet = workbook.addWorksheet(translate('EXPORT.EXCEL.NUMBER_OF_PROJECT'), {\r\n pageSetup: {\r\n paperSize: 9,\r\n orientation: 'portrait',\r\n },\r\n })\r\n const worksheet_2 = workbook.addWorksheet(translate('EXPORT.EXCEL.TIMING_INFORMATION'), {\r\n pageSetup: {\r\n paperSize: 9,\r\n orientation: 'portrait',\r\n },\r\n })\r\n const worksheet_3 = workbook.addWorksheet(translate('EXPORT.EXCEL.PERIOD_DATA_GROUP'), {\r\n pageSetup: {\r\n paperSize: 9,\r\n orientation: 'portrait',\r\n },\r\n })\r\n const worksheet_4 = workbook.addWorksheet(translate('EXPORT.EXCEL.INFORMATION_FACULTY'), {\r\n pageSetup: {\r\n paperSize: 9,\r\n orientation: 'portrait',\r\n },\r\n })\r\n workbook.creator = 'CU_IRB-WEB'\r\n workbook.lastModifiedBy = 'CU_IRB-WEB'\r\n\r\n const createHeaderSheet3 = () => {\r\n let arrHeaderSheet3 = header3.map((item) => {\r\n return {\r\n name: item.name,\r\n key: item.name,\r\n group: item.group?.name,\r\n width: 30,\r\n }\r\n })\r\n let textColumns = [\r\n `A`,\r\n `B`,\r\n `C`,\r\n `D`,\r\n `E`,\r\n `F`,\r\n `G`,\r\n `H`,\r\n `I`,\r\n `J`,\r\n `K`,\r\n `L`,\r\n `M`,\r\n `N`,\r\n `O`,\r\n `P`,\r\n `Q`,\r\n `R`,\r\n `S`,\r\n `T`,\r\n `U`,\r\n `V`,\r\n ]\r\n arrHeaderSheet3.map((item, index) => {\r\n if (!item.group) {\r\n worksheet_3.mergeCells(\r\n `${textColumns[index]}${startRowHeader}:${textColumns[index]}${startRowHeader + 1}`,\r\n )\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader}`).value = arrHeaderSheet3[index].name\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader}`).alignment = {\r\n horizontal: 'center',\r\n vertical: 'middle',\r\n }\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader}`).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: 'ffDDEBF7',\r\n },\r\n }\r\n } else {\r\n if (item.group !== arrHeaderSheet3[index - 1].group) {\r\n let countDataGroup = arrHeaderSheet3.filter((data) => item.group === data.group).length - 1\r\n worksheet_3.mergeCells(\r\n `${textColumns[index]}${startRowHeader}:${\r\n textColumns[index + countDataGroup]\r\n }${startRowHeader}`,\r\n )\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader}`).value = arrHeaderSheet3[index].group\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader}`).alignment = {\r\n horizontal: 'center',\r\n vertical: 'middle',\r\n }\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader}`).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb:\r\n item.group === 'เจ้าหน้าที่'\r\n ? 'ffE2EFDA'\r\n : item.group === 'ประธาน/รอง/เลขา'\r\n ? 'ffF8CBAD'\r\n : item.group === 'กรรมการ'\r\n ? 'ffB4C6E7'\r\n : 'ffFFE699',\r\n },\r\n }\r\n\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader + 1}`).value =\r\n arrHeaderSheet3[index].name\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader + 1}`).alignment = {\r\n horizontal: 'center',\r\n }\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader + 1}`).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb:\r\n item.group === 'เจ้าหน้าที่'\r\n ? 'ffE2EFDA'\r\n : item.group === 'ประธาน/รอง/เลขา'\r\n ? 'ffF8CBAD'\r\n : item.group === 'กรรมการ'\r\n ? 'ffB4C6E7'\r\n : 'ffFFE699',\r\n },\r\n }\r\n } else {\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader + 1}`).value =\r\n arrHeaderSheet3[index].name\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader + 1}`).alignment = {\r\n horizontal: 'center',\r\n }\r\n worksheet_3.getCell(`${textColumns[index]}${startRowHeader + 1}`).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb:\r\n item.group === 'เจ้าหน้าที่'\r\n ? 'ffE2EFDA'\r\n : item.group === 'ประธาน/รอง/เลขา'\r\n ? 'ffF8CBAD'\r\n : item.group === 'กรรมการ'\r\n ? 'ffB4C6E7'\r\n : 'ffFFE699',\r\n },\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n const createHeader = () => {\r\n let arrHeader = header.map((item) => {\r\n return {\r\n name: item.name,\r\n key: item.name,\r\n width: 30,\r\n }\r\n })\r\n let arrHeaderSheet2 = header2.map((item) => {\r\n return {\r\n name: item.name,\r\n key: item.name,\r\n width: 30,\r\n }\r\n })\r\n let arrHeaderSheet3 = header3.map((item) => {\r\n return {\r\n name: item.name,\r\n key: item.name,\r\n group: item.group?.name,\r\n width: 30,\r\n }\r\n })\r\n let arrHeaderSheet4 = header4.map((item) => {\r\n return {\r\n name: item.name,\r\n key: item.name,\r\n width: 30,\r\n }\r\n })\r\n worksheet.columns = arrHeader.map((itm) => ({ key: itm.key, width: itm.width }))\r\n \r\n worksheet.getRow(startRowHeader).values = arrHeader.map((itm) => itm.name)\r\n ;[\r\n `A${startRowHeader}`,\r\n `B${startRowHeader}`,\r\n `C${startRowHeader}`,\r\n `D${startRowHeader}`,\r\n `E${startRowHeader}`,\r\n `F${startRowHeader}`,\r\n `G${startRowHeader}`,\r\n ].forEach((colKey, index) => {\r\n if (index < 7) {\r\n worksheet.getCell(colKey).alignment = { vertical: 'middle', horizontal: 'center', wrapText: true }\r\n worksheet.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: 'ffDDEBF7',\r\n },\r\n }\r\n }\r\n })\r\n\r\n worksheet_2.columns = arrHeaderSheet2.map((itm) => ({ key: itm.key, width: itm.width }))\r\n worksheet_2.getRow(startRowHeader).values = arrHeaderSheet2.map((itm) => itm.name)\r\n ;[\r\n `A${startRowHeader}`,\r\n `B${startRowHeader}`,\r\n `C${startRowHeader}`,\r\n `D${startRowHeader}`,\r\n `E${startRowHeader}`,\r\n `F${startRowHeader}`,\r\n `G${startRowHeader}`,\r\n `H${startRowHeader}`,\r\n `I${startRowHeader}`,\r\n `J${startRowHeader}`,\r\n `K${startRowHeader}`,\r\n `L${startRowHeader}`,\r\n `M${startRowHeader}`,\r\n `N${startRowHeader}`,\r\n `O${startRowHeader}`,\r\n ].forEach((colKey, index) => {\r\n if (index < 15) {\r\n worksheet_2.getCell(colKey).alignment = { vertical: 'middle', horizontal: 'center', wrapText: true }\r\n worksheet_2.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: 'ffDDEBF7',\r\n },\r\n }\r\n }\r\n })\r\n worksheet_3.columns = arrHeaderSheet3.map((itm) => ({ key: itm.key, width: itm.width }))\r\n\r\n worksheet_4.columns = arrHeaderSheet4.map((itm) => ({ key: itm.key, width: itm.width }))\r\n worksheet_4.getRow(startRowHeader).values = arrHeaderSheet4.map((itm) => itm.name)\r\n ;[\r\n `A${startRowHeader}`,\r\n `B${startRowHeader}`,\r\n `C${startRowHeader}`,\r\n `D${startRowHeader}`,\r\n `E${startRowHeader}`,\r\n `F${startRowHeader}`,\r\n `G${startRowHeader}`,\r\n `H${startRowHeader}`,\r\n `I${startRowHeader}`,\r\n `J${startRowHeader}`,\r\n ].forEach((colKey, index) => {\r\n if (index < 11) {\r\n worksheet_4.getCell(colKey).alignment = { vertical: 'middle', horizontal: 'center', wrapText: true }\r\n worksheet_4.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: 'ffDDEBF7',\r\n },\r\n }\r\n }\r\n })\r\n }\r\n\r\n const setCellRight = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'right' }\r\n }\r\n\r\n const setCellCenter = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'center' }\r\n }\r\n\r\n const makeRowITM = (rowNumber: number, rowITM: { lastRow: boolean; data: string[] }) => {\r\n worksheet.getRow(rowNumber).values = rowITM.data\r\n\r\n const arrColKey = [\r\n `A${rowNumber}`,\r\n `B${rowNumber}`,\r\n `C${rowNumber}`,\r\n `D${rowNumber}`,\r\n `E${rowNumber}`,\r\n `F${rowNumber}`,\r\n `G${rowNumber}`,\r\n ]\r\n\r\n arrColKey.forEach((colKey, index) => {\r\n if (index < 10) {\r\n if (index === 0) {\r\n setCellRight(colKey)\r\n }\r\n if (index === 3) {\r\n setCellCenter(colKey)\r\n }\r\n }\r\n })\r\n }\r\n\r\n const makeRowITMSheet2 = (rowNumber: number, rowITM: { lastRow: boolean; data: string[] }) => {\r\n worksheet_2.getRow(rowNumber).values = rowITM.data\r\n\r\n const arrColKey = [\r\n `A${rowNumber}`,\r\n `B${rowNumber}`,\r\n `C${rowNumber}`,\r\n `D${rowNumber}`,\r\n `E${rowNumber}`,\r\n `F${rowNumber}`,\r\n `G${rowNumber}`,\r\n `H${rowNumber}`,\r\n `I${rowNumber}`,\r\n `J${rowNumber}`,\r\n `K${rowNumber}`,\r\n `L${rowNumber}`,\r\n `M${rowNumber}`,\r\n `N${rowNumber}`,\r\n `O${rowNumber}`,\r\n ]\r\n\r\n arrColKey.forEach((colKey, index) => {\r\n if (index < 10) {\r\n if (index === 0) {\r\n setCellRight(colKey)\r\n }\r\n if (index === 3) {\r\n setCellCenter(colKey)\r\n }\r\n }\r\n })\r\n }\r\n\r\n const makeRowITMSheet3 = (rowNumber: number, rowITM: { lastRow: boolean; data: string[] }) => {\r\n worksheet_3.getRow(rowNumber).values = rowITM.data\r\n\r\n const arrColKey = [\r\n `A${rowNumber}`,\r\n `B${rowNumber}`,\r\n `C${rowNumber}`,\r\n `D${rowNumber}`,\r\n `E${rowNumber}`,\r\n `F${rowNumber}`,\r\n `G${rowNumber}`,\r\n `H${rowNumber}`,\r\n `I${rowNumber}`,\r\n ]\r\n\r\n arrColKey.forEach((colKey, index) => {\r\n if (index < 10) {\r\n if (index === 0) {\r\n setCellRight(colKey)\r\n }\r\n if (index === 3) {\r\n setCellCenter(colKey)\r\n }\r\n }\r\n })\r\n }\r\n\r\n const makeRowITMSheet4 = (rowNumber: number, rowITM: { lastRow: boolean; data: string[] }) => {\r\n worksheet_4.getRow(rowNumber).values = rowITM.data\r\n\r\n const arrColKey = [\r\n `A${rowNumber}`,\r\n `B${rowNumber}`,\r\n `C${rowNumber}`,\r\n `D${rowNumber}`,\r\n `E${rowNumber}`,\r\n `F${rowNumber}`,\r\n `G${rowNumber}`,\r\n `H${rowNumber}`,\r\n `I${rowNumber}`,\r\n `J${rowNumber}`,\r\n ]\r\n\r\n arrColKey.forEach((colKey, index) => {\r\n if (index < 10) {\r\n if (index === 0) {\r\n setCellRight(colKey)\r\n }\r\n if (index === 3) {\r\n setCellCenter(colKey)\r\n }\r\n }\r\n })\r\n }\r\n\r\n const createBody = () => {\r\n try {\r\n content.forEach((rowGroupITM, index) => {\r\n makeRowITM(index + (startRowHeader + 1), {\r\n lastRow: content.length === index + 1 ? true : false,\r\n data: rowGroupITM,\r\n })\r\n })\r\n content2.forEach((rowGroupITM, index) => {\r\n makeRowITMSheet2(index + (startRowHeader + 1), {\r\n lastRow: content.length === index + 1 ? true : false,\r\n data: rowGroupITM,\r\n })\r\n })\r\n content3.forEach((rowGroupITM, index) => {\r\n makeRowITMSheet3(index + 1 + (startRowHeader + 1), {\r\n lastRow: content.length === index + 1 ? true : false,\r\n data: rowGroupITM,\r\n })\r\n })\r\n content4.forEach((rowGroupITM, index) => {\r\n makeRowITMSheet4(index + (startRowHeader + 1), {\r\n lastRow: content.length === index + 1 ? true : false,\r\n data: rowGroupITM,\r\n })\r\n })\r\n } catch (err) {\r\n console.log('Error Generate Row Excel file export: ', err)\r\n }\r\n }\r\n\r\n const createTable = () => {\r\n createHeader()\r\n createBody()\r\n }\r\n\r\n const processColumns = () => {\r\n createTable()\r\n createHeaderSheet3()\r\n }\r\n\r\n processColumns()\r\n workbook.xlsx.writeBuffer().then(function (xls64data) {\r\n const blob = new Blob([xls64data], {\r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n })\r\n const url = window.URL.createObjectURL(blob)\r\n const anchor = document.createElement('a')\r\n\r\n const reportDate = moment(new Date()).format('yyyyMMDD')\r\n\r\n anchor.href = url\r\n anchor.download = `Dashboard_export_data_${reportDate}.xlsx`\r\n //@ts-ignore\r\n var isIE = /*@cc_on!@*/ false || !!document.documentMode\r\n //@ts-ignore\r\n var isEdge = !isIE && !!window.StyleMedia\r\n if (isEdge) {\r\n anchor.click()\r\n } else {\r\n anchor.click()\r\n }\r\n window.URL.revokeObjectURL(url)\r\n })\r\n}\r\nexport default exportData\r\n","import { Box, makeStyles, Typography } from '@material-ui/core'\r\nimport { FC } from 'react'\r\n\r\nconst Item: FC<{ isAll: boolean; title: string; number: number }> = ({ isAll, title, number }) => {\r\n const classes = useStyles({ isAll })\r\n return (\r\n \r\n \r\n {number}\r\n \r\n {title}\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n typo: {\r\n color: '#ffffff',\r\n width: '120px',\r\n },\r\n watermark1: {\r\n opacity: '0.075',\r\n color: '#ffffff',\r\n position: 'absolute',\r\n top: '0',\r\n left: '30%',\r\n [theme.breakpoints.down('xs')]: {\r\n left: '35%',\r\n },\r\n },\r\n watermark2: {\r\n opacity: '0.075',\r\n color: '#ffffff',\r\n position: 'absolute',\r\n top: '10%',\r\n left: '50%',\r\n },\r\n boxItem: {\r\n height: '130px',\r\n position: 'relative',\r\n cursor: 'pointer',\r\n fontWeight: 'bold',\r\n margin: ' 8px',\r\n padding: '24px 24px 0px 24px',\r\n border: '1px solid #bdbdbd',\r\n borderRadius: '6px',\r\n background: (props: { isAll: boolean }) => {\r\n if (props.isAll) {\r\n return 'linear-gradient(#DB5F8E, #6E3047)'\r\n } else {\r\n return 'linear-gradient(#58A4B0, #2C5258)'\r\n }\r\n },\r\n },\r\n}))\r\n\r\nexport default Item\r\n","import { makeStyles, Typography } from '@material-ui/core'\r\nimport { FC } from 'react'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport { ResponseDataApproveStatus } from '../../../../services/um/useDashboard'\r\nimport Item from './Item'\r\n\r\nconst Consideration: FC<{ data: ResponseDataApproveStatus[] }> = ({ data }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n return (\r\n <>\r\n \r\n {translate.get('UM.DASHBOARD.CONSIDERATION')}\r\n \r\n\r\n
\r\n {data.map((item) => (\r\n
\r\n \r\n
\r\n ))}\r\n
\r\n \r\n )\r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n header: {\r\n margin: '16px 0px',\r\n fontWeight: 'bolder',\r\n },\r\n container: {\r\n width: '100%',\r\n display: 'flex',\r\n flexWrap: 'nowrap',\r\n },\r\n content: {\r\n width: '16.66%',\r\n flexGrow: 1,\r\n\r\n overflow: 'hidden',\r\n [theme.breakpoints.down('md')]: {\r\n width: '25%',\r\n minWidth: '220px',\r\n maxWidth: '236px',\r\n },\r\n [theme.breakpoints.down('sm')]: {\r\n width: '33.33%',\r\n minWidth: '200px',\r\n maxWidth: '260px',\r\n },\r\n\r\n [theme.breakpoints.down('xs')]: {\r\n width: '100%',\r\n maxWidth: '400px',\r\n },\r\n },\r\n}))\r\n\r\nexport default Consideration\r\n","import { useState, useEffect } from 'react'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport Container from '@material-ui/core/Container'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport { Button, Grid, Paper } from '@material-ui/core'\r\nimport InProgress from '../component/um/dashboard/InProgress'\r\nimport AverageStatusTime from '../component/um/dashboard/AverageStatusTime'\r\nimport Report from '../component/um/dashboard/report/Report'\r\nimport AverageProjectTime from '../component/um/dashboard/AverageProjectTime'\r\nimport useDashboard, {\r\n ResponseInprogress,\r\n ResponseOverview,\r\n ResponseStatus,\r\n ResponseFaculty,\r\n ResponseEachFaculty,\r\n ResponseDataExport,\r\n ResponseDataApproveStatus,\r\n} from '../services/um/useDashboard'\r\nimport Overview from '../component/um/dashboard/overview/Overview'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport DateRangePicker from '../control/datepicker/DateRangePicker'\r\nimport { Form } from 'react-final-form'\r\nimport moment from 'moment'\r\nimport AverageFaculty from '../component/um/dashboard/AverageFaculty'\r\nimport AverageEachFaculty from '../component/um/dashboard/AverageEachFaculty'\r\nimport GetAppRoundedIcon from '@material-ui/icons/GetAppRounded'\r\nimport exportData from '../component/um/dashboard/export-data/exportData'\r\nimport Consideration from '../component/um/dashboard/consideration/Consideration '\r\nimport useLoading from '../control/loading/useLoading'\r\n\r\nconst Dashboard = () => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const {\r\n getInprogress,\r\n getAverageStatus,\r\n getAverageProject,\r\n getOverview,\r\n getAverageFaculty,\r\n getAverageEachFaculty,\r\n getDataToExport,\r\n getDataApproveStatus,\r\n } = useDashboard()\r\n const [dataExport, setDataExport] = useState([])\r\n const [inProgress, setInprogress] = useState([])\r\n const [approveStatus, setApproveStatus] = useState([])\r\n const [averageStatus, setAverageStatus] = useState([])\r\n const [averageProject, setAverageProject] = useState([])\r\n const [averageFaculty, setAverageFaculty] = useState([])\r\n const [averageEachFaculty, setAverageEachFaculty] = useState([])\r\n const [overview, setOverview] = useState([])\r\n const [startDate, setStartDate] = useState(moment().add(-1, 'years').format('YYYY-MM-DD').toString())\r\n const [endDate, setEndDate] = useState(moment().format('YYYY-MM-DD').toString())\r\n const [facultyID, setFacultyID] = useState(null)\r\n const [faculty, setFaculty] = useState('')\r\n const [userGroupID, setUserGroupID] = useState('2')\r\n\r\n const loadingHook = useLoading()\r\n\r\n const fetchData = async () => {\r\n loadingHook.loadingOpen()\r\n if (authenStore.profile.userId) {\r\n const param = {\r\n userID: authenStore.profile.userId?.toString(),\r\n startDate: startDate,\r\n endDate: endDate,\r\n userGroupID: String(authenStore.profile.userGroupId),\r\n }\r\n const resultInprogress = await getInprogress(param)\r\n const resultAverageProject = await getAverageProject(param)\r\n const resultOverview = await getOverview(param)\r\n const resultAverageFaculty = await getAverageFaculty(param)\r\n const resultExportData = await getDataToExport(param)\r\n const resultDataApprove = await getDataApproveStatus(param)\r\n if (resultInprogress) {\r\n setInprogress(resultInprogress)\r\n }\r\n if (resultAverageProject) {\r\n setAverageProject(resultAverageProject)\r\n }\r\n if (resultOverview) {\r\n setOverview(resultOverview)\r\n }\r\n if (resultAverageFaculty) {\r\n setAverageFaculty(resultAverageFaculty)\r\n }\r\n if (resultExportData) {\r\n setDataExport(resultExportData)\r\n }\r\n if (resultDataApprove) {\r\n setApproveStatus(resultDataApprove)\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleChageDate = (val: Record) => {\r\n setStartDate(val.startDate)\r\n setEndDate(val.endDate)\r\n }\r\n\r\n const handleChangeUserGroupID = (val: string) => {\r\n setUserGroupID(val)\r\n }\r\n\r\n const handleClickFacultyID = (facultyID: number, faculty: string) => {\r\n setFacultyID(facultyID)\r\n setFaculty(faculty)\r\n }\r\n\r\n const handleExportExcel = () => {\r\n exportData({\r\n data1: { header: dataExport[0].columns, content: dataExport[0].rows },\r\n data2: { header: dataExport[1].columns, content: dataExport[1].rows },\r\n data3: { header: dataExport[2].columns, content: dataExport[2].rows },\r\n data4: { header: dataExport[3].columns, content: dataExport[3].rows },\r\n translate: (value: string) => translate.get(value),\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n fetchData()\r\n }, [authenStore.profile.userId, startDate, endDate])\r\n\r\n useEffect(() => {\r\n const paramForEachFaculty = {\r\n userID: String(authenStore.profile.userId),\r\n startDate: startDate,\r\n endDate: endDate,\r\n userGroupID: String(authenStore.profile.userGroupId),\r\n facultyID: facultyID,\r\n }\r\n const fetchData = async () => {\r\n loadingHook.loadingOpen()\r\n const resultAverageEachFaculty = await getAverageEachFaculty(paramForEachFaculty)\r\n if (resultAverageEachFaculty) {\r\n setAverageEachFaculty(resultAverageEachFaculty)\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n fetchData()\r\n }, [facultyID])\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n if (authenStore.profile.userId) {\r\n loadingHook.loadingOpen()\r\n const param = {\r\n userID: authenStore.profile.userId?.toString(),\r\n startDate: startDate,\r\n endDate: endDate,\r\n userGroupID,\r\n }\r\n const resultAverageStatus = await getAverageStatus(param)\r\n if (resultAverageStatus) {\r\n setAverageStatus(resultAverageStatus)\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n fetchData()\r\n }, [authenStore.profile.userId, userGroupID])\r\n return (\r\n \r\n \r\n \r\n \r\n {translate.get('UM.DASHBOARD.TITLE')}\r\n \r\n \r\n \r\n {}}\r\n initialValues={{\r\n startDate,\r\n endDate,\r\n }}\r\n >\r\n {({ values }) => {\r\n const formVal = values\r\n handleChageDate(formVal)\r\n return (\r\n \r\n )\r\n }}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n onClick={handleExportExcel}\r\n >\r\n {translate.get('BUTTON.EXPORT')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.DASHBOARD.TITLE_PROJECT')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.REPORT.REPORT')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n typo: {\r\n fontWeight: 'bold',\r\n margin: '16px 0px',\r\n [theme.breakpoints.down('xs')]: {\r\n margin: '16px 0px 0px',\r\n },\r\n },\r\n paper: {\r\n padding: theme.spacing(2),\r\n minHeight: '400px',\r\n },\r\n dateRange: {\r\n marginTop: '-5px',\r\n },\r\n resultCard: {\r\n padding: '0px',\r\n },\r\n}))\r\n\r\nexport default Dashboard\r\n","import viewerExport from '../component/report/reviewer/report'\r\nimport firstTimeExport from '../component/report/firsttime/report'\r\nimport holdExport from '../component/report/hold/report'\r\nimport expiredExport from '../component/report/expired/report'\r\nimport closedExport from '../component/report/closed/report'\r\nimport useTranslate from '../i18n/useTranslate'\r\n\r\nconst TestExport = () => {\r\n const translate = useTranslate()\r\n\r\n const exportViewerExcel = () => {\r\n // viewerExport({\r\n // header: {\r\n // projectType: 'ขอแก้ไขโครงการ',\r\n // startDate: '3 กันยายน 2563',\r\n // endDate: '3 กันยายน 2563',\r\n // keyword: '-',\r\n // },\r\n // content: [\r\n // {\r\n // projectID: '1011',\r\n // researcherName: 'ดร.กิตติคุณ เอกเอี่ยมพันธ์',\r\n // considerType: 'Fullboard',\r\n // projectName: 'ล่าท้าผี',\r\n // committee1: 'ศาสตราจารย์.พญ.รุจิภา บุญจุบัน',\r\n // committee2: 'ศาสตราจารย์ปวริศ โกวิทวีธรรม',\r\n // committee3: 'ศาสตราจารย์ศุภกร อังอำนวยศิริ',\r\n // committee: [],\r\n // },\r\n // {\r\n // projectID: '1012',\r\n // researcherName: 'ดร.บุลากร แสงสันเทียะ',\r\n // considerType: 'Fullboard',\r\n // projectName: 'ล่าท้าผี ภาค 2',\r\n // committee1: 'ศาสตราจารย์.พญ.รุจิภา บุญจุบัน',\r\n // committee2: 'ศาสตราจารย์ปวริศ โกวิทวีธรรม',\r\n // committee3: 'ศาสตราจารย์ศุภกร อังอำนวยศิริ',\r\n // committee: [],\r\n // },\r\n // {\r\n // projectID: '1011',\r\n // researcherName: 'ดร.มัลลิกา โสภา',\r\n // considerType: 'Fullboard',\r\n // projectName: 'ล่าท้าผี ภาค 3',\r\n // committee1: 'ศาสตราจารย์.พญ.รุจิภา บุญจุบัน',\r\n // committee2: 'ศาสตราจารย์ปวริศ โกวิทวีธรรม',\r\n // committee3: 'ศาสตราจารย์ศุภกร อังอำนวยศิริ',\r\n // committee: [],\r\n // },\r\n // ],\r\n // translate: (value: string) => translate.get(value),\r\n // })\r\n }\r\n\r\n // const exportFirstTImeExcel = () => {\r\n // firstTimeExport({\r\n // header: {\r\n // projectType: 'ขอแก้ไขโครงการ',\r\n // startDate: '3 กันยายน 2563',\r\n // endDate: '3 กันยายน 2563',\r\n // keyword: '-',\r\n // projectStatus: '-',\r\n // faculty: '-',\r\n // },\r\n // content: [\r\n // {\r\n // projectID: '1011',\r\n // receiveDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // projectStatus: 'Minor',\r\n // researcherName: 'ดร.กิตติคุณ เอกเอี่ยมพันธ์',\r\n // position: 'อาจารย์',\r\n // faculty: 'จิตวิทยา',\r\n // projectName: 'ล่าท้าผี',\r\n // },\r\n // {\r\n // projectID: '1012',\r\n // receiveDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // projectStatus: 'Minor',\r\n // researcherName: 'ดร.บุลากร แสงสันเทียะ',\r\n // position: 'อาจารย์',\r\n // faculty: 'จิตวิทยา',\r\n // projectName: 'ล่าท้าผี ภาค 2',\r\n // },\r\n // {\r\n // projectID: '1013',\r\n // receiveDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // projectStatus: 'Minor',\r\n // researcherName: 'ดร.มัลลิกา โสภา',\r\n // position: 'อาจารย์',\r\n // faculty: 'จิตวิทยา',\r\n // projectName: 'ล่าท้าผี ภาค 3',\r\n // },\r\n // ],\r\n // translate: (value: string) => translate.get(value),\r\n // })\r\n // }\r\n\r\n // const exportHoleExcel = () => {\r\n // holdExport({\r\n // header: {\r\n // projectType: '-',\r\n // startDate: '3 กันยายน 2563',\r\n // endDate: '3 กันยายน 2563',\r\n // keyword: '-',\r\n // },\r\n // content: [\r\n // {\r\n // projectID: '1011',\r\n // receiveDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // educationLevel: 'ปริญญาเอก',\r\n // researcherName: 'ดร.กิตติคุณ เอกเอี่ยมพันธ์',\r\n // position: 'อาจารย์',\r\n // faculty: 'จิตวิทยา',\r\n // projectName: 'ล่าท้าผี',\r\n // },\r\n // {\r\n // projectID: '1012',\r\n // receiveDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // educationLevel: 'ปริญญาเอก',\r\n // researcherName: 'ดร.บุลากร แสงสันเทียะ',\r\n // position: 'อาจารย์',\r\n // faculty: 'จิตวิทยา',\r\n // projectName: 'ล่าท้าผี ภาค 2',\r\n // },\r\n // {\r\n // projectID: '1013',\r\n // receiveDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // educationLevel: 'ปริญญาเอก',\r\n // researcherName: 'ดร.มัลลิกา โสภา',\r\n // position: 'อาจารย์',\r\n // faculty: 'จิตวิทยา',\r\n // projectName: 'ล่าท้าผี ภาค 3',\r\n // },\r\n // ],\r\n // translate: (value: string) => translate.get(value),\r\n // })\r\n // }\r\n\r\n // const exportExpiredExcel = () => {\r\n // expiredExport({\r\n // header: {\r\n // projectType: '-',\r\n // startDate: '3 กันยายน 2563',\r\n // endDate: '3 กันยายน 2563',\r\n // keyword: '-',\r\n // },\r\n // content: [\r\n // {\r\n // projectID: '1011',\r\n // endDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // researcherName: 'ดร.กิตติคุณ เอกเอี่ยมพันธ์',\r\n // position: 'อาจารย์',\r\n // projectName: 'ล่าท้าผี',\r\n // },\r\n // {\r\n // projectID: '1012',\r\n // endDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // researcherName: 'ดร.บุลากร แสงสันเทียะ',\r\n // position: 'อาจารย์',\r\n // projectName: 'ล่าท้าผี ภาค 2',\r\n // },\r\n // {\r\n // projectID: '1013',\r\n // endDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // researcherName: 'ดร.มัลลิกา โสภา',\r\n // position: 'อาจารย์',\r\n // projectName: 'ล่าท้าผี ภาค 3',\r\n // },\r\n // ],\r\n // translate: (value: string) => translate.get(value),\r\n // })\r\n // }\r\n\r\n // const exportClosedExcel = () => {\r\n // closedExport({\r\n // header: {\r\n // projectType: '-',\r\n // startDate: '3 กันยายน 2563',\r\n // endDate: '3 กันยายน 2563',\r\n // keyword: '-',\r\n // },\r\n // content: [\r\n // {\r\n // projectID: '1011',\r\n // endDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // researcherName: 'ดร.กิตติคุณ เอกเอี่ยมพันธ์',\r\n // position: 'อาจารย์',\r\n // projectName: 'ล่าท้าผี',\r\n // },\r\n // {\r\n // projectID: '1012',\r\n // endDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // researcherName: 'ดร.บุลากร แสงสันเทียะ',\r\n // position: 'อาจารย์',\r\n // projectName: 'ล่าท้าผี ภาค 2',\r\n // },\r\n // {\r\n // projectID: '1013',\r\n // endDate: '3 กันยายน 2563',\r\n // projectType: 'Fullboard',\r\n // researcherName: 'ดร.มัลลิกา โสภา',\r\n // position: 'อาจารย์',\r\n // projectName: 'ล่าท้าผี ภาค 3',\r\n // },\r\n // ],\r\n // translate: (value: string) => translate.get(value),\r\n // })\r\n // }\r\n\r\n return (\r\n
\r\n \r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n
\r\n )\r\n}\r\n\r\nexport default TestExport\r\n","import { useState, useEffect } from 'react'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useLookupService from '../../lookup/useLookupService'\r\n\r\nexport type OptType = {\r\n label: string\r\n value: string\r\n}\r\n\r\nconst useFaculty = () => {\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const [faculty, setFaculty] = useState([])\r\n\r\n const getFaculty = async () => {\r\n const res = await callLookup.callFacultyLut()\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n irb: `${itm.irb}`,\r\n }\r\n })\r\n setFaculty(formatedData)\r\n }\r\n\r\n useEffect(() => {\r\n getFaculty()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n return { faculty }\r\n}\r\n\r\nexport default useFaculty\r\n","import { useState, useEffect } from 'react'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useLookupService from '../../lookup/useLookupService'\r\n\r\nexport type OptType = {\r\n label: string\r\n value: string\r\n}\r\n\r\nconst useProjectStatus = () => {\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const [projectStatus, setProjectStatus] = useState([])\r\n\r\n const getProjectStatusType = async () => {\r\n const { result } = await callLookup.callProjectSubmitTypeLut()\r\n // const filterAdd = res.result.filter((item) => {\r\n // return item.isAdd\r\n // })\r\n const formatedData = result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === 'th' ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n\r\n setProjectStatus(formatedData)\r\n }\r\n\r\n useEffect(() => {\r\n getProjectStatusType()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n return { projectStatus }\r\n}\r\n\r\nexport default useProjectStatus\r\n","import { useState, useEffect } from 'react'\r\nimport useCallApi from '../../../utilities/axios'\r\nimport * as umServinceURL from '../umServiceURL'\r\n\r\ntype Lookup = {\r\n id: number\r\n name_th: string\r\n name_en: string\r\n}\r\n\r\nconst useStatus = () => {\r\n const callApi = useCallApi()\r\n const [statusList, setstatusList] = useState([])\r\n\r\n useEffect(() => {\r\n getLookup()\r\n }, [])\r\n\r\n const getLookup = async () => {\r\n try {\r\n const { data } = await callApi.axiosGet({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/userStatus`,\r\n })\r\n\r\n setstatusList(data.result)\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n\r\n return { statusList }\r\n}\r\n\r\nexport default useStatus\r\n","import { Form } from 'react-final-form'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Button from '@material-ui/core/Button'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport MyDatePicker from '../../../control/datepicker/datepicker'\r\nimport Select from '../../../control/select/select'\r\nimport useFaculty from '../../../services/um/lookups/useFaculty'\r\nimport useProjectStatus from '../../../services/um/lookups/useProjectStatus'\r\nimport useStatus from '../../../services/um/lookups/useStatus'\r\nimport CalendarTodayIcon from '@material-ui/icons/CalendarToday'\r\n\r\nimport { SearchKeywordType } from '../../../services/um/useSearchFirstTime'\r\nimport useProjectType from '../../../services/um/lookups/useProjectType'\r\nimport { FormApi } from 'final-form'\r\nimport { useState } from 'react'\r\nimport moment from 'moment'\r\n\r\ninterface PanelProps {\r\n initialValue: SearchKeywordType\r\n onSearch: (values: SearchKeywordType) => void\r\n onReset: (form: any) => void\r\n}\r\n\r\nconst Panel: React.FC = ({ onSearch, initialValue, onReset }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const { faculty } = useFaculty()\r\n const { projectStatus } = useProjectStatus()\r\n const { statusList } = useStatus()\r\n const { projectT } = useProjectType()\r\n const [endDate, setEndDate] = useState(moment(new Date()).format('YYYY-MM-DD'))\r\n let defaultProjectType = initialValue.projectType ? [initialValue.projectType] : undefined\r\n let defaultSubmitted = initialValue.submittedType ? [initialValue.submittedType.toString()] : undefined\r\n let defaultFaculty = initialValue.facultyID ? [initialValue.facultyID] : undefined\r\n\r\n // const formatedStatusList = statusList.map((itm) => {\r\n // return {\r\n // label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n // value: `${itm.id}`,\r\n // }\r\n // })\r\n\r\n const handleStartDateChange = (form: FormApi, value: string | null) => {\r\n if (value && endDate) {\r\n let isStartAfter = moment(value).isAfter(endDate)\r\n if (isStartAfter) {\r\n form.change('endDate', new Date(value))\r\n }\r\n }\r\n }\r\n\r\n const handleEndDateChange = (value: string | null) => {\r\n setEndDate(value)\r\n }\r\n\r\n return (\r\n \r\n
\r\n {({ handleSubmit, form, values }) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n handleStartDateChange(form, val)}\r\n size={'small'}\r\n icon={}\r\n required\r\n />\r\n \r\n \r\n }\r\n minDate={new Date(values.startDate)}\r\n onChangeValue={handleEndDateChange}\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n {\r\n onReset(form)\r\n }}\r\n >\r\n {translate.get('BUTTON.RESET')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default Panel\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n },\r\n container: {\r\n padding: '1.7rem',\r\n },\r\n reset: {\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n padding: '0px 1.5rem',\r\n alignSelf: 'center',\r\n },\r\n}))\r\n","import { useState, useEffect } from 'react'\r\nimport _ from 'lodash'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { makeStyles } from '@material-ui/core'\r\nimport { DataGrid, GridColDef } from '@mui/x-data-grid'\r\nimport { FirstTimeDataListType } from '../../../services/um/useSearchFirstTime'\r\nimport { convertDateToFormatTH, convertDateToFormatEN } from '../../../utilities/date'\r\nimport { setPrefixName } from '../../../utilities/prefixName'\r\nimport CustomPagination from '../closed/CustomPagination'\r\nimport CustomNoRowsOverlay from '../closed/CustomNoRowsOverlay'\r\nimport { CustomSortingASCcending, CustomSortingDescending } from '../closed/CusromSorting'\r\n\r\ntype DataRowsType = {\r\n id: number\r\n receiveDate: string\r\n projectNumber: string\r\n projectNameTH: string\r\n projectNameEN: string\r\n projectType: string\r\n name: string\r\n titleID: number\r\n title: string\r\n academicPosition: string\r\n isPhD: boolean\r\n researcherTypeName: string\r\n facultyName: string\r\n approveStatusName: string\r\n projectSubmitType: string\r\n}\r\n\r\ntype FirstTimeDataTableComponentProps = {\r\n dataList: FirstTimeDataListType[]\r\n}\r\n\r\nconst DataTable = ({ dataList }: FirstTimeDataTableComponentProps) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const [firstTimeDataList, setFirstTimeDataList] = useState([])\r\n\r\n useEffect(() => {\r\n const convertData = dataList.map((item) => {\r\n return {\r\n id: item.projectID,\r\n receiveDate: convertDate(item.receiveDate),\r\n projectNumber: item.projectNumber,\r\n projectNameTH: item.projectName['th'] ?? '-',\r\n projectNameEN: item.projectName['en'] ?? '-',\r\n projectType: item.projectType.name[lang] ?? '-',\r\n name: setPrefixName(item)[lang] ?? '-',\r\n titleID: item.titleID ?? '-',\r\n title: item.title[lang] ?? '-',\r\n academicPosition: item.academicPosition[lang] ?? '-',\r\n isPhD: item.isPhD ?? '-',\r\n researcherTypeName: item.researcherTypeName[lang] ?? '-',\r\n facultyName: item.facultyName[lang] ?? '-',\r\n educationLevelName: item.educationLevelName[lang] ?? '-',\r\n approveStatusName: item.approveStatusName?.[lang] ?? '-',\r\n projectSubmitType: item.submittedTypeName?.[lang],\r\n }\r\n })\r\n\r\n setFirstTimeDataList(convertData)\r\n }, [dataList, lang])\r\n\r\n const convertDate = (date: string | null) => {\r\n if (lang === 'th' && date) {\r\n return convertDateToFormatTH(date)\r\n } else if (lang === 'en' && date) {\r\n return convertDateToFormatEN(date)\r\n } else {\r\n return '-'\r\n }\r\n }\r\n const column: GridColDef[] = [\r\n {\r\n field: 'projectNumber',\r\n headerName: `${translate.get('UM.FIRST_TIME.DATA_TABLE.COLUMN1')}`,\r\n width: 200,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'receiveDate',\r\n headerName: `${translate.get('UM.FIRST_TIME.DATA_TABLE.COLUMN2')}`,\r\n width: 200,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'projectSubmitType',\r\n headerName: `${translate.get('UM.FIRST_TIME.DATA_TABLE.COLUMN3')}`,\r\n width: 250,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'projectType',\r\n headerName: `${translate.get('UM.FIRST_TIME.DATA_TABLE.COLUMN4')}`,\r\n width: 200,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'approveStatusName',\r\n headerName: `${translate.get('UM.FIRST_TIME.DATA_TABLE.COLUMN5')}`,\r\n width: 200,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n\r\n {\r\n field: 'name',\r\n headerName: `${translate.get('UM.FIRST_TIME.DATA_TABLE.COLUMN6')}`,\r\n width: 300,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'researcherTypeName',\r\n headerName: `${translate.get('UM.FIRST_TIME.DATA_TABLE.COLUMN7')}`,\r\n width: 200,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'facultyName',\r\n headerName: `${translate.get('UM.FIRST_TIME.DATA_TABLE.COLUMN8')}`,\r\n width: 300,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'educationLevelName',\r\n headerName: `${translate.get('UM.FIRST_TIME.DATA_TABLE.COLUMN9')}`,\r\n width: 300,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'projectNameTH',\r\n headerName: `${translate.get('UM.FIRST_TIME.DATA_TABLE.COLUMN10')}`,\r\n width: 300,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'projectNameEN',\r\n headerName: `${translate.get('UM.FIRST_TIME.DATA_TABLE.COLUMN11')}`,\r\n width: 300,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n ]\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n '& .super-app-theme--fffff': {\r\n backgroundColor: '#DB5F8E',\r\n '&:hover': {\r\n backgroundColor: '#DB5F8E',\r\n },\r\n },\r\n '& .super-app-theme--header': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n '& .MuiDataGrid-columnSeparator': {\r\n visibility: 'hidden',\r\n },\r\n '& .MuiDataGrid-row': {\r\n lineHeigh: '70px',\r\n },\r\n\r\n '& .header-table': {\r\n backgroundColor: '#DB5F8E',\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiDataGrid-iconSeparator': {\r\n display: 'none',\r\n },\r\n '& .MuiDataGrid-sortIcon': {\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiBadge-anchorOriginTopRightRectangle': {\r\n display: 'none',\r\n },\r\n '& .MuiDataGrid-cell:focus-within': {\r\n outline: 'none',\r\n },\r\n '& .MuiDataGrid-row, .MuiDataGrid-root .MuiDataGrid-cell, .rendering-zone': { 'max-height': 'none !important' },\r\n '.MuiDataGrid-root .MuiDataGrid-window': { position: 'relative !important' },\r\n '.MuiDataGrid-root .MuiDataGrid-viewport': { 'max-height': 'none !important' },\r\n '.MuiDataGrid-root': { height: 'auto !important' },\r\n width: '100%',\r\n marginTop: 16,\r\n\r\n overflowX: 'hidden',\r\n },\r\n}))\r\n\r\nexport default DataTable\r\n","import * as Excel from 'exceljs'\r\nimport moment from 'moment'\r\n\r\ntype ContentT = {\r\n projectID: string\r\n receiveDate: string\r\n projectSubmitType: string\r\n projectType: string\r\n projectStatus: string\r\n researcherName: string\r\n position: string\r\n faculty: string\r\n projectNameTH: string\r\n projectNameEN: string\r\n}\r\ntype ExportProps = {\r\n header: {\r\n projectSubmitType: string\r\n projectType: string\r\n faculty: string\r\n startDate: string\r\n endDate: string\r\n keyword: string\r\n }\r\n content: ContentT[]\r\n translate: (value: string) => string //ไม่สามารถเรียกในหน้านี้ได้ ผิด react rule\r\n}\r\nconst firstTimeExport = ({ header, content, translate }: ExportProps) => {\r\n let startRowHeader = 11\r\n //@ts-ignore\r\n const workbook = new Excel.Workbook()\r\n const worksheet = workbook.addWorksheet('sheet', {\r\n pageSetup: {\r\n paperSize: 9, //follow documentation the 9 value is A4\r\n orientation: 'portrait',\r\n },\r\n })\r\n workbook.creator = 'CU_IRB-WEB'\r\n workbook.lastModifiedBy = 'CU_IRB-WEB'\r\n\r\n const createTopic = () => {\r\n const endCell = 'K'\r\n worksheet.mergeCells(`A1:${endCell}1`)\r\n worksheet.getCell('A1').value = translate('EXPORT.EXCEL.FIRST-TIME-REPORT-NAME')\r\n worksheet.getCell('A1').alignment = { horizontal: 'center' }\r\n worksheet.getCell('A1').font = { bold: true }\r\n worksheet.getCell('A1').fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00F1BBCF',\r\n },\r\n }\r\n\r\n worksheet.mergeCells(`A3:C3`)\r\n worksheet.getCell('A4').value = `${translate('EXPORT.EXCEL.PROJECT_SUBMIT_TYPE')} ${header.projectSubmitType}`\r\n worksheet.getCell('A3').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A4:C4`)\r\n worksheet.getCell('A3').value = `${translate('EXPORT.EXCEL.PROJECT-TYPE')} ${header.projectType}`\r\n\r\n worksheet.getCell('A4').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A5:C5`)\r\n worksheet.getCell('A5').value = `${translate('EXPORT.EXCEL.FACULTY')} ${header.faculty}`\r\n worksheet.getCell('A5').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A6:C6`)\r\n worksheet.getCell('A6').value = `${translate('EXPORT.EXCEL.START-DATE')} ${header.startDate}`\r\n worksheet.getCell('A6').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A7:C7`)\r\n worksheet.getCell('A7').value = `${translate('EXPORT.EXCEL.END-DATE')} ${header.endDate}`\r\n worksheet.getCell('A7').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A8:C8`)\r\n worksheet.getCell('A8').value = `${translate('EXPORT.EXCEL.KEYWORD')} ${header.keyword}`\r\n worksheet.getCell('A8').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n }\r\n\r\n const setCellBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n top: { style: 'thin' },\r\n left: { style: 'thin' },\r\n bottom: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const createHeader = () => {\r\n let arrHeader = [\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-ID'),\r\n key: 'projectID',\r\n width: 10,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.RECEIVE-DATE'),\r\n key: 'receiveDate',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT_SUBMIT_TYPE'),\r\n key: 'projectSubmitType',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-TYPE'),\r\n key: 'projectType',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-STATUS'),\r\n key: 'projectStatus',\r\n width: 30,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.RESEARCHER-NAME'),\r\n key: 'researcherName',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.POSITION'),\r\n key: 'position',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.FACULTY'),\r\n key: 'faculty',\r\n width: 30,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.EDUCATION'),\r\n key: 'educationLevelName',\r\n width: 30,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-NAME-TH'),\r\n key: 'projectNameTH',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-NAME-EN'),\r\n key: 'projectNameEN',\r\n width: 50,\r\n },\r\n ]\r\n\r\n worksheet.columns = arrHeader.map((itm) => ({ key: itm.key, width: itm.width }))\r\n worksheet.getRow(startRowHeader).values = arrHeader.map((itm) => itm.name)\r\n ;[\r\n `A${startRowHeader}`,\r\n `B${startRowHeader}`,\r\n `C${startRowHeader}`,\r\n `D${startRowHeader}`,\r\n `E${startRowHeader}`,\r\n `F${startRowHeader}`,\r\n `G${startRowHeader}`,\r\n `H${startRowHeader}`,\r\n `I${startRowHeader}`,\r\n `J${startRowHeader}`,\r\n `K${startRowHeader}`,\r\n ].forEach((colKey, index) => {\r\n if (index < 11) {\r\n setCellBorder(colKey)\r\n worksheet.getCell(colKey).alignment = { vertical: 'middle', horizontal: 'center', wrapText: true }\r\n worksheet.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00DB5F8E',\r\n },\r\n }\r\n }\r\n })\r\n }\r\n\r\n const setCellRight = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'right' }\r\n }\r\n\r\n const setCellCenter = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'center' }\r\n }\r\n const setContentBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n left: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const setLastContentBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n left: { style: 'thin' },\r\n bottom: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const setContentColor = (colKey: string) => {\r\n worksheet.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00F1BBCF',\r\n },\r\n }\r\n }\r\n\r\n const makeRowITM = (rowNumber: number, rowITM: ContentT & { isOddRow: boolean; lastRow: boolean }) => {\r\n worksheet.addRow(rowITM)\r\n\r\n const arrColKey = [\r\n `A${rowNumber}`,\r\n `B${rowNumber}`,\r\n `C${rowNumber}`,\r\n `D${rowNumber}`,\r\n `E${rowNumber}`,\r\n `F${rowNumber}`,\r\n `G${rowNumber}`,\r\n `H${rowNumber}`,\r\n `I${rowNumber}`,\r\n `J${rowNumber}`,\r\n `K${rowNumber}`,\r\n ]\r\n\r\n arrColKey.forEach((colKey, index) => {\r\n if (index < 11) {\r\n if (index === 0) {\r\n setCellRight(colKey) //number format\r\n }\r\n if (index === 1 || index === 2 || index === 3) {\r\n setCellCenter(colKey) //consider type มีแค่สามอย่าง ขนาดพอๆกันเลยอยู่ตรงกลางได้\r\n }\r\n\r\n setContentBorder(colKey)\r\n if (rowITM.isOddRow) {\r\n setContentColor(colKey)\r\n }\r\n if (rowITM.lastRow) {\r\n setLastContentBorder(colKey)\r\n }\r\n }\r\n })\r\n }\r\n\r\n const createBody = () => {\r\n try {\r\n content.forEach((rowGroupITM, index) => {\r\n makeRowITM(index + (startRowHeader + 1), {\r\n lastRow: content.length === index + 1 ? true : false,\r\n isOddRow: (index + 1) % 2 === 0 ? false : true,\r\n ...rowGroupITM,\r\n })\r\n })\r\n } catch (err) {\r\n console.log('Error Generate Row Excel file export: ', err)\r\n //@ts-ignore\r\n throw new Error(err)\r\n }\r\n }\r\n\r\n const createTable = () => {\r\n createHeader()\r\n createBody()\r\n }\r\n\r\n const processColumns = () => {\r\n createTopic()\r\n createTable()\r\n }\r\n\r\n processColumns()\r\n //@ts-ignore\r\n workbook.xlsx.writeBuffer().then(function (xls64data) {\r\n const blob = new Blob([xls64data], {\r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n })\r\n const url = window.URL.createObjectURL(blob)\r\n const anchor = document.createElement('a')\r\n\r\n const reportDate = moment(new Date()).format('yyyyMMDD')\r\n\r\n anchor.href = url\r\n anchor.download = `${translate('EXPORT.EXCEL.FIRST-TIME-REPORT-NAME')}_${reportDate}.xlsx`\r\n //@ts-ignore\r\n var isIE = /*@cc_on!@*/ false || !!document.documentMode\r\n //@ts-ignore\r\n var isEdge = !isIE && !!window.StyleMedia\r\n if (isEdge) {\r\n anchor.click()\r\n } else {\r\n anchor.click()\r\n }\r\n window.URL.revokeObjectURL(url)\r\n })\r\n}\r\n\r\nexport default firstTimeExport\r\n","import { useState, useEffect } from 'react'\r\nimport { Grid, Typography, makeStyles, IconButton, Container, Button } from '@material-ui/core'\r\nimport GetAppRoundedIcon from '@material-ui/icons/GetAppRounded'\r\nimport Panel from '../component/report/firsttime/Panel'\r\nimport DataTable from '../component/report/firsttime/DataTable'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport { useSearchFirstTime, SearchKeywordType } from '../services/um/useSearchFirstTime'\r\nimport firstTimeExport from '../component/report/firsttime/report'\r\nimport moment from 'moment'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport { convertDateToFormatTH, convertDateToFormatEN } from '../utilities/date'\r\nimport { setPrefixName } from './../utilities/prefixName'\r\n\r\nimport ArrowBackRounded from '@material-ui/icons/ArrowBackRounded'\r\nimport { useHistory } from 'react-router'\r\nimport { useQueryParam } from 'use-query-params'\r\nimport useProjectType from '../services/um/lookups/useProjectType'\r\nimport useProjectStatus from '../services/um/lookups/useProjectStatus'\r\nimport useFaculty from '../services/um/lookups/useFaculty'\r\n\r\nconst FirstTime = () => {\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const classes = useStyles()\r\n const authenStore = useAuthenStore()\r\n const history = useHistory()\r\n\r\n const { searchFirstTime, dataList } = useSearchFirstTime()\r\n const { projectT } = useProjectType()\r\n const { projectStatus } = useProjectStatus()\r\n const { faculty } = useFaculty()\r\n const [keyword, setKeyword] = useQueryParam('keyword')\r\n const [submittedType, setSubmittedType] = useQueryParam('submittedType')\r\n const [projectType, setProjectType] = useQueryParam('projectType')\r\n const [facultyID, setFacultyID] = useQueryParam('facultyID')\r\n const [startDate, setStartDate] = useQueryParam('startDate')\r\n const [endDate, setEndDate] = useQueryParam('endDate')\r\n\r\n const [initialValue, setInitialValue] = useState({\r\n keyword: keyword,\r\n submittedType: submittedType ?? 1,\r\n projectType: projectType,\r\n facultyID: facultyID,\r\n startDate: startDate ?? moment().subtract(1, 'year').format('YYYY-MM-DD'),\r\n endDate: endDate ?? moment().format('YYYY-MM-DD'),\r\n userID: authenStore.profile.userId ?? 0,\r\n })\r\n\r\n const setSearchParam = (value: SearchKeywordType) => {\r\n setKeyword(value.keyword)\r\n setSubmittedType(value.submittedType ?? 1)\r\n setProjectType(value.projectType)\r\n setFacultyID(value.facultyID)\r\n setStartDate(moment(value.startDate).format('YYYY-MM-DD') ?? '')\r\n setEndDate(moment(value.endDate).format('YYYY-MM-DD') ?? '')\r\n }\r\n\r\n useEffect(() => {\r\n if (authenStore.profile.userId) {\r\n onSearch(initialValue)\r\n }\r\n }, [authenStore.profile.userId])\r\n\r\n const onSearch = async (values: SearchKeywordType) => {\r\n setInitialValue(values)\r\n searchFirstTime({\r\n keyword: values.keyword || null,\r\n submittedType: Number(values.submittedType) || 1,\r\n projectType: Number(values.projectType) || null,\r\n facultyID: Number(values.facultyID) || null,\r\n startDate: values.startDate,\r\n endDate: values.endDate,\r\n userID: authenStore.profile.userId ?? 0,\r\n })\r\n setSearchParam(values)\r\n }\r\n\r\n const onReset = (form: any) => {\r\n form.reset()\r\n setInitialValue({\r\n keyword: null,\r\n submittedType: 1,\r\n projectType: null,\r\n facultyID: null,\r\n startDate: moment().subtract(1, 'year').format('YYYY-MM-DD'),\r\n endDate: moment().format('YYYY-MM-DD'),\r\n userID: authenStore.profile.userId ?? 0,\r\n })\r\n }\r\n\r\n const getProjectTypeName = (value?: number | null) => {\r\n let result = null\r\n if (value) {\r\n result = projectT.find((item) => item.value === value?.toString())?.label\r\n }\r\n return result ?? '-'\r\n }\r\n\r\n const getProjectSubmitTypeName = (value?: number | null) => {\r\n let result = null\r\n if (value) {\r\n result = projectStatus.find((item) => item.value === value?.toString())?.label\r\n }\r\n return result ?? '-'\r\n }\r\n\r\n const getFacultyName = (value?: number | null) => {\r\n let result = null\r\n if (value) {\r\n result = faculty.find((item) => item.value === value?.toString())?.label\r\n }\r\n return result ?? '-'\r\n }\r\n\r\n const handleExportExcel = () => {\r\n firstTimeExport({\r\n header: {\r\n projectType: getProjectTypeName(projectType),\r\n projectSubmitType: getProjectSubmitTypeName(submittedType),\r\n faculty: getFacultyName(facultyID),\r\n startDate: convertDate(moment(startDate).format('YYYY-MM-DD')),\r\n endDate: convertDate(moment(endDate).format('YYYY-MM-DD')),\r\n keyword: keyword ?? '-',\r\n },\r\n content: dataList.map((item) => {\r\n return {\r\n projectID: item.projectNumber,\r\n receiveDate: convertDate(item.receiveDate),\r\n projectSubmitType: item.submittedTypeName[lang], //รอ service\r\n projectType: item.projectType.name[lang] ?? '-',\r\n projectStatus: item.approveStatusName[lang] ?? '-',\r\n researcherName: setPrefixName(item)[lang] ?? '-',\r\n position: item.researcherTypeName[lang] ?? '-',\r\n faculty: item.facultyName[lang] ?? '-',\r\n educationLevelName: item.educationLevelName[lang] ?? '-',\r\n projectNameTH: item.projectName['th'] ?? '-',\r\n projectNameEN: item.projectName['en'] ?? '-',\r\n \r\n }\r\n }),\r\n\r\n translate: (value: string) => translate.get(value),\r\n })\r\n }\r\n\r\n const convertDate = (date: string | null) => {\r\n if (lang === 'th' && date) {\r\n return convertDateToFormatTH(date)\r\n } else if (lang === 'en' && date) {\r\n return convertDateToFormatEN(date)\r\n } else {\r\n return '-'\r\n }\r\n }\r\n\r\n const onBack = () => {\r\n history.push('/dashboard')\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${dataList.length}`])}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n onClick={handleExportExcel}\r\n >\r\n {translate.get('BUTTON.EXPORT')}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n },\r\n container: {\r\n marginTop: '20px',\r\n width: '100%',\r\n },\r\n}))\r\n\r\nexport default FirstTime\r\n","import { useState, useEffect, useCallback } from 'react'\r\n\r\nimport useCallApi from '../../utilities/axios'\r\nimport useTranslate from '../../i18n/useTranslate'\r\n\r\nexport type SearchKeywordType = {\r\n keyword?: string | null\r\n submittedType: number | null\r\n projectType?: number | null\r\n facultyID?: number | null\r\n startDate: string | Date\r\n endDate: string | Date\r\n userID: number\r\n}\r\n\r\nexport type FirstTimeDataListType = {\r\n projectID: number\r\n receiveDate: string\r\n projectNumber: string\r\n projectName: Translation\r\n projectType: {\r\n id: number\r\n name: Translation\r\n }\r\n name: Translation\r\n titleID: number\r\n title: Translation\r\n academicPosition: Translation\r\n isPhD: boolean\r\n researcherTypeName: Translation\r\n facultyName: Translation\r\n approveStatusName: Translation\r\n submittedTypeName: Translation\r\n educationLevelName: Translation\r\n}\r\n\r\ntype Translation = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport const useSearchFirstTime = () => {\r\n const [dataList, setDataList] = useState([])\r\n\r\n const callApi = useCallApi()\r\n\r\n const searchFirstTime = useCallback(async (values: SearchKeywordType) => {\r\n const { data } = await callApi.axiosPost({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/dashboard/search/project/firstTime`,\r\n params: { ...values },\r\n })\r\n setDataList(data)\r\n }, [])\r\n\r\n return {\r\n dataList,\r\n setDataList,\r\n searchFirstTime,\r\n }\r\n}\r\n","import { Button, Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { FC, useState } from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport CalendarTodayIcon from '@material-ui/icons/CalendarToday'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport MyDatePicker from '../../../control/datepicker/datepicker'\r\nimport Select from '../../../control/select/select'\r\nimport { HoldKeywordType } from '../../../services/um/useSearchHold'\r\nimport useProjectType from '../../../services/um/lookups/useProjectType'\r\nimport moment from 'moment'\r\nimport { FormApi } from 'final-form'\r\n\r\ninterface PanelProps {\r\n onSubmit: (values: HoldKeywordType) => void\r\n onReset: (form: FormApi>) => void\r\n initialSearch: any\r\n}\r\nconst Panel: FC = ({ onSubmit, initialSearch, onReset }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const { projectT } = useProjectType()\r\n const [endDate, setEndDate] = useState(moment(new Date()).format('YYYY-MM-DD'))\r\n\r\n const handleStartDateChange = (form: FormApi, value: string | null) => {\r\n if (value && endDate) {\r\n let isStartAfter = moment(value).isAfter(endDate)\r\n if (isStartAfter) {\r\n form.change('endDate', new Date(value))\r\n }\r\n }\r\n }\r\n\r\n const handleEndDateChange = (value: string | null) => {\r\n setEndDate(value)\r\n }\r\n\r\n return (\r\n \r\n \r\n {({ handleSubmit, form, values }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n handleStartDateChange(form, val)}\r\n icon={}\r\n required\r\n />\r\n \r\n \r\n }\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n onReset(form)}\r\n >\r\n {translate.get('BUTTON.RESET')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default Panel\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n },\r\n container: {\r\n padding: '1.7rem',\r\n },\r\n}))\r\n","import { FC } from 'react'\r\nimport _ from 'lodash'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { makeStyles } from '@material-ui/core'\r\nimport { DataGrid, GridColDef } from '@mui/x-data-grid'\r\nimport { DataRowsType } from '../../../services/um/useSearchHold'\r\nimport CustomPagination from '../closed/CustomPagination'\r\nimport CustomNoRowsOverlay from '../closed/CustomNoRowsOverlay'\r\nimport { CustomSortingASCcending, CustomSortingDescending } from '../closed/CusromSorting'\r\n\r\ntype HoldDataTableComponentProps = {\r\n dataList: DataRowsType[]\r\n}\r\n\r\nconst DataTable: FC = ({ dataList }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n\r\n const column: GridColDef[] = [\r\n {\r\n field: 'projectNumber',\r\n headerName: `${translate.get('UM.HOLD.DATA_TABLE.COLUMN1')}`,\r\n width: 180,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'receiveDate',\r\n headerName: `${translate.get('UM.HOLD.DATA_TABLE.COLUMN2')}`,\r\n width: 150,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'countDueDate',\r\n headerName: `${translate.get('UM.HOLD.DATA_TABLE.COLUMN3')}`,\r\n width: 200,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n align: 'center',\r\n },\r\n {\r\n field: 'projectType',\r\n headerName: `${translate.get('UM.HOLD.DATA_TABLE.COLUMN4')}`,\r\n width: 300,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'researcherName',\r\n headerName: `${translate.get('UM.HOLD.DATA_TABLE.COLUMN5')}`,\r\n width: 300,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'researcherTypeName',\r\n headerName: `${translate.get('UM.HOLD.DATA_TABLE.COLUMN6')}`,\r\n width: 200,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'faculty',\r\n headerName: `${translate.get('UM.HOLD.DATA_TABLE.COLUMN7')}`,\r\n width: 300,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'degree',\r\n headerName: `${translate.get('UM.HOLD.DATA_TABLE.COLUMN8')}`,\r\n width: 200,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'projectNameTH',\r\n headerName: `${translate.get('UM.HOLD.DATA_TABLE.COLUMN9')}`,\r\n width: 300,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n {\r\n field: 'projectNameEN',\r\n headerName: `${translate.get('UM.HOLD.DATA_TABLE.COLUMN10')}`,\r\n width: 300,\r\n headerClassName: 'header-table',\r\n headerAlign: 'left',\r\n },\r\n ]\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n '& .super-app-theme--fffff': {\r\n backgroundColor: '#DB5F8E',\r\n '&:hover': {\r\n backgroundColor: '#DB5F8E',\r\n },\r\n },\r\n '& .super-app-theme--header': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n '& .MuiDataGrid-columnSeparator': {\r\n visibility: 'hidden',\r\n },\r\n '& .MuiDataGrid-row': {\r\n lineHeigh: '70px',\r\n },\r\n\r\n '& .header-table': {\r\n backgroundColor: '#DB5F8E',\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiDataGrid-iconSeparator': {\r\n display: 'none',\r\n },\r\n '& .MuiDataGrid-sortIcon': {\r\n color: '#FFFFFF',\r\n },\r\n '& .MuiBadge-anchorOriginTopRightRectangle': {\r\n display: 'none',\r\n },\r\n '& .MuiDataGrid-cell:focus-within': {\r\n outline: 'none',\r\n },\r\n '& .MuiDataGrid-row, .MuiDataGrid-root .MuiDataGrid-cell, .rendering-zone': { 'max-height': 'none !important' },\r\n '.MuiDataGrid-root .MuiDataGrid-window': { position: 'relative !important' },\r\n '.MuiDataGrid-root .MuiDataGrid-viewport': { 'max-height': 'none !important' },\r\n '.MuiDataGrid-root': { height: 'auto !important' },\r\n width: '100%',\r\n marginTop: 16,\r\n\r\n overflowX: 'hidden',\r\n },\r\n}))\r\n\r\nexport default DataTable\r\n","import * as Excel from 'exceljs'\r\nimport moment from 'moment'\r\n\r\ntype ContentT = {\r\n id: number\r\n projectNumber: string\r\n receiveDate: string\r\n countDueDate: number\r\n projectType: string\r\n researcherName: string\r\n researcherTypeName: string\r\n faculty: string\r\n degree: string\r\n projectNameTH: string\r\n projectNameEN: string\r\n}\r\ntype ExportProps = {\r\n header: {\r\n projectType: string\r\n startDate: string\r\n endDate: string\r\n keyword: string\r\n }\r\n content: ContentT[]\r\n translate: (value: string) => string //ไม่สามารถเรียกในหน้านี้ได้ ผิด react rule\r\n}\r\nconst holdExport = ({ header, content, translate }: ExportProps) => {\r\n let startRowHeader = 8\r\n const workbook = new Excel.Workbook()\r\n const worksheet = workbook.addWorksheet('sheet', {\r\n pageSetup: {\r\n paperSize: 9, //follow documentation the 9 value is A4\r\n orientation: 'portrait',\r\n },\r\n })\r\n workbook.creator = 'CU_IRB-WEB'\r\n workbook.lastModifiedBy = 'CU_IRB-WEB'\r\n\r\n const createTopic = () => {\r\n const endCell = 'J'\r\n worksheet.mergeCells(`A1:${endCell}1`)\r\n worksheet.getCell('A1').value = translate('EXPORT.EXCEL.HOLD-REPORT-NAME')\r\n worksheet.getCell('A1').alignment = { horizontal: 'center' }\r\n worksheet.getCell('A1').font = { bold: true }\r\n worksheet.getCell('A1').fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00F1BBCF',\r\n },\r\n }\r\n\r\n worksheet.mergeCells(`A3:B3`)\r\n worksheet.getCell('A3').value = `${translate('EXPORT.EXCEL.PROJECT-TYPE')} ${header.projectType}`\r\n worksheet.getCell('A3').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A4:B4`)\r\n worksheet.getCell('A4').value = `${translate('EXPORT.EXCEL.START-DATE')} ${header.startDate}`\r\n worksheet.getCell('A4').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A5:B5`)\r\n worksheet.getCell('A5').value = `${translate('EXPORT.EXCEL.END-DATE')} ${header.endDate}`\r\n worksheet.getCell('A5').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n\r\n worksheet.mergeCells(`A6:B6`)\r\n worksheet.getCell('A6').value = `${translate('EXPORT.EXCEL.KEYWORD')} ${header.keyword}`\r\n worksheet.getCell('A6').fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '00F79646' } }\r\n }\r\n\r\n const setCellBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n top: { style: 'thin' },\r\n left: { style: 'thin' },\r\n bottom: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const createHeader = () => {\r\n let arrHeader = [\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-ID'),\r\n key: 'projectNumber',\r\n width: 10,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.RECEIVE-DATE'),\r\n key: 'receiveDate',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.HOLD-DAY'),\r\n key: 'countDueDate',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-TYPE'),\r\n key: 'projectType',\r\n width: 20,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.RESEARCHER-NAME'),\r\n key: 'researcherName',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.POSITION'),\r\n key: 'researcherTypeName',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.FACULTY'),\r\n key: 'faculty',\r\n width: 30,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.EDUCATION-LEVEL'),\r\n key: 'degree',\r\n width: 30,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-NAME-TH'),\r\n key: 'projectNameTH',\r\n width: 50,\r\n },\r\n {\r\n name: translate('EXPORT.EXCEL.PROJECT-NAME-EN'),\r\n key: 'projectNameEN',\r\n width: 50,\r\n },\r\n ]\r\n\r\n worksheet.columns = arrHeader.map((itm) => ({ key: itm.key, width: itm.width }))\r\n worksheet.getRow(startRowHeader).values = arrHeader.map((itm) => itm.name)\r\n ;[\r\n `A${startRowHeader}`,\r\n `B${startRowHeader}`,\r\n `C${startRowHeader}`,\r\n `D${startRowHeader}`,\r\n `E${startRowHeader}`,\r\n `F${startRowHeader}`,\r\n `G${startRowHeader}`,\r\n `H${startRowHeader}`,\r\n `I${startRowHeader}`,\r\n `J${startRowHeader}`,\r\n ].forEach((colKey, index) => {\r\n if (index < 10) {\r\n setCellBorder(colKey)\r\n worksheet.getCell(colKey).alignment = { vertical: 'middle', horizontal: 'center', wrapText: true }\r\n worksheet.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00DB5F8E',\r\n },\r\n }\r\n }\r\n })\r\n }\r\n\r\n const setCellRight = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'right' }\r\n }\r\n\r\n const setCellCenter = (colKey: string) => {\r\n worksheet.getCell(colKey).alignment = { horizontal: 'center' }\r\n }\r\n const setContentBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n left: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const setLastContentBorder = (colKey: string) => {\r\n worksheet.getCell(colKey).border = {\r\n left: { style: 'thin' },\r\n bottom: { style: 'thin' },\r\n right: { style: 'thin' },\r\n }\r\n }\r\n\r\n const setContentColor = (colKey: string) => {\r\n worksheet.getCell(colKey).fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: {\r\n argb: '00F1BBCF',\r\n },\r\n }\r\n }\r\n\r\n const makeRowITM = (rowNumber: number, rowITM: ContentT & { isOddRow: boolean; lastRow: boolean }) => {\r\n worksheet.addRow(rowITM)\r\n\r\n const arrColKey = [\r\n `A${rowNumber}`,\r\n `B${rowNumber}`,\r\n `C${rowNumber}`,\r\n `D${rowNumber}`,\r\n `E${rowNumber}`,\r\n `F${rowNumber}`,\r\n `G${rowNumber}`,\r\n `H${rowNumber}`,\r\n `I${rowNumber}`,\r\n `J${rowNumber}`,\r\n ]\r\n\r\n arrColKey.forEach((colKey, index) => {\r\n if (index < 10) {\r\n if (index === 0) {\r\n setCellRight(colKey) //number format\r\n }\r\n if (index === 1 || index === 2) {\r\n setCellCenter(colKey) //consider type มีแค่สามอย่าง ขนาดพอๆกันเลยอยู่ตรงกลางได้\r\n }\r\n\r\n setContentBorder(colKey)\r\n if (rowITM.isOddRow) {\r\n setContentColor(colKey)\r\n }\r\n if (rowITM.lastRow) {\r\n setLastContentBorder(colKey)\r\n }\r\n }\r\n })\r\n }\r\n\r\n const createBody = () => {\r\n try {\r\n content.forEach((rowGroupITM, index) => {\r\n makeRowITM(index + (startRowHeader + 1), {\r\n lastRow: content.length === index + 1 ? true : false,\r\n isOddRow: (index + 1) % 2 === 0 ? false : true,\r\n ...rowGroupITM,\r\n })\r\n })\r\n } catch (err) {\r\n console.log('Error Generate Row Excel file export: ', err)\r\n throw new Error(err)\r\n }\r\n }\r\n\r\n const createTable = () => {\r\n createHeader()\r\n createBody()\r\n }\r\n\r\n const processColumns = () => {\r\n createTopic()\r\n createTable()\r\n }\r\n\r\n processColumns()\r\n workbook.xlsx.writeBuffer().then(function (xls64data) {\r\n const blob = new Blob([xls64data], {\r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n })\r\n const url = window.URL.createObjectURL(blob)\r\n const anchor = document.createElement('a')\r\n\r\n const reportDate = moment(new Date()).format('yyyyMMDD')\r\n\r\n anchor.href = url\r\n anchor.download = `${translate('EXPORT.EXCEL.HOLD-REPORT-NAME')}_${reportDate}.xlsx`\r\n //@ts-ignore\r\n var isIE = /*@cc_on!@*/ false || !!document.documentMode\r\n var isEdge = !isIE && !!window.StyleMedia\r\n if (isEdge) {\r\n anchor.click()\r\n } else {\r\n anchor.click()\r\n }\r\n window.URL.revokeObjectURL(url)\r\n })\r\n}\r\n\r\nexport default holdExport\r\n","import { createStyles, Grid, IconButton, makeStyles, Typography, Container, Button } from '@material-ui/core'\r\nimport { FC, useEffect, useState } from 'react'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport Panel from '../component/report/hold/Panel'\r\nimport DataTable from '../component/report/hold/DataTable'\r\nimport { useSearchHold, HoldKeywordType, DataRowsType } from '../services/um/useSearchHold'\r\nimport holdExport from '../component/report/hold/report'\r\n\r\nimport moment from 'moment'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport { setPrefixName } from './../utilities/prefixName'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../utilities/date'\r\nimport useProjectType from '../services/um/lookups/useProjectType'\r\nimport { useQueryParam, StringParam } from 'use-query-params'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\n\r\nimport GetAppRoundedIcon from '@material-ui/icons/GetAppRounded'\r\nimport { useHistory } from 'react-router'\r\nimport { FormApi } from 'final-form'\r\n\r\nconst Hold: FC<{}> = () => {\r\n const translate = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const history = useHistory()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const classes = useStyles()\r\n const { dataList, searchHold } = useSearchHold()\r\n const { projectT } = useProjectType()\r\n const [data, setData] = useState([])\r\n const [record, setRecord] = useState()\r\n\r\n const [keyword, setKeyword] = useQueryParam('keyword', StringParam)\r\n const [projectType, setProjectType] = useQueryParam('projectType', StringParam)\r\n const [startDate, setStartDate] = useQueryParam('startDate')\r\n const [endDate, setEndDate] = useQueryParam('endDate')\r\n\r\n const setSearchParam = (value: HoldKeywordType) => {\r\n setStartDate(moment(value.startDate).format('YYYY-MM-DD') ?? '')\r\n setEndDate(moment(value.endDate).format('YYYY-MM-DD') ?? '')\r\n setKeyword(value.keyword ?? '')\r\n setProjectType(value.projectType ?? null)\r\n }\r\n\r\n const initialSearch = {\r\n keyword: keyword ?? '',\r\n projectType: projectType ?? null,\r\n startDate: startDate ?? moment().subtract(1, 'year').format('YYYY-MM-DD'),\r\n endDate: endDate ?? moment().format('YYYY-MM-DD'),\r\n userID: authenStore.profile.userId,\r\n }\r\n\r\n const onBack = () => {\r\n history.push('/dashboard')\r\n }\r\n useEffect(() => {\r\n if (authenStore.profile.userId) {\r\n searchHold(initialSearch)\r\n setSearchParam(initialSearch)\r\n }\r\n }, [authenStore.profile.userId])\r\n\r\n useEffect(() => {\r\n setRecord(dataList.length)\r\n }, [dataList])\r\n\r\n useEffect(() => {\r\n const convertData = dataList.map((item) => {\r\n return {\r\n id: item.projectID,\r\n projectNumber: item.projectNumber ?? '-',\r\n receiveDate: convertDate(item.receiveDate) ?? '-',\r\n researcherName: setPrefixName(item)[lang] ?? '-',\r\n degree: item.degree[lang] ?? '-',\r\n projectNameTH: item.projectName['th'] ?? '-',\r\n projectNameEN: item.projectName['en'] ?? '-',\r\n projectType: item.projectType.name[lang] ?? '-',\r\n faculty: item.facultyName[lang] ?? '-',\r\n researcherTypeName: item.researcherTypeName[lang] ?? '-',\r\n countDueDate: item.countDueDate,\r\n }\r\n })\r\n setData(convertData)\r\n }, [dataList, lang])\r\n\r\n const convertDate = (date: string | null) => {\r\n if (lang === 'th' && date) {\r\n return convertDateToFormatTH(date)\r\n } else if (lang === 'en' && date) {\r\n return convertDateToFormatEN(date)\r\n } else {\r\n return '-'\r\n }\r\n }\r\n\r\n const onSubmit = async (value: HoldKeywordType) => {\r\n const param = {\r\n keyword: value.keyword,\r\n projectType: value.projectType,\r\n startDate: moment(value.startDate).format('YYYY-MM-DD'),\r\n endDate: moment(value.endDate).format('YYYY-MM-DD'),\r\n userID: authenStore.profile.userId,\r\n }\r\n setSearchParam(value)\r\n searchHold(param)\r\n }\r\n\r\n const getProjectTypeName = (value?: string | null) => {\r\n let result = null\r\n if (value) {\r\n result = projectT.find((item) => item.value === projectType)?.label\r\n }\r\n return result ?? '-'\r\n }\r\n\r\n const onReset = (form: FormApi>) => {\r\n const param = {\r\n startDate: moment().subtract(1, 'year').format('YYYY-MM-DD'),\r\n endDate: moment().format('YYYY-MM-DD'),\r\n userID: authenStore.profile.userId,\r\n }\r\n\r\n form.initialize(param)\r\n setSearchParam(param)\r\n }\r\n\r\n const handleExportExcel = () => {\r\n data &&\r\n holdExport({\r\n header: {\r\n projectType: getProjectTypeName(projectType),\r\n startDate: convertDate(startDate.toString()),\r\n endDate: convertDate(endDate.toString()),\r\n keyword: keyword ?? '-',\r\n },\r\n content: data,\r\n translate: (value: string) => translate.get(value),\r\n })\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${record}`])}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n onClick={handleExportExcel}\r\n >\r\n {translate.get('BUTTON.EXPORT')}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default Hold\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n },\r\n container: {\r\n margin: '15px 0px',\r\n width: '100%',\r\n },\r\n}))\r\n","import { useState, useEffect, useCallback } from 'react'\r\nimport * as umServiceURL from './umServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nexport type HoldKeywordType = {\r\n userID: number | null\r\n keyword?: string\r\n projectType?: string | null\r\n startDate: string | Date\r\n endDate: string | Date\r\n}\r\n\r\nexport type HoldDataListType = {\r\n projectID: number\r\n receiveDate: string\r\n projectNumber: string\r\n projectName: Translation\r\n projectType: {\r\n id: number\r\n name: Translation\r\n }\r\n name: Translation\r\n title: Translation\r\n academicPosition: Translation\r\n researcherTypeName: Translation\r\n facultyName: Translation\r\n degree: Translation\r\n countDueDate: number\r\n}\r\n\r\ntype Translation = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport type DataRowsType = {\r\n id: number\r\n projectNumber: string\r\n receiveDate: string\r\n researcherName: string\r\n degree: string\r\n projectNameTH: string\r\n projectNameEN: string\r\n projectType: string\r\n faculty: string\r\n researcherTypeName: string\r\n countDueDate: number\r\n}\r\n\r\nexport const useSearchHold = () => {\r\n const [dataList, setDataList] = useState([])\r\n\r\n const callApi = useCallApi()\r\n\r\n const searchHold = useCallback(async (values?: HoldKeywordType) => {\r\n if (values?.userID) {\r\n const { data } = await callApi.axiosPost({\r\n url: umServiceURL.postSearchHold,\r\n params: values,\r\n })\r\n\r\n setDataList(data)\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n searchHold()\r\n }, [searchHold])\r\n\r\n return {\r\n dataList,\r\n setDataList,\r\n searchHold,\r\n }\r\n}\r\n","import React from 'react'\r\nimport { Typography } from '@material-ui/core'\r\nimport { AccordionSummaryViewType, MyAccordionCtrlType } from './accordionType'\r\nimport useAccordion from './useAccordion'\r\nimport { withStyles } from '@material-ui/core/styles'\r\nimport MuiAccordion from '@material-ui/core/Accordion'\r\nimport MuiAccordionSummary from '@material-ui/core/AccordionSummary'\r\nimport MuiAccordionDetails from '@material-ui/core/AccordionDetails'\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore'\r\n\r\nconst Accordion = withStyles({\r\n root: {\r\n border: '1px solid rgba(0, 0, 0, .125)',\r\n boxShadow: 'none',\r\n '&:not(:last-child)': {\r\n borderBottom: 0,\r\n },\r\n '&:before': {\r\n display: 'none',\r\n },\r\n '&$expanded': {\r\n margin: 'auto',\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordion)\r\n\r\nconst AccordionSummary = withStyles({\r\n root: {\r\n backgroundColor: '#ffffff',\r\n borderBottom: '1px solid rgba(0, 0, 0, .125)',\r\n marginBottom: -1,\r\n minHeight: 56,\r\n '&$expanded': {\r\n minHeight: 56,\r\n },\r\n },\r\n content: {\r\n '&$expanded': {\r\n margin: '12px 0',\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordionSummary)\r\n\r\nconst AccordionDetails = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiAccordionDetails)\r\n\r\nconst MyAccordionView: React.FC = ({ title, children, titleIcon, noPadding }) => {\r\n return (\r\n {\r\n // onClickAccordionChange(!isExpanded)\r\n }}\r\n defaultExpanded\r\n >\r\n }\r\n >\r\n \r\n {title}\r\n {titleIcon && (\r\n <>\r\n  \r\n {titleIcon()}\r\n \r\n )}\r\n \r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nlet MyAccordionCtrl: React.FC = ({ ...others }) => {\r\n const myAutocomplete = useAccordion(others)\r\n return \r\n}\r\n\r\nexport default MyAccordionCtrl\r\n","import { Grid, makeStyles } from '@material-ui/core'\r\nimport { Certificate } from 'crypto'\r\nimport { FC } from 'react'\r\nimport { Form } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { CertificateFormProps } from '../../../pages/SettingCertificate'\r\ninterface OfficerProps {}\r\nconst Officer: FC = ({}) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default Officer\r\n\r\nconst useStyles = makeStyles(() => ({\r\n container: {\r\n padding: '1.7rem',\r\n },\r\n item: {\r\n marginBottom: '1rem',\r\n },\r\n}))\r\n","import { Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { FC, useState, useEffect } from 'react'\r\nimport UploadImage from '../../../control/uploadImage/uploadImage'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useWebService from '../../../services/web/useWebService'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport { LanguageType, CertificateFormProps } from '../../../pages/SettingCertificate'\r\nimport { convertPathToNameImg } from '../../../utilities/pathImg'\r\ninterface UploadLogoProps {\r\n form: any\r\n initialValues?: CertificateFormProps\r\n}\r\nconst UploadLogo: FC = ({ form, initialValues }) => {\r\n const translate = useTranslate()\r\n const classes = usestyles()\r\n\r\n const callWebService = useWebService()\r\n\r\n const [temp, setTemp] = useState<{\r\n imgUpload_th: string | null\r\n imgUpload_en: string | null\r\n name_th: string | null | undefined\r\n name_en: string | null | undefined\r\n }>({\r\n imgUpload_th: null,\r\n imgUpload_en: null,\r\n name_th: null,\r\n name_en: null,\r\n })\r\n\r\n useEffect(() => {\r\n setTemp({\r\n imgUpload_th: initialValues?.imgUpload_th || null,\r\n imgUpload_en: initialValues?.imgUpload_en || null,\r\n name_th: initialValues?.imgUpload_th ? convertPathToNameImg(initialValues?.imgUpload_th) : null,\r\n name_en: initialValues?.imgUpload_en ? convertPathToNameImg(initialValues?.imgUpload_en) : null,\r\n })\r\n }, [initialValues])\r\n\r\n const onUpload = async (event: React.ChangeEvent, language: LanguageType) => {\r\n const file = event.target.files?.[0]\r\n const formDataImage = new FormData()\r\n if (file) {\r\n formDataImage.append('files', file)\r\n\r\n const { result } = await callWebService.uploadFileTemp(formDataImage)\r\n\r\n if (result.length > 0) {\r\n if (language === 'th') {\r\n setTemp({ ...temp, imgUpload_th: result[0].path, name_th: result[0].filename })\r\n form.change('imgUpload_th', result)\r\n } else {\r\n setTemp({ ...temp, imgUpload_en: result[0].path, name_en: result[0].filename })\r\n form.change('imgUpload_en', result)\r\n }\r\n }\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {translate.get('UM.UPLOAD.LOGO_TH')}\r\n \r\n \r\n \r\n {temp.name_th ? temp.name_th : ''}\r\n \r\n \r\n onUpload(event, 'th')}\r\n color={'primary'}\r\n labelTitle={translate.get('BUTTON.UPLOAD')}\r\n />\r\n \r\n \r\n \r\n \r\n {translate.get('UM.UPLOAD.LOGO_EN')}\r\n \r\n \r\n \r\n {temp.name_en ? temp.name_en : ''}\r\n \r\n \r\n onUpload(event, 'en')}\r\n color={'primary'}\r\n labelTitle={translate.get('BUTTON.UPLOAD')}\r\n />\r\n \r\n \r\n \r\n \r\n )\r\n}\r\nexport default UploadLogo\r\n\r\nconst usestyles = makeStyles((theme) => ({\r\n image: {\r\n display: 'flex',\r\n margin: '15px auto',\r\n width: '330px',\r\n height: '230px',\r\n objectFit: 'contain',\r\n\r\n [theme.breakpoints.down('xs')]: {\r\n width: '260px',\r\n height: '180px',\r\n },\r\n },\r\n container: {\r\n padding: '8px 15px',\r\n },\r\n}))\r\n","import { Button, Dialog, Grid, makeStyles } from '@material-ui/core'\r\nimport { FC, useRef } from 'react'\r\nimport { Form as FinalForm, FormRenderProps } from 'react-final-form'\r\nimport MyAccordion from '../../../control/accordion/accordion'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport Officer from './officer'\r\nimport UploadLogo from './UploadLogo'\r\nimport { CertificateFormProps } from '../../../pages/SettingCertificate'\r\n\r\ninterface FormProps {\r\n onSubmit: (value: CertificateFormProps) => void\r\n initialValues?: CertificateFormProps\r\n}\r\n\r\nconst Form: FC = ({ onSubmit, initialValues }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const formPropsRef = useRef()\r\n\r\n const validateForm = (values: CertificateFormProps) => {\r\n const errors: any = {}\r\n if (!values.imgUpload_th) {\r\n errors.imgUpload_th = `${translate.get('UM.UPLOAD.REQUIRED')}`\r\n }\r\n\r\n if (!values.imgUpload_en) {\r\n errors.imgUpload_en = `${translate.get('UM.UPLOAD.REQUIRED')}`\r\n }\r\n\r\n return errors\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {({ handleSubmit, form }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default Form\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n buttonSection: {\r\n marginTop: '10px',\r\n },\r\n btnSubmit: {\r\n float: 'right',\r\n minWidth: '0px',\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n },\r\n}))\r\n","import { Container, Grid } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/styles'\r\nimport { FC, useEffect, useRef, useState } from 'react'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport { useSettingCertificate, FileType } from '../services/um/useSettingCertificate'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport Form from './../component/um/settingCertificate/Form'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport { useHistory } from 'react-router'\r\n\r\nexport type CertificateFormProps = {\r\n certificateID?: number | null\r\n detail_TH?: string\r\n detail_EN?: string\r\n condition_TH?: string\r\n condition_EN?: string\r\n imgUpload_th: string | null\r\n imgUpload_en: string | null\r\n detail_exempt_TH?: string | null\r\n detail_exempt_EN?: string | null\r\n condition_exempt_TH?: string | null\r\n condition_exempt_EN?: string | null\r\n}\r\n\r\nexport type LanguageType = 'th' | 'en'\r\n\r\nconst SettingCertificate = () => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const { getSettingCertificate, putSettingCertificate, postSettingCertificate } = useSettingCertificate()\r\n const authenStore = useAuthenStore()\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n const [initialValues, setInitialValues] = useState({\r\n imgUpload_th: null,\r\n imgUpload_en: null,\r\n })\r\n\r\n useEffect(() => {\r\n if (authenStore.profile.userId) {\r\n getSettingCertificateed(authenStore.profile.userId)\r\n }\r\n }, [authenStore.profile.userId])\r\n\r\n const getSettingCertificateed = async (userID: number) => {\r\n let dataList = await getSettingCertificate(userID)\r\n\r\n setInitialValues({\r\n certificateID: dataList.certificateID || null,\r\n detail_TH: dataList.description['th'] || '',\r\n detail_EN: dataList.description['en'] || '',\r\n condition_TH: dataList.condition['th'] || '',\r\n condition_EN: dataList.condition['en'] || '',\r\n imgUpload_th: `${process.env.REACT_APP_UPLOAD}${dataList.logoURL['th']}` || null,\r\n imgUpload_en: `${process.env.REACT_APP_UPLOAD}${dataList.logoURL['en']}` || null,\r\n detail_exempt_TH: dataList.descriptionExempt['th'] || '',\r\n detail_exempt_EN: dataList.descriptionExempt['en'] || '',\r\n condition_exempt_TH: dataList.conditionExempt['th'] || '',\r\n condition_exempt_EN: dataList.conditionExempt['en'] || '',\r\n })\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const onSave = async (values: any) => {\r\n let dataList = await getSettingCertificate(authenStore.profile.userId ?? 0)\r\n\r\n if (!dataList.certificateID) {\r\n const param = {\r\n description: {\r\n th: values.detail_TH || '',\r\n en: values.detail_EN || '',\r\n },\r\n condition: {\r\n th: values.condition_TH || '',\r\n en: values.condition_EN || '',\r\n },\r\n imgUpload_th: values.imgUpload_th || [],\r\n imgUpload_en: values.imgUpload_en || [],\r\n descriptionExempt: {\r\n th: values.detail_exempt_TH || '',\r\n en: values.detail_exempt_EN || '',\r\n },\r\n conditionExempt: {\r\n th: values.condition_exempt_TH || '',\r\n en: values.condition_exempt_EN || '',\r\n },\r\n }\r\n\r\n let result = await postSettingCertificate(param)\r\n\r\n if (result.message === 'success') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n } else {\r\n const param = {\r\n certificateID: values?.certificateID ?? null,\r\n description: {\r\n th: values.detail_TH || '',\r\n en: values.detail_EN || '',\r\n },\r\n condition: {\r\n th: values.condition_TH || '',\r\n en: values.condition_EN || '',\r\n },\r\n imgUpload_th: values.imgUpload_th || [],\r\n imgUpload_en: values.imgUpload_en || [],\r\n userID: Number(authenStore.profile.userId),\r\n descriptionExempt: {\r\n th: values.detail_exempt_TH || '',\r\n en: values.detail_exempt_EN || '',\r\n },\r\n conditionExempt: {\r\n th: values.condition_exempt_TH || '',\r\n en: values.condition_exempt_EN || '',\r\n },\r\n }\r\n\r\n let result = await putSettingCertificate(param)\r\n\r\n if (result.message === 'success') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n }\r\n }\r\n\r\n const handleClickSubmit = async (values: CertificateFormProps) => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => onSave(values),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default SettingCertificate\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n },\r\n}))\r\n","import { useState, useEffect, useCallback } from 'react'\r\nimport useAuthenStore from '../../stores/authen/authenStore'\r\nimport * as umServiceURL from './umServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nexport type SettingCertificateResponseType = {\r\n certificateID: number\r\n description: Translation\r\n condition: Translation\r\n logoURL: Translation\r\n descriptionExempt: Translation\r\n conditionExempt: Translation\r\n}\r\n\r\nexport type PutSettingCertificateValueType = {\r\n certificateID: number\r\n description: Translation\r\n condition: Translation\r\n imgUpload_th: FileType[]\r\n imgUpload_en: FileType[]\r\n userID: number\r\n descriptionExempt: Translation\r\n conditionExempt: Translation\r\n}\r\n\r\nexport type PostSettingCertificateValueType = {\r\n description: Translation\r\n condition: Translation\r\n imgUpload_th: FileType[]\r\n imgUpload_en: FileType[]\r\n}\r\n\r\nexport type FileType = {\r\n fileToken: string\r\n filename: string\r\n path: string\r\n}\r\n\r\ntype Translation = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport type PutSettingCertificateResponseType = {\r\n message: string\r\n}\r\n\r\nexport const useSettingCertificate = () => {\r\n const callApi = useCallApi()\r\n\r\n const getSettingCertificate = async (userID: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${umServiceURL.getSettingCertificate}?userID=${userID}`,\r\n })\r\n return data\r\n }\r\n\r\n const putSettingCertificate = async (value: PutSettingCertificateValueType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServiceURL.putSettingCertificate}/${value.certificateID}`,\r\n params: { ...value },\r\n })\r\n\r\n return data\r\n }\r\n\r\n const postSettingCertificate = async (value: PostSettingCertificateValueType) => {\r\n const { data } = await callApi.axiosPost({\r\n url: `${umServiceURL.postSettingCertificate}`,\r\n params: { ...value },\r\n })\r\n\r\n return data\r\n }\r\n\r\n return {\r\n getSettingCertificate,\r\n putSettingCertificate,\r\n postSettingCertificate,\r\n }\r\n}\r\n","import { useState, useEffect } from 'react'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useCallApi from '../../../utilities/axios'\r\nimport * as umServinceURL from '../umServiceURL'\r\n\r\nexport type OptType = {\r\n label: string\r\n value: string\r\n}\r\n\r\ntype Resulttype = {\r\n irb_id: number\r\n name_en: string\r\n name_th: string\r\n}\r\ntype responseType = {\r\n message: string\r\n status: number\r\n result: Resulttype[]\r\n}\r\n\r\nconst useIRB = () => {\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const callApi = useCallApi()\r\n const [irb, setIrb] = useState([])\r\n\r\n const getIRB = async () => {\r\n const { data } = await callApi.axiosGet({\r\n url: umServinceURL.getIrb,\r\n })\r\n const lookup = data.result.map((itm) => {\r\n const container: OptType = {\r\n ['label']: lang === 'en' ? itm.name_en : itm.name_th,\r\n ['value']: itm.irb_id.toString(),\r\n }\r\n\r\n return container\r\n })\r\n setIrb(lookup)\r\n return lookup\r\n }\r\n\r\n useEffect(() => {\r\n getIRB()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n return { irb, getIRB }\r\n}\r\n\r\nexport default useIRB\r\n","import { FC, useState } from 'react'\r\nimport Select from '../../../control/select/select'\r\nimport { Grid, Paper } from '@material-ui/core'\r\nimport Button from '../../../control/button/button'\r\nimport { Form } from 'react-final-form'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { KeywordType } from '../../../services/um/useSearchSettingFaculty'\r\nimport useIRB from '../../../services/um/lookups/useIRB'\r\n\r\ninterface PanelProps {\r\n onSubmit: (values: KeywordType) => void\r\n initialSearch: any\r\n}\r\n\r\nconst Panel: FC = ({ initialSearch, onSubmit }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const { irb } = useIRB()\r\n const defaultSelect = initialSearch.recID ? [initialSearch.recID] : undefined\r\n\r\n return (\r\n // \r\n \r\n {({ handleSubmit }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {translate.get('UM.EXTERNAL-RESEARCHER.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n\r\n // \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: '15px',\r\n },\r\n\r\n clear: {\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n padding: '0px 1.5rem',\r\n alignSelf: 'center',\r\n },\r\n paperSearch: {\r\n width: '100%',\r\n padding: theme.spacing(3),\r\n paddingBottom: '32px',\r\n marginBottom: '10px',\r\n },\r\n btnSearch: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n },\r\n}))\r\n\r\nexport default Panel\r\n","import { useHistory } from 'react-router-dom'\r\n\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { Paper } from '@material-ui/core'\r\nimport { ButtonView } from '../../../control/button/button'\r\n\r\ninterface Props {\r\n id: number\r\n nameTH: string\r\n nameEN: string\r\n rec: string\r\n}\r\n\r\nconst Item: React.FC = ({ id, nameTH, nameEN, rec }) => {\r\n const classes = useStyles()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n\r\n const onEdit = () => {\r\n history.push(`/setting-faculty/${id}/edit`)\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.EDIT')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.SETTING_FACULTY.NAME_TH')}\r\n \r\n \r\n \r\n {nameTH}\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.SETTING_FACULTY.NAME_EN')}\r\n \r\n \r\n \r\n {nameEN}\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.SETTING_FACULTY.REC')}\r\n \r\n \r\n \r\n {rec}\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n item: {\r\n // display: 'flex',\r\n // alignItems: 'center',\r\n padding: theme.spacing(3),\r\n margin: theme.spacing(2, 0),\r\n border: '1px solid #bdbdbd',\r\n // borderRadius: 4,\r\n // transition: '0.3s',\r\n // position: 'relative',\r\n '&:hover': {\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n },\r\n icon: {\r\n marginRight: theme.spacing(1),\r\n width: 40,\r\n height: 40,\r\n backgroundColor: '#ece9e9',\r\n transition: '0.3s',\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n },\r\n recentTime: {\r\n position: 'absolute',\r\n top: 2,\r\n right: 4,\r\n color: 'grey',\r\n },\r\n header: {\r\n // marginLeft: theme.spacing(1),\r\n fontWeight: 'bold',\r\n },\r\n btnEdit: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n height: '44px',\r\n marginRight: '1px',\r\n },\r\n multiLineEllipsis: {\r\n maxWidth: '100%',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n display: '-webkit-box',\r\n '-webkit-line-clamp': 1,\r\n '-webkit-box-orient': 'vertical',\r\n },\r\n}))\r\n\r\nexport default Item\r\n","import isEmpty from 'lodash/isEmpty'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { useHistory } from 'react-router-dom'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport Button from '@material-ui/core/Button'\r\nimport AddIcon from '@material-ui/icons/Add'\r\n\r\nimport Item from './Item'\r\nimport EmptyData from './../officer/EmptyData'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nimport { FacultyDataListType } from '../../../services/um/useSearchSettingFaculty'\r\n\r\ninterface Props {\r\n // order: Order\r\n // onSort: (value: Order) => void\r\n data: FacultyDataListType[]\r\n}\r\n\r\nconst Result: React.FC = ({ data }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const history = useHistory()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n // const handleChange = (event: React.ChangeEvent<{ value: any }>) => {\r\n // onSort(event.target.value)\r\n // }\r\n\r\n const GotoAddFaculty = () => {\r\n history.push('/setting-faculty/add')\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${data.length}`])}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n {translate.get('UM.SETTING_FACULTY.ADD')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {data.map((item) => (\r\n \r\n ))}\r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n margin: theme.spacing(2, 0),\r\n },\r\n typo: {\r\n fontWeight: 'bold',\r\n },\r\n sorting: {\r\n margin: theme.spacing(2, 0),\r\n },\r\n}))\r\n\r\nexport default Result\r\n","import { Container, Grid, Typography } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/styles'\r\nimport { FC, useEffect, useState } from 'react'\r\nimport { useQueryParam } from 'use-query-params'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\n\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport { KeywordType, useSearchSettingFaculty } from '../services/um/useSearchSettingFaculty'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport Panel from './../component/um/setting-faculty/Panel'\r\nimport Result from './../component/um/setting-faculty/Result'\r\n\r\ninterface SettingFacultyProps {}\r\nexport type CertificateFormProps = {\r\n detailTH: string\r\n detailEN: string\r\n conditionTH: string\r\n conditionEN: string\r\n}\r\n\r\nconst SettingFaculty: FC = () => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const authenStore = useAuthenStore()\r\n const { dataList, searchSettingFaculty } = useSearchSettingFaculty()\r\n const [recID, setRecID] = useQueryParam('recID')\r\n\r\n const initialValues = {\r\n recID: recID,\r\n userID: authenStore.profile.userId,\r\n }\r\n\r\n useEffect(() => {\r\n if (authenStore.profile.userId) {\r\n setRecID(recID)\r\n searchSettingFaculty(initialValues)\r\n }\r\n }, [authenStore.profile.userId])\r\n\r\n const onSubmit = async (value: KeywordType) => {\r\n const param = {\r\n recID: value.recID,\r\n userID: authenStore.profile.userId,\r\n }\r\n value.recID && setRecID(value.recID.toString())\r\n setRecID(value.recID?.toString() ?? null)\r\n searchSettingFaculty(param)\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default SettingFaculty\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n },\r\n}))\r\n","import { useState, useEffect, useCallback } from 'react'\r\nimport * as umServiceURL from './umServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nexport type KeywordType = {\r\n userID: number | null\r\n recID?: string | null\r\n}\r\n\r\nexport type FacultyDataListType = {\r\n facultyID: number\r\n facultyName: Translation\r\n rec: {\r\n id: number\r\n name: Translation\r\n }\r\n}\r\n\r\ntype Translation = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport const useSearchSettingFaculty = () => {\r\n const [dataList, setDataList] = useState([])\r\n\r\n const callApi = useCallApi()\r\n\r\n const searchSettingFaculty = useCallback(async (values?: KeywordType) => {\r\n if (values?.userID) {\r\n const url = new URL(umServiceURL.getSearchSettingFaculty)\r\n url.searchParams.set('userID', values.userID.toString())\r\n values.recID && url.searchParams.set('recID', values.recID)\r\n const { data } = await callApi.axiosGet({\r\n url,\r\n })\r\n\r\n setDataList(data)\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n searchSettingFaculty()\r\n }, [searchSettingFaculty])\r\n\r\n return {\r\n dataList,\r\n setDataList,\r\n searchSettingFaculty,\r\n }\r\n}\r\n","import { Button, Grid } from '@material-ui/core'\r\nimport Select from '../../../control/select/select'\r\nimport { makeStyles } from '@material-ui/styles'\r\nimport { FC } from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { FacultyFormType } from '../../../services/um/useSettingFaculty'\r\nimport useIRB from '../../../services/um/lookups/useIRB'\r\n\r\ntype InitialFormType = {\r\n userID?: number\r\n nameTH: string\r\n nameEN: string\r\n recID?: any\r\n}\r\ninterface FormProps {\r\n onBack: () => void\r\n initialValues?: InitialFormType\r\n onSubmit: (values: FacultyFormType) => void\r\n}\r\nconst Form: FC = ({ onBack, initialValues, onSubmit }) => {\r\n const classes = useStyle()\r\n const translate = useTranslate()\r\n const { irb } = useIRB()\r\n\r\n return (\r\n \r\n {({ handleSubmit }) => {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n }}\r\n
\r\n )\r\n}\r\n\r\nconst useStyle = makeStyles(() => ({\r\n container: {\r\n width: '100%',\r\n },\r\n reset: {\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n padding: '0px 1.5rem',\r\n alignSelf: 'center',\r\n },\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n padding: '1rem 0px',\r\n },\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n },\r\n saveButton: {\r\n border: 'solid 1px #db5f8e',\r\n boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)',\r\n },\r\n}))\r\n\r\nexport default Form\r\n","import { useState, useEffect } from 'react'\r\nimport * as umServiceURL from './umServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nexport type FacultyFormType = {\r\n userID?: number | null\r\n nameTH: string\r\n nameEN: string\r\n recID: number | null\r\n}\r\n\r\nexport const useSettingFaculty = (id?: string) => {\r\n const [settingFaculty, setSettingFaculty] = useState()\r\n\r\n useEffect(() => {\r\n id && getSettingFaculty(id)\r\n }, [])\r\n\r\n const callApi = useCallApi()\r\n\r\n const getSettingFaculty = async (facultyID: string) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${umServiceURL.getSettingFaculty}/${facultyID}`,\r\n })\r\n\r\n setSettingFaculty(data)\r\n return data\r\n }\r\n\r\n const putSettingFaculty = async (values: FacultyFormType, facultyID: string) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServiceURL.getSettingFaculty}/${facultyID}`,\r\n params: values,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const postSettingFaculty = async (values: FacultyFormType) => {\r\n const { data } = await callApi.axiosPost({\r\n url: umServiceURL.getSettingFaculty,\r\n params: values,\r\n })\r\n\r\n return data\r\n }\r\n\r\n return {\r\n settingFaculty,\r\n putSettingFaculty,\r\n postSettingFaculty,\r\n }\r\n}\r\n","import { Container, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport { FC, useRef, useState } from 'react'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport Form from '../component/um/setting-faculty/Form'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { FacultyFormType, useSettingFaculty } from '../services/um/useSettingFaculty'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\ninterface SettingFacultyAddProps {}\r\nexport type FormType = {\r\n nameTH: string | null\r\n nameEN: string | null\r\n rec: number | null\r\n}\r\nconst SettingFacultyAdd: FC = ({}) => {\r\n const classes = useStyle()\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const authenStore = useAuthenStore()\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const { postSettingFaculty } = useSettingFaculty()\r\n\r\n const save = async (values: FacultyFormType) => {\r\n const format = {\r\n ...values,\r\n userID: authenStore.profile.userId,\r\n recID: values.recID == 0 ? null : values.recID,\r\n }\r\n const result = await postSettingFaculty(format)\r\n let optionDialog: any = {\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: onBack,\r\n }\r\n if (result.status !== 1) {\r\n optionDialog = {\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('MESSAGE.M022'),\r\n type: 'alert-message',\r\n }\r\n }\r\n\r\n setConfigDialog(optionDialog)\r\n }\r\n\r\n const onSubmit = (value: FacultyFormType) => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => save(value),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onBack = () => {\r\n history.goBack()\r\n }\r\n return (\r\n \r\n \r\n {translate.get('UM.SETTING_FACULTY.ADD')}\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyle = makeStyles((theme) => ({\r\n container: {\r\n width: '100%',\r\n },\r\n paper: {\r\n width: '100%',\r\n padding: '20px',\r\n\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'unset',\r\n boxShadow: 'unset',\r\n margin: '0px',\r\n },\r\n },\r\n}))\r\n\r\nexport default SettingFacultyAdd\r\n","import { useState, useEffect } from 'react'\r\nimport useCallApi from '../../../utilities/axios'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\ntype Lookup = {\r\n id: number\r\n name_th: string\r\n name_en: string\r\n}\r\nexport type OptType = {\r\n label: string\r\n value: string\r\n}\r\n\r\ntype Resulttype = {\r\n id: number\r\n name_en: string\r\n name_th: string\r\n}\r\ntype responseType = {\r\n message: string\r\n status: number\r\n result: Resulttype[]\r\n}\r\n\r\nconst useIRBType = () => {\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const callApi = useCallApi()\r\n\r\n const [irbTypeList, setIRBTypeList] = useState([])\r\n\r\n useEffect(() => {\r\n getLookup()\r\n }, [])\r\n\r\n const getLookup = async () => {\r\n try {\r\n const { data } = await callApi.axiosGet({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/irbType`,\r\n })\r\n const lookup = data.result.map((itm) => {\r\n const container: OptType = {\r\n ['label']: lang === 'en' ? itm.name_en : itm.name_th,\r\n ['value']: itm.id.toString(),\r\n }\r\n\r\n return container\r\n })\r\n\r\n setIRBTypeList(lookup)\r\n } catch (error) {\r\n console.log('error', error)\r\n }\r\n }\r\n\r\n return { irbTypeList }\r\n}\r\n\r\nexport default useIRBType\r\n","import { Button, Grid } from '@material-ui/core'\r\nimport Select from '../../../control/select/select'\r\nimport { makeStyles } from '@material-ui/styles'\r\nimport { FC, MutableRefObject } from 'react'\r\nimport { Form as FinalForm, FormProps as FinalFormProps } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { FormType } from '../../../pages/SettingRECAdd'\r\nimport useIRBType from '../../../services/um/lookups/useIRBType'\r\nimport { validateEmail, validateEN, validatePhone } from '../../../utilities/validate'\r\nimport { FormApi } from 'final-form'\r\n\r\ninterface FormProps {\r\n onRefForm?: (form: FormApi>) => void\r\n onClickBack: () => void\r\n initialValues?: FormType\r\n onSubmit: (values: FormType) => void\r\n onChangeREC?: (recID: number) => void\r\n}\r\nconst Form: FC = ({ onRefForm, onClickBack, initialValues, onSubmit, onChangeREC }) => {\r\n const classes = useStyle()\r\n const translate = useTranslate()\r\n const { irbTypeList } = useIRBType()\r\n\r\n const onChangeHomePhone = (form: FormApi>, val: string) => {\r\n if (val) {\r\n let result = ''\r\n const phoneNumber = val.replace(/[^\\d]/g, '')\r\n if (phoneNumber.slice(0, 2) === '02') {\r\n // 02-123-4567\r\n if (phoneNumber.length < 3) {\r\n result = phoneNumber\r\n } else if (phoneNumber.length < 6) {\r\n result = `${phoneNumber.slice(0, 2)}-${phoneNumber.slice(2)}`\r\n } else {\r\n result = `${phoneNumber.slice(0, 2)}-${phoneNumber.slice(2, 5)}-${phoneNumber.slice(5, 9)}`\r\n }\r\n } else {\r\n // 034-123-456\r\n if (phoneNumber.length < 4) {\r\n result = phoneNumber\r\n } else if (phoneNumber.length < 7) {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3)}`\r\n } else {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3, 6)}-${phoneNumber.slice(6, 9)}`\r\n }\r\n }\r\n form.change('telephone', result)\r\n }\r\n }\r\n\r\n return (\r\n \r\n {({ handleSubmit, form, values }) => {\r\n if (onRefForm) onRefForm(form)\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n onChangeHomePhone(form, val)\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {\r\n if (onChangeREC) onChangeREC(Number(val) ?? null)\r\n }}\r\n />\r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport default Form\r\nconst useStyle = makeStyles(() => ({\r\n container: {\r\n width: '100%',\r\n },\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n },\r\n saveButton: {\r\n border: 'solid 1px #db5f8e',\r\n boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)',\r\n },\r\n buttonSection: {\r\n marginTop: '15px',\r\n },\r\n}))\r\n","import { useState, useEffect, useCallback } from 'react'\r\nimport useAuthenStore from '../../stores/authen/authenStore'\r\n\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nexport type Keyword = {\r\n userID: number\r\n}\r\n\r\nexport type SettingRECListType = {\r\n id: number\r\n name: Translation\r\n rec: {\r\n id: number\r\n name: Translation\r\n }\r\n}\r\n\r\nexport type PostSettingRECType = {\r\n userID: number\r\n nameTH: string | null\r\n nameEN: string | null\r\n recID: string | null\r\n addressTH: string | null\r\n addressEN: string | null\r\n telephone: string | null\r\n email: string | null\r\n headerCertificateEN: string | null\r\n headerCertificateTH: string | null\r\n headerMemorandumEN: string | null\r\n headerMemorandumTH: string | null\r\n organizationEN: string | null\r\n organizationTH: string | null\r\n}\r\n\r\ntype Translation = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport type Order = 'desc' | 'asc'\r\n\r\nexport type FormType = {\r\n nameTH: string | null\r\n nameEN: string | null\r\n recID: string | null\r\n addressTH: string | null\r\n addressEN: string | null\r\n telephone: string | null\r\n email: string | null\r\n\r\n headerCertificateEN: string | null\r\n headerCertificateTH: string | null\r\n headerMemorandumEN: string | null\r\n headerMemorandumTH: string | null\r\n organizationEN: string | null\r\n organizationTH: string | null\r\n}\r\n\r\nexport const useSettingREC = (id?: number) => {\r\n const [settingREC, setSettingREC] = useState()\r\n\r\n const callApi = useCallApi()\r\n\r\n useEffect(() => {\r\n id && getSettingRECByID(id)\r\n }, [])\r\n\r\n const getSettingREC = useCallback(async (values: Keyword) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/setting/rec/search?userID=${values.userID}`,\r\n })\r\n\r\n return data\r\n }, [])\r\n\r\n const potSettingREC = async (values: PostSettingRECType) => {\r\n const { data } = await callApi.axiosPost({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/setting/rec`,\r\n params: values,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getSettingRECByID = async (id: number) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/setting/rec/${id}`,\r\n })\r\n setSettingREC(data)\r\n return data\r\n }\r\n\r\n const putSettingREC = async (id: number, values: PostSettingRECType) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/setting/rec/${id}`,\r\n params: values,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getMasterRECByID = async (recID: number) => {\r\n //ดึงข้อมูลของ REC หลัง 1 หรอ 2\r\n const { data } = await callApi.axiosGet({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/setting/masterREC/${recID}`,\r\n })\r\n\r\n return data\r\n }\r\n\r\n return {\r\n getSettingREC,\r\n potSettingREC,\r\n getSettingRECByID,\r\n settingREC,\r\n putSettingREC,\r\n getMasterRECByID,\r\n }\r\n}\r\n","import { Container, Grid, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport { FC, useEffect, useState, useRef } from 'react'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport Form from '../component/um/settingREC/form'\r\nimport { useHistory } from 'react-router-dom'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\n\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport { useSettingREC, PostSettingRECType } from '../services/um/useSettingREC'\r\nimport usePreferanceProfile, { FormProps } from '../services/um/usePreferenceProfile'\r\nimport { FormApi } from 'final-form'\r\n\r\ninterface SettingRECAddProps {}\r\nexport type FormType = {\r\n nameTH: string | null\r\n nameEN: string | null\r\n recID: string | null\r\n addressTH: string | null\r\n addressEN: string | null\r\n telephone: string | null\r\n email: string | null\r\n\r\n headerCertificateEN: string | null\r\n headerCertificateTH: string | null\r\n headerMemorandumEN: string | null\r\n headerMemorandumTH: string | null\r\n organizationEN: string | null\r\n organizationTH: string | null\r\n}\r\n\r\nconst SettingRECAdd: FC = ({}) => {\r\n const classes = useStyle()\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const authenStore = useAuthenStore()\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n const refForm = useRef>>()\r\n const { potSettingREC, getMasterRECByID } = useSettingREC()\r\n\r\n let initialValues: FormType = {\r\n nameTH: null,\r\n nameEN: null,\r\n recID: null,\r\n addressTH: null,\r\n addressEN: null,\r\n telephone: null,\r\n email: null,\r\n\r\n headerCertificateEN: null,\r\n headerCertificateTH: null,\r\n headerMemorandumEN: null,\r\n headerMemorandumTH: null,\r\n organizationEN: null,\r\n organizationTH: null,\r\n }\r\n\r\n const onSubmit = async (value: FormType) => {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTINGREC.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTINGREC.MESSAGE.CONFIRM')}`,\r\n type: 'alert-confirm',\r\n onClickConfirm: () => onSave(value),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onSave = async (value: FormType) => {\r\n let values = {\r\n nameTH: value.nameTH || null,\r\n nameEN: value.nameEN || null,\r\n recID: String(value.recID) || null,\r\n userID: authenStore.profile.userId ?? 0,\r\n addressTH: value?.addressTH || null,\r\n addressEN: value?.addressEN || null,\r\n telephone: value?.telephone || null,\r\n email: value?.email || null,\r\n\r\n headerCertificateEN: value?.headerCertificateEN || null,\r\n headerCertificateTH: value?.headerCertificateTH || null,\r\n headerMemorandumEN: value?.headerMemorandumEN || null,\r\n headerMemorandumTH: value?.headerMemorandumTH || null,\r\n organizationEN: value?.organizationEN || null,\r\n organizationTH: value?.organizationTH || null,\r\n }\r\n\r\n const data = await potSettingREC(values)\r\n\r\n if (data.message === 'duplicated') {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTINGREC.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTINGREC.MESSAGE.DUPLICATED')}`,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n if (data.id) {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTINGREC.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTINGREC.MESSAGE.SUCCESS')}`,\r\n type: 'alert-message',\r\n onAfterClose: () => history.push('/settingREC'),\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const onChangeREC = async (recID: number) => {\r\n if (recID) {\r\n const res = await getMasterRECByID(recID)\r\n if (refForm.current) {\r\n //Allows batch updates by silencing notifications while the fn is running.\r\n refForm.current.batch(() => {\r\n refForm.current?.change('headerCertificateEN', res?.headerCertificateEN ?? null)\r\n refForm.current?.change('headerCertificateTH', res?.headerCertificateTH ?? null)\r\n refForm.current?.change('headerMemorandumEN', res?.headerMemorandumEN ?? null)\r\n refForm.current?.change('headerMemorandumTH', res?.headerMemorandumTH ?? null)\r\n refForm.current?.change('organizationEN', res?.organizationEN ?? null)\r\n refForm.current?.change('organizationTH', res?.organizationTH ?? null)\r\n })\r\n }\r\n }\r\n }\r\n\r\n const onBack = () => {\r\n history.goBack()\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const onRefForm = (form: FormApi>) => {\r\n refForm.current = form\r\n }\r\n\r\n return (\r\n \r\n \r\n {translate.get('UM.SETTINGREC.ADD.HEADER')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\nexport default SettingRECAdd\r\nconst useStyle = makeStyles((theme) => ({\r\n container: {\r\n width: '100%',\r\n },\r\n paper: {\r\n width: '100%',\r\n padding: '20px',\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'unset',\r\n boxShadow: 'unset',\r\n margin: '0px',\r\n },\r\n },\r\n}))\r\n","import { Container, Grid, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport { FC, useRef, useState } from 'react'\r\nimport { useParams } from 'react-router-dom'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport Form from '../component/um/settingREC/form'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { useSettingREC } from '../services/um/useSettingREC'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\n\r\ninterface SettingRECEditProps {}\r\nexport type FormType = {\r\n nameTH: string | null\r\n nameEN: string | null\r\n recID: string | null\r\n addressTH: string | null\r\n addressEN: string | null\r\n telephone: string | null\r\n email: string | null\r\n\r\n headerCertificateEN: string | null\r\n headerCertificateTH: string | null\r\n headerMemorandumEN: string | null\r\n headerMemorandumTH: string | null\r\n organizationEN: string | null\r\n organizationTH: string | null\r\n}\r\nconst SettingRECEdit: FC = ({}) => {\r\n const classes = useStyle()\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const authenStore = useAuthenStore()\r\n const params = useParams<{ id: string }>()\r\n const { settingREC, putSettingREC } = useSettingREC(Number(params.id))\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n\r\n let initialValues: FormType = {\r\n nameTH: settingREC?.nameTH || null,\r\n nameEN: settingREC?.nameEN || null,\r\n recID: String(settingREC?.recID) || null,\r\n addressTH: settingREC?.addressTH || null,\r\n addressEN: settingREC?.addressEN || null,\r\n telephone: settingREC?.telephone || null,\r\n email: settingREC?.email || null,\r\n\r\n headerCertificateEN: settingREC?.headerCertificateEN || null,\r\n headerCertificateTH: settingREC?.headerCertificateTH || null,\r\n headerMemorandumEN: settingREC?.headerMemorandumEN || null,\r\n headerMemorandumTH: settingREC?.headerMemorandumTH || null,\r\n organizationEN: settingREC?.organizationEN || null,\r\n organizationTH: settingREC?.organizationTH || null,\r\n }\r\n\r\n const onSubmit = (value: FormType) => {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTINGREC.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTINGREC.MESSAGE.CONFIRM')}`,\r\n type: 'alert-confirm',\r\n onClickConfirm: () => onSave(value),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onSave = async (value: FormType) => {\r\n let values = {\r\n nameTH: value.nameTH || null,\r\n nameEN: value.nameEN || null,\r\n recID: value.recID || null,\r\n userID: authenStore.profile.userId ?? 0,\r\n addressTH: value?.addressTH || null,\r\n addressEN: value?.addressEN || null,\r\n telephone: value?.telephone || null,\r\n email: value?.email || null,\r\n\r\n headerCertificateEN: value?.headerCertificateEN || null,\r\n headerCertificateTH: value?.headerCertificateTH || null,\r\n headerMemorandumEN: value?.headerMemorandumEN || null,\r\n headerMemorandumTH: value?.headerMemorandumTH || null,\r\n organizationEN: value?.organizationEN || null,\r\n organizationTH: value?.organizationTH || null,\r\n }\r\n\r\n const data = await putSettingREC(Number(params.id), values)\r\n\r\n if (data.message === 'duplicated') {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTINGREC.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTINGREC.MESSAGE.DUPLICATED')}`,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n if (data.message === 'success') {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTINGREC.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTINGREC.MESSAGE.SUCCESS')}`,\r\n type: 'alert-message',\r\n onAfterClose: () => history.push('/settingREC'),\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const onBack = () => {\r\n history.goBack()\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n return (\r\n \r\n \r\n {translate.get('UM.SETTINGREC.EDIT.HEADER')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\nexport default SettingRECEdit\r\n\r\nconst useStyle = makeStyles((theme) => ({\r\n container: {\r\n width: '100%',\r\n },\r\n paper: {\r\n width: '100%',\r\n padding: '20px',\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'unset',\r\n boxShadow: 'unset',\r\n margin: '0px',\r\n },\r\n },\r\n}))\r\n","import { Grid, makeStyles, Typography, Paper } from '@material-ui/core'\r\nimport Button from '../../../control/button/button'\r\nimport { FC } from 'react'\r\nimport { Form } from 'react-final-form'\r\nimport Select from '../../../control/select/select'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { SettingDocumentSearchform } from '../../../pages/SettingDocument'\r\nimport useIRB from '../../../services/um/lookups/useIRB'\r\nimport useProjectStatus from '../../../services/um/lookups/useProjectStatus'\r\nimport MultiSelect from '../../../control/multiSelect/multiSelect'\r\n\r\ntype PanelProps = {\r\n onSubmit: (values: SettingDocumentSearchform) => void\r\n initialValue: SettingDocumentSearchform\r\n onReset: (form: any) => void\r\n}\r\n\r\nconst Panel: FC = ({ onSubmit, initialValue, onReset }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const { projectStatus } = useProjectStatus()\r\n const { irb } = useIRB()\r\n const defaultREC = initialValue.rec ? [initialValue.rec.toString()] : []\r\n const defaultSubmittedType = initialValue.submittedType ? [initialValue.submittedType] : []\r\n\r\n return (\r\n \r\n {({ handleSubmit, form }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n form.reset()\r\n onReset(form)\r\n }}\r\n className={classes.btnSearch}\r\n >\r\n {translate.get('BUTTON.RESET')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport default Panel\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n reset: {\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n padding: '0px 1.5rem',\r\n alignSelf: 'center',\r\n },\r\n root: {\r\n padding: '15px',\r\n },\r\n btnSearch: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n },\r\n}))\r\n","import * as umServiceURL from './umServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\n\r\n//search document\r\nexport type SearchDocumentRequest = {\r\n userID: number\r\n recID: number | null\r\n submittedTypeID?: string | null\r\n}\r\n\r\nexport type SearchDocumentResponse = {\r\n documentID: number\r\n name: Translation\r\n shortName: Translation\r\n code: string\r\n no: number\r\n rec: {\r\n id: number\r\n name: Translation\r\n }\r\n order: number\r\n documentRequire: boolean\r\n}\r\n\r\ntype Translation = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport type Order = 'desc' | 'asc'\r\n\r\n//update document\r\nexport type UpdateDocumentRequest = {\r\n nameTH: string | null\r\n nameEN: string | null\r\n shortNameTH: string | null\r\n shortNameEN: string | null\r\n code: string | null\r\n submittedTypeID: string[] | null\r\n recID: number | null\r\n userID: number\r\n isDisplayDocument: boolean | null\r\n documentInfo: UplodeFileDocType[]\r\n}\r\n\r\nexport type UpdateDocumentResponse = {\r\n message: string\r\n status?: number\r\n}\r\n\r\n//get document id\r\nexport type GetDocumentRequest = {\r\n documentID: number\r\n}\r\n\r\nexport type GetDocumentResponse = {\r\n documentID?: number | null\r\n nameTH: string | null\r\n nameEN: string | null\r\n shortNameTH: string | null\r\n shortNameEN: string | null\r\n code: string | null\r\n submittedTypeID: string[] | null\r\n isDisplayDocument: boolean | null\r\n documentInfo: UplodeFileDocType[]\r\n}\r\n\r\nexport type AddDocumentRequest = {\r\n nameTH: string | null\r\n nameEN: string | null\r\n shortNameTH: string | null\r\n shortNameEN: string | null\r\n code: string | null\r\n submittedTypeID: string[] | null\r\n recID: number | null\r\n userID: number | null\r\n isDisplayDocument: boolean | null\r\n documentInfo: UplodeFileDocType[]\r\n}\r\n\r\nexport type AddDocumentResponse = {\r\n message: string\r\n status?: number\r\n}\r\n\r\nexport type FileList = {\r\n documentTopicID: number | null\r\n fileID: string | null\r\n fileToken: string | null\r\n filename: string | null\r\n}\r\n\r\nexport type UplodeFileDocType = {\r\n uploadFileObj?: {\r\n documentTopicID: number | null\r\n fileList: FileList[]\r\n }\r\n}\r\n\r\nexport type DocumentResponseSearch = {\r\n data: SearchDocumentResponse[]\r\n total: number\r\n}\r\n\r\nexport const useSettingDocument = () => {\r\n const callApi = useCallApi()\r\n\r\n const getSearchSettingDocument = async (values: SearchDocumentRequest) => {\r\n const url = new URL(umServiceURL.getSearchSettingDocument)\r\n url.searchParams.set('userID', values?.userID.toString())\r\n values?.recID && url.searchParams.set('recID', values.recID.toString())\r\n // url.searchParams.set('userID', '1')\r\n // values?.recID && url.searchParams.set('recID', '2')\r\n values?.submittedTypeID && url.searchParams.set('submittedTypeID', String(values.submittedTypeID))\r\n const { data } = await callApi.axiosGet({\r\n url: url,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const putEditSettingDocument = async (values: UpdateDocumentRequest, documentID: number) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServiceURL.getSettingDocument}${documentID}`,\r\n params: values,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const postSettingDocument = async (values: AddDocumentRequest) => {\r\n const { data } = await callApi.axiosPost({\r\n url: `${umServiceURL.postSettingDocument}`,\r\n params: { ...values },\r\n })\r\n\r\n return data\r\n }\r\n\r\n const getSettingDocument = async (values: GetDocumentRequest) => {\r\n const url = new URL(umServiceURL.getSettingDocument)\r\n url.searchParams.set('documentID', `${values.documentID}`)\r\n const { data } = await callApi.axiosGet({\r\n url: `${umServiceURL.getSettingDocument}${values.documentID}`,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const putOrderSettingDocument = async (values: number[], userID: number, submittedType: string | null) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServiceURL.putOrderSettingDocument}${submittedType}`,\r\n params: { listID: values },\r\n })\r\n\r\n return data\r\n }\r\n\r\n const postDocRequire = async (values: { documentID: number; order: number }) => {\r\n const { data } = await callApi.axiosPost({\r\n url: `${umServiceURL.docRequire}`,\r\n params: { ...values },\r\n })\r\n\r\n return data\r\n }\r\n\r\n return {\r\n getSearchSettingDocument,\r\n putEditSettingDocument,\r\n getSettingDocument,\r\n postSettingDocument,\r\n putOrderSettingDocument,\r\n postDocRequire,\r\n }\r\n}\r\n","import { Grid, Typography, makeStyles } from '@material-ui/core'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { useHistory, useLocation } from 'react-router-dom'\r\nimport { ButtonView } from '../../../control/button/button'\r\nimport Switch from '@material-ui/core/Switch'\r\nimport { useSettingDocument, SearchDocumentRequest } from '../../../services/um/useSettingDocument'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\n\r\ntype OrderProps = {\r\n index: number\r\n documentID: number\r\n nameTH: string\r\n nameEN: string\r\n shortNameTH: string\r\n shortNameEN: string\r\n code: string\r\n order: number\r\n docRequire: boolean\r\n reLoadData?: (param: SearchDocumentRequest) => void\r\n}\r\n\r\nconst Order = ({\r\n index,\r\n documentID,\r\n nameTH,\r\n nameEN,\r\n shortNameTH,\r\n shortNameEN,\r\n code,\r\n order,\r\n docRequire,\r\n reLoadData,\r\n}: OrderProps) => {\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const location = useLocation()\r\n\r\n const classes = useStyles()\r\n const { postDocRequire } = useSettingDocument()\r\n const authenStore = useAuthenStore()\r\n\r\n const onEdit = () => {\r\n history.push(`/settingDocument/${documentID}/edit`)\r\n }\r\n\r\n const onChangeDocRequire = async (props: any) => {\r\n const result = await postDocRequire({ documentID: documentID, order: order })\r\n\r\n if (result.status == 1) {\r\n const URL = new URLSearchParams(location.search)\r\n const submittedType = URL.get('submittedType')\r\n\r\n let param: SearchDocumentRequest = {\r\n userID: authenStore.profile.userId ?? 0,\r\n recID: authenStore.profile.irb,\r\n submittedTypeID: submittedType ? submittedType : '1',\r\n }\r\n\r\n reLoadData && reLoadData(param)\r\n }\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {translate.get('BUTTON.EDIT')}\r\n \r\n \r\n\r\n \r\n \r\n {translate.get('UM.SETTINGDOCUMENT.TABLE.no')}\r\n \r\n \r\n {`${order}`}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.SETTINGDOCUMENT.TABLE.nameTH')}\r\n \r\n \r\n \r\n {nameTH ?? '-'}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.SETTINGDOCUMENT.TABLE.nameEN')}\r\n \r\n \r\n \r\n {nameEN ?? '-'}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.SETTINGDOCUMENT.TABLE.code')}\r\n \r\n \r\n \r\n {code ?? '-'}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.SETTINGDOCUMENT.TABLE.docRequire')}\r\n \r\n \r\n \r\n \r\n onChangeDocRequire(docRequire)} />\r\n \r\n \r\n \r\n \r\n
\r\n )\r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n item: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n position: 'relative',\r\n },\r\n icon: {\r\n marginRight: theme.spacing(1),\r\n width: 40,\r\n height: 40,\r\n backgroundColor: '#ece9e9',\r\n transition: '0.3s',\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n },\r\n name: {\r\n fontWeight: 'bold',\r\n },\r\n btnEdit: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n height: '44px',\r\n marginRight: '1px',\r\n },\r\n multiLineEllipsis: {\r\n maxWidth: '100%',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n display: '-webkit-box',\r\n '-webkit-line-clamp': 1,\r\n '-webkit-box-orient': 'vertical',\r\n },\r\n}))\r\n\r\nexport default Order\r\n","import { Grid, makeStyles } from '@material-ui/core'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { Draggable, DraggingStyle, NotDraggingStyle } from 'react-beautiful-dnd'\r\nimport Order from './Order'\r\nimport { SearchDocumentRequest, SearchDocumentResponse } from '../../../services/um/useSettingDocument'\r\n\r\nconst getItemStyle = (\r\n isDragging: boolean,\r\n draggableStyle: DraggingStyle | NotDraggingStyle | undefined,\r\n): React.CSSProperties => ({\r\n userSelect: 'none',\r\n padding: '24px',\r\n margin: '0 0 16px 0',\r\n\r\n // dragging\r\n backgroundColor: '#fff',\r\n border: isDragging ? '1px solid #db5f8e' : '1px solid #bdbdbd',\r\n borderRadius: '4px',\r\n\r\n ...draggableStyle,\r\n})\r\n\r\ntype FiledDraggableProps = {\r\n dataList: SearchDocumentResponse[]\r\n isDragDisabled: boolean\r\n reLoadData?: (param: SearchDocumentRequest) => void\r\n}\r\n\r\nconst FiledDraggable = ({ dataList, isDragDisabled, reLoadData }: FiledDraggableProps) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n\r\n return (\r\n \r\n {dataList.length > 0 &&\r\n dataList.map((item: SearchDocumentResponse, index: number) => {\r\n return (\r\n \r\n \r\n {(provided, snapshot): JSX.Element => (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100% !important',\r\n '&:hover': { border: '1px solid #db5f8e !important' },\r\n },\r\n}))\r\n\r\nexport default FiledDraggable\r\n","import React from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport { DragDropContext, Droppable, DropResult } from 'react-beautiful-dnd'\r\nimport { Button, Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport FiledDraggable from './FiledDraggable'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport {\r\n DocumentResponseSearch,\r\n SearchDocumentRequest,\r\n SearchDocumentResponse,\r\n} from '../../../services/um/useSettingDocument'\r\nimport { DocumentType } from '../../../pages/SettingDocument'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../router/routesConfig'\r\nimport AddIcon from '@material-ui/icons/Add'\r\n\r\nconst getListStyle = (isDraggingOver: boolean): React.CSSProperties => ({\r\n margin: '16px 0px',\r\n width: '100%',\r\n})\r\n\r\ntype DraggablesProps = {\r\n handleOrder: (value: DocumentType) => void\r\n isDragDisabled: boolean\r\n handleOrderNumberMode: () => void\r\n dataList?: DocumentResponseSearch\r\n isExpanded?: boolean\r\n reLoadData?: (param: SearchDocumentRequest) => void\r\n}\r\n\r\nconst Draggables = ({\r\n handleOrder,\r\n isDragDisabled,\r\n handleOrderNumberMode,\r\n dataList,\r\n isExpanded,\r\n reLoadData,\r\n}: DraggablesProps): JSX.Element => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n\r\n const onDragEnd = (fields: any, form: any) => (result: DropResult) => {\r\n if (!result.destination) {\r\n return\r\n }\r\n const items: SearchDocumentResponse[] = reorder(fields.value, result.source.index, result.destination.index)\r\n form.change('document', items)\r\n }\r\n\r\n const initialValues = {\r\n document: dataList?.data,\r\n }\r\n\r\n const reorder = (\r\n list: SearchDocumentResponse[],\r\n startIndex: number,\r\n endIndex: number,\r\n ): SearchDocumentResponse[] => {\r\n const result = Array.from(list)\r\n const [removed] = result.splice(startIndex, 1)\r\n result.splice(endIndex, 0, removed)\r\n\r\n return result\r\n }\r\n\r\n const onClickAdd = () => {\r\n history.push({\r\n pathname: RoutePath.settingDocumentAdd,\r\n })\r\n }\r\n\r\n return (\r\n (\r\n
\r\n <>\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${dataList?.total ?? 0}`])}\r\n \r\n \r\n {!isDragDisabled && (\r\n \r\n \r\n \r\n * {translate.get('LABEL.DRAGABLE_LABEL')}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {isDragDisabled ? (\r\n \r\n \r\n \r\n {translate.get('BUTTON.ORDER')}\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n \r\n {\r\n handleOrderNumberMode?.()\r\n return form.reset\r\n }}\r\n // disabled={submitting || pristine}\r\n >\r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n }\r\n onClick={onClickAdd}\r\n >\r\n \r\n {translate.get('UM.SETTINGDOCUMENT.SEARCH.ADDBUTTON')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n {({ fields }) => (\r\n \r\n \r\n {(provided, snapshot): JSX.Element => (\r\n \r\n \r\n {provided.placeholder}\r\n
\r\n )}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n controlFieldArray: {\r\n // height: (props: { isExpanded: boolean }) => {\r\n // if (props.isExpanded) {\r\n // return '420px'\r\n // } else {\r\n // return '630px'\r\n // }\r\n // },\r\n width: '100%',\r\n // overflowY: 'scroll',\r\n overflow: 'auto',\r\n [theme.breakpoints.down('md')]: {\r\n height: 'auto',\r\n },\r\n marginTop: '-15px',\r\n },\r\n\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n },\r\n}))\r\n\r\nexport default Draggables\r\n","import { Container, Grid, Typography, makeStyles } from '@material-ui/core'\r\n\r\nimport { FC, useEffect, useState, useRef } from 'react'\r\nimport Panel from '../component/um/settingDocument/Panel'\r\nimport useTranslate from '../i18n/useTranslate'\r\n\r\nimport {\r\n DocumentResponseSearch,\r\n SearchDocumentRequest,\r\n SearchDocumentResponse,\r\n useSettingDocument,\r\n} from '../services/um/useSettingDocument'\r\n\r\nimport useLoadingStore from '../control/loading/store/useLoadingStore'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport { useQueryParam } from 'use-query-params'\r\nimport { FormApi } from 'final-form'\r\n\r\nimport Draggables from '../component/um/settingDocument/Draggables'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\n\r\ninterface SettingDocumentProps {}\r\n\r\nexport type DocumentType = {\r\n document: SearchDocumentResponse[]\r\n}\r\n\r\nexport type SettingDocumentSearchform = {\r\n rec: number | null\r\n submittedType: string | null\r\n}\r\nconst SettingDocument: FC = ({}) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const loadingStore = useLoadingStore()\r\n const authenStore = useAuthenStore()\r\n const [dataList, setDataList] = useState({ data: [], total: 0 })\r\n const { getSearchSettingDocument, putOrderSettingDocument } = useSettingDocument()\r\n const [rec, setRec] = useQueryParam('rec')\r\n const [submittedType, setSubmittedType] = useQueryParam('submittedType')\r\n const [isDragDisabled, setIsDragDisabled] = useState(true)\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n\r\n const [initialValue, setInitialValue] = useState({\r\n rec: (authenStore.profile.irb || rec) ?? null,\r\n submittedType: submittedType ?? '1',\r\n })\r\n\r\n useEffect(() => {\r\n if (authenStore.profile.userId) {\r\n setRec(authenStore.profile.irb)\r\n setSubmittedType(submittedType ? submittedType : '1')\r\n initialLoad()\r\n }\r\n }, [authenStore.profile.userId])\r\n\r\n const initialLoad = async () => {\r\n let param: SearchDocumentRequest = {\r\n userID: authenStore.profile.userId ?? 0,\r\n recID: authenStore.profile.irb,\r\n submittedTypeID: submittedType ? submittedType : '1',\r\n }\r\n loadData(param)\r\n }\r\n\r\n const onSubmit = (values: SettingDocumentSearchform) => {\r\n let param: SearchDocumentRequest = {\r\n userID: authenStore.profile.userId ?? 0,\r\n recID: rec,\r\n submittedTypeID: values.submittedType ?? null,\r\n }\r\n loadData(param)\r\n setSearchParam(values)\r\n setInitialValue(values)\r\n }\r\n\r\n const loadData = async (param: SearchDocumentRequest) => {\r\n const result = await getSearchSettingDocument(param)\r\n setDataList(result)\r\n }\r\n\r\n const setSearchParam = (value: SettingDocumentSearchform) => {\r\n setRec(value.rec)\r\n setSubmittedType(value.submittedType ? value.submittedType.toString() : null)\r\n }\r\n\r\n const onReset = (form: FormApi>) => {\r\n let param = {\r\n rec: rec,\r\n submittedType: '1',\r\n }\r\n form.initialize(param)\r\n setInitialValue(param)\r\n loadData({ userID: authenStore.profile.userId ?? 0, recID: rec, submittedTypeID: '1' })\r\n }\r\n\r\n const handleOrderNumberMode = () => {\r\n setIsDragDisabled(!isDragDisabled)\r\n initialLoad()\r\n }\r\n\r\n const handleOrder = (value: DocumentType) => {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTINGDOCUMENT.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTINGDOCUMENT.MESSAGE.CONFIRM')}`,\r\n type: 'alert-confirm',\r\n onClickConfirm: () => onSave(value),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onSave = async (value: DocumentType) => {\r\n let params = value.document.map((item) => item.documentID)\r\n const result = await putOrderSettingDocument(params, authenStore.profile.userId ?? 0, submittedType ?? null)\r\n\r\n if (result.message === 'success') {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTINGDOCUMENT.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTINGDOCUMENT.MESSAGE.SUCCESS')}`,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n handleOrderNumberMode()\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n {!loadingStore.isLoading && dataList.total === 0 && (\r\n \r\n {translate.get('LABEL.NO_DATA_FOUND')}\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport default SettingDocument\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n textResult: {\r\n margin: '8px 0',\r\n },\r\n\r\n buttonSection: {\r\n marginTop: '10px',\r\n marginBottom: '10px',\r\n },\r\n select: {\r\n height: 40,\r\n },\r\n sorting: {\r\n marginLeft: '5px',\r\n },\r\n}))\r\n","import { useState, useEffect } from 'react'\r\nimport useCallApi from '../../../utilities/axios'\r\nimport * as umServinceURL from '../umServiceURL'\r\n\r\ntype Lookup = {\r\n value: string\r\n label: {\r\n th: string\r\n en: string\r\n }\r\n}\r\n\r\nconst useSort = () => {\r\n const callApi = useCallApi()\r\n const [sorts, setSort] = useState([\r\n {\r\n value: 'desc',\r\n label: {\r\n th: 'ล่าสุด',\r\n en: 'descending ',\r\n },\r\n },\r\n {\r\n value: 'asc',\r\n label: {\r\n th: 'เก่าสุด',\r\n en: 'ascending',\r\n },\r\n },\r\n ])\r\n\r\n // useEffect(() => {\r\n // getLookup()\r\n // }, [])\r\n\r\n // const getLookup = async () => {\r\n // try {\r\n // const { data } = await callApi.axiosGet({\r\n // url: `${process.env.REACT_APP_CU_IRB_API_URL}/lookups/userStatus`,\r\n // })\r\n // setstatusList(data.result)\r\n // } catch (error) {\r\n // console.log('error', error)\r\n // }\r\n // }\r\n\r\n return { sorts: sorts }\r\n}\r\n\r\nexport default useSort\r\n","import { useHistory } from 'react-router-dom'\r\n\r\nimport { makeStyles, Paper } from '@material-ui/core'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { ButtonView } from '../../../control/button/button'\r\n\r\ninterface Props {\r\n id: number\r\n nameTH: string\r\n nameEN: string\r\n recName: string\r\n}\r\n\r\nconst Item: React.FC = ({ id, nameTH, nameEN, recName }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const history = useHistory()\r\n\r\n const onEdit = () => {\r\n history.push(`/settingREC/${id}/edit`)\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.EDIT')}\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.SETTINGREC.SEARCH.NAMETH')}\r\n \r\n \r\n \r\n {nameTH}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.SETTINGREC.SEARCH.NAMEEN')}\r\n \r\n \r\n \r\n {nameEN}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.SETTINGREC.SEARCH.RECNAME')}\r\n \r\n \r\n \r\n {recName}\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paperSection: {\r\n alignItems: 'center',\r\n padding: theme.spacing(3),\r\n marginBottom: '10px',\r\n transition: '0.3s',\r\n '&:hover': {\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n },\r\n icon: {\r\n marginRight: theme.spacing(1),\r\n width: 40,\r\n height: 40,\r\n backgroundColor: '#ece9e9',\r\n transition: '0.3s',\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n },\r\n name: {\r\n // marginLeft: theme.spacing(1),\r\n fontWeight: 'bold',\r\n },\r\n btnEdit: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n height: '44px',\r\n marginRight: '1px',\r\n },\r\n multiLineEllipsis: {\r\n maxWidth: '100%',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n display: '-webkit-box',\r\n '-webkit-line-clamp': 1,\r\n '-webkit-box-orient': 'vertical',\r\n },\r\n}))\r\n\r\nexport default Item\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport Grid from '@material-ui/core/Grid'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\ninterface Props {\r\n isEmpty: boolean\r\n}\r\n\r\nconst EmptyData: React.FC = ({ children, isEmpty }) => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n\r\n return isEmpty ? (\r\n \r\n {translate.get('UM.USERGROUP.EMPTY-CONTENT')}\r\n \r\n ) : (\r\n <>{children}\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n empty: {\r\n padding: theme.spacing(1),\r\n height: '100%',\r\n // borderRadius: 4,\r\n // border: '1px solid #bdbdbd',\r\n },\r\n}))\r\n\r\nexport default EmptyData\r\n","import { useHistory } from 'react-router-dom'\r\nimport { Grid } from '@material-ui/core'\r\nimport { makeStyles, Typography, Button, Select, MenuItem } from '@material-ui/core'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport AddIcon from '@material-ui/icons/Add'\r\nimport useSort from '../../../services/um/lookups/useSort'\r\nimport { Order, SettingRECListType } from '../../../services/um/useSettingREC'\r\nimport isEmpty from 'lodash/isEmpty'\r\nimport Item from './Item'\r\nimport EmptyData from './EmptyData'\r\n\r\ninterface ResultProps {\r\n onSort: (value: any) => void\r\n order: Order\r\n dataList: SettingRECListType[]\r\n}\r\n\r\nconst Result = ({ onSort, order, dataList }: ResultProps) => {\r\n const translate = useTranslate()\r\n const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n const history = useHistory()\r\n const classes = useStyles()\r\n const { sorts } = useSort()\r\n\r\n const handleChange = (event: React.ChangeEvent<{ value: any }>) => {\r\n onSort(event.target.value)\r\n }\r\n\r\n const GotoAddOfficer = () => {\r\n history.push('/settingREC/Add')\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${dataList.length}`])}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n {translate.get('UM.SETTING_FACULTY.ADD')}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {dataList.map((item) => (\r\n \r\n ))}\r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nexport default Result\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n margin: theme.spacing(2, 0),\r\n },\r\n typo: {\r\n fontWeight: 'bold',\r\n },\r\n sorting: {\r\n margin: theme.spacing(2, 0),\r\n },\r\n}))\r\n","import { useEffect, useState } from 'react'\r\nimport { Container, Grid, Typography } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/styles'\r\nimport orderBy from 'lodash/orderBy'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport Result from '../component/um/settingREC/Result'\r\nimport { useSettingREC, Order, SettingRECListType } from '../services/um/useSettingREC'\r\n\r\nconst SettingREC = () => {\r\n const authenStore = useAuthenStore()\r\n const [order, setOrder] = useState('desc')\r\n const { getSettingREC } = useSettingREC()\r\n const [dataList, setDataList] = useState([])\r\n const translate = useTranslate()\r\n\r\n useEffect(() => {\r\n if (authenStore.profile.userId) {\r\n handleGetSettingREC(authenStore.profile.userId)\r\n }\r\n }, [authenStore.profile.userId])\r\n\r\n const handleGetSettingREC = async (userID: number) => {\r\n const result = await getSettingREC({ userID })\r\n setDataList(result)\r\n }\r\n\r\n const onSort = (order: Order) => {\r\n const newDataList = orderBy(dataList, ['name.th', 'name.en'], [order])\r\n setOrder(order)\r\n setDataList(newDataList)\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.SETTINGREC')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default SettingREC\r\n","import { Button, Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { FC, useRef } from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useProjectStatus from '../../../services/um/lookups/useProjectStatus'\r\nimport { GetDocumentResponse, UplodeFileDocType } from '../../../services/um/useSettingDocument'\r\nimport MultiSelect from '../../../control/multiSelect/multiSelect'\r\nimport { ValidationErrors } from 'final-form'\r\nimport Checkbox from '../../../control/checkbox/checkbox'\r\nimport UploadDocFile from '../../web/shareUI/uploadDoc/UploadDocFile'\r\n\r\ntype FormProps = {\r\n initialValues: GetDocumentResponse\r\n onSubmit: (values: any) => void\r\n onClickBack: () => void\r\n initialUploadFile?: UplodeFileDocType[]\r\n topicInitial: { id: number | string; name_th: string; name_en: string }[]\r\n}\r\n\r\nconst Form: FC = ({ onSubmit, initialValues, onClickBack, initialUploadFile, topicInitial }) => {\r\n const classes = useStyle()\r\n const translate = useTranslate()\r\n const { projectStatus } = useProjectStatus()\r\n let defaultSubmittedType = initialValues.submittedTypeID?.map((item) => item.toString()) ?? undefined\r\n const formValuesRef = useRef()\r\n\r\n const validation = (values: GetDocumentResponse) => {\r\n const errors: ValidationErrors = {}\r\n\r\n if (!values.submittedTypeID) {\r\n errors.submittedTypeID = translate.get('MESSAGE.M016')\r\n }\r\n if (values.submittedTypeID && values.submittedTypeID.length < 1) {\r\n errors.submittedTypeID = translate.get('MESSAGE.M016')\r\n }\r\n\r\n return errors\r\n }\r\n return (\r\n \r\n {({ handleSubmit, values }) => {\r\n formValuesRef.current = values\r\n\r\n /*const isHasValue = () => {\r\n let isUploadValueTH: boolean = false\r\n let isUploadValueEN: boolean = false\r\n formValuesRef.current?.documentInfo?.forEach((item, index) => {\r\n if (!index) {\r\n if (item?.uploadFileObj?.fileList[0]?.filename) {\r\n isUploadValueTH = true\r\n }\r\n } else {\r\n if (item?.uploadFileObj?.fileList[0]?.filename) {\r\n isUploadValueEN = true\r\n }\r\n }\r\n })\r\n return isUploadValueTH && isUploadValueEN\r\n }*/\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.UPLOAD_FILES')}\r\n \r\n\r\n \r\n ({translate.get('ALERT.CONTENT.UPLOAD_PDF_WORD_AT_1_FILE_TIMES')})\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport default Form\r\n\r\nconst useStyle = makeStyles((theme) => ({\r\n container: {\r\n margin: '-8px',\r\n },\r\n reset: {\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n padding: '0px 1.5rem',\r\n alignSelf: 'center',\r\n },\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n padding: '1rem 0px',\r\n },\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n },\r\n saveButton: {\r\n border: 'solid 1px #db5f8e',\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n },\r\n uploadTitle: {\r\n color: 'red',\r\n paddingTop: '5px',\r\n paddingLeft: '10px',\r\n },\r\n}))\r\n","import { Container, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport _ from 'lodash'\r\nimport { FC, useEffect, useRef, useState } from 'react'\r\nimport { useHistory } from 'react-router'\r\nimport Form from '../component/um/settingDocument/Form'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport {\r\n GetDocumentResponse,\r\n useSettingDocument,\r\n AddDocumentRequest,\r\n UplodeFileDocType,\r\n} from '../services/um/useSettingDocument'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\n\r\ninterface SettingDocumentAddProps {}\r\n\r\nconst SettingDocumentAdd: FC = ({}) => {\r\n const classes = useStyle()\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const { postSettingDocument } = useSettingDocument()\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n const authenStore = useAuthenStore()\r\n const [initialUploadFile, setInitialUploadFile] = useState()\r\n\r\n const topicInitial = [\r\n {\r\n id: String(_.uniqueId()),\r\n name_th: 'ภาษาไทย',\r\n name_en: 'Thai',\r\n },\r\n {\r\n id: String(_.uniqueId()),\r\n name_th: 'ภาษาอังกฤษ',\r\n name_en: 'English',\r\n },\r\n ]\r\n\r\n const initialUpload = async (initDocumentInfo?: GetDocumentResponse['documentInfo']) => {\r\n let uploadFileInit = topicInitial?.map((itm: any) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: UplodeFileDocType) => {\r\n initDocumentInfo?.forEach((docInfo, index) => {\r\n if (docInfo.uploadFileObj?.documentTopicID === itm.uploadFileObj?.documentTopicID) {\r\n if (!docInfo.uploadFileObj?.fileList.length) {\r\n itm.uploadFileObj?.fileList.push({\r\n ...docInfo.uploadFileObj?.fileList[index],\r\n fileID: `${docInfo.uploadFileObj?.fileList[index].fileID}`,\r\n documentTopicID: docInfo.uploadFileObj?.fileList[index].documentTopicID as number,\r\n fileToken: `${docInfo.uploadFileObj?.fileList[index].fileToken}`,\r\n filename: `${docInfo.uploadFileObj?.fileList[index].filename}`,\r\n })\r\n }\r\n }\r\n })\r\n })\r\n\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n let initialValues: GetDocumentResponse = {\r\n code: null,\r\n submittedTypeID: null,\r\n nameTH: null,\r\n nameEN: null,\r\n shortNameTH: null,\r\n shortNameEN: null,\r\n isDisplayDocument: true,\r\n documentInfo: initialUploadFile,\r\n }\r\n\r\n const onBack = () => {\r\n history.goBack()\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const onSave = async (values: GetDocumentResponse) => {\r\n const param: AddDocumentRequest = {\r\n nameTH: values.nameTH,\r\n nameEN: values.nameEN,\r\n shortNameTH: values.shortNameTH,\r\n shortNameEN: values.shortNameEN,\r\n code: values.code,\r\n submittedTypeID: values.submittedTypeID,\r\n recID: authenStore.profile.irb,\r\n userID: authenStore.profile.userId,\r\n isDisplayDocument: values.isDisplayDocument,\r\n documentInfo: values.documentInfo,\r\n }\r\n\r\n const result = await postSettingDocument(param)\r\n\r\n let optionDialog: any = {\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: onBack,\r\n }\r\n if (result.status !== 1) {\r\n optionDialog = {\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('MESSAGE.M022'),\r\n type: 'alert-message',\r\n }\r\n }\r\n\r\n setConfigDialog(optionDialog)\r\n }\r\n\r\n const handleClickSubmit = async (values: GetDocumentResponse) => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => onSave(values),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n useEffect(() => {\r\n initialUpload()\r\n }, [])\r\n return (\r\n \r\n \r\n {translate.get('UM.SETTINGDOCUMENT.ADD.HEADER')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\nexport default SettingDocumentAdd\r\nconst useStyle = makeStyles((theme) => ({\r\n container: {\r\n width: '100%',\r\n },\r\n paper: {\r\n width: '100%',\r\n padding: '20px',\r\n\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'unset',\r\n boxShadow: 'unset',\r\n margin: '0px',\r\n },\r\n },\r\n}))\r\n","import { Container, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport { FC, useEffect, useRef, useState } from 'react'\r\nimport { useHistory, useParams } from 'react-router-dom'\r\nimport Form from '../component/um/settingDocument/Form'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport {\r\n useSettingDocument,\r\n GetDocumentResponse,\r\n UpdateDocumentRequest,\r\n GetDocumentRequest,\r\n} from '../services/um/useSettingDocument'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\n\r\ninterface SettingDocumentEditProps {}\r\nconst SettingDocumentEdit: FC = ({}) => {\r\n const classes = useStyle()\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const { putEditSettingDocument, getSettingDocument } = useSettingDocument()\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n const [dataList, setDataList] = useState()\r\n const authenStore = useAuthenStore()\r\n const params = useParams<{ id: string }>()\r\n const [initialUploadFile, setInitialUploadFile] = useState()\r\n\r\n const onBack = () => {\r\n history.goBack()\r\n }\r\n\r\n const topicInitial = [\r\n {\r\n id: dataList?.documentID || 0,\r\n name_th: 'ภาษาไทย',\r\n name_en: 'Thai',\r\n },\r\n {\r\n id: dataList?.documentID || 0,\r\n name_th: 'ภาษาอังกฤษ',\r\n name_en: 'English',\r\n },\r\n ]\r\n\r\n const initialUpload = async (initDocumentInfo?: GetDocumentResponse['documentInfo']) => {\r\n setInitialUploadFile(initDocumentInfo)\r\n }\r\n\r\n const initialValue = {\r\n nameTH: dataList?.nameTH ?? null,\r\n nameEN: dataList?.nameEN ?? null,\r\n shortNameTH: dataList?.shortNameTH ?? null,\r\n shortNameEN: dataList?.shortNameEN ?? null,\r\n submittedTypeID: dataList?.submittedTypeID ?? null,\r\n code: dataList?.code ?? null,\r\n isDisplayDocument: dataList?.isDisplayDocument ?? null,\r\n documentInfo: initialUploadFile,\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const onSave = async (values: GetDocumentResponse) => {\r\n const param: UpdateDocumentRequest = {\r\n nameTH: values.nameTH ?? null,\r\n nameEN: values.nameEN ?? null,\r\n shortNameTH: values.shortNameTH ?? null,\r\n shortNameEN: values.shortNameEN ?? null,\r\n submittedTypeID: values.submittedTypeID ?? null,\r\n recID: authenStore.profile.irb,\r\n userID: authenStore.profile.userId ?? 0,\r\n code: values.code,\r\n isDisplayDocument: values.isDisplayDocument ?? null,\r\n documentInfo: values.documentInfo,\r\n }\r\n const result = await putEditSettingDocument(param, parseInt(params.id))\r\n let optionDialog: any = {\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: onBack,\r\n }\r\n if (result.status !== 1) {\r\n optionDialog = {\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('MESSAGE.M022'),\r\n type: 'alert-message',\r\n }\r\n }\r\n setConfigDialog(optionDialog)\r\n }\r\n\r\n const handleClickSubmit = async (values: GetDocumentResponse) => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => onSave(values),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const loadData = async () => {\r\n let param: GetDocumentRequest = {\r\n documentID: parseInt(params.id),\r\n }\r\n const result = await getSettingDocument(param)\r\n setDataList(result)\r\n initialUpload(result.documentInfo)\r\n }\r\n\r\n useEffect(() => {\r\n if (authenStore.profile.userId) {\r\n loadData()\r\n }\r\n }, [])\r\n\r\n return (\r\n \r\n \r\n {translate.get('UM.SETTINGDOCUMENT.EDIT.HEADER')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\nexport default SettingDocumentEdit\r\nconst useStyle = makeStyles((theme) => ({\r\n paper: {\r\n width: '100%',\r\n\r\n marginBottom: '10px',\r\n padding: '20px',\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'unset',\r\n boxShadow: 'unset',\r\n margin: '0px',\r\n },\r\n },\r\n}))\r\n","import { Container, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport { useParams } from 'react-router-dom'\r\nimport { FC, useRef, useState } from 'react'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport Form from '../component/um/setting-faculty/Form'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { FacultyFormType, useSettingFaculty } from '../services/um/useSettingFaculty'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\ninterface SettingFacultyEditProps {}\r\n\r\nconst SettingFacultyEdit: FC = ({}) => {\r\n const classes = useStyle()\r\n const translate = useTranslate()\r\n const params = useParams<{ id: string }>()\r\n const history = useHistory()\r\n const authenStore = useAuthenStore()\r\n const { settingFaculty, putSettingFaculty } = useSettingFaculty(params.id)\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n let initialValues = {\r\n nameTH: settingFaculty?.nameTH ?? '',\r\n nameEN: settingFaculty?.nameEN ?? '',\r\n recID: settingFaculty?.recID ?? '0',\r\n }\r\n\r\n const save = async (values: FacultyFormType) => {\r\n const format = { ...values, userID: authenStore.profile.userId }\r\n const result = await putSettingFaculty(format, params.id)\r\n\r\n let optionDialog: any = {\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: onBack,\r\n }\r\n if (result.status !== 1) {\r\n optionDialog = {\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('MESSAGE.M022'),\r\n type: 'alert-message',\r\n }\r\n }\r\n\r\n setConfigDialog(optionDialog)\r\n }\r\n\r\n const onSubmit = (value: FacultyFormType) => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => save(value),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n const onBack = () => {\r\n history.goBack()\r\n }\r\n return (\r\n \r\n \r\n {translate.get('UM.SETTING_FACULTY.EDIT')}\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyle = makeStyles((theme) => ({\r\n container: {\r\n width: '100%',\r\n },\r\n paper: {\r\n width: '100%',\r\n padding: '20px',\r\n\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'unset',\r\n boxShadow: 'unset',\r\n margin: '0px',\r\n },\r\n },\r\n}))\r\n\r\nexport default SettingFacultyEdit\r\n","import { useState, useEffect, useCallback } from 'react'\r\nimport * as umServiceURL from './umServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nexport type KeywordType = {\r\n submittedTypeID: string\r\n recID: string | null\r\n}\r\n\r\nexport type ConsiderationDataListType = {\r\n approveStatusID: number\r\n name: Translation\r\n order: number\r\n}\r\n\r\ntype Translation = {\r\n th: string\r\n en: string\r\n}\r\n\r\nexport const useSearchSettingConsideration = () => {\r\n const [dataList, setDataList] = useState([])\r\n\r\n const callApi = useCallApi()\r\n\r\n const searchSettingConsideration = useCallback(async (values?: KeywordType) => {\r\n const url = new URL(umServiceURL.getSearchSettingConsideration)\r\n url.searchParams.set('recID', values?.recID || '1')\r\n url.searchParams.set('submittedTypeID', values?.submittedTypeID?.toString() || '1')\r\n\r\n const { data } = await callApi.axiosGet({\r\n url,\r\n })\r\n\r\n setDataList(data)\r\n }, [])\r\n\r\n useEffect(() => {\r\n searchSettingConsideration()\r\n }, [searchSettingConsideration])\r\n\r\n return {\r\n dataList,\r\n setDataList,\r\n searchSettingConsideration,\r\n }\r\n}\r\n","import { useState, useEffect } from 'react'\r\nimport * as umServiceURL from './umServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nexport type ConsiderationFormType = {\r\n nameTH: string\r\n nameEN: string\r\n weekNumber: number\r\n submittedTypeID: string[]\r\n}\r\n\r\nexport type PutOrderConsiderationResponse = {\r\n message: string\r\n}\r\n\r\ntype UseSettingConsiderationProps = {\r\n id?: string\r\n irb?: string\r\n}\r\nexport const useSettingConsideration = (props: UseSettingConsiderationProps = { id: undefined, irb: undefined }) => {\r\n const { id, irb } = props\r\n const [settingConsideration, setSettingConsideration] = useState()\r\n\r\n useEffect(() => {\r\n if (id && irb) {\r\n getSettingConsideration(id, irb)\r\n }\r\n }, [])\r\n\r\n const callApi = useCallApi()\r\n\r\n const getSettingConsideration = async (approveStatusID: string, irb: string) => {\r\n const { data } = await callApi.axiosGet({\r\n url: `${umServiceURL.getSettingConsideration}/${approveStatusID}/${irb}`,\r\n })\r\n\r\n setSettingConsideration(data)\r\n return data\r\n }\r\n\r\n const putSettingConsideration = async (values: ConsiderationFormType, approveStatusID: string, irb: string) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServiceURL.getSettingConsideration}/${approveStatusID}/${irb}`,\r\n params: values,\r\n })\r\n\r\n return data\r\n }\r\n\r\n const putOrderSettingConsideration = async (\r\n values: number[],\r\n userID: number,\r\n approveStatusID: string | null,\r\n irb: number,\r\n ) => {\r\n const { data } = await callApi.axiosPut({\r\n url: `${umServiceURL.putOrderSettingConsideration}/${approveStatusID}`,\r\n params: { listID: values, irb: irb },\r\n })\r\n\r\n return data\r\n }\r\n\r\n return {\r\n settingConsideration,\r\n putSettingConsideration,\r\n putOrderSettingConsideration,\r\n }\r\n}\r\n","import { FC } from 'react'\r\nimport Select from '../../../control/select/select'\r\nimport MultiSelect from '../../../control/multiSelect/multiSelect'\r\nimport { Grid, Paper, Typography } from '@material-ui/core'\r\nimport Button from '../../../control/button/button'\r\nimport { Form } from 'react-final-form'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\n\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useProjectStatus from '../../../services/um/lookups/useProjectStatus'\r\nimport useIRB from '../../../services/um/lookups/useIRB'\r\nimport { KeywordType } from '../../../services/um/useSearchSettingConsideration'\r\n\r\ninterface PanelProps {\r\n onSubmit: (values: KeywordType) => void\r\n initialSearch: any\r\n onReset: (form: any) => void\r\n}\r\n\r\nconst Panel: FC = ({ initialSearch, onSubmit, onReset }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const { projectStatus } = useProjectStatus()\r\n const { irb } = useIRB()\r\n const defaultSelect = initialSearch.recID ? [initialSearch.recID] : undefined\r\n const defaultMultiselect = initialSearch.submittedTypeID ? [initialSearch.submittedTypeID] : undefined\r\n\r\n return (\r\n \r\n {({ handleSubmit, form }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {\r\n form.reset()\r\n onReset(form)\r\n }}\r\n className={classes.btnSearch}\r\n >\r\n {translate.get('BUTTON.RESET')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: '15px',\r\n },\r\n\r\n clear: {\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n padding: '0px 1.5rem',\r\n alignSelf: 'center',\r\n },\r\n paperSearch: {\r\n width: '100%',\r\n padding: theme.spacing(3),\r\n marginBottom: '10px',\r\n },\r\n btnSearch: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n },\r\n}))\r\n\r\nexport default Panel\r\n","import { Grid, Typography, makeStyles } from '@material-ui/core'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { ButtonView } from '../../../control/button/button'\r\n\r\ntype OrderProps = {\r\n index: number\r\n approveStatusID: number\r\n nameTH: string\r\n nameEN: string\r\n order: number\r\n}\r\n\r\nconst Order = ({ index, approveStatusID, nameTH, nameEN, order }: OrderProps) => {\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const classes = useStyles()\r\n\r\n const onEdit = () => {\r\n history.push(`/setting-consideration/${approveStatusID}/edit`)\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {translate.get('BUTTON.EDIT')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.SETTING_CONSIDERATION.TABLE.no')}\r\n \r\n \r\n \r\n {`${order}`}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.SETTING_CONSIDERATION.TABLE.nameTH')}\r\n \r\n \r\n \r\n {nameTH}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('UM.SETTING_CONSIDERATION.TABLE.nameEN')}\r\n \r\n \r\n \r\n {nameEN}\r\n \r\n \r\n \r\n
\r\n )\r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n item: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n position: 'relative',\r\n },\r\n icon: {\r\n marginRight: theme.spacing(1),\r\n width: 40,\r\n height: 40,\r\n backgroundColor: '#ece9e9',\r\n transition: '0.3s',\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: '#fff',\r\n },\r\n },\r\n name: {\r\n fontWeight: 'bold',\r\n },\r\n btnEdit: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n height: '44px',\r\n marginRight: '1px',\r\n },\r\n multiLineEllipsis: {\r\n maxWidth: '100%',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n display: '-webkit-box',\r\n '-webkit-line-clamp': 1,\r\n '-webkit-box-orient': 'vertical',\r\n },\r\n}))\r\n\r\nexport default Order\r\n","import { Grid, makeStyles } from '@material-ui/core'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { Draggable, DraggingStyle, NotDraggingStyle } from 'react-beautiful-dnd'\r\nimport Order from './Order'\r\n\r\nimport { ConsiderationDataListType } from '../../../services/um/useSearchSettingConsideration'\r\n\r\nconst getItemStyle = (\r\n isDragging: boolean,\r\n draggableStyle: DraggingStyle | NotDraggingStyle | undefined,\r\n): React.CSSProperties => ({\r\n userSelect: 'none',\r\n padding: '24px',\r\n margin: '0 0 16px 0',\r\n\r\n // dragging\r\n backgroundColor: '#fff',\r\n border: isDragging ? '1px solid #db5f8e' : '1px solid #bdbdbd',\r\n borderRadius: '4px',\r\n\r\n ...draggableStyle,\r\n})\r\n\r\ntype FiledDraggableProps = {\r\n dataList: ConsiderationDataListType[]\r\n isDragDisabled: boolean\r\n}\r\n\r\nconst FiledDraggable = ({ dataList, isDragDisabled }: FiledDraggableProps) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n\r\n return (\r\n \r\n {dataList.length > 0 &&\r\n dataList.map((item: ConsiderationDataListType, index: number) => {\r\n return (\r\n \r\n \r\n {(provided, snapshot): JSX.Element => (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100% !important',\r\n '&:hover': { border: '1px solid #db5f8e !important' },\r\n },\r\n}))\r\n\r\nexport default FiledDraggable\r\n","import React from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport { DragDropContext, Droppable, DropResult } from 'react-beautiful-dnd'\r\nimport { Button, Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport FiledDraggable from './FiledDraggable'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nimport { ApproveStatusType } from '../../../pages/SettingConsideration'\r\nimport { ConsiderationDataListType } from '../../../services/um/useSearchSettingConsideration'\r\n\r\nconst getListStyle = (isDraggingOver: boolean): React.CSSProperties => ({\r\n margin: '16px 0px',\r\n width: '100%',\r\n})\r\n\r\ntype DraggablesProps = {\r\n handleOrder: (value: ApproveStatusType) => void\r\n isDragDisabled: boolean\r\n handleOrderNumberMode: () => void\r\n dataList?: ConsiderationDataListType[]\r\n}\r\n\r\nconst Draggables = ({ handleOrder, isDragDisabled, handleOrderNumberMode, dataList }: DraggablesProps): JSX.Element => {\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n\r\n const onDragEnd = (fields: any, form: any) => (result: DropResult) => {\r\n if (!result.destination) {\r\n return\r\n }\r\n\r\n const items: ConsiderationDataListType[] = reorder(fields.value, result.source.index, result.destination.index)\r\n form.change('approveStatus', items)\r\n }\r\n\r\n const reorder = (\r\n list: ConsiderationDataListType[],\r\n startIndex: number,\r\n endIndex: number,\r\n ): ConsiderationDataListType[] => {\r\n const result = Array.from(list)\r\n const [removed] = result.splice(startIndex, 1)\r\n result.splice(endIndex, 0, removed)\r\n\r\n return result\r\n }\r\n\r\n const initialValues = {\r\n approveStatus: dataList,\r\n }\r\n\r\n return (\r\n (\r\n
\r\n <>\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${dataList?.length ?? 0}`])}\r\n \r\n \r\n {!isDragDisabled && (\r\n \r\n \r\n \r\n * {translate.get('LABEL.DRAGABLE_LABEL')}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {isDragDisabled ? (\r\n \r\n \r\n \r\n {translate.get('BUTTON.ORDER')}\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n \r\n {\r\n handleOrderNumberMode?.()\r\n return form.reset\r\n }}\r\n // disabled={submitting || pristine}\r\n >\r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n \r\n {({ fields }) => (\r\n \r\n \r\n {(provided, snapshot): JSX.Element => (\r\n \r\n \r\n {provided.placeholder}\r\n
\r\n )}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n controlFieldArray: {\r\n width: '100%',\r\n overflowY: 'auto',\r\n [theme.breakpoints.down('md')]: {\r\n height: 'auto',\r\n },\r\n marginTop: '-15px',\r\n },\r\n button: {\r\n marginTop: '16px',\r\n },\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n },\r\n}))\r\n\r\nexport default Draggables\r\n","import { Container, Grid, Typography, Button } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/styles'\r\nimport { FormApi } from 'final-form'\r\nimport { useEffect, useState, useRef } from 'react'\r\nimport { useQueryParam, StringParam } from 'use-query-params'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport {\r\n KeywordType,\r\n useSearchSettingConsideration,\r\n ConsiderationDataListType,\r\n} from '../services/um/useSearchSettingConsideration'\r\nimport { useSettingConsideration } from '../services/um/useSettingConsideration'\r\nimport useLoadingStore from '../control/loading/store/useLoadingStore'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\nimport Panel from './../component/um/setting-consideration/Panel'\r\nimport Draggables from './../component/um/setting-consideration/Draggables'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nexport type ApproveStatusType = {\r\n approveStatus: ConsiderationDataListType[]\r\n}\r\n\r\nconst SettingConsideration = () => {\r\n const translate = useTranslate()\r\n const loadingStore = useLoadingStore()\r\n const classes = useStyles()\r\n const authenStore = useAuthenStore()\r\n const { dataList, searchSettingConsideration } = useSearchSettingConsideration()\r\n const { putOrderSettingConsideration } = useSettingConsideration()\r\n const [recID, setRecID] = useQueryParam('recID', StringParam)\r\n const [submittedTypeID, setSubmittedTypeID] = useQueryParam('submittedTypeID', StringParam)\r\n const [isDragDisabled, setIsDragDisabled] = useState(true)\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n\r\n const [initialValues, setInitialValues] = useState({\r\n recID: (authenStore.profile.irb?.toString() || recID) ?? null,\r\n submittedTypeID: submittedTypeID ?? '1',\r\n })\r\n\r\n useEffect(() => {\r\n if (authenStore.profile.userId) {\r\n searchSettingConsideration(initialValues)\r\n setRecID(authenStore.profile.irb?.toString())\r\n setSubmittedTypeID(submittedTypeID ?? '1')\r\n }\r\n }, [authenStore.profile.userId])\r\n\r\n const onSubmit = async (value: KeywordType) => {\r\n const param = {\r\n recID: value.recID,\r\n submittedTypeID: value.submittedTypeID,\r\n }\r\n value.recID && setRecID(value.recID.toString())\r\n setSearchParam(value)\r\n searchSettingConsideration(param)\r\n }\r\n\r\n const setSearchParam = (value: KeywordType) => {\r\n setInitialValues(value)\r\n setSubmittedTypeID(value.submittedTypeID ? value.submittedTypeID.toString() : null)\r\n }\r\n\r\n const onReset = (form: FormApi>) => {\r\n let param = {\r\n recID: recID || null,\r\n submittedTypeID: '1',\r\n }\r\n form.initialize(param)\r\n setInitialValues(param)\r\n searchSettingConsideration(param)\r\n }\r\n\r\n const handleOrderNumberMode = () => {\r\n setIsDragDisabled(!isDragDisabled)\r\n searchSettingConsideration({\r\n recID: recID || null,\r\n submittedTypeID: submittedTypeID || '1',\r\n })\r\n }\r\n\r\n const handleOrder = (value: ApproveStatusType) => {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.CONFIRM')}`,\r\n type: 'alert-confirm',\r\n onClickConfirm: () => onSave(value),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onSave = async (value: ApproveStatusType) => {\r\n let params = value.approveStatus.map((item) => item.approveStatusID)\r\n const result = await putOrderSettingConsideration(\r\n params,\r\n authenStore.profile.userId ?? 0,\r\n submittedTypeID ?? null,\r\n authenStore.profile.irb as number,\r\n )\r\n if (result.message === 'success') {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.SUCCESS')}`,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n handleOrderNumberMode()\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n {!loadingStore.isLoading && dataList?.length === 0 && (\r\n \r\n {translate.get('LABEL.NO_DATA_FOUND')}\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n },\r\n textResult: {\r\n margin: '8px 0',\r\n },\r\n}))\r\n\r\nexport default SettingConsideration\r\n","import { Button, Grid } from '@material-ui/core'\r\nimport MultiSelect from '../../../control/multiSelect/multiSelect'\r\nimport { makeStyles } from '@material-ui/styles'\r\nimport { FC } from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nimport useProjectStatus from '../../../services/um/lookups/useProjectStatus'\r\nimport { ConsiderationFormType } from '../../../services/um/useSettingConsideration'\r\nimport { useHistory, useParams } from 'react-router-dom'\r\nimport { RoutePath } from '../../../router/routesConfig'\r\nimport Select from '../../../control/select/select'\r\n\r\nexport type FormType = {\r\n nameTH: string | null\r\n nameEN: string | null\r\n submittedTypeID: string[]\r\n weekNumber: number | null\r\n}\r\ninterface FormProps {\r\n onBack: () => void\r\n initialValues: any\r\n onSubmit: (values: ConsiderationFormType) => void\r\n}\r\nconst Form: FC = ({ onBack, initialValues, onSubmit }) => {\r\n const { projectStatus } = useProjectStatus()\r\n const classes = useStyle()\r\n const translate = useTranslate()\r\n const defaultSelect = initialValues?.submittedTypeID.map(String)\r\n const params = useParams<{ id: string }>()\r\n return (\r\n \r\n {({ handleSubmit }) => {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n }}\r\n
\r\n )\r\n}\r\n\r\nconst useStyle = makeStyles(() => ({\r\n container: {\r\n width: '100%',\r\n },\r\n reset: {\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n padding: '0px 1.5rem',\r\n alignSelf: 'center',\r\n },\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n padding: '1rem 0px',\r\n },\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n },\r\n saveButton: {\r\n border: 'solid 1px #db5f8e',\r\n boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)',\r\n },\r\n}))\r\n\r\nexport default Form\r\n","import { useEffect } from 'react'\r\nimport { Container, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport { useParams } from 'react-router-dom'\r\nimport { FC, useRef, useState } from 'react'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport Form from '../component/um/setting-consideration/Form'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { ConsiderationFormType, useSettingConsideration } from '../services/um/useSettingConsideration'\r\nimport Dialog, { DialogType } from '../control/dialog/dialog'\r\nimport useAuthenStore from '../stores/authen/authenStore'\r\ninterface SettingConsiderationEditProps {}\r\n\r\nconst SettingConsiderationEdit: FC = ({}) => {\r\n const classes = useStyle()\r\n const authenStore = useAuthenStore()\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const params = useParams<{ id: string }>()\r\n\r\n const irb = useRef((authenStore?.profile?.irb && authenStore.profile.irb) || undefined)\r\n\r\n const { settingConsideration, putSettingConsideration } = useSettingConsideration({\r\n id: params.id,\r\n irb: (irb.current && irb.current.toString()) || undefined,\r\n })\r\n\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n useEffect(() => {\r\n //don't set state here\r\n irb.current = (authenStore?.profile?.irb && authenStore.profile.irb) || undefined\r\n })\r\n\r\n const save = async (values: ConsiderationFormType) => {\r\n const result = await putSettingConsideration(values, params.id, (irb.current && irb.current.toString()) || '')\r\n if (result) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: onBack,\r\n })\r\n }\r\n }\r\n\r\n const onSubmit = (value: ConsiderationFormType) => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => save(value),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n const onBack = () => {\r\n history.goBack()\r\n }\r\n return (\r\n \r\n \r\n {translate.get('UM.SETTING_CONSIDERATION.EDIT')}\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyle = makeStyles((theme) => ({\r\n container: {\r\n width: '100%',\r\n },\r\n paper: {\r\n width: '100%',\r\n padding: '20px',\r\n\r\n [theme.breakpoints.down('sm')]: {\r\n backgroundColor: 'unset',\r\n boxShadow: 'unset',\r\n margin: '0px',\r\n },\r\n },\r\n}))\r\n\r\nexport default SettingConsiderationEdit\r\n","import axios from 'axios'\r\nimport jwt from 'jsonwebtoken'\r\nimport React, { useEffect, useState } from 'react'\r\nimport { useLocation, useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../router/routesConfig'\r\n// import { useCookies } from 'react-cookie'\r\n// import { useDispatch } from 'react-redux'\r\n// import { setAuthenData } from '../redux/actions/AuthenACT'\r\n// import { ProfileDataType } from '../redux/reducers/AuthenReducer'\r\nimport useLogin, { LoginFormT, ProfileT } from '../services/authen/useLogin'\r\nimport { enc } from 'crypto-js'\r\nimport { replaceForDecryptStr } from '../utilities/encryption'\r\n\r\ntype Result = {\r\n meta: { copyright: string; authors: string }\r\n result: {\r\n accessToken: string\r\n id_token: string\r\n }\r\n}\r\n\r\ntype LandingProps = {\r\n setLogged: any\r\n}\r\nexport enum ParamSearchKey {}\r\n// president = '1', // ประธาน\r\n// secreatary = '2', // เลขา\r\n\r\nconst decodeDownloadLink = (encodedDownloadLink: string): any => {\r\n // const buffer = Buffer.from(encodedDownloadLink, 'base64')\r\n // const downloadLink = buffer.toString()\r\n let downloadLink = ''\r\n try {\r\n // console.log('encodedDownloadLink', encodedDownloadLink)\r\n // console.log('typeof encodedDownloadLink', typeof encodedDownloadLink)\r\n const replacedDecryptStr = replaceForDecryptStr(encodedDownloadLink)\r\n const encodedWord = enc.Base64.parse(replacedDecryptStr)\r\n // console.log('encodedWord>>>>>>', encodedWord)\r\n downloadLink = enc.Utf8.stringify(encodedWord)\r\n // console.log('downloadLink', downloadLink)\r\n } catch (err) {\r\n console.log('err', err)\r\n }\r\n\r\n return downloadLink\r\n}\r\n\r\nconst Landing: React.FC = ({ setLogged }) => {\r\n const history = useHistory()\r\n const location = useLocation()\r\n const { post, getProfile } = useLogin()\r\n React.useEffect(() => {\r\n checkIsLogined()\r\n }, [])\r\n\r\n const checkIsLogined = async () => {\r\n const accessToken = localStorage.getItem('accessToken')\r\n const urlParams = new URLSearchParams(location.search)\r\n const encodedDownloadLink = urlParams.get('download_link')\r\n\r\n if (accessToken) {\r\n const expireDate = localStorage.getItem('tokenExpireDate')\r\n const currentDate = new Date()\r\n\r\n if (expireDate && currentDate.getTime() > Number(expireDate)) {\r\n localStorage.clear()\r\n history.replace(`${RoutePath.login}?download_link=${encodedDownloadLink}`, null)\r\n } else {\r\n const profileRes = await getProfile(accessToken)\r\n if (profileRes && profileRes.userId) {\r\n //มีการ Login แล้ว\\\r\n if (encodedDownloadLink) {\r\n const downloadLink = decodeDownloadLink(encodedDownloadLink)\r\n if (downloadLink) {\r\n window.location.assign(downloadLink)\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n } else {\r\n history.replace(`${RoutePath.login}?download_link=${encodedDownloadLink}`, null)\r\n }\r\n }\r\n } else {\r\n history.replace(`${RoutePath.login}?download_link=${encodedDownloadLink}`, null)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n // const callToken = async () => {\r\n // try {\r\n // loadingOpen()\r\n // const url = process.env.REACT_APP_GOT_ID_API\r\n // const response = await axios.post(`${url}/v1/token`, { code, state })\r\n // const result = response.data?.result\r\n // const profile: ProfileDataType = await decodeIDToken(result.id_token, response.headers['got-pub-key'])\r\n // dispatch(setAuthenData(profile))\r\n // setLogged(true)\r\n // setCookie('got_access_token', result.accessToken, {\r\n // path: RouteName.search,\r\n // domain: process.env.REACT_APP_COOKIE_DOMAIN,\r\n // })\r\n // loadingClose()\r\n // history.push(RouteName.search)\r\n // } catch (error) {\r\n // setError(true)\r\n // const result = error.response\r\n // const code = result.data?.error?.code\r\n // filterErrorMessage(code)\r\n // history.push(RouteName.search)\r\n // return error.response\r\n // }\r\n // }\r\n // callToken()\r\n }, [])\r\n\r\n const filterErrorMessage = (code: string) => {\r\n // return setErrorMessage('something went wrong')\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n \r\n )\r\n}\r\n\r\nexport default Landing\r\n","var _g, _g2;\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nfunction SvgFolder(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n enableBackground: \"new 0 0 24 24\",\n height: \"24px\",\n viewBox: \"0 0 24 24\",\n width: \"24px\",\n fill: \"#000000\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _g || (_g = /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M0,0h24v24H0V0z\",\n fill: \"none\"\n }))), _g2 || (_g2 = /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M14,2H6C4.9,2,4,2.9,4,4v16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V8L14,2z M18,20H6V4h8v4h4V20z M12,17L12,17 c-1.1,0-2-0.9-2-2l0-5.5C10,9.22,10.22,9,10.5,9h0C10.78,9,11,9.22,11,9.5V15h2V9.5C13,8.12,11.88,7,10.5,7h0C9.12,7,8,8.12,8,9.5 L8,15c0,2.21,1.79,4,4,4h0c2.21,0,4-1.79,4-4v-4h-2v4C14,16.1,13.1,17,12,17z\"\n }))));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgFolder);\nexport default __webpack_public_path__ + \"static/media/folder.6fa83408.svg\";\nexport { ForwardRef as ReactComponent };","import React from 'react'\r\nimport clsx from 'clsx'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Drawer from '@material-ui/core/Drawer'\r\n// import AppBar from '@material-ui/core/AppBar'\r\n// import Toolbar from '@material-ui/core/Toolbar'\r\nimport List from '@material-ui/core/List'\r\n// import CssBaseline from '@material-ui/core/CssBaseline'\r\n// import Typography from '@material-ui/core/Typography'\r\n// import Divider from '@material-ui/core/Divider'\r\nimport IconButton from '@material-ui/core/IconButton'\r\n// import MenuIcon from '@material-ui/icons/Menu'\r\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft'\r\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight'\r\nimport ListItem from '@material-ui/core/ListItem'\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon'\r\nimport ListItemText from '@material-ui/core/ListItemText'\r\n// import InboxIcon from '@material-ui/icons/MoveToInbox'\r\n// import MailIcon from '@material-ui/icons/Mail'\r\n// import EthicsForm from '../../component/web/shareUI/ethicsForm/ethicsForm'\r\n// import { Form } from 'react-final-form'\r\n// import { Grid, withStyles } from '@material-ui/core'\r\n// import SvgIcon from '@material-ui/core/SvgIcon'\r\nimport AddIcon from '@material-ui/icons/Add'\r\nimport * as Constants from '../../constants/constants'\r\n// import { SvgIconProps } from '@mui/material/SvgIcon'\r\nimport Icon from '@material-ui/core/Icon'\r\nimport constSubmittedType from '../../constants/submittedType'\r\nimport useTranslate from '../../i18n/useTranslate'\r\nimport { ReactComponent as FolderIcon } from '../../images/folder.svg'\r\nimport Tooltip from '../tooltip/tooltip'\r\n\r\nconst drawerWidth = 240\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n },\r\n iconColor: {\r\n color: 'white',\r\n },\r\n lastestIconColor: {\r\n color: '#d8943f',\r\n },\r\n appBar: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n transition: theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n },\r\n appBarShift: {\r\n marginLeft: drawerWidth,\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n transition: theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n menuButton: {\r\n marginRight: 36,\r\n },\r\n hide: {\r\n display: 'none',\r\n },\r\n drawer: {\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n whiteSpace: 'nowrap',\r\n },\r\n test: {\r\n position: 'unset',\r\n overflowY: 'unset',\r\n },\r\n drawerOpen: {\r\n width: drawerWidth,\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n drawerClose: {\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n overflowX: 'hidden',\r\n width: theme.spacing(7) + 1,\r\n [theme.breakpoints.up('sm')]: {\r\n width: theme.spacing(9) + 1,\r\n },\r\n },\r\n toolbar: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n // padding: theme.spacing(0, 1),\r\n // necessary for content to be below app bar\r\n ...theme.mixins.toolbar,\r\n },\r\n content: {\r\n flexGrow: 1,\r\n },\r\n listItemRoot: {\r\n color: 'white',\r\n backgroundColor: '#58a4b0',\r\n borderTopLeftRadius: '10px',\r\n borderBottomLeftRadius: '10px',\r\n marginBottom: '10px',\r\n width: 'calc(100% - 15px)',\r\n marginLeft: '15px',\r\n '&:hover': { backgroundColor: '#65b9c7' },\r\n\r\n '&$selected': {\r\n backgroundColor: '#58a4b0',\r\n marginLeft: '0px',\r\n '&:hover': {\r\n backgroundColor: '#65b9c7',\r\n },\r\n },\r\n },\r\n selected: {},\r\n\r\n listItemlastest: {\r\n color: '#d8943f',\r\n backgroundColor: '#fcdc4d',\r\n borderRadius: '10px',\r\n marginBottom: '10px',\r\n width: 'calc(100% + 10px)',\r\n marginLeft: '15px',\r\n '&:hover': { backgroundColor: '#ffe674' },\r\n\r\n '&$selected': {\r\n backgroundColor: '#fcdc4d',\r\n marginLeft: '0px',\r\n '&:hover': {\r\n backgroundColor: '#ffe674',\r\n },\r\n },\r\n },\r\n\r\n toggleFolderButton: {\r\n background: 'silver',\r\n position: 'absolute',\r\n zIndex: 9999,\r\n left: (props: any) => {\r\n if (props.open) {\r\n return '225px'\r\n } else {\r\n return '65px'\r\n }\r\n },\r\n },\r\n}))\r\n\r\nconst getFolderIcon = (itm: any) => {\r\n const submittedTypeID = itm?.submittedTypeID\r\n let iconPath = <>\r\n switch (submittedTypeID) {\r\n case constSubmittedType.firstSubmitConsideration:\r\n case constSubmittedType.editAfterReview:\r\n case Constants.customFolder.createProject.id:\r\n iconPath = \r\n break\r\n\r\n case constSubmittedType.nextPhaseProject:\r\n case constSubmittedType.editAfterReview_nextPhaseProject:\r\n case Constants.customFolder.projectPhase.id:\r\n iconPath = \r\n break\r\n\r\n case constSubmittedType.renewalProject:\r\n case constSubmittedType.editAfterReview_renewalProject:\r\n case Constants.customFolder.projectRenewal.id:\r\n iconPath = \r\n break\r\n\r\n case constSubmittedType.amendmentProject:\r\n case constSubmittedType.exitAfterReview_AmendmentProject:\r\n case Constants.customFolder.projectAmendment.id:\r\n iconPath = \r\n break\r\n\r\n case constSubmittedType.adverseEvent:\r\n case Constants.customFolder.adverseEvents.id:\r\n iconPath = \r\n break\r\n\r\n case constSubmittedType.nonconformance:\r\n case Constants.customFolder.raeProject.id:\r\n iconPath = \r\n break\r\n\r\n case constSubmittedType.closeProject:\r\n case constSubmittedType.editAfterReview_closeProject:\r\n case constSubmittedType.closeProjectByAdmin:\r\n case Constants.customFolder.closeProject.id:\r\n case Constants.customFolder.closeProjectByAdmin.id:\r\n iconPath = \r\n break\r\n\r\n case constSubmittedType.terminateProject:\r\n case constSubmittedType.editAfterReview_terminateProject:\r\n case constSubmittedType.terminateProjectByAdmin:\r\n case Constants.customFolder.terminateProject.id:\r\n case Constants.customFolder.terminateProjectByAdmin.id:\r\n iconPath = \r\n break\r\n\r\n case constSubmittedType.withdrawalProject:\r\n case constSubmittedType.withdrawalSubmitted:\r\n case Constants.customFolder.withdrawProject.id:\r\n case Constants.customFolder.withdrawSubmitted.id:\r\n iconPath = \r\n break\r\n\r\n case constSubmittedType.firstSubmitConsideration_notScope:\r\n iconPath = \r\n break\r\n\r\n case Constants.customFolder.docAdditional.id:\r\n iconPath = \r\n break\r\n\r\n default:\r\n iconPath = <>\r\n break\r\n }\r\n\r\n return {iconPath}\r\n}\r\n\r\nexport default function MiniDrawer(props: any) {\r\n const { children, menuFolderList = [], onClickMenu, folderSelected } = props\r\n const [open, setOpen] = React.useState(false)\r\n const classes = useStyles({ open })\r\n const translate = useTranslate()\r\n\r\n const handleDrawerOpen = () => {\r\n setOpen(!open)\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n \r\n {open ? : }\r\n \r\n
\r\n \r\n {menuFolderList?.map((itm: any, index: number) => (\r\n \r\n {\r\n if (onClickMenu) {\r\n onClickMenu(itm)\r\n }\r\n }}\r\n // onCha\r\n selected={folderSelected === itm.id}\r\n >\r\n \r\n {/* {itm.id === Constants.customFolder.docAdditional.id ? (\r\n \r\n ) : index % 2 === 0 ? (\r\n \r\n ) : (\r\n \r\n )} */}\r\n\r\n {/* \r\n \r\n */}\r\n {getFolderIcon(itm)}\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n\r\n
{children}
\r\n
\r\n
\r\n )\r\n}\r\n","import { Grid, useTheme, makeStyles, Paper, IconButton } from '@material-ui/core'\r\n// import useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport { Typography } from '@material-ui/core'\r\nimport { EditFormHeaderCtrlPropsType, EditFormHeaderViewPropsType } from './editFormHeaderType'\r\n// import useEditFormHeader from './useEditFormHeader'\r\n// import moment from 'moment'\r\nimport { GetProjectResultType, ItemListType } from '../../../../services/web/types/responseWebServiceTypes'\r\nimport { statusColorConstant } from '../../../../constants/constants'\r\n// import EditIcon from '@material-ui/icons/Edit'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../utilities/date'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport constProjectStatus from '../../../../constants/projectStatus'\r\nimport useCheckPermission from '../../../../utilities/checkPermission'\r\nimport projectStatus from '../../../../constants/projectStatus'\r\nimport submittedStatus from '../../../../constants/submittedStatus'\r\n\r\nconst AdminEditView = (props: EditFormHeaderViewPropsType) => {\r\n const { projectData } = props\r\n const theme = useTheme()\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n // const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const checkPermission = useCheckPermission()\r\n const isResearcher = checkPermission.isUserResearcher()\r\n const checkStatusColor = (itm: GetProjectResultType) => {\r\n let projectStatusBackgroundColor = ''\r\n let statusTextColor = ''\r\n let submittedStatusColor = ''\r\n\r\n switch (itm.projectStatusInfo?.value) {\r\n case projectStatus.rejected:\r\n // code block ไม่อนุมัติ\r\n projectStatusBackgroundColor = statusColorConstant.statusReject.backgroundColor\r\n // statusTextColor = statusColorConstant.statusReject.textColor\r\n break\r\n case projectStatus.closed:\r\n // code block ปิดโครงการ\r\n projectStatusBackgroundColor = statusColorConstant.statusClose.backgroundColor\r\n // statusTextColor = statusColorConstant.statusClose.textColor\r\n break\r\n case projectStatus.notScope:\r\n // code block ไม่เข้าข่าย\r\n projectStatusBackgroundColor = statusColorConstant.noScope.backgroundColor\r\n // statusTextColor = statusColorConstant.noScope.textColor\r\n break\r\n case projectStatus.terminate:\r\n // code block ยุติโครงการ\r\n projectStatusBackgroundColor = statusColorConstant.terminate.backgroundColor\r\n // statusTextColor = statusColorConstant.terminate.textColor\r\n break\r\n case projectStatus.withdraw:\r\n // code block ถอนโครงการ\r\n projectStatusBackgroundColor = statusColorConstant.withdraw.backgroundColor\r\n // statusTextColor = statusColorConstant.withdraw.textColor\r\n break\r\n case projectStatus.processing:\r\n // กำลังดำเนินการ\r\n projectStatusBackgroundColor = statusColorConstant.status15.backgroundColor\r\n // statusTextColor = statusColorConstant.status15.textColor\r\n break\r\n case projectStatus.completed:\r\n // ดำเนินการเสร็จสิ้น\r\n projectStatusBackgroundColor = statusColorConstant.status8.backgroundColor\r\n // statusTextColor = statusColorConstant.status8.textColor\r\n break\r\n default:\r\n // statusId = null (ร่าง)\r\n projectStatusBackgroundColor = statusColorConstant.status1.backgroundColor\r\n // statusTextColor = statusColorConstant.status1.textColor\r\n\r\n break\r\n }\r\n\r\n switch (itm?.submittedStatusInfo?.value) {\r\n case statusColorConstant.status1.statusID:\r\n // code block\r\n submittedStatusColor = statusColorConstant.status1.backgroundColor\r\n statusTextColor = statusColorConstant.status1.textColor\r\n break\r\n\r\n case statusColorConstant.status2.statusID:\r\n // code block\r\n\r\n submittedStatusColor = statusColorConstant.status2.backgroundColor\r\n statusTextColor = statusColorConstant.status2.textColor\r\n\r\n break\r\n case statusColorConstant.status3.statusID:\r\n submittedStatusColor = statusColorConstant.status3.backgroundColor\r\n statusTextColor = statusColorConstant.status3.textColor\r\n\r\n break\r\n case statusColorConstant.status4.statusID:\r\n submittedStatusColor = statusColorConstant.status4.backgroundColor\r\n statusTextColor = statusColorConstant.status4.textColor\r\n\r\n break\r\n case statusColorConstant.status18.statusID:\r\n submittedStatusColor = statusColorConstant.status18.backgroundColor\r\n statusTextColor = statusColorConstant.status18.textColor\r\n\r\n break\r\n case statusColorConstant.status5.statusID:\r\n submittedStatusColor = statusColorConstant.status5.backgroundColor\r\n statusTextColor = statusColorConstant.status5.textColor\r\n\r\n break\r\n case statusColorConstant.status6.statusID:\r\n submittedStatusColor = statusColorConstant.status6.backgroundColor\r\n statusTextColor = statusColorConstant.status6.textColor\r\n\r\n break\r\n case statusColorConstant.status7.statusID:\r\n submittedStatusColor = statusColorConstant.status7.backgroundColor\r\n statusTextColor = statusColorConstant.status7.textColor\r\n\r\n break\r\n case statusColorConstant.status8.statusID:\r\n submittedStatusColor = statusColorConstant.status8.backgroundColor\r\n statusTextColor = statusColorConstant.status8.textColor\r\n\r\n break\r\n case statusColorConstant.status9.statusID:\r\n submittedStatusColor = statusColorConstant.status9.backgroundColor\r\n statusTextColor = statusColorConstant.status9.textColor\r\n\r\n break\r\n case statusColorConstant.status10.statusID:\r\n submittedStatusColor = statusColorConstant.status10.backgroundColor\r\n statusTextColor = statusColorConstant.status10.textColor\r\n\r\n break\r\n case statusColorConstant.status11.statusID:\r\n submittedStatusColor = statusColorConstant.status11.backgroundColor\r\n statusTextColor = statusColorConstant.status11.textColor\r\n\r\n break\r\n case statusColorConstant.status12.statusID:\r\n submittedStatusColor = statusColorConstant.status12.backgroundColor\r\n statusTextColor = statusColorConstant.status12.textColor\r\n break\r\n case statusColorConstant.status14.statusID:\r\n // code block\r\n submittedStatusColor = statusColorConstant.status14.backgroundColor\r\n statusTextColor = statusColorConstant.status14.textColor\r\n break\r\n case statusColorConstant.status17.statusID:\r\n // code block\r\n submittedStatusColor = statusColorConstant.status17.backgroundColor\r\n statusTextColor = statusColorConstant.status17.textColor\r\n break\r\n // case statusColorConstant.status15.statusID:\r\n // // กำลังดำเนินการ\r\n // submittedStatusColor = statusColorConstant.status15.backgroundColor\r\n // statusTextColor = statusColorConstant.status15.textColor\r\n // break\r\n case statusColorConstant.resultOfConsideration.statusID:\r\n // code block\r\n submittedStatusColor = statusColorConstant.resultOfConsideration.backgroundColor\r\n statusTextColor = statusColorConstant.resultOfConsideration.textColor\r\n break\r\n case statusColorConstant.noScope.statusID:\r\n // code block\r\n submittedStatusColor = statusColorConstant.noScope.backgroundColor\r\n statusTextColor = statusColorConstant.noScope.textColor\r\n break\r\n case statusColorConstant.terminate.statusID:\r\n // code block\r\n submittedStatusColor = statusColorConstant.terminate.backgroundColor\r\n statusTextColor = statusColorConstant.terminate.textColor\r\n break\r\n case statusColorConstant.withdraw.statusID:\r\n // code block\r\n submittedStatusColor = statusColorConstant.withdraw.backgroundColor\r\n statusTextColor = statusColorConstant.withdraw.textColor\r\n break\r\n case statusColorConstant.proceedingMemoMessage.statusID:\r\n // ดำเนินการทำใบบันทึกข้อความ\r\n submittedStatusColor = statusColorConstant.proceedingMemoMessage.backgroundColor\r\n statusTextColor = statusColorConstant.proceedingMemoMessage.textColor\r\n break\r\n case statusColorConstant.waitingEditProject.statusID:\r\n // รอแก้ไขโครงการ\r\n if (isResearcher) {\r\n submittedStatusColor = statusColorConstant.waitingEditProject.researcher.backgroundColor\r\n statusTextColor = statusColorConstant.waitingEditProject.researcher.textColor\r\n } else {\r\n submittedStatusColor = statusColorConstant.waitingEditProject.backgroundColor\r\n statusTextColor = statusColorConstant.waitingEditProject.textColor\r\n }\r\n submittedStatusColor = statusColorConstant.waitingEditProject.backgroundColor\r\n statusTextColor = statusColorConstant.waitingEditProject.textColor\r\n break\r\n default:\r\n // statusId = null (ร่าง)\r\n submittedStatusColor = statusColorConstant.status1.backgroundColor\r\n statusTextColor = statusColorConstant.status1.textColor\r\n\r\n break\r\n }\r\n\r\n return { submittedStatusColor, statusTextColor, projectStatusBackgroundColor }\r\n }\r\n\r\n const getDisplayResearcherName = (val: any) => {\r\n let displayResearcherName = ''\r\n if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n displayResearcherName = val?.researcherFullname_th ?? '-'\r\n if (val?.researcherTypeInfo?.nameTH) {\r\n displayResearcherName += ` (${val?.researcherTypeInfo?.nameTH ?? ''})`\r\n }\r\n } else {\r\n displayResearcherName = val?.researcherFullname_en ?? '-'\r\n if (val?.researcherTypeInfo?.nameEN) {\r\n displayResearcherName += ` (${val?.researcherTypeInfo?.nameEN ?? ''})`\r\n }\r\n }\r\n return displayResearcherName\r\n }\r\n\r\n const getDisplaySubmittedDate = (val: ItemListType) => {\r\n let display = '-'\r\n if (val?.submittedDate) {\r\n display =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? convertDateToFormatTH(val.submittedDate)\r\n : convertDateToFormatEN(val.submittedDate)\r\n }\r\n return display\r\n }\r\n\r\n const conditionShowStatusInfo = (itm: any) => {\r\n if (isResearcher && itm?.submittedStatusInfo?.value === submittedStatus.waitingEditProject) {\r\n return translate.get('LABEL.RECEIVED_REVIEW_RESULT')\r\n }\r\n // else if (!isResearcher &&\r\n // itm.isSubmittedReceiveDate &&\r\n // itm?.submittedStatusInfo?.value === submittedStatus.directorAssigned //ต้องอยู่ใน submit status การรอเอกสารจากผู้วิจัยอย่างเดียว\r\n // ) {\r\n // return translate.get('LABEL.COMMENT_DEADLINE_WAIT')\r\n // }\r\n\r\n if (\r\n itm?.projectStatusInfo?.value === constProjectStatus.closed || //ปิดโครงการ\r\n itm?.projectStatusInfo?.value === constProjectStatus.rejected || //ไม่อนุมัติ\r\n itm?.projectStatusInfo?.value === constProjectStatus.notScope || //ไม่เข้าข่าย\r\n itm?.projectStatusInfo?.value === constProjectStatus.terminate || //ยุติโครงการ\r\n itm?.projectStatusInfo?.value === constProjectStatus.withdraw //ถอนโครงการ\r\n ) {\r\n if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n return itm?.projectStatusInfo?.nameTH\r\n } else {\r\n return itm?.projectStatusInfo?.nameEN\r\n }\r\n } else {\r\n if (isResearcher) {\r\n //กรณีเป็นนักวิจัย\r\n if (itm?.researcherSubmittedStatusInfo?.nameTH && itm?.researcherSubmittedStatusInfo?.nameEN) {\r\n //มีข้อมูล researcherSubmittedStatusInfo\r\n if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n return itm?.researcherSubmittedStatusInfo?.nameTH\r\n } else {\r\n return itm?.researcherSubmittedStatusInfo?.nameEN\r\n }\r\n } else {\r\n if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n return 'ร่าง'\r\n } else {\r\n return 'draft'\r\n }\r\n }\r\n } else {\r\n //กรณีไม่ใช่นักวิจัย\r\n if (itm?.submittedStatusInfo?.nameTH && itm?.submittedStatusInfo?.nameEN) {\r\n if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n return itm?.submittedStatusInfo?.nameTH\r\n } else {\r\n return itm?.submittedStatusInfo?.nameEN\r\n }\r\n } else {\r\n if (translate.languageStore.currentLanguage === translate.languageKey.th) {\r\n return 'ร่าง'\r\n } else {\r\n return 'draft'\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n const chkInProcessing = (itm?: GetProjectResultType) => {\r\n if (itm?.projectStatusInfo && itm?.projectStatusInfo.value === projectStatus.processing) {\r\n return true\r\n } else {\r\n return false\r\n }\r\n }\r\n\r\n const renderListElement = (itm?: any) => {\r\n const isProcessing = chkInProcessing(itm)\r\n const { statusTextColor, projectStatusBackgroundColor, submittedStatusColor } = checkStatusColor(itm)\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {itm?.projectNumber ? itm?.projectNumber : '-'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {getDisplayResearcherName(itm)}\r\n \r\n \r\n\r\n \r\n \r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm?.projectName_th || '-'\r\n : itm?.projectName_en || '-'}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm?.submitTypeInfo?.nameTH || '-'\r\n : itm?.submitTypeInfo?.nameEN || '-'}\r\n \r\n \r\n\r\n \r\n \r\n {`${translate.get('LABEL.SUBMITTED_DATE')} ${getDisplaySubmittedDate(itm)}`}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {conditionShowStatusInfo(itm)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return renderListElement(projectData)\r\n}\r\n\r\n//Controller\r\nconst AdminEditCtrl = (props: EditFormHeaderCtrlPropsType) => {\r\n const {} = props\r\n // const useEditFormHeaderModel = useEditFormHeader()\r\n // return \r\n return \r\n}\r\n\r\nexport default AdminEditCtrl\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: 128,\r\n padding: 20,\r\n },\r\n titleFont: {\r\n color: '#BDBDBD',\r\n },\r\n contentFont: {\r\n fontWeight: 'bold',\r\n },\r\n paperProjectCode: {\r\n padding: '10px',\r\n background: '#f3f3f3',\r\n width: '120px',\r\n textAlign: 'center',\r\n },\r\n paperProjectStatus: {\r\n padding: '10px',\r\n\r\n // width: '150px',\r\n textAlign: 'center',\r\n borderRadius: '20px',\r\n },\r\n}))\r\n","import { useSetRecoilState } from 'recoil'\r\n\r\nimport { manageProjectStore, ManageProjectStoreType } from './useManageProjectStore'\r\nimport * as RESServiceType from '../../services/web/types/responseWebServiceTypes'\r\n\r\nconst useManageProjectAction = () => {\r\n const setManageProjectStore = useSetRecoilState(manageProjectStore)\r\n\r\n const setState = (newState: Partial) => {\r\n setManageProjectStore((prevState) => ({\r\n ...prevState,\r\n ...newState,\r\n }))\r\n }\r\n\r\n const setProjectData = (param?: RESServiceType.GetProjectResultType) => {\r\n setManageProjectStore((prevState) => ({\r\n ...prevState,\r\n projectData: param,\r\n }))\r\n }\r\n const setDocumentTopic = (param: any) => {\r\n setManageProjectStore((prevState) => ({\r\n ...prevState,\r\n documentTopic: param,\r\n }))\r\n }\r\n const setParameterForSave = (param: any) => {\r\n setManageProjectStore((prevState) => ({\r\n ...prevState,\r\n parameterForSave: param,\r\n }))\r\n }\r\n const setUpdaterPage = (param: ManageProjectStoreType['currentPageUpdater']) => {\r\n setManageProjectStore((prevState) => ({\r\n ...prevState,\r\n currentPageUpdater: param,\r\n }))\r\n }\r\n const clearStore = () => {\r\n setManageProjectStore((prevState) => ({\r\n ...prevState,\r\n projectData: null,\r\n documentTopic: null,\r\n parameterForSave: null,\r\n currentPageUpdater: null,\r\n }))\r\n }\r\n return { setState, setProjectData, setDocumentTopic, setParameterForSave, clearStore, setUpdaterPage }\r\n}\r\n\r\nexport default useManageProjectAction\r\n","enum considerType {\r\n fullBoard = 1, //แบบเต็มขั้นตอน\tFull Board\r\n expedited = 2, //แบบลดขั้นตอน\tExpedited\r\n exempt = 3, //แบบยกเว้น\tExempt\r\n}\r\nexport default considerType\r\n","import React, { useEffect } from 'react'\r\nimport * as Constants from '../../../constants/constants'\r\n\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useCheckPermission from '../../../utilities/checkPermission'\r\nimport useWebService from '../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../services/web/types/responseWebServiceTypes'\r\nimport _ from 'lodash'\r\nimport constProjectStatus from '../../../constants/projectStatus'\r\nimport constConsiderType from '../../../constants/considerType'\r\n\r\nexport type OptType = {\r\n label?: string\r\n value?: string\r\n}\r\n\r\nexport type CommitteeType = {\r\n director: OptType\r\n role: OptType\r\n}\r\ntype loadTabType = {\r\n tabList: AppFolderAndTabStore.appFolderAndTabStoreType['tabRenderList'] | null\r\n selectTab: AppFolderAndTabStore.appFolderAndTabStoreType['tabSelected'] | null\r\n tabIndexSelected: AppFolderAndTabStore.appFolderAndTabStoreType['tabIndexSelected']\r\n}\r\n\r\nexport default () => {\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const callWebService = useWebService()\r\n\r\n const checkPermission = useCheckPermission()\r\n\r\n const getProjectFolderByID = async (projectID: number) => {\r\n const { result } = await callWebService.getProjectFolder(projectID)\r\n\r\n if (result && result.folders && result.folders.length > 0) {\r\n const projectFolder = result.folders.map((itm: any, index: number) => {\r\n return {\r\n ...itm,\r\n id: itm.submittedID,\r\n isLastProcess: index === 0 ? true : false,\r\n }\r\n })\r\n\r\n return projectFolder\r\n }\r\n\r\n return []\r\n }\r\n\r\n const getCommentDirector = (projectInfo: RESWebServiceTypes.GetProjectResultType | null) => {\r\n //#refactor projectdata\r\n const committeeInfo = projectInfo?.committeeInfo.map((item: any) => {\r\n return {\r\n director:\r\n item.fullUsername_th && item.userID\r\n ? { label: item.fullUsername_th, value: item.userID.toString() }\r\n : {},\r\n role:\r\n item.projectRoleInfo?.nameTH && item.projectRoleInfo?.value\r\n ? { label: item.projectRoleInfo.nameTH, value: item.projectRoleInfo.value.toString() }\r\n : {},\r\n }\r\n })\r\n //หาว่าคนที่login เข้ามามีหน้าที่อะไรในส่วนของบันทึกข้อคิดเห็นของกรรมการ\r\n const roleDirector = committeeInfo?.find(\r\n (element: any) => element.director.value === authenStore.profile?.userId?.toString(),\r\n )\r\n // ถ้ากรรมการที่ เข้ามามีหน้าที่เป็นกรรมการลงความเห็นในโปรเจคนี้ให้ set state เป็น true\\\r\n let isCommiteeHavePermission = false\r\n if (roleDirector || checkPermission.isUserChairman()) {\r\n // setPresidentMustSave(true)\r\n isCommiteeHavePermission = true\r\n } else {\r\n // setPresidentMustSave(false)\r\n isCommiteeHavePermission = false\r\n }\r\n\r\n return {\r\n isCommiteeHavePermission,\r\n }\r\n }\r\n\r\n const getProjectByID = async (projectID?: number, submittedID?: number) => {\r\n if (projectID && submittedID) {\r\n const { result } = await callWebService.getProjectByID(Number(projectID), Number(submittedID)) // Number(55), Number(55) //#hardcode\r\n await manageProjectAction.setProjectData(result)\r\n return result\r\n }\r\n }\r\n\r\n const chkExistCustomFolder = (appFolderAndTab: typeof appFolderAndTabStore) => {\r\n const customFolderOnly = _.omit(Constants.customFolder, ['docAdditional']) //docAdditional is folderAction\r\n const lstCustomFolderID: Array = Object.keys(customFolderOnly).map((key) => {\r\n const lstCustomFolder = customFolderOnly as any\r\n return Number(lstCustomFolder[key].id)\r\n })\r\n\r\n const haveFolderCustom: boolean = lstCustomFolderID.indexOf(appFolderAndTab.folderList?.[0]?.id ?? NaN) !== -1\r\n\r\n const filterCustomFolder = appFolderAndTab.folderList?.filter(\r\n (itm) => lstCustomFolderID.indexOf(itm?.id ?? NaN) !== -1,\r\n )\r\n return {\r\n haveFolderCustom: haveFolderCustom,\r\n lstCustomFolder: filterCustomFolder,\r\n }\r\n }\r\n const isCustomFolder = (selectedFolderID: number) => {\r\n const lstCustomFolderID: Array = Object.keys(Constants.customFolder).map((key) => {\r\n const lstCustomFolder = Constants.customFolder as any\r\n return Number(lstCustomFolder[key].id)\r\n })\r\n const isCustomFolder: boolean = lstCustomFolderID.indexOf(selectedFolderID ?? NaN) !== -1\r\n return isCustomFolder\r\n }\r\n const isActionFolder = (id: number) => {\r\n let valid: boolean = false\r\n if (id === Constants.customFolder.docAdditional.id) {\r\n return true\r\n }\r\n\r\n return valid\r\n }\r\n const loadCustomFolder = (appFolderAndTab: typeof appFolderAndTabStore) => {\r\n let lstCustomFolder: Array = []\r\n const chkCustomFolderInfo = chkExistCustomFolder(appFolderAndTab)\r\n if (chkCustomFolderInfo.haveFolderCustom) {\r\n lstCustomFolder = chkCustomFolderInfo.lstCustomFolder\r\n }\r\n return lstCustomFolder\r\n }\r\n const loadActionFolder = (\r\n projectInfo: RESWebServiceTypes.GetProjectResultType | null,\r\n appFolderAndTab: typeof appFolderAndTabStore,\r\n ) => {\r\n const isProjectStatusComplete: boolean = projectInfo?.projectStatusInfo?.value === constProjectStatus.completed\r\n\r\n let actionFolderList: Array = []\r\n const chkCustomFolder = chkExistCustomFolder(appFolderAndTab)\r\n if (isProjectStatusComplete && !chkCustomFolder.haveFolderCustom) {\r\n if (checkPermission.isUserAdmin() || checkPermission.isUserResearcher()) {\r\n //Folder Action ยื่นเอกสารเพิ่มพิจารณา\r\n actionFolderList = [...actionFolderList, Constants.customFolder.docAdditional]\r\n }\r\n }\r\n\r\n return actionFolderList\r\n }\r\n const loadFolder = (\r\n folder: any,\r\n projectInfo: RESWebServiceTypes.GetProjectResultType | null,\r\n appFolderAndTab: typeof appFolderAndTabStore,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n let selectedFolder = appFolderAndTab.folderSelected?.id ? appFolderAndTab.folderSelected : null\r\n\r\n if (selectedFolder === null) {\r\n const linkFolder = folder?.filter((itm: any) => {\r\n return itm?.submittedID === projectInfo?.submittedID\r\n })\r\n\r\n if (linkFolder?.length > 0) {\r\n selectedFolder = linkFolder[0]\r\n } else {\r\n selectedFolder = folder[0]\r\n }\r\n }\r\n\r\n if (ignoreCustomFolder) {\r\n selectedFolder = folder[0]\r\n }\r\n\r\n const actionFolder = loadActionFolder(projectInfo, appFolderAndTab)\r\n const customFolder = ignoreCustomFolder ? [] : loadCustomFolder(appFolderAndTab)\r\n\r\n const mergeFolder = [...customFolder, ...folder, ...actionFolder]\r\n\r\n const highlightFolder = mergeFolder.map((itm: any) => ({\r\n ...itm,\r\n isLastProcess: itm.id === selectedFolder?.id,\r\n }))\r\n\r\n return {\r\n lstFolder: highlightFolder,\r\n selectFolder: selectedFolder as AppFolderAndTabStore.FolderType,\r\n }\r\n }\r\n\r\n const loadCustomTab = (selectedFolder: AppFolderAndTabStore.FolderType) => {\r\n let returnVal: loadTabType = {\r\n tabList: [],\r\n selectTab: null,\r\n tabIndexSelected: 0,\r\n }\r\n\r\n // if (selectedFolder.id === Constants.customFolder.closeProject.id) {\r\n // //custom Tab ปิดโครงการ\r\n // returnVal = {\r\n // tabList: [Constants.menuTab.tab21],\r\n // selectTab: Constants.menuTab.tab21,\r\n // tabIndexSelected: 0,\r\n // }\r\n // }\r\n // else if (selectedFolder.id === Constants.customFolder.projectAmendment.id) {\r\n // //แก้ไขโครงการ\r\n // returnVal = {\r\n // tabList: [Constants.menuTab.tab21],\r\n // selectTab: Constants.menuTab.tab21,\r\n // tabIndexSelected: 0,\r\n // }\r\n // }\r\n returnVal = {\r\n tabList: [Constants.menuTab.tab21],\r\n selectTab: Constants.menuTab.tab21,\r\n tabIndexSelected: 0,\r\n }\r\n\r\n return returnVal\r\n }\r\n\r\n const loadTab = (\r\n projectInfo: RESWebServiceTypes.GetProjectResultType | null,\r\n selectedFolder: AppFolderAndTabStore.FolderType,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n let returnVal: loadTabType = {\r\n tabList: [],\r\n selectTab: null,\r\n tabIndexSelected: 0,\r\n }\r\n\r\n if (!ignoreCustomFolder && isCustomFolder(selectedFolder.id as number)) {\r\n returnVal = loadCustomTab(selectedFolder)\r\n } else {\r\n let isNothaveCommitee: boolean\r\n if (\r\n projectInfo?.considerInfo &&\r\n projectInfo?.considerInfo.value === constConsiderType.exempt &&\r\n projectInfo?.committeeInfo.length === 0\r\n ) {\r\n isNothaveCommitee = true\r\n } else {\r\n isNothaveCommitee = false\r\n }\r\n // //กรณีที่เซตกรรมการ และกรรมการมีหน้าที่ ผู้ทบทวนหลัก + layperson เท่านั้น\r\n const { isCommiteeHavePermission } = getCommentDirector(projectInfo)\r\n const isDisapprove = false\r\n const hideTabCommitteeComment = isNothaveCommitee\r\n const { tabRenderList } = checkPermission.getTabRenderList(\r\n projectInfo?.submittedStatusInfo?.value,\r\n selectedFolder,\r\n hideTabCommitteeComment,\r\n isDisapprove,\r\n isCommiteeHavePermission,\r\n projectInfo as RESWebServiceTypes.GetProjectResultType,\r\n )\r\n\r\n let currentTabIndex = tabRenderList.length - 1\r\n // tabRenderList.every((itm, idx) => {\r\n // if (appFolderAndTabStore.tabSelected?.stepID === itm.stepID) {\r\n // currentTabIndex = idx\r\n // return false\r\n // }\r\n // return true\r\n // })\r\n returnVal = {\r\n tabList: tabRenderList,\r\n selectTab: tabRenderList[currentTabIndex],\r\n tabIndexSelected: currentTabIndex,\r\n }\r\n }\r\n\r\n return returnVal\r\n }\r\n\r\n const createProjectLoadTabAndFolder = () => {\r\n const selectedFolder = Constants.customFolder.createProject\r\n const { tabRenderList } = checkPermission.getTabRenderList(null, selectedFolder)\r\n const { folderRenderList } = checkPermission.getFolderRenderList(null)\r\n const folderList: Array = folderRenderList\r\n\r\n appFolderAndTabAction.setState({\r\n folderList: folderList,\r\n folderSelected: selectedFolder,\r\n tabRenderList: tabRenderList,\r\n tabSelected: tabRenderList[0],\r\n tabIndexSelected: 0,\r\n })\r\n }\r\n\r\n const getFolderAndProject = async (projectID: number, submittedID: number | null, isLoadProjectData: boolean) => {\r\n let returnVal: {\r\n projectInfo: RESWebServiceTypes.GetProjectResultType | null\r\n folderInfo: any\r\n } = {\r\n projectInfo: null,\r\n folderInfo: [],\r\n }\r\n\r\n if (projectID) {\r\n let lstService = [getProjectFolderByID(projectID)]\r\n if (isLoadProjectData) {\r\n if (submittedID) {\r\n lstService = [...lstService, getProjectByID(projectID, submittedID)]\r\n const response = await Promise.all(lstService)\r\n let prjFolder: Array = []\r\n let projectInfo: RESWebServiceTypes.GetProjectResultType | undefined\r\n prjFolder = response?.[0] ?? []\r\n if (response?.[1]) {\r\n projectInfo = response?.[1]\r\n }\r\n\r\n returnVal = {\r\n projectInfo: projectInfo ?? null,\r\n folderInfo: prjFolder,\r\n }\r\n } else {\r\n const loadSequence = new Promise(async (resolve) => {\r\n const prjFolder = await getProjectFolderByID(projectID)\r\n let projectInfo: RESWebServiceTypes.GetProjectResultType | undefined\r\n if (prjFolder.length > 0) {\r\n const latestSubmittedID = prjFolder?.[0]?.submittedID\r\n if (latestSubmittedID) {\r\n projectInfo = await getProjectByID(projectID, latestSubmittedID)\r\n }\r\n }\r\n\r\n resolve({\r\n projectInfo: projectInfo ?? null,\r\n folderInfo: prjFolder,\r\n })\r\n })\r\n\r\n returnVal = await loadSequence\r\n }\r\n } else {\r\n const prjFolder = await getProjectFolderByID(projectID)\r\n returnVal = { projectInfo: null, folderInfo: prjFolder }\r\n }\r\n }\r\n return returnVal\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n projectData: RESWebServiceTypes.GetProjectResultType | null,\r\n appFolderAndTab: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const currentProjectID = projectData?.projectID\r\n let currentSubmittedID = projectData?.submittedID ?? null\r\n\r\n if (currentProjectID) {\r\n let newProjectInfo: RESWebServiceTypes.GetProjectResultType | null = projectData ?? null\r\n let projectFolder = []\r\n\r\n if (ignoreCustomFolder) {\r\n currentSubmittedID = null //เป็น null จะได้ข้อมูลของ Folder ล่าสุด\r\n }\r\n const infoFolderAndProject = await getFolderAndProject(\r\n currentProjectID,\r\n currentSubmittedID ?? null,\r\n isReloadProjectData,\r\n )\r\n if (isReloadProjectData) {\r\n newProjectInfo = infoFolderAndProject.projectInfo\r\n }\r\n projectFolder = infoFolderAndProject.folderInfo\r\n if (newProjectInfo && projectFolder.length > 0) {\r\n const folderInfo = loadFolder(projectFolder, newProjectInfo, appFolderAndTab, ignoreCustomFolder)\r\n\r\n const tabInfo = loadTab(newProjectInfo, folderInfo.selectFolder, ignoreCustomFolder)\r\n\r\n appFolderAndTabAction.setState({\r\n tabRenderList: tabInfo.tabList as AppFolderAndTabStore.appFolderAndTabStoreType['tabRenderList'],\r\n tabSelected: tabInfo.selectTab as AppFolderAndTabStore.appFolderAndTabStoreType['tabSelected'],\r\n tabIndexSelected: tabInfo.tabIndexSelected,\r\n folderList: folderInfo.lstFolder,\r\n folderSelected: folderInfo.selectFolder,\r\n })\r\n }\r\n }\r\n }\r\n\r\n const setTab = (tabIndex: number, newTabSelected: AppFolderAndTabStore.TabSelectedType) => {\r\n const newTabId = newTabSelected.id === 0\r\n const isClose = manageProjectStore.projectData?.submitTypeInfo?.value === 17\r\n\r\n if (tabIndex === 0 && isClose && newTabId) {\r\n const newData = {\r\n ...newTabSelected,\r\n id: 21,\r\n }\r\n appFolderAndTabAction.setSeletedTab(newData)\r\n } else {\r\n appFolderAndTabAction.setSeletedTab(newTabSelected)\r\n }\r\n\r\n appFolderAndTabAction.setSeletedTabIndex(tabIndex)\r\n appFolderAndTabAction.resetTabDirty() //clear dirty\r\n\r\n const currentProjectID = manageProjectStore.projectData?.projectID\r\n const currentSubmittedID = manageProjectStore.projectData?.submittedID\r\n if (currentProjectID && currentSubmittedID) {\r\n getProjectByID(currentProjectID, currentSubmittedID)\r\n }\r\n }\r\n\r\n const reloadProjectData = async (currentProjectID?: number, currentSubmittedID?: number) => {\r\n const projectID = currentProjectID ?? manageProjectStore.projectData?.projectID\r\n const submittedID = currentSubmittedID ?? manageProjectStore.projectData?.submittedID\r\n if (projectID && submittedID) {\r\n const reloadResponse = await getFolderAndProject(projectID, submittedID ?? null, true)\r\n const tabs = loadTab(reloadResponse.projectInfo, appFolderAndTabStore.folderSelected)\r\n tabs.tabList && appFolderAndTabAction.setTabRenderList(tabs.tabList)\r\n }\r\n }\r\n\r\n return {\r\n isCustomFolder,\r\n isActionFolder,\r\n createProjectLoadTabAndFolder,\r\n loadTabAndFolder,\r\n setTab,\r\n getProjectByID,\r\n reloadProjectData,\r\n }\r\n}\r\n","import React from 'react'\r\nimport * as closeProjectOfficerType from './closeProjectOfficerType'\r\n\r\nconst useCloseProjectOfficer = (props: closeProjectOfficerType.UseCloseProjectOfficerFormType) => {\r\n const {} = props\r\n\r\n React.useEffect(() => {}, [])\r\n\r\n return {}\r\n}\r\n\r\nexport default useCloseProjectOfficer\r\n","import * as closeProjectOfficerType from './closeProjectOfficerType'\r\nimport useCloseProjectOfficer from './useCloseProjectOfficer'\r\nimport Button from '../../../../../control/button/button'\r\nimport MyTextfield from '../../../../../control/textfield/textfield'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { Grid, useMediaQuery, useTheme } from '@material-ui/core'\r\nimport { Form } from 'react-final-form'\r\nimport React from 'react'\r\n\r\n//View\r\nconst CloseProjectOfficerFormView = (props: closeProjectOfficerType.CloseProjectOfficerFormViewType) => {\r\n const { onClickSave, onClickClose } = props\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('sm'))\r\n\r\n return (\r\n \r\n {(props) => {\r\n const { handleSubmit } = props\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst CloseProjectOfficerForm = (props: closeProjectOfficerType.CloseProjectOfficerFormType) => {\r\n const closeProjectOfficerFormModel = useCloseProjectOfficer(props)\r\n return \r\n}\r\nexport default CloseProjectOfficerForm\r\n","import React from 'react'\r\nimport useAppFolderAndTabStore from '../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore, { ManageProjectStoreType } from '../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../stores/manageProject/useManageProjectAction'\r\nimport useWebService from '../../../../services/web/useWebService'\r\nconst useDisplayUpdater = () => {\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const projectStore = useManageProjectStore()\r\n const projectAction = useManageProjectAction()\r\n const webService = useWebService()\r\n\r\n React.useEffect(() => {\r\n const stepID = appFolderAndTabStore?.tabSelected?.stepID\r\n const projectID = projectStore?.projectData?.projectID\r\n const submittedID = projectStore?.projectData?.submittedID\r\n\r\n // const getUpdater = async () => {\r\n // if (projectID && submittedID && stepID) {\r\n // const res = await webService.getProjectPageUpdater(projectID, submittedID, stepID)\r\n // console.log(`res update date>>`, res)\r\n // const saveUpdater: ManageProjectStoreType['currentPageUpdater'] = res.result\r\n // ? {\r\n // name_th: res.result.name_th,\r\n // name_en: res.result.name_en,\r\n // date: res.result.date,\r\n // }\r\n // : null\r\n // projectAction.setUpdaterPage(saveUpdater)\r\n // }\r\n // }\r\n\r\n // getUpdater()\r\n if (projectID && submittedID && stepID) {\r\n getUpdater(submittedID, projectID, stepID)\r\n }\r\n }, [projectStore?.projectData?.submittedID, appFolderAndTabStore?.tabSelected?.stepID])\r\n\r\n const getUpdater = async (submittedID: number, projectID: number, stepID: number) => {\r\n if (projectID && submittedID && stepID) {\r\n const res = await webService.getProjectPageUpdater(projectID, submittedID, stepID)\r\n // console.log(`res update date>>`, res)\r\n const saveUpdater: ManageProjectStoreType['currentPageUpdater'] = res.result\r\n ? {\r\n name_th: res.result.name_th,\r\n name_en: res.result.name_en,\r\n date: res.result.date,\r\n }\r\n : null\r\n projectAction.setUpdaterPage(saveUpdater)\r\n }\r\n }\r\n return { getUpdater }\r\n}\r\n\r\nexport default useDisplayUpdater\r\n","enum approveStatusREC1 {\r\n approve = 1, //อนุมัติ\r\n deferment = 2, //รอการตัดสิน\r\n disapprove = 3, //ไม่อนุมัติ\r\n minor2Week = 4, //แก้ไขเล็กน้อย (2 สัปดาห์\r\n minor4Week = 6, //แก้ไขเล็กน้อย (4 สัปดาห์\r\n postpone = 7, //ขยายเวลาพิจารณา\r\n approveWithComment = 8, //อนุมัติ แบบมีข้อคิดเห็น\r\n approveForContiueResearch = 9, //อนุมัติให้ดำเนินการวิจัยต่อเนื่อง\r\n approveForContiueResearchWhenEdited = 10, //อนุมัติให้ดำเนินการวิจัยต่อเนื่องเมื่อแก้ไขหรือเพิ่มเติมข้อมูลแล้ว\r\n intoConsideration = 11, //นำเข้าพิจารณาในที่ประชุมคณะกรรมการฯ\r\n acknowledgeAndDonotTakeAnyaAction = 12, //รับทราบ และไม่ต้องดำเนินการใดๆ\r\n improveAndFix = 13, //ให้ปรับปรุงแก้ไขระเบียบวิธีการดำเนินการวิจัย และเอกสารข้อมูลฯ\r\n cautionCarefully = 14, //ตักเตือนให้นักวิจัยเพิ่มความรอบคอบ\r\n suspensionOrTermination = 15, //ระงับโครงการวิจัยชั่วคราว (Suspension) หรือยุติโครงการวิจัยก่อนกำหนด (Termination)\r\n revision = 16, //แก้ไข\r\n}\r\n\r\nenum approveStatusREC2 {\r\n minor3Week = 5, //แก้ไขเล็กน้อย (3 สัปดาห์\r\n approve = 17, //อนุมัติ\r\n disapprove = 18, //ไม่อนุมัติ\r\n\r\n minor2Week = 19, //แก้ไขเล็กน้อย (2 สัปดาห์)\r\n minor4Week = 20, //แก้ไขเล็กน้อย (4 สัปดาห์)\r\n approveWithComment = 21, //อนุมัติ แบบมีข้อคิดเห็น\r\n approveForContiueResearch = 22, //อนุมัติให้ดำเนินการวิจัยต่อเนื่อง\r\n approveForContiueResearchWhenEdited = 23, //อนุมัติให้ดำเนินการวิจัยต่อเนื่องเมื่อแก้ไขหรือเพิ่มเติมข้อมูลแล้ว\r\n\r\n intoConsideration = 24, //นำเข้าพิจารณาในที่ประชุมคณะกรรมการฯ\r\n acknowledgeAndDonotTakeAnyaAction = 25, //รับทราบ และไม่ต้องดำเนินการใดๆ\r\n\r\n improveAndFix = 26, //ให้ปรับปรุงแก้ไขระเบียบวิธีการดำเนินการวิจัย และเอกสารข้อมูลฯ\r\n cautionCarefully = 27, //ตักเตือนให้นักวิจัยเพิ่มความรอบคอบ\r\n suspensionOrTermination = 28, //ระงับโครงการวิจัยชั่วคราว (Suspension) หรือยุติโครงการวิจัยก่อนกำหนด (Termination)\r\n revision = 29, //แก้ไข\r\n}\r\nexport { approveStatusREC1, approveStatusREC2 }\r\n","import { approveStatusREC1, approveStatusREC2 } from '../../../constants/approveStatus'\r\nimport * as Constants from '../../../constants/constants'\r\nimport constSubmittedType from '../../../constants/submittedType'\r\nimport * as RESServiceType from '../../../services/web/types/responseWebServiceTypes'\r\nconst useProjectHook = () => {\r\n const isEditAfterReview = (\r\n projectInfo:\r\n | Partial>\r\n | undefined,\r\n ) => {\r\n let isFlowEditAfterReview = false\r\n const hasPreviousFolder: boolean = projectInfo?.aroundSubmittedIDInfo?.previousSubmittedID !== null //มี Folder ก่อนหน้า\r\n const isSubmittedTypeNewProject: boolean =\r\n constSubmittedType.firstSubmitConsideration === projectInfo?.submitTypeInfo?.value //ยื่นโครงการใหม่\r\n const isSubmittedTypeEditAfterReview: boolean =\r\n constSubmittedType.editAfterReview === projectInfo?.submitTypeInfo?.value //แก้ไขหลังพิจารณา\r\n\r\n if (hasPreviousFolder && (isSubmittedTypeNewProject || isSubmittedTypeEditAfterReview)) {\r\n isFlowEditAfterReview = true\r\n }\r\n\r\n return isFlowEditAfterReview\r\n }\r\n\r\n const isSynthesisApproveWithComment = (\r\n projectInfo: Partial> | undefined,\r\n ) => {\r\n const isAWC: boolean =\r\n approveStatusREC1.approveWithComment === projectInfo?.synthesisApproveStatusInfo?.value ||\r\n approveStatusREC2.approveWithComment === projectInfo?.synthesisApproveStatusInfo?.value\r\n\r\n return isAWC\r\n }\r\n\r\n const isFlowApproveWithComment = (\r\n projectInfo: Partial> | undefined,\r\n ) => {\r\n return projectInfo?.isFlowApproveWithComment ?? false\r\n }\r\n\r\n return {\r\n isEditAfterReview,\r\n isSynthesisApproveWithComment,\r\n isFlowApproveWithComment,\r\n }\r\n}\r\n\r\nexport default useProjectHook\r\n","import React from 'react'\r\nimport * as requestFormType from './newProjectType'\r\n\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\n\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport { topicForLecturer, topicForStudent } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\n\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport * as REQServiceTypes from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport _ from 'lodash'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport { encryptionAES } from '../../../../../../utilities/encryption'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { ResultDocumentTopicLut } from '../../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport useProjectHook from '../../../../shareLogic/useProjectHook'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport { AnyAaaaRecord } from 'dns'\r\n\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: any\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\n\r\ntype MyFileDataType = {\r\n documentTopicID?: number\r\n fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }>\r\n subtopic?: {\r\n subtopicID: number\r\n page: number | string\r\n }[]\r\n}\r\n\r\nconst useRequestForm = (props: requestFormType.UseRequestFormType) => {\r\n const { formMode, projectSubmittedTypeID, isViewMode, initialData, onSaveComplete } = props\r\n\r\n const translate = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const projectHook = useProjectHook()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const checkPermission = useCheckPermission()\r\n\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n\r\n const { profile } = authenStore\r\n\r\n const { configLoading, loadingClose, loadingOpen } = useLoading()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const callLookup = useLookupService()\r\n const [selectedIrb, setSelectedIrb] = React.useState('1')\r\n\r\n const dialogTwoRef = React.useRef>()\r\n const projectIDRef = React.useRef()\r\n const submittedIDRef = React.useRef()\r\n const irbRef = React.useRef()\r\n const parameterForSaveRef = React.useRef()\r\n const submitValueRef = React.useRef()\r\n const isDraftRef = React.useRef(false)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const { documentTopic } = manageProjectStore\r\n const researcherTypeRef = React.useRef()\r\n const documentTopicRef = React.useRef()\r\n const valuesForm = React.useRef()\r\n const tabSelectedIndexRef = React.useRef(null)\r\n const newTabSelectedRef = React.useRef(null)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n const [initialDataValue, setInitialDataValue] = React.useState()\r\n\r\n let isApproveWithComment = false\r\n if (manageProjectStore.projectData) {\r\n isApproveWithComment = projectHook.isFlowApproveWithComment(manageProjectStore.projectData)\r\n }\r\n\r\n React.useEffect(() => {\r\n console.log('####Page: New Project####')\r\n if (manageProjectStore.projectData?.irb) {\r\n const rec = manageProjectStore.projectData.irb.toString()\r\n handleChangeFaculty(rec)\r\n } else if (profile.userId && !profile.isCunet) {\r\n const rec = '1'\r\n handleChangeFaculty(rec)\r\n }\r\n return () => {\r\n //clear ค่า tabRef\r\n tabSelectedIndexRef.current = null\r\n newTabSelectedRef.current = null\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData?.irb && manageProjectStore.projectData?.submitTypeInfo.value) {\r\n getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n manageProjectStore.projectData?.submitTypeInfo.value,\r\n )\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n React.useEffect(() => {\r\n createInitialValue()\r\n }, [initialData])\r\n\r\n const createInitialValue = () => {\r\n const initialDataForm = {\r\n ...initialData,\r\n isDr: initialData?.isDr ?? profile.isPhD,\r\n nameTH: initialData?.nameTH ?? profile.only_name_th,\r\n nameEN: initialData?.nameEN ?? profile.only_name_en,\r\n mobilePhone: initialData?.mobilePhone ?? profile.mobilePhone,\r\n email: initialData?.email ?? profile.email,\r\n academicPosition: initialData?.academicPosition ?? profile.academicPositionID?.toString(),\r\n titleName: initialData?.titleName ?? profile.titleNameID?.toString(),\r\n otherTitleNameEN:\r\n initialData?.otherTitleNameEN || initialData?.otherTitleNameEN === null\r\n ? initialData.otherTitleNameEN\r\n : profile.titleNameID\r\n ? profile.titleNameOther_en\r\n : null,\r\n otherTitleNameTH:\r\n initialData?.otherTitleNameTH || initialData?.otherTitleNameTH === null\r\n ? initialData.otherTitleNameTH\r\n : profile.titleNameID\r\n ? profile.titleNameOther_th\r\n : null,\r\n otherAcademicPositionTH:\r\n initialData?.otherAcademicPositionTH || initialData?.otherAcademicPositionTH === null\r\n ? initialData.otherAcademicPositionTH\r\n : profile.academicPositionID\r\n ? profile.academicPositionOther_th\r\n : null,\r\n otherAcademicPositionEN:\r\n initialData?.otherAcademicPositionEN || initialData?.otherAcademicPositionEN === null\r\n ? initialData.otherAcademicPositionEN\r\n : profile.academicPositionID\r\n ? profile.academicPositionOther_en\r\n : null,\r\n }\r\n if (initialData?.IRB?.value) {\r\n researcherTypeRef.current = initialData?.IRB?.value\r\n }\r\n setInitialDataValue(initialDataForm)\r\n }\r\n\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n // const fileTokenInfo: Array = uploadObj.uploadFileObj.fileList?.map((file) => file.fileToken) ?? []\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: number\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n\r\n const getParameterForSave = (value: requestFormType.MyRequestFormType) => {\r\n let submittedTypeID = projectSubmittedTypeID\r\n if (manageProjectStore && manageProjectStore?.projectData) {\r\n if (manageProjectStore.projectData.submitTypeInfo && manageProjectStore.projectData.submitTypeInfo?.value) {\r\n submittedTypeID = manageProjectStore.projectData.submitTypeInfo?.value\r\n }\r\n }\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = {\r\n projectID: manageProjectStore?.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore?.projectData?.submittedID ?? null,\r\n irb: value.IRB ? parseInt(value.IRB.value) : null, //parseInt(value?.faculty?.irb) || null\r\n userID: profile.userId as number,\r\n projectName_th: value?.projectNameTH || null,\r\n projectName_en: value?.projectNameEN || null,\r\n // projectSubmitTypeID: value?.isPhase ? parseInt(value.isPhase) : null, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n projectSubmitTypeID: submittedTypeID, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n\r\n facultyID: value.faculty ? parseInt(value.faculty.value) : null,\r\n requestPhase: value.numPhase ? value.numPhase : null,\r\n isTools: value.isPhase === '2' ? (value.isTools === '2' ? true : false) : null,\r\n researcherTypeID: value.researcherType ? parseInt(value.researcherType.value) : null,\r\n titleNameID: value.titleName ? parseInt(value.titleName) : null,\r\n titleNameOther_th: value.otherTitleNameTH ? value.otherTitleNameTH : null,\r\n titleNameOther_en: value.otherTitleNameEN ? value.otherTitleNameEN : null,\r\n academicPositionID:\r\n value.researcherType.value !== '1' && value.academicPosition ? parseInt(value.academicPosition) : null,\r\n academicPositionOther_th:\r\n value.researcherType.value !== '1' && value.otherAcademicPositionTH\r\n ? value.otherAcademicPositionTH\r\n : null,\r\n academicPositionOther_en:\r\n value.researcherType.value !== '1' && value.otherAcademicPositionEN\r\n ? value.otherAcademicPositionEN\r\n : null,\r\n educationLevelID:\r\n value.researcherType.value === '1' && value.educationLevel\r\n ? parseInt(value.educationLevel.value)\r\n : null,\r\n researcherName_th: value.nameTH ? value.nameTH : null,\r\n researcherName_en: value.nameEN ? value.nameEN : null,\r\n email: value.email ? value.email : null,\r\n homePhone: value.homePhone ? value.homePhone : null,\r\n mobilePhone: value.mobilePhone ? value.mobilePhone : null,\r\n fax: value.fax ? value.fax : null,\r\n isDraft: value?.submitType === 'save' ? false : true,\r\n documentInfo: getDocumentInfo(value),\r\n isLanguage_th: value.langTH ? value.langTH : false,\r\n isLanguage_en: value.langEN ? value.langEN : false,\r\n isRequestCertificatePaper: value.isCertificatePaperList === '1' ? true : false,\r\n isDr: value.researcherType.value !== '1' && value.isDr ? value.isDr : false,\r\n }\r\n\r\n return parameterForSave\r\n }\r\n\r\n const handleClickSubmit = (value: requestFormType.MyRequestFormType) => {\r\n submitValueRef.current = value\r\n\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(value)\r\n parameterForSaveRef.current = parameterForSave\r\n console.log('parameterForSave ::: ', parameterForSave)\r\n switch (value.submitType) {\r\n case 'save':\r\n // code block\r\n isDraftRef.current = false\r\n handleSave()\r\n break\r\n case 'draft':\r\n // code block\r\n isDraftRef.current = true\r\n handleSaveDraft()\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n const checkRequirePDF = (documentInfo: MyFileDataType[]) => {\r\n let isRequirePDF = false\r\n\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if (documentInfo[i]?.fileTokenInfo[j].fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n const validateRequiredUploadFile = (uploadFile: Array<{ uploadFileObj: any }>, skipValidate: boolean = false) => {\r\n let isValid = true\r\n if (!skipValidate) {\r\n uploadFile?.every(({ uploadFileObj: file }) => {\r\n if (file?.isRequired && file?.fileList?.length === 0) {\r\n //เป็นหัวข้อที่มีการ required แต่ว่าไม่ upload เอกสาร\r\n isValid = false\r\n return false //break\r\n }\r\n return true //continue\r\n })\r\n\r\n if (!isValid) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get2Element('ALERT.CONTENT.PLEASE_UPLOAD_REQUIRED_TOPIC', [\r\n '',\r\n ]) as any,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n return isValid\r\n }\r\n const handleSave = async () => {\r\n if (validateRequiredUploadFile(submitValueRef.current.uploadFile)) {\r\n if (parameterForSaveRef.current?.documentInfo?.length === 0) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n const isRequirePDF = checkRequirePDF(parameterForSaveRef.current?.documentInfo)\r\n const isEmptyPage = checkSubtopic(parameterForSaveRef.current?.documentInfo)\r\n\r\n if (isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else if (isEmptyPage) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.PLEASE_COMPLETE_PAGE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE_WITH_NOTI'),\r\n type: 'alert-confirm',\r\n onClickConfirm: handleClickConfirmSave,\r\n })\r\n }\r\n }\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const checkSubtopic = (documentInfo: MyFileDataType[]) => {\r\n let isEmptyPage = false\r\n\r\n //หาว่าหัวข้ออัปโหลดเอกสารมีให้อัปโหลดหัวข้อย่อยมั้ย\r\n const docTopic = manageProjectStore.documentTopic?.filter((item) => item.subtopic.length > 0)\r\n\r\n //ถ้ามีให้เข้าไปเช็คตามเงื่อนไข if\r\n if (docTopic?.length) {\r\n // วน loop หัวข้อที่มีให้อัปโหลดเอกสารหัวข้อย่อย\r\n docTopic.forEach((mainTopic) => {\r\n // วน loop หัวข้อที่มีการอัปโหลดเอกสารเข้ามา\r\n documentInfo.forEach((itm) => {\r\n // เช็คว่าเอกสารที่มีการอัปโหลดเข้ามาใช่เอกสารที่มีหัวข้อย่อยให้อัปโหลดหรือป่าว\r\n if (mainTopic.id === itm.documentTopicID) {\r\n // เช็คว่าหัวข้อย่อยที่อัพโหลดเข้ามาครบมั้ย\r\n if (itm.subtopic?.length != mainTopic.subtopic.length) {\r\n isEmptyPage = true\r\n } else {\r\n // เช็คว่าที่อัปมาครบมีช่องไหนกรอกเป็น ช่องว่างมั้ย\r\n const chkEmpty = itm.subtopic.find(\r\n (e) => e.page == null || e.page == '' || e.page == undefined,\r\n )\r\n if (chkEmpty) {\r\n isEmptyPage = true\r\n }\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n return isEmptyPage\r\n }\r\n\r\n const handleSaveDraft = async () => {\r\n handleClickConfirmSave()\r\n }\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const handleClickConfirmSave = async () => {\r\n try {\r\n loadingOpen()\r\n let res\r\n if (isApproveWithComment) {\r\n const parameterEditAfterReview = _.pick(parameterForSaveRef.current, [\r\n 'documentInfo',\r\n 'isDraft',\r\n 'projectID',\r\n 'submittedID',\r\n ])\r\n res = await callWebService.projectApproveWithComment(parameterEditAfterReview)\r\n } else {\r\n //Flow ยื่นโครงการใหม่ + Flow แก้ไขหลังพิจารณา\r\n res = await callWebService.createNewProject(parameterForSaveRef.current)\r\n }\r\n\r\n setConfigDialog({}) //clear function dialog\r\n dialogTwoRef.current?.closeDialog()\r\n if (formMode === 'EDIT') {\r\n if (onSaveComplete) {\r\n onSaveComplete(res?.status, parameterForSaveRef.current?.isDraft as boolean)\r\n }\r\n setNewUploadFile(res?.result?.projectInfo?.projectID, res?.result?.projectInfo?.submittedID)\r\n } else if (formMode === 'CREATE') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: handleAfterCloseCreateSuccess,\r\n })\r\n appFolderAndTabAction.resetTabDirty()\r\n dialogTwoRef.current?.openDialog()\r\n projectIDRef.current = res.result?.projectInfo?.projectID\r\n submittedIDRef.current = res.result?.projectInfo?.submittedID\r\n irbRef.current = res.result?.projectInfo?.irb\r\n }\r\n } catch (err) {\r\n } finally {\r\n loadingClose()\r\n }\r\n }\r\n\r\n const handleAfterCloseCreateSuccess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n //เล่นใน mode create save เสร็จจะต้องไปเข้าหน้า Edit/View\r\n const encryptedProjectID = encryptionAES(`${projectIDRef.current}`)\r\n const encryptedSubmittedID = encryptionAES(`${submittedIDRef.current}`)\r\n const path = generatePath(RoutePath.manageProjectEdit, {\r\n projectID: encryptedProjectID,\r\n submittedID: encryptedSubmittedID,\r\n })\r\n history.push({\r\n pathname: path, // editMode\r\n })\r\n }\r\n\r\n const handleChangeFaculty = (irb?: string) => {\r\n if (irb) {\r\n const submittedTypeID =\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration\r\n\r\n getDocumentTopicLut(parseInt(irb), submittedTypeID)\r\n }\r\n }\r\n\r\n const handleChangeResearcherType = (val?: string) => {\r\n if (val) {\r\n filterTopicUpload(val)\r\n researcherTypeRef.current = val\r\n }\r\n }\r\n\r\n const filterTopicUpload = (val: string) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n if (documentTopicRef.current) {\r\n let isDocTopic = documentTopicRef.current\r\n if (val === '1') {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submittType: number) => {\r\n let submittedTypeID = projectSubmittedTypeID ? projectSubmittedTypeID : submittType\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submittedTypeID)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n\r\n if (researcherTypeRef.current) {\r\n filterTopicUpload(researcherTypeRef.current)\r\n }\r\n\r\n //กรองหัวข้อตามประเภทนักวิจัย กรณีที่มีข้อมูล projectData\r\n if (manageProjectStore.projectData?.researcherTypeInfo?.value) {\r\n const researcherTypeID = manageProjectStore.projectData?.researcherTypeInfo.value\r\n researcherTypeRef.current = researcherTypeID.toString()\r\n filterTopicUpload(researcherTypeID.toString())\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n let documentInfo = manageProjectStore.projectData?.documentInfo\r\n let latestDocument = manageProjectStore.projectData?.latestDocument\r\n let uploadFileInit = documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n let fileList = docInfo?.fileInfo?.map((file: any) => ({\r\n documentTopicID: docInfo.topicID,\r\n fileToken: file.fileToken, //fileToken\r\n filename: file.filename,\r\n fileID: file.fileID, //fileToken\r\n path: file.path,\r\n replaceFileID: file.replaceFileID,\r\n }))\r\n itm.uploadFileObj.fileList = fileList\r\n const subtopic = docInfo.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docInfo.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n itm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n })\r\n })\r\n\r\n //Section Replace File\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileInit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileID, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFileBy.replaceFileID,\r\n } as any,\r\n ]\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n // //**** Initial File Edit ****//\r\n // if (!isViewMode && latestDocument && latestDocument.length > 0) {\r\n // uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n // latestDocument?.forEach((latestDocInfo: any) => {\r\n // let latestFile = []\r\n // let previousFile = []\r\n // if (latestDocInfo?.fileInfo[0]) {\r\n // latestFile = latestDocInfo.fileInfo[0].latestFileList.filter((itm: any) => itm.no === null)\r\n // previousFile =\r\n // latestDocInfo.fileInfo[0].latestFileList[\r\n // latestDocInfo.fileInfo[0].latestFileList.length - 2\r\n // ]\r\n // }\r\n // if (latestFile.length > 0) {\r\n // if (latestDocInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n // let fileList = [\r\n // {\r\n // documentTopicID: latestDocInfo.topicID,\r\n // fileToken: latestFile[0].fileToken, //fileToken\r\n // filename: latestFile[0].filename,\r\n // fileID: latestFile[0].fileToken, //fileToken\r\n // path: latestFile[0].path,\r\n // replaceFileID: previousFile?.fileID,\r\n // },\r\n // ]\r\n // itm.uploadFileObj.fileList = fileList\r\n // itm.uploadFileObj.subTopicPageList = []\r\n // }\r\n // }\r\n // })\r\n // })\r\n // }\r\n // console.log('====>>> After make edit :', JSON.stringify(uploadFileInit))\r\n // console.log('====>>> After make edit ssss:', uploadFileInit)\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n console.log('useNewProject.tsx => uploadFileInit : ', uploadFileInit)\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const setNewUploadFile = async (projectID: number, submittedID: number) => {\r\n const projectData = await tabAndFolderHook.getProjectByID(projectID, submittedID)\r\n let documentInfo = projectData?.documentInfo\r\n let latestDocument = projectData?.latestDocument\r\n let uploadFileInit = documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n let fileList = docInfo?.fileInfo?.map((file: any) => ({\r\n documentTopicID: docInfo.topicID,\r\n fileToken: file.fileToken, //fileToken\r\n filename: file.filename,\r\n fileID: file.fileID, //fileToken\r\n path: file.path,\r\n }))\r\n itm.uploadFileObj.fileList = fileList\r\n const subtopic = docInfo.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docInfo.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n itm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n })\r\n })\r\n\r\n //Section Replace File\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileInit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileID, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFileBy.replaceFileID,\r\n } as any,\r\n ]\r\n\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n\r\n // //**** Initial File Edit ****//\r\n // if (latestDocument && latestDocument.length > 0) {\r\n // uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n // latestDocument?.forEach((latestDocInfo: any) => {\r\n // let latestFile = []\r\n // let previousFile = []\r\n // if (latestDocInfo?.fileInfo[0]) {\r\n // latestFile = latestDocInfo.fileInfo[0].latestFileList.filter((itm: any) => itm.no === null)\r\n // previousFile =\r\n // latestDocInfo.fileInfo[0].latestFileList[\r\n // latestDocInfo.fileInfo[0].latestFileList.length - 2\r\n // ]\r\n // }\r\n // if (latestFile.length > 0) {\r\n // if (latestDocInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n // let fileList = [\r\n // {\r\n // documentTopicID: latestDocInfo.topicID,\r\n // fileToken: latestFile[0].fileToken, //fileToken\r\n // filename: latestFile[0].filename,\r\n // fileID: latestFile[0].fileToken, //fileToken\r\n // path: latestFile[0].path,\r\n // replaceFileID: previousFile?.fileID,\r\n // },\r\n // ]\r\n // itm.uploadFileObj.fileList = fileList\r\n // itm.uploadFileObj.subTopicPageList = []\r\n // }\r\n // }\r\n // })\r\n // })\r\n // }\r\n\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n const handleClickClose = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n const handleDirtyChange = (props: any) => {\r\n const paramsDirty = {\r\n tabDirty: isViewMode ? false : props.dirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n isDraftRef.current = true\r\n\r\n if (valuesForm) {\r\n const values = { ...valuesForm.current } as requestFormType.MyRequestFormType\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(values)\r\n parameterForSaveRef.current = parameterForSave\r\n newTabSelectedRef.current = newTabSelected\r\n tabSelectedIndexRef.current = tabIndex\r\n handleSaveDraft()\r\n }\r\n }\r\n\r\n const handleDeleteProject = () => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_DELETE'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: async () => {\r\n if (manageProjectStore?.projectData?.projectID) {\r\n const res = await callWebService.deleteProject(manageProjectStore?.projectData?.projectID)\r\n setConfigDialog({}) //clear function dialog\r\n history.push('/manage-project')\r\n }\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const chkDisplayBTNDeleteProject: boolean =\r\n (initialData?.projectSubmitType &&\r\n checkPermission.chkDisplayBTNDeleteProject(parseInt(initialData?.projectSubmitType.value)) &&\r\n initialData?.isDraft &&\r\n manageProjectStore.projectData?.verifyDocument == null) ||\r\n false\r\n\r\n return {\r\n isDraftData: chkDisplayBTNDeleteProject,\r\n initialUploadFile,\r\n configDialog,\r\n onRefDialogTwo,\r\n selectedIrb,\r\n configLoading,\r\n valuesForm,\r\n isApproveWithComment,\r\n projectData: manageProjectStore.projectData,\r\n initialDataValue,\r\n researcherTypeRef,\r\n handleDirtyChange,\r\n onClickDeleteProject: handleDeleteProject,\r\n onClickSubmit: handleClickSubmit,\r\n onClickCancel: handleClickCancel,\r\n onClickClose: handleClickClose,\r\n handleChangeFaculty: handleChangeFaculty,\r\n onChangeResearcherType: handleChangeResearcherType,\r\n }\r\n}\r\n\r\nexport default useRequestForm\r\n","import useEthicsForm from './useEthicsForm'\r\n//View\r\nexport type EthicsFormView = ReturnType & {\r\n disabled?: boolean\r\n isDisableRIB?: boolean\r\n isDisablePhase?: boolean\r\n isDisableNumPhase?: boolean\r\n isShowNeedEditForm?: boolean\r\n} & EthicsFormType\r\n\r\n//Controller\r\nexport type EthicsFormType = {\r\n disabled?: boolean\r\n callbackChangeFaculty?: (irb?: string) => void\r\n isNotCompleteDocument?: boolean\r\n isDisableRIB?: boolean\r\n isDisablePhase?: boolean\r\n isDisableNumPhase?: boolean\r\n callbackChangeResearcherType?: (val: string) => void\r\n isShowNeedEditForm?: boolean\r\n isDisableNeedEditForm?: boolean\r\n isEditAfterReview?: boolean\r\n headerLabel?: string\r\n hideAccordion?: boolean\r\n}\r\n\r\n//Model\r\nexport type UseEthicsFormType = Omit\r\n\r\nexport type OptType = {\r\n label: string\r\n value: string\r\n}\r\nexport type RadType = {\r\n id: string\r\n name: string\r\n}\r\n\r\nexport enum ResearcherType {\r\n student = '1', // นิสิต/นักศึกษา\r\n teacher = '2', // นักวิจัย/อาจารย์\r\n}\r\n","import useTranslate from '../../i18n/useTranslate'\r\nconst useLookupClient = () => {\r\n const translate = useTranslate()\r\n const getYesNo = () => {\r\n return [\r\n {\r\n id: '1',\r\n name: translate.get('LABEL.NO'),\r\n },\r\n {\r\n id: '2',\r\n name: translate.get('LABEL.YES'),\r\n },\r\n ]\r\n }\r\n\r\n const getRequest = () => {\r\n return [\r\n {\r\n id: '1',\r\n name: translate.get('LABEL.NEED'),\r\n },\r\n {\r\n id: '2',\r\n name: translate.get('LABEL.NOT_NEED'),\r\n },\r\n ]\r\n }\r\n\r\n const getIRB = () => {\r\n return [\r\n { label: 'REC 1', value: '1' },\r\n { label: 'REC 2', value: '2' },\r\n ]\r\n }\r\n\r\n const getDocumentResult = () => {\r\n return [\r\n {\r\n id: '1',\r\n name: translate.get('LABEL.DOC_COMPLETED'),\r\n },\r\n {\r\n id: '2',\r\n name: translate.get('LABEL.DOC_INCOMPLETE'),\r\n },\r\n ]\r\n }\r\n\r\n const getNeedDoc = () => {\r\n return [\r\n {\r\n value: '1',\r\n label: translate.get('LABEL.NEED'),\r\n },\r\n {\r\n value: '0',\r\n label: translate.get('LABEL.NOT_NEED'),\r\n },\r\n ]\r\n }\r\n\r\n const getGroupsUser = () => {\r\n return [\r\n {\r\n id: '1',\r\n name: translate.get('LABEL.PRESIDENT'),\r\n },\r\n {\r\n id: '2',\r\n name: translate.get('LABEL.SECRETARY'),\r\n },\r\n ]\r\n }\r\n\r\n return { getYesNo, getRequest, getIRB, getDocumentResult, getNeedDoc, getGroupsUser }\r\n}\r\n\r\nexport default useLookupClient\r\n","import React, { useRef } from 'react'\r\nimport * as ethicsFormType from './ethicsFormTypes'\r\nimport useLookupService from '../../../../services/lookup/useLookupService'\r\nimport { useForm } from 'react-final-form'\r\nimport useLookupClient from '../../../../services/lookupClient/useLookupClient'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport useManageProjectStore from '../../../../stores/manageProject/useManageProjectStore'\r\nimport useIRB from '../../../../services/um/lookups/useIRB'\r\nimport useSnackbarAction from '../../../../stores/snackbar/snackbarAction'\r\n\r\nconst useEthicsForm = (props: ethicsFormType.UseEthicsFormType) => {\r\n const { callbackChangeFaculty, callbackChangeResearcherType, isEditAfterReview } = props\r\n const form = useForm()\r\n const translate = useTranslate()\r\n const lookupClient = useLookupClient()\r\n const callLookup = useLookupService()\r\n const { irb } = useIRB()\r\n const [categoryProject, setCategoryProject] = React.useState([])\r\n const [faculty, setFaculty] = React.useState([])\r\n const [researcherType, setResearcherType] = React.useState([])\r\n const [titleNameList, setTitleNameList] = React.useState([])\r\n const [academicPositionList, setAcademicPositionList] = React.useState([])\r\n const [educationList, setEducationList] = React.useState>([])\r\n const [researcherTypeSelected, setResearcherTypeSelected] = React.useState()\r\n const [textRemaining, setTextRemaining] = React.useState<{ TH: number; EN: number }>({ TH: 500, EN: 500 })\r\n\r\n const [isPhase, setIsPhase] = React.useState(false)\r\n const [isNeedEditForm, setIsNeedEditForm] = React.useState(true)\r\n const manageProjectStore = useManageProjectStore()\r\n\r\n const [isShowAcademicPosition, setIsShowAcademicPosition] = React.useState(false)\r\n\r\n const lookupFacultyResponse = useRef>>(\r\n [],\r\n )\r\n\r\n const snackbarAction = useSnackbarAction()\r\n\r\n React.useEffect(() => {\r\n getCategoryProject()\r\n getFaculty()\r\n getEducationLevel()\r\n getResearcherType()\r\n getTitleName()\r\n getAcademicPosition()\r\n getEducationLevel()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n React.useEffect(() => {\r\n if (isEditAfterReview || manageProjectStore?.projectData?.isFlowApproveWithComment) {\r\n if (\r\n manageProjectStore.projectData?.previousIsNeedEditForm !== null &&\r\n manageProjectStore.projectData?.previousIsNeedEditForm !== undefined\r\n ) {\r\n setIsNeedEditForm(manageProjectStore.projectData?.previousIsNeedEditForm)\r\n }\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n const formVal = form.getState().values\r\n const textRemainingTH = formVal?.projectNameTH?.length ? 500 - formVal?.projectNameTH?.length : 500\r\n const textRemainingEN = formVal?.projectNameEN?.length ? 500 - formVal?.projectNameEN?.length : 500\r\n setTextRemaining({ TH: textRemainingTH, EN: textRemainingEN })\r\n\r\n if (form.getState().values?.isNeedEditForm === '1') {\r\n setIsNeedEditForm(false)\r\n }\r\n }, [form.getState().values.projectNameTH ?? null, form.getState().values.projectNameEN ?? null])\r\n\r\n React.useEffect(() => {\r\n const formVal = form.getState().values\r\n if (formVal?.researcherType?.value === '1') {\r\n setIsShowAcademicPosition(false)\r\n } else {\r\n setIsShowAcademicPosition(true)\r\n }\r\n }, [form.getState().values])\r\n\r\n const getEducationLevel = async () => {\r\n const res = await callLookup.getEducationLevel()\r\n const formatData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n setEducationList(formatData)\r\n }\r\n\r\n const getCategoryProject = async () => {\r\n const res = await callLookup.callProjectSubmitTypeLut()\r\n lookupFacultyResponse.current = res.result\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n setCategoryProject(formatedData)\r\n }\r\n\r\n const getFaculty = async () => {\r\n const res = await callLookup.callFacultyLut()\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n irb: `${itm.irb}`,\r\n }\r\n })\r\n\r\n setFaculty(formatedData)\r\n }\r\n\r\n const getResearcherType = async () => {\r\n const res = await callLookup.callResearcherTypeLut()\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n\r\n setResearcherType(formatedData)\r\n }\r\n\r\n const getTitleName = async () => {\r\n const res = await callLookup.callTitleNameLut()\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n\r\n setTitleNameList(formatedData)\r\n }\r\n\r\n const getAcademicPosition = async () => {\r\n const res = await callLookup.callAcademicPositionLut()\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n\r\n const academicPosition = [...formatedData]\r\n\r\n setAcademicPositionList(academicPosition)\r\n }\r\n\r\n const handleChangeResearcherType = (val: { value: string; label: string }) => {\r\n if (val && callbackChangeResearcherType) {\r\n callbackChangeResearcherType(val.value)\r\n setResearcherTypeSelected(val?.value)\r\n\r\n const isCant = val?.value === ethicsFormType.ResearcherType.student\r\n if (!isCant) {\r\n setIsShowAcademicPosition(true)\r\n } else {\r\n setIsShowAcademicPosition(false)\r\n }\r\n }\r\n }\r\n const handleChangeAcademicPosition = (val: string) => {\r\n if (val !== '6') {\r\n form.change('otherAcademicPositionTH', null)\r\n form.change('otherAcademicPositionEN', null)\r\n form.restart()\r\n }\r\n }\r\n\r\n const handleChangeTitleName = (val: string) => {\r\n if (val !== '5') {\r\n form.change('otherTitleNameTH', null)\r\n form.change('otherTitleNameEN', null)\r\n form.restart()\r\n }\r\n }\r\n const handleChangeFaculty = (val: { value: string; label: string; irb?: string }) => {\r\n const selectedIrb = irb.filter((itm) => itm.value === val?.irb)\r\n form.change('IRB', selectedIrb.length > 0 ? selectedIrb[0] : null)\r\n if (callbackChangeFaculty) {\r\n callbackChangeFaculty(val?.irb)\r\n }\r\n }\r\n const handleChangeIsPhase = (val: string) => {\r\n const isPhase = val === '2' ? true : false\r\n setIsPhase(isPhase)\r\n }\r\n const handleChangeIrb = (val: { value: string; label: string }) => {\r\n if (callbackChangeFaculty) {\r\n callbackChangeFaculty(val?.value)\r\n }\r\n }\r\n const handleChangeHomePhone = (val: string) => {\r\n if (val) {\r\n let result = ''\r\n const phoneNumber = val.replace(/[^\\d]/g, '')\r\n if (phoneNumber.slice(0, 2) === '02') {\r\n // 02-123-4567\r\n if (phoneNumber.length < 3) {\r\n result = phoneNumber\r\n } else if (phoneNumber.length < 6) {\r\n result = `${phoneNumber.slice(0, 2)}-${phoneNumber.slice(2)}`\r\n } else {\r\n result = `${phoneNumber.slice(0, 2)}-${phoneNumber.slice(2, 5)}-${phoneNumber.slice(5, 9)}`\r\n }\r\n } else {\r\n // 034-123-456\r\n if (phoneNumber.length < 4) {\r\n result = phoneNumber\r\n } else if (phoneNumber.length < 7) {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3)}`\r\n } else {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3, 6)}-${phoneNumber.slice(6, 9)}`\r\n }\r\n }\r\n form.change('homePhone', result)\r\n }\r\n }\r\n const handleChangeMobilePhone = (val: string) => {\r\n if (val) {\r\n let result = ''\r\n const phoneNumber = val.replace(/[^\\d]/g, '')\r\n if (phoneNumber.length < 4) {\r\n result = phoneNumber\r\n } else if (phoneNumber.length < 7) {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3)}`\r\n } else {\r\n result = `${phoneNumber.slice(0, 3)}-${phoneNumber.slice(3, 6)}-${phoneNumber.slice(6, 10)}`\r\n }\r\n form.change('mobilePhone', result)\r\n }\r\n }\r\n\r\n const handleChangeNeedEditForm = (val: string) => {\r\n const isNeedEditForm = val === '2' ? true : false\r\n setIsNeedEditForm(isNeedEditForm)\r\n if (isNeedEditForm) {\r\n snackbarAction.openSnackbar({\r\n message: translate.get('ALERT.CONTENT.CHECK_YOUR_INFORMATION'),\r\n type: 'warning',\r\n })\r\n }\r\n }\r\n\r\n const handleChangeCertificatePaper = () => {}\r\n\r\n const handleChangTextField = (val: string, language: string) => {\r\n let objText = textRemaining\r\n if (language === 'TH') {\r\n objText = { TH: 500 - val.length, EN: textRemaining.EN }\r\n } else {\r\n objText = { TH: textRemaining.TH, EN: 500 - val.length }\r\n setTextRemaining({ TH: 500 - val.length, EN: textRemaining.EN })\r\n }\r\n }\r\n\r\n return {\r\n faculty,\r\n researcherType,\r\n categoryProject,\r\n titleNameList,\r\n\r\n academicPositionList,\r\n researcherTypeSelected,\r\n isPhase,\r\n educationLevelLut: educationList,\r\n textRemaining,\r\n isCertificatePaperList: lookupClient.getRequest(),\r\n isNeedEditForm,\r\n // irbLut: lookupClient.getIRB(),\r\n irbLut: irb,\r\n isPhaseLut: lookupClient.getYesNo(),\r\n isToolsLut: lookupClient.getYesNo(),\r\n isShowAcademicPosition,\r\n onChangeResearcherType: handleChangeResearcherType,\r\n onChangeAcademicPosition: handleChangeAcademicPosition,\r\n onChangeTitleName: handleChangeTitleName,\r\n onChangeFaculty: handleChangeFaculty,\r\n onChangeIsPhase: handleChangeIsPhase,\r\n onChangeIrb: handleChangeIrb,\r\n onChangeHomePhone: handleChangeHomePhone,\r\n onChangeMobilePhone: handleChangeMobilePhone,\r\n onChangeCertificatePaper: handleChangeCertificatePaper,\r\n onChangTextField: handleChangTextField,\r\n onChangeNeedEditForm: handleChangeNeedEditForm,\r\n }\r\n}\r\n\r\nexport default useEthicsForm\r\n","import * as ethicsFormType from './ethicsFormTypes'\r\nimport useEthicsForm from './useEthicsForm'\r\nimport MyTextfield from '../../../../control/textfield/textfield'\r\nimport Autocomplete from '../../../../control/autocomplete/autocomplete'\r\nimport {\r\n validateEmail,\r\n validatePhone,\r\n validateMobilePhone,\r\n validateEN,\r\n validateTextLength30,\r\n} from '../../../../utilities/validate'\r\nimport { Grid, IconButton } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport React from 'react'\r\nimport Radio from '../../../../control/radio/radio'\r\nimport Checkbox from '../../../../control/checkbox/checkbox'\r\nimport { useForm } from 'react-final-form'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport MyAccordion from '../../../../control/accordion/accordion'\r\nimport { Fragment } from 'react'\r\nimport Select from '../../../../control/select/select'\r\nimport Tooltip from '../../../../control/tooltip/tooltip'\r\nimport { InfoOutlined } from '@material-ui/icons'\r\n\r\n//View\r\nconst EthicsFormView = (props: ethicsFormType.EthicsFormView) => {\r\n const {\r\n headerLabel,\r\n hideAccordion = false,\r\n faculty,\r\n researcherType,\r\n disabled = false,\r\n isDisableRIB = false,\r\n titleNameList,\r\n academicPositionList,\r\n isCertificatePaperList,\r\n researcherTypeSelected,\r\n isPhase,\r\n educationLevelLut,\r\n irbLut,\r\n isPhaseLut,\r\n isToolsLut,\r\n isDisablePhase = false,\r\n isDisableNumPhase = false,\r\n textRemaining,\r\n isShowNeedEditForm = false,\r\n isNeedEditForm,\r\n isDisableNeedEditForm = false,\r\n isShowAcademicPosition,\r\n onChangeResearcherType,\r\n onChangeAcademicPosition,\r\n onChangeTitleName,\r\n onChangeFaculty,\r\n onChangeIsPhase,\r\n onChangeIrb,\r\n onChangeHomePhone,\r\n onChangeMobilePhone,\r\n onChangeCertificatePaper,\r\n onChangTextField,\r\n onChangeNeedEditForm,\r\n } = props\r\n const classes = useStyles({})\r\n const translate = useTranslate()\r\n\r\n const form = useForm()\r\n const { values } = form.getState()\r\n const { academicPosition, titleName } = values\r\n const isPhaseFormValue = values.isPhase\r\n const isShowEducationLevel =\r\n researcherTypeSelected === ethicsFormType.ResearcherType.student ||\r\n values?.researcherType?.value === ethicsFormType.ResearcherType.student\r\n\r\n const renderElement = (canEditFaculty = false) => (\r\n \r\n {isShowNeedEditForm && (\r\n \r\n \r\n \r\n )}\r\n \r\n {translate.get('LABEL.PROJECT_INFO')}​\r\n \r\n \r\n {translate.get('LABEL.LABEL_04')}​\r\n \r\n \r\n \r\n \r\n {(isPhase || isPhaseFormValue === '2') && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n ​\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n onChangTextField(val, 'TH')\r\n }}\r\n required\r\n />\r\n \r\n {!disabled && (\r\n \r\n \r\n {translate.get('LABEL.NUMBER_OF_CHARACTERS')} : {textRemaining?.TH}\r\n \r\n \r\n )}\r\n \r\n {\r\n onChangTextField(val, 'EN')\r\n }}\r\n required\r\n />\r\n \r\n {!disabled && (\r\n \r\n \r\n {translate.get('LABEL.NUMBER_OF_CHARACTERS')} : {textRemaining?.EN}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.CERTIFICATE_REQ_INFO')}​\r\n \r\n \r\n \r\n \r\n {/* //className={​classes.label}​> */}​{translate.get('LABEL.CERTIFICATE_LANGUAGE')}​\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.RESEARCHER_INFO')}​\r\n \r\n \r\n {translate.get('LABEL.LABEL_02')}​\r\n \r\n \r\n \r\n \r\n {isShowEducationLevel && (\r\n \r\n \r\n \r\n )}\r\n ​\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {isShowAcademicPosition && (\r\n \r\n \r\n \r\n )}\r\n {isShowAcademicPosition && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n required\r\n />\r\n \r\n )}\r\n {isShowAcademicPosition && (\r\n \r\n \r\n \r\n )}\r\n {isShowAcademicPosition && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n return (\r\n \r\n {hideAccordion ? (\r\n renderElement(false)\r\n ) : (\r\n {renderElement(true)}\r\n )}\r\n \r\n )\r\n}\r\n//Controller\r\nconst EthicsForm = (props: ethicsFormType.EthicsFormType) => {\r\n // const {​ disabled }​ = props\r\n const createFormModel = useEthicsForm(props)\r\n return \r\n}\r\nexport default EthicsForm\r\nconst useStyles = makeStyles((theme) => ({\r\n fontDetail: {\r\n fontSize: '14px',\r\n color: '#bfbfbf',\r\n },\r\n line: {\r\n borderTop: '1px solid #c7c7c7',\r\n marginBottom: '2%',\r\n },\r\n}))\r\n","import JSZip from 'jszip'\r\nimport { saveAs } from 'file-saver'\r\n// @ts-ignore\r\nimport * as JSZipUtils from 'jszip-utils'\r\n\r\nconst useZip = () => {\r\n const generateZip = async (list: any[]) => {\r\n let zip = JSZip()\r\n let count = 1\r\n if (list.length > 0) {\r\n list.forEach((element) => {\r\n JSZipUtils.getBinaryContent(element.path, async (err: any, data: any) => {\r\n if (err) {\r\n throw err // or handle the error\r\n }\r\n new Promise((resolve) => {\r\n zip.file(`${element.folderName}/${element.filename}`, data, {\r\n binary: true,\r\n })\r\n resolve('')\r\n }).finally(() => {\r\n count++\r\n })\r\n })\r\n })\r\n const interval = setInterval(() => {\r\n if (count >= list.length) {\r\n zip.generateAsync({ type: 'blob' }).then(function (blob) {\r\n saveAs(blob, `Documents_${new Date().toLocaleString()}.zip`)\r\n })\r\n clearInterval(interval)\r\n }\r\n }, 400)\r\n }\r\n }\r\n return { generateZip }\r\n}\r\n\r\nexport default useZip\r\n","import React, { useRef, useState } from 'react'\r\nimport { withStyles } from '@material-ui/core/styles'\r\nimport MuiAccordion from '@material-ui/core/Accordion'\r\nimport MuiAccordionSummary from '@material-ui/core/AccordionSummary'\r\nimport MuiAccordionDetails from '@material-ui/core/AccordionDetails'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { Button, Grid, IconButton, styled } from '@material-ui/core'\r\nimport { ResearchDetailViewType, ResearchDetailCtrlType, UplodeFileObjType } from './uploadDocType'\r\nimport useUploadDoc from './useUploadDoc'\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore'\r\nimport UploadFile from './uploadFile/uploadFile'\r\nimport { useForm } from 'react-final-form'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport Tooltip from '../../../../control/tooltip/tooltip'\r\nimport EditOutlinedIcon from '@material-ui/icons/EditOutlined'\r\nimport MyButton from '../../../../control/button/button'\r\nimport Dialog from '../../../../control/dialog/dialog'\r\nimport useZip from '../../shareLogic/useZip'\r\n\r\ntype LinkProps = {\r\n title: string\r\n url: string\r\n}\r\nconst Link: React.FC = (props) => {\r\n const { title, url } = props\r\n const onClickLink = (e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (url != '') {\r\n console.log('url : ', url)\r\n window.open(url, '_blank')\r\n }\r\n }\r\n return (\r\n \r\n {title}\r\n \r\n )\r\n}\r\nconst UploadDocView: React.FC = ({ ...props }) => {\r\n const translate = useTranslate()\r\n const {\r\n isExpanded,\r\n onClickAccordionChange,\r\n documentTitleList,\r\n onChangeUpload,\r\n isViewMode,\r\n initialData,\r\n title = translate.get('LABEL.UPLOAD_FILES'),\r\n name = 'uploadFile',\r\n disabledBtn = false,\r\n isUseUploadfileEdit = false,\r\n latestDocument,\r\n onClickOpenFile,\r\n required = true,\r\n canEditUploadFile = false,\r\n handleConfirm,\r\n handleCancel,\r\n linkProps,\r\n zipDownload = false,\r\n isRequire = true,\r\n } = props\r\n const form = useForm()\r\n const { values } = form.getState()\r\n const { IRB } = values\r\n const [isEditting, setIsEditting] = useState(false)\r\n const formStateRef = useRef<{ [key: string]: any }>({})\r\n const confirmRef = useRef>()\r\n const cancelRef = useRef>()\r\n const { generateZip } = useZip()\r\n const [isResetFileUpload, setIsResetFileUpload] = useState(false)\r\n // const uploadDocTitle =\r\n // ' (กรุณาอัปโหลดไฟล์ PDF กรณีข้อมูลวิจัยของกลุ่ม IRB 2 ให้อัปโหลดไฟล์ PDF และ docx ขนาดไม่เกิน 5 mb/ไฟล์ )'\r\n // const uploadDocTitle =\r\n // IRB?.value === '1'\r\n // ? ' (รองรับไฟล์ PDF,DOC,DOCX,JPEG,PNG,TIFF ขนาดไม่เกิน 5 mb/ไฟล์ กรุณาอัปโหลดเป็น PDF สำหรับประทับตรา)'\r\n // : ' (รองรับไฟล์ PDF,DOC,DOCX,JPEG,PNG,TIFF ขนาดไม่เกิน 5 mb/ไฟล์ กรุณาอัปโหลดเป็น PDF สำหรับประทับตรา และอัปโหลดเป็น Word สำหรับตรวจสอบเอกสาร)'\r\n\r\n const renderUploadFile = (name: string, index: number) => {\r\n // if (isUseUploadfileEdit && latestDocument && latestDocument?.length > 0) {\r\n // return (\r\n // {}}\r\n // subTitleList={documentTitleList[index].subtopic}\r\n // initialData={initialData}\r\n // disabled={isViewMode}\r\n // disabledBtn={disabledBtn}\r\n // latestDocument={latestDocument}\r\n // required={required}\r\n // />\r\n // )\r\n // } else {\r\n let disabled = false\r\n\r\n if (canEditUploadFile) {\r\n disabled = !isEditting\r\n } else {\r\n disabled = isViewMode || false\r\n }\r\n\r\n return (\r\n {}}\r\n subTitleList={documentTitleList[index].subtopic}\r\n initialData={initialData}\r\n disabled={disabled}\r\n disabledBtn={disabledBtn}\r\n latestDocument={latestDocument}\r\n required={required}\r\n onClickOpenFile={onClickOpenFile}\r\n canEditUploadFile={canEditUploadFile}\r\n resetLstFileUpload={isResetFileUpload}\r\n />\r\n )\r\n //}\r\n }\r\n\r\n const onClickEdit = (evt: any) => {\r\n onClickParent(evt)\r\n setIsEditting(true)\r\n formStateRef.current = form.getState().values\r\n }\r\n\r\n const onClickParent = (evt: any) => {\r\n evt.stopPropagation()\r\n }\r\n\r\n const onConfirm = (evt: any) => {\r\n onClickParent(evt)\r\n confirmRef?.current?.openDialog()\r\n }\r\n\r\n const onCancel = (evt: any) => {\r\n onClickParent(evt)\r\n cancelRef?.current?.openDialog()\r\n }\r\n\r\n const bindConfirmRef = (func: Record) => {\r\n confirmRef.current = { ...func }\r\n }\r\n\r\n const bindCancelRef = (func: Record) => {\r\n cancelRef.current = { ...func }\r\n }\r\n\r\n const onSubmitConfirm = () => {\r\n if (handleConfirm) {\r\n Promise.all([handleConfirm()]).then(() => setIsEditting(false))\r\n } else {\r\n setIsEditting(false)\r\n }\r\n confirmRef?.current?.closeDialog()\r\n }\r\n\r\n const onSubmitCancel = () => {\r\n form.change(name, formStateRef.current[name])\r\n setIsResetFileUpload(!isResetFileUpload)\r\n if (handleCancel) {\r\n Promise.all([handleCancel()]).then(() => setIsEditting(false))\r\n } else {\r\n setIsEditting(false)\r\n }\r\n cancelRef?.current?.closeDialog()\r\n }\r\n\r\n const onDownloadZip = async () => {\r\n const fileList = form.getFieldState(name)?.value ?? []\r\n let resultList: any[] = []\r\n if (fileList.length > 0) {\r\n fileList.forEach((data: UplodeFileObjType) => {\r\n if (data?.uploadFileObj?.fileList) {\r\n resultList = [\r\n ...resultList,\r\n ...data.uploadFileObj.fileList.map((file) => ({\r\n ...file,\r\n documentTopicID: data.uploadFileObj?.documentTopicID,\r\n })),\r\n ]\r\n }\r\n })\r\n }\r\n const mappingResultNo = resultList.map((data, index) => {\r\n const foundData = documentTitleList.find(\r\n (titleData: any) => `${data.documentTopicID}` === `${titleData.id}`,\r\n )\r\n const customName = foundData?.code ? `${foundData?.no}_${foundData?.code}` : `${foundData?.no}`\r\n return {\r\n ...data,\r\n folderName: foundData ? customName : index + 1,\r\n }\r\n })\r\n generateZip(mappingResultNo)\r\n }\r\n\r\n return (\r\n
\r\n {\r\n onClickAccordionChange(!isExpanded)\r\n }}\r\n >\r\n }\r\n >\r\n \r\n \r\n \r\n {title}{' '}\r\n {title === translate.get('LABEL.UPLOAD_FILES') && (\r\n <>\r\n \r\n {isRequire\r\n ? `(${translate.get('LABEL.UPLOAD_FILES_DESCRIPTION')})`\r\n : `(${translate.get('LABEL.UPLOAD_FILES_DESCRIPTION')} ถ้ามี)`}\r\n \r\n  \r\n {zipDownload && (\r\n {\r\n onClickParent(evt)\r\n onDownloadZip()\r\n }}\r\n >\r\n {translate.get('LABEL.DOWNLOAD_DOC')}\r\n \r\n )}\r\n \r\n )}\r\n {canEditUploadFile && (\r\n
\r\n {!isEditting ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n <>\r\n  \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n  \r\n \r\n {translate.get('BUTTON.CONFIRM')}\r\n \r\n \r\n )}\r\n
\r\n )}\r\n {linkProps && (\r\n
\r\n {' '}\r\n \r\n
\r\n )}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n {(\r\n { fields }, //loop from initialData\r\n ) =>\r\n fields.map((name, index) => (\r\n \r\n \r\n {documentTitleList &&\r\n documentTitleList.length > 0 &&\r\n documentTitleList[index] &&\r\n renderUploadFile(name, index)}\r\n \r\n \r\n ))\r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nlet UploadDocCtrl: React.FC = ({ ...props }) => {\r\n const uploadDocModel = useUploadDoc({ ...props })\r\n return \r\n}\r\n\r\nexport default UploadDocCtrl\r\n\r\nconst ConfirmBtn = styled(MyButton)({\r\n /** Confirm Style */\r\n})\r\n\r\nconst CancelBtn = styled(MyButton)({\r\n /** Cancel Style */\r\n})\r\n\r\nconst Accordion = withStyles({\r\n root: {\r\n border: '1px solid rgba(0, 0, 0, .125)',\r\n boxShadow: 'none',\r\n '&:not(:last-child)': {\r\n borderBottom: 0,\r\n },\r\n '&:before': {\r\n display: 'none',\r\n },\r\n '&$expanded': {\r\n margin: 'auto',\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordion)\r\n\r\nconst AccordionSummary = withStyles({\r\n root: {\r\n backgroundColor: '#ffffff',\r\n borderBottom: '1px solid rgba(0, 0, 0, .125)',\r\n marginBottom: -1,\r\n minHeight: 56,\r\n '&$expanded': {\r\n minHeight: 56,\r\n },\r\n },\r\n content: {\r\n '&$expanded': {\r\n margin: '12px 0',\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordionSummary)\r\n\r\nconst AccordionDetails = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiAccordionDetails)\r\n","import { UseDocumentTestResultType } from './remarkFromAdminType'\r\n\r\nconst useRemarkFromAdmin = (props: UseDocumentTestResultType) => {\r\n const {} = props\r\n\r\n return {}\r\n}\r\n\r\nexport default useRemarkFromAdmin\r\n","import { Grid } from '@material-ui/core'\r\nimport TextField from '../../../../control/textfield/textfield'\r\nimport useDocumentTestResult from './useRemarkFromAdmin'\r\nimport { DocumentTestResultViewType, DocumentTestResultCtrlType } from './remarkFromAdminType'\r\nimport MyAccordion from '../../../../control/accordion/accordion'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../utilities/date'\r\n\r\nconst RemarkFromAdmin = (props: DocumentTestResultViewType) => {\r\n const { isShow, projectData } = props\r\n const translate = useTranslate()\r\n const isStatus =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? projectData?.submittedStatusInfo?.nameTH\r\n : projectData?.submittedStatusInfo?.nameEN\r\n let isResubmitDate\r\n if (projectData?.resubmitDocDate) {\r\n isResubmitDate =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? convertDateToFormatTH(projectData?.resubmitDocDate)\r\n : convertDateToFormatEN(projectData?.resubmitDocDate)\r\n }\r\n\r\n return (\r\n <>\r\n {isShow && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nconst RemarkFromAdminCtrl = (props: DocumentTestResultCtrlType) => {\r\n const { isViewMode } = props\r\n const documentTestResultCtrlModel = useDocumentTestResult({ ...props })\r\n return \r\n}\r\n\r\nexport default RemarkFromAdminCtrl\r\n","import { useEffect, useState } from 'react'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\n\r\n//Hook Service\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\n\r\n//Store & Action\r\nimport useAppFolderAndTabStore, * as appFolderAndTabStoreType from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport { GetProjectResultType } from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport projectStatus from '../../../../../../constants/projectStatus'\r\n\r\nconst useButtonSubmittedWithdraw = () => {\r\n const [isShowButton, setStateIsShowButton] = useState(false)\r\n\r\n const checkPermission = useCheckPermission()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const isUserAdmin = checkPermission.isUserAdmin()\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n const currentFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderSelected\r\n\r\n const callWebService = useWebService()\r\n\r\n useEffect(() => {\r\n const conditionShowButton = () => {\r\n const currentProjectStep = manageProjectStore.projectData?.stepID ?? constSubmittedStep.submit\r\n\r\n //ตัวเองไม่ได้เป็นการยื่นแบบถอนการยื่น\r\n const myselfNotWithdrawSubmitted: boolean =\r\n manageProjectStore.projectData?.submitTypeInfo?.value !== constSubmittedType.withdrawalSubmitted\r\n\r\n const haveAboveSubmitted: boolean =\r\n manageProjectStore.projectData?.aroundSubmittedIDInfo?.nextSubmittedID !== null &&\r\n manageProjectStore.projectData?.aroundSubmittedIDInfo?.nextSubmittedID !== undefined\r\n\r\n const isPermissionUser: boolean = isUserResearcher || isUserAdmin\r\n const isLastFolder: boolean = latestFolder?.submittedID === currentFolder?.submittedID\r\n\r\n //แสดงเมื่อไม่มี folder อยู่บนตัวมัน\r\n if (!haveAboveSubmitted && myselfNotWithdrawSubmitted) {\r\n if (manageProjectStore.projectData?.submittedID && (isUserAdmin || isUserResearcher)) {\r\n const prjSubmittedStatus = manageProjectStore.projectData?.submittedStatusInfo?.value\r\n const condition1 =\r\n isPermissionUser &&\r\n isLastFolder &&\r\n prjSubmittedStatus !== constSubmittedStatus.complete &&\r\n currentProjectStep !== constSubmittedStep.submit\r\n const condition2 =\r\n prjSubmittedStatus === constSubmittedStatus.incorrectDocument ||\r\n prjSubmittedStatus === constSubmittedStatus.waitingEditProject\r\n const condition3 = isUserAdmin && condition2\r\n const conditionDraft =\r\n (manageProjectStore.projectData.isDraft ||\r\n manageProjectStore.projectData.submittedStatusInfo?.value === constSubmittedStatus.draft ||\r\n !manageProjectStore.projectData.submittedStatusInfo) &&\r\n manageProjectStore.projectData.projectStatusInfo?.value !== projectStatus.completed\r\n if (condition1 || condition3 || conditionDraft) {\r\n setStateIsShowButton(true)\r\n }\r\n } else {\r\n setStateIsShowButton(false)\r\n }\r\n } else if (\r\n !myselfNotWithdrawSubmitted &&\r\n currentProjectStep !== constSubmittedStep.submit &&\r\n isPermissionUser &&\r\n isLastFolder &&\r\n !latestFolder?.folderName_th?.includes('แก้ไขหลังพิจารณา')\r\n ) {\r\n setStateIsShowButton(true)\r\n } else {\r\n setStateIsShowButton(false)\r\n }\r\n }\r\n\r\n conditionShowButton()\r\n\r\n return () => {\r\n loadingHook.loadingClose()\r\n }\r\n }, [\r\n manageProjectStore.projectData?.projectID,\r\n manageProjectStore.projectData?.submittedID,\r\n latestFolder?.submittedID,\r\n currentFolder?.submittedID,\r\n ])\r\n\r\n const createFolderWithdrawSubmitted = async () => {\r\n const projectData = manageProjectStore.projectData\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n const cloneFolderList: Array = [\r\n { ...Constants.customFolder.withdrawSubmitted, isLastProcess: true },\r\n ...appFolderAndTabStore.folderList.map((itm) => ({ ...itm, isLastProcess: false })),\r\n ]\r\n\r\n if (projectData?.projectID && latestFolder?.submittedID) {\r\n try {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n let customResult: Partial | null = null\r\n customResult = {\r\n ...result,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: {\r\n value: constSubmittedType.withdrawalSubmitted,\r\n nameTH: Constants.customFolder.withdrawSubmitted.folderName_th,\r\n nameEN: Constants.customFolder.withdrawSubmitted.folderName_en,\r\n },\r\n }\r\n manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n //SetFolder\r\n const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n appFolderAndTabAction.setState({\r\n folderList: folder,\r\n folderSelected: Constants.customFolder.withdrawSubmitted,\r\n tabSelected: Constants.menuTab.tab21,\r\n tabRenderList: [Constants.menuTab.tab21],\r\n tabIndexSelected: 0,\r\n })\r\n } catch (ex) {\r\n console.error('useButtonSubmittedWithdraw.ts => createFolderWithdrawSubmitted : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n }\r\n\r\n const onClickWithdraw = () => {\r\n createFolderWithdrawSubmitted()\r\n }\r\n return {\r\n isShowButton,\r\n onClickWithdraw,\r\n }\r\n}\r\n\r\nexport default useButtonSubmittedWithdraw\r\n","import React from 'react'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport Grid, { GridProps } from '@material-ui/core/Grid'\r\nimport Button from '../../../../../../control/button/button'\r\n\r\nimport useButtonSubmittedWithdraw from './useButtonSubmittedWithdraw'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\nimport submittedType from '../../../../../../constants/submittedType'\r\n\r\ntype ButtonSubmittedWithdrawViewProps = ReturnType & ButtonSubmittedWithdrawProps\r\nconst ButtonSubmittedWithdrawView: React.FC = (props) => {\r\n const { fullWidth, onClickWithdraw } = props\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const { folderSelected } = useAppFolderAndTabStore()\r\n return (\r\n \r\n {folderSelected.submittedTypeID === submittedType.withdrawalSubmitted\r\n ? translate.get('BUTTON.CANCEL_SUBMITTED_WITHDRAW')\r\n : translate.get('BUTTON.SUBMITTED_WITHDRAW')}\r\n \r\n )\r\n}\r\n\r\ntype ButtonSubmittedWithdrawProps = {\r\n gridProps?: GridProps\r\n fullWidth?: boolean\r\n}\r\nconst ButtonSubmittedWithdraw: React.FC = (props) => {\r\n const { gridProps = {} } = props\r\n const model = useButtonSubmittedWithdraw()\r\n return (\r\n (model.isShowButton && (\r\n \r\n \r\n \r\n )) || <>\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n button: {\r\n border: 'solid 1px #db5f8e',\r\n backgroundColor: '#ff0000',\r\n color: 'white',\r\n '&:hover': {\r\n backgroundColor: '#db0606',\r\n },\r\n },\r\n}))\r\nexport default ButtonSubmittedWithdraw\r\n","import React from 'react'\r\n\r\n// --- MaterialUI --- //\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport Button from './../../../../control/button/button'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport ButtonSubmittedWithdraw from './_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useManageProjectStore from '../../../../stores/manageProject/useManageProjectStore'\r\nimport constSubmittedType from '../../../../constants/submittedType'\r\n\r\ntype PageActionViewType = {\r\n onClickSaveDraft?: () => void\r\n onClickSave?: () => void\r\n onClickClose?: () => void\r\n onClickDeleteProject?: () => void\r\n isViewMode?: boolean\r\n}\r\nconst PageActionView: React.FC = (props) => {\r\n const { onClickSaveDraft, onClickSave, onClickClose, onClickDeleteProject, isViewMode = false } = props\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const classes = useStyles()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n // const isLgView = useMediaQuery(theme.breakpoints.down('lg'))\r\n // const isIpadView = useMediaQuery(theme.breakpoints.down('md'))\r\n const { projectData } = useManageProjectStore()\r\n const isNotFirstSubmit = projectData?.submitTypeInfo.value !== constSubmittedType.firstSubmitConsideration\r\n\r\n return (\r\n \r\n \r\n \r\n {onClickDeleteProject && (\r\n \r\n \r\n {isNotFirstSubmit\r\n ? translate.get('BUTTON.CANCEL_DRAFT')\r\n : translate.get('BUTTON.DELETE_PROJECT')}\r\n \r\n \r\n )}\r\n\r\n \r\n\r\n \r\n {onClickSaveDraft && (\r\n \r\n {translate.get('BUTTON.SAVE_DRAFT')}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {!isViewMode && (\r\n \r\n \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default PageActionView\r\n\r\nexport const ButtonSign: React.FC = (props) => {\r\n const { onClickSave, onClickClose } = props\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const classes = useStyles()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const isLgView = useMediaQuery(theme.breakpoints.down('lg'))\r\n const isIpadView = useMediaQuery(theme.breakpoints.down('md'))\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n\r\n \r\n {translate.get('BUTTON.SIGN_CERTIFICATE')}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport const ButtonClose: React.FC = (props) => {\r\n const { onClickClose } = props\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const isLgView = useMediaQuery(theme.breakpoints.down('lg'))\r\n const isIpadView = useMediaQuery(theme.breakpoints.down('md'))\r\n const classes = useStyles()\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n saveButton: {\r\n border: 'solid 1px #db5f8e',\r\n // [theme.breakpoints.down('xs')]: {\r\n // marginTop: '8px',\r\n // },\r\n },\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n [theme.breakpoints.down('xs')]: {\r\n marginTop: '16px',\r\n },\r\n },\r\n container: {\r\n padding: '8px 0px',\r\n },\r\n}))\r\n","import React from 'react'\r\nimport * as requestFormType from './newProjectType'\r\nimport useRequestForm from './useNewProject'\r\n\r\n// --- MaterialUI --- //\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\n\r\n// --- FinalForm --- //\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n// --- Control --- //\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\n\r\n// --- Share UI --- //\r\nimport EthicsForm from '../../../../shareUI/ethicsForm/ethicsForm'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport RemarkFromAdmin from '../../../../shareUI/remarkFromAdmin/remarkFromAdmin'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useSnackbarAction from '../../../../../../stores/snackbar/snackbarAction'\r\n\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\ntype ErrorsType = {\r\n langTH?: string\r\n langEN?: string\r\n}\r\n\r\n//View\r\nconst RequestFormView = (props: requestFormType.RequestFormView) => {\r\n const {\r\n isDraftData,\r\n onClickDeleteProject,\r\n onClickSubmit,\r\n onClickCancel,\r\n // onClickClose,\r\n onRefDialogTwo,\r\n configDialog,\r\n handleChangeFaculty,\r\n selectedIrb,\r\n // configLoading,\r\n isApproveWithComment,\r\n isEditAfterReview = false,\r\n initialDataValue,\r\n // --- props from outer --- //\r\n btnClose,\r\n // initialData = {},\r\n isViewMode = false,\r\n initialUploadFile = [],\r\n projectData,\r\n handleDirtyChange,\r\n onChangeResearcherType,\r\n valuesForm,\r\n formValueRef,\r\n researcherTypeRef,\r\n } = props\r\n //* STORE *//\r\n const manageProjectStore = useManageProjectStore()\r\n const snackbarAction = useSnackbarAction()\r\n\r\n const { documentTopic } = manageProjectStore\r\n const { profile } = useAuthenStore()\r\n\r\n const translate = useTranslate()\r\n const uploadFileinit = documentTopic?.map(() => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n },\r\n }\r\n })\r\n\r\n const isNotCompleteDocument = projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument\r\n const isDisableDoc = isViewMode && (!isNotCompleteDocument || !isApproveWithComment)\r\n\r\n let isDisableIRB = false\r\n if (isApproveWithComment || isEditAfterReview || !profile.isCunet || valuesForm.current?.faculty?.value === '7') {\r\n isDisableIRB = true //Flow approveWithComment ให้ Disable IRB หรือ flow แก้ไขหลังพิจารณา\r\n }\r\n\r\n let isUploadEditMode = false\r\n if (isApproveWithComment || isNotCompleteDocument || isEditAfterReview) {\r\n isUploadEditMode = true\r\n }\r\n\r\n const getRECDocumentLink = (irb: string) => {\r\n if (irb === '1') {\r\n return 'https://www.research.chula.ac.th/th/irb-1/'\r\n } else if (irb === '2') {\r\n return 'https://www.research.chula.ac.th/th/irb-2/'\r\n } else {\r\n return ''\r\n }\r\n }\r\n return (\r\n 0 ? initialUploadFile : uploadFileinit,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n validate={(values) => {\r\n const errors: ErrorsType = {}\r\n if (!values.langTH && !values.langEN) {\r\n errors.langTH = translate.get('MESSAGE.M016')\r\n\r\n errors.langEN = translate.get('MESSAGE.M016')\r\n }\r\n\r\n return errors\r\n }}\r\n >\r\n {({ handleSubmit, form, dirty, invalid, errors, values }) => {\r\n valuesForm.current = values\r\n if (formValueRef) formValueRef.current = values\r\n return (\r\n \r\n \r\n {isNotCompleteDocument && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {!btnClose && (\r\n \r\n {\r\n onClickDeleteProject()\r\n }\r\n : undefined\r\n }\r\n onClickClose={() => {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst RequestFormCtrl = (props: requestFormType.RequestFormType) => {\r\n const requestFormModel = useRequestForm(props)\r\n return \r\n}\r\nexport default RequestFormCtrl\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n gridBtn: {\r\n marginTop: '2%',\r\n },\r\n}))\r\n","import React from 'react'\r\nimport { fileExt as fileExtConst, topicForLecturer, topicForStudent } from '../../../../../constants/constants'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as resultOfConsiderType from './resultOfConsiderType'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\n// import * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\nimport _ from 'lodash'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { requestWebServiceTypes } from '../../../../../services/web/types'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport {\r\n DocumentInfo,\r\n SynthesisReviewInfo,\r\n SynthesisReviewRemarkInfo,\r\n} from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport path from 'path'\r\nimport useProjectHook from '../../../shareLogic/useProjectHook'\r\nimport { SynthesisReviewProjectRequestType } from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\n// import { fileExt as fileExtConst, topicForLecturer, topicForStudent } from '../../../../../../constants/constants'\r\nconst useSynthesisReview = (props: resultOfConsiderType.UseResultOfConsiderType) => {\r\n // const { projectData } = props\r\n const { callbackSaveComplete } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const projectHook = useProjectHook()\r\n\r\n const projectData = manageProjectStore.projectData\r\n const loadingHook = useLoading()\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n // const defaultRemarkRef = React.useRef()\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const profileStore = authenStore()\r\n const { profile } = profileStore\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const history = useHistory()\r\n const [initialComment, setInitialComment] = React.useState()\r\n const [synthesisReviewInfoList, setSynthesisReviewInfo] = React.useState([])\r\n const [isLoadedSynthesisReview, setIsLoadedSynthesisReview] = React.useState(false)\r\n const [synthesisReviewRemarkInfoList, setSynthesisReviewRemarkInfo] = React.useState()\r\n const [documentInfoList, setDocumentInfo] = React.useState([])\r\n const [approveStatus, setApproveStatus] = React.useState()\r\n const [initialRichTextEditor, setInitialRichTextEditor] = React.useState()\r\n const [initialRichRemark, setInitialRichRemark] = React.useState()\r\n\r\n React.useEffect(() => {\r\n getSynthesisReviewData()\r\n getSynthesisData()\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n createInitialData()\r\n createInitialComment()\r\n createInitialRichTextEditor()\r\n createInitialRichRemark()\r\n }, [isLoadedSynthesisReview])\r\n\r\n React.useEffect(() => {\r\n createInitialComment()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n // const handleDirtyChange = (props: any) => {\r\n // let isDirty: boolean = false\r\n // //** จัดformat initValue และ Form Value เพื่อเตรียมตัวนำไปใช้เปรียบเทียบค่า **//\r\n // let newFormValue = { ...props.values }\r\n // let initValue = { ...initialValues }\r\n\r\n // //**********************************************************//\r\n // const isEqual = _.isEqual(initValue, newFormValue) //ข้อมูลเท่ากัน\r\n // if (!isViewMode) {\r\n // if (isEqual) {\r\n // isDirty = false\r\n // } else {\r\n // isDirty = true\r\n // }\r\n // } else {\r\n // isDirty = false\r\n // }\r\n // const paramsDirty = {\r\n // tabDirty: isDirty,\r\n // callbackDirty: callbackDirtyProcess,\r\n // }\r\n // appFolderAndTabAction.setDirty(paramsDirty)\r\n // }\r\n\r\n // const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n // // if (onSaveDirty) {\r\n // // onSaveDirty(formRenderPropsRef.current, tabIndex, newTabSelected)\r\n // // }\r\n // }\r\n\r\n const getParameterForSave = (val: resultOfConsiderType.TFormValue) => {\r\n let paramForSave = null\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n let isDraft = false\r\n if (val.submitType === 'draft') {\r\n isDraft = true\r\n }\r\n let isApproveWithCommentFlow\r\n if (manageProjectStore?.projectData) {\r\n // isEditAfterReview = projectHook.isEditAfterReview(manageProjectStore?.projectData)\r\n isApproveWithCommentFlow = projectHook.isFlowApproveWithComment(manageProjectStore?.projectData)\r\n }\r\n\r\n const isNotHaveStampFileList =\r\n val?.documentCertificate?.childSelected?.length === 0 &&\r\n val?.documentCertificate?.parentSelected?.length === 0\r\n\r\n if (isApproveWithCommentFlow) {\r\n const synthesisReviewProjectRequest: requestWebServiceTypes.SynthesisReviewApproveWithCommentType = {\r\n loginUserID: profileStore.profile.userId,\r\n submittedID: submittedID,\r\n // stampFileList: val.documentCertificate.childSelected.map((itm: any) => {\r\n // return itm.fileID\r\n // }),\r\n stampFileList: isNotHaveStampFileList ? null : val.documentCertificate,\r\n isDraft: isDraft,\r\n }\r\n paramForSave = synthesisReviewProjectRequest\r\n } else {\r\n const synthesisReviewProjectRequest: requestWebServiceTypes.SynthesisReviewProjectRequestType = {\r\n loginUserID: profileStore.profile.userId,\r\n submittedID: submittedID,\r\n synthesisReviewInfo: val.commentDirector?.map((itm: any) => {\r\n return {\r\n commentaryTopicId: itm.id,\r\n comment:\r\n itm.consideration && itm.consideration.contentText ? itm.consideration.contentText : null,\r\n comment_htmltag:\r\n itm.consideration && itm.consideration.contentHtml ? itm.consideration.contentHtml : null,\r\n }\r\n }),\r\n // stampFileList: val.documentCertificate.childSelected.map((itm: any) => {\r\n // return itm.fileID\r\n // }),\r\n stampFileList: isNotHaveStampFileList ? null : val.documentCertificate,\r\n synthesisReviewRemarkInfo: {\r\n remark: val.remark && val.remark.contentText ? val.remark.contentText : null,\r\n remark_htmltag: val.remark && val.remark.contentHtml ? val.remark.contentHtml : null,\r\n },\r\n isDraft: isDraft,\r\n }\r\n paramForSave = synthesisReviewProjectRequest\r\n }\r\n\r\n // paramForSave = synthesisProjectRequest\r\n\r\n return paramForSave\r\n }\r\n\r\n const handleSubmitForm = async (val: resultOfConsiderType.TFormValue) => {\r\n const parameter = getParameterForSave(val)\r\n if (val.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n handleConfirmSave(parameter)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n\r\n const handleConfirmSave = async (\r\n paramForSave:\r\n | requestWebServiceTypes.SynthesisReviewProjectRequestType\r\n | requestWebServiceTypes.SynthesisReviewApproveWithCommentType,\r\n ) => {\r\n let isApproveWithCommentFlow\r\n if (manageProjectStore?.projectData) {\r\n // isEditAfterReview = projectHook.isEditAfterReview(manageProjectStore?.projectData)\r\n isApproveWithCommentFlow = projectHook.isFlowApproveWithComment(manageProjectStore?.projectData)\r\n }\r\n dialogRef.current?.closeDialog()\r\n\r\n const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n loadingHook.loadingOpen()\r\n let res\r\n if (isApproveWithCommentFlow) {\r\n const param = { ...paramForSave } as SynthesisReviewProjectRequestType\r\n res = await callWebService.synthesisReviewApproveWithCommentProject(param)\r\n } else {\r\n const param = { ...paramForSave } as requestWebServiceTypes.SynthesisReviewProjectRequestType\r\n res = await callWebService.synthesisReviewProject(param)\r\n }\r\n\r\n loadingHook.loadingClose()\r\n if (callbackSaveComplete) {\r\n if (res && res.status) {\r\n callbackSaveComplete(res.status, isDraft)\r\n }\r\n }\r\n }\r\n\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const getSynthesisData = async () => {\r\n if (projectData?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const submittedID = projectData.submittedID\r\n const { result } = await callWebService.getSynthesisProjectByID(submittedID)\r\n loadingHook.loadingClose()\r\n\r\n if (result) {\r\n const approveStatus = {\r\n id: result.approveStatusID,\r\n nameTH: result.approveStatusName_th,\r\n nameEN: result.approveStatusName_en,\r\n }\r\n setApproveStatus(approveStatus)\r\n }\r\n }\r\n }\r\n\r\n const getSynthesisReviewData = async () => {\r\n if (projectData?.submittedID) {\r\n setIsLoadedSynthesisReview(false)\r\n loadingHook.loadingOpen()\r\n const submittedID = projectData.submittedID\r\n const data = await callWebService.getSynthesisReview(submittedID)\r\n loadingHook.loadingClose()\r\n if (data.status === 1) {\r\n let documentInfo = [...data.result.documentInfo]\r\n documentInfo.forEach((itm) => {\r\n const topicID = itm.topicID\r\n let isCheckAll: boolean | null = null\r\n itm.fileInfo.forEach((file) => {\r\n file.topicID = topicID\r\n if (path.extname(`${file.filename}`) === fileExtConst.pdf) {\r\n if (file.isStamp && isCheckAll !== false) {\r\n isCheckAll = true\r\n } else {\r\n isCheckAll = false\r\n }\r\n }\r\n })\r\n itm.isCheckAll = isCheckAll\r\n })\r\n // BUG IS STAMP ออกมาเป็น false หมดเลย\r\n // setApproveStatus(data?.result?.approveStatusName_th)\r\n // setDocumentInfo(data.result.documentInfo)\r\n\r\n filterTopicUpload(documentInfo)\r\n // setDocumentInfo(documentInfo)\r\n setSynthesisReviewInfo(data.result.synthesisReviewInfo)\r\n setSynthesisReviewRemarkInfo(data.result.synthesisReviewRemarkInfo)\r\n setIsLoadedSynthesisReview(true)\r\n }\r\n }\r\n }\r\n\r\n const filterTopicUpload = (documentTopic: DocumentInfo[]) => {\r\n let docTopic: DocumentInfo[] = []\r\n const researcherTypeID = projectData?.researcherTypeInfo.value\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = documentTopic?.filter((item: any) => {\r\n return item.topicID !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item: any) => {\r\n return item.topicID !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, topicNo: index + 1 }\r\n })\r\n }\r\n setDocumentInfo(docTopic)\r\n }\r\n }\r\n\r\n const createInitialComment = () => {\r\n const commentInit = synthesisReviewInfoList?.map((itm: any, idx: number) => {\r\n return {\r\n topic:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.topicName_th\r\n : itm.topicName_en,\r\n id: itm.topicID,\r\n no: itm.topicNo,\r\n commentList: itm.synthesisComment,\r\n }\r\n })\r\n setInitialComment(commentInit)\r\n }\r\n\r\n const createInitialData = () => {\r\n const { childSelectedList, parentSelectedList } = getInitialChildSelected()\r\n\r\n const initialData = {\r\n documentCertificate: {\r\n childSelected: childSelectedList,\r\n parentSelected: parentSelectedList,\r\n },\r\n commentRemarkList:\r\n synthesisReviewRemarkInfoList && synthesisReviewRemarkInfoList.synthesisRemark\r\n ? synthesisReviewRemarkInfoList.synthesisRemark\r\n : null,\r\n remarkList:\r\n synthesisReviewRemarkInfoList && synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n : '-',\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const getInitialChildSelected = () => {\r\n let childSelectedList: any = []\r\n let parentSelectedList: any = []\r\n\r\n documentInfoList.forEach((documentItm) => {\r\n if (documentItm.fileInfo.length > 0) {\r\n documentItm.fileInfo.forEach((file) => {\r\n if (file.isStamp) {\r\n childSelectedList.push(file)\r\n }\r\n })\r\n }\r\n if (documentItm.isCheckAll) {\r\n parentSelectedList.push(documentItm)\r\n }\r\n })\r\n\r\n return { parentSelectedList, childSelectedList }\r\n }\r\n\r\n const createInitialRichTextEditor = () => {\r\n const initialData = synthesisReviewInfoList.map((itm) => {\r\n return {\r\n contentHtml: itm.synthesisReviewCommentHtmlTag\r\n ? itm.synthesisReviewCommentHtmlTag\r\n : itm.synthesisComment,\r\n contentText: itm.synthesisReviewComment,\r\n }\r\n })\r\n\r\n setInitialRichTextEditor(initialData)\r\n }\r\n\r\n const createInitialRichRemark = () => {\r\n const initialData = {\r\n contentHtml: isViewMode\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n : '-'\r\n : synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n : synthesisReviewRemarkInfoList?.synthesisRemark,\r\n contentText: synthesisReviewRemarkInfoList?.synthesisReviewRemark,\r\n }\r\n\r\n setInitialRichRemark(initialData)\r\n }\r\n\r\n return {\r\n approveStatus,\r\n initialValues,\r\n projectData,\r\n initialComment,\r\n documentInfoList,\r\n initialRichTextEditor,\r\n initialRichRemark,\r\n isViewMode,\r\n isFlowApproveWithComment: projectData ? projectHook.isFlowApproveWithComment(projectData) : false,\r\n configDialog,\r\n onRefDialog,\r\n onSubmitForm: handleSubmitForm,\r\n // handleDirtyChange: handleDirtyChange,\r\n onClickCancel: handleClickCancel,\r\n }\r\n}\r\n\r\nexport default useSynthesisReview\r\n","import * as resultOfConsiderType from './resultOfConsiderType'\r\nimport useResultOfConsider from './useResultOfConsider'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport { Grid, useTheme, makeStyles } from '@material-ui/core'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport PageAction from '../pageAction'\r\nimport Button from '../../../../../control/button/button'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\n\r\nimport constProjectStatus from '../../../../../constants/projectStatus'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../constants/approveStatus'\r\n\r\nconst ResultOfConsiderView: React.FC = (props) => {\r\n const {\r\n initialValues,\r\n approveStatus,\r\n projectData,\r\n initialComment,\r\n initialRichTextEditor,\r\n // documentInfoList,\r\n initialRichRemark,\r\n // handleDirtyChange,\r\n onClickCancel,\r\n onSubmitForm,\r\n configDialog,\r\n onRefDialog,\r\n isViewMode,\r\n // isHideDocumentCertificate = false,\r\n isFlowApproveWithComment = false,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const checkPermission = useCheckPermission()\r\n const snackbarAction = useSnackbarAction()\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const isAdmin = checkPermission.isUserAdmin()\r\n // const isShowCommentRemarkList = initialValues?.commentRemarkList !== null\r\n\r\n const isShowComment =\r\n approveStatus &&\r\n approveStatus?.id !== approveStatusREC1.approve &&\r\n approveStatus?.id !== approveStatusREC2.approve &&\r\n approveStatus?.id !== approveStatusREC1.approveForContiueResearch &&\r\n approveStatus?.id !== approveStatusREC2.approveForContiueResearch //ผลการพิจารณาเป็นไม่ใช่อนุมัติและไม่ใช่อนุมัติให้ดำเนินการวิจัยต่อเนื่อง จะโชว์คอมเม้นเป็นหัวข้อ ถ้าเป็นอนุมัติและ อนุมัติให้ดำเนินการวิจัยต่อเนื่องจะโชว์แค่ผลไม่โชว์คอมเม้น\r\n\r\n const isStatusComplete = projectData && projectData?.projectStatusInfo?.value === constProjectStatus.completed\r\n const isShowCloseProjectButton = isStatusComplete && isAdmin\r\n\r\n const renderResearcherView = (name: string, index: number) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {(props) => {\r\n const { form, handleSubmit, dirty, invalid, errors, values } = props\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {!isFlowApproveWithComment && (\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {approveStatus?.id === approveStatusREC1.approveWithComment ||\r\n approveStatus?.id === approveStatusREC2.approveWithComment\r\n ? translate.get('LABEL.APPROVE')\r\n : translate.languageStore.currentLanguage ===\r\n translate.languageKey.th\r\n ? approveStatus?.nameTH\r\n : approveStatus?.nameEN}\r\n \r\n\r\n {isShowComment && (\r\n \r\n {({ fields }) => {\r\n return fields?.map((name, index) =>\r\n renderResearcherView(name, index),\r\n )\r\n }}\r\n \r\n )}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* {!isFlowApproveWithComment && (\r\n \r\n \r\n \r\n {!isResearcherView ? (\r\n \r\n {isShowCommentRemarkList && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n )} */}\r\n \r\n {!isViewMode ? (\r\n \r\n {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n ) : (\r\n \r\n {isShowCloseProjectButton && (\r\n \r\n \r\n {translate.get('BUTTON.CLOSE_PROJECT')}\r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n {/* */}\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nconst ResultConsider: React.FC = (props) => {\r\n const useResultOfConsiderModel = useResultOfConsider(props)\r\n return \r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: 128,\r\n padding: 20,\r\n },\r\n titleFont: {\r\n color: '#BDBDBD',\r\n },\r\n contentFont: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default ResultConsider\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as memoMessageType from './resultOfConsiderType'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { DataSourceType } from '../../../../../../control/treeCheckboxNew/treeCheckbox'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { dateForAPI } from '../../../../../../utilities/date'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\n\r\nconst useMemomessageTerminate = (props: memoMessageType.UseMemoMessageType) => {\r\n const { onSaveComplete } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const callLookup = useLookupService()\r\n\r\n const [initialSuggestionNotice, setInitialSuggestionNotice] = React.useState()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n const [approveStatus, setApproveStatus] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getApproveStatus()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getApproveStatus = async () => {\r\n let res\r\n if (projectData?.irb) {\r\n res = await callLookup.callApproveStatusLut(\r\n projectData?.irb,\r\n constSubmittedType.firstSubmitConsideration_notScope,\r\n )\r\n if (res) {\r\n const formatedData = res?.result?.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n }) as []\r\n setApproveStatus(formatedData)\r\n }\r\n }\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n const res = await callWebService.getProjectNotPeopleMemoMessage(submittedID)\r\n const result = res.result\r\n\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n approveStatus:\r\n result && result?.approveStatusInfo\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result?.approveStatusInfo.nameTH\r\n : result?.approveStatusInfo.nameEN,\r\n value: result?.approveStatusInfo.value.toString(),\r\n }\r\n : null,\r\n }\r\n\r\n const initialSugestionNotice = {\r\n contentHtml: result?.memoMessageComment_html,\r\n contentText: result?.memoMessageComment,\r\n }\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n setInitialSuggestionNotice(initialSugestionNotice)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.signPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.signPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n const handleChangeStatus = () => {}\r\n return {\r\n projectData,\r\n formRef,\r\n configDialog,\r\n isViewMode: isViewMode,\r\n initialValues,\r\n initialMemorandumFile,\r\n initialSuggestionNotice,\r\n required,\r\n approveStatus,\r\n onRefDialog,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickOpenFile: handleClickOpenFile,\r\n onChangeStatus: handleChangeStatus,\r\n }\r\n}\r\n\r\nexport default useMemomessageTerminate\r\n","import * as memoMessageType from './resultOfConsiderType'\r\nimport useMemomessageTerminate from './useResultOfConsider'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../../constants/approveStatus'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n initialValues,\r\n projectData,\r\n configDialog,\r\n onRefDialog,\r\n onClickBackToSearch,\r\n initialMemorandumFile,\r\n initialSuggestionNotice,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSignMemoMessage: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n const isNotShowComment =\r\n initialValues?.approveStatus?.value === approveStatusREC1.approve.toString() ||\r\n initialValues?.approveStatus?.value === approveStatusREC2.approve.toString()\r\n\r\n return (\r\n {}}\r\n initialValues={{ ...initialValues, memorandumFile: initialMemorandumFile }}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n >\r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? initialValues?.approveStatus?.label\r\n : initialValues?.approveStatus?.label}\r\n \r\n \r\n \r\n\r\n {!isNotShowComment && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {isSignMemoMessage && (\r\n \r\n \r\n \r\n )}\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n {/* */}\r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import React from 'react'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport _ from 'lodash'\r\nimport useProjectHook from '../../../shareLogic/useProjectHook'\r\nimport { NoticeAdditionalType } from './noticeAdditionalDocument'\r\n\r\ntype UseResultOfConsiderType = NoticeAdditionalType\r\n\r\n// import { fileExt as fileExtConst, topicForLecturer, topicForStudent } from '../../../../../../constants/constants'\r\nconst useNoticeAdditional = (props: UseResultOfConsiderType) => {\r\n const manageProjectStore = useManageProjectStore()\r\n const projectHook = useProjectHook()\r\n\r\n const projectData = manageProjectStore.projectData\r\n\r\n return {\r\n projectData,\r\n }\r\n}\r\n\r\nexport default useNoticeAdditional\r\n","import useNoticeAdditional from './useNoticeAdditional'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport { Grid, useTheme, makeStyles, Typography } from '@material-ui/core'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\n\r\nexport type ResultOfConsiderViewType = ReturnType & NoticeAdditionalType\r\n\r\nconst NoticeAdditionalDocumentView: React.FC = (props) => {\r\n const { projectData } = props\r\n\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('sm'))\r\n const isIPadView = useMediaQuery(theme.breakpoints.down('md'))\r\n const classes = useStyles({ isMobileView, isIPadView })\r\n\r\n const getDisplaySendDocumentDate = () => {\r\n let display = '-'\r\n if (projectData?.sendDocumentDate) {\r\n display =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? convertDateToFormatTH(projectData?.sendDocumentDate)\r\n : convertDateToFormatEN(projectData?.sendDocumentDate)\r\n }\r\n return display\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {`${translate.get('LABEL.REQUIRE_SENT_DOC')}${\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? 'หรือไม่'\r\n : ''\r\n }`}{' '}\r\n :{' '}\r\n \r\n \r\n \r\n \r\n {projectData?.isRequestDocument\r\n ? translate.get('LABEL.NEED')\r\n : translate.get('LABEL.NOT_NEED')}\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.NUMBER_OF_DOC_TO_SENT')} : \r\n \r\n \r\n \r\n {projectData?.documentNumber\r\n ? projectData?.documentNumber + ` ${translate.get('LABEL.DOC_UNIT')}`\r\n : '-'}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('LABEL.DOC_SUBMITTED_DEADLINE')} :{' '}\r\n \r\n \r\n \r\n {getDisplaySendDocumentDate()}\r\n \r\n \r\n\r\n \r\n \r\n {translate.get('LABEL.REMARK')} : \r\n \r\n \r\n \r\n {projectData?.documentRemark || '-'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n//Controler\r\nexport type NoticeAdditionalType = {\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n isHideDocumentCertificate?: boolean\r\n}\r\nconst NoticeAdditional: React.FC = (props) => {\r\n const useNoticeAdditionalModel = useNoticeAdditional(props)\r\n return \r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: 128,\r\n padding: 20,\r\n },\r\n titleFont: {\r\n color: '#BDBDBD',\r\n },\r\n contentFont: {\r\n fontWeight: 'bold',\r\n },\r\n\r\n typography: {\r\n marginLeft: (props: any) => {\r\n let value = '0px'\r\n if (props.isMobileView || props.isIPadView) {\r\n value = '0px'\r\n } else {\r\n value = '6px'\r\n }\r\n return value\r\n },\r\n },\r\n}))\r\n\r\nexport default NoticeAdditional\r\n","import React, { useMemo } from 'react'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport _ from 'lodash'\r\n// import useProjectHook from '../../../shareLogic/useProjectHook'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useAppAlertMessageAction from '../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport path from 'path'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport {\r\n fileExt as fileExtConst,\r\n topicForLecturer,\r\n topicForStudent,\r\n cerTopic,\r\n} from '../../../../../constants/constants'\r\nimport { ResultDocumentTopicLut } from '../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport { uploadFileObjType } from './certificateStampDocumentType'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport { GetCertificateByIDResultType } from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\n\r\ntype UseResultOfConsiderType = any //NoticeAdditionalType\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\nconst useCertificateStampDoc = (props: UseResultOfConsiderType) => {\r\n const manageProjectStore = useManageProjectStore()\r\n const callLookup = useLookupService()\r\n const translate = useTranslate()\r\n const callWebService = useWebService()\r\n\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const manageProjectAction = useManageProjectAction()\r\n\r\n const projectData = manageProjectStore.projectData\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n const [certificateData, setCertificateData] = React.useState()\r\n const [initialUploadFileCer, setInitialUploadFilecer] = React.useState()\r\n const hideCertificate = useMemo(() => {\r\n return (\r\n !projectData?.isNeedEditForm &&\r\n projectData?.submitTypeInfo?.value === constSubmittedType.amendmentProject &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n )\r\n }, [projectData])\r\n\r\n React.useEffect(() => {\r\n if (projectData && projectData?.irb && projectData?.submitTypeInfo?.value) {\r\n getDocumentTopicLut(projectData?.irb, projectData?.submitTypeInfo.value)\r\n getCertificate()\r\n }\r\n }, [\r\n projectData?.projectID ?? null,\r\n projectData?.submittedID ?? null,\r\n projectData?.irb ?? null,\r\n projectData?.submitTypeInfo ?? null,\r\n ])\r\n\r\n React.useEffect(() => {}, [manageProjectStore.documentTopic])\r\n\r\n React.useEffect(() => {\r\n if (manageProjectStore.documentTopic) {\r\n createInitialUploadFileCer()\r\n createInitialUploadFile()\r\n }\r\n }, [\r\n certificateData?.submittedId ?? null,\r\n certificateData ?? null,\r\n manageProjectStore.documentTopic ?? null,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const getDocumentTopicLut = async (irb: number, submitTypeID: number) => {\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitTypeID)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n filterTopicUpload(res.result)\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n }\r\n }\r\n }\r\n const getCertificate = async () => {\r\n if (manageProjectStore.projectData) {\r\n const submittedID = manageProjectStore.projectData.submittedID\r\n if (submittedID && manageProjectStore.projectData.stepID > 2) {\r\n const { result } = await callWebService.getCertificateByID(submittedID)\r\n setCertificateData(result)\r\n }\r\n }\r\n }\r\n\r\n const filterTopicUpload = (documentTopic: ResultDocumentTopicLut[]) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n const researcherTypeID = manageProjectStore?.projectData?.researcherTypeInfo.value\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = documentTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1, subtopic: [] }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const handleClickFileStamp = (filePath: string, fileName: string) => {\r\n const fileExt = path.extname(`${fileName}`)\r\n\r\n if (fileExt !== fileExtConst.pdf) {\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n message: translate.get('ALERT.CONTENT.CAN_OPEN_ONLY_PDF'),\r\n })\r\n } else {\r\n window.open(filePath)\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n let uploadFileInit = manageProjectStore.documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: uploadFileObjType) => {\r\n certificateData?.documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList = docInfo.fileInfo\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic\r\n }\r\n })\r\n })\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n const createInitialUploadFileCer = () => {\r\n const uploadFileCerinit: Array = cerTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileCerinit.forEach((itm: UploadFileObjType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (certificateData?.certificateInfo?.certificateSignFileName_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: certificateData?.certificateInfo?.certificateSignFileName_th,\r\n filename: certificateData?.certificateInfo?.certificateSignFileName_th,\r\n fileID: certificateData?.certificateInfo?.certificateSignFileName_th,\r\n path: certificateData?.certificateInfo?.cerSign_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (certificateData?.certificateInfo?.certificateSignFileName_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: certificateData?.certificateInfo?.certificateSignFileName_en,\r\n filename: certificateData?.certificateInfo?.certificateSignFileName_en,\r\n fileID: certificateData?.certificateInfo?.certificateSignFileName_en,\r\n path: certificateData?.certificateInfo?.cerSign_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n setInitialUploadFilecer(uploadFileCerinit)\r\n }\r\n const getCerTopic = () => {\r\n let cerTopicList = cerTopic\r\n if (!certificateData?.certificateInfo?.cerSign_en) {\r\n cerTopicList = cerTopic.filter((itm) => itm.id !== 1)\r\n }\r\n if (!certificateData?.certificateInfo?.cerSign_th) {\r\n cerTopicList = cerTopic.filter((itm) => itm.id !== 0)\r\n }\r\n\r\n return cerTopicList\r\n }\r\n return {\r\n projectData,\r\n initialUploadFile,\r\n initialUploadFileCer,\r\n hideCertificate,\r\n cerTopicList: getCerTopic(),\r\n onClickFileStamp: handleClickFileStamp,\r\n documentTopicList: manageProjectStore.documentTopic,\r\n }\r\n}\r\n\r\nexport default useCertificateStampDoc\r\n","import useCertificateStampDocument from './useCertificateStampDocument'\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport React from 'react'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\n\r\nexport type ResultOfConsiderViewType = ReturnType & CertificateStampDocumentType\r\n\r\nconst CertificateStampDocView: React.FC = (props) => {\r\n const {\r\n // formRenderPropsRef,\r\n hideCertificate,\r\n initialUploadFile,\r\n initialUploadFileCer,\r\n documentTopicList,\r\n cerTopicList,\r\n onClickFileStamp,\r\n // projectData,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n return (\r\n {}}\r\n initialValues={{\r\n // ...initialValues,\r\n uploadFile: initialUploadFileCer,\r\n uploadFileCerDoc: initialUploadFile,\r\n }}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n >\r\n {(props) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n\r\n {!hideCertificate && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n//Controler\r\nexport type CertificateStampDocumentType = {\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n isHideDocumentCertificate?: boolean\r\n}\r\nconst CertificateStampDoc: React.FC = (props) => {\r\n const useCertificateStampDocumentModel = useCertificateStampDocument(props)\r\n return \r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: 128,\r\n padding: 20,\r\n },\r\n titleFont: {\r\n color: '#BDBDBD',\r\n },\r\n contentFont: {\r\n fontWeight: 'bold',\r\n },\r\n\r\n typography: {\r\n marginLeft: (props: any) => {\r\n let value = '0px'\r\n if (props.isMobileView || props.isIPadView) {\r\n value = '0px'\r\n } else {\r\n value = '6px'\r\n }\r\n return value\r\n },\r\n },\r\n}))\r\n\r\nexport default CertificateStampDoc\r\n","import React from 'react'\r\nimport { fileExt as fileExtConst, topicForLecturer, topicForStudent } from '../../../../../constants/constants'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as resultOfConsiderPreviousType from './resultOfConsiderPreviousType'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\n// import * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\nimport _ from 'lodash'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { requestWebServiceTypes } from '../../../../../services/web/types'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport {\r\n DocumentInfo,\r\n SynthesisReviewInfo,\r\n SynthesisReviewRemarkInfo,\r\n} from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport path from 'path'\r\nimport useProjectHook from '../../../shareLogic/useProjectHook'\r\nimport { SynthesisReviewProjectRequestType } from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport { ResultOfConsiderPreviousType } from './resultOfConsiderPrevious'\r\n\r\n// import { fileExt as fileExtConst, topicForLecturer, topicForStudent } from '../../../../../../constants/constants'\r\nexport type UseIssueConsiderationPreviousType = ResultOfConsiderPreviousType\r\n\r\nconst useResultOfConsiderPrevious = (props: UseIssueConsiderationPreviousType) => {\r\n const { submittedID, projectID } = props\r\n // const { callbackSaveComplete } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const projectHook = useProjectHook()\r\n\r\n const projectData = manageProjectStore.projectData\r\n const loadingHook = useLoading()\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n // const defaultRemarkRef = React.useRef()\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const profileStore = authenStore()\r\n const { profile } = profileStore\r\n const dialogRef = React.useRef>()\r\n const history = useHistory()\r\n const [initialComment, setInitialComment] = React.useState()\r\n const [synthesisReviewInfoList, setSynthesisReviewInfo] = React.useState([])\r\n const [isLoadedSynthesisReview, setIsLoadedSynthesisReview] = React.useState(false)\r\n const [synthesisReviewRemarkInfoList, setSynthesisReviewRemarkInfo] = React.useState()\r\n const [documentInfoList, setDocumentInfo] = React.useState([])\r\n const [approveStatus, setApproveStatus] = React.useState()\r\n const [initialRichTextEditor, setInitialRichTextEditor] = React.useState()\r\n const [initialRichRemark, setInitialRichRemark] = React.useState()\r\n\r\n React.useEffect(() => {\r\n getSynthesisReviewData()\r\n getSynthesisData()\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n createInitialData()\r\n createInitialComment()\r\n createInitialRichTextEditor()\r\n createInitialRichRemark()\r\n }, [isLoadedSynthesisReview])\r\n\r\n React.useEffect(() => {\r\n createInitialComment()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n // const handleClickCancel = (dirty: boolean) => {\r\n // if (dirty) {\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.WARNING'),\r\n // content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n // type: 'alert-confirm',\r\n // onClickConfirm: () => {\r\n // history.push(RoutePath.manageProject)\r\n // },\r\n // })\r\n // dialogRef.current?.openDialog()\r\n // } else {\r\n // history.push(RoutePath.manageProject)\r\n // }\r\n // }\r\n\r\n const getSynthesisData = async () => {\r\n // if (projectData?.submittedID) {\r\n // loadingHook.loadingOpen()\r\n // const submittedID = projectData.submittedID\r\n // const { result } = await callWebService.getSynthesisProjectByID(submittedID)\r\n // loadingHook.loadingClose()\r\n\r\n // if (result) {\r\n // const approveStatus = {\r\n // id: result.approveStatusID,\r\n // nameTH: result.approveStatusName_th,\r\n // nameEN: result.approveStatusName_en,\r\n // }\r\n // setApproveStatus(approveStatus)\r\n // }\r\n // }\r\n\r\n if (submittedID) {\r\n loadingHook.loadingOpen()\r\n // const submittedID = projectData.submittedID\r\n const { result } = await callWebService.getSynthesisProjectByID(submittedID)\r\n loadingHook.loadingClose()\r\n\r\n if (result) {\r\n const approveStatus = {\r\n id: result.approveStatusID,\r\n nameTH: result.approveStatusName_th,\r\n nameEN: result.approveStatusName_en,\r\n }\r\n setApproveStatus(approveStatus)\r\n }\r\n }\r\n }\r\n\r\n const getSynthesisReviewData = async () => {\r\n // if (projectData?.submittedID) {\r\n // setIsLoadedSynthesisReview(false)\r\n // loadingHook.loadingOpen()\r\n // const submittedID = projectData.submittedID\r\n // const data = await callWebService.getSynthesisReview(submittedID)\r\n // loadingHook.loadingClose()\r\n // if (data.status === 1) {\r\n // let documentInfo = [...data.result.documentInfo]\r\n // documentInfo.forEach((itm) => {\r\n // const topicID = itm.topicID\r\n // let isCheckAll: boolean | null = null\r\n // itm.fileInfo.forEach((file) => {\r\n // file.topicID = topicID\r\n // if (path.extname(`${file.filename}`) === fileExtConst.pdf) {\r\n // if (file.isStamp && isCheckAll !== false) {\r\n // isCheckAll = true\r\n // } else {\r\n // isCheckAll = false\r\n // }\r\n // }\r\n // })\r\n // itm.isCheckAll = isCheckAll\r\n // })\r\n // // BUG IS STAMP ออกมาเป็น false หมดเลย\r\n // // setApproveStatus(data?.result?.approveStatusName_th)\r\n // // setDocumentInfo(data.result.documentInfo)\r\n\r\n // filterTopicUpload(documentInfo)\r\n // // setDocumentInfo(documentInfo)\r\n // setSynthesisReviewInfo(data.result.synthesisReviewInfo)\r\n // setSynthesisReviewRemarkInfo(data.result.synthesisReviewRemarkInfo)\r\n // setIsLoadedSynthesisReview(true)\r\n // }\r\n // }\r\n\r\n if (submittedID) {\r\n setIsLoadedSynthesisReview(false)\r\n loadingHook.loadingOpen()\r\n // const submittedID = submittedID\r\n const data = await callWebService.getSynthesisReview(submittedID)\r\n loadingHook.loadingClose()\r\n if (data.status === 1) {\r\n let documentInfo = [...data.result.documentInfo]\r\n documentInfo.forEach((itm) => {\r\n const topicID = itm.topicID\r\n let isCheckAll: boolean | null = null\r\n itm.fileInfo.forEach((file) => {\r\n file.topicID = topicID\r\n if (path.extname(`${file.filename}`) === fileExtConst.pdf) {\r\n if (file.isStamp && isCheckAll !== false) {\r\n isCheckAll = true\r\n } else {\r\n isCheckAll = false\r\n }\r\n }\r\n })\r\n itm.isCheckAll = isCheckAll\r\n })\r\n // BUG IS STAMP ออกมาเป็น false หมดเลย\r\n // setApproveStatus(data?.result?.approveStatusName_th)\r\n // setDocumentInfo(data.result.documentInfo)\r\n\r\n filterTopicUpload(documentInfo)\r\n // setDocumentInfo(documentInfo)\r\n setSynthesisReviewInfo(data.result.synthesisReviewInfo)\r\n setSynthesisReviewRemarkInfo(data.result.synthesisReviewRemarkInfo)\r\n setIsLoadedSynthesisReview(true)\r\n }\r\n }\r\n }\r\n\r\n const filterTopicUpload = (documentTopic: DocumentInfo[]) => {\r\n let docTopic: DocumentInfo[] = []\r\n const researcherTypeID = projectData?.researcherTypeInfo.value\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = documentTopic?.filter((item: any) => {\r\n return item.topicID !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item: any) => {\r\n return item.topicID !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, topicNo: index + 1 }\r\n })\r\n }\r\n setDocumentInfo(docTopic)\r\n }\r\n }\r\n\r\n const createInitialComment = () => {\r\n const commentInit = synthesisReviewInfoList?.map((itm: any, idx: number) => {\r\n return {\r\n topic:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.topicName_th\r\n : itm.topicName_en,\r\n id: itm.topicID,\r\n no: itm.topicNo,\r\n commentList: itm.synthesisComment,\r\n }\r\n })\r\n setInitialComment(commentInit)\r\n }\r\n\r\n const createInitialData = () => {\r\n const { childSelectedList, parentSelectedList } = getInitialChildSelected()\r\n\r\n const initialData = {\r\n documentCertificate: {\r\n childSelected: childSelectedList,\r\n parentSelected: parentSelectedList,\r\n },\r\n commentRemarkList:\r\n synthesisReviewRemarkInfoList && synthesisReviewRemarkInfoList.synthesisRemark\r\n ? synthesisReviewRemarkInfoList.synthesisRemark\r\n : null,\r\n remarkList:\r\n synthesisReviewRemarkInfoList && synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n : '-',\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const getInitialChildSelected = () => {\r\n let childSelectedList: any = []\r\n let parentSelectedList: any = []\r\n\r\n documentInfoList.forEach((documentItm) => {\r\n if (documentItm.fileInfo.length > 0) {\r\n documentItm.fileInfo.forEach((file) => {\r\n if (file.isStamp) {\r\n childSelectedList.push(file)\r\n }\r\n })\r\n }\r\n if (documentItm.isCheckAll) {\r\n parentSelectedList.push(documentItm)\r\n }\r\n })\r\n\r\n return { parentSelectedList, childSelectedList }\r\n }\r\n\r\n const createInitialRichTextEditor = () => {\r\n const initialData = synthesisReviewInfoList.map((itm) => {\r\n return {\r\n contentHtml: itm.synthesisReviewCommentHtmlTag\r\n ? itm.synthesisReviewCommentHtmlTag\r\n : itm.synthesisComment,\r\n contentText: itm.synthesisReviewComment,\r\n }\r\n })\r\n\r\n setInitialRichTextEditor(initialData)\r\n }\r\n\r\n const createInitialRichRemark = () => {\r\n const initialData = {\r\n contentHtml: isViewMode\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n : '-'\r\n : synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n : synthesisReviewRemarkInfoList?.synthesisRemark,\r\n contentText: synthesisReviewRemarkInfoList?.synthesisReviewRemark,\r\n }\r\n\r\n setInitialRichRemark(initialData)\r\n }\r\n\r\n return {\r\n approveStatus,\r\n initialValues,\r\n projectData,\r\n initialComment,\r\n documentInfoList,\r\n initialRichTextEditor,\r\n initialRichRemark,\r\n isViewMode,\r\n isFlowApproveWithComment: projectData ? projectHook.isFlowApproveWithComment(projectData) : false,\r\n // onClickCancel: handleClickCancel,\r\n }\r\n}\r\n\r\nexport default useResultOfConsiderPrevious\r\n","// import * as resultOfConsiderType from './resultOfConsiderType'\r\n// import useResultOfConsider from './useResultOfConsider'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport PageAction from '../pageAction'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport { GetProjectResultType } from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useResultOfConsiderPrevious from './useResultOfConsiderPrevious'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../constants/approveStatus'\r\n//View\r\nexport type ResultOfConsiderPreviousViewType = ReturnType &\r\n ResultOfConsiderPreviousType\r\nconst ResultOfConsiderView: React.FC = (props) => {\r\n const {\r\n initialValues,\r\n approveStatus,\r\n initialComment,\r\n initialRichTextEditor,\r\n // documentInfoList,\r\n initialRichRemark,\r\n // onClickCancel,\r\n isViewMode,\r\n isFlowApproveWithComment = false,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n\r\n // const isShowCommentRemarkList = initialValues?.commentRemarkList !== null\r\n\r\n const isShowComment =\r\n approveStatus &&\r\n approveStatus?.id !== approveStatusREC1.approve &&\r\n approveStatus?.id !== approveStatusREC2.approve &&\r\n approveStatus?.id !== approveStatusREC1.approveForContiueResearch &&\r\n approveStatus?.id !== approveStatusREC2.approveForContiueResearch &&\r\n approveStatus?.id !== approveStatusREC1.acknowledgeAndDonotTakeAnyaAction &&\r\n approveStatus?.id !== approveStatusREC2.acknowledgeAndDonotTakeAnyaAction //ผลการพิจารณาเป็นไม่ใช่อนุมัติและไม่ใช่อนุมัติให้ดำเนินการวิจัยต่อเนื่อง จะโชว์คอมเม้นเป็นหัวข้อ ถ้าเป็นอนุมัติและ อนุมัติให้ดำเนินการวิจัยต่อเนื่องจะโชว์แค่ผลไม่โชว์คอมเม้น\r\n\r\n // const isStatusComplete = projectData && projectData?.projectStatusInfo?.value === 2\r\n\r\n const renderResearcherView = (name: string, index: number) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n {}}\r\n initialValues={{ ...initialValues, commentDirector: initialComment }}\r\n keepDirtyOnReinitialize={true}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n >\r\n {(props) => {\r\n const { form, handleSubmit, invalid, errors } = props\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {approveStatus?.id === approveStatusREC1.approveWithComment ||\r\n approveStatus?.id === approveStatusREC2.approveWithComment\r\n ? translate.get('LABEL.APPROVE')\r\n : translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? approveStatus?.nameTH\r\n : approveStatus?.nameEN}\r\n \r\n\r\n {isShowComment && (\r\n \r\n {({ fields }) => {\r\n return fields?.map((name, index) =>\r\n renderResearcherView(name, index),\r\n )\r\n }}\r\n \r\n )}\r\n \r\n \r\n \r\n\r\n {/* \r\n \r\n \r\n {!isResearcherView ? (\r\n \r\n {isShowCommentRemarkList && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n */}\r\n \r\n {!isViewMode && (\r\n \r\n {\r\n // onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n {/* */}\r\n {/* */}\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nexport type ResultOfConsiderPreviousType = {\r\n projectID: number\r\n submittedID: number\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n isHideDocumentCertificate?: boolean\r\n projectData2?: GetProjectResultType | null\r\n}\r\nconst ResultConsiderPrevious: React.FC = (props) => {\r\n const useResultOfConsiderPreviousModel = useResultOfConsiderPrevious(props)\r\n return \r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: 128,\r\n padding: 20,\r\n },\r\n titleFont: {\r\n color: '#BDBDBD',\r\n },\r\n contentFont: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default ResultConsiderPrevious\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport NewProject from '../../../page/requestNewProject/newProject/newProject'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/resultOfConsider'\r\nimport ProjectNotAboutPeopleResultOfConsider from '../../../page/resultOfConsider/projectNotAboutPeople/resultOfConsider'\r\n\r\nimport NoticeAdditionalDocument from '../../../page/noticeAdditionalDocument/noticeAdditionalDocument'\r\nimport CertificateStampDocument from '../../../page/certificateStampDocument/certificateStampDocument'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\nimport { menuTab } from '../../../../../../constants/constants'\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const isProjectNotAboutPeople = projectData?.isNotAboutPeople ?? false\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return (\r\n \r\n )\r\n case menuTab.tab22.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab23.id:\r\n if (isProjectNotAboutPeople) {\r\n return \r\n } else {\r\n return \r\n }\r\n case menuTab.tab24.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n {projectData && (\r\n \r\n )}\r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n\r\n const checkPermission = useCheckPermission()\r\n const { profile } = useAuthenStore()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n //กรณีเป็นผู้วิจัยภายนอกให้ default ค่าไว้เลย\r\n const isREC = { label: 'REC 1', value: '1' }\r\n const isFaculty = { label: 'ผู้วิจัยภายนอก', value: '7', irb: '1' }\r\n\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n // academicPosition: `7`, //ไม่ระบุ\r\n faculty: profile.isCunet ? undefined : isFaculty,\r\n IRB: profile.isCunet ? undefined : isREC,\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import useManageProjectStore from '../../../stores/manageProject/useManageProjectStore'\r\nimport authenStore from '../../../stores/authen/authenStore'\r\nimport constUserGroup from '../../../constants/userGroup'\r\nimport useCheckPermission from '../../../utilities/checkPermission'\r\nimport constSubmittedStep from '../../../constants/submittedStep'\r\nimport useWebService from '../../../services/web/useWebService'\r\nimport useFolderAndTab from '../project/useFolderAndTab'\r\nimport useLoading from '../../../control/loading/useLoading'\r\nimport { FormApi } from 'final-form'\r\nimport { Dispatch, SetStateAction, useRef } from 'react'\r\nimport { validateModeAccordionError } from '../../../utilities/validate'\r\nimport useAppFolderAndTabStore from '../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\nconst useEditSynthesis = (props: {\r\n form: FormApi, Partial>>\r\n setIsEditSynthesisSuccess?: Dispatch>\r\n}) => {\r\n const { form, setIsEditSynthesisSuccess } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const profileStore = authenStore()\r\n const checkPermission = useCheckPermission()\r\n const callWebService = useWebService()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const loadingHook = useLoading()\r\n const editingInitial = useRef<{ [key: string]: any }>({})\r\n const { tabSelected } = useAppFolderAndTabStore()\r\n\r\n const generateApproveStatusParams = () => {\r\n const currentFormValues = form.getState().values\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n const projectIRB = manageProjectStore?.projectData?.irb ?? null\r\n\r\n return {\r\n loginUserID: profileStore.profile.userId,\r\n submittedID: submittedID,\r\n reviewerID:\r\n profileStore.profile.userGroupId === constUserGroup.officer\r\n ? currentFormValues && currentFormValues.reviewer && currentFormValues.reviewer.value\r\n ? parseInt(currentFormValues?.reviewer.value)\r\n : null\r\n : profileStore.profile.userId,\r\n approveStatusID:\r\n currentFormValues && currentFormValues.approveStatus && currentFormValues.approveStatus.value\r\n ? parseInt(currentFormValues?.approveStatus.value)\r\n : null,\r\n irb: projectIRB,\r\n progress_6_months: currentFormValues.progress_6_months,\r\n progress_12_months: currentFormValues.progress_12_months,\r\n }\r\n }\r\n\r\n const updateApproveStatus = (fieldNames: string[]) => {\r\n const params = generateApproveStatusParams()\r\n const formProps = form.getState()\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n Promise.all([callWebService.updateSynthesisApproveStatus(params)])\r\n .then(async () => {\r\n await loadTabAndFolder()\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const generateCommentaryParams = (name: string) => {\r\n const currentFormValues = form.getState().values\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n const edittingVal = form.getFieldState(name)?.value\r\n let synthesisInfo: any[] = edittingVal?.map((data: any) => ({\r\n topicID: data?.id ?? null,\r\n contentHtml: data?.synthesisList?.contentHtml ?? '

',\r\n contentText: data?.synthesisList?.contentText ?? '',\r\n }))\r\n\r\n return {\r\n loginUserID: profileStore.profile.userId,\r\n submittedID: submittedID,\r\n reviewerID:\r\n profileStore.profile.userGroupId === constUserGroup.officer\r\n ? currentFormValues && currentFormValues.reviewer && currentFormValues.reviewer.value\r\n ? parseInt(currentFormValues?.reviewer.value)\r\n : null\r\n : profileStore.profile.userId,\r\n synthesisInfo: synthesisInfo ?? [],\r\n }\r\n }\r\n\r\n const updateCommentary = (name: string) => {\r\n const params = generateCommentaryParams(name)\r\n const formProps = form.getState()\r\n const isError = validateModeAccordionError([name], formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n Promise.all([callWebService.updateSynthesisCommentaryTopic(params)])\r\n .then(async () => {\r\n await loadTabAndFolder()\r\n if (setIsEditSynthesisSuccess) {\r\n setIsEditSynthesisSuccess((prev) => !prev)\r\n }\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const conditionUseAccordion = () => {\r\n const currentStep = manageProjectStore?.projectData?.stepID ?? null\r\n const tabStep = tabSelected.stepID ?? null\r\n const isOfficer = checkPermission.isUserAdmin()\r\n const isChairman = checkPermission.isUserChairmanOnly()\r\n const isViceChairman = checkPermission.isUserViceChairman()\r\n const isSecretary = checkPermission.isUserSecretary()\r\n const checkStep =\r\n tabStep === constSubmittedStep.commentary\r\n ? false\r\n : tabStep === constSubmittedStep.synthesis\r\n ? currentStep === constSubmittedStep.synthesisReview\r\n : null\r\n return (isOfficer || isChairman || isViceChairman || isSecretary) && checkStep\r\n }\r\n\r\n const loadTabAndFolder = async () => {\r\n loadingHook.loadingOpen()\r\n if (manageProjectStore?.projectData) {\r\n await tabAndFolderHook.reloadProjectData(\r\n manageProjectStore.projectData.projectID,\r\n manageProjectStore.projectData.submittedID,\r\n )\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const resetField = (name: string, callback: (data: any) => void) => {\r\n form.change(name, editingInitial.current[name])\r\n callback(\r\n form.getFieldState(name)?.value?.map((data: any) => ({\r\n ...data,\r\n synthesisList: {\r\n contentHtml: data?.synthesisList?.contentHtml ?? '

',\r\n contentValue: data?.synthesisList?.contenText ?? '',\r\n },\r\n })),\r\n )\r\n }\r\n\r\n const confirmField = (name: string, callback: (data: any) => void) => {\r\n callback(\r\n form.getFieldState(name)?.value?.map((data: any) => ({\r\n ...data,\r\n synthesisList: {\r\n contentHtml: data?.synthesisList?.contentHtml ?? '

',\r\n contentValue: data?.synthesisList?.contenText ?? '',\r\n },\r\n })),\r\n )\r\n }\r\n\r\n const defineValueFromInit = (name: string) => {\r\n return new Promise((resolve) => {\r\n const currentFieldValue = form.getFieldState(name)?.value\r\n const fieldInitialValue = form.getFieldState(name)?.initial\r\n if (!currentFieldValue) {\r\n editingInitial.current[name] = fieldInitialValue\r\n } else {\r\n editingInitial.current[name] = currentFieldValue\r\n }\r\n resolve('')\r\n })\r\n }\r\n\r\n return {\r\n useAccordionMode: conditionUseAccordion(),\r\n updateApproveStatus,\r\n defineValueFromInit,\r\n resetField,\r\n confirmField,\r\n updateCommentary,\r\n }\r\n}\r\n\r\nexport default useEditSynthesis\r\n","import React from 'react'\r\nimport useLookupService from '../../../../services/lookup/useLookupService'\r\nimport * as resultConsiderationTypes from './resultConsiderationTypes'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport useEditSynthesis from '../../shareLogic/useEditSynthesis'\r\nimport { useForm } from 'react-final-form'\r\n\r\nconst useResultConsideration = (props: resultConsiderationTypes.UseResultConsiderationType) => {\r\n const { irb, onChangStatus, isCommitee } = props\r\n const callLookup = useLookupService()\r\n const translate = useTranslate()\r\n const form = useForm()\r\n const editSynthesis = useEditSynthesis({ form })\r\n\r\n const [approveStatus, setApproveStatus] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n if (irb) {\r\n getApproveStatus()\r\n }\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getApproveStatus = async () => {\r\n let res\r\n if (irb) {\r\n if (isCommitee === null || isCommitee === undefined) {\r\n res = await callLookup.callApproveStatusLut(irb)\r\n } else {\r\n res = await callLookup.callApproveStatusLutProjectRenewal(irb, isCommitee)\r\n }\r\n }\r\n\r\n const formatedData = res?.result?.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n }) as []\r\n setApproveStatus(formatedData)\r\n }\r\n\r\n const handleChangStatus = (val: resultConsiderationTypes.OptType) => {\r\n onChangStatus(val)\r\n }\r\n\r\n return {\r\n approveStatus,\r\n useAccordionMode: editSynthesis.useAccordionMode,\r\n onChangeStatus: handleChangStatus,\r\n updateApproveStatus: editSynthesis.updateApproveStatus,\r\n }\r\n}\r\n\r\nexport default useResultConsideration\r\n","import { styled } from '@material-ui/styles'\r\nimport { FC, useRef, useState } from 'react'\r\nimport MyAccordion from '../../../../control/accordion/accordion'\r\nimport MyButton from '../../../../control/button/button'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\n\r\nimport EditOutlinedIcon from '@material-ui/icons/EditOutlined'\r\n\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport Tooltip from '../../../../control/tooltip/tooltip'\r\nimport { useForm } from 'react-final-form'\r\nimport Dialog from '../../../../control/dialog/dialog'\r\nimport { validateModeAccordionError } from '../../../../utilities/validate'\r\n\r\nconst ConfirmBtn = styled(MyButton)({\r\n /** Confirm Style */\r\n})\r\n\r\nconst CancelBtn = styled(MyButton)({\r\n /** Cancel Style */\r\n})\r\n\r\nconst ModeAccordion: FC<{\r\n title: string\r\n renderViewComponent: () => JSX.Element\r\n renderEditComponent: () => JSX.Element\r\n onConfirm?: () => void\r\n onCancel?: () => void\r\n onClickEdit?: () => void\r\n additionIcon?: () => JSX.Element\r\n fieldNames?: string[]\r\n isViewMode?: boolean\r\n isAddOtherLanguage?: boolean\r\n noPadding?: boolean\r\n}> = ({\r\n renderViewComponent,\r\n renderEditComponent,\r\n title,\r\n onConfirm: handleConfirm,\r\n onCancel: handleCancel,\r\n additionIcon,\r\n onClickEdit: handleEdit,\r\n fieldNames = [],\r\n isViewMode,\r\n isAddOtherLanguage = true,\r\n noPadding = false,\r\n}) => {\r\n const translate = useTranslate()\r\n const [isEditting, setIsEditting] = useState(false)\r\n const form = useForm()\r\n const formStateRef = useRef<{ [key: string]: any }>({})\r\n const confirmRef = useRef>()\r\n const cancelRef = useRef>()\r\n\r\n const onClickEdit = (evt: any) => {\r\n onClickParent(evt)\r\n formStateRef.current = form.getState().values\r\n handleEdit && handleEdit()\r\n setIsEditting(true)\r\n }\r\n\r\n const onClickParent = (evt: any) => {\r\n evt.stopPropagation()\r\n }\r\n\r\n const onConfirm = (evt: any) => {\r\n onClickParent(evt)\r\n const isError = validateModeAccordionError(fieldNames, form.getState())\r\n if (!isError) {\r\n confirmRef?.current?.openDialog()\r\n } else {\r\n form.submit()\r\n }\r\n }\r\n\r\n const onSubmitConfirm = () => {\r\n if (handleConfirm) {\r\n Promise.all([handleConfirm()]).then(() => setIsEditting(false))\r\n } else {\r\n setIsEditting(false)\r\n }\r\n confirmRef?.current?.closeDialog()\r\n }\r\n\r\n const onCancel = (evt: any) => {\r\n let isDirty = false\r\n onClickParent(evt)\r\n fieldNames.forEach((key) => {\r\n if (form.getFieldState(key)?.dirty) {\r\n isDirty = true\r\n }\r\n })\r\n if (isDirty) {\r\n cancelRef?.current?.openDialog()\r\n } else {\r\n onSubmitCancel()\r\n }\r\n }\r\n\r\n const onSubmitCancel = () => {\r\n fieldNames.forEach((key) => {\r\n form.change(key, formStateRef.current[key])\r\n })\r\n if (handleCancel) {\r\n Promise.all([handleCancel()]).then(() => setIsEditting(false))\r\n } else {\r\n setIsEditting(false)\r\n }\r\n cancelRef?.current?.closeDialog()\r\n }\r\n\r\n const bindConfirmRef = (func: Record) => {\r\n confirmRef.current = { ...func }\r\n }\r\n\r\n const bindCancelRef = (func: Record) => {\r\n cancelRef.current = { ...func }\r\n }\r\n\r\n return (\r\n <>\r\n (\r\n <>\r\n {!isEditting && isAddOtherLanguage ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n <>\r\n  \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n  \r\n \r\n {translate.get('BUTTON.CONFIRM')}\r\n \r\n \r\n )}\r\n  \r\n {additionIcon && additionIcon()}\r\n \r\n )\r\n : () => <>\r\n }\r\n >\r\n {isEditting || !isAddOtherLanguage ? renderEditComponent() : renderViewComponent()}\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default ModeAccordion\r\n","import * as resultConsiderationTypes from './resultConsiderationTypes'\r\nimport useResultConsideration from './useResultConsideration'\r\nimport Autocomplete from '../../../../control/autocomplete/autocomplete'\r\nimport MyAccordion from '../../../../control/accordion/accordion'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport React from 'react'\r\nimport { Grid, Typography } from '@material-ui/core'\r\nimport ModeAccordion from '../modeAccordion/ModeAccordion'\r\nimport MyCheckbox from '../../../../control/checkbox/checkbox'\r\nimport useAppFolderAndTabStore from '../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport submittedStep from '../../../../constants/submittedStep'\r\n\r\n//View\r\nconst ResultConsiderationView = (props: resultConsiderationTypes.ResultConsiderationViewType) => {\r\n const { approveStatus, onChangeStatus, disabled = false, useAccordionMode, updateApproveStatus } = props\r\n const translate = useTranslate()\r\n const { tabSelected } = useAppFolderAndTabStore()\r\n\r\n const renderChild = (disabledVal: boolean) => {\r\n return (\r\n \r\n \r\n \r\n \r\n {tabSelected.stepID === submittedStep.synthesis && (\r\n \r\n {translate.get('LABEL.DURATION_PROGRESS_REPORT')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {useAccordionMode ? (\r\n renderChild(false)}\r\n renderViewComponent={() => renderChild(true)}\r\n title={translate.get('LABEL.ETHIC_REVIEW_OUTCOME')}\r\n isViewMode={true}\r\n fieldNames={['approveStatus']}\r\n onConfirm={() => updateApproveStatus(['approveStatus'])}\r\n />\r\n ) : (\r\n {renderChild(disabled)}\r\n )}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst ResultConsideration = (props: resultConsiderationTypes.ResultConsiderationType) => {\r\n const { disabled } = props\r\n const resultConsiderationModel = useResultConsideration(props)\r\n return \r\n}\r\n\r\nexport default ResultConsideration\r\n","import React from 'react'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as syntheticFormTypes from './synthesisType'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { requestWebServiceTypes } from '../../../../../services/web/types'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport { TabSelectedType } from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { DatasourceForCopyToClipbaord } from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport submittedStep from '../../../../../constants/submittedStep'\r\nimport { convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport { AnyObject } from 'final-form'\r\nimport useEditSynthesis from '../../../shareLogic/useEditSynthesis'\r\nimport { DatasourceForExport } from '../../../../../control/exportToMSWord/exportToMSWord'\r\nimport _ from 'lodash'\r\n\r\nconst useSynthesis = (props: syntheticFormTypes.UseSynthetic) => {\r\n const { callbackSaveComplete, isOneComment } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const tabAndFolderHook = useFolderAndTab()\r\n\r\n const projectData = manageProjectStore.projectData\r\n const [isExempt, setIsExempt] = React.useState(false)\r\n const loadingHook = useLoading()\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [reviewer, setReviewer] = React.useState([])\r\n const [commentTitleList, setCommentTitleList] = React.useState([])\r\n const [initialSynthesis, setInitialSynthesis] = React.useState([])\r\n const [synthesisProject, setSynthesisProject] = React.useState()\r\n const [commentList, setCommentList] = React.useState([])\r\n const [remarkList, setRemarkList] = React.useState([])\r\n const [isRequired, setIsRequired] = React.useState(false)\r\n const [isEditSynthsisSuccess, setIsEditSynthesisSuccess] = React.useState(false)\r\n const formRef = React.useRef()\r\n const [textRemaining, setTextRemaining] = React.useState([])\r\n const [textRemainingRemark, setTextRemainingRemark] = React.useState()\r\n const defaultRemarkRef = React.useRef()\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const profileStore = authenStore()\r\n const { profile } = profileStore\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const history = useHistory()\r\n const formValues = React.useRef()\r\n const editSynthesis = useEditSynthesis({ form: formRef.current, setIsEditSynthesisSuccess })\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const [dataSourceForCopyToClipboard, setDataSourceForCopyToClipboard] = React.useState<\r\n DatasourceForCopyToClipbaord[]\r\n >([])\r\n const [dataSourceForExport, setDataSourceForExport] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n //check ประเภทโครงการ กรณีเป็นโครงการประเภท excempt ถ้าเป็น excempt แสดงแบบกล่องเดียว\r\n if (isOneComment) {\r\n setIsExempt(true)\r\n } else {\r\n setIsExempt(false)\r\n }\r\n if (projectData?.irb) {\r\n getReviewer(projectData.irb)\r\n }\r\n\r\n getCommentaryTopicLut(projectData?.irb)\r\n }\r\n\r\n getSynthesisProjectByID()\r\n getAllCommentaryForExport()\r\n }, [\r\n projectData?.projectID ?? null,\r\n projectData?.submittedID ?? null,\r\n translate.languageStore.currentLanguage,\r\n isEditSynthsisSuccess,\r\n ])\r\n\r\n React.useEffect(() => {\r\n createInitialSynthesis()\r\n }, [commentTitleList, synthesisProject])\r\n\r\n const getReviewer = async (irb: number) => {\r\n if (irb) {\r\n const res = await callLookup.callReviewerLut(irb)\r\n const formatData = res.result.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n setReviewer(formatData)\r\n }\r\n }\r\n\r\n const getCommentaryTopicLut = async (irb: number) => {\r\n if (irb) {\r\n const res = await callLookup.callCommentaryTopicLut(irb)\r\n if (res.result) {\r\n const formatData = res.result.map((itm: any, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n setCommentTitleList(formatData)\r\n }\r\n // setCommentTitleList(res.result)\r\n }\r\n }\r\n\r\n const getSynthesisProjectByID = async () => {\r\n if (projectData) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getSynthesisProjectByID(projectData.submittedID)\r\n const dataForCopyToClipboard = [\r\n {\r\n fullNameTH: result.fullReviewer_th ? result.fullReviewer_th : ' ',\r\n fullNameEN: result.fullReviewer_en ? result.fullReviewer_en : ' ',\r\n updatedDate: convertDateToFormatTH(result.updatedDate),\r\n updateByNameTH: result.updatedByNameTH,\r\n updateByNameEN: result.updatedByNameEN,\r\n approveStatusNameTH: result.approveStatusName_th ?? '',\r\n approveStatusNameEN: result.approveStatusName_en ?? '',\r\n commentaryInfo: result.synthesisInfo.map((itm) => {\r\n return {\r\n topicID: itm.topicID,\r\n no: itm.no,\r\n comment: itm.comment?.contentText,\r\n comment_htmltag: itm.comment?.contentHtml\r\n ? itm.comment?.contentHtml\r\n .replaceAll('', '')\r\n .replaceAll('', '')\r\n .replaceAll('', '')\r\n .replaceAll('', '')\r\n : itm.comment?.contentHtml,\r\n name_th:\r\n profile.irb === 1 && itm.topicName_th_irb1\r\n ? itm.topicName_th_irb1\r\n : profile.irb === 2 && itm.topicName_th_irb2\r\n ? itm.topicName_th_irb2\r\n : 'ข้อคิดเห็น / ข้อสังเกต',\r\n name_en:\r\n profile.irb === 1 && itm.topicName_en_irb1\r\n ? itm.topicName_en_irb1\r\n : profile.irb === 2 && itm.topicName_en_irb2\r\n ? itm.topicName_en_irb2\r\n : 'ข้อคิดเห็น / ข้อสังเกต',\r\n }\r\n }),\r\n },\r\n ]\r\n setDataSourceForCopyToClipboard(dataForCopyToClipboard)\r\n loadingHook.loadingClose()\r\n setSynthesisProject(result)\r\n }\r\n }\r\n\r\n const createInitialData = () => {\r\n const conditionRemark =\r\n synthesisProject && synthesisProject?.synthesisRemarkInfo && synthesisProject?.synthesisRemarkInfo?.remark\r\n\r\n const remark = synthesisProject?.synthesisRemarkInfo?.remark\r\n const countStrRemark = remark ? remark.length : 0\r\n const textRemainingRemarkInitial = 4000 - countStrRemark\r\n\r\n const initialData = {\r\n reviewer:\r\n synthesisProject && synthesisProject.fullReviewer_th\r\n ? { label: synthesisProject.fullReviewer_th, value: synthesisProject.reviewerID.toString() }\r\n : projectData && projectData.reviewerName_th\r\n ? { label: projectData.reviewerName_th, value: projectData.reviewerUserID.toString() }\r\n : {},\r\n approveStatus:\r\n synthesisProject && synthesisProject?.approveStatusID\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? synthesisProject.approveStatusName_th\r\n : synthesisProject.approveStatusName_en,\r\n value: synthesisProject?.approveStatusID.toString(),\r\n }\r\n : null,\r\n submittedID: synthesisProject && synthesisProject?.submittedID ? synthesisProject?.submittedID : null,\r\n remark: conditionRemark ? synthesisProject?.synthesisRemarkInfo?.remark : isViewMode ? '-' : null,\r\n progress_6_months: synthesisProject?.progress_6_months,\r\n progress_12_months: synthesisProject?.progress_12_months,\r\n }\r\n setTextRemainingRemark(textRemainingRemarkInitial)\r\n setInitialValues(initialData)\r\n }\r\n\r\n const createInitialSynthesis = () => {\r\n setInitialSynthesisInfo()\r\n setInitialRemarkSynthesisInfo()\r\n\r\n createInitialData()\r\n }\r\n const setInitialSynthesisInfo = () => {\r\n if (projectData && synthesisProject) {\r\n if (\r\n synthesisProject?.synthesisInfo.length > 1\r\n // projectData.submitTypeInfo.value !== constSubmittedType.editAfterReview //เช็คว่าต้องไม่ใช่โครงการที่เป็น แก้ไขหลังพิจารณา\r\n ) {\r\n setInitialSubComment() //เป็นหัวข้อ\r\n } else {\r\n setInitialComment() //เป็นแบบข้อเดียว\r\n }\r\n }\r\n }\r\n const setInitialSubComment = () => {\r\n const synthesisInit = commentTitleList?.map((itm: any) => {\r\n return {\r\n topic: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n id: itm.id,\r\n synthesisList: { contentHtml: '', contentText: '' },\r\n commentList: null,\r\n strTheRest: 4000,\r\n }\r\n })\r\n synthesisInit.forEach((item: any) => {\r\n synthesisProject?.synthesisInfo.forEach((info: syntheticFormTypes.synthesisProjectType) => {\r\n if (info.topicID === item.id) {\r\n item.topic =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? info.topicName_th\r\n : info.topicName_en\r\n item.id = info.topicID\r\n let defaultTextSynthesisList = ''\r\n let defaultHTMLSynthesisList = ''\r\n\r\n //จัดความคิดเห็นของกรรมการ\r\n const objComment = info.committeeCommentTopicInfo.map((itm: any, index) => {\r\n //เอาคอมเม้นของกรรมการทุกคนมายำรวมกัน ขึ้นบรรทัดใหม่เมื่อเป็นอาจารย์คนถัดไป\r\n defaultTextSynthesisList =\r\n index === 0\r\n ? `${itm.comment?.contentText ?? ''}`\r\n : `${defaultTextSynthesisList}\\n${itm.comment?.contentText ?? ''}`\r\n defaultHTMLSynthesisList =\r\n index === 0\r\n ? `${itm.comment?.contentHtml ?? '

'}`\r\n : `${defaultHTMLSynthesisList}\\n${itm.comment?.contentHtml ?? '

'}`\r\n\r\n return {\r\n no: info.no,\r\n topicID: info.topicID,\r\n director:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.fullName_th\r\n : itm.fullName_en,\r\n comment: { contentText: itm.comment.contentText, contentHtml: itm.comment.contentHtml },\r\n approveStatusName:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.approveStatusName_th\r\n : itm.approveStatusName_en,\r\n saveCommentDate: itm.saveCommentDate,\r\n }\r\n })\r\n item.commentList = objComment\r\n item.synthesisList.contentText = info.comment?.contentText\r\n ? info.comment?.contentText\r\n : defaultTextSynthesisList\r\n item.synthesisList.contentHtml = info.comment?.contentHtml\r\n ? info.comment?.contentHtml\r\n : defaultHTMLSynthesisList\r\n const countTextComment = info.comment?.contentText ? info.comment?.contentText.length : 0\r\n item.strTheRest = 4000 - countTextComment\r\n }\r\n })\r\n })\r\n\r\n const commentDirector = synthesisInit.map((itm) => {\r\n return itm.commentList\r\n })\r\n\r\n const textRemain = synthesisInit?.map((item) => {\r\n return item.strTheRest\r\n })\r\n setTextRemaining(textRemain)\r\n\r\n setCommentList(commentDirector)\r\n setInitialSynthesis(synthesisInit)\r\n }\r\n const setInitialComment = () => {\r\n const synthesisInit = [\r\n {\r\n topic: 'โครงการวิจัย',\r\n id: 1,\r\n synthesisList: { contentHtml: '', contentText: '' },\r\n commentList: null,\r\n strTheRest: 4000,\r\n },\r\n ]\r\n synthesisInit.forEach((item: any) => {\r\n synthesisProject?.synthesisInfo.forEach((info: syntheticFormTypes.synthesisProjectType) => {\r\n item.topic =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? info.topicName_th\r\n : info.topicName_en\r\n item.id = info.topicID\r\n let defaultTextSynthesisList = ''\r\n let defaultHTMLSynthesisList = ''\r\n\r\n //จัดความคิดเห็นของกรรมการ\r\n const objComment = info.committeeCommentTopicInfo.map((itm: any, index) => {\r\n //เอาคอมเม้นของกรรมการทุกคนมายำรวมกัน ขึ้นบรรทัดใหม่เมื่อเป็นอาจารย์คนถัดไป\r\n defaultTextSynthesisList =\r\n index === 0\r\n ? `${itm.comment?.contentText ?? ''}`\r\n : `${defaultTextSynthesisList}\\n${itm.comment?.contentText ?? ''}`\r\n defaultHTMLSynthesisList =\r\n index === 0\r\n ? `${itm.comment?.contentHtml ?? '

'}`\r\n : `${defaultHTMLSynthesisList}\\n${itm.comment?.contentHtml ?? '

'}`\r\n\r\n return {\r\n no: info.no,\r\n topicID: info.topicID,\r\n director:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.fullName_th\r\n : itm.fullName_en,\r\n comment: { contentText: itm.comment.contentText, contentHtml: itm.comment.contentHtml },\r\n approveStatusName:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.approveStatusName_th\r\n : itm.approveStatusName_en,\r\n saveCommentDate: itm.saveCommentDate,\r\n }\r\n })\r\n item.commentList = objComment\r\n item.synthesisList.contentText = info.comment?.contentText\r\n ? info.comment?.contentText\r\n : defaultTextSynthesisList\r\n item.synthesisList.contentHtml = info.comment?.contentHtml\r\n ? info.comment?.contentHtml\r\n : defaultHTMLSynthesisList\r\n const countTextComment = info.comment?.contentText ? info.comment?.contentText.length : 0\r\n item.strTheRest = 4000 - countTextComment\r\n })\r\n })\r\n const commentDirector = synthesisInit.map((itm: any) => {\r\n return itm.commentList\r\n })\r\n\r\n const textRemain = synthesisInit?.map((item) => {\r\n return item.strTheRest\r\n })\r\n setTextRemaining(textRemain)\r\n setCommentList(commentDirector)\r\n setInitialSynthesis(synthesisInit)\r\n }\r\n\r\n const setInitialRemarkSynthesisInfo = () => {\r\n const remarkList = synthesisProject?.synthesisRemarkInfo?.committeeRemarkInfo\r\n remarkList?.forEach((element: syntheticFormTypes.CommitteeCommentTopicInfo, idx: number) => {\r\n defaultRemarkRef.current =\r\n idx === 0 ? `${element.comment}` : `${defaultRemarkRef.current}\\n${element.comment}`\r\n })\r\n setRemarkList(remarkList)\r\n }\r\n\r\n /* function สำหรับ set ข้อมูลเมื่อเลือกผลพิจารณา */\r\n const handleChangStatus = (val: syntheticFormTypes.OptType) => {\r\n // if (val && val.value === '8') {\r\n // setIsRequired(true)\r\n // } else {\r\n // setIsRequired(false)\r\n // }\r\n // setTimeout(() => {\r\n // formRef.current.resetFieldState('remark')\r\n // })\r\n }\r\n\r\n const handleDirtyChange = (props: any) => {\r\n formValues.current = { ...props.values }\r\n let isDirty: boolean = false\r\n //** จัดformat initValue และ Form Value เพื่อเตรียมตัวนำไปใช้เปรียบเทียบค่า **//\r\n let newFormValue = _.omit({ ...props.values }, ['commentList1', 'commentList2', 'commentList3', 'commentList4'])\r\n let initValue = { ...initialValues, synthesisInfo: initialSynthesis }\r\n\r\n //**********************************************************//\r\n const isEqual = _.isEqual(newFormValue, initValue) //ข้อมูลเท่ากัน\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n const parameter = getParameterForSave(formValues.current)\r\n if (parameter) {\r\n parameter.isDraft = true\r\n handleConfirmSave(parameter, tabIndex, newTabSelected, isFolder)\r\n }\r\n }\r\n\r\n const handleChangTextField = (val: string, index: number) => {\r\n if (textRemaining?.length > 0) {\r\n textRemaining[index] = 4000 - val.length\r\n }\r\n }\r\n const handleChangRemark = (val: string) => {\r\n if (textRemainingRemark) {\r\n setTextRemainingRemark(4000 - val.length)\r\n }\r\n }\r\n\r\n const getParameterForSave = (val: syntheticFormTypes.TFormValue) => {\r\n let paramForSave = null\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n let isDraft = false\r\n if (val.submitType === 'draft') {\r\n isDraft = true\r\n }\r\n const synthesisInfo = val?.synthesisInfo.map((item: AnyObject) => {\r\n return {\r\n topicID: item && item?.id ? item?.id : null,\r\n contentHtml: item && item?.synthesisList?.contentHtml ? item?.synthesisList?.contentHtml : null,\r\n contentText: item && item?.synthesisList?.contentText ? item?.synthesisList?.contentText : null,\r\n }\r\n })\r\n const synthesisProjectRequest: REQServiceType.SynthesisProjectType = {\r\n loginUserID: profileStore.profile.userId,\r\n submittedID: submittedID,\r\n reviewerID:\r\n profile.userGroupId === constUserGroup.officer\r\n ? val && val.reviewer && val.reviewer.value\r\n ? parseInt(val?.reviewer.value)\r\n : null\r\n : profileStore.profile.userId,\r\n approveStatusID:\r\n val && val.approveStatus && val.approveStatus.value ? parseInt(val?.approveStatus.value) : null,\r\n synthesisInfo: synthesisInfo ? synthesisInfo : [],\r\n synthesisRemark: val && val.remark ? val?.remark : null,\r\n isDraft: isDraft,\r\n progress_6_months: val.progress_6_months,\r\n progress_12_months: val.progress_12_months,\r\n }\r\n paramForSave = synthesisProjectRequest\r\n\r\n return paramForSave\r\n }\r\n const handleSubmitForm = async (val: syntheticFormTypes.TFormValue) => {\r\n const parameter = getParameterForSave(val)\r\n if (val.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n handleConfirmSave(parameter)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n\r\n const handleConfirmSave = async (\r\n paramForSave: requestWebServiceTypes.SynthesisProjectType,\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n\r\n const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.synthesisProject(paramForSave)\r\n\r\n if (!isFolder) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n if (tabIndex && newTabSelected) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n } else {\r\n //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n if (callbackSaveComplete) {\r\n if (res && res.status) {\r\n callbackSaveComplete(res.status, isDraft)\r\n }\r\n }\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const checkIsDisplayCopyToClipboard = () => {\r\n let isDisplayCopyToClipboard = false\r\n if (projectData) {\r\n if (projectData?.stepID > submittedStep.synthesis) {\r\n isDisplayCopyToClipboard = true\r\n } else {\r\n isDisplayCopyToClipboard = false\r\n }\r\n }\r\n return isDisplayCopyToClipboard\r\n }\r\n\r\n const editInitialSynthesis = (data: any) => {\r\n setInitialSynthesis(data)\r\n }\r\n\r\n const getAllCommentaryForExport = async () => {\r\n if (projectData) {\r\n const { result } = await callWebService.getHistorySynthesis(projectData?.submittedID)\r\n const allCommentList = result.map((itm) => {\r\n if (itm.commentary.length === 1) {\r\n itm.commentary.forEach((comment) => {\r\n comment.nameTopicTH1 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n comment.nameTopicEN1 = 'Suggestion / Notice'\r\n comment.nameTopicTH2 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n comment.nameTopicEN2 = 'Suggestion / Notice'\r\n })\r\n }\r\n\r\n return {\r\n userID: itm.userID,\r\n fullUsername_en: itm.fullUsername_en,\r\n fullUsername_th: itm.fullUsername_th,\r\n commentary: itm.commentary,\r\n updatedDate: itm.updatedDate,\r\n updateByNameTH: itm.updateByNameTH,\r\n updateByNameEN: itm.updateByNameEN,\r\n approveStatusName_th: itm.approveStatusName_th,\r\n approveStatusName_en: itm.approveStatusName_en,\r\n approveStatusID: itm.approveStatusID,\r\n historyCommentary: itm.historyCommentary,\r\n }\r\n })\r\n setDataSourceForExport(allCommentList)\r\n }\r\n }\r\n return {\r\n commentList,\r\n isViewMode,\r\n initialValues,\r\n reviewerList: reviewer,\r\n commentTitleList,\r\n initialSynthesis,\r\n isExempt,\r\n remarkList,\r\n isRequired,\r\n formRef,\r\n configDialog,\r\n projectData,\r\n // textRemaining,\r\n // textRemainingRemark,\r\n isShowUpdateDate,\r\n dataSourceForCopyToClipboard,\r\n isDisplayCopyToClipboard: checkIsDisplayCopyToClipboard(),\r\n useAccordionMode: editSynthesis.useAccordionMode,\r\n dataSourceForExport,\r\n defineValueFromInit: editSynthesis.defineValueFromInit,\r\n resetField: editSynthesis.resetField,\r\n confirmField: editSynthesis.confirmField,\r\n updateCommentary: editSynthesis.updateCommentary,\r\n editInitialSynthesis,\r\n onRefDialog,\r\n onChangTextField: handleChangTextField,\r\n handleDirtyChange,\r\n onChangStatus: handleChangStatus,\r\n onChangRemark: handleChangRemark,\r\n onSubmitForm: handleSubmitForm,\r\n onClickCancel: handleClickCancel,\r\n }\r\n}\r\n\r\nexport default useSynthesis\r\n","import React, { useState, useRef } from 'react'\r\nimport MyButton from '../button/button'\r\nimport { commentaryInfo } from '../../services/web/types/responseWebServiceTypes'\r\nimport useSnackbarAction from '../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../i18n/useTranslate'\r\nimport { makeStyles } from '@material-ui/core'\r\n\r\nexport type CopyToClipboardViewType = CopyToClipboardPropsType\r\nenum PageType {\r\n ReviewerCommentPage = '1', // หน้าบันทึกข้อคิดเห็นกรรมการ\r\n SynthesisPage = '2', // หน้าสังเคราะห์ข้อคิดเห็น\r\n}\r\n\r\nexport const CopyToClipboardView: React.FC = (props) => {\r\n const { dataSource, pageType } = props\r\n const tableRef = useRef(null)\r\n const [copySuccess, setCopySuccess] = useState('')\r\n const snackbarAction = useSnackbarAction()\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n\r\n const nameLabel = useRef('')\r\n const saveCommentDateLabel = useRef('')\r\n const commentInsteadBy = useRef('')\r\n\r\n React.useEffect(() => {\r\n if (pageType === PageType.ReviewerCommentPage) {\r\n nameLabel.current = translate.get('LABEL.COMMITTEE_NAME')\r\n saveCommentDateLabel.current = translate.get('LABEL.COMMITTEE_MEETING_DATE')\r\n commentInsteadBy.current = translate.get('LABEL.COMMENT_INSTEAD_BY')\r\n } else if (pageType === PageType.SynthesisPage) {\r\n nameLabel.current = translate.get('LABEL.REVIEWER_NAME')\r\n saveCommentDateLabel.current = translate.get('LABEL.PRESIDENT_MEETING_DATE')\r\n commentInsteadBy.current = translate.get('LABEL.COMMENT_INSTEAD_BY')\r\n }\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const copyToClip = () => {\r\n let range = document.createRange()\r\n //@ts-ignore\r\n range.selectNodeContents(tableRef.current)\r\n\r\n let sel = window.getSelection()\r\n\r\n if (sel) {\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M020'),\r\n type: 'success',\r\n })\r\n sel.removeAllRanges()\r\n sel.addRange(range)\r\n document.execCommand('Copy')\r\n sel.removeAllRanges()\r\n //paste the copied data to mailto body\r\n // document.addEventListener('paste', function (event) {\r\n // if (event && event.clipboardData) {\r\n // var clipText = event.clipboardData.getData('Text')\r\n // console.log('clipText', clipText)\r\n // //@ts-ignore\r\n // window.location = `mailto:?subject=I wanted you to see this site&body=${clipText}`\r\n // }\r\n // })\r\n }\r\n }\r\n return (\r\n
\r\n
\r\n
\r\n {dataSource &&\r\n dataSource.map((itm, index) => {\r\n return (\r\n
\r\n
\r\n {nameLabel.current} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.fullNameTH\r\n : itm.fullNameEN}{' '}\r\n {(translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.fullNameTH\r\n : itm.fullNameEN) !==\r\n (translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.updateByNameTH\r\n : itm.updateByNameEN) && (\r\n <>\r\n {commentInsteadBy.current} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.updateByNameTH\r\n : itm.updateByNameEN}{' '}\r\n \r\n )}\r\n {saveCommentDateLabel.current} : \r\n {itm.updatedDate}{' '}\r\n
\r\n {itm.commentaryInfo.map((commentItm, indexComment) => {\r\n return (\r\n <>\r\n
\r\n {`${indexComment + 1}`}.{' '}\r\n {translate.languageStore.currentLanguage ===\r\n translate.languageKey.th\r\n ? commentItm.name_th\r\n : commentItm.name_en}{' '}\r\n :\r\n
\r\n
\r\n
\r\n \r\n )\r\n })}\r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.approveStatusNameTH\r\n : itm.approveStatusNameEN}\r\n
\r\n
\r\n )\r\n })}\r\n
\r\n
\r\n\r\n {document.queryCommandSupported('copy') && (\r\n
\r\n \r\n {translate.get('BUTTON.COPY_TO_CLIPBOARD')}\r\n \r\n {copySuccess}\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\nexport type DatasourceForCopyToClipbaord = {\r\n fullNameEN: string\r\n fullNameTH: string\r\n updatedDate?: string\r\n updateByNameTH?: string\r\n updateByNameEN?: string\r\n approveStatusNameTH?: string\r\n approveStatusNameEN?: string\r\n\r\n commentaryInfo: commentaryInfo[]\r\n}\r\nexport type CopyToClipboardPropsType = {\r\n dataSource: DatasourceForCopyToClipbaord[]\r\n pageType: '1' | '2'\r\n}\r\n\r\nlet CopyToClipboard: React.FC = ({ ...others }) => {\r\n // const styleCustom = { minWidth: '125px', ...others?.style }\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n spaceLine: {\r\n marginBottom: '30px',\r\n },\r\n container: {\r\n zIndex: -999,\r\n position: 'absolute',\r\n opacity: 0,\r\n },\r\n}))\r\n\r\nexport default CopyToClipboard\r\n","import React from 'react'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport useManageProjectStore from '../../../../stores/manageProject/useManageProjectStore'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport * as dateUtil from '../../../../utilities/date'\r\nimport useDisplayUpdater from './useDisplayUpdater'\r\n\r\ntype DisplayUpdaterViewType = DisplayUpdaterType\r\nconst DisplayUpdaterView: React.FC = (props) => {\r\n const displayUpdater = useDisplayUpdater()\r\n const translate = useTranslate()\r\n const projectStore = useManageProjectStore()\r\n\r\n return (\r\n (projectStore?.currentPageUpdater && (\r\n \r\n {translate.get('LABEL.UPDATER')} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? projectStore?.currentPageUpdater?.name_th\r\n : projectStore?.currentPageUpdater?.name_en}\r\n   \r\n {translate.get('LABEL.UPDATE_DATE')} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? dateUtil.convertDateToFormatTH(projectStore?.currentPageUpdater?.date)\r\n : dateUtil.convertDateToFormatEN(projectStore?.currentPageUpdater?.date)}\r\n \r\n )) ||\r\n null\r\n )\r\n}\r\ntype DisplayUpdaterType = {}\r\nconst DisplayUpdater: React.FC = (props) => {\r\n return \r\n}\r\n\r\nexport default DisplayUpdater\r\n","import useTranslate from '../../i18n/useTranslate'\r\nimport { styled, makeStyles } from '@material-ui/core'\r\nimport MyButton from '../button/button'\r\nimport moment from 'moment'\r\nimport { FC, useEffect, useRef } from 'react'\r\nimport { saveAs } from 'file-saver'\r\nimport { asBlob } from 'html-docx-js-typescript'\r\nimport { convertDateToFormatTH } from '../../utilities/date'\r\nimport ReactHtmlParser from 'react-html-parser'\r\nimport useAppFolderAndTabStore from '../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport submittedStep from '../../constants/submittedStep'\r\n\r\nconst ButtonExport = styled(MyButton)({\r\n backgroundColor: '#0062FF',\r\n color: 'white',\r\n})\r\n\r\nexport type CommentaryDataType = {\r\n nameTopicTH1: string\r\n nameTopicEN1: string\r\n nameTopicTH2: string\r\n nameTopicEN2: string\r\n comment: string\r\n commentHTML: string\r\n id: number\r\n}\r\n\r\nexport type DatasourceForExport = {\r\n userID: number\r\n fullUsername_th: string\r\n fullUsername_en: string\r\n updatedDate: string\r\n updateByNameTH: string\r\n updateByNameEN: string\r\n approveStatusID: number\r\n approveStatusName_th: string\r\n approveStatusName_en: string\r\n commentary: CommentaryDataType[]\r\n historyCommentary: CommentaryDataType[]\r\n}\r\nexport type ExportDataPropsType = {\r\n dataSource: DatasourceForExport[]\r\n}\r\n\r\nconst ExportToMSWord: FC<{\r\n dataSource: DatasourceForExport[]\r\n irb: number\r\n}> = ({ dataSource, irb }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n\r\n const nameLabel = useRef('')\r\n const saveCommentDateLabel = useRef('')\r\n const commentInsteadBy = useRef('')\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const isSynthesis = appFolderAndTabStore.tabSelected.stepID === submittedStep.synthesis\r\n\r\n useEffect(() => {\r\n nameLabel.current = translate.get('LABEL.COMMITTEE_NAME')\r\n saveCommentDateLabel.current = translate.get('LABEL.COMMITTEE_MEETING_DATE')\r\n commentInsteadBy.current = translate.get('LABEL.COMMENT_INSTEAD_BY')\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const exportToWord = async () => {\r\n const header = `\r\n \r\n `\r\n\r\n const footer = ''\r\n\r\n const html = header + document.getElementById('exportData')?.innerHTML + footer\r\n const replaceHtml = html.replaceAll('', '').replaceAll('', '')\r\n const replaceAllHtml = replaceHtml.replaceAll('', '').replaceAll('', '')\r\n const blob: any = await asBlob(replaceAllHtml)\r\n // Specify file name\r\n const reportDate = moment(new Date()).format('yyyyMMDD')\r\n const filename = isSynthesis\r\n ? `ข้อคิดเห็นของผู้สังเคราะห์ความเห็น_${reportDate}.docx`\r\n : `ข้อคิดเห็นของคณะกรรมการ_${reportDate}.docx`\r\n\r\n saveAs(blob, filename)\r\n }\r\n\r\n const exportHistoryToWord = async () => {\r\n const header = `\r\n \r\n `\r\n\r\n const footer = ''\r\n\r\n const html = header + document.getElementById('exportHistory')?.innerHTML + footer\r\n const replaceHtml = html.replaceAll('', '').replaceAll('', '')\r\n const replaceAllHtml = replaceHtml.replaceAll('', '').replaceAll('', '')\r\n const blob: any = await asBlob(replaceAllHtml)\r\n // Specify file name\r\n const reportDate = moment(new Date()).format('yyyyMMDD')\r\n const filename = `ประวัติข้อคิดเห็นของคณะกรรมการ_${reportDate}.docx`\r\n\r\n saveAs(blob, filename)\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n {dataSource &&\r\n dataSource.map((itm, index) => {\r\n return (\r\n
\r\n
\r\n {nameLabel.current} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.fullUsername_th\r\n : itm.fullUsername_en}{' '}\r\n {(translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.fullUsername_th\r\n : itm.fullUsername_en) !==\r\n (translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.updateByNameTH\r\n : itm.updateByNameEN) && (\r\n <>\r\n {commentInsteadBy.current}:{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.updateByNameTH\r\n : itm.updateByNameEN}{' '}\r\n \r\n )}\r\n {saveCommentDateLabel.current} : \r\n {convertDateToFormatTH(itm.updatedDate)}{' '}\r\n
\r\n {itm.commentary.map((commentItm, indexComment) => {\r\n return (\r\n <>\r\n
\r\n {`${indexComment + 1}`}.{' '}\r\n {irb === 1\r\n ? translate.languageStore.currentLanguage ===\r\n translate.languageKey.th\r\n ? commentItm.nameTopicTH1 ?? 'ข้อคิดเห็น / ข้อสังเกต'\r\n : commentItm.nameTopicEN1 ?? 'Suggestion / Notice'\r\n : translate.languageStore.currentLanguage ===\r\n translate.languageKey.th\r\n ? commentItm.nameTopicTH2 ?? 'ข้อคิดเห็น / ข้อสังเกต'\r\n : commentItm.nameTopicEN2 ?? 'Suggestion / Notice'}{' '}\r\n :\r\n
\r\n
{ReactHtmlParser(commentItm.commentHTML)}
\r\n
\r\n \r\n )\r\n })}\r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.approveStatusName_th\r\n : itm.approveStatusName_en}\r\n
\r\n
\r\n )\r\n })}\r\n
\r\n
\r\n\r\n
\r\n
\r\n {dataSource &&\r\n dataSource.map((itm, index) => {\r\n return (\r\n
\r\n
\r\n \r\n ครั้งที่{' '}\r\n {itm.historyCommentary ? itm.historyCommentary[index]?.id ?? index + 1 : ''}{' '}\r\n :\r\n \r\n
\r\n
\r\n {nameLabel.current} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.fullUsername_th\r\n : itm.fullUsername_en}{' '}\r\n {(translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.fullUsername_th\r\n : itm.fullUsername_en) !==\r\n (translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.updateByNameTH\r\n : itm.updateByNameEN) && (\r\n <>\r\n {commentInsteadBy.current}:{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.updateByNameTH\r\n : itm.updateByNameEN}{' '}\r\n \r\n )}\r\n {saveCommentDateLabel.current} : \r\n {convertDateToFormatTH(itm.updatedDate)}{' '}\r\n
\r\n {itm?.historyCommentary?.map((commentItm, indexComment) => {\r\n return (\r\n <>\r\n
\r\n {`${indexComment + 1}`}.{' '}\r\n {irb === 1\r\n ? translate.languageStore.currentLanguage ===\r\n translate.languageKey.th\r\n ? commentItm.nameTopicTH1\r\n : commentItm.nameTopicEN1\r\n : translate.languageStore.currentLanguage ===\r\n translate.languageKey.th\r\n ? commentItm.nameTopicTH2\r\n : commentItm.nameTopicEN2}{' '}\r\n :\r\n
\r\n
{ReactHtmlParser(commentItm.commentHTML)}
\r\n
\r\n \r\n )\r\n })}\r\n {itm?.historyCommentary?.length === 0 && (\r\n

ไม่มีประวัติข้อคิดเห็นของกรรมการท่านนี้

\r\n )}\r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.approveStatusName_th\r\n : itm.approveStatusName_en}\r\n
\r\n
\r\n )\r\n })}\r\n
\r\n
\r\n {!isSynthesis && (\r\n
\r\n \r\n {translate.get('BUTTON.EXPORT_HISTORY_WORD')}\r\n \r\n
\r\n )}\r\n
\r\n \r\n {isSynthesis\r\n ? translate.get('BUTTON.EXPORT_SYNTHESIS_WORD')\r\n : translate.get('BUTTON.EXPORT_COMMENT_WORD')}\r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n spaceLine: {\r\n marginBottom: '30px',\r\n },\r\n container: {\r\n zIndex: -999,\r\n position: 'absolute',\r\n opacity: 0,\r\n },\r\n btnExport: {\r\n padding: '10px',\r\n textAlign: 'end',\r\n },\r\n}))\r\n\r\nexport default ExportToMSWord\r\n","import React from 'react'\r\n\r\n// --- MaterialUI --- //\r\nimport * as synthesisType from './synthesisType'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport Autocomplete from '../../../../../control/autocomplete/autocomplete'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport ResultConsideration from '../../../shareUI/resultConsideration/resultConsideration'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport useSynthesis from './useSynthesis'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport { Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport PageAction from '../pageAction'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport CopyToClipboard from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport { richEditorRequired } from '../../../../../utilities/validate'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport ExportToMSWord from '../../../../../control/exportToMSWord/exportToMSWord'\r\n\r\nconst SynthesisREC1View = (props: synthesisType.SynthesisViewType) => {\r\n const {\r\n formRef,\r\n isExempt,\r\n isViewMode,\r\n commentList,\r\n reviewerList,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialSynthesis,\r\n commentTitleList,\r\n isDisplayCopyToClipboard,\r\n dataSourceForCopyToClipboard,\r\n projectData,\r\n useAccordionMode,\r\n dataSourceForExport,\r\n resetField,\r\n confirmField,\r\n defineValueFromInit,\r\n editInitialSynthesis,\r\n updateCommentary,\r\n onRefDialog,\r\n onSubmitForm,\r\n onClickCancel,\r\n onChangStatus,\r\n handleDirtyChange,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const isAdmin = checkPermission.isUserAdmin()\r\n const isDisableReviewer = isViewMode //irb1 จะเปิดให้สามารถเลือกรายชื่อผู้ให้ความเห็นได้\r\n const irb = projectData?.irb\r\n // const isStatusComplete = projectData && projectData?.projectStatusInfo?.value === 2\r\n // const isShowCloseProjectButton = isStatusComplete && isAdmin\r\n const snackbarAction = useSnackbarAction()\r\n\r\n const isRequiredSynthesize = {\r\n errorMessage: `${translate.get('MESSAGE.M013')}`,\r\n showAsterisk: true,\r\n triggedValidate: true,\r\n }\r\n\r\n const getDisplayCommitteeSaveDate = (itm: any) => {\r\n return translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? convertDateToFormatTH(itm.saveCommentDate)\r\n : convertDateToFormatEN(itm.saveCommentDate)\r\n }\r\n\r\n const renderCommitteeComment = (itm: any, index: number) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderComment = (name: string, index: number, isDisabled: boolean) => {\r\n return (\r\n \r\n \r\n {commentList &&\r\n commentList?.map((itm: any) => {\r\n const filterArr = itm?.map((item: any) => {\r\n if (commentTitleList[index]?.id === item?.topicID || isExempt) {\r\n return renderCommitteeComment(item, index)\r\n }\r\n })\r\n\r\n return filterArr\r\n })}\r\n \r\n\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderFieldArray = (isDisabled: boolean, useAccordion: boolean) => {\r\n return (\r\n \r\n \r\n {({ fields }) => {\r\n return fields?.map((name, index) => (\r\n \r\n {useAccordion ? (\r\n \r\n {renderComment(name, index, isDisabled)}\r\n \r\n ) : (\r\n <>\r\n
\r\n                                        \r\n                                            {isExempt\r\n                                                ? translate.get('LABEL.SUGGESTION_NOTICE')\r\n                                                : `${index + 1}. ${\r\n                                                      translate.languageStore.currentLanguage ===\r\n                                                      translate.languageKey.th\r\n                                                          ? commentTitleList[index]?.name_th\r\n                                                          : commentTitleList[index]?.name_en\r\n                                                  }`}\r\n                                        \r\n                                        {renderComment(name, index, isDisabled)}\r\n                                    \r\n                                )}\r\n                            \r\n                        ))\r\n                    }}\r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    return (\r\n        <>\r\n            {isDisplayCopyToClipboard && (\r\n                \r\n                    \r\n                    \r\n                \r\n            )}\r\n            \r\n                {(props) => {\r\n                    const { form, handleSubmit, dirty, invalid, errors } = props\r\n                    formRef.current = form\r\n\r\n                    return (\r\n                        \r\n                            {isAdmin && (\r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            )}\r\n\r\n                            \r\n                                {useAccordionMode ? (\r\n                                     renderFieldArray(false, true)}\r\n                                        renderViewComponent={() => renderFieldArray(true, true)}\r\n                                        fieldNames={['synthesisInfo']}\r\n                                        onCancel={() => {\r\n                                            resetField('synthesisInfo', (data: any) => {\r\n                                                editInitialSynthesis(data)\r\n                                            })\r\n                                        }}\r\n                                        onConfirm={() => {\r\n                                            confirmField('synthesisInfo', (data: any) => {\r\n                                                editInitialSynthesis(data)\r\n                                            })\r\n                                            return updateCommentary('synthesisInfo')\r\n                                        }}\r\n                                        onClickEdit={() => defineValueFromInit('synthesisInfo')}\r\n                                    />\r\n                                ) : (\r\n                                    renderFieldArray(isViewMode, true)\r\n                                )}\r\n                            \r\n\r\n                            \r\n                                \r\n                            \r\n\r\n                            {isShowUpdateDate && }\r\n\r\n                            {!isViewMode && (\r\n                                \r\n                                     {\r\n                                            onClickCancel(dirty)\r\n                                        }}\r\n                                        onClickSave={() => {\r\n                                            form.change('submitType', 'save')\r\n                                            handleSubmit()\r\n                                            invalid &&\r\n                                                errors &&\r\n                                                snackbarAction.openSnackbar({\r\n                                                    message: translate.get('MESSAGE.M012'),\r\n                                                    type: 'error',\r\n                                                })\r\n                                        }}\r\n                                        onClickSaveDraft={() => {\r\n                                            form.change('submitType', 'draft')\r\n                                            handleSubmit()\r\n                                        }}\r\n                                    />\r\n                                \r\n                            )}\r\n\r\n                            \r\n                            \r\n                        \r\n                    )\r\n                }}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nconst SynthesisREC1: React.FC = (props) => {\r\n    const useSyntheticModel = useSynthesis(props)\r\n    return \r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n    spacingButton: {\r\n        marginBottom: '10px',\r\n    },\r\n    paper: {\r\n        width: '100%',\r\n        height: 128,\r\n        padding: 20,\r\n    },\r\n    titleFont: {\r\n        color: '#BDBDBD',\r\n    },\r\n    contentFont: {\r\n        fontWeight: 'bold',\r\n    },\r\n    btnGroup: {\r\n        padding: '18px',\r\n    },\r\n}))\r\n\r\nexport default SynthesisREC1\r\n","import React from 'react'\r\n\r\n// --- MaterialUI --- //\r\nimport * as synthesisType from './synthesisType'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport Autocomplete from '../../../../../control/autocomplete/autocomplete'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport ResultConsideration from '../../../shareUI/resultConsideration/resultConsideration'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport useSynthesis from './useSynthesis'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport { Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport PageAction from '../pageAction'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport CopyToClipboard from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport { richEditorRequired } from '../../../../../utilities/validate'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport ExportToMSWord from '../../../../../control/exportToMSWord/exportToMSWord'\r\n\r\nconst SynthesisREC2View = (props: synthesisType.SynthesisViewType) => {\r\n    const {\r\n        formRef,\r\n        isExempt,\r\n        isViewMode,\r\n        commentList,\r\n        reviewerList,\r\n        configDialog,\r\n        initialValues,\r\n        isShowUpdateDate,\r\n        initialSynthesis,\r\n        commentTitleList,\r\n        isDisplayCopyToClipboard,\r\n        dataSourceForCopyToClipboard,\r\n        projectData,\r\n        useAccordionMode,\r\n        dataSourceForExport,\r\n        resetField,\r\n        confirmField,\r\n        defineValueFromInit,\r\n        editInitialSynthesis,\r\n        updateCommentary,\r\n        onRefDialog,\r\n        onSubmitForm,\r\n        onClickCancel,\r\n        onChangStatus,\r\n        handleDirtyChange,\r\n    } = props\r\n    const checkPermission = useCheckPermission()\r\n\r\n    const translate = useTranslate()\r\n    const classes = useStyles()\r\n    const isAdmin = checkPermission.isUserAdmin()\r\n    const isDisableReviewer = isViewMode //irb1 จะเปิดให้สามารถเลือกรายชื่อผู้ให้ความเห็นได้\r\n    const irb = projectData?.irb\r\n    const snackbarAction = useSnackbarAction()\r\n\r\n    const isRequiredSynthesize = {\r\n        errorMessage: `${translate.get('MESSAGE.M013')}`,\r\n        showAsterisk: true,\r\n        triggedValidate: true,\r\n    }\r\n\r\n    const getDisplayCommitteeSaveDate = (itm: any) => {\r\n        return translate.languageStore.currentLanguage === translate.languageKey.th\r\n            ? convertDateToFormatTH(itm.saveCommentDate)\r\n            : convertDateToFormatEN(itm.saveCommentDate)\r\n    }\r\n\r\n    const renderCommitteeComment = (itm: any, index: number) => {\r\n        return (\r\n            <>\r\n                \r\n                    \r\n                \r\n                \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    const renderComment = (name: string, index: number, isDisabled: boolean) => {\r\n        return (\r\n            \r\n                \r\n                    {commentList &&\r\n                        commentList?.map((itm: any) => {\r\n                            const filterArr = itm?.map((item: any) => {\r\n                                if (commentTitleList[index]?.id === item?.topicID || isExempt) {\r\n                                    return renderCommitteeComment(item, index)\r\n                                }\r\n                            })\r\n\r\n                            return filterArr\r\n                        })}\r\n                \r\n\r\n                \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    const renderFieldArray = (isDisabled: boolean, useAccordion: boolean) => {\r\n        return (\r\n            \r\n                \r\n                    {({ fields }) => {\r\n                        return fields?.map((name, index) => (\r\n                            \r\n                                {useAccordion ? (\r\n                                    \r\n                                        {renderComment(name, index, isDisabled)}\r\n                                    \r\n                                ) : (\r\n                                    <>\r\n                                        
\r\n                                        \r\n                                            {isExempt\r\n                                                ? translate.get('LABEL.SUGGESTION_NOTICE')\r\n                                                : `${index + 1}. ${\r\n                                                      translate.languageStore.currentLanguage ===\r\n                                                      translate.languageKey.th\r\n                                                          ? commentTitleList[index]?.name_th\r\n                                                          : commentTitleList[index]?.name_en\r\n                                                  }`}\r\n                                        \r\n                                        {renderComment(name, index, isDisabled)}\r\n                                    \r\n                                )}\r\n                            \r\n                        ))\r\n                    }}\r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    return (\r\n        <>\r\n            {isDisplayCopyToClipboard && (\r\n                \r\n                    \r\n                    \r\n                \r\n            )}\r\n            \r\n                {(props) => {\r\n                    const { form, handleSubmit, dirty, invalid, errors } = props\r\n                    formRef.current = form\r\n\r\n                    return (\r\n                        \r\n                            {isAdmin && (\r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            )}\r\n\r\n                            \r\n                                {useAccordionMode ? (\r\n                                     renderFieldArray(false, true)}\r\n                                        renderViewComponent={() => renderFieldArray(true, true)}\r\n                                        fieldNames={['synthesisInfo']}\r\n                                        onCancel={() => {\r\n                                            resetField('synthesisInfo', (data: any) => {\r\n                                                editInitialSynthesis(data)\r\n                                            })\r\n                                        }}\r\n                                        onConfirm={() => {\r\n                                            confirmField('synthesisInfo', (data: any) => {\r\n                                                editInitialSynthesis(data)\r\n                                            })\r\n                                            return updateCommentary('synthesisInfo')\r\n                                        }}\r\n                                        onClickEdit={() => defineValueFromInit('synthesisInfo')}\r\n                                    />\r\n                                ) : (\r\n                                    renderFieldArray(isViewMode, true)\r\n                                )}\r\n                            \r\n\r\n                            \r\n                                \r\n                            \r\n\r\n                            {isShowUpdateDate && }\r\n\r\n                            {!isViewMode && (\r\n                                \r\n                                     {\r\n                                            onClickCancel(dirty)\r\n                                        }}\r\n                                        onClickSave={() => {\r\n                                            form.change('submitType', 'save')\r\n                                            handleSubmit()\r\n                                            invalid &&\r\n                                                errors &&\r\n                                                snackbarAction.openSnackbar({\r\n                                                    message: translate.get('MESSAGE.M012'),\r\n                                                    type: 'error',\r\n                                                })\r\n                                        }}\r\n                                        onClickSaveDraft={() => {\r\n                                            form.change('submitType', 'draft')\r\n                                            handleSubmit()\r\n                                        }}\r\n                                    />\r\n                                \r\n                            )}\r\n\r\n                            \r\n                            \r\n                        \r\n                    )\r\n                }}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nconst SynthesisREC2: React.FC = (props) => {\r\n    const useSyntheticModel = useSynthesis(props)\r\n    return \r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n    spacingButton: {\r\n        marginBottom: '10px',\r\n    },\r\n    paper: {\r\n        width: '100%',\r\n        height: 128,\r\n        padding: 20,\r\n    },\r\n    titleFont: {\r\n        color: '#BDBDBD',\r\n    },\r\n    contentFont: {\r\n        fontWeight: 'bold',\r\n    },\r\n    btnGroup: {\r\n        padding: '18px',\r\n    },\r\n}))\r\n\r\nexport default SynthesisREC2\r\n","import React from 'react'\r\n\r\nimport * as numberOfDocTypes from './numberOfDocTypes'\r\nimport { useForm } from 'react-final-form'\r\nimport useLookupClient from '../../../../services/lookupClient/useLookupClient'\r\n\r\nconst useNumberOfDoc = (props: numberOfDocTypes.UseNumberOfDocType) => {\r\n    const { callbackFunc } = props\r\n    const lookupClient = useLookupClient()\r\n    const form = useForm()\r\n\r\n    const changeToNull = (name: string) => {\r\n        form.change(`${name}`, null)\r\n    }\r\n\r\n    const handleChangeRequireDoc = (value: numberOfDocTypes.OptType) => {\r\n        if (callbackFunc && value) {\r\n            callbackFunc(value.value)\r\n        }\r\n\r\n        if (value && value.value === '0') {\r\n            changeToNull('documentNumber')\r\n            changeToNull('sendDocumentDate')\r\n            changeToNull('remark')\r\n        } else {\r\n            form.change(`sendDocumentDate`, new Date())\r\n        }\r\n        form.restart()\r\n    }\r\n    return {\r\n        condition: lookupClient.getNeedDoc(),\r\n        onChangRequireDoc: handleChangeRequireDoc,\r\n    }\r\n}\r\n\r\nexport default useNumberOfDoc\r\n","export const getDisable = (fieldName: string, disabledFieldNames?: Array | 'all') => {\r\n    let isDisable: boolean = false\r\n    if (disabledFieldNames === 'all') {\r\n        isDisable = true\r\n    } else {\r\n        if (disabledFieldNames && disabledFieldNames?.length > 0) {\r\n            isDisable = disabledFieldNames?.indexOf(fieldName) !== -1\r\n        }\r\n    }\r\n    return isDisable\r\n}\r\n\r\nexport const getRequire = (fieldName: string, requiredFieldNames?: Array | 'all') => {\r\n    let isRequired: boolean = false\r\n    if (requiredFieldNames === 'all') {\r\n        isRequired = true\r\n    } else {\r\n        if (requiredFieldNames && requiredFieldNames?.length > 0) {\r\n            isRequired = requiredFieldNames?.indexOf(fieldName) !== -1\r\n        }\r\n    }\r\n    return isRequired\r\n}\r\n\r\nexport const getDisplay = (fieldName: string, displayFieldNames?: Array | 'all') => {\r\n    let isDisplay: boolean = false\r\n    if (displayFieldNames === 'all') {\r\n        isDisplay = true\r\n    } else {\r\n        if (displayFieldNames && displayFieldNames?.length > 0) {\r\n            isDisplay = displayFieldNames?.indexOf(fieldName) !== -1\r\n        }\r\n    }\r\n    return isDisplay\r\n}\r\n","import React from 'react'\r\nimport { Grid } from '@material-ui/core'\r\nimport DatePicker from '../../../../control/datepicker/datepicker'\r\nimport Autocomplete from '../../../../control/autocomplete/autocomplete'\r\nimport MyTextfield from '../../../../control/textfield/textfield'\r\nimport MyAccordion from '../../../../control/accordion/accordion'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport { validateMaxDocLength, validateNumeralNoPrecision } from '../../../../utilities/validate'\r\nimport * as numberOfDocTypes from './numberOfDocTypes'\r\nimport useNumberOfDoc from './useNumberOfDoc'\r\nimport { getDisable, getRequire } from '../../shareLogic/useFunctionHook'\r\n\r\n//View\r\nconst NumberOfDocView = (props: numberOfDocTypes.NumberOfDocViewType) => {\r\n    const { condition, onChangRequireDoc, disabledFieldNames, requiredFieldNames } = props\r\n    const translate = useTranslate()\r\n\r\n    return (\r\n        \r\n            \r\n                \r\n                    \r\n                        \r\n                    \r\n                    \r\n                        \r\n                    \r\n                    \r\n                        \r\n                    \r\n                    \r\n                        \r\n                    \r\n                \r\n            \r\n        \r\n    )\r\n}\r\n\r\n//Controller\r\nconst NumberOfDoc = (props: numberOfDocTypes.NumberOfDocType) => {\r\n    const numberOfDocModel = useNumberOfDoc(props)\r\n    return \r\n}\r\n\r\nexport default NumberOfDoc\r\n","import React from 'react'\r\nimport _ from 'lodash'\r\n\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\n\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as additionalDocumentType from './additionalDocumentType'\r\n\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { convertDateToDateString, dateForAPI } from '../../../../../utilities/date'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { TabSelectedType } from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\nconst useAdditionDocument = (props: additionalDocumentType.UseAdditionDocument) => {\r\n    const { callbackSaveComplete } = props\r\n\r\n    const [initialValues, setInitialValues] = React.useState({})\r\n    const { projectData } = useManageProjectStore()\r\n    const [disabledField, setDisabledField] = React.useState<'all' | string[]>()\r\n    const [requiredField, setRequiredField] = React.useState<'all' | string[]>([\r\n        'requireDoc',\r\n        'documentNumber',\r\n        'sendDocumentDate',\r\n    ])\r\n\r\n    const checkPermissionHook = checkPermission()\r\n    const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n    const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n\r\n    const appFolderAndTabAction = useAppFolderAndTabAction()\r\n    const history = useHistory()\r\n    const translate = useTranslate()\r\n    const callWebService = useWebService()\r\n    const loadingHook = useLoading()\r\n    const profileStore = authenStore()\r\n    const { profile } = profileStore\r\n    const [configDialog, setConfigDialog] =\r\n        React.useState>()\r\n    const dialogRef = React.useRef>()\r\n    const paramsRef = React.useRef()\r\n    const tabAndFolderHook = useFolderAndTab()\r\n\r\n    React.useEffect(() => {\r\n        if (projectData) {\r\n            createInitialData()\r\n\r\n            if (projectData.isRequestDocument != null) {\r\n                //edit form\r\n                if (projectData.isRequestDocument) {\r\n                    setDisabledField(undefined)\r\n                    setRequiredField(['requireDoc', 'documentNumber', 'sendDocumentDate'])\r\n                } else {\r\n                    setDisabledField(['documentNumber', 'sendDocumentDate', 'remark'])\r\n                    setRequiredField(['requireDoc'])\r\n                }\r\n            }\r\n        }\r\n\r\n        if (isViewMode) {\r\n            setDisabledField('all')\r\n        }\r\n    }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.isDraft ?? null])\r\n\r\n    const onRefDialog = (func: Record) => {\r\n        //ห้าม set State หรือเรียก Action ในนี้\r\n        dialogRef.current = func\r\n    }\r\n\r\n    const createInitialData = () => {\r\n        if (projectData) {\r\n            const isDefaultRequest = projectData?.isRequestDocument ?? true\r\n            const initialData = {\r\n                documentNumber: projectData?.documentNumber ? `${projectData.documentNumber}` : null,\r\n                sendDocumentDate: isDefaultRequest\r\n                    ? projectData?.sendDocumentDate\r\n                        ? projectData.sendDocumentDate\r\n                        : new Date()\r\n                    : null,\r\n                remark: projectData?.documentRemark ? projectData.documentRemark : null,\r\n                isRequestDocument: projectData?.isRequestDocument,\r\n                requireDoc: getInitialRequireDoc(projectData.isRequestDocument),\r\n            }\r\n            setInitialValues(initialData)\r\n        }\r\n    }\r\n\r\n    const getInitialRequireDoc = (isRequestDocument: boolean) => {\r\n        let initRequireDoc\r\n        if (isRequestDocument != null) {\r\n            if (isRequestDocument) {\r\n                initRequireDoc = { label: translate.get('LABEL.NEED'), value: '1' }\r\n            } else {\r\n                initRequireDoc = { label: translate.get('LABEL.NOT_NEED'), value: '0' }\r\n            }\r\n        } else {\r\n            initRequireDoc = { label: translate.get('LABEL.NEED'), value: '1' }\r\n        }\r\n\r\n        return initRequireDoc\r\n    }\r\n\r\n    const handleClickCancel = (dirty: boolean) => {\r\n        if (dirty) {\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.WARNING'),\r\n                content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n                type: 'alert-confirm',\r\n\r\n                onClickConfirm: () => {\r\n                    history.push(RoutePath.manageProject)\r\n                },\r\n            })\r\n            dialogRef.current?.openDialog()\r\n        } else {\r\n            history.push(RoutePath.manageProject)\r\n        }\r\n    }\r\n\r\n    const handleSubmitForm = async (val: any) => {\r\n        const parameter = getParameterForSave(val)\r\n        if (val.submitType === 'save') {\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n                type: 'alert-confirm',\r\n                onClickConfirm: () => {\r\n                    handleConfirmSave(parameter)\r\n                },\r\n            })\r\n            dialogRef.current?.openDialog()\r\n        } else {\r\n            //ถ้า save draft ไม่ต้องมี alert confirm\r\n            handleConfirmSave(parameter)\r\n        }\r\n    }\r\n    const getParameterForSave = (val: any) => {\r\n        if (projectData) {\r\n            let isDraft = false\r\n            if (val.submitType === 'draft') {\r\n                isDraft = true\r\n            }\r\n            const reqNumberOfDocType: REQServiceType.RequestNumberOfDocType = {\r\n                loginUserID: profile.userId,\r\n                projectID: projectData.projectID,\r\n                submittedID: projectData.submittedID,\r\n                isRequestDoc: val?.requireDoc?.value === '1' ? true : false,\r\n                documentNumber: val?.documentNumber ?? null,\r\n                sendDocumentDate:\r\n                    val && val.sendDocumentDate && val.sendDocumentDate\r\n                        ? dateForAPI(val?.sendDocumentDate) ?? null\r\n                        : null,\r\n                remark: val.remark ? val.remark : null,\r\n                isDraft: isDraft,\r\n            }\r\n            return reqNumberOfDocType\r\n        }\r\n    }\r\n\r\n    const handleConfirmSave = async (\r\n        paramForSave: REQServiceType.RequestNumberOfDocType | undefined,\r\n        tabIndex: number | null = null,\r\n        newTabSelected: TabSelectedType | null = null,\r\n        isFolder?: boolean,\r\n    ) => {\r\n        if (paramForSave) {\r\n            dialogRef.current?.closeDialog()\r\n            const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n            loadingHook.loadingOpen()\r\n            const res = await callWebService.requestNumberOfDocument(paramForSave)\r\n\r\n            if (!isFolder) {\r\n                //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n                if (tabIndex && newTabSelected) {\r\n                    //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n                    tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n                } else {\r\n                    //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n                    if (callbackSaveComplete) {\r\n                        if (res && res.status) {\r\n                            callbackSaveComplete(res.status, isDraft)\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            loadingHook.loadingClose()\r\n        }\r\n    }\r\n\r\n    const setPropsWhenRequestDoc = (isRequest: string) => {\r\n        if (isRequest && isRequest === '0') {\r\n            //เลือกไม่ต้องการจะ disable ฟิล จำนวน วันที่และหมายเหตุ และ RequiedField แค่ requireDoc\r\n            setDisabledField(['documentNumber', 'sendDocumentDate', 'remark'])\r\n            setRequiredField(['requireDoc'])\r\n        } else {\r\n            setDisabledField(undefined)\r\n            setRequiredField(['requireDoc', 'documentNumber', 'sendDocumentDate'])\r\n        }\r\n    }\r\n    /**\r\n     *\r\n     * Dirty\r\n     */\r\n    const handleDirtyChange = (props: any) => {\r\n        let isDirty: boolean = false\r\n        let newFormValue = { ...props.values, sendDocumentDate: convertDateToDateString(props.values.sendDocumentDate) }\r\n        let initValue = { ...initialValues, sendDocumentDate: convertDateToDateString(initialValues.sendDocumentDate) }\r\n\r\n        const isEqual = _.isEqual(initValue, newFormValue)\r\n        if (!isViewMode) {\r\n            if (isEqual) {\r\n                isDirty = false\r\n            } else {\r\n                isDirty = true\r\n            }\r\n        }\r\n        // appFolderAndTabAction.setTabDirty(isDirty)\r\n        paramsRef.current = getParameterForSave(props.values)\r\n        const paramsDirty = {\r\n            tabDirty: isDirty,\r\n            callbackDirty: callbackDirtyProcess,\r\n        }\r\n        appFolderAndTabAction.setDirty(paramsDirty)\r\n    }\r\n\r\n    const callbackDirtyProcess = (\r\n        tabIndex: number | null = null,\r\n        newTabSelected: TabSelectedType | null = null,\r\n        isFolder?: boolean,\r\n    ) => {\r\n        if (paramsRef.current) {\r\n            paramsRef.current.isDraft = true\r\n            handleConfirmSave(paramsRef.current, tabIndex, newTabSelected, isFolder)\r\n        }\r\n    }\r\n    return {\r\n        isViewMode,\r\n        initialValues,\r\n        configDialog,\r\n        disabledField,\r\n        requiredField,\r\n        isShowUpdateDate,\r\n        onRefDialog,\r\n        onSubmitForm: handleSubmitForm,\r\n        funcCallBack: setPropsWhenRequestDoc,\r\n        onClickCancel: handleClickCancel,\r\n        onDirtyChange: handleDirtyChange,\r\n    }\r\n}\r\n\r\nexport default useAdditionDocument\r\n","import React from 'react'\r\nimport * as additionalDocumentType from './additionalDocumentType'\r\n\r\nimport arrayMutators from 'final-form-arrays'\r\nimport NumberOfDoc from '../../../shareUI/numberOfDoc2/numberOfDoc'\r\nimport useAdditionDocument from './useAdditionDocument'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport PageAction from '../pageAction'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\n\r\nimport { Form, FormRenderProps, FormSpy } from 'react-final-form'\r\nimport { Grid } from '@material-ui/core'\r\n\r\nconst AdditionalDocumentREC1View: React.FC = (props) => {\r\n    const {\r\n        isViewMode,\r\n        initialValues,\r\n        configDialog,\r\n        disabledField,\r\n        requiredField,\r\n        isShowUpdateDate,\r\n        onRefDialog,\r\n        onSubmitForm,\r\n        funcCallBack,\r\n        onClickCancel,\r\n        onDirtyChange,\r\n    } = props\r\n    const snackbarAction = useSnackbarAction()\r\n    const translate = useTranslate()\r\n\r\n    const renderSnackbar = (props: FormRenderProps) => {\r\n        const { values } = props\r\n\r\n        const isRequireDoc = values?.requireDoc?.value ?? 'null'\r\n        const isDocumentNumber = values?.documentNumber\r\n        const isSendDocumentDate = values?.sendDocumentDate\r\n\r\n        if (isRequireDoc === 'null') {\r\n            snackbarAction.openSnackbar({\r\n                message: translate.get('MESSAGE.M012'),\r\n                type: 'error',\r\n            })\r\n        }\r\n\r\n        if (isRequireDoc === '1') {\r\n            ;(!isSendDocumentDate || !isDocumentNumber) &&\r\n                snackbarAction.openSnackbar({\r\n                    message: translate.get('MESSAGE.M012'),\r\n                    type: 'error',\r\n                })\r\n        }\r\n    }\r\n\r\n    return (\r\n        \r\n            {(props) => {\r\n                const { form, handleSubmit, dirty } = props\r\n                return (\r\n                    \r\n                        \r\n                            \r\n                                \r\n                            \r\n                            {isShowUpdateDate && }\r\n                        \r\n                        {!isViewMode && (\r\n                            \r\n                                 {\r\n                                        onClickCancel(dirty)\r\n                                    }}\r\n                                    onClickSave={() => {\r\n                                        form.change('submitType', 'save')\r\n                                        handleSubmit()\r\n                                        renderSnackbar(props)\r\n                                    }}\r\n                                    onClickSaveDraft={() => {\r\n                                        form.change('submitType', 'draft')\r\n                                        handleSubmit()\r\n                                    }}\r\n                                />\r\n                            \r\n                        )}\r\n                        \r\n                        \r\n                    \r\n                )\r\n            }}\r\n        \r\n    )\r\n}\r\n\r\nconst AdditionalDocumentREC1: React.FC = (props) => {\r\n    const useAdditionDocumentModel = useAdditionDocument(props)\r\n    return \r\n}\r\n\r\nexport default AdditionalDocumentREC1\r\n","import React from 'react'\r\nimport * as additionalDocumentType from './additionalDocumentType'\r\n\r\nimport arrayMutators from 'final-form-arrays'\r\nimport NumberOfDoc from '../../../shareUI/numberOfDoc2/numberOfDoc'\r\nimport useAdditionDocument from './useAdditionDocument'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport PageAction from '../pageAction'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\n\r\nimport { Form, FormRenderProps, FormSpy } from 'react-final-form'\r\nimport { Grid } from '@material-ui/core'\r\n\r\nconst AdditionalDocumentREC2View: React.FC = (props) => {\r\n    const {\r\n        isViewMode,\r\n        initialValues,\r\n        configDialog,\r\n        disabledField,\r\n        requiredField,\r\n        isShowUpdateDate,\r\n        onRefDialog,\r\n        onSubmitForm,\r\n        funcCallBack,\r\n        onClickCancel,\r\n        onDirtyChange,\r\n    } = props\r\n    const snackbarAction = useSnackbarAction()\r\n    const translate = useTranslate()\r\n\r\n    const renderSnackbar = (props: FormRenderProps) => {\r\n        const { values } = props\r\n\r\n        const isRequireDoc = values?.requireDoc?.value ?? 'null'\r\n        const isDocumentNumber = values?.documentNumber\r\n        const isSendDocumentDate = values?.sendDocumentDate\r\n\r\n        if (isRequireDoc === 'null') {\r\n            snackbarAction.openSnackbar({\r\n                message: translate.get('MESSAGE.M012'),\r\n                type: 'error',\r\n            })\r\n        }\r\n\r\n        if (isRequireDoc === '1') {\r\n            ;(!isSendDocumentDate || !isDocumentNumber) &&\r\n                snackbarAction.openSnackbar({\r\n                    message: translate.get('MESSAGE.M012'),\r\n                    type: 'error',\r\n                })\r\n        }\r\n    }\r\n\r\n    return (\r\n        \r\n            {(props) => {\r\n                const { form, handleSubmit, dirty } = props\r\n                return (\r\n                    \r\n                        \r\n                            \r\n                                \r\n                            \r\n                            {isShowUpdateDate && }\r\n                        \r\n                        {!isViewMode && (\r\n                            \r\n                                 {\r\n                                        onClickCancel(dirty)\r\n                                    }}\r\n                                    onClickSave={() => {\r\n                                        form.change('submitType', 'save')\r\n                                        handleSubmit()\r\n                                        renderSnackbar(props)\r\n                                    }}\r\n                                    onClickSaveDraft={() => {\r\n                                        form.change('submitType', 'draft')\r\n                                        handleSubmit()\r\n                                    }}\r\n                                />\r\n                            \r\n                        )}\r\n                        \r\n                        \r\n                    \r\n                )\r\n            }}\r\n        \r\n    )\r\n}\r\n\r\nconst AdditionalDocumentREC2: React.FC = (props) => {\r\n    const useAdditionDocumentModel = useAdditionDocument(props)\r\n    return \r\n}\r\n\r\nexport default AdditionalDocumentREC2\r\n","import React from 'react'\r\nimport { GetProjectResultType } from '../../../../services/web/types/responseWebServiceTypes'\r\nimport { UseResearchDetailType } from './researchDetailType'\r\nimport _ from 'lodash'\r\nconst useResearchDetail = (props: UseResearchDetailType) => {\r\n    const { dataSource } = props\r\n    const [initialData, setInitialData] = React.useState()\r\n\r\n    React.useEffect(() => {\r\n        if (dataSource) {\r\n            setInitialData(dataSource)\r\n        }\r\n        // }, [JSON.stringify(dataSource)])\r\n    }, [dataSource?.projectID ?? null, dataSource?.submittedID ?? null])\r\n\r\n    return { initialData }\r\n}\r\n\r\nexport default useResearchDetail\r\n","import React from 'react'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { Grid, makeStyles, useMediaQuery, useTheme } from '@material-ui/core'\r\nimport { ResearchDetailViewType, ResearchDetailCtrlType } from './researchDetailType'\r\nimport useResearchDetail from './useResearchDetail'\r\nimport MyTextfield from '../../../../control/textfield/textfield'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport MyAccordion from '../../../../control/accordion/accordion'\r\nimport { isTitleName } from '../../../../constants/constants'\r\n\r\nconst ResearchDetailView: React.FC = ({ ...props }) => {\r\n    const { initialData, hideAccordion = false } = props\r\n    const translate = useTranslate()\r\n    const theme = useTheme()\r\n    const isMobileView = useMediaQuery(theme.breakpoints.down('sm'))\r\n    const isIPadView = useMediaQuery(theme.breakpoints.down('md'))\r\n    const classes = useStyles({ isMobileView, isIPadView })\r\n\r\n    const renderNameEN = () => {\r\n        if (initialData?.researcherName_en) {\r\n            if (initialData?.isDr && initialData?.academicPositionInfo) {\r\n                return initialData?.academicPositionInfo.value === 7\r\n                    ? `${isTitleName.dr.nameEN} ${initialData?.researcherName_en}`\r\n                    : initialData?.academicPositionInfo.value === 6\r\n                    ? `${initialData?.academicPositionOther_en} ${isTitleName.dr.nameEN} ${initialData?.researcherName_en}`\r\n                    : `${initialData?.academicPositionInfo.nameEN} ${isTitleName.dr.nameEN} ${initialData?.researcherName_en}`\r\n            }\r\n\r\n            if (initialData?.isDr && !initialData?.academicPositionInfo) {\r\n                return `${isTitleName.dr.nameEN} ${initialData?.researcherName_en}`\r\n            }\r\n\r\n            if (!initialData?.isDr && initialData?.academicPositionInfo) {\r\n                return initialData?.academicPositionInfo.value === 6\r\n                    ? `${initialData?.academicPositionOther_en} ${initialData?.researcherName_en}`\r\n                    : initialData?.academicPositionInfo.value === 7\r\n                    ? `${\r\n                          initialData?.titleNameInfo.value === 5\r\n                              ? initialData?.titleNameOther_en\r\n                              : initialData?.titleNameInfo.value === 4\r\n                              ? ''\r\n                              : initialData?.titleNameInfo.nameEN\r\n                      } ${initialData?.researcherName_en}`\r\n                    : `${initialData?.academicPositionInfo.nameEN} ${initialData?.researcherName_en}`\r\n            }\r\n\r\n            if (!initialData?.isDr && initialData?.titleNameOther_en) {\r\n                return `${initialData?.titleNameOther_th} ${initialData?.researcherName_en}`\r\n            }\r\n\r\n            if (!initialData?.isDr && initialData?.titleNameInfo.value && !initialData?.titleNameOther_en) {\r\n                return initialData?.titleNameInfo.value === 4\r\n                    ? initialData?.researcherName_en\r\n                    : `${initialData?.titleNameInfo.nameEN} ${initialData?.researcherName_en}`\r\n            }\r\n        } else {\r\n            return '-'\r\n        }\r\n    }\r\n\r\n    const renderNameTH = () => {\r\n        if (initialData?.researcherName_th) {\r\n            if (initialData?.isDr && initialData?.academicPositionInfo) {\r\n                return initialData?.academicPositionInfo.value === 7\r\n                    ? `${isTitleName.dr.nameTH} ${initialData?.researcherName_th}`\r\n                    : initialData?.academicPositionInfo.value === 6\r\n                    ? `${initialData?.academicPositionOther_th} ${isTitleName.dr.nameTH} ${initialData?.researcherName_th}`\r\n                    : `${initialData?.academicPositionInfo.nameTH} ${isTitleName.dr.nameTH} ${initialData?.researcherName_th}`\r\n            }\r\n\r\n            if (initialData?.isDr && !initialData?.academicPositionInfo) {\r\n                return `${isTitleName.dr.nameTH} ${initialData?.researcherName_th}`\r\n            }\r\n\r\n            if (!initialData?.isDr && initialData?.academicPositionInfo) {\r\n                return initialData?.academicPositionInfo.value === 6\r\n                    ? `${initialData?.academicPositionOther_th} ${initialData?.researcherName_th}`\r\n                    : initialData?.academicPositionInfo.value === 7\r\n                    ? `${\r\n                          initialData?.titleNameInfo.value === 5\r\n                              ? initialData?.titleNameOther_th\r\n                              : initialData?.titleNameInfo.value === 4\r\n                              ? ''\r\n                              : initialData?.titleNameInfo.nameTH\r\n                      } ${initialData?.researcherName_th}`\r\n                    : `${initialData?.academicPositionInfo.nameTH} ${initialData?.researcherName_th}`\r\n            }\r\n\r\n            if (!initialData?.isDr && initialData?.titleNameOther_th) {\r\n                return `${initialData?.titleNameOther_th} ${initialData?.researcherName_th}`\r\n            }\r\n\r\n            if (!initialData?.isDr && initialData?.titleNameInfo.value && !initialData?.titleNameOther_th) {\r\n                return initialData?.titleNameInfo.value === 4\r\n                    ? initialData?.researcherName_th\r\n                    : `${initialData?.titleNameInfo.nameTH} ${initialData?.researcherName_th}`\r\n            }\r\n        } else {\r\n            return '-'\r\n        }\r\n    }\r\n\r\n    const renderElement = () => (\r\n        \r\n            \r\n                \r\n                    {translate.get('LABEL.IS_PHASE')} : \r\n                \r\n                \r\n                    \r\n                        {initialData?.requestPhase ? translate.get('LABEL.YES') : translate.get('LABEL.NO')}\r\n                    \r\n                \r\n            \r\n            \r\n                \r\n                    {translate.get('LABEL.PHASE')} : \r\n                \r\n                \r\n                    {initialData?.requestPhase || '-'}\r\n                \r\n            \r\n            \r\n                \r\n                    {translate.get('LABEL.LABEL_05')} : \r\n                \r\n                \r\n                    \r\n                        {initialData?.requestPhase\r\n                            ? initialData?.isTools\r\n                                ? translate.get('LABEL.YES')\r\n                                : translate.get('LABEL.NO')\r\n                            : '-'}\r\n                    \r\n                \r\n            \r\n            \r\n                \r\n                    {translate.get('LABEL.FACULTY')} : \r\n                \r\n                \r\n                    \r\n                        {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                            ? initialData?.facultyInfo?.nameTH\r\n                            : initialData?.facultyInfo?.nameEN}\r\n                    \r\n                \r\n            \r\n            \r\n                \r\n                    {translate.get('LABEL.IRB')} : \r\n                \r\n                \r\n                    {`REC ${initialData?.irb}`}\r\n                \r\n            \r\n            \r\n                \r\n                    \r\n                        {`${translate.get('LABEL.PROJECT_NAME')}​ (${translate.get('LABEL.THAI')}​)`} :{' '}\r\n                    \r\n                \r\n                \r\n                    {initialData?.projectName_th}\r\n                \r\n            \r\n            \r\n                \r\n                    \r\n                        {`${translate.get('LABEL.PROJECT_NAME')}​ (${translate.get('LABEL.ENG')}​)`} :{' '}\r\n                    \r\n                \r\n                \r\n                    {initialData?.projectName_en}\r\n                \r\n            \r\n\r\n            \r\n                \r\n                    {translate.get('LABEL.RESEARCHER_TYPE')} : \r\n                \r\n                \r\n                    \r\n                        {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                            ? initialData?.researcherTypeInfo?.nameTH\r\n                            : initialData?.researcherTypeInfo?.nameEN}\r\n                    \r\n                \r\n            \r\n            \r\n                \r\n                    {translate.get('LABEL.EDUCATION_LEVEL')} : \r\n                \r\n                \r\n                    \r\n                        {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                            ? initialData?.educationLevelInfo?.nameTH || '-'\r\n                            : initialData?.educationLevelInfo?.nameEN || '-'}\r\n                    \r\n                \r\n            \r\n            \r\n                \r\n                    {translate.get('LABEL.ACADEMIC_TITLE')} : \r\n                \r\n                \r\n                    \r\n                        {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                            ? initialData?.academicPositionInfo?.nameTH || initialData?.academicPositionOther_th || '-'\r\n                            : initialData?.academicPositionInfo?.nameEN || initialData?.academicPositionOther_en || '-'}\r\n                    \r\n                \r\n            \r\n            \r\n                \r\n                    \r\n                        {`${translate.get('LABEL.FL_NAME')}​ (${translate.get('LABEL.THAI')}​)`} :{' '}\r\n                    \r\n                \r\n                \r\n                    \r\n                        {renderNameTH()}\r\n                        {/* {`${initialData?.titleNameInfo?.nameTH || initialData?.titleNameOther_th} ${\r\n                                initialData?.researcherName_th || '-'\r\n                            }`} */}\r\n                    \r\n                \r\n            \r\n            \r\n                \r\n                    \r\n                        {`${translate.get('LABEL.FL_NAME')}​ (${translate.get('LABEL.ENG')}​)`} :{' '}\r\n                    \r\n                \r\n                \r\n                    \r\n                        {/* {initialData?.researcherName_en\r\n                                ? `${\r\n                                      initialData?.titleNameInfo?.nameEN\r\n                                          ? initialData?.titleNameInfo?.nameEN\r\n                                          : initialData?.titleNameOther_en\r\n                                  } ${initialData?.researcherName_en}`\r\n                                : '-'} */}\r\n                        {renderNameEN()}\r\n                    \r\n                \r\n            \r\n\r\n            \r\n                \r\n                    {translate.get('LABEL.TELEPHONE_NUMBER')} : \r\n                \r\n                \r\n                    \r\n                        {initialData?.homePhone ? initialData?.homePhone : '-'}\r\n                    \r\n                \r\n            \r\n\r\n            \r\n                \r\n                    {translate.get('LABEL.FAX')} : \r\n                \r\n                \r\n                    {initialData?.fax ? initialData?.fax : '-'}\r\n                \r\n            \r\n\r\n            \r\n                \r\n                    {translate.get('LABEL.MOBILE_PHONE_NO')} : \r\n                \r\n                \r\n                    \r\n                        {initialData?.mobilePhone}\r\n                    \r\n                \r\n            \r\n\r\n            \r\n                \r\n                    {translate.get('LABEL.EMAIL')} : \r\n                \r\n                \r\n                    {initialData?.email}\r\n                \r\n            \r\n            
\r\n \r\n \r\n
\r\n
\r\n )\r\n\r\n return (\r\n <>\r\n {hideAccordion ? (\r\n renderElement()\r\n ) : (\r\n {renderElement()}\r\n )}\r\n \r\n )\r\n}\r\n\r\nlet ResearchDetailCtrl: React.FC = ({ ...props }) => {\r\n const researchDetailModel = useResearchDetail({ ...props })\r\n return \r\n}\r\n\r\nexport default ResearchDetailCtrl\r\n\r\nconst useStyles = makeStyles(() => ({\r\n typography: {\r\n marginLeft: (props: any) => {\r\n let value = '0px'\r\n if (props.isMobileView || props.isIPadView) {\r\n value = '0px'\r\n } else {\r\n value = '10px'\r\n }\r\n return value\r\n },\r\n },\r\n}))\r\n","export const checkHistoryDisplay = `${process.env.REACT_APP_CU_IRB_API_URL}/history/checkDisplay`","import { atom, useRecoilValue } from 'recoil'\r\n\r\nexport type HistoryStoreType = {\r\n displayVerifyDocHistory: boolean\r\n displayConsiderTypeHistory: boolean\r\n}\r\nexport const historyStore = atom({\r\n key: 'historyStore',\r\n default: {\r\n displayVerifyDocHistory: false,\r\n displayConsiderTypeHistory: false,\r\n },\r\n})\r\n\r\nconst useCommentaryStore = () => {\r\n const historyState = useRecoilValue(historyStore)\r\n return {\r\n ...historyState,\r\n }\r\n}\r\n\r\nexport default useCommentaryStore\r\n","import { useSetRecoilState } from 'recoil'\r\nimport { checkHistoryDisplay } from '../../services/history/historyServiceURL'\r\nimport useCallApi from '../../utilities/axios'\r\n\r\nimport { historyStore } from './useHistoryStore'\r\n\r\nconst useHistoryAction = () => {\r\n const setHistoryStore = useSetRecoilState(historyStore)\r\n const callApi = useCallApi()\r\n\r\n const updateDisplayHistory = async (submittedID: number) => {\r\n const response = await callApi.axiosGet({\r\n url: `${checkHistoryDisplay}/${submittedID}`,\r\n })\r\n const result = response?.data?.result\r\n if (response && response?.data?.status === 1 && result) {\r\n setHistoryStore((prevState) => ({\r\n displayVerifyDocHistory: result.historyVerifyDoc,\r\n displayConsiderTypeHistory: result.historyConsiderType,\r\n }))\r\n }\r\n }\r\n\r\n return {\r\n updateDisplayHistory,\r\n }\r\n}\r\n\r\nexport default useHistoryAction\r\n","import React from 'react'\r\nimport { UseDocumentTestResultType } from './documentTestResultType'\r\nimport { useForm } from 'react-final-form'\r\nimport useLookupClient from '../../../../services/lookupClient/useLookupClient'\r\nimport { generatePath, useHistory, useLocation } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../router/routesConfig'\r\nimport { encryptionAES } from '../../../../utilities/encryption'\r\nimport useManageProjectStore from '../../../../stores/manageProject/useManageProjectStore'\r\nimport useHistoryAction from '../../../../stores/history/useHistoryAction'\r\nimport useHistoryStore from '../../../../stores/history/useHistoryStore'\r\n\r\nconst useDocumentTestResult = (props: UseDocumentTestResultType) => {\r\n const { onChangeDocCompletely, onSubmitEdit, onClickModeEdit } = props\r\n const [selectedCompletely, setSelectedCompletely] = React.useState()\r\n const form = useForm()\r\n const lookupClient = useLookupClient()\r\n const history = useHistory()\r\n const { projectData } = useManageProjectStore()\r\n const { state } = useLocation()\r\n const historyStoreAction = useHistoryAction()\r\n const historyStore = useHistoryStore()\r\n \r\n React.useEffect(() => {\r\n if (form.getFieldState('isCompletelyDoc')?.initial) {\r\n setSelectedCompletely(form.getFieldState('isCompletelyDoc')?.initial)\r\n }\r\n }, [form.getFieldState('isCompletelyDoc')?.initial])\r\n\r\n const handleChangeRadio = (val: string) => {\r\n setSelectedCompletely(val)\r\n if (onChangeDocCompletely) {\r\n onChangeDocCompletely(val)\r\n }\r\n }\r\n\r\n const navigateToResultHistory = (event: any) => {\r\n event.stopPropagation()\r\n const paramData = {\r\n projectID: projectData?.projectID,\r\n submittedID: projectData?.submittedID,\r\n submittedTypeID: projectData?.submitTypeInfo?.value\r\n }\r\n const encryptedProjectData = encryptionAES(JSON.stringify(paramData))\r\n\r\n const path = generatePath(RoutePath.documentVerifyHistory, {\r\n projectData: encryptedProjectData\r\n })\r\n history.push({\r\n pathname: path,\r\n state: state\r\n })\r\n }\r\n\r\n const submitAndUpdateHistoryDisplay = async () => {\r\n onSubmitEdit && onSubmitEdit()\r\n if (projectData?.submittedID) {\r\n await historyStoreAction.updateDisplayHistory(projectData?.submittedID)\r\n }\r\n }\r\n\r\n return {\r\n selectedCompletely,\r\n documentLut: lookupClient.getDocumentResult(),\r\n displayHistory: historyStore.displayVerifyDocHistory,\r\n onChangeRadio: handleChangeRadio,\r\n navigateToResultHistory,\r\n onSubmitEdit: submitAndUpdateHistoryDisplay,\r\n onClickModeEdit\r\n }\r\n}\r\n\r\nexport default useDocumentTestResult\r\n","import { Grid, IconButton, SvgIcon } from '@material-ui/core'\r\nimport TextField from '../../../../control/textfield/textfield'\r\nimport Radio from '../../../../control/radio/radio'\r\nimport useDocumentTestResult from './useDocumentTestResult'\r\nimport { DocumentTestResultViewType, DocumentTestResultCtrlType } from './documentTestResultType'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport MyAccordion from '../../../../control/accordion/accordion'\r\nimport DatePicker from '../../../../control/datepicker/datepicker'\r\nimport React from 'react'\r\nimport { ReactComponent as DocumentIcon } from '../../../../images/document.svg'\r\nimport ModeAccordion from '../modeAccordion/ModeAccordion'\r\nimport { useForm } from 'react-final-form'\r\n\r\nconst DocumentTestResultView = (props: DocumentTestResultViewType) => {\r\n const {\r\n documentLut,\r\n onChangeRadio,\r\n selectedCompletely,\r\n isViewMode,\r\n navigateToResultHistory,\r\n useAccordionMode,\r\n onSubmitEdit,\r\n onClickModeEdit,\r\n displayHistory,\r\n } = props\r\n const translate = useTranslate()\r\n const form = useForm()\r\n\r\n const renderChild = (disabled: boolean) => {\r\n return (\r\n \r\n \r\n \r\n {selectedCompletely === '2' && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {useAccordionMode ? (\r\n renderChild(false)}\r\n renderViewComponent={() => renderChild(true)}\r\n title={translate.get('LABEL.DOCUMENT_REVIEW_RESULT')}\r\n additionIcon={\r\n displayHistory\r\n ? () => (\r\n \r\n \r\n \r\n )\r\n : undefined\r\n }\r\n onConfirm={onSubmitEdit}\r\n onClickEdit={onClickModeEdit}\r\n fieldNames={['isCompletelyDoc', 'resubmitDocDate', 'remark']}\r\n onCancel={() => {\r\n onChangeRadio(form.getFieldState('isCompletelyDoc')?.value)\r\n }}\r\n isViewMode={true}\r\n />\r\n ) : (\r\n (\r\n \r\n \r\n \r\n )\r\n : undefined\r\n }\r\n >\r\n {renderChild(isViewMode ?? false)}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nconst DocumentTestResultCtrl = (props: DocumentTestResultCtrlType) => {\r\n const { isViewMode, useAccordionMode } = props\r\n const documentTestResultCtrlModel = useDocumentTestResult({ ...props })\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport default DocumentTestResultCtrl\r\n","import { OptType } from '../../../services/um/lookups/useIRB'\r\nimport { GetProjectResultType } from '../../../services/web/types/responseWebServiceTypes'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\n\r\nconst useVerifyDocumentProjectDetail = () => {\r\n const authenStore = useAuthenStore()\r\n\r\n const createInitialProjectDetail = (projectData: GetProjectResultType | undefined, lutIrb: OptType[]) => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof projectData?.isRequestCertificatePager === 'boolean') {\r\n if (projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n return {\r\n academicPositionID: projectData?.academicPositionInfo?.value,\r\n otherAcademicPositionTH: projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: projectData?.academicPositionOther_en,\r\n email: projectData?.email,\r\n faculty: {\r\n label: `${projectData?.facultyInfo?.nameTH}`,\r\n value: `${projectData?.facultyInfo?.value}`,\r\n },\r\n fax: projectData?.fax,\r\n homePhone: projectData?.homePhone,\r\n irb: projectData?.irb,\r\n isDraft: projectData?.isDraft,\r\n mobilePhone: projectData?.mobilePhone,\r\n projectNameEN: projectData?.projectName_en,\r\n projectNameTH: projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: projectData?.researcherName_en,\r\n nameTH: projectData?.researcherName_th,\r\n researcherType:\r\n projectData?.researcherTypeInfo && projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n projectData?.educationLevelInfo && projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: projectData?.titleNameInfo?.value,\r\n otherTitleNameTH: projectData?.titleNameOther_th,\r\n otherTitleNameEN: projectData?.titleNameOther_en,\r\n isPhase: projectData?.requestPhase ? '2' : '1',\r\n isTools: projectData?.isTools ? '2' : '1',\r\n IRB: lutIrb.filter((itm) => parseInt(itm.value) === projectData?.irb)[0] || null,\r\n titleName: `${projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${projectData?.academicPositionInfo?.value}` || null,\r\n langTH: projectData?.isLanguageTH ? projectData?.isLanguageTH : false,\r\n langEN: projectData?.isLanguageEN ? projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: projectData?.verifyDocumentRemark || null,\r\n numPhase: projectData?.requestPhase,\r\n isDr: projectData?.isDr ? projectData?.isDr : false,\r\n }\r\n }\r\n\r\n const updateProjectDetailFormatting = (rawData: any, projectData: GetProjectResultType | undefined) => {\r\n console.log(rawData?.academicPosition)\r\n\r\n return {\r\n projectID: Number(projectData?.projectID),\r\n submittedID: Number(projectData?.submittedID),\r\n irb: Number(rawData?.irb),\r\n researcherUserID: Number(projectData?.researcherUserID),\r\n userID: Number(authenStore.profile.userId),\r\n projectName_th: rawData.projectNameTH,\r\n projectName_en: rawData.projectNameEN,\r\n projectSubmitTypeID: Number(projectData?.submitTypeInfo?.value),\r\n facultyID: Number(rawData?.faculty?.value),\r\n requestPhase: rawData?.numPhase,\r\n isTools: rawData?.isTools && rawData?.isTools === '2' ? true : false,\r\n researcherTypeID: Number(rawData?.researcherType?.value),\r\n titleNameID: rawData?.titleName,\r\n titleNameOther_th: rawData?.otherTitleNameTH,\r\n titleNameOther_en: rawData?.otherTitleNameEN,\r\n isDr: rawData?.isDr,\r\n academicPositionID: rawData?.academicPosition != 'undefined' ? rawData?.academicPosition : null,\r\n academicPositionOther_th: rawData?.otherAcademicPositionTH,\r\n academicPositionOther_en: rawData?.otherAcademicPositionEN,\r\n educationLevelID: rawData?.educationLevel?.value ? Number(rawData?.educationLevel?.value) : null,\r\n researcherName_th: rawData?.nameTH,\r\n researcherName_en: rawData?.nameEN,\r\n email: rawData?.email,\r\n homePhone: rawData?.homePhone ?? null,\r\n mobilePhone: rawData?.mobilePhone,\r\n fax: rawData?.fax ?? null,\r\n isLanguage_th: rawData?.langTH ?? false,\r\n isLanguage_en: rawData?.langEN ?? false,\r\n isRequestCertificatePaper:\r\n rawData?.isCertificatePaperList && rawData?.isCertificatePaperList === '1' ? true : false,\r\n isDraft: rawData?.isDraft ?? false,\r\n userGroupID: Number(authenStore.profile.userGroupId),\r\n submitStatusID: Number(projectData?.submittedStatusInfo?.value),\r\n }\r\n }\r\n\r\n return {\r\n createInitialProjectDetail,\r\n updateProjectDetailFormatting,\r\n }\r\n}\r\n\r\nexport default useVerifyDocumentProjectDetail\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\nimport { ResultDocumentTopicLut } from '../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport * as Utils from '../../../../../utilities/date'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport * as REQServiceTypes from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\nimport * as VerifyDocumentType from './verifyDocumentType'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../constants/approveStatus'\r\nimport useIRB from '../../../../../services/um/lookups/useIRB'\r\nimport useVerifyDocumentProjectDetail from '../../../shareLogic/useVerifyDocumentProjectDetail'\r\nimport { validateModeAccordionError } from '../../../../../utilities/validate'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\ntype OptType = {\r\n label: string\r\n value: string\r\n}\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\n\r\nconst useVerifyDocument = (props: VerifyDocumentType.VerifyDocumentType) => {\r\n const { projectData, onSaveComplete } = props\r\n\r\n const history = useHistory()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const snackbarAction = useSnackbarAction()\r\n\r\n const [isCompletely, setIsCompletely] = React.useState(true)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n const documentTopicRef = React.useRef()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const reviewerLutRef = React.useRef()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const { createInitialProjectDetail, updateProjectDetailFormatting } = useVerifyDocumentProjectDetail()\r\n const { getIRB } = useIRB()\r\n const formHistoryRef = React.useRef>({})\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n setIsCompletely(projectData?.verifyDocument ?? true)\r\n getReviewer(projectData.irb)\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.irb && projectData?.submitTypeInfo?.value) {\r\n getDocumentTopicLut(projectData?.irb, projectData?.submitTypeInfo.value)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const filterTopicUpload = (documentTopic: ResultDocumentTopicLut[]) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n const researcherTypeID = manageProjectStore?.projectData?.researcherTypeInfo.value\r\n\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n Constants.topicForLecturer.forEach((element) => {\r\n docTopic = documentTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n Constants.topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submitType: number) => {\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitType)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n filterTopicUpload(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n const documentInfo = projectData?.documentInfo\r\n // ------------------------------------------------------------- //\r\n let uploadFileInit = manageProjectStore.documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: VerifyDocumentType.uploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList = docInfo.fileInfo\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic\r\n }\r\n })\r\n })\r\n\r\n let latestDocument = manageProjectStore.projectData?.latestDocument\r\n //Section Replace File\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileInit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileID, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFileBy.replaceFileID,\r\n } as any,\r\n ]\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const getReviewer = async (irb: number) => {\r\n if (irb) {\r\n const res = await callLookup.callReviewerLut(irb)\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: itm.name_th,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n reviewerLutRef.current = formatedData\r\n }\r\n }\r\n\r\n const handleChangeDocCompletely = (val: string) => {\r\n const isCompletely = val === '1' ? true : false\r\n setIsCompletely(isCompletely)\r\n }\r\n\r\n const createInitialData = async () => {\r\n loadingHook.loadingOpen()\r\n const defaultCompletely = projectData?.verifyDocument ?? '1'\r\n const lutIrb = await getIRB()\r\n const projectDetail = createInitialProjectDetail(projectData, lutIrb)\r\n const initialData = {\r\n isCompletelyDoc: defaultCompletely === '1' ? defaultCompletely : projectData?.verifyDocument ? '1' : '2',\r\n resubmitDocDate: projectData?.resubmitDocDate ? projectData?.resubmitDocDate : null,\r\n //@ts-ignore\r\n reviewer: projectData?.reviewerUserID\r\n ? {\r\n label: `${projectData?.reviewerName_th}`,\r\n value: `${projectData?.reviewerUserID}`,\r\n }\r\n : null,\r\n remark: projectData?.verifyDocumentRemark,\r\n ...projectDetail,\r\n }\r\n setInitialValues(initialData)\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const checkUseUploadEdit = () => {\r\n let isUseUploadEdit = false\r\n\r\n switch (projectData?.submitTypeInfo?.value) {\r\n case constSubmittedType.firstSubmitConsideration:\r\n isUseUploadEdit = false\r\n break\r\n case constSubmittedType.editAfterReview:\r\n isUseUploadEdit = true\r\n break\r\n case constSubmittedType.editAfterReview_nextPhaseProject:\r\n isUseUploadEdit = true\r\n break\r\n case constSubmittedType.exitAfterReview_AmendmentProject:\r\n isUseUploadEdit = true\r\n break\r\n case constSubmittedType.editAfterReview_closeProject:\r\n isUseUploadEdit = true\r\n break\r\n default:\r\n isUseUploadEdit = false\r\n }\r\n if (projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument) {\r\n //เอกสารไม่ครบถ้วน\r\n isUseUploadEdit = true\r\n }\r\n if (\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC1.approveWithComment ||\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC2.approveWithComment\r\n ) {\r\n //Approve With Comment\r\n isUseUploadEdit = true\r\n }\r\n\r\n return isUseUploadEdit\r\n }\r\n const handleDirtyChange = (props: { dirty: boolean }) => {\r\n let isDirty: boolean = false\r\n if (!isViewMode) {\r\n isDirty = props.dirty\r\n }\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n const isCompletelyDoc = value?.isCompletelyDoc === '1'\r\n let reviewerUserID = null\r\n // if (isCompletelyDoc && value?.reviewer?.value) {\r\n if (value?.reviewer?.value) {\r\n reviewerUserID = parseInt(value.reviewer.value)\r\n }\r\n let sendEditData = null\r\n if (!isCompletelyDoc && value?.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(value.resubmitDocDate) ?? null\r\n }\r\n const verifyProjectServiceParam: REQServiceType.VerifyProjectRequestType = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n reviewerUserID: reviewerUserID,\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : value?.remark ? value.remark : null,\r\n isDraft: isDraft,\r\n }\r\n\r\n return verifyProjectServiceParam\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft: boolean = true\r\n const param = getSaveServiceParameter(isDraft)\r\n\r\n const value = formRef.current?.values\r\n const doc = getDocumentInfo(value)\r\n const paramDoc: REQServiceType.UpdateFileProjectRequestType = {\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n documentInfo: doc ?? null,\r\n }\r\n processSaveData(param, paramDoc, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const confirmEditUploadDoc = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (isError) {\r\n snackbarAction.openSnackbar({\r\n message: translate.get('ALERT.CONTENT.PLEASE_COMPLETE_PAGE'),\r\n type: 'error',\r\n })\r\n reject('')\r\n } else {\r\n const value = formRef.current?.values\r\n const doc = getDocumentInfo(value)\r\n const paramDoc: REQServiceType.UpdateFileProjectRequestType = {\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n documentInfo: doc ?? null,\r\n }\r\n saveDataUploadDoc(paramDoc)\r\n .then(async () => {\r\n if (projectData) {\r\n await tabAndFolderHook.reloadProjectData(projectData.projectID, projectData.submittedID)\r\n await createInitialData()\r\n }\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n }\r\n })\r\n }\r\n\r\n const saveDataUploadDoc = async (paramDoc: REQServiceType.UpdateFileProjectRequestType) => {\r\n try {\r\n loadingHook.loadingOpen()\r\n await callWebService.updateFileProject(paramDoc)\r\n } catch (ex) {\r\n console.log('useVerifyDocument.ts => confirmEditUploadDoc : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.VerifyProjectRequestType,\r\n paramDoc: REQServiceType.UpdateFileProjectRequestType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n try {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n let isEditAfterReviewCloseProject = false\r\n if (constSubmittedType.editAfterReview_closeProject === projectData?.submitTypeInfo?.value) {\r\n isEditAfterReviewCloseProject = true\r\n } //แก้ไขหลังพิจารณา (ขอปิดโครงการ)\r\n\r\n let response\r\n if (isEditAfterReviewCloseProject) {\r\n response = await callWebService.verifyEditAfterReviewCloseProject(param)\r\n } else {\r\n response = await callWebService.verifyProject(param)\r\n }\r\n\r\n // const response = await callWebService.verifyProject(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useVerifyDocument.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleSubmitForm = async (value: any) => {\r\n if (projectData?.projectID && projectData?.submittedID) {\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param = getSaveServiceParameter(isDraft)\r\n\r\n const doc = getDocumentInfo(value)\r\n const paramDoc: REQServiceType.UpdateFileProjectRequestType = {\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n documentInfo: doc ?? null,\r\n }\r\n\r\n if (value.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param, paramDoc)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param, paramDoc)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n // const fileTokenInfo: Array = uploadObj.uploadFileObj.fileList?.map((file) => file.fileToken) ?? []\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n // console.log('myFileData : ', myFileData)\r\n return myFileData\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const confirmEditDocResult = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (isError) {\r\n formProps.form.submit()\r\n reject('')\r\n } else {\r\n let isCompletelyDoc = formProps.values.isCompletelyDoc === '1'\r\n let sendEditData = null\r\n if (!isCompletelyDoc && formProps.values.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(formProps.values.resubmitDocDate) ?? null\r\n }\r\n const param = {\r\n ...getEditDocParams(formHistoryRef.current['docResult']),\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : formProps.values?.remark ? formProps.values.remark : null,\r\n }\r\n const doc = getDocumentInfo(formHistoryRef.current['docResult'])\r\n const paramDoc: REQServiceType.UpdateFileProjectRequestType = {\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n documentInfo: doc ?? null,\r\n }\r\n processSaveData(param, paramDoc)\r\n .then(() => {\r\n handleEditDocResult(formProps)\r\n handleEditDocReviewer(formProps)\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n }\r\n })\r\n }\r\n\r\n const confirmEditDocReviewer = async (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n loadingHook.loadingOpen()\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n let reviewerUserID = null\r\n if (formProps?.values?.reviewer?.value) {\r\n reviewerUserID = parseInt(formProps.values.reviewer.value)\r\n }\r\n const param = {\r\n ...getEditDocParams(formHistoryRef.current['docResult']),\r\n }\r\n const formatParam = {\r\n submittedID: Number(param.submittedID),\r\n loginUserID: Number(param.loginUserID),\r\n reviewerUserID: Number(reviewerUserID),\r\n }\r\n Promise.all([callWebService.updateProjectReviewer(formatParam)])\r\n .then(() => {\r\n handleEditDocResult(formProps)\r\n handleEditDocReviewer(formProps)\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n }).finally(() => loadingHook.loadingClose())\r\n }\r\n\r\n const handleEditDocResult = (formProps: FormRenderProps) => {\r\n formHistoryRef.current['docResult'] = formProps.values\r\n }\r\n\r\n const handleEditDocReviewer = (formProps: FormRenderProps) => {\r\n formHistoryRef.current['docReviewer'] = formProps.values\r\n }\r\n\r\n const getEditDocParams = (formValues: any) => {\r\n let verifyProjectServiceParam: REQServiceType.VerifyProjectRequestType\r\n const isCompletelyDoc = formValues?.isCompletelyDoc === '1'\r\n let reviewerUserID = null\r\n if (formValues?.reviewer?.value) {\r\n reviewerUserID = parseInt(formValues.reviewer.value)\r\n }\r\n\r\n let sendEditData = null\r\n if (!isCompletelyDoc && formValues?.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(formValues.resubmitDocDate) ?? null\r\n }\r\n\r\n verifyProjectServiceParam = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n reviewerUserID: reviewerUserID,\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : formValues?.remark ? formValues.remark : null,\r\n isDraft: false,\r\n }\r\n\r\n return verifyProjectServiceParam\r\n }\r\n\r\n const confirmEditEthics = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n loadingHook.loadingOpen()\r\n const rawData = formRef.current?.values\r\n const formattingParam = updateProjectDetailFormatting(rawData, projectData)\r\n callWebService\r\n .updateProjectDetail(formattingParam)\r\n .then(async () => {\r\n if (projectData) {\r\n await tabAndFolderHook.reloadProjectData(projectData.projectID, projectData.submittedID)\r\n await createInitialData()\r\n }\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n .finally(() => {\r\n loadingHook.loadingClose()\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n return {\r\n formRef,\r\n configDialog,\r\n onRefDialog,\r\n isCompletely,\r\n initialUploadFile: initialUploadFile,\r\n isViewMode,\r\n initialValues,\r\n isShowUpdateDate,\r\n onSubmitForm: handleSubmitForm,\r\n onChangeDocCompletely: handleChangeDocCompletely,\r\n checkUseUploadEdit: checkUseUploadEdit,\r\n onDirtyChange: handleDirtyChange,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n projectDetailLabel: translate.get('LABEL.PROJECT_DETAIL'),\r\n confirmEditDocResult,\r\n confirmEditDocReviewer,\r\n handleEditDocResult,\r\n handleEditDocReviewer,\r\n confirmEditEthics,\r\n confirmEditUploadDoc,\r\n }\r\n}\r\n\r\nexport default useVerifyDocument\r\n","export const ethicsFormResetList = [\r\n 'isNeedEditForm',\r\n 'isPhase',\r\n 'isTools',\r\n 'numPhase',\r\n 'faculty',\r\n 'IRB',\r\n 'projectNameTH',\r\n 'projectNameEN',\r\n 'langTH',\r\n 'langEN',\r\n 'isCertificatePaperList',\r\n 'researcherType',\r\n 'researcherType',\r\n 'educationLevel',\r\n 'titleName',\r\n 'otherTitleNameTH',\r\n 'otherTitleNameEN',\r\n 'isDr',\r\n 'academicPosition',\r\n 'otherAcademicPositionTH',\r\n 'otherAcademicPositionEN',\r\n 'nameTH',\r\n 'nameEN',\r\n 'homePhone',\r\n 'fax',\r\n 'mobilePhone',\r\n 'email',\r\n]","import ResearchDetail from '../../../shareUI/ResearchDetail/researchDetail'\r\nimport DocumentTestResult from '../../../shareUI/documentTestResult/documentTestResult'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport { VerifyDocumentViewType, VerifyDocumentType } from './verifyDocumentType'\r\nimport useVerifyDocument from './useVerifyDocument'\r\nimport React from 'react'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport { Grid, useTheme, makeStyles } from '@material-ui/core'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport EthicsForm from '../../../shareUI/ethicsForm/ethicsForm'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport { ethicsFormResetList } from '../../../shareUI/ethicsForm/formResetList'\r\n\r\nconst VerifyDocumentView = (props: VerifyDocumentViewType) => {\r\n const {\r\n formRef,\r\n onRefDialog,\r\n configDialog,\r\n initialValues,\r\n projectData,\r\n initialUploadFile,\r\n onChangeDocCompletely,\r\n isViewMode,\r\n checkUseUploadEdit,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n isNotDisableTestResult = false,\r\n isShowUpdateDate,\r\n projectDetailLabel,\r\n confirmEditDocResult,\r\n handleEditDocResult,\r\n confirmEditEthics,\r\n confirmEditUploadDoc,\r\n } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const { documentTopic } = manageProjectStore\r\n const checkPermission = useCheckPermission()\r\n const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n const isDisabledTestResult = isNotDisableTestResult || canOfficerEdit ? false : true\r\n const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n return (\r\n \r\n \r\n \r\n {checkPermission.isUserAdmin() ? (\r\n (\r\n \r\n )}\r\n renderViewComponent={() => (\r\n \r\n )}\r\n fieldNames={ethicsFormResetList}\r\n isViewMode={true}\r\n onConfirm={() => confirmEditEthics(props, ethicsFormResetList)}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n {\r\n await confirmEditUploadDoc(props, ['uploadFile'])\r\n }}\r\n zipDownload={true}\r\n />\r\n \r\n \r\n {\r\n await confirmEditDocResult(props, [\r\n 'isCompletelyDoc',\r\n 'resubmitDocDate',\r\n 'remark',\r\n ])\r\n }}\r\n onClickModeEdit={() => handleEditDocResult(props)}\r\n />\r\n \r\n {isShowUpdateDate && }\r\n\r\n {(isNotDisableTestResult || !isViewMode) && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }\r\n : undefined\r\n }\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst VerifyDocument = (props: VerifyDocumentType) => {\r\n const verifyDocumentModel = useVerifyDocument(props)\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: 128,\r\n padding: 20,\r\n },\r\n titleFont: {\r\n color: '#BDBDBD',\r\n },\r\n contentFont: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default VerifyDocument\r\n","import React from 'react'\r\nimport useLookupService from '../../../../services/lookup/useLookupService'\r\n\r\nimport * as designateReviewerTypes from './designateReviewerTypes'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\n\r\nconst useDesignateReviewer = (props: designateReviewerTypes.UseDesignateReviewerType) => {\r\n const { irb } = props\r\n const callLookup = useLookupService()\r\n const [reviewer, setReviewer] = React.useState([])\r\n const translate = useTranslate()\r\n\r\n React.useEffect(() => {\r\n if (irb) {\r\n getReviewer()\r\n }\r\n }, [irb, translate.languageStore.currentLanguage])\r\n\r\n const getReviewer = async () => {\r\n if (irb) {\r\n const res = await callLookup.callReviewerLut(irb)\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n setReviewer(formatedData)\r\n }\r\n }\r\n\r\n return {\r\n reviewer,\r\n }\r\n}\r\n\r\nexport default useDesignateReviewer\r\n","import * as designateReviewerTypes from './designateReviewerTypes'\r\nimport useDesignateReviewer from './useDesignateReviewer'\r\nimport Autocomplete from '../../../../control/autocomplete/autocomplete'\r\nimport MyAccordion from '../../../../control/accordion/accordion'\r\nimport React from 'react'\r\nimport { Grid } from '@material-ui/core'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport ModeAccordion from '../modeAccordion/ModeAccordion'\r\n\r\n//View\r\nconst DesignateReviewerView = (props: designateReviewerTypes.DesignateReviewerViewType) => {\r\n const translate = useTranslate()\r\n const {\r\n reviewer,\r\n isViewMode = false,\r\n title = translate.get('LABEL.DEFINE_PRELIMINARY_REVIEWER'),\r\n label = translate.get('LABEL.PRELIMINARY_REVIEWER_NAME'),\r\n reqField = true,\r\n onSubmitEdit,\r\n useAccordionMode,\r\n onClickModeEdit\r\n } = props\r\n\r\n const renderChild = (disabled = false) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {useAccordionMode ? (\r\n renderChild(false)}\r\n renderViewComponent={() => renderChild(true)}\r\n title={title}\r\n onConfirm={onSubmitEdit}\r\n onClickEdit={onClickModeEdit}\r\n fieldNames={['reviewer']}\r\n isViewMode={true}\r\n />\r\n ) : (\r\n {renderChild(isViewMode)}\r\n )}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst DesignateReviewer = (props: designateReviewerTypes.DesignateReviewerType) => {\r\n const { isViewMode } = props\r\n const designateReviewerModel = useDesignateReviewer(props)\r\n return \r\n}\r\n\r\nexport default DesignateReviewer\r\n","import ResearchDetail from '../../../shareUI/ResearchDetail/researchDetail'\r\nimport DocumentTestResult from '../../../shareUI/documentTestResult/documentTestResult'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport DesignateReviewer from '../../../shareUI/designateReviewer/designateReviewer'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport { Grid } from '@material-ui/core'\r\nimport { VerifyDocumentViewType, VerifyDocumentType } from './verifyDocumentType'\r\nimport useVerifyDocument from './useVerifyDocument'\r\nimport React from 'react'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport EthicsForm from '../../../shareUI/ethicsForm/ethicsForm'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport { ethicsFormResetList } from '../../../shareUI/ethicsForm/formResetList'\r\n\r\nconst VerifyDocumentView = (props: VerifyDocumentViewType) => {\r\n const {\r\n formRef,\r\n onRefDialog,\r\n configDialog,\r\n initialValues,\r\n projectData,\r\n initialUploadFile,\r\n onChangeDocCompletely,\r\n isCompletely,\r\n isViewMode,\r\n checkUseUploadEdit,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n isNotDisableTestResult = false,\r\n isShowUpdateDate,\r\n projectDetailLabel,\r\n confirmEditDocResult,\r\n confirmEditDocReviewer,\r\n handleEditDocResult,\r\n handleEditDocReviewer,\r\n confirmEditEthics,\r\n confirmEditUploadDoc,\r\n } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const { documentTopic } = manageProjectStore\r\n\r\n const irb = projectData?.irb\r\n const checkPermission = useCheckPermission()\r\n const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n const isDisabledTestResult = isNotDisableTestResult || canOfficerEdit ? false : true\r\n const isDisableReviewer = checkPermission.checkDisabledProjectReviewer(projectData)\r\n const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n // const canOfficerSaveDraft = checkPermission.checkOfficerSaveDraft(projectData)\r\n\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n return (\r\n \r\n \r\n \r\n {checkPermission.isUserAdmin() ? (\r\n (\r\n \r\n )}\r\n renderViewComponent={() => (\r\n \r\n )}\r\n fieldNames={ethicsFormResetList}\r\n isViewMode={true}\r\n onConfirm={() => confirmEditEthics(props, ethicsFormResetList)}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n {\r\n await confirmEditUploadDoc(props, ['uploadFile'])\r\n }}\r\n zipDownload={true}\r\n />\r\n \r\n \r\n {\r\n await confirmEditDocResult(props, [\r\n 'isCompletelyDoc',\r\n 'resubmitDocDate',\r\n 'remark',\r\n ])\r\n }}\r\n onClickModeEdit={() => handleEditDocResult(props)}\r\n />\r\n \r\n {isCompletely && (\r\n \r\n {\r\n await confirmEditDocReviewer(props, ['reviewer'])\r\n }}\r\n onClickModeEdit={() => handleEditDocReviewer(props)}\r\n />\r\n \r\n )}\r\n\r\n {isShowUpdateDate && }\r\n\r\n {(isNotDisableTestResult || !isViewMode) && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }\r\n : undefined\r\n }\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst VerifyDocument = (props: VerifyDocumentType) => {\r\n const verifyDocumentModel = useVerifyDocument(props)\r\n return \r\n}\r\nexport default VerifyDocument\r\n","import React from 'react'\r\nimport * as defineType from './defineTypeTypes'\r\nimport useLookupService from '../../../../services/lookup/useLookupService'\r\nimport { useForm } from 'react-final-form'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport useCheckPermission from '../../../../utilities/checkPermission'\r\nimport useAuthenStore from '../../../../stores/authen/authenStore'\r\nimport useWebService from '../../../../services/web/useWebService'\r\nimport useLoading from '../../../../control/loading/useLoading'\r\nimport useAppFolderAndTabStore from '../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useFolderAndTab from '../../project/useFolderAndTab'\r\nimport { validateModeAccordionError } from '../../../../utilities/validate'\r\nimport { generatePath, useHistory, useLocation } from 'react-router-dom'\r\nimport { encryptionAES } from '../../../../utilities/encryption'\r\nimport { RoutePath } from '../../../../router/routesConfig'\r\nimport useHistoryAction from '../../../../stores/history/useHistoryAction'\r\nimport useHistoryStore from '../../../../stores/history/useHistoryStore'\r\n\r\nconst useDefineType = (props: defineType.UseDefineTypeType) => {\r\n const { onChang, projectData, disabled } = props\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const [expanded, setExpanded] = React.useState('panel1')\r\n const [projectType, setProjectType] = React.useState([])\r\n const form = useForm()\r\n const { checkDisabledProjectType } = useCheckPermission()\r\n const disabledDefineType = checkDisabledProjectType(projectData)\r\n const authenStore = useAuthenStore()\r\n const webServiceHook = useWebService()\r\n const loadingHook = useLoading()\r\n const history = useHistory()\r\n const { state } = useLocation()\r\n\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const historyStoreAction = useHistoryAction()\r\n const historyStore = useHistoryStore()\r\n\r\n React.useEffect(() => {\r\n getProjectType()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getProjectType = async () => {\r\n const res = await callLookup.callProjectTypeLut()\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n setProjectType(formatedData)\r\n }\r\n\r\n const handleChange = (panel: string) => (event: React.ChangeEvent<{}>, newExpanded: boolean) => {\r\n setExpanded(newExpanded ? panel : false)\r\n }\r\n\r\n const handleChangProjectType = (val: defineType.OptType) => {\r\n if (onChang) {\r\n onChang(val)\r\n }\r\n }\r\n const handleChangeIsNotAboutPeople = () => {\r\n /* Resets the values back to the initial values the form was initialized with. Or empties all the values if the form was not initialized. If you provide initialValues they will be used as the new initial values.\r\n Note that if you are calling reset() and not specify new initial values, you must call it with no arguments. Be careful to avoid things like promise.catch(reset) or onChange={form.reset} in React, as they will get arguments passed to them and reinitialize your form. */\r\n form.reset()\r\n }\r\n\r\n const handleSubmitOfficerEdit = (fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, form.getState())\r\n return new Promise((resolve, reject) => {\r\n const param = createParamOfficerUpdate()\r\n if (!isError) {\r\n loadingHook.loadingOpen()\r\n processUpdate(param)\r\n .then(() => {\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n .finally(() => {\r\n historyStoreAction.updateDisplayHistory(projectData.submittedID)\r\n loadingHook.loadingClose()\r\n })\r\n } else {\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const processUpdate = async (param: any) => {\r\n const isNotAboutPeople = form.getState().values.isNotAboutPeople ?? false\r\n let response\r\n if (isNotAboutPeople) {\r\n response = await webServiceHook.specifyProjectType(param).then(() => {\r\n loadTabAndFolder()\r\n })\r\n } else {\r\n response = await webServiceHook.updateProjectConsiderType(param).then(() => {\r\n tabAndFolderHook.reloadProjectData(projectData.projectID, projectData.submittedID)\r\n })\r\n }\r\n return response\r\n }\r\n\r\n const createParamOfficerUpdate = () => {\r\n const formVals = form.getState().values\r\n const isNotAboutPeople = formVals.isNotAboutPeople ?? false\r\n let param = {}\r\n if (isNotAboutPeople) {\r\n param = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData.projectID,\r\n submittedID: projectData.submittedID,\r\n isNotAboutPeople: formVals.isNotAboutPeople,\r\n considerTypeID: null,\r\n reviewerRemark: null,\r\n committeeInfo: [],\r\n reviewerUserID: null,\r\n isDraft: false,\r\n }\r\n } else {\r\n param = {\r\n submittedID: projectData.submittedID,\r\n considerTypeID: formVals.projectType?.value ? Number(formVals.projectType?.value) : null,\r\n reviewerRemark: formVals.comment,\r\n }\r\n }\r\n return param\r\n }\r\n\r\n const loadTabAndFolder = async (isReloadProjectData: boolean = true, ignoreCustomFolder: boolean = false) => {\r\n tabAndFolderHook.loadTabAndFolder(projectData, appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n\r\n const navigateToLogs = (event: any) => {\r\n event.stopPropagation()\r\n const paramData = {\r\n projectID: projectData?.projectID,\r\n submittedID: projectData?.submittedID,\r\n submittedTypeID: projectData?.submitTypeInfo?.value,\r\n }\r\n const encryptedProjectData = encryptionAES(JSON.stringify(paramData))\r\n\r\n const path = generatePath(RoutePath.considerTypeHistory, {\r\n projectData: encryptedProjectData,\r\n })\r\n history.push({\r\n pathname: path,\r\n state: state,\r\n })\r\n }\r\n\r\n return {\r\n projectType,\r\n expanded,\r\n displayHistory: historyStore.displayConsiderTypeHistory,\r\n onChangeAccordion: handleChange,\r\n onChangProjectType: handleChangProjectType,\r\n onChangeIsNotAboutPeople: handleChangeIsNotAboutPeople,\r\n useAccordionMode: !disabledDefineType && disabled && !projectData.isNotAboutPeople,\r\n handleSubmitOfficerEdit,\r\n navigateToLogs,\r\n }\r\n}\r\n\r\nexport default useDefineType\r\n","import * as defineType from './defineTypeTypes'\r\nimport useDefineType from './useDefineType'\r\nimport Autocomplete from '../../../../control/autocomplete/autocomplete'\r\nimport MyTextfield from '../../../../control/textfield/textfield'\r\nimport Checkbox from '../../../../control/checkbox/checkbox'\r\nimport React from 'react'\r\nimport { Grid, IconButton, SvgIcon } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport MyAccordion from '../../../../control/accordion/accordion'\r\nimport ModeAccordion from '../modeAccordion/ModeAccordion'\r\nimport { ReactComponent as DocumentIcon } from '../../../../images/document.svg'\r\n\r\n//View\r\nconst DefineTypeView = (props: defineType.DefineTypeViewType) => {\r\n const {\r\n projectType,\r\n disabled = false,\r\n isNotAboutPeople = false,\r\n isShowFieldNotAboutPeople = false,\r\n onChangProjectType,\r\n onChangeIsNotAboutPeople,\r\n useAccordionMode,\r\n handleSubmitOfficerEdit,\r\n navigateToLogs,\r\n displayHistory,\r\n } = props\r\n const translate = useTranslate()\r\n\r\n const renderChild = (disabledVal = false) => {\r\n return (\r\n \r\n \r\n {isShowFieldNotAboutPeople && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderHistoryIcon = () => {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {useAccordionMode ? (\r\n renderChild(false)}\r\n renderViewComponent={() => renderChild(true)}\r\n fieldNames={['isNotAboutPeople', 'projectType', 'comment']}\r\n onConfirm={() => handleSubmitOfficerEdit(['isNotAboutPeople', 'projectType', 'comment'])}\r\n isViewMode={true}\r\n additionIcon={displayHistory ? renderHistoryIcon : undefined}\r\n >\r\n ) : (\r\n \r\n {renderChild(disabled)}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst DefineType = (props: defineType.DefineTypeType) => {\r\n const defineTypeModel = useDefineType(props)\r\n return \r\n}\r\n\r\nexport default DefineType\r\n\r\nconst useStyles = makeStyles((theme) => ({}))\r\n","import React from 'react'\r\nimport { useForm } from 'react-final-form'\r\nimport useLookupService from '../../../../services/lookup/useLookupService'\r\nimport * as defineDirectorTypes from './defineDirectorTypes'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport useLoading from '../../../../control/loading/useLoading'\r\nimport useAuthenStore from '../../../../stores/authen/authenStore'\r\nimport useWebService from '../../../../services/web/useWebService'\r\nimport { validateModeAccordionError } from '../../../../utilities/validate'\r\nimport useFolderAndTab from '../../project/useFolderAndTab'\r\nimport useCheckPermission from '../../../../utilities/checkPermission'\r\n\r\nconst useDefineDirector = (props: defineDirectorTypes.UseDefineDirectorType) => {\r\n const { irb, irbType, reqField = true, projectData } = props\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const loadingHook = useLoading()\r\n const authenStore = useAuthenStore()\r\n const webServiceHook = useWebService()\r\n const [director, setDirector] = React.useState([])\r\n const [role, setRole] = React.useState([])\r\n const [isError, setIsError] = React.useState(false)\r\n const [reqFieldForm, setReqFieldForm] = React.useState<[{ director: boolean; role: boolean }]>([\r\n { director: reqField, role: reqField },\r\n ])\r\n const committee = React.useRef<{ director: any; role: any }[]>([])\r\n const directorRef = React.useRef([])\r\n const form = useForm()\r\n const listTopicCommittee: string[] = []\r\n const folderAndTabHook = useFolderAndTab()\r\n const checkPermission = useCheckPermission()\r\n\r\n React.useEffect(() => {\r\n if (irb) {\r\n getDirector(irb)\r\n }\r\n\r\n getRole()\r\n conditionRequiredField()\r\n }, [irb, translate.languageStore.currentLanguage, reqField])\r\n\r\n React.useEffect(() => {\r\n if (projectData && projectData?.committeeInfo.length > 0) {\r\n directorRef.current = projectData?.committeeInfo.map((itm: any, idx: number) => {\r\n return { index: idx, value: itm.userID?.toString() }\r\n })\r\n }\r\n }, [projectData?.committeeInfo ?? null])\r\n\r\n const getDirector = async (irb: number) => {\r\n const res = await callLookup.callDirectorNameLut(irb)\r\n const formatData = res.result.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n disabled: false,\r\n }\r\n })\r\n setDirector(formatData)\r\n }\r\n const getRole = async () => {\r\n if (irb) {\r\n const res = await callLookup.callRoleLut(irb)\r\n const formatData = res.result.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n setRole(formatData)\r\n }\r\n }\r\n\r\n const conditionRequiredField = () => {\r\n const isCommittee: defineDirectorTypes.CommitteeType[] | undefined = form.getState().values.committeeInfo\r\n if (isCommittee) {\r\n //เข้าก็ต่อเมื่อ มีการกำหนดกรรมการแล้ว\r\n isCommittee.forEach((itm, index: number) => {\r\n if (reqFieldForm[index]) {\r\n if (!reqField) {\r\n //เข้าก็ต่อเมื่อเลือกประเภทโครงการเป็น exempt\r\n\r\n if (itm.director && !itm.role) {\r\n //เข้าก็ต่อเมื่อ มีการเลือกกรรมการแต่ไม่ได้เลือกหน้าที่\r\n reqFieldForm[index].director = false\r\n reqFieldForm[index].role = true\r\n } else if (!itm.director && itm.role) {\r\n //เข้าก็ต่อเมื่อ มีการเลือกหน้าที่แต่ไม่ได้เลือกกรรมการ\r\n reqFieldForm[index].director = true\r\n reqFieldForm[index].role = false\r\n } else {\r\n reqFieldForm[index].director = false\r\n reqFieldForm[index].role = false\r\n }\r\n } else {\r\n //เข้าก็ต่อเมื่อไม่ได้เลือกประเภทโครงการเป็น exempt\r\n reqFieldForm[index].director = true\r\n reqFieldForm[index].role = true\r\n }\r\n }\r\n })\r\n } else {\r\n //ยังไม่เคยกำหนดกรรมการ\r\n setReqFieldForm([{ director: reqField, role: reqField }])\r\n }\r\n }\r\n\r\n const handleClickAdd = (field: any) => {\r\n const isEmpty = field?.value?.find(\r\n (e: { director: defineDirectorTypes.OptType; role: defineDirectorTypes.OptType }) =>\r\n !e?.director || !e?.role,\r\n )\r\n if (!isEmpty) {\r\n setIsError(false)\r\n reqFieldForm?.push({ director: reqField, role: reqField })\r\n field.push({})\r\n committee.current?.push({ director: null, role: null })\r\n } else {\r\n setIsError(true)\r\n }\r\n }\r\n\r\n const handleClickRemove = (field: any, index: number) => {\r\n const newField = field.remove(index)\r\n\r\n const filterCommittee = field?.value.filter((itm: any) => {\r\n return itm !== newField\r\n })\r\n\r\n directorRef.current = filterCommittee?.map(\r\n (item: { director: defineDirectorTypes.OptType; role: defineDirectorTypes.OptType }, idx: number) => {\r\n return { index: idx, value: item?.director?.value }\r\n },\r\n )\r\n\r\n //@ts-ignore\r\n committee.current = committee.current?.filter((itm, idex) => {\r\n return idex !== index\r\n })\r\n }\r\n\r\n const validateField = (value: defineDirectorTypes.OptType, index: number, lengthFields: number) => {\r\n if (value) {\r\n return false\r\n } else {\r\n if (lengthFields === index) {\r\n return isError\r\n } else {\r\n return false\r\n }\r\n }\r\n }\r\n\r\n const handleChangValDirector = (val: defineDirectorTypes.OptType, index: number) => {\r\n if (directorRef.current.length > 0) {\r\n const isDuplicateIdx = directorRef.current.find((e: { index: number; value: string }) => e.index === index)\r\n\r\n if (!isDuplicateIdx) {\r\n directorRef.current = [...directorRef.current, { index: index, value: val.value }]\r\n } else {\r\n directorRef.current = directorRef.current.map((itm: any) => {\r\n if (itm.index === index) {\r\n return {\r\n ...itm,\r\n value: val?.value ? val?.value : null,\r\n }\r\n } else {\r\n return itm\r\n }\r\n })\r\n }\r\n } else {\r\n directorRef.current = [{ index: index, value: val.value }]\r\n }\r\n\r\n if (!reqField) conditionReqFieldDirector(val, index)\r\n\r\n // if (!reqField && irbType !== 2) conditionReqFieldDirector(val, index)\r\n\r\n if (irbType === 2) {\r\n conditionIRB2(val, index)\r\n }\r\n }\r\n\r\n const handleChangValRole = (val: defineDirectorTypes.OptType, index: number) => {\r\n if (!reqField) conditionReqFieldRole(val, index)\r\n\r\n // if (irbType === 2) {\r\n // conditionIRB2(val, index)\r\n // }\r\n }\r\n\r\n const handleOpen = (index: number) => {\r\n // set opt director enable all\r\n director.map((item: any) => {\r\n return (item.disabled = false)\r\n })\r\n\r\n // set opt disable when opt selected\r\n director.forEach((itm: any) => {\r\n directorRef.current.forEach((item: any) => {\r\n if (index === item.index && item.value === itm.value) {\r\n // เปิด disable กรรมการใน index ที่เปิด\r\n itm.disabled = false\r\n } else if (item.value === itm.value) {\r\n itm.disabled = true\r\n }\r\n })\r\n })\r\n }\r\n\r\n const conditionReqFieldDirector = (val: defineDirectorTypes.OptType, index: number) => {\r\n const committeeInfo = form.getState().values?.committeeInfo\r\n if (!val && !reqField) {\r\n setIsError(false)\r\n if (committeeInfo[index].role) {\r\n reqFieldForm[index].director = true\r\n } else {\r\n reqFieldForm[index].role = reqField\r\n }\r\n }\r\n if (val && !reqField) {\r\n reqFieldForm[index].director = reqField\r\n committeeInfo.forEach(\r\n (item: { director: defineDirectorTypes.OptType; role: defineDirectorTypes.OptType }, idx: number) => {\r\n if (!item.role) reqFieldForm[idx].role = !reqField\r\n },\r\n )\r\n }\r\n form.restart()\r\n }\r\n\r\n const conditionReqFieldRole = (val: defineDirectorTypes.OptType, index: number) => {\r\n const committeeInfo = form.getState().values?.committeeInfo\r\n if (!val && !reqField) {\r\n setIsError(false)\r\n if (committeeInfo[index].director) {\r\n reqFieldForm[index].role = true\r\n } else {\r\n reqFieldForm[index].director = reqField\r\n }\r\n }\r\n\r\n if (val && !reqField) {\r\n reqFieldForm[index].role = reqField\r\n committeeInfo.forEach(\r\n (item: { director: defineDirectorTypes.OptType; role: defineDirectorTypes.OptType }, idx: number) => {\r\n if (!item.director) reqFieldForm[idx].director = !reqField\r\n },\r\n )\r\n }\r\n form.restart()\r\n }\r\n\r\n const conditionIRB2 = (value: defineDirectorTypes.OptType, index: number) => {\r\n const role = value ? { label: 'ผู้ทบทวนหลัก', value: '1' } : null\r\n\r\n committee.current = form.getState().values?.committeeInfo\r\n\r\n if (committee.current) {\r\n if (index < committee.current.length) {\r\n const formatedData = committee.current.map((itm: any, idx: number) => {\r\n if (idx === index) {\r\n return {\r\n director: value,\r\n role: role,\r\n }\r\n } else {\r\n return { ...itm }\r\n }\r\n })\r\n //@ts-ignore\r\n committee.current = formatedData\r\n } else {\r\n //*เข้า else ก็ต่อเมื่อมีการเพิ่มกรรมการคนที่ 2 ขึ้นไป */\r\n const newData = { director: value, role: role }\r\n committee.current.push(newData)\r\n }\r\n\r\n form.change('committeeInfo', committee.current)\r\n } else {\r\n committee.current = [{ director: value, role: role }]\r\n form.change('committeeInfo', committee.current)\r\n }\r\n }\r\n\r\n const handleSubmitOfficerEdit = (fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, form.getState())\r\n return new Promise((resolve, reject) => {\r\n const param = createParamCommitteeUpdate()\r\n if (isError) {\r\n reject('')\r\n } else {\r\n loadingHook.loadingOpen()\r\n\r\n processUpdate(param)\r\n .then(() => {\r\n folderAndTabHook.reloadProjectData()\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n .finally(() => {\r\n loadingHook.loadingClose()\r\n })\r\n }\r\n })\r\n }\r\n\r\n const createParamCommitteeUpdate = () => {\r\n const formValue = form.getState().values\r\n let param = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData?.projectID,\r\n submittedID: projectData?.submittedID,\r\n committeeInfo: formValue?.committeeInfo?.map((item: any) => {\r\n return {\r\n submittedID: projectData?.submittedID,\r\n committeeID: item.director.value,\r\n projectRoleID: item.role.value,\r\n }\r\n }),\r\n }\r\n return param\r\n }\r\n\r\n const processUpdate = async (param: any) => {\r\n await webServiceHook.updSubmittedCommittee(param)\r\n }\r\n\r\n const onClickEdit = () => {\r\n committee.current = form.getState().values?.committeeInfo\r\n }\r\n\r\n const listCommittee = committee.current?.reduce((accumulator: string[], item, index: number) => {\r\n accumulator.push(`committeeInfo[${index}].director`, `committeeInfo[${index}].role`)\r\n listTopicCommittee.push(`committeeInfo[${index}]`)\r\n return accumulator\r\n }, [])\r\n\r\n const handleCancle = () => {\r\n listTopicCommittee?.forEach((key, index) => {\r\n form.change(key, committee.current[index])\r\n })\r\n }\r\n return {\r\n isError,\r\n role,\r\n director,\r\n reqFieldForm,\r\n onClickRemove: handleClickRemove,\r\n onClickAdd: handleClickAdd,\r\n validateField,\r\n onChangValDirector: handleChangValDirector,\r\n onChangValRole: handleChangValRole,\r\n onOpenOpt: handleOpen,\r\n useModeAccordion: checkPermission.isAllowDefineDirector(projectData),\r\n handleSubmitOfficerEdit,\r\n onClickEdit,\r\n listCommittee,\r\n handleCancle,\r\n }\r\n}\r\n\r\nexport default useDefineDirector\r\n","import * as defineDirectorTypes from './defineDirectorTypes'\r\nimport useDefineDirector from './useDefineDirector'\r\nimport Autocomplete from '../../../../control/autocomplete/autocomplete'\r\nimport Button from '../../../../control/button/button'\r\nimport React from 'react'\r\nimport { Grid, useMediaQuery } from '@material-ui/core'\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport MyAccordion from '../../../../control/accordion/accordion'\r\nimport RemoveCircleIcon from '@material-ui/icons/RemoveCircle'\r\nimport AddCircleIcon from '@material-ui/icons/AddCircle'\r\nimport { IconButton } from '@material-ui/core'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport ModeAccordion from '../modeAccordion/ModeAccordion'\r\n\r\n//View\r\nconst DefineDirectorView = (props: defineDirectorTypes.DefineDirectorViewType) => {\r\n const {\r\n role,\r\n director,\r\n disabled = false,\r\n reqFieldForm,\r\n useModeAccordion,\r\n onClickAdd,\r\n onClickRemove,\r\n validateField,\r\n onChangValRole,\r\n onChangValDirector,\r\n onOpenOpt,\r\n handleSubmitOfficerEdit,\r\n onClickEdit,\r\n listCommittee,\r\n handleCancle,\r\n } = props\r\n\r\n const theme = useTheme()\r\n const translate = useTranslate()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('sm'))\r\n const classes = useStyles({ isMobileView })\r\n\r\n const renderBtnRemove = (fields: any, index: number) => {\r\n return (\r\n \r\n {isMobileView ? (\r\n {\r\n onClickRemove(fields, index)\r\n }}\r\n fullWidth\r\n style={{\r\n top: isMobileView ? '0px' : '4px',\r\n marginBottom: isMobileView ? '10%' : '20%',\r\n background: '#ff6565',\r\n color: '#ffffff',\r\n }}\r\n >\r\n \r\n \r\n ) : (\r\n {\r\n onClickRemove(fields, index)\r\n }}\r\n className={classes.btn}\r\n >\r\n \r\n \r\n )}\r\n \r\n )\r\n }\r\n\r\n const renderChild = (disabledValue: boolean) => {\r\n return (\r\n \r\n \r\n {({ fields }) => {\r\n const lengthFields = fields?.value?.length - 1\r\n\r\n return fields?.map((name, index) => (\r\n \r\n \r\n {\r\n onChangValDirector(val, index)\r\n }}\r\n onOpenOpt={() => {\r\n onOpenOpt(index)\r\n }}\r\n />\r\n \r\n \r\n {\r\n onChangValRole(val, index)\r\n }}\r\n />\r\n \r\n\r\n {lengthFields > 0 && !disabledValue && renderBtnRemove(fields, index)}\r\n {!disabledValue && index === lengthFields && (\r\n \r\n {\r\n onClickAdd(fields)\r\n }}\r\n className={classes.btnAdd}\r\n >\r\n \r\n \r\n {\r\n onClickAdd(fields)\r\n }}\r\n >\r\n {translate.get('LABEL.ADD_COMMITTEE')}\r\n \r\n \r\n )}\r\n \r\n ))\r\n }}\r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {useModeAccordion ? (\r\n renderChild(true)}\r\n renderEditComponent={() => renderChild(false)}\r\n isViewMode={true}\r\n onConfirm={() => handleSubmitOfficerEdit(listCommittee)}\r\n onClickEdit={onClickEdit}\r\n fieldNames={listCommittee}\r\n onCancel={handleCancle}\r\n />\r\n ) : (\r\n {renderChild(disabled)}\r\n )}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst DefineDirector = (props: defineDirectorTypes.DefineDirectorType) => {\r\n const defineDirectorModel = useDefineDirector(props)\r\n return \r\n}\r\n\r\nexport default DefineDirector\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n btnAdd: {\r\n textAlign: 'right',\r\n color: 'blue',\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n },\r\n btn: {\r\n '&:hover': {\r\n backgroundColor: '#ffffff',\r\n boxShadow: 'none',\r\n },\r\n marginTop: (props: any) => {\r\n let value = '0px'\r\n if (props.isMobileView) {\r\n value = '0px'\r\n } else {\r\n value = '20px'\r\n }\r\n return value\r\n },\r\n },\r\n grid: {\r\n marginBottom: '0px',\r\n },\r\n div: {\r\n marginTop: '13px',\r\n paddingRight: '10px',\r\n cursor: 'pointer',\r\n textDecoration: 'underline',\r\n },\r\n}))\r\n","enum committeeProjectRole {\r\n principalReviewer = 1, //ผู้ทบทวนหลัก\tPrincipal Reviewer\r\n committee = 2, //กรรมการ\tCommittee\r\n layperson = 3, //Layperson\tLayperson\r\n}\r\nexport default committeeProjectRole\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport * as defineTypeFormTypes from './defineProjectType'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport constConsiderType from '../../../../../constants/considerType'\r\nimport constCommitteeProjectRole from '../../../../../constants/committeeProjectRole'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\nconst useDefineProject = (props: defineTypeFormTypes.UseDefineTypeFormTypesType) => {\r\n const { projectData, onSaveComplete } = props\r\n\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const authenStore = useAuthenStore()\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const isEditDirector = React.useRef(false)\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n isEditDirector.current =\r\n !checkPermissionHook.isUserCommittee() &&\r\n projectData?.stepID > constSubmittedStep.specifyProjectType &&\r\n projectData?.stepID < constSubmittedStep.synthesis &&\r\n projectData?.committeeInfo.length > 0\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = () => {\r\n const committeeInfo = projectData?.committeeInfo?.map((item: any, index: number) => {\r\n return {\r\n director:\r\n item.fullUsername_th && item.userID\r\n ? { label: item.fullUsername_th, value: item.userID.toString() }\r\n : {},\r\n role:\r\n item.projectRoleInfo && item.projectRoleInfo.nameTH && item.projectRoleInfo.value\r\n ? { label: item.projectRoleInfo.nameTH, value: item.projectRoleInfo.value.toString() }\r\n : {},\r\n }\r\n })\r\n\r\n const initialData = {\r\n isNotAboutPeople: projectData?.isNotAboutPeople ?? false,\r\n projectType:\r\n projectData?.considerInfo && projectData?.considerInfo.value\r\n ? {\r\n label: projectData?.considerInfo.nameTH,\r\n value: projectData?.considerInfo.value.toString(),\r\n }\r\n : null,\r\n // announceDate: projectData?.announceDate,\r\n comment: projectData?.reviewerRemark ? projectData?.reviewerRemark : null,\r\n committeeInfo: committeeInfo && committeeInfo.length > 0 ? committeeInfo : [{ director: null, role: null }],\r\n reviewer: projectData?.reviewerUserID\r\n ? {\r\n label: `${projectData?.reviewerName_th}`,\r\n value: `${projectData?.reviewerUserID}`,\r\n }\r\n : null,\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n\r\n let param: REQServiceType.SpecifyProjectTypeRequestType = {\r\n loginUserID: null,\r\n projectID: null,\r\n submittedID: null,\r\n isNotAboutPeople: false,\r\n considerTypeID: null,\r\n reviewerRemark: null,\r\n committeeInfo: [],\r\n reviewerUserID: null,\r\n isDraft: null,\r\n }\r\n\r\n if (value?.isNotAboutPeople) {\r\n //ไม่เกี่ยวกับคน\r\n param = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData.projectID,\r\n submittedID: projectData.submittedID,\r\n isNotAboutPeople: value.isNotAboutPeople,\r\n considerTypeID: null,\r\n reviewerRemark: null,\r\n committeeInfo: [],\r\n reviewerUserID: null,\r\n isDraft: isDraft,\r\n }\r\n } else {\r\n const committeeInfo: Array = value?.committeeInfo?.map(\r\n (item: { director: defineTypeFormTypes.OptType; role: defineTypeFormTypes.OptType }) => {\r\n return {\r\n committeeID: item?.director?.value ? parseInt(item?.director.value) : null,\r\n projectRoleID: item?.role?.value ? parseInt(item?.role.value) : null,\r\n }\r\n },\r\n )\r\n\r\n let considerTypeID = null\r\n if (value?.projectType?.value) {\r\n considerTypeID = parseInt(value.projectType.value)\r\n }\r\n\r\n let reviewerUserID = authenStore.profile.userId\r\n if (checkPermissionHook.isUserAdmin()) {\r\n reviewerUserID = null\r\n if (value?.reviewer?.value) {\r\n reviewerUserID = parseInt(value.reviewer.value)\r\n }\r\n }\r\n param = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData.projectID,\r\n submittedID: projectData.submittedID,\r\n considerTypeID: considerTypeID,\r\n reviewerRemark: value?.comment ?? null,\r\n committeeInfo:\r\n committeeInfo && (committeeInfo[0]?.committeeID || committeeInfo[0]?.projectRoleID)\r\n ? committeeInfo\r\n : [],\r\n reviewerUserID: reviewerUserID,\r\n isDraft: isDraft,\r\n }\r\n }\r\n return param\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.SpecifyProjectTypeRequestType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n try {\r\n loadingHook.loadingOpen()\r\n\r\n let response\r\n if (isEditDirector.current) {\r\n const paramForSave = { ...param } as REQServiceType.UpdSubmittedCommitteeType\r\n response = await callWebService.updSubmittedCommittee(paramForSave)\r\n } else {\r\n const paramForSave = { ...param } as REQServiceType.SpecifyProjectTypeRequestType\r\n response = await callWebService.specifyProjectType(paramForSave)\r\n }\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (response && response.status) {\r\n if (onSaveComplete) onSaveComplete(response.status, param?.isDraft as boolean)\r\n }\r\n }\r\n } catch (ex) {\r\n console.log('useDefineProject.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleChangProjectType = (val: defineTypeFormTypes.OptType) => {\r\n if (parseInt(val?.value) === constConsiderType.exempt) {\r\n setRequired(false)\r\n } else {\r\n setRequired(true)\r\n }\r\n formRef.current?.form.restart()\r\n }\r\n\r\n const handleDirtyChange = (props: any) => {\r\n let isDirty: boolean = false\r\n let newFormValue = _.omit(props.values, ['submitType'])\r\n let initValue = _.omit(initialValues, ['submitType'])\r\n\r\n const isEqual = _.isEqual(initValue, newFormValue)\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft = true\r\n const param: REQServiceType.SpecifyProjectTypeRequestType = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleSubmitForm = (value: any) => {\r\n if (projectData?.projectID && projectData?.submittedID) {\r\n let isReviewer = value?.projectType?.value === constConsiderType.exempt.toString()\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param: REQServiceType.SpecifyProjectTypeRequestType = getSaveServiceParameter(isDraft)\r\n\r\n if (value?.committeeInfo[0]?.director) {\r\n //ถ้ามีการกำหนดกรรมการแล้ว\r\n isReviewer = value?.committeeInfo.find(\r\n (e: { director: defineTypeFormTypes.OptType; role: defineTypeFormTypes.OptType }) =>\r\n parseInt(e?.role?.value) === constCommitteeProjectRole.principalReviewer,\r\n )\r\n }\r\n\r\n if (isDraft) {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n } else {\r\n const isNotAboutPeople: boolean = value?.isNotAboutPeople ?? false\r\n if (isReviewer || isNotAboutPeople) {\r\n //เข้าเงื่อนไขนี้ก็ต่อเมื่อไม่ได้เลือกกรรมการที่มีหน้าที่เป็นผู้ทบทวนหลัก\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.COMMITTEE_REVIEWER_AT_LEAST_1_PERSON'),\r\n type: 'alert-message',\r\n })\r\n }\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n }\r\n\r\n return {\r\n formRef,\r\n configDialog,\r\n isViewMode: isViewMode,\r\n initialValues,\r\n required,\r\n isShowUpdateDate,\r\n isEditDirector: isEditDirector.current,\r\n onRefDialog,\r\n onChangProjectType: handleChangProjectType,\r\n onDirtyChange: handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n }\r\n}\r\n\r\nexport default useDefineProject\r\n","import DefineType from '../../../shareUI/defineType/defineType'\r\nimport DefineDirector from '../../../shareUI/defineDirector/defineDirector'\r\nimport * as defineTypeFormTypes from './defineProjectType'\r\nimport useDefineTypeForm from './useDefineProject'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport DesignateReviewer from '../../../shareUI/designateReviewer/designateReviewer'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\n\r\n//View\r\nconst DefineProjectView = (props: defineTypeFormTypes.DefineTypeFormTypesViewType) => {\r\n const {\r\n formRef,\r\n projectData,\r\n isViewMode,\r\n initialValues,\r\n required,\r\n configDialog,\r\n isShowUpdateDate,\r\n isEditDirector,\r\n onRefDialog,\r\n onChangProjectType,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const checkPermission = useCheckPermission()\r\n const irb = projectData?.irb\r\n const irbType = projectData?.irbType\r\n const isShowReviewer = checkPermission.isUserAdmin()\r\n\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n const isNotAboutPeople: boolean = formProps?.values?.isNotAboutPeople ?? false\r\n const isFlowNewProject: boolean =\r\n projectData?.submitTypeInfo?.value === constSubmittedType.firstSubmitConsideration\r\n\r\n return (\r\n <>\r\n \r\n \r\n {\r\n onChangProjectType(val)\r\n }}\r\n projectData={projectData}\r\n />\r\n \r\n \r\n \r\n \r\n\r\n {isShowReviewer && (\r\n \r\n \r\n \r\n )}\r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }\r\n }\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst DefineTypeForm = (props: defineTypeFormTypes.DefineTypeFormTypesType) => {\r\n const useDefineTypeModel = useDefineTypeForm(props)\r\n return \r\n}\r\nexport default DefineTypeForm\r\n","import DefineType from '../../../shareUI/defineType/defineType'\r\nimport DefineDirector from '../../../shareUI/defineDirector/defineDirector'\r\nimport * as defineTypeFormTypes from './defineProjectType'\r\nimport useDefineTypeForm from './useDefineProject'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\n\r\n//View\r\nconst DefineProjectView = (props: defineTypeFormTypes.DefineTypeFormTypesViewType) => {\r\n const {\r\n formRef,\r\n projectData,\r\n isViewMode,\r\n initialValues,\r\n required,\r\n configDialog,\r\n isShowUpdateDate,\r\n isEditDirector,\r\n onRefDialog,\r\n\r\n onChangProjectType,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n } = props\r\n\r\n const irb = projectData?.irb\r\n const irbType = projectData?.irbType\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n const isNotAboutPeople: boolean = formProps?.values?.isNotAboutPeople ?? false\r\n const isFlowNewProject: boolean =\r\n projectData?.submitTypeInfo?.value === constSubmittedType.firstSubmitConsideration\r\n return (\r\n <>\r\n \r\n \r\n {\r\n onChangProjectType(val)\r\n }}\r\n projectData={projectData}\r\n />\r\n \r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }\r\n }\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst DefineTypeForm = (props: defineTypeFormTypes.DefineTypeFormTypesType) => {\r\n const useDefineTypeModel = useDefineTypeForm(props)\r\n return \r\n}\r\nexport default DefineTypeForm\r\n","enum researcherType {\r\n student = 1, //นิสิต / นักศึกษา\tStudent\r\n lecturer = 2, //อาจารย์\tLecturer\r\n researcher = 3, //นักวิจัย\tResearcher\r\n}\r\nexport default researcherType\r\n","import { useEffect, useRef, useState } from 'react'\r\nimport path from 'path'\r\nimport _, { isNull } from 'lodash'\r\nimport moment from 'moment'\r\n\r\nimport {\r\n cerTopic,\r\n fileExt as fileExtConst,\r\n topicForLecturer,\r\n topicForStudent,\r\n} from '../../../../../constants/constants'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { convertDateToDateString, dateForAPI } from '../../../../../utilities/date'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\n\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\n\r\nimport useAppAlertMessageAction from '../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport { DocumentInfo, GetCertificateByIDResultType } from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport { UploadFileObjCerType } from './generateCertificateType'\r\nimport { ResultDocumentTopicLut } from '../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { GenerateCertificateREC1Type } from './generateCertificateREC1'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\nimport constResearcherType from '../../../../../constants/researcherType'\r\n\r\nimport { TabSelectedType } from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { validateModeAccordionError } from '../../../../../utilities/validate'\r\ntype CerDialogType = Pick\r\nconst useGenerateCertificate = (props: GenerateCertificateREC1Type) => {\r\n const { callbackSaveComplete } = props\r\n const translate = useTranslate()\r\n const manageProjectStore = useManageProjectStore()\r\n\r\n const { projectData } = manageProjectStore\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n\r\n const callWebService = useWebService()\r\n const callLookup = useLookupService()\r\n const loadingHook = useLoading()\r\n const checkPermissionHook = checkPermission()\r\n\r\n const [configDialog, setConfigDialog] = useState()\r\n const dialogRef = useRef>()\r\n\r\n const [initialUploadCerDoc, setInitialUploadCerDoc] = useState()\r\n const [initialUploadFileCer, setInitialUploadFileCer] = useState()\r\n const [initialValues, setInitialValues] = useState({})\r\n const [initialValuesOtherLanguage, setInitialValuesOtherLanguage] = useState({})\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n\r\n const [disabledFieldNames, setdisabledFieldNames] = useState | 'all'>('all')\r\n const [certificateData, setCertificateData] = useState()\r\n const [documentTopicData, setDocumentTopicData] = useState()\r\n const [isUpdateSuccess, setIsUpdateSuccess] = useState(false)\r\n const [isAddOtherLanguage, setIsAddOtherLanguage] = useState(false)\r\n const formRef = useRef()\r\n const valueRef = useRef<{ [key: string]: any }>({})\r\n const history = useHistory()\r\n\r\n useEffect(() => {\r\n const initail = async () => {\r\n await createInitialData()\r\n }\r\n if (projectData) {\r\n if (projectData.stepID === constSubmittedStep.certification) {\r\n //draft editmode\r\n setdisabledFieldNames(['coaNo', 'dateCertificateExpire'])\r\n } else {\r\n //view mode\r\n setdisabledFieldNames('all')\r\n appFolderAndTabAction.setTabDirty(false)\r\n }\r\n initail()\r\n }\r\n }, [])\r\n\r\n const createInitialData = async () => {\r\n if (projectData) {\r\n const submittedID = projectData.submittedID\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getCertificateByID(submittedID)\r\n const docTopicData = await getCarDoc()\r\n loadingHook.loadingClose()\r\n let initialData = {}\r\n let initialDataOtherLanguage = {}\r\n if (result) {\r\n const filterDocCertificate = result.documentInfo.filter((itm) => {\r\n return itm.fileInfo.length > 0\r\n })\r\n let docCertificateTH = '-'\r\n let docCertificateEN = '-'\r\n filterDocCertificate.forEach((item, index) => {\r\n let objDocCer = docTopicData?.find((e: { id: number }) => e.id === item.topicID)\r\n docCertificateTH =\r\n docCertificateTH === '-'\r\n ? `${index + 1}. ${objDocCer?.name_th}`\r\n : `${docCertificateTH}\\n${index + 1}. ${objDocCer?.name_th.trim()}`\r\n docCertificateEN =\r\n docCertificateEN === '-'\r\n ? `${index + 1}. ${objDocCer?.name_en}`\r\n : `${docCertificateEN}\\n${index + 1}. ${objDocCer?.name_en.trim()}`\r\n })\r\n // const isExempt = projectData?.considerInfo?.value === constConsiderType.exempt\r\n // let detailTH\r\n // let detailEN\r\n // let conditionTH\r\n // let conditionEN\r\n\r\n // if (projectData.irb === 1) {\r\n // if (isExempt) {\r\n // //รายละเอียด\r\n // detailTH = configCertificate.descriptionIRB1Exempt.nameTH\r\n // detailEN = configCertificate.descriptionIRB1Exempt.nameEN\r\n // //เงื่อนไข\r\n // conditionTH = configCertificate.conditionIRB1Exempt.nameTH\r\n // conditionEN = configCertificate.conditionIRB1Exempt.nameEN\r\n // } else {\r\n // detailTH = configCertificate.descriptionIRB1.nameTH\r\n // detailEN = configCertificate.descriptionIRB1.nameEN\r\n // //เงื่อนไข\r\n // conditionTH = configCertificate.conditionIRB1.nameTH\r\n // conditionEN = configCertificate.conditionIRB1.nameEN\r\n // }\r\n // } else {\r\n // detailTH = configCertificate.descriptionIRB2.nameTH\r\n // detailEN = configCertificate.descriptionIRB2.nameEN\r\n // //เงื่อนไข\r\n // conditionTH = configCertificate.conditionIRB2.nameTH\r\n // conditionEN = configCertificate.conditionIRB2.nameEN\r\n // }\r\n initialData = {\r\n dateReqCertificate: result.exportDate ? new Date(result.exportDate) : new Date(),\r\n dateCertificateExpire: result.expireDate\r\n ? new Date(result.expireDate)\r\n : moment(new Date()).subtract(1, 'day').add(1, 'year').format('YYYY-MM-DD'),\r\n coaNo: result.coaNo,\r\n certificateId: result.certificateId,\r\n }\r\n\r\n if (projectData?.isLanguageEN) {\r\n initialData = {\r\n ...initialData,\r\n projectNameEN: result.projectName_en ? result.projectName_en : projectData.projectName_en,\r\n nameEN: result.researcherName_en ? result.researcherName_en : null,\r\n docCertificateEN: result.docsCertified_en ? result.docsCertified_en : docCertificateEN,\r\n conditionEN: result.condition_en ? result.condition_en.trim() : null,\r\n detailEN: result.description_en ? result.description_en.trim() : null,\r\n }\r\n } else {\r\n initialDataOtherLanguage = {\r\n ...initialDataOtherLanguage,\r\n projectNameEN: result.projectName_en ? result.projectName_en : projectData.projectName_en,\r\n nameEN: result.researcherName_en ? result.researcherName_en : null,\r\n docCertificateEN: result.docsCertified_en ? result.docsCertified_en : docCertificateEN,\r\n conditionEN: result.condition_en ? result.condition_en.trim() : null,\r\n detailEN: result.description_en ? result.description_en.trim() : null,\r\n }\r\n }\r\n if (projectData?.isLanguageTH) {\r\n initialData = {\r\n ...initialData,\r\n projectNameTH: result.projectName_th ? result.projectName_th : projectData.projectName_th,\r\n nameTH: result.researcherName_th ? result.researcherName_th : null,\r\n docCertificateTH: result.docsCertified_th ? result.docsCertified_th : docCertificateTH,\r\n conditionTH: result.condition_th ? result.condition_th.trim() : null,\r\n detailTH: result.description_th ? result.description_th.trim() : null,\r\n }\r\n } else {\r\n initialDataOtherLanguage = {\r\n ...initialDataOtherLanguage,\r\n projectNameTH: result.projectName_th ? result.projectName_th : projectData.projectName_th,\r\n nameTH: result.researcherName_th ? result.researcherName_th : null,\r\n docCertificateTH: result.docsCertified_th ? result.docsCertified_th : docCertificateTH,\r\n conditionTH: result.condition_th ? result.condition_th.trim() : null,\r\n detailTH: result.description_th ? result.description_th.trim() : null,\r\n }\r\n }\r\n }\r\n\r\n setInitialValues(initialData)\r\n setInitialValuesOtherLanguage(initialDataOtherLanguage)\r\n setCertificateData(result)\r\n createInitialUploadFileCer(result?.certificateInfo)\r\n createInitialUploadFileCerDoc(result?.documentInfo)\r\n }\r\n }\r\n\r\n const reloadCertificate = async () => {\r\n if (projectData?.submittedID) {\r\n const { result } = await callWebService.getCertificateByID(projectData.submittedID)\r\n if (result) {\r\n setCertificateData(result)\r\n createInitialUploadFileCer(result?.certificateInfo)\r\n createInitialUploadFileCerDoc(result?.documentInfo)\r\n }\r\n }\r\n }\r\n\r\n const getCarDoc = async () => {\r\n if (projectData) {\r\n const lutTop = await callLookup.callDocumentTopicLut(projectData.irb, projectData?.submitTypeInfo.value)\r\n const docTopic = filterDocTopic(lutTop.result, projectData?.researcherTypeInfo.value)\r\n\r\n setDocumentTopicData(docTopic)\r\n\r\n return docTopic\r\n }\r\n }\r\n\r\n const filterDocTopic = (documentInfo: ResultDocumentTopicLut[], researcherTypeID: number) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n if (documentInfo) {\r\n let isDocTopic = documentInfo\r\n if (researcherTypeID === constResearcherType.student) {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = documentInfo?.filter((item: any) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item: any) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n }\r\n }\r\n return docTopic\r\n }\r\n\r\n const createInitialUploadFileCerDoc = async (documentInfo: any) => {\r\n let docTopic: DocumentInfo[] = []\r\n const researcherTypeID = projectData?.researcherTypeInfo.value\r\n\r\n if (documentInfo) {\r\n let isDocTopic = documentInfo\r\n if (researcherTypeID === constResearcherType.student) {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = documentInfo?.filter((item: any) => {\r\n return item.topicID !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item: any) => {\r\n return item.topicID !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n let uploadFileinitCerDoc = await docTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: itm.fileInfo,\r\n subTopicPageList: itm.subtopic,\r\n documentTopicID: itm.topicID,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n })\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileinitCerDoc?.length > 0) {\r\n uploadFileinitCerDoc = uploadFileinitCerDoc.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadCerDoc(uploadFileinitCerDoc)\r\n }\r\n // //เอกสารที่ประทับตรารับรองแล้ว\r\n }\r\n\r\n const createInitialUploadFileCer = (cerInfo: any) => {\r\n const uploadFileCerinit: Array = cerTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileCerinit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (cerInfo?.cer_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: cerInfo?.certificateFileName_th,\r\n filename: cerInfo?.certificateFileName_th,\r\n fileID: cerInfo?.certificateFileName_th,\r\n path: cerInfo?.cer_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (cerInfo?.cer_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: cerInfo?.certificateFileName_en,\r\n filename: cerInfo?.certificateFileName_en,\r\n fileID: cerInfo?.certificateFileName_en,\r\n path: cerInfo?.cer_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n setInitialUploadFileCer(uploadFileCerinit)\r\n }\r\n\r\n const getCerTopic = () => {\r\n let myCerTopic = cerTopic\r\n if (!certificateData?.certificateInfo?.cerSign_en) {\r\n myCerTopic = cerTopic.filter((itm) => itm.id !== 1)\r\n }\r\n if (!certificateData?.certificateInfo?.cerSign_th) {\r\n myCerTopic = cerTopic.filter((itm) => itm.id !== 0)\r\n }\r\n return myCerTopic\r\n }\r\n\r\n const getTopicDoc = () => {\r\n return documentTopicData?.map((item: any) => {\r\n return { ...item, subtopic: [] }\r\n })\r\n }\r\n\r\n const handleDirtyChange = (props: { dirty: boolean; values: any }) => {\r\n let isDirty: boolean = false\r\n //** จัดformat initValue และ Form Value เพื่อเตรียมตัวนำไปใช้เปรียบเทียบค่า **//\r\n let newFormValue = _.omit(\r\n {\r\n ...props.values,\r\n dateReqCertificate: props.values.dateReqCertificate\r\n ? convertDateToDateString(props.values.dateReqCertificate)\r\n : null,\r\n },\r\n ['uploadFile', 'uploadFileCerDoc', 'dateCertificateExpire'],\r\n )\r\n let initValue = _.omit(\r\n {\r\n ...initialValues,\r\n dateReqCertificate: initialValues.dateReqCertificate\r\n ? convertDateToDateString(initialValues.dateReqCertificate)\r\n : null,\r\n },\r\n ['uploadFile', 'uploadFileCerDoc', 'dateCertificateExpire'],\r\n )\r\n //**********************************************************//\r\n const initialKeys = Object.keys(initValue)\r\n const newValueKeys = Object.keys(newFormValue)\r\n const omitKeys = newValueKeys.filter((value) => !initialKeys.includes(value))\r\n const isEqual = _.isEqual(initValue, _.omit(newFormValue, omitKeys)) //ข้อมูลเท่ากัน\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft = true\r\n const param: REQServiceType.CertificateType = getSaveServiceParameter(isDraft)\r\n processSaveData(param, tabIndex, newTabSelected)\r\n }\r\n const processSaveData = async (\r\n param: REQServiceType.CertificateType,\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isReloadCertificate = false,\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.certificate(param)\r\n\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n if (tabIndex && newTabSelected) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n } else {\r\n //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n if (callbackSaveComplete) {\r\n if (response && response.status) {\r\n callbackSaveComplete(response.status, param.isDraft as boolean)\r\n isReloadCertificate && (await reloadCertificate())\r\n }\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleDateReqCertificateChange = (date: string) => {\r\n if (date && typeof date === 'string' && date.trim() != '') {\r\n const certificateExpireDate = moment(date).add(1, 'year').subtract(1, 'days')\r\n if (formRef.current) {\r\n const form = formRef.current?.form\r\n form.change?.('dateCertificateExpire', certificateExpireDate)\r\n }\r\n }\r\n }\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n\r\n const handleClickFileStamp = (filePath: string, fileName: string) => {\r\n const fileExt = path.extname(`${fileName}`)\r\n if (fileExt !== fileExtConst.pdf) {\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n message: translate.get('ALERT.CONTENT.CAN_OPEN_ONLY_PDF'),\r\n })\r\n } else {\r\n handleClickOpenFile(filePath)\r\n }\r\n }\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const val = formRef.current?.values\r\n const submittedID = projectData ? projectData.submittedID ?? isNull : null\r\n\r\n const certificateServiceParam: REQServiceType.CertificateType = {\r\n certificateId: val && val.certificateId ? val.certificateId : null,\r\n submittedId: submittedID,\r\n coaNo: val && val.coaNo ? parseInt(val.coaNo) : null,\r\n projectName_th: val && val.projectNameTH ? val.projectNameTH : null,\r\n projectName_en: val && val.projectNameEN ? val.projectNameEN : null,\r\n researcherName_th: val && val.nameTH ? val.nameTH : null,\r\n researcherName_en: val && val.nameEN ? val.nameEN : null,\r\n description_th: val && val.detailTH ? val.detailTH : null,\r\n description_en: val && val.detailEN ? val.detailEN : null,\r\n docsCertified_th: val && val.docCertificateTH ? val.docCertificateTH : null,\r\n docsCertified_en: val && val.docCertificateEN ? val.docCertificateEN : null,\r\n condition_th: val && val.conditionTH ? val.conditionTH : null,\r\n condition_en: val && val.conditionEN ? val.conditionEN : null,\r\n exportDate: val?.dateReqCertificate ? dateForAPI(val?.dateReqCertificate) ?? null : null,\r\n expireDate: val?.dateCertificateExpire ? dateForAPI(val?.dateCertificateExpire) ?? null : null,\r\n isDraft: isDraft,\r\n }\r\n return certificateServiceParam\r\n }\r\n const handleSubmitForm = async (val: any) => {\r\n if (projectData?.projectID && projectData?.submittedID) {\r\n const isDraft: boolean = val?.saveType !== 'SAVE'\r\n const certificateServiceParam = getSaveServiceParameter(isDraft)\r\n\r\n if (val.saveType === 'SAVE') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(certificateServiceParam)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(certificateServiceParam, null, null, true)\r\n }\r\n if (isAddOtherLanguage) {\r\n const projectID = projectData?.projectID\r\n const submittedID = projectData?.submittedID\r\n const isLanguageTh = true\r\n const isLanguageEn = true\r\n await callWebService.updateLanguage({\r\n projectID,\r\n submittedID,\r\n isLanguageEn,\r\n isLanguageTh,\r\n })\r\n }\r\n }\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const handleBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const updateCertificateData = async (params: REQServiceType.CertificateDataType) => {\r\n loadingHook.loadingOpen()\r\n dialogRef.current?.closeDialog()\r\n setIsAddOtherLanguage(false)\r\n const res = await callWebService.updateCertificataData(params)\r\n\r\n if (res.result.status === 200) {\r\n if (\r\n !(params.projectNameTH && projectData?.isLanguageTH) &&\r\n !(params.projectNameEN && projectData?.isLanguageEN)\r\n ) {\r\n const projectID = Number(projectData?.projectID)\r\n const submittedID = Number(projectData?.submittedID)\r\n const isLanguageTh = true\r\n const isLanguageEn = true\r\n const result = await callWebService.updateLanguage({\r\n projectID,\r\n submittedID,\r\n isLanguageEn,\r\n isLanguageTh,\r\n })\r\n reloadCertificate()\r\n tabAndFolderHook.reloadProjectData()\r\n setIsUpdateSuccess(result.status === 1)\r\n }\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n setConfigDialog({})\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleSubmitUpdateData = async (\r\n val: any,\r\n formProps: FormRenderProps,\r\n language: string,\r\n fieldNames: string[],\r\n ) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise(async (resolve, reject) => {\r\n if (isError) {\r\n formProps.form.submit()\r\n reject('')\r\n } else {\r\n resolve('')\r\n dialogRef.current?.openDialog()\r\n if (projectData?.projectID && projectData?.submittedID) {\r\n const certificateDataServiceTH: REQServiceType.CertificateDataType | any = {\r\n submittedID: projectData?.submittedID,\r\n projectNameTH: val && val.projectNameTH ? val.projectNameTH : null,\r\n researcherNameTH: val && val.nameTH ? val.nameTH : null,\r\n descriptionTH: val && val.detailTH ? val.detailTH : null,\r\n docCertificateTH: val && val.docCertificateTH ? val.docCertificateTH : null,\r\n conditionTH: val && val.conditionTH ? val.conditionTH : null,\r\n }\r\n\r\n const certificateDataServiceEN: REQServiceType.CertificateDataType | any = {\r\n submittedID: projectData?.submittedID,\r\n projectNameEN: val && val.projectNameEN ? val.projectNameEN : null,\r\n researcherNameEN: val && val.nameEN ? val.nameEN : null,\r\n descriptionEN: val && val.detailEN ? val.detailEN : null,\r\n docCertificateEN: val && val.docCertificateEN ? val.docCertificateEN : null,\r\n conditionEN: val && val.conditionEN ? val.conditionEN : null,\r\n }\r\n if (language === 'TH') {\r\n updateCertificateData(certificateDataServiceTH)\r\n } else {\r\n updateCertificateData(certificateDataServiceEN)\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n const handleClickOtherLangauge = () => {\r\n setIsAddOtherLanguage(true)\r\n }\r\n const handleCancelAddOtherLangauge = () => {\r\n setIsAddOtherLanguage(false)\r\n }\r\n return {\r\n formRef,\r\n valueRef,\r\n isViewMode,\r\n projectData,\r\n configDialog,\r\n initialValues,\r\n initialValuesOtherLanguage,\r\n isShowUpdateDate,\r\n disabledFieldNames,\r\n initialUploadCerDoc,\r\n initialUploadFileCer,\r\n certificateTopicList: getCerTopic(),\r\n formatDocumentTopic: getTopicDoc(),\r\n onRefDialog,\r\n handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n onClickOpenFile: handleClickOpenFile,\r\n onClickFileStamp: handleClickFileStamp,\r\n onDateReqCertificateChange: handleDateReqCertificateChange,\r\n handleBackToSearch,\r\n handleSubmitUpdateData,\r\n isUpdateSuccess,\r\n certificateFieldNamesTH: ['projectNameTH', 'nameTH', 'detailTH', 'docCertificateTH', 'conditionTH'],\r\n certificateFieldNamesEN: ['projectNameEN', 'nameEN', 'detailEN', 'docCertificateEN', 'conditionEN'],\r\n isAddOtherLanguage,\r\n handleCancelAddOtherLangauge,\r\n handleClickOtherLangauge,\r\n }\r\n}\r\nexport default useGenerateCertificate\r\n","import React from 'react'\r\nimport { useForm } from 'react-final-form'\r\n\r\nimport * as headCertificateTypes from './headCertificateTypes'\r\n\r\nconst useCertificate = (props: headCertificateTypes.UseCertificateType) => {\r\n const form = useForm()\r\n const [textRemaining, setTextRemaining] = React.useState<{ TH: number; EN: number }>({ TH: 500, EN: 500 })\r\n\r\n React.useEffect(() => {\r\n const formVal = form.getState().values\r\n const textRemainingTH = 500 - (formVal?.projectNameTH?.length ?? 0)\r\n const textRemainingEN = 500 - (formVal?.projectNameEN?.length ?? 0)\r\n setTextRemaining({ TH: textRemainingTH, EN: textRemainingEN })\r\n }, [form.getState().values.projectNameTH ?? null, form.getState().values.projectNameEN ?? null])\r\n\r\n const handleChangTextField = (val: string, language: string) => {\r\n let objText = textRemaining\r\n if (language === 'TH') {\r\n objText = { TH: 500 - val.length, EN: textRemaining.EN }\r\n } else {\r\n objText = { TH: textRemaining.TH, EN: 500 - val.length }\r\n setTextRemaining({ TH: 500 - val.length, EN: textRemaining.EN })\r\n }\r\n }\r\n\r\n return {\r\n onChangTextField: handleChangTextField,\r\n textRemaining,\r\n }\r\n}\r\n\r\nexport default useCertificate\r\n","import * as certificateTypes from './headCertificateTypes'\r\nimport useHeadCertificate from './useHeadCertificate'\r\nimport MyTextfield from '../../../../control/textfield/textfield'\r\nimport { textRequired, validateEN } from '../../../../utilities/validate'\r\nimport React from 'react'\r\nimport { Grid } from '@material-ui/core'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\n\r\n//View\r\nconst CertificateView = (props: certificateTypes.CertificateViewType) => {\r\n const { disabled = false, language, onChangTextField, textRemaining } = props\r\n const translate = useTranslate()\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n onChangTextField(val, language)\r\n }}\r\n maxLength={500}\r\n />\r\n \r\n {!disabled && (\r\n \r\n \r\n {translate.get('LABEL.NUMBER_OF_CHARACTERS')} :{' '}\r\n {language === 'TH' ? textRemaining?.TH : textRemaining?.EN}\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst Certificate = (props: certificateTypes.CertificateType) => {\r\n const certificateModel = useHeadCertificate(props)\r\n return \r\n}\r\n\r\nexport default Certificate\r\n","import React from 'react'\r\nimport { Grid, styled } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport useGenerateCertificate from './useGenerateCertificate'\r\n\r\n// import * as issueCertificateTypes from './issueCertificateTypes'\r\n// import useIssueCertificate from './useIssueCertificate'\r\n\r\nimport HeadCertificate from '../../../shareUI/headCertificate/headCertificate'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport MyTextfield from '../../../../../control/textfield/textfield'\r\nimport DatePicker from '../../../../../control/datepicker/datepicker'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport PageAction from '../pageAction'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { getDisable } from '../../../shareLogic/useFunctionHook'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport MyButton from '../../../../../control/button/button'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\n//ออกใบรับรอง\r\n//View\r\nexport type GenerateCertificateREC1ViewType = { disabledFieldNames?: Array | 'all' } & ReturnType<\r\n typeof useGenerateCertificate\r\n>\r\nconst AddBtn = styled(MyButton)({\r\n color: 'white',\r\n marginLeft: '20px',\r\n})\r\n\r\nconst GenerateCertificateREC1View: React.FC = (props) => {\r\n const {\r\n formRef,\r\n valueRef,\r\n isViewMode,\r\n projectData,\r\n configDialog,\r\n initialValues,\r\n initialValuesOtherLanguage,\r\n isShowUpdateDate,\r\n disabledFieldNames,\r\n initialUploadCerDoc,\r\n formatDocumentTopic,\r\n certificateTopicList,\r\n initialUploadFileCer,\r\n certificateFieldNamesTH,\r\n certificateFieldNamesEN,\r\n onRefDialog,\r\n onSubmitForm,\r\n onClickOpenFile,\r\n onClickFileStamp,\r\n handleDirtyChange,\r\n handleBackToSearch,\r\n onDateReqCertificateChange,\r\n handleSubmitUpdateData,\r\n isUpdateSuccess,\r\n isAddOtherLanguage,\r\n handleCancelAddOtherLangauge,\r\n handleClickOtherLangauge,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const currentSelectTab = appFolderAndTabStore.tabSelected.stepID === projectData?.stepID\r\n const latestFolderIdx = 0 // folder ล่าสุด\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n const { invalid, errors, values } = props\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {(projectData?.isLanguageTH || isAddOtherLanguage) && (\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n fieldNames={certificateFieldNamesTH}\r\n isAddOtherLanguage={projectData?.isLanguageTH}\r\n onConfirm={\r\n currentSelectTab && projectData?.isLanguageTH\r\n ? () => {}\r\n : () =>\r\n handleSubmitUpdateData(\r\n values,\r\n props,\r\n 'TH',\r\n certificateFieldNamesTH,\r\n )\r\n }\r\n isViewMode={currentSelectFolder && !currentSelectTab}\r\n onClickEdit={() => {\r\n valueRef.current = props.form.getState().values\r\n }}\r\n />\r\n \r\n )}\r\n\r\n {(projectData?.isLanguageEN || isAddOtherLanguage) && (\r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n fieldNames={certificateFieldNamesEN}\r\n isAddOtherLanguage={projectData?.isLanguageEN}\r\n onConfirm={\r\n currentSelectTab && projectData?.isLanguageEN\r\n ? () => {}\r\n : () =>\r\n handleSubmitUpdateData(\r\n values,\r\n props,\r\n 'EN',\r\n certificateFieldNamesEN,\r\n )\r\n }\r\n isViewMode={currentSelectFolder && !currentSelectTab}\r\n onClickEdit={() => {\r\n valueRef.current = props.form.getState().values\r\n }}\r\n />\r\n \r\n )}\r\n\r\n {!(projectData?.isLanguageEN && projectData?.isLanguageTH) && !isUpdateSuccess && (\r\n \r\n \r\n {isAddOtherLanguage\r\n ? translate.get('BUTTON.CANCEL')\r\n : translate.get('BUTTON.ADD_BEFORE_CERTIFICATE_DATA') +\r\n `${\r\n projectData?.isLanguageTH\r\n ? translate.get('LABEL.ENG')\r\n : translate.get('LABEL.THAI')\r\n }`}\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {isShowUpdateDate && }\r\n {!isViewMode && (\r\n \r\n {\r\n props.form.change('saveType', 'DRAFT')\r\n props.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickClose={handleBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type GenerateCertificateREC1Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst GenerateCertificateREC1: React.FC = (props) => {\r\n const generateCertificate = useGenerateCertificate(props)\r\n return \r\n}\r\n\r\nexport default GenerateCertificateREC1\r\n","import React from 'react'\r\nimport { Grid, styled } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport useGenerateCertificate from './useGenerateCertificate'\r\n\r\nimport HeadCertificate from '../../../shareUI/headCertificate/headCertificate'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport MyTextfield from '../../../../../control/textfield/textfield'\r\nimport DatePicker from '../../../../../control/datepicker/datepicker'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport PageAction from '../pageAction'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { getDisable } from '../../../shareLogic/useFunctionHook'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport MyButton from '../../../../../control/button/button'\r\n\r\n//ออกใบรับรอง\r\n//View\r\nexport type GenerateCertificateREC2ViewType = { disabledFieldNames?: Array | 'all' } & ReturnType<\r\n typeof useGenerateCertificate\r\n>\r\nconst AddBtn = styled(MyButton)({\r\n color: 'white',\r\n marginLeft: '20px',\r\n})\r\n\r\nconst GenerateCertificateREC2View: React.FC = (props) => {\r\n const {\r\n formRef,\r\n valueRef,\r\n isViewMode,\r\n projectData,\r\n configDialog,\r\n initialValues,\r\n initialValuesOtherLanguage,\r\n isShowUpdateDate,\r\n disabledFieldNames,\r\n initialUploadCerDoc,\r\n formatDocumentTopic,\r\n certificateTopicList,\r\n initialUploadFileCer,\r\n certificateFieldNamesTH,\r\n certificateFieldNamesEN,\r\n onRefDialog,\r\n onSubmitForm,\r\n onClickOpenFile,\r\n onClickFileStamp,\r\n handleDirtyChange,\r\n onDateReqCertificateChange,\r\n handleBackToSearch,\r\n handleSubmitUpdateData,\r\n isUpdateSuccess,\r\n isAddOtherLanguage,\r\n handleCancelAddOtherLangauge,\r\n handleClickOtherLangauge,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const currentSelectTab = appFolderAndTabStore.tabSelected.stepID === projectData?.stepID\r\n const latestFolderIdx = 0 // folder ล่าสุด\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n const { invalid, errors, values } = props\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {(projectData?.isLanguageTH || isAddOtherLanguage) && (\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n fieldNames={certificateFieldNamesTH}\r\n isAddOtherLanguage={projectData?.isLanguageTH}\r\n onConfirm={\r\n currentSelectTab\r\n ? () => {}\r\n : () =>\r\n handleSubmitUpdateData(\r\n values,\r\n props,\r\n 'TH',\r\n certificateFieldNamesTH,\r\n )\r\n }\r\n isViewMode={currentSelectFolder && !currentSelectTab}\r\n onClickEdit={() => {\r\n valueRef.current = props.form.getState().values\r\n }}\r\n />\r\n \r\n )}\r\n\r\n {(projectData?.isLanguageEN || isAddOtherLanguage) && (\r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n fieldNames={certificateFieldNamesEN}\r\n isAddOtherLanguage={projectData?.isLanguageEN}\r\n onConfirm={\r\n currentSelectTab\r\n ? () => {}\r\n : () =>\r\n handleSubmitUpdateData(\r\n values,\r\n props,\r\n 'EN',\r\n certificateFieldNamesEN,\r\n )\r\n }\r\n isViewMode={currentSelectFolder && !currentSelectTab}\r\n onClickEdit={() => {\r\n valueRef.current = props.form.getState().values\r\n }}\r\n />\r\n \r\n )}\r\n\r\n {!(projectData?.isLanguageEN && projectData?.isLanguageTH) && !isUpdateSuccess && (\r\n \r\n \r\n {isAddOtherLanguage\r\n ? translate.get('BUTTON.CANCEL')\r\n : translate.get('BUTTON.ADD_BEFORE_CERTIFICATE_DATA') +\r\n `${\r\n projectData?.isLanguageTH\r\n ? translate.get('LABEL.ENG')\r\n : translate.get('LABEL.THAI')\r\n }`}\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n props.form.change('saveType', 'DRAFT')\r\n props.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickClose={handleBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type GenerateCertificateREC2Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst GenerateCertificateREC2: React.FC = (props) => {\r\n const generateCertificate = useGenerateCertificate(props)\r\n return \r\n}\r\n\r\nexport default GenerateCertificateREC2\r\n","import React, { useMemo } from 'react'\r\nimport { ValueFormType, UseDefineSubmittedDate } from './defineSubmittedDateType'\r\nimport { SpecifyReceiveDocumentDateRequestType } from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport moment from 'moment'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport { convertDateToDateString, dateForAPI } from '../../../../../utilities/date'\r\nimport _ from 'lodash'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport { useHistory } from 'react-router-dom'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport { TabSelectedType } from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport constConsiderType from '../../../../../constants/considerType'\r\nimport { FormApi, ValidationErrors } from 'final-form'\r\nconst useSpecifyDateForm = (props: UseDefineSubmittedDate) => {\r\n const { callbackSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const checkPermissionHook = checkPermission()\r\n const { projectData } = useManageProjectStore()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const [minMaxDate, setMinMaxDate] = React.useState<\r\n { min: string | undefined; max: string | undefined } | undefined\r\n >()\r\n const [displayField, setDisplayField] = React.useState<{ docDate: boolean; commentaryDate: boolean } | undefined>()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const callWebService = useWebService()\r\n const loadingHook = useLoading()\r\n const profileStore = authenStore()\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const commentaryDateRef = React.useRef('')\r\n const advisorDateRef = React.useRef('')\r\n const paramsRef = React.useRef()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const isSubmittedReceiveDate = useMemo(() => {\r\n return projectData?.isSubmittedReceiveDate ?? false\r\n }, [projectData])\r\n\r\n React.useEffect(() => {\r\n /* considerInfo \r\n id:1 => Full Board +10 day //irb1 45\r\n id:2 => Expedited + 10 day //irb1 45\r\n id:3 => Exempt + 7 day //irb1 20\r\n */\r\n if (projectData) {\r\n const isDisplayField = {\r\n docDate: projectData?.isRequestDocument,\r\n commentaryDate: projectData?.committeeInfo.length > 0,\r\n }\r\n setDisplayField(isDisplayField)\r\n }\r\n //irbType ใช้สำหรับเลือก Flow ต้นแบบว่าจะเป็นแบบ 1 หรือ 2\r\n if (projectData?.irbType === 1) {\r\n createInitialDataREC1()\r\n } else if (projectData?.irbType === 2) {\r\n createInitialDataREC2()\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n /**\r\n *\r\n * REC1\r\n */\r\n const createInitialDataREC1 = () => {\r\n if (projectData) {\r\n const isRequestDocument = projectData?.isRequestDocument\r\n const isExempt = projectData?.considerInfo?.value === constConsiderType.exempt\r\n const addDay = isExempt ? 20 : 45\r\n const isCurrentDate = new Date() // วันปัจจุบัน\r\n const defaultAnnounceDate = moment(isCurrentDate).add(addDay, 'day').format('YYYY-MM-DD')\r\n\r\n const initialData = {\r\n docDate: projectData?.receiveDocumentDate,\r\n commentaryDate: projectData?.sendCommentCommitteeDate,\r\n announceDate: projectData?.announceDate\r\n ? projectData?.announceDate\r\n : !isRequestDocument\r\n ? defaultAnnounceDate\r\n : null,\r\n advisorDueDate: projectData?.sendAdvisorDueDate,\r\n }\r\n setMinMaxDate({\r\n min: initialData.docDate ? moment(initialData.docDate).format('YYYY-MM-DD') : undefined,\r\n max: initialData.announceDate ?? undefined,\r\n })\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const handleChangCommentDateREC1 = (val: string) => {\r\n commentaryDateRef.current = val\r\n }\r\n\r\n const handleChangDocDateREC1 = (\r\n val: string,\r\n // change: (name: F, value?: ValueFormType[F] | undefined) => void,\r\n form: FormApi>,\r\n ) => {\r\n if (val !== 'undefined') {\r\n const isExempt = projectData && projectData?.considerInfo?.value === constConsiderType.exempt\r\n const addDay = isExempt ? 20 : 45\r\n const announceDate = moment(val).add(addDay, 'day').format('YYYY-MM-DD')\r\n const formValAnnounceDate = form.getFieldState('announceDate')?.value\r\n setMinMaxDate({\r\n min: moment(val).format('YYYY-MM-DD'),\r\n max: formValAnnounceDate ? formValAnnounceDate : announceDate,\r\n })\r\n } else {\r\n setMinMaxDate({\r\n min: undefined,\r\n max: minMaxDate?.max,\r\n })\r\n }\r\n }\r\n\r\n const resetDateExceptDocDate = (form: FormApi>) => {\r\n const formVal = form.getState().values\r\n if (formVal.docDate) {\r\n const docDate = moment(formVal.docDate)\r\n if (formVal.announceDate && moment(formVal.announceDate) < docDate) {\r\n setMinMaxDate({\r\n min: formVal.docDate,\r\n max: formVal.docDate,\r\n })\r\n form.change('announceDate', formVal.docDate)\r\n }\r\n if (formVal.advisorDueDate && moment(formVal.advisorDueDate) < docDate) {\r\n form.change('advisorDueDate', formVal.docDate)\r\n }\r\n if (formVal.commentaryDate && moment(formVal.commentaryDate) < docDate) {\r\n form.change('commentaryDate', formVal.docDate)\r\n }\r\n } else if (!formVal.docDate) {\r\n form.change('advisorDueDate', null)\r\n form.change('announceDate', null)\r\n form.change('commentaryDate', null)\r\n }\r\n }\r\n\r\n const handleChangAnnounceDateREC1 = (\r\n val: string,\r\n // change: (name: F, value?: ValueFormType[F] | undefined) => void,\r\n form: FormApi>,\r\n ) => {\r\n if (val !== 'undefined') {\r\n const isRequestDocument = projectData?.isRequestDocument\r\n const isExempt = projectData && projectData?.considerInfo?.value === constConsiderType.exempt\r\n const subtractDay = isExempt ? 20 : 45\r\n const docDate = moment(val).subtract(subtractDay, 'day').format('YYYY-MM-DD')\r\n const announceDate = new Date(val)\r\n const newDocDate = new Date(docDate)\r\n let commentaryDate //วันที่กรรมการลงความเห็น\r\n const formValDocDate = form.getFieldState('docDate')?.value\r\n\r\n if (commentaryDateRef.current) {\r\n commentaryDate = new Date(commentaryDateRef.current)\r\n }\r\n\r\n if (isRequestDocument) {\r\n if (commentaryDate && (newDocDate > commentaryDate || commentaryDate > announceDate)) {\r\n form.change('commentaryDate', null)\r\n }\r\n } else {\r\n if (commentaryDate && commentaryDate > announceDate) {\r\n form.change('commentaryDate', null)\r\n }\r\n }\r\n\r\n if (!formValDocDate) {\r\n if (isRequestDocument) {\r\n form.change('docDate', docDate)\r\n }\r\n }\r\n\r\n setMinMaxDate({\r\n min: isRequestDocument ? (formValDocDate ? formValDocDate : docDate) : undefined,\r\n max: moment(val).format('YYYY-MM-DD'),\r\n })\r\n } else {\r\n setMinMaxDate({\r\n min: minMaxDate?.min,\r\n max: undefined,\r\n })\r\n }\r\n }\r\n\r\n const handleChangAdvisorDateREC1 = (val: string) => {\r\n advisorDateRef.current = val\r\n }\r\n\r\n /**\r\n *\r\n * REC2\r\n */\r\n const createInitialDataREC2 = () => {\r\n if (projectData) {\r\n const isRequestDocument = projectData?.isRequestDocument\r\n const isExempt = projectData?.considerInfo?.value === constConsiderType.exempt\r\n const addDay = isExempt ? 7 : 10\r\n const isCurrentDate = new Date() // วันปัจจุบัน\r\n const defaultAnnounceDate = moment(isCurrentDate).add(addDay, 'day').format('YYYY-MM-DD')\r\n\r\n const initialData = {\r\n docDate: projectData?.receiveDocumentDate,\r\n commentaryDate: projectData?.sendCommentCommitteeDate,\r\n announceDate: projectData?.announceDate\r\n ? projectData?.announceDate\r\n : !isRequestDocument\r\n ? defaultAnnounceDate\r\n : null,\r\n advisorDueDate: projectData?.sendAdvisorDueDate,\r\n }\r\n setMinMaxDate({\r\n min: initialData.docDate ? moment(initialData.docDate).format('YYYY-MM-DD') : undefined,\r\n max: initialData.announceDate ?? undefined,\r\n })\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const handleChangCommentDateREC2 = (val: string) => {\r\n commentaryDateRef.current = val\r\n }\r\n\r\n const handleChangDocDateREC2 = (\r\n val: string,\r\n // change: (name: F, value?: ValueFormType[F] | undefined) => void,\r\n form: FormApi>,\r\n ) => {\r\n if (val !== 'undefined') {\r\n const isExempt = projectData && projectData?.considerInfo?.value === constConsiderType.exempt\r\n const addDay = isExempt ? 7 : 10\r\n const announceDate = moment(val).add(addDay, 'day').format('YYYY-MM-DD')\r\n const formValAnnounceDate = form.getFieldState('announceDate')?.value\r\n setMinMaxDate({\r\n min: moment(val).format('YYYY-MM-DD'),\r\n max: formValAnnounceDate ? formValAnnounceDate : announceDate,\r\n })\r\n } else {\r\n setMinMaxDate({\r\n min: undefined,\r\n max: minMaxDate?.max,\r\n })\r\n }\r\n }\r\n\r\n const handleChangAnnounceDateREC2 = (\r\n val: string,\r\n // change: (name: F, value?: ValueFormType[F] | undefined) => void,\r\n form: FormApi>,\r\n ) => {\r\n if (val !== 'undefined') {\r\n const isRequestDocument = projectData?.isRequestDocument\r\n const isExempt = projectData && projectData?.considerInfo?.value === constConsiderType.exempt\r\n const subtractDay = isExempt ? 7 : 10\r\n const docDate = moment(val).subtract(subtractDay, 'day').format('YYYY-MM-DD')\r\n const announceDate = new Date(val)\r\n const newDocDate = new Date(docDate)\r\n let commentaryDate //วันที่กรรมการลงความเห็น\r\n const formValDocDate = form.getFieldState('docDate')?.value\r\n\r\n if (commentaryDateRef.current) {\r\n commentaryDate = new Date(commentaryDateRef.current)\r\n }\r\n\r\n if (isRequestDocument) {\r\n if (commentaryDate && (newDocDate > commentaryDate || commentaryDate > announceDate)) {\r\n form.change('commentaryDate', null)\r\n }\r\n } else {\r\n if (commentaryDate && commentaryDate > announceDate) {\r\n form.change('commentaryDate', null)\r\n }\r\n }\r\n\r\n if (!formValDocDate) {\r\n if (isRequestDocument) {\r\n form.change('docDate', docDate)\r\n }\r\n }\r\n setMinMaxDate({\r\n min: isRequestDocument ? (formValDocDate ? formValDocDate : docDate) : undefined,\r\n max: moment(val).format('YYYY-MM-DD'),\r\n })\r\n } else {\r\n setMinMaxDate({\r\n min: minMaxDate?.min,\r\n max: undefined,\r\n })\r\n }\r\n }\r\n\r\n const handleChangAdvisorDateREC2 = (val: string) => {\r\n advisorDateRef.current = val\r\n }\r\n\r\n /**\r\n * process for save\r\n */\r\n\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const handleSubmitForm = async (val: ValueFormType) => {\r\n const parameter: SpecifyReceiveDocumentDateRequestType | undefined = getParameterForSave(val)\r\n if (val.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n if (\r\n parameter?.receiveDocumentDate &&\r\n !parameter.sendCommentCommitteeDate &&\r\n !parameter.announceDate &&\r\n !parameter.sendAdvisorDueDate\r\n ) {\r\n handleConfirmSubmitOnlyReceiveDate(parameter)\r\n } else {\r\n handleConfirmSave(parameter)\r\n }\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n const getParameterForSave = (val: ValueFormType) => {\r\n if (projectData) {\r\n let isDraft = false\r\n if (val.submitType === 'draft') {\r\n isDraft = true\r\n }\r\n const specifyReceiveDocumentDateRequest: SpecifyReceiveDocumentDateRequestType = {\r\n loginUserID: profileStore.profile.userId,\r\n projectID: projectData.projectID,\r\n submittedID: projectData.submittedID,\r\n receiveDocumentDate: val?.docDate ? dateForAPI(val?.docDate) ?? null : null,\r\n sendCommentCommitteeDate: val?.commentaryDate ? dateForAPI(val?.commentaryDate) ?? null : null,\r\n announceDate: val?.announceDate ? dateForAPI(val?.announceDate) ?? null : null,\r\n isDraft: isDraft,\r\n sendAdvisorDueDate: val.advisorDueDate ? dateForAPI(val?.advisorDueDate) ?? null : null,\r\n }\r\n return specifyReceiveDocumentDateRequest\r\n }\r\n }\r\n\r\n const handleConfirmSave = async (\r\n paramForSave: SpecifyReceiveDocumentDateRequestType | undefined,\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n if (paramForSave) {\r\n dialogRef.current?.closeDialog()\r\n const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.specifyReceiveDocumentDate(paramForSave)\r\n\r\n if (!isFolder) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n if (tabIndex && newTabSelected) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n } else {\r\n //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n if (callbackSaveComplete) {\r\n if (res && res.status) {\r\n callbackSaveComplete(res.status, isDraft)\r\n }\r\n }\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleConfirmSubmitOnlyReceiveDate = async (paramForSave: SpecifyReceiveDocumentDateRequestType) => {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n await callWebService\r\n .submitOnlyDocReceiveDate({\r\n projectID: paramForSave.projectID,\r\n submittedID: paramForSave.submittedID,\r\n receiveDocumentDate: paramForSave.receiveDocumentDate,\r\n })\r\n .then(() => {\r\n tabAndFolderHook.reloadProjectData(projectData?.projectID, projectData?.submittedID)\r\n })\r\n loadingHook.loadingClose()\r\n }\r\n\r\n /**\r\n *\r\n * Dirty tab\r\n */\r\n const handleDirtyChange = (props: any) => {\r\n let isDirty: boolean = false\r\n\r\n let newFormValue = {\r\n ...props.values,\r\n docDate: props.values.docDate ? convertDateToDateString(props.values.docDate) : null,\r\n commentaryDate: props.values.commentaryDate ? convertDateToDateString(props.values.commentaryDate) : null,\r\n announceDate: props.values.announceDate ? convertDateToDateString(props.values.announceDate) : null,\r\n }\r\n let initValue = {\r\n ...initialValues,\r\n docDate: initialValues.docDate ? convertDateToDateString(initialValues.docDate) : null,\r\n commentaryDate: initialValues.commentaryDate ? convertDateToDateString(initialValues.commentaryDate) : null,\r\n announceDate: initialValues.announceDate ? convertDateToDateString(initialValues.announceDate) : null,\r\n }\r\n\r\n const isEqual = _.isEqual(initValue, newFormValue)\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n // appFolderAndTabAction.setTabDirty(isDirty)\r\n paramsRef.current = getParameterForSave(props.values)\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n if (paramsRef.current) {\r\n paramsRef.current.isDraft = true\r\n handleConfirmSave(paramsRef.current, tabIndex, newTabSelected, isFolder)\r\n }\r\n }\r\n\r\n const conditionRequireAll = (formValues: ValueFormType) => {\r\n const condition1 = isSubmittedReceiveDate ? true : false\r\n const condition2 =\r\n formValues.docDate && (formValues.advisorDueDate || formValues.announceDate || formValues.commentaryDate)\r\n ? true\r\n : false\r\n return condition1 || condition2\r\n }\r\n\r\n const validateForm = (formValues: ValueFormType) => {\r\n const errors: ValidationErrors = {}\r\n const haveToFillAll = conditionRequireAll(formValues)\r\n let committee = projectData?.committeeInfo ?? []\r\n\r\n if (haveToFillAll) {\r\n if (committee.length > 0 && !formValues.advisorDueDate) {\r\n errors.advisorDueDate = translate.get('MESSAGE.M016')\r\n }\r\n }\r\n if (haveToFillAll && !formValues.announceDate) {\r\n errors.announceDate = translate.get('MESSAGE.M016')\r\n }\r\n if (haveToFillAll) {\r\n if (committee.length > 0 && !formValues.commentaryDate) {\r\n errors.commentaryDate = translate.get('MESSAGE.M016')\r\n }\r\n }\r\n return errors\r\n }\r\n\r\n return {\r\n minMaxDate,\r\n isViewMode,\r\n initialValues,\r\n configDialog,\r\n displayField,\r\n isShowUpdateDate,\r\n isSubmittedReceiveDate,\r\n conditionMinDate: minMaxDate && minMaxDate.min ? new Date(minMaxDate.min) : undefined,\r\n onRefDialog,\r\n onDirtyChang: handleDirtyChange,\r\n onChangDocDateREC1: handleChangDocDateREC1,\r\n onChangAnnounceDateREC1: handleChangAnnounceDateREC1,\r\n onChangDocDateREC2: handleChangDocDateREC2,\r\n onChangAnnounceDateREC2: handleChangAnnounceDateREC2,\r\n onChangCommentDateREC1: handleChangCommentDateREC1,\r\n onChangCommentDateREC2: handleChangCommentDateREC2,\r\n onSubmitForm: handleSubmitForm,\r\n onClickCancel: handleClickCancel,\r\n handleChangAdvisorDateREC1,\r\n handleChangAdvisorDateREC2,\r\n conditionRequireAll,\r\n validateForm,\r\n resetDateExceptDocDate,\r\n }\r\n}\r\n\r\nexport default useSpecifyDateForm\r\n","import React from 'react'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport { Grid } from '@material-ui/core'\r\nimport * as defineSubmittedDateType from './defineSubmittedDateType'\r\nimport PageAction from '../pageAction'\r\nimport useDefineSubmittedDate from './useDefineSubmittedDate'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport MyDatePicker from '../../../../../control/datepicker/datepicker'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\n\r\nconst DefineSubmittedDateREC1View: React.FC = (props) => {\r\n const {\r\n isViewMode,\r\n minMaxDate,\r\n displayField,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n isSubmittedReceiveDate,\r\n conditionMinDate,\r\n onRefDialog,\r\n onDirtyChang,\r\n onSubmitForm,\r\n onClickCancel,\r\n onChangAnnounceDateREC1,\r\n onChangCommentDateREC1,\r\n onChangDocDateREC1,\r\n handleChangAdvisorDateREC1,\r\n conditionRequireAll,\r\n validateForm,\r\n resetDateExceptDocDate,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n return (\r\n \r\n {(props) => {\r\n const { form, handleSubmit, dirty, invalid, errors, values } = props\r\n const haveToFillAll = conditionRequireAll(values)\r\n const disabledOtherDate = values.docDate || !displayField?.docDate ? false : true\r\n return (\r\n \r\n \r\n \r\n {/* */}\r\n \r\n \r\n {displayField?.docDate && (\r\n \r\n {\r\n onChangDocDateREC1(val, form)\r\n resetDateExceptDocDate(form)\r\n }}\r\n required\r\n />\r\n \r\n )}\r\n \r\n {\r\n onChangAnnounceDateREC1(val, form)\r\n }}\r\n minDate={conditionMinDate}\r\n required={haveToFillAll || !displayField?.docDate}\r\n />\r\n \r\n {displayField?.commentaryDate && (\r\n <>\r\n \r\n \r\n \r\n \r\n {\r\n handleChangAdvisorDateREC1(val)\r\n }}\r\n minDate={conditionMinDate}\r\n required={haveToFillAll || !displayField?.docDate}\r\n />\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {isShowUpdateDate && }\r\n \r\n\r\n {!isViewMode && (\r\n \r\n {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nconst DefineSubmittedDateREC1: React.FC = (props) => {\r\n const useDefineSubmittedDateModel = useDefineSubmittedDate(props)\r\n return \r\n}\r\n\r\nexport default DefineSubmittedDateREC1\r\n","import React from 'react'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport { Grid } from '@material-ui/core'\r\nimport * as defineSubmittedDateType from './defineSubmittedDateType'\r\nimport PageAction from '../pageAction'\r\nimport useDefineSubmittedDate from './useDefineSubmittedDate'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport MyDatePicker from '../../../../../control/datepicker/datepicker'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\n\r\nconst DefineSubmittedDateREC2View: React.FC = (props) => {\r\n const {\r\n isViewMode,\r\n minMaxDate,\r\n displayField,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n isSubmittedReceiveDate,\r\n conditionMinDate,\r\n onRefDialog,\r\n onDirtyChang,\r\n onSubmitForm,\r\n onClickCancel,\r\n onChangAnnounceDateREC2,\r\n onChangCommentDateREC2,\r\n onChangDocDateREC2,\r\n handleChangAdvisorDateREC2,\r\n conditionRequireAll,\r\n validateForm,\r\n resetDateExceptDocDate,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n\r\n return (\r\n \r\n {(props) => {\r\n const { form, handleSubmit, dirty, invalid, errors, values } = props\r\n const haveToFillAll = conditionRequireAll(values)\r\n const disabledOtherDate = values.docDate || !displayField?.docDate ? false : true\r\n return (\r\n \r\n \r\n \r\n {/* */}\r\n \r\n \r\n {displayField?.docDate && (\r\n \r\n {\r\n onChangDocDateREC2(val, form)\r\n resetDateExceptDocDate(form)\r\n }}\r\n required\r\n />\r\n \r\n )}\r\n \r\n {\r\n onChangAnnounceDateREC2(val, form)\r\n }}\r\n minDate={\r\n minMaxDate && minMaxDate.min ? new Date(minMaxDate.min) : undefined\r\n }\r\n required={haveToFillAll || !displayField?.docDate}\r\n />\r\n \r\n {displayField?.commentaryDate && (\r\n <>\r\n \r\n \r\n \r\n \r\n {\r\n handleChangAdvisorDateREC2(val)\r\n }}\r\n minDate={conditionMinDate}\r\n required={haveToFillAll || !displayField?.docDate}\r\n />\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {isShowUpdateDate && }\r\n \r\n {!isViewMode && (\r\n \r\n {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nconst DefineSubmittedDateREC2: React.FC = (props) => {\r\n const useDefineSubmittedDateModel = useDefineSubmittedDate(props)\r\n return \r\n}\r\n\r\nexport default DefineSubmittedDateREC2\r\n","import * as commentDirectorTypes from './commentDirectorTypes'\r\n\r\nconst useCommentDirector = (props: commentDirectorTypes.UseCommentDirectorType) => {\r\n const { callbackFunction } = props\r\n const handleChangTextField = (val: string, index: number) => {\r\n if (callbackFunction) {\r\n callbackFunction(val, index)\r\n }\r\n }\r\n return {\r\n onChangTextField: handleChangTextField,\r\n }\r\n}\r\n\r\nexport default useCommentDirector\r\n","import React from 'react'\r\nimport * as commentDirectorTypes from './commentDirectorTypes'\r\nimport useCommentDirector from './useCommentDirector'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport MyAccordion from '../../../../control/accordion/accordion'\r\nimport { Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport RichTextEditor from '../../../../control/richTextEditor/richTextEditor'\r\nimport { richEditorRequired } from '../../../../utilities/validate'\r\n\r\n//View\r\nconst CommentDirectorView = (props: commentDirectorTypes.CommentDirectorViewType) => {\r\n const { disabled = false, commentTitleList, textRemaining, initialcomment = [], isViewMode, committeeID } = props\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const isRequired = {\r\n errorMessage: `${translate.get('MESSAGE.M013')}`,\r\n showAsterisk: true,\r\n triggedValidate: true,\r\n }\r\n const addCommas = (num: number) => {\r\n return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\r\n }\r\n const renderTopic = (index: number) => {\r\n return `${commentTitleList[index]?.no ? `${commentTitleList[index]?.no}. ` : ''}${\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? commentTitleList[index]?.name_th\r\n : commentTitleList[index]?.name_en\r\n }`\r\n }\r\n return (\r\n \r\n \r\n {({ fields }) => {\r\n return fields?.map((name, index) => (\r\n \r\n \r\n \r\n *}\r\n >\r\n \r\n \r\n \r\n \r\n {!disabled && textRemaining && textRemaining[index] && (\r\n \r\n \r\n {translate.get('LABEL.NUMBER_OF_CHARACTERS')} :{' '}\r\n {addCommas(textRemaining[index])}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n ))\r\n }}\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n errorText: {\r\n fontSize: '20px',\r\n fontWeight: 'bold',\r\n color: '#ff4d4f',\r\n display: 'inline',\r\n },\r\n}))\r\n\r\n//Controller\r\nconst CommentDirector = (props: commentDirectorTypes.CommentDirectorType) => {\r\n const commentDirectorModel = useCommentDirector(props)\r\n return \r\n}\r\n\r\nexport default CommentDirector\r\n","import { useSetRecoilState } from 'recoil'\r\n\r\nimport { commentaryStore } from './useCommentaryStore'\r\n\r\nconst useCommentaryAction = () => {\r\n const setCommentaryStore = useSetRecoilState(commentaryStore)\r\n\r\n const setSelectedCommittedID = (selectedCommitteID: number) => {\r\n setCommentaryStore((prevState) => ({\r\n ...prevState,\r\n selectedCommitteeID: selectedCommitteID\r\n }))\r\n }\r\n\r\n return {\r\n setSelectedCommittedID,\r\n }\r\n}\r\n\r\nexport default useCommentaryAction\r\n","import React from 'react'\r\nimport _ from 'lodash'\r\n\r\nimport * as reviewerCommentType from './reviewerCommentType'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { CommentaryProjectType } from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport { TabSelectedType } from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { topicIsExempt, topicIsUploadComment } from '../../../../../constants/constants'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\nimport { DatasourceForCopyToClipbaord } from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport { ResultDocumentTopicLut } from '../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport * as REQServiceTypes from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport submittedStep from '../../../../../constants/submittedStep'\r\nimport { convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport useCommentaryAction from '../../../../../stores/commentary/useCommentaryAction'\r\nimport { GetProjectResultType } from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport committeeProjectRole from '../../../../../constants/committeeProjectRole'\r\nimport useChecklistStore from '../../../../../stores/checklist/useChecklistStore'\r\nimport { DatasourceForExport } from '../../../../../control/exportToMSWord/exportToMSWord'\r\nimport useChecklistAction from '../../../../../stores/checklist/useChecklistAction'\r\n\r\nconst useReviewerComment = (props: reviewerCommentType.UseReviewerComment) => {\r\n const { callbackSaveComplete, isOneComment = false } = props\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const profileStore = authenStore()\r\n const [isShowSubComment, setIsShowSubComment] = React.useState(false)\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [commentTitleList, setCommentTitleList] = React.useState([])\r\n const [initialComment, setInitialComment] = React.useState([])\r\n const [director, setDirector] = React.useState([])\r\n const [commentaryProject, setCommentaryProject] = React.useState()\r\n const isCommitteeInfo = React.useRef([])\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogTwoRef = React.useRef>()\r\n const directorRef = React.useRef()\r\n const formRef = React.useRef()\r\n const isDirectorEmptyRef = React.useRef(false)\r\n const checkPermissionHook = checkPermission()\r\n const { projectData } = useManageProjectStore()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const [isRequired, setIsRequired] = React.useState(false)\r\n const isLanguageRef = React.useRef()\r\n const [textRemaining, setTextRemaining] = React.useState([])\r\n const [textRemainingRemark, setTextRemainingRemark] = React.useState()\r\n const paramsRef = React.useRef()\r\n const [documentTopic, setDocumentTopic] = React.useState([])\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n const isDeadlineRef = React.useRef(false)\r\n\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const loadingHook = useLoading()\r\n const history = useHistory()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const [dataSourceForCopyToClipboard, setDataSourceForCopyToClipboard] = React.useState<\r\n DatasourceForCopyToClipbaord[]\r\n >([])\r\n const [dataSourceForExport, setDataSourceForExport] = React.useState([])\r\n const [dataForShowUpdateDate, setDataForShowUpdateDate] = React.useState<{\r\n nameTH: string\r\n nameEN: string\r\n date: string\r\n }>()\r\n\r\n const commentaryAction = useCommentaryAction()\r\n const showSaveDraft = checkPermissionHook.checkSaveDraft()\r\n\r\n const checklistState = useChecklistStore()\r\n const { clearChecklist } = useChecklistAction()\r\n\r\n React.useEffect(() => {\r\n if (\r\n profileStore?.profile.userId &&\r\n checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? [])\r\n ) {\r\n getCommentaryProjectCommitteeByID(profileStore?.profile.userId)\r\n checkIsDeadLine()\r\n }\r\n }, [profileStore?.profile.userId ?? null])\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n getAllCommentary()\r\n getAllCommentaryForExport()\r\n if (isOneComment) {\r\n //isOneComment หมายถึงให้ UI เป็นแบบกล่องเดียวหรือหลายกล่อง\r\n setIsShowSubComment(false)\r\n const topicIsExemption = topicIsExempt.map((itm) => {\r\n return { ...itm, irb: projectData?.irb }\r\n })\r\n setCommentTitleList(topicIsExemption)\r\n } else {\r\n getCommentaryTopicLut(projectData?.irb)\r\n setIsShowSubComment(true)\r\n }\r\n\r\n if (!checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? []) && projectData) {\r\n setInitDirector(projectData?.submittedID)\r\n }\r\n else if (checkPermissionHook.isUserChairman() && projectData) {\r\n setInitDirector(projectData?.submittedID)\r\n }\r\n\r\n isLanguageRef.current = translate.languageStore.currentLanguage\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID])\r\n\r\n React.useEffect(() => {\r\n createInitialComment()\r\n }, [commentTitleList, commentaryProject])\r\n\r\n React.useEffect(() => {\r\n if (!checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? []) && projectData) {\r\n setInitDirector(projectData?.submittedID)\r\n }\r\n else if (checkPermissionHook.isUserChairman() && projectData) {\r\n setInitDirector(projectData?.submittedID)\r\n }\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const getCommentaryProjectCommitteeByID = async (committeeUserID: number) => {\r\n if (projectData) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getCommentaryProjectCommitteeByID(\r\n projectData.submittedID,\r\n committeeUserID,\r\n )\r\n const showUpdater = {\r\n nameTH: result.updateByNameTH,\r\n nameEN: result.updateByNameEN,\r\n date: result.updatedDate,\r\n }\r\n setCommentaryProject(result)\r\n setDataForShowUpdateDate(showUpdater)\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const checkIsDeadLine = async () => {\r\n const { isDeadline } = await callWebService.checkAdvisorDueDate(Number(projectData?.submittedID))\r\n isDeadlineRef.current = isDeadline\r\n }\r\n\r\n const getAllCommentary = async () => {\r\n if (projectData) {\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.getAllCommentaryProjectCommittee(projectData.submittedID)\r\n const allCommentList = res.result.map((itm) => {\r\n itm.commentaryInfo.forEach((commentary) => {\r\n if (commentary.name_th === null && commentary.name_en === null) {\r\n commentary.name_th = 'ข้อคิดเห็น / ข้อสังเกต'\r\n commentary.name_en = 'Suggestion / Notice'\r\n }\r\n })\r\n return {\r\n fullNameEN: itm.fullUsername_en ? itm.fullUsername_en : ' ',\r\n fullNameTH: itm.fullUsername_th ? itm.fullUsername_th : ' ',\r\n updatedDate: convertDateToFormatTH(itm.updatedDate),\r\n updateByNameTH: itm.updateByNameTH,\r\n updateByNameEN: itm.updateByNameEN,\r\n approveStatusNameTH: itm.approveStatusName_th ?? '',\r\n approveStatusNameEN: itm.approveStatusName_en ?? '',\r\n commentaryInfo: itm.commentaryInfo.map((item) => {\r\n return {\r\n ...item,\r\n comment_htmltag: item.comment_htmltag\r\n ? item.comment_htmltag\r\n .replaceAll('', '')\r\n .replaceAll('', '')\r\n .replaceAll('', '')\r\n .replaceAll('', '')\r\n : item.comment_htmltag,\r\n }\r\n }),\r\n }\r\n })\r\n if (allCommentList) {\r\n setDataSourceForCopyToClipboard(allCommentList)\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const getCommentaryTopicLut = async (irb: number) => {\r\n if (irb) {\r\n const res = await callLookup.callCommentaryTopicLut(irb)\r\n\r\n if (res.result) {\r\n const formatData = res.result.map((itm: any, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n setCommentTitleList(formatData)\r\n }\r\n }\r\n }\r\n\r\n const setInitDirector = async (submittedID: number) => {\r\n if (submittedID) {\r\n const { result, status } = await callLookup.callCommitteeLut(submittedID)\r\n if (status === 1) {\r\n const committeeInfo = result.map((item: any) => {\r\n return {\r\n director:\r\n item.fullUsername_th && item.userID\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? item.fullUsername_th\r\n : item.fullUsername_en,\r\n value: item.userID.toString(),\r\n }\r\n : {},\r\n role:\r\n item?.projectRoleName_th && item?.projectRoleID\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? item.projectRoleName_th\r\n : item.projectRoleName_en,\r\n value: item.projectRoleID.toString(),\r\n }\r\n : {},\r\n }\r\n })\r\n\r\n isCommitteeInfo.current = committeeInfo\r\n const isDirector = committeeInfo?.map((itm: any) => {\r\n return itm.director\r\n })\r\n\r\n const form = formRef.current.getState().values\r\n if (isCommitteeInfo.current && formRef.current) {\r\n const findRole = isCommitteeInfo.current?.find(\r\n (e: any) => e.director?.value === form?.director?.value,\r\n )\r\n\r\n if (findRole) {\r\n formRef.current.change('role', findRole.role)\r\n }\r\n }\r\n setDirector(isDirector)\r\n\r\n await conditionGetCommentary(isDirector)\r\n }\r\n }\r\n }\r\n\r\n const conditionGetCommentary = (director: reviewerCommentType.OptType[]) => {\r\n const formValueRef = formRef.current?.getState().values\r\n if (isLanguageRef.current === translate.languageStore.currentLanguage) {\r\n \r\n if (!checkPermissionHook.isUserCommittee()) {\r\n if (formValueRef && formValueRef.director) {\r\n if (profileStore?.profile.userId \r\n && checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? [])) {\r\n getCommentaryProjectCommitteeByID(profileStore?.profile.userId)\r\n }\r\n else {\r\n //กรณีที่เรียกข้อมูลกรรมคนปัจจุบัน\r\n getCommentaryProjectCommitteeByID(parseInt(formValueRef?.director?.value))\r\n }\r\n directorRef.current = formValueRef.director\r\n } else if (director[0]?.value) {\r\n if (profileStore?.profile.userId \r\n && checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? [])) {\r\n getCommentaryProjectCommitteeByID(profileStore?.profile.userId)\r\n }\r\n else {\r\n getCommentaryProjectCommitteeByID(parseInt(director[0]?.value))\r\n directorRef.current = director[0]\r\n }\r\n }\r\n } else if (profileStore?.profile.userId) {\r\n getCommentaryProjectCommitteeByID(profileStore?.profile.userId)\r\n }\r\n }\r\n\r\n isLanguageRef.current = translate.languageStore.currentLanguage\r\n }\r\n\r\n const createInitialComment = () => {\r\n let commentInit: reviewerCommentType.CommentType[] = commentTitleList?.map((itm: any) => {\r\n return {\r\n topic: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n id: itm.id,\r\n commentList: {\r\n contentHtml: itm.comment_htmltag ?? '',\r\n contentText: itm.comment ?? '',\r\n },\r\n no: itm.no,\r\n strTheRest: 4000,\r\n }\r\n })\r\n\r\n if (commentaryProject?.commentaryInfo?.length === 1) {\r\n commentInit = commentaryProject?.commentaryInfo.map((itm: any) => {\r\n const countTextComment = itm.comment ? itm.comment?.length : 0\r\n return {\r\n topic: translate.get('LABEL.SUGGESTION_NOTICE'),\r\n commentList: itm.comment,\r\n strTheRest: 4000 - countTextComment,\r\n }\r\n })\r\n } else {\r\n commentInit.forEach((item: any) => {\r\n commentaryProject?.commentaryInfo.forEach((info: reviewerCommentType.CommitteeInfoApi) => {\r\n if (info.topicID === item.id) {\r\n const countTextComment = info.comment.contentText ? info.comment.contentText?.length : 0\r\n item.strTheRest = 4000 - countTextComment\r\n item.commentList = info.comment\r\n item.topic =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? info.topicName_th\r\n : info.topicName_en\r\n item.id = info.topicID\r\n item.no = info.no\r\n }\r\n })\r\n })\r\n }\r\n if (formRef.current) {\r\n formRef.current.change('commentDirector', commentInit)\r\n formRef.current.restart()\r\n }\r\n\r\n const textRemain = commentInit?.map((item) => {\r\n return item.strTheRest\r\n })\r\n\r\n setTextRemaining(textRemain)\r\n setInitialComment(commentInit)\r\n createInitialData()\r\n createTopicUpload()\r\n }\r\n\r\n /*function สำหรับสร้างข้อมูลเริ่มต้นในฟอร์ม */\r\n const createInitialData = () => {\r\n if (commentaryProject) {\r\n const remark = commentaryProject.commentaryRemark\r\n const countStrRemark = remark ? remark.length : 0\r\n const textRemainingRemarkInitial = 4000 - countStrRemark\r\n //set ค่าเริ่มต้นฟอร์ม\r\n const initialData = {\r\n approveStatus:\r\n commentaryProject && commentaryProject?.approveStatusID\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? commentaryProject.approveStatusName_th\r\n : commentaryProject.approveStatusName_en,\r\n value: commentaryProject?.approveStatusID.toString(),\r\n }\r\n : null,\r\n isDisableFrm:\r\n commentaryProject && commentaryProject?.isDraft == null\r\n ? false\r\n : commentaryProject?.isDraft\r\n ? false\r\n : true,\r\n submittedID: commentaryProject && commentaryProject?.submittedID,\r\n director:\r\n isCommitteeInfo.current && isCommitteeInfo.current[0]?.director\r\n ? isCommitteeInfo.current[0]?.director\r\n : null,\r\n role:\r\n isCommitteeInfo.current && isCommitteeInfo.current[0]?.role\r\n ? isCommitteeInfo.current[0]?.role\r\n : null,\r\n remark: remark ? remark : isViewMode ? '-' : null,\r\n comment: isShowSubComment\r\n ? null\r\n : commentaryProject?.commentaryInfo[0]?.comment\r\n ? commentaryProject?.commentaryInfo[0]?.comment\r\n : null,\r\n isShowUpdateDate:\r\n commentaryProject && commentaryProject?.isDraft == null\r\n ? false\r\n : commentaryProject?.isDraft\r\n ? true\r\n : true,\r\n }\r\n\r\n if (formRef.current) {\r\n formRef.current.change('approveStatus', initialData.approveStatus)\r\n formRef.current.restart()\r\n }\r\n commentaryAction.setSelectedCommittedID(commentaryProject?.userID)\r\n setTextRemainingRemark(textRemainingRemarkInitial)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n /**\r\n * หัวข้ออัพโหลดเอกสาร\r\n */\r\n const createTopicUpload = () => {\r\n const formatTopic = topicIsUploadComment.map((itm) => {\r\n return { ...itm, code: null, subtopic: [] }\r\n })\r\n setDocumentTopic(formatTopic)\r\n\r\n createInitialUploadFile(formatTopic)\r\n }\r\n\r\n /**\r\n *\r\n * การเช็ตค่าไฟล์เริ่มต้น\r\n */\r\n const createInitialUploadFile = (docTopic: ResultDocumentTopicLut[]) => {\r\n if (commentaryProject) {\r\n let documentInfo = commentaryProject.documentInfo\r\n\r\n const uploadFileInit = docTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n }) as Array\r\n\r\n if (documentInfo && documentInfo[0]?.fileInfo.length > 0) {\r\n let fileList = documentInfo[0]?.fileInfo?.map((file: any) => ({\r\n documentTopicID: topicIsUploadComment[0].id,\r\n fileToken: file.fileToken, //fileToken\r\n filename: file.filename,\r\n fileID: file.fileToken, //fileToken\r\n path: file.path,\r\n }))\r\n\r\n uploadFileInit[0].uploadFileObj.fileList = fileList\r\n }\r\n\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n }\r\n\r\n /* function สำหรับ set ข้อมูลเมื่อเลือกกรรมการคนใหม่ */\r\n const handleChangDirector = (val: reviewerCommentType.OptType, chang: any) => {\r\n if (val) {\r\n const formValue = formRef.current.getState().values\r\n let newFormValue = _.omit({ ...formValue }, ['director', 'role'])\r\n let initValue = _.omit(\r\n { ...initialValues, commentDirector: initialComment, uploadFile: initialUploadFile },\r\n ['director', 'role'],\r\n )\r\n\r\n const isEqual = _.isEqual(initValue, newFormValue)\r\n\r\n if (director.length > 1) {\r\n if (\r\n !isEqual &&\r\n (commentaryProject?.isDraft || commentaryProject?.isDraft === null) &&\r\n !isDirectorEmptyRef.current\r\n ) {\r\n chang('director', directorRef.current)\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.CONFIRM_CHANGE_DIRECTOR'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n if (showSaveDraft) {\r\n //บันทึกร่าง\r\n paramsRef.current = { ...newFormValue, director: directorRef.current }\r\n const parameter = getParameterForSave(paramsRef.current)\r\n if (parameter) {\r\n parameter.isDraft = true\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n isCommitteeInfo.current.forEach((itm: any) => {\r\n if (val === itm.director) {\r\n chang('role', itm.role)\r\n chang('director', itm.director)\r\n directorRef.current = itm.director\r\n }\r\n })\r\n dialogTwoRef.current?.closeDialog()\r\n getCommentaryProjectCommitteeByID(parseInt(val.value))\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n isCommitteeInfo.current.forEach((itm: any) => {\r\n if (val === itm.director) {\r\n chang('role', itm.role)\r\n directorRef.current = itm.director\r\n }\r\n })\r\n if (val?.value) {\r\n getCommentaryProjectCommitteeByID(parseInt(val?.value))\r\n }\r\n }\r\n isDirectorEmptyRef.current = false\r\n }\r\n } else {\r\n isDirectorEmptyRef.current = true\r\n }\r\n }\r\n\r\n /* function สำหรับ set ข้อมูลเมื่อเลือกผลพิจารณา */\r\n const handleChangStatus = (val: reviewerCommentType.OptType) => {\r\n // if (val && val.value === '8') {\r\n // setIsRequired(true)\r\n // } else {\r\n // setIsRequired(false)\r\n // }\r\n // setTimeout(() => {\r\n // formRef.current.resetFieldState('remark')\r\n // })\r\n }\r\n\r\n const handleChangTextField = (val: string, idex: number) => {\r\n if (textRemaining?.length > 0) {\r\n textRemaining[idex] = 4000 - val.length\r\n }\r\n }\r\n\r\n const handleChangRemark = (val: string) => {\r\n if (textRemainingRemark) {\r\n setTextRemainingRemark(4000 - val.length)\r\n }\r\n }\r\n\r\n /**\r\n * process for save\r\n */\r\n\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const handleSubmitForm = async (val: any) => {\r\n const parameter = getParameterForSave(val)\r\n if (val.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n handleConfirmSave(parameter)\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n const getParameterForSave = (val: any) => {\r\n if (projectData && val) {\r\n let isDraft = false\r\n if (val.submitType === 'draft') {\r\n isDraft = true\r\n }\r\n const commentaryInfo = val?.commentDirector?.map((item: any) => {\r\n return {\r\n topicID: item && item?.id ? item?.id : null,\r\n contentHtml: item && item?.commentList?.contentHtml ? item?.commentList?.contentHtml : null,\r\n contentText: item && item?.commentList?.contentText ? item?.commentList?.contentText : null,\r\n }\r\n })\r\n const commentaryProjectRequest: CommentaryProjectType = {\r\n loginUserID: profileStore.profile.userId,\r\n submittedID: projectData?.submittedID,\r\n committeeUserID:\r\n profileStore.profile.userGroupId === constUserGroup.officer\r\n ? val && val.director && val.director.value\r\n ? parseInt(val?.director.value)\r\n : null\r\n : profileStore.profile.userId,\r\n approveStatusID:\r\n val && val.approveStatus && val.approveStatus.value ? parseInt(val?.approveStatus.value) : null,\r\n commentaryRemark: val && val.remark ? val.remark : null,\r\n commentaryInfo: commentaryInfo ? commentaryInfo : [],\r\n documentInfo: getDocumentInfo(val),\r\n isDraft: isDraft,\r\n }\r\n return commentaryProjectRequest\r\n }\r\n }\r\n\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: reviewerCommentType.UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n // const fileTokenInfo: Array = uploadObj.uploadFileObj.fileList?.map((file) => file.fileToken) ?? []\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n\r\n const handleConfirmSave = async (\r\n paramForSave: any,\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n dialogTwoRef.current?.closeDialog()\r\n const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.commentaryProject(paramForSave)\r\n\r\n if (checklistState.checklist.length > 0 && commentTitleList.length > 1) {\r\n const res2 = await callWebService.submitAllCheckList({\r\n ...checklistState,\r\n submittedID: projectData?.submittedID ?? 0,\r\n committeeID: paramForSave.committeeUserID,\r\n })\r\n\r\n if (res2.status === 1) {\r\n clearChecklist()\r\n }\r\n }\r\n\r\n if (!isFolder) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n if (tabIndex && newTabSelected) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n } else {\r\n //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n if (callbackSaveComplete) {\r\n if (res && res.status) {\r\n callbackSaveComplete(res.status, isDraft)\r\n }\r\n if (res && res.status === 1) {\r\n const formValue = formRef.current.getState().values\r\n // if (formValue && formValue.director) {\r\n // getCommentaryProjectCommitteeByID(parseInt(formValue.director.value))\r\n // }\r\n // if (formValue && profileStore.profile.userId) {\r\n // const directorID =\r\n // formValue && formValue.director\r\n // ? parseInt(formValue.director.value)\r\n // : profileStore.profile.userId\r\n // getCommentaryProjectCommitteeByID(directorID)\r\n // }\r\n\r\n if (profileStore?.profile.userId \r\n && checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? [])) {\r\n getCommentaryProjectCommitteeByID(profileStore?.profile.userId)\r\n }\r\n else {\r\n if (formValue && profileStore.profile.userId) {\r\n const directorID =\r\n formValue && formValue.director\r\n ? parseInt(formValue.director.value)\r\n : profileStore.profile.userId\r\n getCommentaryProjectCommitteeByID(directorID)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n /**\r\n *\r\n * Dirty\r\n */\r\n const handleDirtyChange = (props: { values: any }) => {\r\n let isDirty: boolean = false\r\n paramsRef.current = { ...props.values }\r\n //** ตอน checkdirty จะไม่สนใจ รายชื่อกรรมการและหน้าที่ **//\r\n let newFormValue = _.omit({ ...props.values }, ['director', 'role'])\r\n let initValue = _.omit({ ...initialValues, commentDirector: initialComment, uploadFile: initialUploadFile }, [\r\n 'director',\r\n 'role',\r\n ])\r\n //**********************************************************//\r\n const isEqual = _.isEqual(newFormValue, initValue) //ข้อมูลเท่ากัน\r\n\r\n if (!isViewMode && !initialValues?.isDisableFrm) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n // paramsRef.current = getParameterForSave(props.values)\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n const parameter = getParameterForSave(paramsRef.current)\r\n if (parameter) {\r\n parameter.isDraft = true\r\n handleConfirmSave(parameter, tabIndex, newTabSelected, isFolder)\r\n }\r\n }\r\n\r\n const checkIsDisplayCopyToClipboard = () => {\r\n let isDisplayCopyToClipboard = false\r\n if (projectData) {\r\n if (projectData?.stepID > submittedStep.commentary) {\r\n isDisplayCopyToClipboard = true\r\n } else {\r\n isDisplayCopyToClipboard = false\r\n }\r\n }\r\n return isDisplayCopyToClipboard\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const isGerneralCommittee = (lstCommitteeInProject: GetProjectResultType['committeeInfo']) => {\r\n let isValid = false\r\n const generalCommitteeIdx = lstCommitteeInProject.find((itm) => {\r\n return itm.userID === profileStore.profile.userId\r\n })\r\n if (generalCommitteeIdx) {\r\n isValid = generalCommitteeIdx.projectRoleInfo.value === committeeProjectRole.committee\r\n }\r\n\r\n return isValid\r\n }\r\n\r\n const getAllCommentaryForExport = async () => {\r\n if (projectData) {\r\n const { result } = await callWebService.getHistoryCommentaryProjectCommittee(projectData?.submittedID)\r\n const allCommentList = result.map((itm) => {\r\n if (itm.commentary.length === 1) {\r\n itm.commentary.forEach((comment) => {\r\n comment.nameTopicTH1 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n comment.nameTopicEN1 = 'Suggestion / Notice'\r\n comment.nameTopicTH2 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n comment.nameTopicEN2 = 'Suggestion / Notice'\r\n })\r\n }\r\n if (itm.historyCommentary.length === 1) {\r\n itm.historyCommentary.forEach((comment) => {\r\n comment.nameTopicTH1 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n comment.nameTopicEN1 = 'Suggestion / Notice'\r\n comment.nameTopicTH2 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n comment.nameTopicEN2 = 'Suggestion / Notice'\r\n })\r\n }\r\n\r\n return {\r\n userID: itm.userID,\r\n fullUsername_en: itm.fullUsername_en,\r\n fullUsername_th: itm.fullUsername_th,\r\n commentary: itm.commentary,\r\n updatedDate: itm.updatedDate,\r\n updateByNameTH: itm.updateByNameTH,\r\n updateByNameEN: itm.updateByNameEN,\r\n approveStatusName_th: itm.approveStatusName_th,\r\n approveStatusName_en: itm.approveStatusName_en,\r\n approveStatusID: itm.approveStatusID,\r\n historyCommentary: itm.historyCommentary,\r\n }\r\n })\r\n setDataSourceForExport(allCommentList)\r\n }\r\n }\r\n return {\r\n role: [],\r\n director,\r\n isViewMode,\r\n isCommittee: checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? []),\r\n isUserChairman: checkPermissionHook.isUserChairman(),\r\n isDeadlineOfGeneralCommittee:\r\n checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? []) &&\r\n isGerneralCommittee(projectData?.committeeInfo ?? []) &&\r\n isDeadlineRef.current,\r\n initialValues,\r\n commentTitleList,\r\n initialComment,\r\n configDialog,\r\n formRef,\r\n isShowSubComment,\r\n isRequired,\r\n textRemaining,\r\n textRemainingRemark,\r\n dataSourceForCopyToClipboard,\r\n documentTopic,\r\n initialUploadFile,\r\n isDisplayCopyToClipboard: checkIsDisplayCopyToClipboard(),\r\n projectData,\r\n showSaveDraft,\r\n onDirtyChange: handleDirtyChange,\r\n onChangeDirector: handleChangDirector,\r\n onChangStatus: handleChangStatus,\r\n onRefDialogTwo,\r\n onChangTextField: handleChangTextField,\r\n onChangRemark: handleChangRemark,\r\n onClickCancel: handleClickCancel,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n dataSourceForExport,\r\n dataForShowUpdateDate,\r\n }\r\n}\r\n\r\nexport default useReviewerComment\r\n","import React from 'react'\r\nimport * as reviewerCommentType from './reviewerCommentType'\r\n\r\nimport arrayMutators from 'final-form-arrays'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport ResultConsideration from '../../../shareUI/resultConsideration/resultConsideration'\r\nimport CommentDirector from '../../../shareUI/commentDirector/commentDirector'\r\nimport Autocomplete from '../../../../../control/autocomplete/autocomplete'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport useReviewerComment from './useReviewerComment'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport PageAction from '../pageAction'\r\nimport Button from '../../../../../control/button/button'\r\n\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport { Grid, makeStyles, useMediaQuery, useTheme } from '@material-ui/core'\r\nimport CopyToclipboard from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport ButtonSubmittedWithdraw from '../_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useChecklistStore from '../../../../../stores/checklist/useChecklistStore'\r\nimport ExportToMSWord from '../../../../../control/exportToMSWord/exportToMSWord'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport useCommentaryStore from '../../../../../stores/commentary/useCommentaryStore'\r\nimport { ChildType } from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\nconst ReviewerCommentREC1View: React.FC = (props) => {\r\n const {\r\n role,\r\n formRef,\r\n director,\r\n isViewMode,\r\n isCommittee,\r\n isUserChairman,\r\n isDeadlineOfGeneralCommittee,\r\n configDialog,\r\n initialValues,\r\n documentTopic,\r\n initialComment,\r\n commentTitleList,\r\n initialUploadFile,\r\n isDisplayCopyToClipboard,\r\n dataSourceForCopyToClipboard,\r\n projectData,\r\n showSaveDraft,\r\n dataSourceForExport,\r\n dataForShowUpdateDate,\r\n onSubmitForm,\r\n onClickCancel,\r\n onDirtyChange,\r\n onChangStatus,\r\n onRefDialogTwo,\r\n onChangeDirector,\r\n onClickBackToSearch,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n const classes = useStyles()\r\n const isDisable = initialValues?.isDisableFrm || isViewMode || isDeadlineOfGeneralCommittee\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const irb = projectData?.irb\r\n const { checklist } = useChecklistStore()\r\n const { selectedCommitteeID } = useCommentaryStore()\r\n let isAllChecklistChildSuccess: ChildType[] = []\r\n const isAllChecklistSuccess = checklist.map((item) => {\r\n if (Number(item.isAppropriate) === 1 || Number(item.isAppropriate) === 3) {\r\n return 'success'\r\n } else if (item.data.length > 0) {\r\n const resultParent = item.data.filter((itm) => itm.checked === true)\r\n item.data.forEach((itm) => {\r\n if (itm.children.length > 0) {\r\n const objTrue = itm.children.filter((child) => child.checked === true)\r\n if (objTrue.length > 0) {\r\n isAllChecklistChildSuccess.push(...objTrue)\r\n }\r\n }\r\n })\r\n return resultParent.length > 0 || isAllChecklistChildSuccess.length > 0 ? 'success' : 'unsuccess'\r\n } else {\r\n return 'unsuccess'\r\n }\r\n })\r\n const renderMainReviewer = (change: (name: F, value?: any) => void) => {\r\n return (\r\n \r\n \r\n {\r\n onChangeDirector(val, change)\r\n }}\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n return (\r\n <>\r\n {isDisplayCopyToClipboard && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n {(props) => {\r\n const { form, handleSubmit, dirty, invalid, errors } = props\r\n formRef.current = form\r\n return (\r\n \r\n \r\n {(!isCommittee || (isUserChairman && isViewMode)) && (\r\n \r\n \r\n \r\n {renderMainReviewer(form.change)}\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n {initialValues.isShowUpdateDate && (\r\n \r\n {translate.get('LABEL.UPDATER')} :\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? dataForShowUpdateDate?.nameTH\r\n : dataForShowUpdateDate?.nameEN}\r\n   \r\n {translate.get('LABEL.UPDATE_DATE')} :\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? convertDateToFormatTH(dataForShowUpdateDate?.date ?? '')\r\n : convertDateToFormatEN(dataForShowUpdateDate?.date ?? '')}\r\n \r\n )}\r\n\r\n {!isDisable && (\r\n \r\n {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n if (\r\n (commentTitleList.length > 1 &&\r\n !isAllChecklistSuccess.includes('unsuccess')) ||\r\n commentTitleList.length === 1\r\n ) {\r\n handleSubmit()\r\n }\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n if (\r\n commentTitleList.length > 1 &&\r\n isAllChecklistSuccess.includes('unsuccess')\r\n ) {\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M027'),\r\n type: 'error',\r\n })\r\n }\r\n }}\r\n onClickSaveDraft={\r\n showSaveDraft\r\n ? () => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }\r\n : undefined\r\n }\r\n />\r\n \r\n )}\r\n\r\n {isDisable && !isViewMode && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.CLOSE')}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n )\r\n}\r\n\r\nconst ReviewerCommentREC1: React.FC = (props) => {\r\n const useReviewerCommentModel = useReviewerComment(props)\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n grid: {\r\n marginBottom: '0px',\r\n },\r\n btnExport: {\r\n padding: '18px',\r\n },\r\n}))\r\n\r\nexport default ReviewerCommentREC1\r\n","import React from 'react'\r\nimport * as reviewerCommentType from './reviewerCommentType'\r\n\r\nimport arrayMutators from 'final-form-arrays'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport ResultConsideration from '../../../shareUI/resultConsideration/resultConsideration'\r\nimport CommentDirector from '../../../shareUI/commentDirector/commentDirector'\r\nimport Autocomplete from '../../../../../control/autocomplete/autocomplete'\r\nimport useReviewerComment from './useReviewerComment'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport PageAction from '../pageAction'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport Button from '../../../../../control/button/button'\r\n\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport { Grid, makeStyles, useMediaQuery, useTheme } from '@material-ui/core'\r\nimport CopyToclipboard from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport ButtonSubmittedWithdraw from '../_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useChecklistStore from '../../../../../stores/checklist/useChecklistStore'\r\nimport ExportToMSWord from '../../../../../control/exportToMSWord/exportToMSWord'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport useCommentaryStore from '../../../../../stores/commentary/useCommentaryStore'\r\nimport { ChildType } from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\nconst ReviewerCommentREC2View: React.FC = (props) => {\r\n const {\r\n role,\r\n formRef,\r\n director,\r\n isViewMode,\r\n isCommittee,\r\n isDeadlineOfGeneralCommittee,\r\n configDialog,\r\n initialValues,\r\n documentTopic,\r\n initialComment,\r\n commentTitleList,\r\n initialUploadFile,\r\n isDisplayCopyToClipboard,\r\n dataSourceForCopyToClipboard,\r\n projectData,\r\n showSaveDraft,\r\n dataSourceForExport,\r\n dataForShowUpdateDate,\r\n onSubmitForm,\r\n onClickCancel,\r\n onDirtyChange,\r\n onChangStatus,\r\n onRefDialogTwo,\r\n onChangeDirector,\r\n onClickBackToSearch,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n const classes = useStyles()\r\n const isDisable = initialValues?.isDisableFrm || isViewMode || isDeadlineOfGeneralCommittee\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const irb = projectData?.irb\r\n const { checklist } = useChecklistStore()\r\n const { selectedCommitteeID } = useCommentaryStore()\r\n let isAllChecklistChildSuccess: ChildType[] = []\r\n const isAllChecklistSuccess = checklist.map((item) => {\r\n if (Number(item.isAppropriate) === 1 || Number(item.isAppropriate) === 3) {\r\n return 'success'\r\n } else if (item.data.length > 0) {\r\n const resultParent = item.data.filter((itm) => itm.checked === true)\r\n item.data.forEach((itm) => {\r\n if (itm.children.length > 0) {\r\n const objTrue = itm.children.filter((child) => child.checked === true)\r\n if (objTrue.length > 0) {\r\n isAllChecklistChildSuccess.push(...objTrue)\r\n }\r\n }\r\n })\r\n return resultParent.length > 0 || isAllChecklistChildSuccess.length > 0 ? 'success' : 'unsuccess'\r\n } else {\r\n return 'unsuccess'\r\n }\r\n })\r\n const renderMainReviewer = (change: (name: F, value?: any) => void) => {\r\n return (\r\n \r\n \r\n {\r\n onChangeDirector(val, change)\r\n }}\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {isDisplayCopyToClipboard && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n {(props) => {\r\n const { form, handleSubmit, dirty, invalid, errors } = props\r\n formRef.current = form\r\n return (\r\n \r\n \r\n {!isCommittee && (\r\n \r\n \r\n \r\n {renderMainReviewer(form.change)}\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n {initialValues.isShowUpdateDate && (\r\n \r\n {translate.get('LABEL.UPDATER')} :\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? dataForShowUpdateDate?.nameTH\r\n : dataForShowUpdateDate?.nameEN}\r\n   \r\n {translate.get('LABEL.UPDATE_DATE')} :\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? convertDateToFormatTH(dataForShowUpdateDate?.date ?? '')\r\n : convertDateToFormatEN(dataForShowUpdateDate?.date ?? '')}\r\n \r\n )}\r\n\r\n {!isDisable && (\r\n \r\n {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n if (\r\n (commentTitleList.length > 1 &&\r\n !isAllChecklistSuccess.includes('unsuccess')) ||\r\n commentTitleList.length === 1\r\n ) {\r\n handleSubmit()\r\n }\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n if (\r\n commentTitleList.length > 1 &&\r\n isAllChecklistSuccess.includes('unsuccess')\r\n ) {\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M027'),\r\n type: 'error',\r\n })\r\n }\r\n }}\r\n onClickSaveDraft={\r\n showSaveDraft\r\n ? () => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }\r\n : undefined\r\n }\r\n />\r\n \r\n )}\r\n\r\n {isDisable && !isViewMode && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.CLOSE')}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n )\r\n}\r\n\r\nconst ReviewerCommentREC2: React.FC = (props) => {\r\n const useReviewerCommentModel = useReviewerComment(props)\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n grid: {\r\n marginBottom: '0px',\r\n },\r\n btnExport: {\r\n padding: '18px',\r\n },\r\n}))\r\n\r\nexport default ReviewerCommentREC2\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as memoMessageType from './memoMessageType'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { DataSourceType } from '../../../../../../control/treeCheckboxNew/treeCheckbox'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { dateForAPI } from '../../../../../../utilities/date'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport { validateModeAccordionError } from '../../../../../../utilities/validate'\r\n\r\nconst useMemoMessage = (props: memoMessageType.UseMemoMessageType) => {\r\n const { onSaveComplete } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const editRef = React.useRef()\r\n const callLookup = useLookupService()\r\n\r\n const [isCheckedOther, setIsCheckedOther] = React.useState(false)\r\n const [initialSuggestionNotice, setInitialSuggestionNotice] = React.useState()\r\n const [initialMemoMessagePaper, setInitialMemoMessagePaper] = React.useState<{\r\n TH: InitialRichTextEditorType\r\n EN: InitialRichTextEditorType\r\n }>()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n const [approveStatus, setApproveStatus] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getApproveStatus()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getApproveStatus = async () => {\r\n let res\r\n if (projectData?.irb) {\r\n res = await callLookup.callApproveStatusLut(\r\n projectData?.irb,\r\n constSubmittedType.firstSubmitConsideration_notScope,\r\n )\r\n if (res) {\r\n const formatedData = res?.result?.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n }) as []\r\n setApproveStatus(formatedData)\r\n }\r\n }\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n const res = await callWebService.getProjectNotPeopleMemoMessage(submittedID)\r\n const result = res.result\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n // approveStatus:\r\n // result && result?.approveStatusInfo\r\n // ? {\r\n // label:\r\n // translate.languageStore.currentLanguage === translate.languageKey.th\r\n // ? result?.approveStatusInfo.nameTH\r\n // : result?.approveStatusInfo.nameEN,\r\n // value: result?.approveStatusInfo.value.toString(),\r\n // }\r\n // : null,\r\n }\r\n const initialSugestionNotice = {\r\n contentHtml: result?.memoMessageComment_html ?? '',\r\n contentText: result?.memoMessageComment ?? '',\r\n }\r\n const initialMemoMessagePaper = {\r\n TH: {\r\n contentHtml: result?.memoMessagePaper_th_html,\r\n contentText: result?.memoMessagePaper_th,\r\n },\r\n EN: {\r\n contentHtml: result?.memoMessagePaper_en_html,\r\n contentText: result?.memoMessagePaper_en,\r\n },\r\n }\r\n\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n setInitialSuggestionNotice(initialSugestionNotice)\r\n setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.unSignPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.unSignPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n let param: REQServiceType.ProjectNotPeopleMemoMessageType = {\r\n submittedID: submittedID,\r\n comment: value?.suggestionNotice?.contentText,\r\n comment_html: value?.suggestionNotice?.contentHtml,\r\n memoMessagePaper_th: value?.memoMessagePaper_TH?.contentText,\r\n memoMessagePaper_en: value?.memoMessagePaper_EN?.contentText,\r\n memoMessagePaper_th_html: value?.memoMessagePaper_TH?.contentHtml,\r\n memoMessagePaper_en_html: value?.memoMessagePaper_EN?.contentHtml,\r\n memoMessageDate: value?.memoMessageDate ? dateForAPI(value?.memoMessageDate) ?? null : null,\r\n // approveStatusID: value?.approveStatus?.value ?? null,\r\n isDraft: isDraft,\r\n }\r\n\r\n return param\r\n }\r\n\r\n const handleDirtyChange = (props: any) => {\r\n let isDirty: boolean = false\r\n let newFormValue = _.omit(props.values, ['submitType', 'memorandumFile'])\r\n let initValue = _.omit(\r\n {\r\n ...initialValues,\r\n memoMessagePaper_TH: initialMemoMessagePaper?.TH,\r\n memoMessagePaper_EN: initialMemoMessagePaper?.EN,\r\n suggestionNotice: initialSuggestionNotice,\r\n },\r\n ['submitType', 'memorandumFile'],\r\n )\r\n\r\n const isEqual = _.isEqual(initValue, newFormValue)\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft = true\r\n const param: REQServiceType.ProjectNotPeopleMemoMessageType = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleSubmitForm = (value: any) => {\r\n // if (projectData?.projectID && projectData?.submittedID) {\r\n // let isReviewer = false\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param: REQServiceType.ProjectNotPeopleMemoMessageType = getSaveServiceParameter(isDraft)\r\n if (isDraft) {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.ProjectNotPeopleMemoMessageType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n try {\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.projectNotPeopleMemoMessage(param)\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('(submittFistConsideration) => useMemoMessage.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleClickCheckbox = (selectedItem: DataSourceType) => {\r\n if (selectedItem.id === 4) {\r\n setIsCheckedOther(!isCheckedOther)\r\n }\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n const handleChangeStatus = () => {}\r\n\r\n const updateMemoMessage = async (param: REQServiceType.UpdateMemoMessageType) => {\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.updateMemoMessagePaper(param)\r\n\r\n if (res.result.status === 200) {\r\n dialogRef.current?.openDialog()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n setConfigDialog({})\r\n },\r\n })\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleSubmitUpdateMemo = (fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formRef.current)\r\n return new Promise(async (resolve, reject) => {\r\n if (isError) {\r\n formRef.current?.form.submit()\r\n reject('')\r\n } else {\r\n resolve('')\r\n const param: REQServiceType.UpdateMemoMessageType = {\r\n submittedID: Number(projectData?.submittedID),\r\n memoMessagePaperTH: formRef.current?.values.memoMessagePaper_TH?.contentText,\r\n memoMessagePaperEN: formRef.current?.values.memoMessagePaper_EN?.contentText,\r\n memoMessagePaperTHHTML: formRef.current?.values.memoMessagePaper_TH?.contentHtml,\r\n memoMessagePaperENHTML: formRef.current?.values.memoMessagePaper_EN?.contentHtml,\r\n }\r\n\r\n updateMemoMessage(param)\r\n }\r\n })\r\n }\r\n\r\n const handleCancle = () => {\r\n const valueMessageTH: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_TH`]?.contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_TH`]?.contentText,\r\n }\r\n const valueMessageEN: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_EN`]?.contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_EN`]?.contentText,\r\n }\r\n setInitialMemoMessagePaper((prev) => ({\r\n TH: {\r\n ...prev?.TH,\r\n ...valueMessageTH,\r\n },\r\n EN: {\r\n ...prev?.EN,\r\n ...valueMessageEN,\r\n },\r\n }))\r\n }\r\n\r\n const onClickEdit = () => {\r\n editRef.current = formRef.current?.form.getState().values\r\n }\r\n return {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n approveStatus,\r\n initialValues,\r\n isCheckedOther,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialSuggestionNotice,\r\n initialMemoMessagePaper,\r\n\r\n onRefDialog,\r\n onDirtyChange: handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCheckbox: handleClickCheckbox,\r\n onClickOpenFile: handleClickOpenFile,\r\n onChangeStatus: handleChangeStatus,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n }\r\n}\r\n\r\nexport default useMemoMessage\r\n","import * as memoMessageType from './memoMessageType'\r\nimport useMemoMessage from './useMemoMessage'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport MyDatePicker from '../../../../../../control/datepicker/datepicker'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\nimport { richEditorRequired } from '../../../../../../utilities/validate'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemoMessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialMemoMessagePaper,\r\n initialSuggestionNotice,\r\n onRefDialog,\r\n onSubmitForm,\r\n onDirtyChange,\r\n onClickOpenFile,\r\n onClickBackToSearch,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const latestFolderIdx = 0\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n const isEdit = isViewMode && currentSelectFolder\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n

\\n'\r\n ? [richEditorRequired(translate.get('MESSAGE.M015'))]\r\n : []\r\n }\r\n />\r\n
\r\n
\r\n )\r\n }\r\n // ส่งพิจารณาครั้งแรก\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_TH']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_TH'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n \r\n \r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_EN']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_EN'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n {/* \r\n \r\n \r\n \r\n */}\r\n\r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemoMessageCtrl = (props: memoMessageType.MemoMessageCtrlType) => {\r\n const memoMessageModel = useMemoMessage(props)\r\n return \r\n}\r\nexport default MemoMessageCtrl\r\n","import React from 'react'\r\nimport { fileExt as fileExtConst, topicForLecturer, topicForStudent } from '../../../../../constants/constants'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as synthesisReviewType from './synthesisReviewType'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\n\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { requestWebServiceTypes } from '../../../../../services/web/types'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport {\r\n DocumentInfo,\r\n SynthesisReviewInfo,\r\n SynthesisReviewRemarkInfo,\r\n} from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport path from 'path'\r\nimport useProjectHook from '../../../shareLogic/useProjectHook'\r\nimport {\r\n SynthesisReviewProjectRequestType,\r\n UpdateFileStampRequestType,\r\n} from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport { TabSelectedType } from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport { FormApi } from 'final-form'\r\nimport _ from 'lodash'\r\n\r\nconst useSynthesisReview = (props: synthesisReviewType.UseSynthesisReviewType) => {\r\n const { callbackSaveComplete } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const projectHook = useProjectHook()\r\n\r\n const projectData = manageProjectStore.projectData\r\n const loadingHook = useLoading()\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const profileStore = authenStore()\r\n const { profile } = profileStore\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const history = useHistory()\r\n const [initialComment, setInitialComment] = React.useState([])\r\n const [synthesisReviewInfoList, setSynthesisReviewInfo] = React.useState([])\r\n const [isLoadedSynthesisReview, setIsLoadedSynthesisReview] = React.useState(false)\r\n const [synthesisReviewRemarkInfoList, setSynthesisReviewRemarkInfo] = React.useState()\r\n const [documentInfoList, setDocumentInfo] = React.useState([])\r\n const [approveStatus, setApproveStatus] = React.useState()\r\n const [initialRichTextEditor, setInitialRichTextEditor] = React.useState([])\r\n const [initialCommentRichTextEditor, setInitialCommentRichTextEditor] = React.useState([])\r\n const [initialRichRemark, setInitialRichRemark] = React.useState()\r\n const [isEditStampFile, setIsEditting] = React.useState(!isViewMode)\r\n\r\n const formValues = React.useRef()\r\n const tabAndFolderHook = useFolderAndTab()\r\n\r\n React.useEffect(() => {\r\n getSynthesisReviewData()\r\n getSynthesisData()\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n if (Number(projectData?.stepID) > 8) {\r\n createInitialRichTextEditor()\r\n }\r\n createInitialData()\r\n createInitialComment()\r\n createInitialRichRemark()\r\n }, [isLoadedSynthesisReview])\r\n\r\n React.useEffect(() => {\r\n createInitialComment()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const handleDirtyChange = (props: any, formRef: FormApi>) => {\r\n formValues.current = { ...props.values }\r\n let isDirty: boolean = false\r\n //** จัดformat initValue และ Form Value เพื่อเตรียมตัวนำไปใช้เปรียบเทียบค่า **//\r\n const documentSelected = documentInfoList.filter((item) => item.isCheckAll === true)\r\n let newFormValue = { ...props.values }\r\n if (documentSelected.length > 0) {\r\n newFormValue.documentCertificate = {\r\n childSelected: _.flattenDeep(documentSelected.map((itm) => itm.fileInfo)),\r\n parentSelected: documentSelected,\r\n }\r\n }\r\n let initValue = { ...formRef.getState().initialValues }\r\n initValue.commentDirector = initValue.commentDirector?.map((data: any, idx: number) => ({\r\n ...data,\r\n consideration: initialRichTextEditor[idx],\r\n commentList: initialRichTextEditor[idx],\r\n }))\r\n initValue.remark = initialRichRemark\r\n\r\n //**********************************************************//\r\n const isEqual = _.isEqual(newFormValue, initValue) //ข้อมูลเท่ากัน\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n } else {\r\n isDirty = false\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n const parameter = getParameterForSave(formValues.current)\r\n if (parameter) {\r\n parameter.isDraft = true\r\n handleConfirmSave(parameter, tabIndex, newTabSelected, isFolder)\r\n }\r\n }\r\n\r\n const getParameterForSave = (val: synthesisReviewType.TFormValue) => {\r\n let paramForSave = null\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n let isDraft = false\r\n if (val.submitType === 'draft') {\r\n isDraft = true\r\n }\r\n let isApproveWithCommentFlow\r\n if (manageProjectStore?.projectData) {\r\n isApproveWithCommentFlow = projectHook.isFlowApproveWithComment(manageProjectStore?.projectData)\r\n }\r\n\r\n const isNotHaveStampFileList =\r\n val?.documentCertificate?.childSelected?.length === 0 &&\r\n val?.documentCertificate?.parentSelected?.length === 0\r\n\r\n if (isApproveWithCommentFlow) {\r\n const synthesisReviewProjectRequest: requestWebServiceTypes.SynthesisReviewApproveWithCommentType = {\r\n loginUserID: profile.userId,\r\n submittedID: submittedID,\r\n stampFileList: isNotHaveStampFileList ? null : val.documentCertificate,\r\n isDraft: isDraft,\r\n }\r\n paramForSave = synthesisReviewProjectRequest\r\n } else {\r\n const synthesisReviewProjectRequest: requestWebServiceTypes.SynthesisReviewProjectRequestType = {\r\n loginUserID: profile.userId,\r\n submittedID: submittedID,\r\n synthesisReviewInfo: val.commentDirector?.map((itm: any) => {\r\n return {\r\n commentaryTopicId: itm.id,\r\n comment:\r\n itm.consideration && itm.consideration.contentText ? itm.consideration.contentText : null,\r\n comment_htmltag:\r\n itm.consideration && itm.consideration.contentHtml ? itm.consideration.contentHtml : null,\r\n }\r\n }),\r\n stampFileList: isNotHaveStampFileList ? null : val.documentCertificate,\r\n synthesisReviewRemarkInfo: {\r\n remark: val.remark && val.remark.contentText ? val.remark.contentText : null,\r\n remark_htmltag: val.remark && val.remark.contentHtml ? val.remark.contentHtml : null,\r\n },\r\n isDraft: isDraft,\r\n }\r\n paramForSave = synthesisReviewProjectRequest\r\n }\r\n return paramForSave\r\n }\r\n\r\n const handleSubmitForm = async (val: synthesisReviewType.TFormValue) => {\r\n const parameter = getParameterForSave(val)\r\n if (val.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n handleConfirmSave(parameter)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n\r\n const handleClickEditStampFile = async () => {\r\n setIsEditting(true)\r\n }\r\n\r\n const handleCancelEditStampFile = async () => {\r\n setIsEditting(false)\r\n dialogRef.current?.closeDialog()\r\n }\r\n\r\n const handleSaveEditStampFile = async () => {\r\n setIsEditting(false)\r\n dialogRef.current?.closeDialog()\r\n\r\n loadingHook.loadingOpen()\r\n const parameter = getParameterForSave(formValues.current) as UpdateFileStampRequestType\r\n let res = await callWebService.updateFileStamp(parameter)\r\n\r\n if (callbackSaveComplete) {\r\n if (res && res.status) {\r\n callbackSaveComplete(res.status, false)\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleConfirmSave = async (\r\n paramForSave:\r\n | requestWebServiceTypes.SynthesisReviewProjectRequestType\r\n | requestWebServiceTypes.SynthesisReviewApproveWithCommentType,\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n let isApproveWithCommentFlow\r\n if (manageProjectStore?.projectData) {\r\n // isEditAfterReview = projectHook.isEditAfterReview(manageProjectStore?.projectData)\r\n isApproveWithCommentFlow = projectHook.isFlowApproveWithComment(manageProjectStore?.projectData)\r\n }\r\n dialogRef.current?.closeDialog()\r\n\r\n const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n loadingHook.loadingOpen()\r\n let res\r\n if (isApproveWithCommentFlow) {\r\n const param = { ...paramForSave } as SynthesisReviewProjectRequestType\r\n res = await callWebService.synthesisReviewApproveWithCommentProject(param)\r\n } else {\r\n const param = { ...paramForSave } as requestWebServiceTypes.SynthesisReviewProjectRequestType\r\n res = await callWebService.synthesisReviewProject(param)\r\n }\r\n\r\n if (!isFolder) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n if (tabIndex && newTabSelected) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n } else {\r\n //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n if (callbackSaveComplete) {\r\n if (res && res.status) {\r\n callbackSaveComplete(res.status, isDraft)\r\n }\r\n }\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const getSynthesisData = async () => {\r\n if (projectData) {\r\n loadingHook.loadingOpen()\r\n const submittedID = projectData.submittedID\r\n const { result } = await callWebService.getSynthesisProjectByID(submittedID)\r\n loadingHook.loadingClose()\r\n\r\n if (result) {\r\n const approveStatus = {\r\n id: result.approveStatusID,\r\n nameTH: result.approveStatusName_th,\r\n nameEN: result.approveStatusName_en,\r\n }\r\n setApproveStatus(approveStatus)\r\n }\r\n\r\n const commentList = result.synthesisInfo.map((item) => {\r\n let comment: { contentHtml: string | null; contentText: string | null } = {\r\n contentHtml: '',\r\n contentText: '',\r\n }\r\n comment.contentText = item.comment.contentText ?? null\r\n comment.contentHtml = item.comment.contentHtml ?? null\r\n return comment\r\n })\r\n setInitialCommentRichTextEditor(commentList)\r\n // if (projectData.stepID === 8) {\r\n // setInitialRichTextEditor(commentList)\r\n // }\r\n }\r\n }\r\n\r\n const getSynthesisReviewData = async () => {\r\n if (projectData) {\r\n setIsLoadedSynthesisReview(false)\r\n loadingHook.loadingOpen()\r\n const submittedID = projectData.submittedID\r\n const data = await callWebService.getSynthesisReview(submittedID)\r\n loadingHook.loadingClose()\r\n if (data.status === 1) {\r\n let documentInfo = [...data.result.documentInfo]\r\n documentInfo.forEach((itm) => {\r\n const topicID = itm.topicID\r\n let isCheckAll: boolean | null = null\r\n itm.fileInfo.forEach((file) => {\r\n file.topicID = topicID\r\n if (path.extname(`${file.filename}`) === fileExtConst.pdf) {\r\n if (file.isStamp && isCheckAll !== false) {\r\n isCheckAll = true\r\n } else {\r\n isCheckAll = false\r\n }\r\n }\r\n })\r\n itm.isCheckAll = isCheckAll\r\n })\r\n // BUG IS STAMP ออกมาเป็น false หมดเลย\r\n // setApproveStatus(data?.result?.approveStatusName_th)\r\n // setDocumentInfo(data.result.documentInfo)\r\n\r\n const commentList = data.result.synthesisReviewInfo.map((item) => {\r\n let comment: { contentHtml: string | null; contentText: string | null } = {\r\n contentHtml: '',\r\n contentText: '',\r\n }\r\n comment.contentText = item.synthesisReviewComment ?? null\r\n comment.contentHtml = item.synthesisReviewCommentHtmlTag ?? null\r\n return comment\r\n })\r\n setInitialRichTextEditor(commentList)\r\n\r\n filterTopicUpload(documentInfo)\r\n // setDocumentInfo(documentInfo)\r\n setSynthesisReviewInfo(data.result.synthesisReviewInfo)\r\n setSynthesisReviewRemarkInfo(data.result.synthesisReviewRemarkInfo)\r\n setIsLoadedSynthesisReview(true)\r\n }\r\n }\r\n }\r\n\r\n const filterTopicUpload = (documentTopic: DocumentInfo[]) => {\r\n let docTopic: DocumentInfo[] = []\r\n const researcherTypeID = projectData?.researcherTypeInfo.value\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = documentTopic?.filter((item: any) => {\r\n return item.topicID !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item: any) => {\r\n return item.topicID !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, topicNo: index + 1 }\r\n })\r\n }\r\n setDocumentInfo(docTopic)\r\n }\r\n }\r\n\r\n const createInitialComment = () => {\r\n const commentInit = synthesisReviewInfoList?.map((itm: any) => {\r\n return {\r\n topic:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.topicName_th\r\n : itm.topicName_en,\r\n id: itm.topicID,\r\n no: itm.topicNo,\r\n commentList: {\r\n contextHtml: itm.synthesisReviewCommentHtmlTag ?? '',\r\n contentText: itm.synthesisReviewComment ?? '',\r\n },\r\n }\r\n })\r\n setInitialComment(commentInit)\r\n }\r\n\r\n const createInitialData = () => {\r\n const { childSelectedList, parentSelectedList } = getInitialChildSelected()\r\n\r\n const initialData = {\r\n documentCertificate: {\r\n childSelected: childSelectedList,\r\n parentSelected: parentSelectedList,\r\n },\r\n commentRemarkList:\r\n synthesisReviewRemarkInfoList && synthesisReviewRemarkInfoList.synthesisRemark\r\n ? synthesisReviewRemarkInfoList.synthesisRemark\r\n : '-',\r\n remarkList:\r\n synthesisReviewRemarkInfoList && synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n : '-',\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const getInitialChildSelected = () => {\r\n let childSelectedList: any = []\r\n let parentSelectedList: any = []\r\n documentInfoList.forEach((documentItm) => {\r\n if (documentItm.fileInfo.length > 0) {\r\n documentItm.fileInfo.forEach((file) => {\r\n if (file.isStamp) {\r\n childSelectedList.push(file)\r\n }\r\n })\r\n }\r\n if (documentItm.isCheckAll) {\r\n parentSelectedList.push(documentItm)\r\n }\r\n })\r\n\r\n return { parentSelectedList, childSelectedList }\r\n }\r\n\r\n const setDocInfoList = () => {\r\n let initFileLang: synthesisReviewType.SelectedListWithLangType[] = []\r\n documentInfoList.forEach((dataItm: any) => {\r\n dataItm.fileInfo.forEach((file: any) => {\r\n initFileLang.push({\r\n fileID: file?.fileID,\r\n language: file?.language ? file?.language : 'th',\r\n })\r\n })\r\n })\r\n\r\n return initFileLang\r\n }\r\n\r\n const createInitialRichTextEditor = () => {\r\n const initialData = synthesisReviewInfoList.map((itm) => {\r\n return {\r\n contentHtml: itm.synthesisReviewCommentHtmlTag\r\n ? itm.synthesisReviewCommentHtmlTag\r\n : itm.synthesisComment,\r\n contentText: itm.synthesisReviewComment,\r\n }\r\n })\r\n setInitialRichTextEditor(initialData)\r\n }\r\n\r\n const createInitialRichRemark = () => {\r\n const initialData = {\r\n contentHtml: isViewMode\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html ?? ''\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html ?? ''\r\n : '-'\r\n : synthesisReviewRemarkInfoList?.synthesisReviewRemark_html ?? ''\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html ?? ''\r\n : synthesisReviewRemarkInfoList?.synthesisRemark ?? '',\r\n contentText: synthesisReviewRemarkInfoList?.synthesisReviewRemark ?? '',\r\n }\r\n\r\n setInitialRichRemark(initialData)\r\n }\r\n\r\n return {\r\n approveStatus,\r\n initialValues,\r\n projectData,\r\n initialComment,\r\n documentInfoList,\r\n initialRichTextEditor,\r\n initialCommentRichTextEditor,\r\n initialRichRemark,\r\n isViewMode,\r\n isFlowApproveWithComment: projectData ? projectHook.isFlowApproveWithComment(projectData) : false,\r\n configDialog,\r\n isShowUpdateDate,\r\n onRefDialog,\r\n onSubmitForm: handleSubmitForm,\r\n handleDirtyChange: handleDirtyChange,\r\n onClickCancel: handleClickCancel,\r\n isEditStampFile,\r\n clickEditStampFile: handleClickEditStampFile,\r\n cancelEditStampFile: handleCancelEditStampFile,\r\n saveEditStampFile: handleSaveEditStampFile,\r\n }\r\n}\r\n\r\nexport default useSynthesisReview\r\n","import { useField } from 'react-final-form'\r\nimport { composeValidators, selectRequired } from '../../utilities/validate'\r\nimport {} from './/treeCheckboxType'\r\n\r\nexport type FieldRequired = boolean | { showAsterisk?: boolean; triggedValidate?: boolean; errorMessage?: string }\r\n\r\nfunction useTreeCheckbox(props: any) {\r\n const { name, required, validates = [] } = props\r\n let mergeValidate = validates\r\n if ((typeof required === 'boolean' && required) || (typeof required === 'object' && required.triggedValidate)) {\r\n mergeValidate = [\r\n selectRequired(typeof required === 'object' ? required.errorMessage : undefined),\r\n ...mergeValidate,\r\n ]\r\n }\r\n /* Validate */\r\n const field = useField(name, {\r\n validate: composeValidators(...mergeValidate),\r\n })\r\n\r\n return { field }\r\n}\r\n\r\nexport default useTreeCheckbox\r\n","import React from 'react'\r\nimport useTreeCheckbox from './useTreeCheckbox'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport List from '@material-ui/core/List'\r\nimport ListItem from '@material-ui/core/ListItem'\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon'\r\nimport ListItemText from '@material-ui/core/ListItemText'\r\nimport Collapse from '@material-ui/core/Collapse'\r\nimport Checkbox from '@material-ui/core/Checkbox'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Typography } from '@material-ui/core'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff'\r\nimport { NewReturnListFileType } from '../../component/web/shareUI/uploadDoc/uploadFile/uploadFileType'\r\nimport Radio from '@material-ui/core/Radio'\r\nimport RadioGroup from '@material-ui/core/RadioGroup'\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel'\r\n\r\nimport path from 'path'\r\nimport { fileExt as fileExtConst } from '../../constants/constants'\r\ntype FileInfoType = {\r\n topicID: number\r\n fileID: number\r\n fileToken: string\r\n filename: string\r\n isStamp: boolean\r\n path: string\r\n}[]\r\nexport type DataSourceType = {\r\n topicCode: null | string\r\n topicID: number\r\n topicName_en: string\r\n topicName_th: string\r\n topicNo: number\r\n subtopicInfo?: []\r\n fileInfo: FileInfoType[]\r\n}\r\ntype SelectedListWithLangType = { fileID: number; language: string }\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n // maxWidth: 360,\r\n backgroundColor: theme.palette.background.paper,\r\n },\r\n nested: {\r\n paddingLeft: theme.spacing(4),\r\n },\r\n}))\r\nlet TreeCheckboxView: React.FC = ({\r\n dataSource,\r\n field,\r\n required,\r\n disabled,\r\n isLangTH = true,\r\n labelRadioTH = 'ไทย',\r\n labelRadioEN = 'อังกฤษ',\r\n onClickFile,\r\n ...other\r\n}) => {\r\n const { input, meta } = field\r\n\r\n const classes = useStyles()\r\n\r\n const [open, setOpen] = React.useState(true)\r\n const [selectedList, setSelectedList] = React.useState({\r\n parentSelected: [],\r\n childSelected: [],\r\n })\r\n const [selectedListWithLang, setSelectedListWithLang] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n // console.log('meta.initial : ', meta.initial)\r\n if (meta.initial) {\r\n if (meta.initial.childSelected.length > 0 || meta.initial.parentSelected.length > 0) {\r\n setSelectedList({\r\n ...selectedList,\r\n childSelected: meta.initial.childSelected,\r\n parentSelected: meta.initial.parentSelected,\r\n })\r\n\r\n //set initial value in final-form\r\n const formChange = meta.initial.childSelected.map((itm: any) => ({\r\n fileID: itm?.fileID,\r\n language: itm?.language || 'th',\r\n }))\r\n input.onChange(formChange)\r\n }\r\n }\r\n }, [meta.initial])\r\n\r\n React.useEffect(() => {\r\n // 'ทำ initial ภาษา '\r\n let initFileLang: SelectedListWithLangType[] = []\r\n\r\n if (dataSource && dataSource.length > 0) {\r\n dataSource.forEach((dataItm: any) => {\r\n dataItm.fileInfo.forEach((file: any) => {\r\n initFileLang.push({\r\n fileID: file?.fileID,\r\n language: file?.language ? file?.language : 'th',\r\n })\r\n })\r\n })\r\n }\r\n setSelectedListWithLang(initFileLang)\r\n }, [dataSource])\r\n\r\n const handleClick = () => {\r\n setOpen(!open)\r\n }\r\n const isParentCheckedFn = (data: any) => {\r\n const { parentSelected, childSelected } = selectedList\r\n const isChecked = parentSelected.filter((itm: any) => itm.topicID === data.topicID).length > 0\r\n\r\n return isChecked\r\n }\r\n\r\n const isChildrenCheckedFn = (data: any) => {\r\n const { childSelected } = selectedList\r\n const isChecked = childSelected.filter((itm: any) => itm.fileID === data.fileID).length > 0\r\n\r\n return isChecked\r\n }\r\n const isAllChildCheckedFn = (topicID: number) => {\r\n const { childSelected } = selectedList\r\n const topicData = dataSource.filter((itm: any) => itm.topicID === topicID)\r\n\r\n const allChildNum = topicData.length > 0 ? topicData[0].fileInfo.length : 0 //จำนวนลูกทั้งหมดที่มี\r\n const currentChildSelectedNum = childSelected.filter((itm: any) => itm.topicID === topicID).length + 1 //จำนวนลูกทั้งหมดที่ถูกติ๊กเลือกอยู่\r\n\r\n const isAllChildChecked = allChildNum === currentChildSelectedNum ? true : false\r\n\r\n return isAllChildChecked\r\n }\r\n\r\n const setSelectedFileWithLang = (newSelectedList: any[]) => {\r\n // กรณีติ๊กเลือกไฟล์ก่อนเลือกภาษาจะ set default ภาษา ให้เป็น TH //\r\n //@ts-ignore\r\n const fileIDSelectedLst = newSelectedList.childSelected.map((itm: any) => itm.fileID)\r\n const filtered = selectedListWithLang?.filter(function (e: any, index: number) {\r\n return fileIDSelectedLst.indexOf(e.fileID) > -1\r\n })\r\n let newLangValue = []\r\n if (filtered.length === 0) {\r\n newLangValue = fileIDSelectedLst.map((fileID: number) => {\r\n return {\r\n fileID: fileID,\r\n language: 'TH',\r\n }\r\n })\r\n }\r\n const newSelectedListWithLang = [...selectedListWithLang, ...newLangValue]\r\n return newSelectedListWithLang\r\n }\r\n const getFilterChildDataOnlyPdf = (childDataList: any) => {\r\n const filterChildDataList = childDataList.filter((itm: any) => {\r\n return path.extname(`${itm.filename}`) === fileExtConst.pdf\r\n })\r\n return filterChildDataList\r\n }\r\n const handleCheckedParent = (data: any) => () => {\r\n const { parentSelected, childSelected } = selectedList\r\n const isChecked = isParentCheckedFn(data)\r\n let newSelectedList = {}\r\n // --- case 1 มีการติ๊กอยู่ (ให้เอาติ๊กออกพร้อมกับเอาติ๊กลูกออกทั้งหมด) --- //\r\n if (isChecked) {\r\n const newParentList = parentSelected.filter((itm: any) => itm.topicID !== data.topicID)\r\n const newChildList = childSelected.filter((itm: any) => itm.topicID !== data.topicID)\r\n newSelectedList = {\r\n ...selectedList,\r\n parentSelected: newParentList,\r\n childSelected: newChildList, //[...childSelected, ...newChildList],\r\n }\r\n }\r\n\r\n // --- case 2 ไม่ได้ติ๊กอยู่ (ให้ติ๊กพร้อมกับติ๊กลูกทั้งหมด) --- //\r\n else {\r\n newSelectedList = {\r\n ...selectedList,\r\n parentSelected: [...parentSelected, { ...data }],\r\n childSelected: [...childSelected, ...data.fileInfo],\r\n }\r\n }\r\n\r\n //กรณีติ๊กเลือก all ต้องไป filter เอาเฉพาะไฟล์ pdf มาก่อน\r\n const filterdDataOnlyPdf = {\r\n ...newSelectedList,\r\n //@ts-ignore\r\n childSelected: getFilterChildDataOnlyPdf(newSelectedList?.childSelected),\r\n }\r\n //@ts-ignore\r\n const newSelectedListWithLang = setSelectedFileWithLang(filterdDataOnlyPdf)\r\n setSelectedListWithLang(newSelectedListWithLang)\r\n //@ts-ignore\r\n setSelectedList(filterdDataOnlyPdf)\r\n changeInputValue(filterdDataOnlyPdf, newSelectedListWithLang)\r\n }\r\n\r\n const handleCheckedChild = (data: any) => () => {\r\n const { parentSelected, childSelected } = selectedList\r\n\r\n const isChecked = isChildrenCheckedFn(data)\r\n const isAllChildChecked = isAllChildCheckedFn(data.topicID)\r\n let newSelectedList = {}\r\n\r\n // --- case 1 มีการติ๊กอยู่ (ให้เอาติ๊กออกพร้อมกับเอาติ๊กพ่อออก) --- //\r\n if (isChecked) {\r\n const newParentList = parentSelected.filter((itm: any) => itm.topicID !== data.topicID)\r\n const newChildList = childSelected.filter((itm: any) => itm.fileID !== data.fileID)\r\n newSelectedList = {\r\n ...selectedList,\r\n parentSelected: newParentList,\r\n childSelected: newChildList,\r\n }\r\n }\r\n\r\n // --- case 2 ไม่ได้ติ๊กอยู่ (ให้ติ๊กพร้อมกับเช็คว่าลูกทั้งหมดถูกติ๊กอยู่หรือไม่) --- //\r\n else {\r\n const newParentList = dataSource.filter((itm: any) => itm.topicID === data.topicID)\r\n\r\n if (isAllChildChecked) {\r\n // true => ถ้าลูกทั้งหมดถูกติ๊กอยู่ให้ติ๊กพ่อด้วย\r\n newSelectedList = {\r\n ...selectedList,\r\n parentSelected: [...parentSelected, ...newParentList],\r\n childSelected: [...childSelected, { ...data }],\r\n }\r\n } else {\r\n // false => ถ้าลูกไม่ได้ถูกติ๊กทั้งหมดไม่ต้องทำอะไรกับพ่อ\r\n newSelectedList = {\r\n ...selectedList,\r\n childSelected: [...childSelected, { ...data }],\r\n }\r\n }\r\n }\r\n\r\n //@ts-ignore\r\n const newSelectedListWithLang = setSelectedFileWithLang(newSelectedList)\r\n //@ts-ignore\r\n setSelectedList(newSelectedList)\r\n // changeInputValue(newSelectedList, selectedListWithLang)\r\n setSelectedListWithLang(newSelectedListWithLang)\r\n changeInputValue(newSelectedList, newSelectedListWithLang)\r\n }\r\n\r\n const changeInputValue = (newSelectedList: any, langValueList: any) => {\r\n let dataForReturn\r\n const fileIDSelectedLst = newSelectedList.childSelected.map((itm: any) => itm.fileID)\r\n const filtered = langValueList?.filter(function (e: any, index: number) {\r\n return fileIDSelectedLst.indexOf(e.fileID) > -1\r\n })\r\n dataForReturn = filtered\r\n\r\n input.onChange(dataForReturn)\r\n }\r\n\r\n const renderIcon = (filename: any) => {\r\n const fileExt = path.extname(`${filename || ''}`)\r\n let iconPath = ''\r\n switch (fileExt) {\r\n case fileExtConst.pdf:\r\n iconPath = '/img/icons/pdf.png'\r\n break\r\n case fileExtConst.doc:\r\n iconPath = '/img/icons/word.png'\r\n break\r\n case fileExtConst.docx:\r\n iconPath = '/img/icons/word.png'\r\n break\r\n case fileExtConst.tiff:\r\n iconPath = '/img/icons/other_docs.png'\r\n break\r\n case fileExtConst.png:\r\n iconPath = '/img/icons/other_docs.png'\r\n break\r\n case fileExtConst.jpg:\r\n iconPath = '/img/icons/other_docs.png'\r\n break\r\n case fileExtConst.xls:\r\n iconPath = '/img/icons/excel.png'\r\n break\r\n case fileExtConst.xlsx:\r\n iconPath = '/img/icons/excel.png'\r\n break\r\n default:\r\n iconPath = '/img/icons/pdf.png'\r\n break\r\n }\r\n\r\n return (\r\n \r\n )\r\n }\r\n const handleChangeLang = (lang: string, fileItm: any) => {\r\n const formatedValue = {\r\n fileID: fileItm.fileID,\r\n language: lang,\r\n }\r\n const isHaveLang = selectedListWithLang.filter((itm: any) => itm.fileID === fileItm.fileID).length > 0\r\n let newSelectedListWithLang\r\n if (isHaveLang) {\r\n newSelectedListWithLang = selectedListWithLang.map((itm) => {\r\n if (itm.fileID === fileItm.fileID) {\r\n return { ...itm, language: formatedValue.language }\r\n } else {\r\n return itm\r\n }\r\n })\r\n // setSelectedListWithLang(newSelectedListWithLang)\r\n } else {\r\n newSelectedListWithLang = [...selectedListWithLang, formatedValue]\r\n // setSelectedListWithLang(newSelectedListWithLang)\r\n }\r\n changeInputValue(selectedList, newSelectedListWithLang)\r\n setSelectedListWithLang(newSelectedListWithLang)\r\n\r\n // const selectedListWithLang\r\n }\r\n\r\n const handleClickFile = (filename: string) => {\r\n const fileExt = path.extname(`${filename}`)\r\n if (onClickFile) {\r\n onClickFile(filename, fileExt)\r\n }\r\n }\r\n const checkedRadioFn = (fileID: number) => {\r\n let isCheckedTH = false\r\n selectedListWithLang.forEach((itm) => {\r\n if (itm.fileID === fileID && itm.language === 'th') isCheckedTH = true\r\n })\r\n let isCheckedEN = false\r\n selectedListWithLang.forEach((itm) => {\r\n if (itm.fileID === fileID && itm.language === 'en') isCheckedEN = true\r\n })\r\n\r\n return { isCheckedTH, isCheckedEN }\r\n }\r\n const checkDisableRadio = (fileID: number) => {\r\n let isDisableRadio = true\r\n selectedList.childSelected.forEach((itm: any) => {\r\n if (itm?.fileID !== fileID && isDisableRadio) {\r\n //ไฟล์ไม่ถูกเลือกอยู่ isDisableRadio = true\r\n isDisableRadio = true\r\n } else {\r\n //ไฟล์ถูกเลือกอยู่ isDisableRadio = false\r\n isDisableRadio = false\r\n }\r\n })\r\n return isDisableRadio\r\n }\r\n const renderFileList = (fileList: any) => {\r\n return fileList.map((fileItm: any) => {\r\n const isChecked = isChildrenCheckedFn(fileItm)\r\n const fileExt = path.extname(`${fileItm?.filename}`)\r\n const { isCheckedTH, isCheckedEN } = checkedRadioFn(fileItm.fileID)\r\n const isDisableRadio = false //checkDisableRadio(fileItm.fileID) //feature นี้สำหรับ disable radio เมื่อไม่ได้มีการติ๊กเลือกไฟล์นี้\r\n\r\n return (\r\n <>\r\n \r\n \r\n {fileExt === fileExtConst.pdf && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {renderIcon(fileItm.filename)}\r\n \r\n {\r\n handleClickFile(fileItm.filename)\r\n }}\r\n >\r\n {fileItm.filename}\r\n \r\n \r\n \r\n {fileExt === fileExtConst.pdf && (\r\n \r\n \r\n }\r\n label={labelRadioTH}\r\n labelPlacement=\"end\"\r\n disabled={disabled || isDisableRadio}\r\n onChange={(e: any) => {\r\n handleChangeLang(e.target.value, fileItm)\r\n }}\r\n />\r\n }\r\n label={labelRadioEN}\r\n labelPlacement=\"end\"\r\n disabled={disabled || isDisableRadio}\r\n onChange={(e: any) => {\r\n handleChangeLang(e.target.value, fileItm)\r\n }}\r\n />\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n })\r\n }\r\n\r\n const renderElement = (dataSource: any) => {\r\n return dataSource.map((data: any) => {\r\n const isChecked = isParentCheckedFn(data)\r\n return (\r\n <>\r\n {/* loop 1 Topic */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* /* loop 2 chrildren file*/}\r\n {renderFileList(data.fileInfo)}\r\n \r\n \r\n \r\n )\r\n })\r\n }\r\n\r\n return (\r\n \r\n {renderElement(dataSource)}\r\n \r\n )\r\n}\r\n\r\nlet TreeCheckboxCtrl: React.FC = ({ name, ...others }) => {\r\n const styleCustom = { minWidth: '125px', ...others?.style }\r\n const treeCheckboxModel = useTreeCheckbox({\r\n name,\r\n ...others,\r\n })\r\n return \r\n}\r\n\r\nexport default TreeCheckboxCtrl\r\n","import * as SynthesisReviewType from './synthesisReviewType'\r\nimport useSyntheticReview from './useSyntheticReview'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport TreeCheckbox from '../../../../../control/treeCheckbox/treeCheckbox'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport PageAction from '../pageAction'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../constants/approveStatus'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\n\r\nconst SynthesisReviewREC1View: React.FC = (props) => {\r\n const {\r\n initialValues,\r\n // approveStatus,\r\n projectData,\r\n initialComment,\r\n initialRichTextEditor,\r\n initialCommentRichTextEditor,\r\n documentInfoList,\r\n isShowUpdateDate,\r\n initialRichRemark,\r\n handleDirtyChange,\r\n onClickCancel,\r\n onSubmitForm,\r\n configDialog,\r\n onRefDialog,\r\n isViewMode,\r\n isHideDocumentCertificate = false,\r\n isFlowApproveWithComment = false,\r\n isEditStampFile,\r\n clickEditStampFile,\r\n cancelEditStampFile,\r\n saveEditStampFile,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n\r\n const isShowComment = true\r\n const isSynthesisApprove: boolean =\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC1.approve ||\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC2.approve //ผลการพิจารณาเป็น อนุมัติ\r\n\r\n const isDisplayTreeCheckboxSection: boolean =\r\n !isHideDocumentCertificate && (isFlowApproveWithComment || isSynthesisApprove)\r\n\r\n const renderOfficerView = (name: string, index: number) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {(props) => {\r\n const { form, handleSubmit, dirty, invalid, errors } = props\r\n\r\n return (\r\n <>\r\n \r\n {!isFlowApproveWithComment && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!isFlowApproveWithComment && (\r\n \r\n \r\n \r\n {isShowComment && (\r\n \r\n {({ fields }) => {\r\n return fields?.map((name, index) =>\r\n renderOfficerView(name, index),\r\n )\r\n }}\r\n \r\n )}\r\n \r\n \r\n \r\n )}\r\n {isDisplayTreeCheckboxSection && (\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isViewMode}\r\n onClickEdit={() => clickEditStampFile()}\r\n onCancel={() => cancelEditStampFile()}\r\n onConfirm={() => saveEditStampFile()}\r\n >\r\n \r\n )}\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {' '}\r\n {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n \r\n\r\n \r\n {\r\n handleDirtyChange(formState, form)\r\n }}\r\n />\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nconst SynthesisReviewREC1: React.FC = (props) => {\r\n const useSyntheticReviewModel = useSyntheticReview(props)\r\n return \r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: 128,\r\n padding: 20,\r\n },\r\n titleFont: {\r\n color: '#BDBDBD',\r\n },\r\n contentFont: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default SynthesisReviewREC1\r\n","import * as SynthesisReviewType from './synthesisReviewType'\r\nimport useSyntheticReview from './useSyntheticReview'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport { Grid, useTheme, makeStyles } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport TreeCheckbox from '../../../../../control/treeCheckbox/treeCheckbox'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport PageAction from '../pageAction'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport constProjectStatus from '../../../../../constants/projectStatus'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../constants/approveStatus'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nconst SynthesisReviewREC2View: React.FC = (props) => {\r\n const {\r\n initialValues,\r\n projectData,\r\n initialComment,\r\n initialRichTextEditor,\r\n initialCommentRichTextEditor,\r\n documentInfoList,\r\n isShowUpdateDate,\r\n initialRichRemark,\r\n handleDirtyChange,\r\n onClickCancel,\r\n onSubmitForm,\r\n configDialog,\r\n onRefDialog,\r\n isViewMode,\r\n isHideDocumentCertificate = false,\r\n isFlowApproveWithComment = false,\r\n isEditStampFile,\r\n clickEditStampFile,\r\n cancelEditStampFile,\r\n saveEditStampFile,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const checkPermission = useCheckPermission()\r\n const snackbarAction = useSnackbarAction()\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const isAdmin = checkPermission.isUserAdmin()\r\n // const isShowCommentRemarkList = true\r\n // const isShowComment = (approveStatus && approveStatus?.id !== 1 && approveStatus?.id !== 8) || !isResearcherView\r\n const isShowComment = true\r\n const isSynthesisApprove: boolean =\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC1.approve ||\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC2.approve //ผลการพิจารณาเป็น อนุมัติ\r\n const isDisplayTreeCheckboxSection: boolean =\r\n !isHideDocumentCertificate && (isFlowApproveWithComment || isSynthesisApprove)\r\n const isStatusComplete = projectData && projectData?.projectStatusInfo?.value === constProjectStatus.completed\r\n const isShowCloseProjectButton = isStatusComplete && isAdmin\r\n // const isDisplayTreeCheckboxSection = true\r\n // const isEditNextPhase: boolean = projectData?.submitTypeInfo.value === submittedType.editAfterReviewProjectPhase.id\r\n // const isEditAmaRevising: boolean = projectData?.submitTypeInfo.value === submittedType.editAfterReviewAmaRevising.id\r\n // const isAmendment: boolean = projectData?.submitTypeInfo.value === submittedType.submittedType4.id\r\n // const isPhase: boolean = projectData?.submitTypeInfo.value === submittedType.submittedType2.id\r\n\r\n const renderOfficerView = (name: string, index: number) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {(props) => {\r\n // if (formRenderPropsRef) {\r\n // formRenderPropsRef.current = props\r\n // }\r\n const { form, handleSubmit, dirty, invalid, errors, values } = props\r\n\r\n return (\r\n <>\r\n \r\n {!isFlowApproveWithComment && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!isFlowApproveWithComment && (\r\n \r\n \r\n \r\n {isShowComment && (\r\n \r\n {({ fields }) => {\r\n return fields?.map((name, index) =>\r\n renderOfficerView(name, index),\r\n )\r\n }}\r\n \r\n )}\r\n \r\n \r\n \r\n )}\r\n {isDisplayTreeCheckboxSection && (\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isViewMode}\r\n onClickEdit={() => clickEditStampFile()}\r\n onCancel={() => cancelEditStampFile()}\r\n onConfirm={() => saveEditStampFile()}\r\n >\r\n \r\n )}\r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n {/* {!isFlowApproveWithComment && (\r\n \r\n \r\n \r\n {!isResearcherView ? (\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n )} */}\r\n \r\n\r\n \r\n handleDirtyChange(formState, form)}\r\n />\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nconst SynthesisReviewREC2: React.FC = (props) => {\r\n const useSyntheticReviewModel = useSyntheticReview(props)\r\n return \r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: 128,\r\n padding: 20,\r\n },\r\n titleFont: {\r\n color: '#BDBDBD',\r\n },\r\n contentFont: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default SynthesisReviewREC2\r\n","import React from 'react'\r\nimport * as secretCodeFormType from './secretCodeFormType'\r\n\r\nconst useSecretCodeForm = (props: secretCodeFormType.UseSecretCodeFormType) => {\r\n const {} = props\r\n // const [category, setCategory] = React.useState([])\r\n\r\n React.useEffect(() => {}, [])\r\n\r\n return {\r\n // category,\r\n }\r\n}\r\n\r\nexport default useSecretCodeForm\r\n","import * as secretCodeFormType from './secretCodeFormType'\r\nimport useSecretCodeForm from './useSecretCodeForm'\r\nimport Button from '../../../../control/button/button'\r\nimport MyTextfield from '../../../../control/textfield/textfield'\r\nimport { Grid, makeStyles, useMediaQuery, useTheme } from '@material-ui/core'\r\nimport { Form } from 'react-final-form'\r\nimport React from 'react'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\n\r\n//View\r\nconst SecretCodeFormView = (props: secretCodeFormType.SecretCodeFormViewType) => {\r\n const { onClickSave, onClickClose } = props\r\n const translate = useTranslate()\r\n\r\n const theme = useTheme()\r\n const classes = useStyles()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('sm'))\r\n\r\n return (\r\n
\r\n {(props) => {\r\n const { handleSubmit } = props\r\n return (\r\n \r\n {/* */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst SecretCodeForm = (props: secretCodeFormType.SecretCodeFormType) => {\r\n const secretCodeFormModel = useSecretCodeForm(props)\r\n return \r\n}\r\nexport default SecretCodeForm\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n}))\r\n","import React from 'react'\r\nimport { cerTopic } from '../../../../../constants/constants'\r\n\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\n\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport { SignREC1Type } from './signREC1'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport SecretCodeForm from '../../../shareUI/secretCodeForm/secretCodeForm'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\n\r\n// --- Contants --- //\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\nimport { encryption } from '../../../../../utilities/encryption'\r\nimport { certificateInfoType } from '../../../../../services/web/types/responseWebServiceTypes'\r\ntype CerDialogType = Pick\r\nconst useSignREC1 = (props: SignREC1Type) => {\r\n const translate = useTranslate()\r\n const { callbackSaveComplete } = props\r\n const checkPermissionHook = checkPermission()\r\n const loadingHook = useLoading()\r\n const callWebService = useWebService()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const { projectData } = manageProjectStore\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const history = useHistory()\r\n const [isNotShowSign, setIsNotShowSign] = React.useState(false)\r\n\r\n const statusAfterClose = React.useRef('save')\r\n\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const { tabSelected } = appFolderAndTabStore\r\n const profileStore = authenStore()\r\n const { profile } = profileStore\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [initialUploadFileCer, setInitialUploadFileCer] = React.useState()\r\n const [configDialog, setConfigDialog] = React.useState()\r\n const dialogRef = React.useRef>()\r\n const [initialUploadFileCerSign, setInitialUploadFileCerSign] = React.useState()\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFileCer()\r\n }, [])\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const createInitialUploadFileCer = async () => {\r\n const uploadFileinitCer = cerTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n if (projectData) {\r\n const submittedID = projectData.submittedID\r\n const projectID = projectData.projectID\r\n loadingHook.loadingOpen()\r\n const data = await callWebService.getSignCertificate(projectID, submittedID)\r\n await chkBtnSing(projectID, submittedID)\r\n\r\n loadingHook.loadingClose()\r\n if (data.status === 1) {\r\n const certificateInfo = data?.result.certificateInfo\r\n uploadFileinitCer.forEach((itm: any) => {\r\n if (itm.uploadFileObj.documentTopicID === 1) {\r\n let objUploadEn = {\r\n filename: certificateInfo.cer_en.name ? certificateInfo.cer_en.name : '',\r\n path: certificateInfo.cer_en.url ? certificateInfo.cer_en.url : '',\r\n }\r\n itm.uploadFileObj.fileList.push(objUploadEn)\r\n } else if (itm.uploadFileObj.documentTopicID === 0) {\r\n let objUploadTH = {\r\n filename: certificateInfo.cer_th.name ? certificateInfo.cer_th.name : '',\r\n path: certificateInfo.cer_th.url ? certificateInfo.cer_th.url : '',\r\n }\r\n itm.uploadFileObj.fileList.push(objUploadTH)\r\n }\r\n })\r\n\r\n const initialFileValue = createInitialFile(certificateInfo)\r\n setInitialUploadFileCerSign(initialFileValue)\r\n }\r\n }\r\n setInitialUploadFileCer(uploadFileinitCer)\r\n }\r\n\r\n const createInitialFile = (certificateInfo: certificateInfoType) => {\r\n const uploadFileinitCer = cerTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n\r\n // const certificateInfo = result.certificateInfo\r\n uploadFileinitCer.forEach((itm: any) => {\r\n if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (certificateInfo?.certificateSignFileName_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: certificateInfo?.certificateSignFileName_en,\r\n filename: certificateInfo?.certificateSignFileName_en,\r\n fileID: certificateInfo?.certificateSignFileName_en,\r\n path: certificateInfo?.cerSign_en,\r\n }\r\n\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (certificateInfo?.certificateSignFileName_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: certificateInfo?.certificateSignFileName_th,\r\n filename: certificateInfo?.certificateSignFileName_th,\r\n fileID: certificateInfo?.certificateSignFileName_th,\r\n path: certificateInfo?.cerSign_th,\r\n }\r\n\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n }\r\n })\r\n return uploadFileinitCer\r\n // setInitialUploadFileCer(uploadFileinitCer)\r\n }\r\n\r\n const getCerTopic = () => {\r\n let myCerTopic = cerTopic\r\n\r\n if (!projectData?.isLanguageEN) {\r\n //ตัดภาษาอังกฤษออก\r\n myCerTopic = cerTopic.filter((itm) => itm.id !== 1)\r\n }\r\n if (!projectData?.isLanguageTH) {\r\n //ตัดภาษาไทยออก\r\n myCerTopic = cerTopic.filter((itm) => itm.id !== 0)\r\n }\r\n return myCerTopic\r\n }\r\n const handleDirtyChange = (props: { dirty: boolean }) => {\r\n appFolderAndTabAction.setTabDirty(props.dirty)\r\n }\r\n const handleSubmitForm = async (val: any) => {\r\n const signCertificateRequest: REQServiceType.SignCertificateType = {\r\n projectID: projectData?.projectID || null,\r\n signUserID: profileStore.profile.userId,\r\n submittedID: projectData?.submittedID || null,\r\n isSignBehalfPresident: false,\r\n isSignBehalfSecretary: false,\r\n signUserPinCode: null,\r\n }\r\n if (val.saveType === 'SAVE') {\r\n setConfigDialog({\r\n title: translate.get('LABEL.SECRET_PASSWORD'),\r\n content: React.createElement(SecretCodeForm, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n },\r\n onClickSave: (val: any) => {\r\n handleSubmitSecretCode({\r\n ...signCertificateRequest,\r\n signUserPinCode: encryption(val.password),\r\n })\r\n },\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n const handleSubmitSecretCode = async (paramForSave: any) => {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.signCertificate(paramForSave)\r\n if (callbackSaveComplete) {\r\n if (res && res.status) {\r\n callbackSaveComplete(res.status, false)\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n // await conditionDialog(res?.status)\r\n }\r\n // const conditionDialog = (status: number) => {\r\n // if (status === 1) {\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n // content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n // type: 'alert-message',\r\n // onAfterClose: handleAfterClose,\r\n // })\r\n // dialogRef.current?.openDialog()\r\n // } else if (status === -2) {\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.WARNING'),\r\n // content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n // type: 'alert-message',\r\n // })\r\n // dialogRef.current?.openDialog()\r\n // } else {\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.ERROR'),\r\n // content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n // type: 'alert-message',\r\n // })\r\n // dialogRef.current?.openDialog()\r\n // }\r\n // }\r\n // const handleAfterClose = () => {\r\n // const { userGroupId } = profile\r\n // if (statusAfterClose.current === 'save') {\r\n // switch (userGroupId) {\r\n // case userGroup.presidentIRB1.groupId:\r\n // case userGroup.secretaryIRB1.groupId:\r\n // case userGroup.presidentIRB2.groupId:\r\n // case userGroup.secretaryIRB2.groupId:\r\n // case userGroup.vicePresident.groupId:\r\n // if (\r\n // tabSelected.id === menuTab.tab2Chairman.id ||\r\n // tabSelected.id === menuTab.tab6Chairman.id ||\r\n // tabSelected.id === menuTab.tab9.id\r\n // ) {\r\n // history.push(RoutePath.manageProject)\r\n // } else {\r\n // setDefaultPage()\r\n // }\r\n // break\r\n // case userGroup.committee.groupId:\r\n // if (tabSelected.id === menuTab.tab5Commitee.id) {\r\n // history.push(RoutePath.manageProject)\r\n // }\r\n // break\r\n\r\n // default:\r\n // setDefaultPage()\r\n // break\r\n // }\r\n // } else {\r\n // setDefaultPage()\r\n // }\r\n // }\r\n // const setDefaultPage = () => {\r\n // setConfigDialog({}) //clear function dialog\r\n // // loadLatestFolder()\r\n // appFolderAndTabAction.resetTabDirty()\r\n // }\r\n\r\n const chkBtnSing = async (projectID: number, submittedID: number) => {\r\n if (projectID && submittedID) {\r\n const { result, status } = await callWebService.getSignCertificate(projectID, submittedID)\r\n\r\n if (status === 1) {\r\n if (\r\n profile.userGroupId === constUserGroup.president ||\r\n profile.userGroupId === constUserGroup.reviewer\r\n ) {\r\n setIsNotShowSign(result.isSignBeHalfPresident)\r\n } else if (profile.userGroupId === constUserGroup.secretary) {\r\n setIsNotShowSign(result.isSignBeHalfSecretary)\r\n }\r\n }\r\n }\r\n }\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n return {\r\n onRefDialog,\r\n configDialog,\r\n\r\n isViewMode,\r\n isNotShowSign,\r\n\r\n initialValues,\r\n certificateTopicList: getCerTopic(),\r\n initialUploadFileCer,\r\n initialUploadFileCerSign,\r\n projectData,\r\n handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n }\r\n}\r\nexport default useSignREC1\r\n","import { Button, Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useSignREC1 from './useSignREC1'\r\nimport { ButtonClose, ButtonSign } from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\nexport type SignREC1ViewType = ReturnType\r\nconst SignREC1View = (props: SignREC1ViewType) => {\r\n const {\r\n onRefDialog,\r\n configDialog,\r\n\r\n isViewMode,\r\n isNotShowSign,\r\n\r\n initialValues,\r\n certificateTopicList,\r\n initialUploadFileCer,\r\n handleDirtyChange,\r\n onClickBackToSearch,\r\n onSubmitForm,\r\n initialUploadFileCerSign,\r\n projectData,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const btn = (props: any) => {\r\n if (!isViewMode && !isNotShowSign) {\r\n return (\r\n {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n }}\r\n />\r\n )\r\n } else {\r\n if (!isViewMode) {\r\n return \r\n }\r\n }\r\n }\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSigning: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n return (\r\n \r\n {(props) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n\r\n {isSigning && (\r\n \r\n \r\n \r\n )}\r\n \r\n {btn(props)}\r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type SignREC1Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst SignREC1 = (props: SignREC1Type) => {\r\n const signREC1 = useSignREC1(props)\r\n return \r\n}\r\n\r\nexport default SignREC1\r\n","import { Button, Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useSignREC1 from './useSignREC1'\r\nimport { ButtonClose, ButtonSign } from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\nexport type SignREC2ViewType = ReturnType\r\nconst SignREC2View = (props: SignREC2ViewType) => {\r\n const {\r\n onRefDialog,\r\n configDialog,\r\n\r\n isViewMode,\r\n isNotShowSign,\r\n\r\n initialValues,\r\n certificateTopicList,\r\n initialUploadFileCer,\r\n initialUploadFileCerSign,\r\n projectData,\r\n handleDirtyChange,\r\n onClickBackToSearch,\r\n onSubmitForm,\r\n } = props\r\n const btn = (props: any) => {\r\n if (!isViewMode && !isNotShowSign) {\r\n return (\r\n {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n }}\r\n />\r\n )\r\n } else {\r\n if (!isViewMode) {\r\n return \r\n }\r\n }\r\n }\r\n\r\n const translate = useTranslate()\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSigning: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n return (\r\n \r\n {(props) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n\r\n {isSigning && (\r\n \r\n \r\n \r\n )}\r\n \r\n {btn(props)}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type SignREC2Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst SignREC2 = (props: SignREC2Type) => {\r\n const sign = useSignREC1(props)\r\n return \r\n}\r\n\r\nexport default SignREC2\r\n","import React from 'react'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport SecretCodeForm from '../../../shareUI/secretCodeForm/secretCodeForm'\r\nimport { useHistory } from 'react-router-dom'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\n// --- Contants --- //\r\n\r\nimport { SignRepresentREC1Type } from './signRepresentREC1'\r\nimport { encryption } from '../../../../../utilities/encryption'\r\nimport { cerTopic } from '../../../../../constants/constants'\r\nimport { certificateInfoType } from '../../../../../services/web/types/responseWebServiceTypes'\r\n\r\ntype CerDialogType = Pick\r\nconst useSignRepresent = (props: SignRepresentREC1Type) => {\r\n const { callbackSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const manageProjectStore = useManageProjectStore()\r\n const { projectData } = manageProjectStore\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const [configDialog, setConfigDialog] = React.useState()\r\n const dialogRef = React.useRef>()\r\n const loadingHook = useLoading()\r\n const callWebService = useWebService()\r\n const profileStore = authenStore()\r\n const { profile } = profileStore\r\n const translate = useTranslate()\r\n const history = useHistory()\r\n const statusAfterClose = React.useRef('save')\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const { tabSelected } = appFolderAndTabStore\r\n const [initialUploadFileCer, setInitialUploadFileCer] = React.useState()\r\n\r\n React.useEffect(() => {\r\n createInitialData()\r\n // if (projectData?.irb && projectData?.submitTypeInfo?.value) {\r\n // getCertificate()\r\n // }\r\n }, [])\r\n\r\n const createInitialData = async () => {\r\n if (projectData) {\r\n const submittedID = projectData.submittedID\r\n const projectID = projectData.projectID\r\n loadingHook.loadingOpen()\r\n const { result, status } = await callWebService.getSignCertificate(projectID, submittedID)\r\n loadingHook.loadingClose()\r\n if (status === 1) {\r\n const initialData = {\r\n chairmanSign: result.isSignBeHalfPresident,\r\n secretarySign: result.isSignBeHalfSecretary,\r\n }\r\n const initialFileValue = createInitialFile(result.certificateInfo)\r\n setInitialValues(initialData)\r\n setInitialUploadFileCer(initialFileValue)\r\n }\r\n }\r\n }\r\n\r\n const createInitialFile = (certificateInfo: certificateInfoType) => {\r\n const uploadFileinitCer = cerTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n\r\n // const certificateInfo = result.certificateInfo\r\n uploadFileinitCer.forEach((itm: any) => {\r\n if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (certificateInfo?.certificateSignFileName_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: certificateInfo?.certificateSignFileName_en,\r\n filename: certificateInfo?.certificateSignFileName_en,\r\n fileID: certificateInfo?.certificateSignFileName_en,\r\n path: certificateInfo?.cerSign_en,\r\n }\r\n\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (certificateInfo?.certificateSignFileName_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: certificateInfo?.certificateSignFileName_th,\r\n filename: certificateInfo?.certificateSignFileName_th,\r\n fileID: certificateInfo?.certificateSignFileName_th,\r\n path: certificateInfo?.cerSign_th,\r\n }\r\n\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n }\r\n })\r\n return uploadFileinitCer\r\n // setInitialUploadFileCer(uploadFileinitCer)\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const handleDirtyChange = (props: { dirty: boolean }) => {\r\n appFolderAndTabAction.setTabDirty(props.dirty)\r\n }\r\n const handleSubmitForm = async (val: any) => {\r\n const signBehalfCertificateRequest: REQServiceType.SignCertificateType = {\r\n projectID: projectData?.projectID || null,\r\n signUserID: profileStore.profile.userId,\r\n submittedID: projectData?.submittedID || null,\r\n isSignBehalfPresident: val?.chairmanSign,\r\n isSignBehalfSecretary: val?.secretarySign,\r\n signUserPinCode: null,\r\n }\r\n if (val.saveType === 'SAVE') {\r\n setConfigDialog({\r\n title: translate.get('LABEL.SECRET_PASSWORD'),\r\n content: React.createElement(SecretCodeForm, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n },\r\n onClickSave: (val: any) => {\r\n handleSubmitSecretCode({\r\n ...signBehalfCertificateRequest,\r\n signUserPinCode: encryption(val.password),\r\n })\r\n },\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n const handleSubmitSecretCode = async (paramForSave: any) => {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.signCertificate(paramForSave)\r\n\r\n loadingHook.loadingClose()\r\n await conditionDialog(res?.status)\r\n }\r\n const conditionDialog = (status: number) => {\r\n if (status === 1) {\r\n if (status && callbackSaveComplete) {\r\n setDefaultPage()\r\n createInitialData()\r\n callbackSaveComplete(status, false)\r\n }\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n // content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n // type: 'alert-message',\r\n // onAfterClose: () => {\r\n // if (status && callbackSaveComplete) {\r\n // setDefaultPage()\r\n // callbackSaveComplete(status, false)\r\n // }\r\n // },\r\n // })\r\n // dialogRef.current?.openDialog()\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const setDefaultPage = () => {\r\n setConfigDialog({}) //clear function dialog\r\n // loadLatestFolder()\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const getCerTopic = () => {\r\n let myCerTopic = cerTopic\r\n\r\n if (!projectData?.isLanguageEN) {\r\n //ตัดภาษาอังกฤษออก\r\n myCerTopic = cerTopic.filter((itm) => itm.id !== 1)\r\n }\r\n if (!projectData?.isLanguageTH) {\r\n //ตัดภาษาไทยออก\r\n myCerTopic = cerTopic.filter((itm) => itm.id !== 0)\r\n }\r\n return myCerTopic\r\n }\r\n\r\n return {\r\n onRefDialog,\r\n configDialog,\r\n isViewMode,\r\n initialValues,\r\n handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n initialUploadFileCer,\r\n certificateTopicList: getCerTopic(),\r\n projectData,\r\n }\r\n}\r\nexport default useSignRepresent\r\n","import React, { useRef } from 'react'\r\nimport { Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useSignRepresent from './useSignRepresent'\r\nimport { ButtonSign } from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport Checkbox from '../../../../../control/checkbox/checkbox'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\ntype ErrorsType = {\r\n chairmanSign?: string\r\n secretarySign?: string\r\n}\r\nexport type SignRepresentREC1ViewType = ReturnType\r\nconst SignRepresentREC1View = (props: SignRepresentREC1ViewType) => {\r\n const {\r\n onRefDialog,\r\n configDialog,\r\n isViewMode,\r\n initialValues,\r\n handleDirtyChange,\r\n onSubmitForm,\r\n initialUploadFileCer,\r\n certificateTopicList,\r\n projectData,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const isFirstTime = useRef(true)\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSigning: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n return (\r\n {\r\n const errors: ErrorsType = {}\r\n if (!initialValues.chairmanSign && !initialValues.secretarySign) {\r\n /* case1 ยังไม่มีค่าใดถูกเลือกเลย */\r\n if (!values.secretarySign && !values.chairmanSign) {\r\n // errors.chairmanSign = 'กรุณาระบุค่า'\r\n\r\n // errors.secretarySign = ' '\r\n errors.chairmanSign = translate.get('MESSAGE.M016')\r\n errors.secretarySign = translate.get('MESSAGE.M016')\r\n }\r\n } else if (initialValues.chairmanSign) {\r\n /* case2 ประธานถูกเลือกไว้แล้ว */\r\n if (!values.secretarySign) {\r\n // errors.secretarySign = 'กรุณาระบุค่า'\r\n errors.secretarySign = translate.get('MESSAGE.M016')\r\n }\r\n } else if (initialValues.secretarySign) {\r\n /* case3 เลขาถูกเลือกไว้แล้ว */\r\n if (!values.chairmanSign) {\r\n // errors.chairmanSign = 'กรุณาระบุค่า'\r\n errors.chairmanSign = translate.get('MESSAGE.M016')\r\n }\r\n }\r\n return errors\r\n }}\r\n >\r\n {(props) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {\r\n isFirstTime.current = false\r\n }}\r\n />\r\n \r\n \r\n {\r\n isFirstTime.current = false\r\n }}\r\n />\r\n \r\n \r\n \r\n\r\n {isSigning && (\r\n \r\n \r\n \r\n )}\r\n \r\n {!isViewMode && (\r\n {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n }}\r\n />\r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type SignRepresentREC1Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst SignRepresentREC1 = (props: SignRepresentREC1Type) => {\r\n const signRepresent = useSignRepresent(props)\r\n return \r\n}\r\n\r\nexport default SignRepresentREC1\r\n","import React, { useRef } from 'react'\r\nimport { Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useSignRepresent from './useSignRepresent'\r\nimport { ButtonSign } from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport Checkbox from '../../../../../control/checkbox/checkbox'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\ntype ErrorsType = {\r\n chairmanSign?: string\r\n secretarySign?: string\r\n}\r\nexport type SignRepresentREC2ViewType = ReturnType\r\nconst SignRepresentREC2View = (props: SignRepresentREC2ViewType) => {\r\n const {\r\n onRefDialog,\r\n configDialog,\r\n isViewMode,\r\n initialValues,\r\n handleDirtyChange,\r\n onSubmitForm,\r\n initialUploadFileCer,\r\n certificateTopicList,\r\n projectData,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const isFirstTime = useRef(true)\r\n //มีการลงนามไปแล้ว\r\n const isSigning: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n return (\r\n {\r\n const errors: ErrorsType = {}\r\n if (!initialValues.chairmanSign && !initialValues.secretarySign) {\r\n /* case1 ยังไม่มีค่าใดถูกเลือกเลย */\r\n if (!values.secretarySign && !values.chairmanSign) {\r\n // errors.chairmanSign = 'กรุณาระบุค่า'\r\n\r\n // errors.secretarySign = ' '\r\n errors.chairmanSign = translate.get('MESSAGE.M016')\r\n errors.secretarySign = translate.get('MESSAGE.M016')\r\n }\r\n } else if (initialValues.chairmanSign) {\r\n /* case2 ประธานถูกเลือกไว้แล้ว */\r\n if (!values.secretarySign) {\r\n // errors.secretarySign = 'กรุณาระบุค่า'\r\n errors.secretarySign = translate.get('MESSAGE.M016')\r\n }\r\n } else if (initialValues.secretarySign) {\r\n /* case3 เลขาถูกเลือกไว้แล้ว */\r\n if (!values.chairmanSign) {\r\n // errors.chairmanSign = 'กรุณาระบุค่า'\r\n errors.chairmanSign = translate.get('MESSAGE.M016')\r\n }\r\n }\r\n return errors\r\n }}\r\n >\r\n {(props) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {\r\n isFirstTime.current = false\r\n }}\r\n />\r\n \r\n \r\n {\r\n isFirstTime.current = false\r\n }}\r\n />\r\n \r\n \r\n \r\n\r\n {isSigning && (\r\n \r\n \r\n \r\n )}\r\n \r\n {!isViewMode && (\r\n {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n }}\r\n />\r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type SignRepresentREC2Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst SignRepresentREC2 = (props: SignRepresentREC2Type) => {\r\n const signRepresent = useSignRepresent(props)\r\n return \r\n}\r\n\r\nexport default SignRepresentREC2\r\n","import React from 'react'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport SecretCodeForm from '../../../shareUI/secretCodeForm/secretCodeForm'\r\nimport useLookupClient from '../../../../../services/lookupClient/useLookupClient'\r\n\r\n// --- Contants --- //\r\n\r\nimport { SignRepresentREC1Type } from './signVicePresidentREC1'\r\nimport { encryption } from '../../../../../utilities/encryption'\r\nimport {\r\n certificateInfoType,\r\n GetSignCertificateResultType,\r\n} from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport { cerTopic } from '../../../../../constants/constants'\r\n\r\ntype CerDialogType = Pick\r\ntype GroupsUserLutType = {\r\n id: string\r\n name: string\r\n disableOption?: boolean\r\n}\r\nenum GroupsSign {\r\n president = '1', // ประธาน\r\n secreatary = '2', // เลขา\r\n}\r\nconst useSignRepresent = (props: SignRepresentREC1Type) => {\r\n const { callbackSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const manageProjectStore = useManageProjectStore()\r\n const { projectData } = manageProjectStore\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const [configDialog, setConfigDialog] = React.useState()\r\n const dialogRef = React.useRef>()\r\n const loadingHook = useLoading()\r\n const callWebService = useWebService()\r\n const profileStore = authenStore()\r\n const translate = useTranslate()\r\n const lookupClient = useLookupClient()\r\n const isVicePresidentSigned = React.useRef(false)\r\n const [groupsUserLut, setGroupsUserLut] = React.useState()\r\n const [initialUploadFileCer, setInitialUploadFileCer] = React.useState()\r\n const resultRef = React.useRef()\r\n\r\n React.useEffect(() => {\r\n createInitialData()\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (resultRef.current) {\r\n setGroupsUserLutFunc(resultRef.current)\r\n }\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const createInitialData = async () => {\r\n if (projectData) {\r\n const submittedID = projectData.submittedID\r\n const projectID = projectData.projectID\r\n loadingHook.loadingOpen()\r\n const { result, status } = await callWebService.getSignCertificate(projectID, submittedID)\r\n loadingHook.loadingClose()\r\n if (status === 1) {\r\n let userGroupSign = null\r\n if (result.vicePresidentSignInfo.signVicePresident) {\r\n if (result.vicePresidentSignInfo.signVicePresidentForPresident) {\r\n userGroupSign = '1'\r\n }\r\n if (result.vicePresidentSignInfo.signVicePresidentForSecretary) {\r\n userGroupSign = '2'\r\n }\r\n }\r\n\r\n const initialData = {\r\n // chairmanSign: result.isSignBeHalfPresident,\r\n // secretarySign: result.isSignBeHalfSecretary,\r\n userGroupsSign: userGroupSign,\r\n }\r\n\r\n isVicePresidentSigned.current = result.vicePresidentSignInfo.signVicePresident\r\n const initialFileValue = createInitialFile(result.certificateInfo)\r\n\r\n resultRef.current = result\r\n setGroupsUserLutFunc(result)\r\n setInitialValues(initialData)\r\n setInitialUploadFileCer(initialFileValue)\r\n }\r\n }\r\n }\r\n\r\n const createInitialFile = (certificateInfo: certificateInfoType) => {\r\n const uploadFileinitCer = cerTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n\r\n // const certificateInfo = result.certificateInfo\r\n uploadFileinitCer.forEach((itm: any) => {\r\n if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (certificateInfo?.certificateSignFileName_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: certificateInfo?.certificateSignFileName_en,\r\n filename: certificateInfo?.certificateSignFileName_en,\r\n fileID: certificateInfo?.certificateSignFileName_en,\r\n path: certificateInfo?.cerSign_en,\r\n }\r\n\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (certificateInfo?.certificateSignFileName_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: certificateInfo?.certificateSignFileName_th,\r\n filename: certificateInfo?.certificateSignFileName_th,\r\n fileID: certificateInfo?.certificateSignFileName_th,\r\n path: certificateInfo?.cerSign_th,\r\n }\r\n\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n }\r\n })\r\n return uploadFileinitCer\r\n // setInitialUploadFileCer(uploadFileinitCer)\r\n }\r\n\r\n const setGroupsUserLutFunc = (result: GetSignCertificateResultType) => {\r\n let optionGroupUserSign: GroupsUserLutType[] = lookupClient.getGroupsUser()\r\n /* Describtion หากรองประธานยังไม่เคยทำการลงนามแทนจะให้ตัดตัวเลือกที่มีการลงนามแล้วออกไป แต่ถ้าหากรองประธานมีการลงนามแทนใครสักคนก็จะให้แสดงปกติ */\r\n if (!result.vicePresidentSignInfo.signVicePresident) {\r\n if (result.isSignBeHalfPresident && !result.vicePresidentSignInfo.signVicePresidentForPresident) {\r\n optionGroupUserSign = optionGroupUserSign.filter((itm) => itm.id !== GroupsSign.president)\r\n }\r\n if (result.isSignBeHalfSecretary && !result.vicePresidentSignInfo.signVicePresidentForSecretary) {\r\n optionGroupUserSign = optionGroupUserSign.filter((itm) => itm.id !== GroupsSign.secreatary)\r\n }\r\n }\r\n\r\n setGroupsUserLut(optionGroupUserSign)\r\n }\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const handleDirtyChange = (props: { dirty: boolean }) => {\r\n appFolderAndTabAction.setTabDirty(props.dirty)\r\n }\r\n const handleSubmitForm = async (val: any) => {\r\n let isSignPresident = false\r\n let isSignSecretary = false\r\n if (val.userGroupsSign) {\r\n if (val.userGroupsSign === GroupsSign.president) {\r\n isSignPresident = true\r\n } else if (val.userGroupsSign === GroupsSign.secreatary) {\r\n isSignSecretary = true\r\n }\r\n }\r\n const signBehalfCertificateRequest: REQServiceType.SignCertificateType = {\r\n projectID: projectData?.projectID || null,\r\n signUserID: profileStore.profile.userId,\r\n submittedID: projectData?.submittedID || null,\r\n isSignBehalfPresident: isSignPresident, //val?.chairmanSign,\r\n isSignBehalfSecretary: isSignSecretary, //val?.secretarySign,\r\n signUserPinCode: null,\r\n }\r\n if (val.saveType === 'SAVE') {\r\n setConfigDialog({\r\n title: translate.get('LABEL.SECRET_PASSWORD'),\r\n content: React.createElement(SecretCodeForm, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n },\r\n onClickSave: (val: any) => {\r\n handleSubmitSecretCode({\r\n ...signBehalfCertificateRequest,\r\n signUserPinCode: encryption(val.password),\r\n })\r\n },\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n const handleSubmitSecretCode = async (paramForSave: any) => {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.signCertificate(paramForSave)\r\n\r\n loadingHook.loadingClose()\r\n conditionDialog(res?.status)\r\n }\r\n const conditionDialog = (status: number) => {\r\n if (status === 1) {\r\n if (status && callbackSaveComplete) {\r\n setDefaultPage()\r\n createInitialData()\r\n callbackSaveComplete(status, false)\r\n }\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n // content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n // type: 'alert-message',\r\n // onAfterClose: () => {\r\n // if (status && callbackSaveComplete) {\r\n // setDefaultPage()\r\n // callbackSaveComplete(status, false)\r\n // }\r\n // },\r\n // })\r\n // dialogRef.current?.openDialog()\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const setDefaultPage = () => {\r\n setConfigDialog({}) //clear function dialog\r\n // loadLatestFolder()\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const getCerTopic = () => {\r\n let myCerTopic = cerTopic\r\n\r\n if (!projectData?.isLanguageEN) {\r\n //ตัดภาษาอังกฤษออก\r\n myCerTopic = cerTopic.filter((itm) => itm.id !== 1)\r\n }\r\n if (!projectData?.isLanguageTH) {\r\n //ตัดภาษาไทยออก\r\n myCerTopic = cerTopic.filter((itm) => itm.id !== 0)\r\n }\r\n return myCerTopic\r\n }\r\n\r\n return {\r\n onRefDialog,\r\n configDialog,\r\n isViewMode: isViewMode || isVicePresidentSigned.current,\r\n initialValues,\r\n groupsUserLut: groupsUserLut, // getGroupUserSignLut(),\r\n handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n initialUploadFileCer,\r\n certificateTopicList: getCerTopic(),\r\n projectData,\r\n }\r\n}\r\nexport default useSignRepresent\r\n","import React, { useRef } from 'react'\r\nimport { Grid, Typography } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useSignRepresent from './useSignVicePresident'\r\nimport { ButtonSign } from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport MyRadio from '../../../../../control/radio/radio'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\ntype ErrorsType = {\r\n chairmanSign?: string\r\n secretarySign?: string\r\n}\r\nexport type SignRepresentREC2ViewType = ReturnType\r\nconst SignRepresentREC2View = (props: SignRepresentREC2ViewType) => {\r\n const {\r\n onRefDialog,\r\n configDialog,\r\n isViewMode,\r\n initialValues,\r\n groupsUserLut,\r\n handleDirtyChange,\r\n onSubmitForm,\r\n initialUploadFileCer,\r\n certificateTopicList,\r\n projectData,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const isFirstTime = useRef(true)\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSigning: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n return (\r\n \r\n {(props) => {\r\n return (\r\n \r\n \r\n \r\n \r\n {groupsUserLut && groupsUserLut?.length > 0 ? (\r\n {}}\r\n requiredHalfWidth={true}\r\n disabled={isViewMode}\r\n required\r\n />\r\n ) : (\r\n \r\n {translate.get('LABEL.ALREADY_SIGNED')}\r\n \r\n )}\r\n \r\n \r\n\r\n {isSigning && (\r\n \r\n \r\n \r\n )}\r\n \r\n {!isViewMode && (\r\n {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n }}\r\n />\r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type SignRepresentREC2Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst SignRepresentREC2 = (props: SignRepresentREC2Type) => {\r\n const signRepresent = useSignRepresent(props)\r\n return \r\n}\r\n\r\nexport default SignRepresentREC2\r\n","import React, { useRef } from 'react'\r\nimport { Grid, Typography } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useSignRepresent from './useSignVicePresident'\r\nimport { ButtonSign } from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\n// import Checkbox from '../../../../../control/checkbox/checkbox'\r\nimport MyRadio from '../../../../../control/radio/radio'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\n// type ErrorsType = {\r\n// chairmanSign?: string\r\n// secretarySign?: string\r\n// }\r\nexport type SignRepresentREC1ViewType = ReturnType\r\nconst SignRepresentREC1View = (props: SignRepresentREC1ViewType) => {\r\n const {\r\n onRefDialog,\r\n configDialog,\r\n isViewMode,\r\n initialValues,\r\n groupsUserLut,\r\n handleDirtyChange,\r\n onSubmitForm,\r\n initialUploadFileCer,\r\n certificateTopicList,\r\n projectData,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n // const isFirstTime = useRef(true)\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSigning: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n return (\r\n \r\n {(props) => {\r\n return (\r\n \r\n \r\n \r\n \r\n {groupsUserLut && groupsUserLut?.length > 0 ? (\r\n {}}\r\n requiredHalfWidth={true}\r\n disabled={isViewMode}\r\n required\r\n />\r\n ) : (\r\n \r\n {translate.get('LABEL.ALREADY_SIGNED')}\r\n \r\n )}\r\n \r\n \r\n\r\n {isSigning && (\r\n \r\n \r\n \r\n )}\r\n \r\n {!isViewMode && (\r\n {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n }}\r\n />\r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type SignRepresentREC1Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst SignRepresentREC1 = (props: SignRepresentREC1Type) => {\r\n const signRepresent = useSignRepresent(props)\r\n return \r\n}\r\n\r\nexport default SignRepresentREC1\r\n","import React from 'react'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../../constants/userGroup'\r\n\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\n\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport { SignREC1Type } from './signREC1'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport authenStore from '../../../../../../stores/authen/authenStore'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport SecretCodeForm from '../../../../shareUI/secretCodeForm/secretCodeForm'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport { encryption } from '../../../../../../utilities/encryption'\r\nimport { MemoMessagePaperType } from '../../../../../../services/web/types/responseWebServiceTypes'\r\ntype CerDialogType = Pick\r\nconst useSignREC1 = (props: SignREC1Type) => {\r\n const translate = useTranslate()\r\n const { callbackSaveComplete } = props\r\n const checkPermissionHook = checkPermission()\r\n const loadingHook = useLoading()\r\n const callWebService = useWebService()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const { projectData } = manageProjectStore\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const history = useHistory()\r\n const [isNotShowSign, setIsNotShowSign] = React.useState(false)\r\n\r\n const statusAfterClose = React.useRef('save')\r\n\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const { tabSelected } = appFolderAndTabStore\r\n const profileStore = authenStore()\r\n const { profile } = profileStore\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [configDialog, setConfigDialog] = React.useState()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n const [initialMemorandumFileSign, setInitialMemorandumFileSign] = React.useState()\r\n\r\n const dialogRef = React.useRef>()\r\n\r\n React.useEffect(() => {\r\n createInitialFileMemorandum()\r\n }, [])\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const createInitialFileMemorandum = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n const res = await callWebService.getProjectTerminateMemoMessage(submittedID)\r\n const result = res.result\r\n\r\n const memorandumInfo = result.memoMessagePaperInfo\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map(\r\n (itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n },\r\n )\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.unSignPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.unSignPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n\r\n const initialMemorandumFile = createInitialFileData(memorandumInfo)\r\n setInitialMemorandumFileSign(initialMemorandumFile)\r\n setInitialMemorandumFile(uploadFileMemoranduminit)\r\n }\r\n }\r\n\r\n const createInitialFileData = (memoMessagePaperInfo: MemoMessagePaperType) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memoMessagePaperInfo?.certificateSignFileName_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memoMessagePaperInfo?.certificateSignFileName_th,\r\n filename: memoMessagePaperInfo?.certificateSignFileName_th,\r\n fileID: memoMessagePaperInfo?.certificateSignFileName_th,\r\n path: memoMessagePaperInfo?.cerSign_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memoMessagePaperInfo?.certificateSignFileName_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memoMessagePaperInfo?.certificateSignFileName_en,\r\n filename: memoMessagePaperInfo?.certificateSignFileName_en,\r\n fileID: memoMessagePaperInfo?.certificateSignFileName_en,\r\n path: memoMessagePaperInfo?.cerSign_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const handleDirtyChange = (props: { dirty: boolean }) => {\r\n appFolderAndTabAction.setTabDirty(props.dirty)\r\n }\r\n const handleSubmitForm = async (val: any) => {\r\n const signCertificateRequest: REQServiceType.SignMemomessageType = {\r\n projectID: projectData?.projectID || null,\r\n signUserID: profileStore.profile.userId,\r\n submittedID: projectData?.submittedID || null,\r\n isSignBehalfSecretary: false,\r\n // isSignBehalfSecretary: false,\r\n signUserPinCode: null,\r\n }\r\n if (val.saveType === 'SAVE') {\r\n setConfigDialog({\r\n title: translate.get('LABEL.SECRET_PASSWORD'),\r\n content: React.createElement(SecretCodeForm, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n },\r\n onClickSave: (val: any) => {\r\n handleSubmitSecretCode({\r\n ...signCertificateRequest,\r\n signUserPinCode: encryption(val.password),\r\n })\r\n },\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n const handleSubmitSecretCode = async (paramForSave: any) => {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.signMemomessage(paramForSave)\r\n if (callbackSaveComplete) {\r\n if (res && res.status) {\r\n callbackSaveComplete(res.status, false)\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n // await conditionDialog(res?.status)\r\n }\r\n // const conditionDialog = (status: number) => {\r\n // if (status === 1) {\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n // content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n // type: 'alert-message',\r\n // onAfterClose: handleAfterClose,\r\n // })\r\n // dialogRef.current?.openDialog()\r\n // } else if (status === -2) {\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.WARNING'),\r\n // content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n // type: 'alert-message',\r\n // })\r\n // dialogRef.current?.openDialog()\r\n // } else {\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.ERROR'),\r\n // content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n // type: 'alert-message',\r\n // })\r\n // dialogRef.current?.openDialog()\r\n // }\r\n // }\r\n // const handleAfterClose = () => {\r\n // const { userGroupId } = profile\r\n // if (statusAfterClose.current === 'save') {\r\n // switch (userGroupId) {\r\n // case userGroup.presidentIRB1.groupId:\r\n // case userGroup.secretaryIRB1.groupId:\r\n // case userGroup.presidentIRB2.groupId:\r\n // case userGroup.secretaryIRB2.groupId:\r\n // case userGroup.vicePresident.groupId:\r\n // if (\r\n // tabSelected.id === menuTab.tab2Chairman.id ||\r\n // tabSelected.id === menuTab.tab6Chairman.id ||\r\n // tabSelected.id === menuTab.tab9.id\r\n // ) {\r\n // history.push(RoutePath.manageProject)\r\n // } else {\r\n // setDefaultPage()\r\n // }\r\n // break\r\n // case userGroup.committee.groupId:\r\n // if (tabSelected.id === menuTab.tab5Commitee.id) {\r\n // history.push(RoutePath.manageProject)\r\n // }\r\n // break\r\n\r\n // default:\r\n // setDefaultPage()\r\n // break\r\n // }\r\n // } else {\r\n // setDefaultPage()\r\n // }\r\n // }\r\n // const setDefaultPage = () => {\r\n // setConfigDialog({}) //clear function dialog\r\n // // loadLatestFolder()\r\n // appFolderAndTabAction.resetTabDirty()\r\n // }\r\n\r\n const chkBtnSing = async (projectID: number, submittedID: number) => {\r\n if (projectID && submittedID) {\r\n const { result, status } = await callWebService.getSignCertificate(projectID, submittedID)\r\n\r\n if (status === 1) {\r\n if (\r\n profile.userGroupId === constUserGroup.president ||\r\n profile.userGroupId === constUserGroup.reviewer\r\n ) {\r\n setIsNotShowSign(result.isSignBeHalfPresident)\r\n } else if (profile.userGroupId === constUserGroup.secretary) {\r\n setIsNotShowSign(result.isSignBeHalfSecretary)\r\n }\r\n }\r\n }\r\n }\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n return {\r\n onRefDialog,\r\n configDialog,\r\n\r\n isViewMode,\r\n isNotShowSign,\r\n\r\n initialValues,\r\n initialMemorandumFile,\r\n initialMemorandumFileSign,\r\n projectData,\r\n handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n }\r\n}\r\nexport default useSignREC1\r\n","import { Button, Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useSign from './useSign'\r\nimport { ButtonClose, ButtonSign } from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nexport type SignREC2ViewType = ReturnType\r\nconst SignREC1View = (props: SignREC2ViewType) => {\r\n const {\r\n onRefDialog,\r\n configDialog,\r\n\r\n isViewMode,\r\n isNotShowSign,\r\n initialMemorandumFile,\r\n initialValues,\r\n handleDirtyChange,\r\n onClickBackToSearch,\r\n onSubmitForm,\r\n initialMemorandumFileSign,\r\n projectData,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const btn = (props: any) => {\r\n if (!isViewMode && !isNotShowSign) {\r\n return (\r\n {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n }}\r\n />\r\n )\r\n } else {\r\n if (!isViewMode) {\r\n return \r\n }\r\n }\r\n }\r\n //มีการลงนามไปแล้ว\r\n const isSignMemoMessage: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n return (\r\n \r\n {(props) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {isSignMemoMessage && (\r\n \r\n \r\n \r\n )}\r\n \r\n {btn(props)}\r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type SignREC2Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst SignREC2 = (props: SignREC2Type) => {\r\n const signREC2 = useSign(props)\r\n return \r\n}\r\n\r\nexport default SignREC2\r\n","import { Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useSignREC1 from './useSign'\r\nimport { ButtonClose, ButtonSign } from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nexport type SignREC1ViewType = ReturnType\r\nconst SignREC1View = (props: SignREC1ViewType) => {\r\n const {\r\n onRefDialog,\r\n configDialog,\r\n\r\n isViewMode,\r\n isNotShowSign,\r\n initialMemorandumFile,\r\n initialValues,\r\n handleDirtyChange,\r\n onClickBackToSearch,\r\n onSubmitForm,\r\n initialMemorandumFileSign,\r\n projectData,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const btn = (props: any) => {\r\n if (!isViewMode && !isNotShowSign) {\r\n return (\r\n {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n }}\r\n />\r\n )\r\n } else {\r\n if (!isViewMode) {\r\n return \r\n }\r\n }\r\n }\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSignMemoMessage: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n return (\r\n \r\n {(props) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n\r\n {isSignMemoMessage && (\r\n \r\n \r\n \r\n )}\r\n \r\n {btn(props)}\r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type SignREC1Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst SignREC1 = (props: SignREC1Type) => {\r\n const signREC1 = useSignREC1(props)\r\n return \r\n}\r\n\r\nexport default SignREC1\r\n","import React from 'react'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport authenStore from '../../../../../../stores/authen/authenStore'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport SecretCodeForm from '../../../../shareUI/secretCodeForm/secretCodeForm'\r\n\r\n// --- Contants --- //\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\nimport { SignRepresentREC1Type } from './signRepresentREC1'\r\nimport { encryption } from '../../../../../../utilities/encryption'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport { memoMessagePaperInfoType } from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\n\r\ntype CerDialogType = Pick\r\nconst useSignRepresent = (props: SignRepresentREC1Type) => {\r\n const { callbackSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const manageProjectStore = useManageProjectStore()\r\n const { projectData } = manageProjectStore\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const [configDialog, setConfigDialog] = React.useState()\r\n const dialogRef = React.useRef>()\r\n const loadingHook = useLoading()\r\n const callWebService = useWebService()\r\n const profileStore = authenStore()\r\n const translate = useTranslate()\r\n\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n\r\n React.useEffect(() => {\r\n createInitialData()\r\n }, [])\r\n const createInitialData = async () => {\r\n if (projectData && projectData.stepID === constSubmittedStep.sign) {\r\n const submittedID = projectData.submittedID\r\n const projectID = projectData.projectID\r\n loadingHook.loadingOpen()\r\n const { result, status } = await callWebService.getSignMemomessage(projectID, submittedID)\r\n\r\n loadingHook.loadingClose()\r\n if (status === 1) {\r\n const initialData = {\r\n // chairmanSign: result.isSignBeHalfPresident,\r\n secretarySign: result.isSignBeHalfSecretary,\r\n }\r\n const initialMemorandumFile = createInitialFileData(result.memoMessagePaperInfo)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n }\r\n\r\n const createInitialFileData = (memoMessagePaperInfo: memoMessagePaperInfoType) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memoMessagePaperInfo?.certificateSignFileName_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memoMessagePaperInfo?.certificateSignFileName_th,\r\n filename: memoMessagePaperInfo?.certificateSignFileName_th,\r\n fileID: memoMessagePaperInfo?.certificateSignFileName_th,\r\n path: memoMessagePaperInfo?.cerSign_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memoMessagePaperInfo?.certificateSignFileName_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memoMessagePaperInfo?.certificateSignFileName_en,\r\n filename: memoMessagePaperInfo?.certificateSignFileName_en,\r\n fileID: memoMessagePaperInfo?.certificateSignFileName_en,\r\n path: memoMessagePaperInfo?.cerSign_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const handleDirtyChange = (props: { dirty: boolean }) => {\r\n appFolderAndTabAction.setTabDirty(props.dirty)\r\n }\r\n const handleSubmitForm = async (val: any) => {\r\n const signBehalfCertificateRequest: REQServiceType.SignMemomessageType = {\r\n projectID: projectData?.projectID || null,\r\n signUserID: profileStore.profile.userId,\r\n submittedID: projectData?.submittedID || null,\r\n isSignBehalfSecretary: val?.secretarySign,\r\n signUserPinCode: null,\r\n }\r\n if (val.saveType === 'SAVE') {\r\n setConfigDialog({\r\n title: translate.get('LABEL.SECRET_PASSWORD'),\r\n content: React.createElement(SecretCodeForm, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n },\r\n onClickSave: (val: any) => {\r\n handleSubmitSecretCode({\r\n ...signBehalfCertificateRequest,\r\n signUserPinCode: encryption(val.password),\r\n })\r\n },\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n const handleSubmitSecretCode = async (paramForSave: any) => {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.signMemomessage(paramForSave)\r\n\r\n loadingHook.loadingClose()\r\n conditionDialog(res?.status)\r\n }\r\n const conditionDialog = (status: number) => {\r\n if (status === 1) {\r\n if (status && callbackSaveComplete) {\r\n setDefaultPage()\r\n createInitialData()\r\n callbackSaveComplete(status, false)\r\n }\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const setDefaultPage = () => {\r\n setConfigDialog({}) //clear function dialog\r\n // loadLatestFolder()\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n return {\r\n onRefDialog,\r\n configDialog,\r\n isViewMode,\r\n initialValues,\r\n handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n initialMemorandumFile,\r\n projectData,\r\n memorandumTopic,\r\n }\r\n}\r\nexport default useSignRepresent\r\n","import React, { useRef } from 'react'\r\nimport { Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useSignRepresent from './useSignRepresent'\r\nimport { ButtonSign } from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport Checkbox from '../../../../../../control/checkbox/checkbox'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\ntype ErrorsType = {\r\n chairmanSign?: string\r\n secretarySign?: string\r\n}\r\nexport type SignRepresentREC2ViewType = ReturnType\r\nconst SignRepresentREC2View = (props: SignRepresentREC2ViewType) => {\r\n const {\r\n onRefDialog,\r\n configDialog,\r\n isViewMode,\r\n initialValues,\r\n handleDirtyChange,\r\n onSubmitForm,\r\n projectData,\r\n initialMemorandumFile,\r\n memorandumTopic,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const isFirstTime = useRef(true)\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSignMemoMessage: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n return (\r\n {\r\n const errors: ErrorsType = {}\r\n if (!initialValues.secretarySign) {\r\n /* case1 ยังไม่มีค่าใดถูกเลือกเลย */\r\n if (!values.secretarySign) {\r\n // errors.secretarySign = 'กรุณาระบุค่า'\r\n errors.secretarySign = translate.get('MESSAGE.M016')\r\n }\r\n }\r\n return errors\r\n }}\r\n >\r\n {(props) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {\r\n isFirstTime.current = false\r\n }}\r\n required\r\n />\r\n \r\n \r\n {/* {\r\n isFirstTime.current = false\r\n }}\r\n /> */}\r\n \r\n \r\n \r\n\r\n {isSignMemoMessage && (\r\n \r\n \r\n \r\n )}\r\n \r\n {!isViewMode && (\r\n {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n }}\r\n />\r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type SignRepresentREC2Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst SignRepresentREC2 = (props: SignRepresentREC2Type) => {\r\n const signRepresent = useSignRepresent(props)\r\n return \r\n}\r\n\r\nexport default SignRepresentREC2\r\n","import React, { useRef } from 'react'\r\nimport { Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useSignRepresent from './useSignRepresent'\r\nimport { ButtonSign } from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport Checkbox from '../../../../../../control/checkbox/checkbox'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\ntype ErrorsType = {\r\n chairmanSign?: string\r\n secretarySign?: string\r\n}\r\nexport type SignRepresentREC1ViewType = ReturnType\r\nconst SignRepresentREC1View = (props: SignRepresentREC1ViewType) => {\r\n const {\r\n onRefDialog,\r\n configDialog,\r\n isViewMode,\r\n initialValues,\r\n handleDirtyChange,\r\n onSubmitForm,\r\n projectData,\r\n initialMemorandumFile,\r\n memorandumTopic,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const isFirstTime = useRef(true)\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSignMemoMessage: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n return (\r\n {\r\n const errors: ErrorsType = {}\r\n if (!initialValues.secretarySign) {\r\n /* case1 ยังไม่มีค่าใดถูกเลือกเลย */\r\n if (!values.secretarySign) {\r\n // errors.secretarySign = 'กรุณาระบุค่า'\r\n errors.secretarySign = translate.get('MESSAGE.M016')\r\n }\r\n }\r\n return errors\r\n }}\r\n >\r\n {(props) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {\r\n isFirstTime.current = false\r\n }}\r\n required\r\n />\r\n \r\n {/* */}\r\n {/* {\r\n isFirstTime.current = false\r\n }}\r\n /> */}\r\n {/* */}\r\n \r\n \r\n\r\n {isSignMemoMessage && (\r\n \r\n \r\n \r\n )}\r\n \r\n {!isViewMode && (\r\n {\r\n props.form.change('saveType', 'SAVE')\r\n props.handleSubmit()\r\n }}\r\n />\r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type SignRepresentREC1Type = { callbackSaveComplete?: (status: number, isDraft: boolean) => void }\r\nconst SignRepresentREC1 = (props: SignRepresentREC1Type) => {\r\n const signRepresent = useSignRepresent(props)\r\n return \r\n}\r\n\r\nexport default SignRepresentREC1\r\n","import SynthesisREC1 from '../../../page/synthesis/synthesisREC1' //padge\r\nimport SynthesisREC2 from '../../../page/synthesis/synthesisREC2' //padge\r\nimport AdditionalDocumentREC1 from '../../../page/additionalDocument/additionalDocumentREC1'\r\nimport AdditionalDocumentREC2 from '../../../page/additionalDocument/additionalDocumentREC2'\r\nimport VerifyDocumentREC1 from '../../../page/verifyDocument/verifyDocumentREC1'\r\nimport VerifyDocumentREC2 from '../../../page/verifyDocument/verifyDocumentREC2'\r\nimport DefineProjectREC1 from '../../../page/defineProject/defineProjectREC1'\r\nimport DefineProjectREC2 from '../../../page/defineProject/defineProjectREC2'\r\nimport GenerateCertificateREC1 from '../../../page/generateCertificate/generateCertificateREC1'\r\nimport GenerateCertificateREC2 from '../../../page/generateCertificate/generateCertificateREC2'\r\nimport DefineSubmittedDateREC1 from '../../../page/defineSubmittedDate/defineSubmittedDateREC1'\r\nimport DefineSubmittedDateREC2 from '../../../page/defineSubmittedDate/defineSubmittedDateREC2'\r\nimport ReviewerCommentREC1 from '../../../page/reviewerComment/reviewerCommentREC1'\r\nimport ReviewerCommentREC2 from '../../../page/reviewerComment/reviewerCommentREC2'\r\n\r\nimport MMSubmitFirstConsideration from '../../../page/memoMessage/submitFirstConsideration/memoMessage'\r\n\r\nimport SynthesisReviewREC1 from '../../../page/synthesisReview/synthesisReviewREC1'\r\nimport SynthesisReviewREC2 from '../../../page/synthesisReview/synthesisReviewREC2'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\n\r\nimport { OfficerType } from './officerType'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport SignREC1 from '../../../page/sign/signREC1'\r\nimport SignREC2 from '../../../page/sign/signREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentREC1'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentREC2'\r\n\r\nimport SignVicePresidentREC2 from '../../../page/signVicePresident/signVicePresidentREC2'\r\nimport SignVicePresidentREC1 from '../../../page/signVicePresident/signVicePresidentREC1'\r\n\r\nimport MMSignREC2 from '../../../page/sign/signMemoMessage/signREC2'\r\nimport MMSignREC1 from '../../../page/sign/signMemoMessage/signREC1'\r\nimport MMSignRepresentREC2 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC2'\r\nimport MMSignRepresentREC1 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC1'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const isNotAboutPeople = manageProjectStore.projectData?.isNotAboutPeople ?? false\r\n\r\n const renderSignRepresentElement = (REC: 1 | 2) => {\r\n const isVicePresident = checkPermission.isUserViceChairman()\r\n if (REC === 1) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n } else if (REC === 2) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n }\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n let isOneComment = false\r\n let isNotDisableTestResult = false\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC1
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n // code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n if (isNotAboutPeople) {\r\n return \r\n } else {\r\n return \r\n }\r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n if (isNotAboutPeople) {\r\n return \r\n } else {\r\n return renderSignRepresentElement(1) //\r\n }\r\n\r\n case Constants.menuTab.tab11.id: //ออกใบบันทึกข้อความ\r\n return \r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n default:\r\n return
\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC2
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n /// code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n if (\r\n manageProjectStore?.projectData &&\r\n manageProjectStore?.projectData?.considerInfo?.value === constConsiderType.exempt\r\n ) {\r\n isOneComment = true\r\n }\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n\r\n if (\r\n manageProjectStore?.projectData &&\r\n manageProjectStore?.projectData?.considerInfo?.value === constConsiderType.exempt\r\n ) {\r\n isOneComment = true\r\n }\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n if (isNotAboutPeople) {\r\n return \r\n } else {\r\n return \r\n }\r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n // return \r\n // return \r\n if (isNotAboutPeople) {\r\n return \r\n } else {\r\n return renderSignRepresentElement(2)\r\n }\r\n\r\n case Constants.menuTab.tab11.id:\r\n return \r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useRequestNewProject from './useRequestNewProject'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\ntype RequestNewProjectViewType = ReturnType & Omit\r\nconst RequestNewProjectView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n // onClickCloseProject,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n // const isAdmin = checkPermission.isUserAdmin()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const currentSelectTab = appFolderAndTabStore.tabSelected?.stepID\r\n\r\n const checkConditionBtnClose = () => {\r\n let isEditDirector = false\r\n\r\n //เช็คว่ามีการกลับมาแก้ไขกรรมการมั้ย และไม่ใช่กรรมการเข้ามาใช่มั้ย (ปุ่มถอนยื่นต้องแสดงทุก step)\r\n if (projectData?.stepID) {\r\n isEditDirector = projectData?.stepID >= constSubmittedStep.submit && projectData?.committeeInfo.length >= 0\r\n }\r\n\r\n // เช็คว่าแก๊งประธานมาตรวจสอบเอกสารในขั้นตอนกำหนดประเภทโครงการมั้ย\r\n const isChairmanVerifyDoc =\r\n checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.specifyProjectType\r\n\r\n // เช็คว่าผ่านstepการกำหนดประเภทโครงการและกรรมการไปรึยัง และกำลังเปิด tab กำหนดประเภทและกรรมการอยู่ใช่มั้ย\r\n const isChkStepEditDirector =\r\n currentSelectTab === constSubmittedStep.specifyProjectType &&\r\n projectData?.stepID !== constSubmittedStep.specifyProjectType\r\n\r\n let isBtnClose = isChairmanVerifyDoc ? false : isChkStepEditDirector ? isEditDirector : isViewMode\r\n\r\n return isBtnClose\r\n }\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {checkConditionBtnClose() && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type RequestNewProjectType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst RequestNewProject: React.FC = (props) => {\r\n const requestNewProject = useRequestNewProject(props)\r\n return \r\n}\r\nexport default RequestNewProject\r\n","import React from 'react'\r\nimport { RequestNewProjectType } from './requestNewProject'\r\nimport * as RequestNewProjectOtherType from './requestNewProjectOtherType'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useDisplayUpdater from '../../../shareUI/displayUpdater/useDisplayUpdater'\r\n\r\nexport default (props: RequestNewProjectType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n const displayUpdater = useDisplayUpdater()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n const loadingHook = useLoading()\r\n\r\n React.useEffect(() => {\r\n console.log('####Request NewProject####')\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n // const stepID = appFolderAndTabStore?.tabSelected?.stepID\r\n // const projectID = manageProjectStore?.projectData?.projectID\r\n // const submittedID = manageProjectStore?.projectData?.submittedID\r\n // if (projectID && submittedID && stepID) {\r\n // displayUpdater.getUpdater(submittedID, projectID, stepID)\r\n // }\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport NewProject from '../../../page/requestNewProject/newProject/newProject'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/resultOfConsider'\r\nimport NoticeAdditionalDocument from '../../../page/noticeAdditionalDocument/noticeAdditionalDocument'\r\nimport CertificateStampDocument from '../../../page/certificateStampDocument/certificateStampDocument'\r\n\r\nimport { menuTab } from '../../../../../../constants/constants'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return (\r\n \r\n )\r\n case menuTab.tab22.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab24.id:\r\n return \r\n\r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n projectData: manageProjectStore.projectData,\r\n initialData: initialData,\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import SynthesisREC1 from '../../../page/synthesis/synthesisREC1' //padge\r\nimport SynthesisREC2 from '../../../page/synthesis/synthesisREC2' //padge\r\nimport AdditionalDocumentREC1 from '../../../page/additionalDocument/additionalDocumentREC1'\r\nimport AdditionalDocumentREC2 from '../../../page/additionalDocument/additionalDocumentREC2'\r\nimport VerifyDocumentREC1 from '../../../page/verifyDocument/verifyDocumentREC1'\r\nimport VerifyDocumentREC2 from '../../../page/verifyDocument/verifyDocumentREC2'\r\nimport DefineProjectREC1 from '../../../page/defineProject/defineProjectREC1'\r\nimport DefineProjectREC2 from '../../../page/defineProject/defineProjectREC2'\r\nimport GenerateCertificateREC1 from '../../../page/generateCertificate/generateCertificateREC1'\r\nimport GenerateCertificateREC2 from '../../../page/generateCertificate/generateCertificateREC2'\r\nimport DefineSubmittedDateREC1 from '../../../page/defineSubmittedDate/defineSubmittedDateREC1'\r\nimport DefineSubmittedDateREC2 from '../../../page/defineSubmittedDate/defineSubmittedDateREC2'\r\nimport ReviewerCommentREC1 from '../../../page/reviewerComment/reviewerCommentREC1'\r\nimport ReviewerCommentREC2 from '../../../page/reviewerComment/reviewerCommentREC2'\r\n\r\nimport SynthesisReviewREC1 from '../../../page/synthesisReview/synthesisReviewREC1'\r\nimport SynthesisReviewREC2 from '../../../page/synthesisReview/synthesisReviewREC2'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\n\r\nimport SignREC1 from '../../../page/sign/signREC1'\r\nimport SignREC2 from '../../../page/sign/signREC2'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentREC1'\r\n\r\nimport { OfficerType, OfficerViewType } from './officerType'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useOfficer from './useOfficer'\r\nimport * as Constants from '../../../../../../constants/constants'\r\n\r\nimport SignVicePresidentREC2 from '../../../page/signVicePresident/signVicePresidentREC2'\r\nimport SignVicePresidentREC1 from '../../../page/signVicePresident/signVicePresidentREC1'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete, projectData } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n let isNotDisableTestResult = false\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC1
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n // code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n // return \r\n return renderSignRepresentElement(1)\r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC2
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n /// code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n // return \r\n return renderSignRepresentElement(2)\r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n const renderSignRepresentElement = (REC: 1 | 2) => {\r\n const isVicePresident = checkPermission.isUserViceChairman()\r\n if (REC === 1) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n } else if (REC === 2) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n const useOfficerModel = useOfficer(props)\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\nimport { UseOfficerType } from './officerType'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nexport default (props: UseOfficerType) => {\r\n const {} = props\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n\r\n return {\r\n projectData: manageProjectStore.projectData,\r\n }\r\n}\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useRequestNewProjectEditAfterReview from './useRequestNewProjectEditAfterReview'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\ntype RequestNewProjectViewType = ReturnType &\r\n Omit\r\nconst RequestNewProjectView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n // onClickCloseProject,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const currentSelectTab = appFolderAndTabStore.tabSelected.stepID\r\n\r\n const checkConditionBtnClose = () => {\r\n let isEditDirector = false\r\n\r\n //เช็คว่ามีการกลับมาแก้ไขกรรมการมั้ย และไม่ใช่กรรมการเข้ามาใช่มั้ย (ปุ่มถอนยื่นต้องแสดงทุก step)\r\n if (projectData?.stepID) {\r\n isEditDirector = projectData?.stepID >= constSubmittedStep.submit && projectData?.committeeInfo.length >= 0\r\n }\r\n\r\n // เช็คว่าแก๊งประธานมาตรวจสอบเอกสารในขั้นตอนกำหนดประเภทโครงการมั้ย\r\n const isChairmanVerifyDoc =\r\n checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.specifyProjectType\r\n\r\n // เช็คว่าผ่านstepการกำหนดประเภทโครงการและกรรมการไปรึยัง และกำลังเปิด tab กำหนดประเภทและกรรมการอยู่ใช่มั้ย\r\n const isChkStepEditDirector =\r\n currentSelectTab === constSubmittedStep.specifyProjectType &&\r\n projectData?.stepID !== constSubmittedStep.specifyProjectType\r\n\r\n let isBtnClose = isChairmanVerifyDoc ? false : isChkStepEditDirector ? isEditDirector : isViewMode\r\n\r\n return isBtnClose\r\n }\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {checkConditionBtnClose() && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type RequestNewProjectType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst RequestNewProject: React.FC = (props) => {\r\n const requestNewProjectEditAfterReview = useRequestNewProjectEditAfterReview(props)\r\n return \r\n}\r\nexport default RequestNewProject\r\n","import React from 'react'\r\nimport { RequestNewProjectType } from './requestNewProjectEditAfterReview'\r\nimport * as RequestNewProjectOtherType from './requestNewProjectEditAfterReviewOtherType'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\n\r\nexport default (props: RequestNewProjectType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n console.log('####Request NewProject EditAfter Review####')\r\n }, [])\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\n","import React from 'react'\r\nimport * as requestFormType from './projectPhaseType'\r\n\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\n\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport { topicForLecturer, topicForStudent } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\n\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport * as REQServiceTypes from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport _ from 'lodash'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport { encryptionAES } from '../../../../../../utilities/encryption'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { ResultDocumentTopicLut } from '../../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport useProjectHook from '../../../../shareLogic/useProjectHook'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\n\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\n\r\ntype MyFileDataType = {\r\n documentTopicID?: number\r\n fileTokenInfo: Array<{\r\n fileID: any\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n }>\r\n subtopic?: {\r\n subtopicID: number\r\n page: number | string\r\n }[]\r\n}\r\n\r\nconst useRequestForm = (props: requestFormType.UseRequestFormType) => {\r\n const { formMode, projectSubmittedTypeID, isViewMode, onSaveComplete, initialData } = props\r\n\r\n const translate = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const projectHook = useProjectHook()\r\n\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const checkPermission = useCheckPermission()\r\n\r\n const { profile } = authenStore\r\n\r\n const { configLoading, loadingClose, loadingOpen } = useLoading()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const callLookup = useLookupService()\r\n const [selectedIrb, setSelectedIrb] = React.useState('1')\r\n\r\n const dialogTwoRef = React.useRef>()\r\n const projectIDRef = React.useRef()\r\n const submittedIDRef = React.useRef()\r\n const irbRef = React.useRef()\r\n const parameterForSaveRef = React.useRef()\r\n const submitValueRef = React.useRef()\r\n const isDraftRef = React.useRef(false)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const { documentTopic } = manageProjectStore\r\n const researcherTypeRef = React.useRef()\r\n const documentTopicRef = React.useRef()\r\n const valuesForm = React.useRef()\r\n const tabSelectedIndexRef = React.useRef(null)\r\n const newTabSelectedRef = React.useRef(null)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n let isApproveWithComment = false\r\n if (manageProjectStore.projectData) {\r\n isApproveWithComment = projectHook.isFlowApproveWithComment(manageProjectStore.projectData)\r\n }\r\n\r\n React.useEffect(() => {\r\n console.log('####Page: Project Amendment####')\r\n return () => {\r\n //clear ค่า tabRef\r\n tabSelectedIndexRef.current = null\r\n newTabSelectedRef.current = null\r\n }\r\n }, [])\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData?.irb && manageProjectStore.projectData?.submitTypeInfo.value) {\r\n getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n manageProjectStore.projectData?.submitTypeInfo.value,\r\n )\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n // const fileTokenInfo: Array = uploadObj.uploadFileObj.fileList?.map((file) => file.fileToken) ?? []\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n const getParameterForSave = (value: requestFormType.MyRequestFormType) => {\r\n let submittedTypeID = projectSubmittedTypeID\r\n if (manageProjectStore && manageProjectStore?.projectData) {\r\n if (manageProjectStore.projectData.submitTypeInfo && manageProjectStore.projectData.submitTypeInfo?.value) {\r\n submittedTypeID = manageProjectStore.projectData.submitTypeInfo?.value\r\n }\r\n }\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = {\r\n projectID: manageProjectStore?.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore?.projectData?.submittedID ?? null,\r\n irb: value.IRB ? parseInt(value.IRB.value) : null, //parseInt(value?.faculty?.irb) || null\r\n userID: profile.userId as number,\r\n projectName_th: value?.projectNameTH || null,\r\n projectName_en: value?.projectNameEN || null,\r\n // projectSubmitTypeID: value?.isPhase ? parseInt(value.isPhase) : null, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n projectSubmitTypeID: submittedTypeID, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n\r\n facultyID: value.faculty ? parseInt(value.faculty.value) : null,\r\n requestPhase: value.numPhase ? value.numPhase : null,\r\n isTools: value.isPhase === '2' ? (value.isTools === '2' ? true : false) : null,\r\n researcherTypeID: value.researcherType ? parseInt(value.researcherType.value) : null,\r\n titleNameID: value.titleName ? parseInt(value.titleName) : null,\r\n // titleNameOther: value.otherTitleName ? value.otherTitleName : null,\r\n titleNameOther_th: value.otherTitleNameTH ? value.otherTitleNameTH : null,\r\n titleNameOther_en: value.otherTitleNameEN ? value.otherTitleNameEN : null,\r\n academicPositionID: value.academicPosition ? parseInt(value.academicPosition) : null,\r\n // academicPositionOther: value.otherAcademicPosition ? value.otherAcademicPosition : null,\r\n academicPositionOther_th: value.otherAcademicPositionTH ? value.otherAcademicPositionTH : null,\r\n academicPositionOther_en: value.otherAcademicPositionEN ? value.otherAcademicPositionEN : null,\r\n educationLevelID: value.educationLevel ? parseInt(value.educationLevel.value) : null,\r\n researcherName_th: value.nameTH ? value.nameTH : null,\r\n researcherName_en: value.nameEN ? value.nameEN : null,\r\n email: value.email ? value.email : null,\r\n homePhone: value.homePhone ? value.homePhone : null,\r\n mobilePhone: value.mobilePhone ? value.mobilePhone : null,\r\n fax: value.fax ? value.fax : null,\r\n isDraft: value?.submitType === 'save' ? false : true,\r\n documentInfo: getDocumentInfo(value),\r\n isLanguage_th: value.langTH ? value.langTH : false,\r\n isLanguage_en: value.langEN ? value.langEN : false,\r\n isRequestCertificatePaper: value.isCertificatePaperList === '1' ? true : false,\r\n isDr: value.isDr ? value.isDr : false,\r\n }\r\n\r\n return parameterForSave\r\n }\r\n const handleClickSubmit = (value: requestFormType.MyRequestFormType) => {\r\n submitValueRef.current = value\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(value)\r\n parameterForSaveRef.current = parameterForSave\r\n switch (value.submitType) {\r\n case 'save':\r\n // code block\r\n isDraftRef.current = false\r\n handleSave()\r\n\r\n break\r\n\r\n case 'draft':\r\n // code block\r\n isDraftRef.current = true\r\n handleSaveDraft()\r\n\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n const checkRequirePDF = (documentInfo: MyFileDataType[]) => {\r\n let isRequirePDF = false\r\n\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if (documentInfo[i]?.fileTokenInfo[j].fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n\r\n const checkSubtopic = (documentInfo: MyFileDataType[]) => {\r\n let isEmptyPage = false\r\n\r\n //หาว่าหัวข้ออัปโหลดเอกสารมีให้อัปโหลดหัวข้อย่อยมั้ย\r\n const docTopic = manageProjectStore.documentTopic?.filter((item) => item.subtopic.length > 0)\r\n\r\n //ถ้ามีให้เข้าไปเช็คตามเงื่อนไข if\r\n if (docTopic?.length) {\r\n // วน loop หัวข้อที่มีให้อัปโหลดเอกสารหัวข้อย่อย\r\n docTopic.forEach((mainTopic) => {\r\n // วน loop หัวข้อที่มีการอัปโหลดเอกสารเข้ามา\r\n documentInfo.forEach((itm) => {\r\n // เช็คว่าเอกสารที่มีการอัปโหลดเข้ามาใช่เอกสารที่มีหัวข้อย่อยให้อัปโหลดหรือป่าว\r\n if (mainTopic.id === itm.documentTopicID) {\r\n // เช็คว่าหัวข้อย่อยที่อัพโหลดเข้ามาครบมั้ย\r\n if (itm.subtopic?.length != mainTopic.subtopic.length) {\r\n isEmptyPage = true\r\n } else {\r\n // เช็คว่าที่อัปมาครบมีช่องไหนกรอกเป็น ช่องว่างมั้ย\r\n const chkEmpty = itm.subtopic.find(\r\n (e) => e.page == null || e.page == '' || e.page == undefined,\r\n )\r\n if (chkEmpty) {\r\n isEmptyPage = true\r\n }\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n return isEmptyPage\r\n }\r\n const validateRequiredUploadFile = (uploadFile: Array<{ uploadFileObj: any }>, skipValidate: boolean = false) => {\r\n let isValid = true\r\n if (!skipValidate) {\r\n uploadFile?.every(({ uploadFileObj: file }) => {\r\n if (file?.isRequired && file?.fileList?.length === 0) {\r\n //เป็นหัวข้อที่มีการ required แต่ว่าไม่ upload เอกสาร\r\n isValid = false\r\n return false //break\r\n }\r\n return true //continue\r\n })\r\n\r\n if (!isValid) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get2Element('ALERT.CONTENT.PLEASE_UPLOAD_REQUIRED_TOPIC', [\r\n '',\r\n ]) as any,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n return isValid\r\n }\r\n const handleSave = async () => {\r\n if (validateRequiredUploadFile(submitValueRef.current.uploadFile)) {\r\n if (parameterForSaveRef.current?.documentInfo?.length === 0) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n const isRequirePDF = checkRequirePDF(parameterForSaveRef.current?.documentInfo)\r\n const isEmptyPage = checkSubtopic(parameterForSaveRef.current?.documentInfo)\r\n if (isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else if (isEmptyPage) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.PLEASE_COMPLETE_PAGE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: handleClickConfirmSave,\r\n })\r\n }\r\n }\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const handleSaveDraft = async () => {\r\n handleClickConfirmSave()\r\n }\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const handleClickConfirmSave = async () => {\r\n loadingOpen()\r\n let res\r\n if (isApproveWithComment) {\r\n const parameterEditAfterReview = _.pick(parameterForSaveRef.current, [\r\n 'documentInfo',\r\n 'isDraft',\r\n 'projectID',\r\n 'submittedID',\r\n ])\r\n res = await callWebService.projectApproveWithComment(parameterEditAfterReview)\r\n } else {\r\n //Flow ยื่นโครงการใหม่ + Flow แก้ไขหลังพิจารณา\r\n res = await callWebService.projectPhaseManagement(parameterForSaveRef.current)\r\n }\r\n loadingClose()\r\n\r\n setConfigDialog({}) //clear function dialog\r\n dialogTwoRef.current?.closeDialog()\r\n if (formMode === 'EDIT') {\r\n if (onSaveComplete) onSaveComplete(res?.status, parameterForSaveRef.current?.isDraft as boolean)\r\n } else if (formMode === 'CREATE') {\r\n projectIDRef.current = res.result?.projectInfo?.projectID\r\n submittedIDRef.current = res.result?.projectInfo?.submittedID\r\n irbRef.current = res.result?.projectInfo?.irb\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: handleAfterCloseCreateSuccess,\r\n })\r\n appFolderAndTabAction.resetTabDirty()\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const handleAfterCloseCreateSuccess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n //เล่นใน mode create save เสร็จจะต้องไปเข้าหน้า Edit/View\r\n const encryptedProjectID = encryptionAES(`${projectIDRef.current}`)\r\n const encryptedSubmittedID = encryptionAES(`${submittedIDRef.current}`)\r\n const path = generatePath(RoutePath.manageProjectEdit, {\r\n projectID: encryptedProjectID,\r\n submittedID: encryptedSubmittedID,\r\n })\r\n history.push({\r\n pathname: path, // editMode\r\n })\r\n }\r\n\r\n const handleChangeFaculty = (irb?: string) => {\r\n if (irb) {\r\n const submittedTypeID =\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration\r\n getDocumentTopicLut(parseInt(irb), submittedTypeID)\r\n }\r\n }\r\n\r\n const handleChangeResearcherType = (val?: string) => {\r\n if (val) {\r\n filterTopicUpload(val)\r\n researcherTypeRef.current = val\r\n }\r\n }\r\n\r\n const filterTopicUpload = (val: string) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n if (documentTopic && documentTopicRef.current) {\r\n let isDocTopic = documentTopicRef.current\r\n if (val === '1') {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submittType: number) => {\r\n let submittedTypeID = projectSubmittedTypeID ? projectSubmittedTypeID : submittType\r\n\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submittedTypeID)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n\r\n if (researcherTypeRef.current) {\r\n filterTopicUpload(researcherTypeRef.current)\r\n }\r\n\r\n //กรองหัวข้อตามประเภทนักวิจัย กรณีที่มีข้อมูล projectData\r\n if (manageProjectStore.projectData?.researcherTypeInfo.value) {\r\n const researcherTypeID = manageProjectStore.projectData?.researcherTypeInfo.value\r\n filterTopicUpload(researcherTypeID.toString())\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n let documentInfo = manageProjectStore.projectData?.documentInfo\r\n let latestDocument = manageProjectStore.projectData?.latestDocument\r\n // const uploadFileinit: Array = documentTopicList?.map((itm: any, idx: number) => {\r\n let uploadFileInit = documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n let fileList = docInfo?.fileInfo?.map((file: any) => ({\r\n documentTopicID: docInfo.topicID,\r\n fileToken: file.fileToken, //fileToken\r\n filename: file.filename,\r\n fileID: file.fileID, //fileToken\r\n path: file.path,\r\n replaceFileID: file.replaceFileID,\r\n }))\r\n itm.uploadFileObj.fileList = fileList\r\n const subtopic = docInfo.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docInfo.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n itm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n })\r\n })\r\n\r\n //Section Replace File\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileInit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileID, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFileBy.replaceFileID,\r\n } as any,\r\n ]\r\n\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n // //**** Initial File Edit ****//\r\n // if (latestDocument && latestDocument.length > 0) {\r\n // uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n // latestDocument?.forEach((latestDocInfo: any) => {\r\n // let latestFile = []\r\n // let previousFile = []\r\n // if (latestDocInfo?.fileInfo[0]) {\r\n // latestFile = latestDocInfo.fileInfo[0].latestFileList.filter((itm: any) => itm.no === null)\r\n // previousFile =\r\n // latestDocInfo.fileInfo[0].latestFileList[\r\n // latestDocInfo.fileInfo[0].latestFileList.length - 2\r\n // ]\r\n // }\r\n // if (latestFile.length > 0) {\r\n // if (latestDocInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n // let fileList = [\r\n // {\r\n // documentTopicID: latestDocInfo.topicID,\r\n // fileToken: latestFile[0].fileToken, //fileToken\r\n // filename: latestFile[0].filename,\r\n // fileID: latestFile[0].fileToken, //fileToken\r\n // path: latestFile[0].path,\r\n // replaceFileID: previousFile?.fileID,\r\n // },\r\n // ]\r\n // itm.uploadFileObj.fileList = fileList\r\n // itm.uploadFileObj.subTopicPageList = []\r\n // }\r\n // }\r\n // })\r\n // })\r\n // }\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const handleClickClose = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n const handleDirtyChange = (props: any) => {\r\n const paramsDirty = {\r\n tabDirty: isViewMode ? false : props.dirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n isDraftRef.current = true\r\n\r\n if (valuesForm) {\r\n const values = { ...valuesForm.current } as requestFormType.MyRequestFormType\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(values)\r\n parameterForSaveRef.current = parameterForSave\r\n newTabSelectedRef.current = newTabSelected\r\n tabSelectedIndexRef.current = tabIndex\r\n handleSaveDraft()\r\n }\r\n }\r\n\r\n const handleDeleteProject = () => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_DELETE'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: async () => {\r\n if (manageProjectStore?.projectData?.projectID) {\r\n const res = await callWebService.deleteProject(manageProjectStore?.projectData?.projectID)\r\n setConfigDialog({}) //clear function dialog\r\n history.push('/manage-project')\r\n }\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const chkDisplayBTNDeleteProject: boolean =\r\n (initialData?.projectSubmitType &&\r\n checkPermission.chkDisplayBTNDeleteProject(parseInt(initialData?.projectSubmitType.value)) &&\r\n initialData?.isDraft &&\r\n manageProjectStore.projectData?.verifyDocument == null) ||\r\n false\r\n\r\n return {\r\n // isDraftData: parameterForSaveRef.current ? parameterForSaveRef.current.isDraft : initialData?.isDraft || false,\r\n isDraftData: chkDisplayBTNDeleteProject,\r\n initialUploadFile,\r\n configDialog,\r\n onRefDialogTwo,\r\n selectedIrb,\r\n configLoading,\r\n valuesForm,\r\n isApproveWithComment,\r\n projectData: manageProjectStore.projectData,\r\n handleDirtyChange,\r\n onClickSubmit: handleClickSubmit,\r\n onClickCancel: handleClickCancel,\r\n onClickClose: handleClickClose,\r\n handleChangeFaculty: handleChangeFaculty,\r\n onChangeResearcherType: handleChangeResearcherType,\r\n onClickDeleteProject: handleDeleteProject,\r\n }\r\n}\r\n\r\nexport default useRequestForm\r\n","import React from 'react'\r\nimport * as requestFormType from './projectPhaseType'\r\nimport useRequestForm from './useProjectPhase'\r\n\r\n// --- MaterialUI --- //\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\n\r\n// --- FinalForm --- //\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n// --- Control --- //\r\nimport Button from '../../../../../../control/button/button'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\n\r\n// --- Share UI --- //\r\nimport EthicsForm from '../../../../shareUI/ethicsForm/ethicsForm'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport RemarkFromAdmin from '../../../../shareUI/remarkFromAdmin/remarkFromAdmin'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useSnackbarAction from '../../../../../../stores/snackbar/snackbarAction'\r\n\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\n\r\ntype ErrorsType = {\r\n langTH?: string\r\n langEN?: string\r\n}\r\n\r\n//View\r\nconst RequestFormView = (props: requestFormType.RequestFormView) => {\r\n const {\r\n onClickSubmit,\r\n onClickCancel,\r\n // onClickClose,\r\n onRefDialogTwo,\r\n configDialog,\r\n handleChangeFaculty,\r\n selectedIrb,\r\n // configLoading,\r\n isApproveWithComment,\r\n isEditAfterReview = false,\r\n // --- props from outer --- //\r\n btnClose,\r\n initialData = {},\r\n isViewMode = false,\r\n initialUploadFile = [],\r\n projectData,\r\n handleDirtyChange,\r\n onChangeResearcherType,\r\n valuesForm,\r\n formValueRef,\r\n isDraftData,\r\n onClickDeleteProject,\r\n } = props\r\n //* STORE *//\r\n const manageProjectStore = useManageProjectStore()\r\n const snackbarAction = useSnackbarAction()\r\n\r\n const { documentTopic } = manageProjectStore\r\n\r\n const translate = useTranslate()\r\n const uploadFileinit = documentTopic?.map(() => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n },\r\n }\r\n })\r\n\r\n const isNotCompleteDocument = projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument\r\n const isDisableDoc = isViewMode && (!isNotCompleteDocument || !isApproveWithComment)\r\n\r\n let isUploadEditMode = false\r\n if (isApproveWithComment || isNotCompleteDocument || isEditAfterReview) {\r\n isUploadEditMode = true\r\n }\r\n return (\r\n 0 ? initialUploadFile : uploadFileinit,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n validate={(values) => {\r\n const errors: ErrorsType = {}\r\n if (!values.langTH && !values.langEN) {\r\n errors.langTH = translate.get('MESSAGE.M016')\r\n\r\n errors.langEN = translate.get('MESSAGE.M016')\r\n }\r\n\r\n return errors\r\n }}\r\n >\r\n {({ handleSubmit, form, dirty, invalid, errors, values }) => {\r\n valuesForm.current = values\r\n if (formValueRef) formValueRef.current = values\r\n return (\r\n \r\n \r\n {isNotCompleteDocument && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {!btnClose && (\r\n \r\n {\r\n onClickDeleteProject()\r\n }\r\n : undefined\r\n }\r\n onClickClose={() => {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst RequestFormCtrl = (props: requestFormType.RequestFormType) => {\r\n const requestFormModel = useRequestForm(props)\r\n return \r\n}\r\nexport default RequestFormCtrl\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n gridBtn: {\r\n marginTop: '2%',\r\n },\r\n}))\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport NewProject from '../../../page/requestNewProject/newProject/newProject'\r\nimport ProjectPhase from '../../../page/requestNewProject/projectPhase/projectPhase'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/resultOfConsider'\r\nimport NoticeAdditionalDocument from '../../../page/noticeAdditionalDocument/noticeAdditionalDocument'\r\nimport CertificateStampDocument from '../../../page/certificateStampDocument/certificateStampDocument'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\nimport { menuTab } from '../../../../../../constants/constants'\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return (\r\n \r\n )\r\n case menuTab.tab22.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab24.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import SynthesisREC1 from '../../../page/synthesis/synthesisREC1' //padge\r\nimport SynthesisREC2 from '../../../page/synthesis/synthesisREC2' //padge\r\nimport AdditionalDocumentREC1 from '../../../page/additionalDocument/additionalDocumentREC1'\r\nimport AdditionalDocumentREC2 from '../../../page/additionalDocument/additionalDocumentREC2'\r\nimport VerifyDocumentREC1 from '../../../page/verifyDocument/verifyDocumentREC1'\r\nimport VerifyDocumentREC2 from '../../../page/verifyDocument/verifyDocumentREC2'\r\nimport DefineProjectREC1 from '../../../page/defineProject/defineProjectREC1'\r\nimport DefineProjectREC2 from '../../../page/defineProject/defineProjectREC2'\r\nimport GenerateCertificateREC1 from '../../../page/generateCertificate/generateCertificateREC1'\r\nimport GenerateCertificateREC2 from '../../../page/generateCertificate/generateCertificateREC2'\r\nimport DefineSubmittedDateREC1 from '../../../page/defineSubmittedDate/defineSubmittedDateREC1'\r\nimport DefineSubmittedDateREC2 from '../../../page/defineSubmittedDate/defineSubmittedDateREC2'\r\nimport ReviewerCommentREC1 from '../../../page/reviewerComment/reviewerCommentREC1'\r\nimport ReviewerCommentREC2 from '../../../page/reviewerComment/reviewerCommentREC2'\r\n\r\nimport SynthesisReviewREC1 from '../../../page/synthesisReview/synthesisReviewREC1'\r\nimport SynthesisReviewREC2 from '../../../page/synthesisReview/synthesisReviewREC2'\r\n\r\nimport { OfficerType } from './officerType'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\n\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport SignREC2 from '../../../page/sign/signREC2'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentREC1'\r\nimport SignREC1 from '../../../page/sign/signREC1'\r\n\r\nimport SignVicePresidentREC2 from '../../../page/signVicePresident/signVicePresidentREC2'\r\nimport SignVicePresidentREC1 from '../../../page/signVicePresident/signVicePresidentREC1'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n let isOneComment = false\r\n let isNotDisableTestResult = false\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC1
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n // code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return renderSignRepresentElement(1)\r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC2
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n /// code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n if (\r\n //ถ้าเป็น irb2 และ ประเภทโครงการเป็น excempt จะแสดงข้อคิดเห็นแบบกล่องเดียว\r\n manageProjectStore?.projectData &&\r\n manageProjectStore?.projectData?.considerInfo?.value === 3\r\n ) {\r\n isOneComment = true\r\n }\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n\r\n if (\r\n //ถ้าเป็น irb2 และ ประเภทโครงการเป็น excempt จะแสดงข้อคิดเห็นแบบกล่องเดียว\r\n manageProjectStore?.projectData &&\r\n manageProjectStore?.projectData?.considerInfo?.value === 3\r\n ) {\r\n isOneComment = true\r\n }\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return renderSignRepresentElement(2)\r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n const renderSignRepresentElement = (REC: 1 | 2) => {\r\n const isVicePresident = checkPermission.isUserViceChairman()\r\n if (REC === 1) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n } else if (REC === 2) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useProjectPhase from './useProjectPhase'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\ntype ProjectPhaseViewType = ReturnType & Omit\r\nconst ProjectPhaseView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n // onClickCloseProject,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const currentSelectTab = appFolderAndTabStore.tabSelected?.stepID\r\n\r\n const checkConditionBtnClose = () => {\r\n let isEditDirector = false\r\n\r\n //เช็คว่ามีการกลับมาแก้ไขกรรมการมั้ย และไม่ใช่กรรมการเข้ามาใช่มั้ย (ปุ่มถอนยื่นต้องแสดงทุก step)\r\n if (projectData?.stepID) {\r\n isEditDirector = projectData?.stepID >= constSubmittedStep.submit && projectData?.committeeInfo.length >= 0\r\n }\r\n\r\n // เช็คว่าแก๊งประธานมาตรวจสอบเอกสารในขั้นตอนกำหนดประเภทโครงการมั้ย\r\n const isChairmanVerifyDoc =\r\n checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.specifyProjectType\r\n\r\n // เช็คว่าผ่านstepการกำหนดประเภทโครงการและกรรมการไปรึยัง และกำลังเปิด tab กำหนดประเภทและกรรมการอยู่ใช่มั้ย\r\n const isChkStepEditDirector =\r\n currentSelectTab === constSubmittedStep.specifyProjectType &&\r\n projectData?.stepID !== constSubmittedStep.specifyProjectType\r\n\r\n let isBtnClose = isChairmanVerifyDoc ? false : isChkStepEditDirector ? isEditDirector : isViewMode\r\n\r\n return isBtnClose\r\n }\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {checkConditionBtnClose() && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type ProjectPhaseType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst ProjectPhase: React.FC = (props) => {\r\n const requestNewProject = useProjectPhase(props)\r\n return \r\n}\r\nexport default ProjectPhase\r\n","import React from 'react'\r\nimport { ProjectPhaseType } from './projectPhase'\r\nimport * as RequestNewProjectOtherType from './projectPhaseOtherType'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\nexport default (props: ProjectPhaseType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n const loadingHook = useLoading()\r\n\r\n React.useEffect(() => {\r\n console.log('####Project Phase####')\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\n","import React from 'react'\r\nimport * as requestFormType from './projectAmendmentType'\r\n\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\n\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport { topicForLecturer, topicForStudent } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\n\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport * as REQServiceTypes from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport _ from 'lodash'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport { encryptionAES } from '../../../../../../utilities/encryption'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { ResultDocumentTopicLut } from '../../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport useProjectHook from '../../../../shareLogic/useProjectHook'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\n\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\n\r\ntype MyFileDataType = {\r\n documentTopicID?: number\r\n fileTokenInfo: Array<{\r\n fileID: any\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n }>\r\n subtopic?: {\r\n subtopicID: number\r\n page: number | string\r\n }[]\r\n}\r\n\r\nconst useRequestForm = (props: requestFormType.UseRequestFormType) => {\r\n const { formMode, projectSubmittedTypeID, isViewMode, onSaveComplete, initialData } = props\r\n\r\n const translate = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const projectHook = useProjectHook()\r\n\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n\r\n const { profile } = authenStore\r\n const checkPermission = useCheckPermission()\r\n\r\n const { configLoading, loadingClose, loadingOpen } = useLoading()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const callLookup = useLookupService()\r\n const [selectedIrb, setSelectedIrb] = React.useState('1')\r\n\r\n const dialogTwoRef = React.useRef>()\r\n const projectIDRef = React.useRef()\r\n const submittedIDRef = React.useRef()\r\n const irbRef = React.useRef()\r\n const parameterForSaveRef = React.useRef()\r\n const submitValueRef = React.useRef()\r\n const isDraftRef = React.useRef(false)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const { documentTopic } = manageProjectStore\r\n const researcherTypeRef = React.useRef()\r\n const documentTopicRef = React.useRef()\r\n const valuesForm = React.useRef()\r\n const tabSelectedIndexRef = React.useRef(null)\r\n const newTabSelectedRef = React.useRef(null)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n let isApproveWithComment = false\r\n if (manageProjectStore.projectData) {\r\n isApproveWithComment = projectHook.isFlowApproveWithComment(manageProjectStore.projectData)\r\n }\r\n\r\n React.useEffect(() => {\r\n console.log('####Page: Project Amendment####')\r\n return () => {\r\n //clear ค่า tabRef\r\n tabSelectedIndexRef.current = null\r\n newTabSelectedRef.current = null\r\n }\r\n }, [])\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData?.irb && manageProjectStore.projectData?.submitTypeInfo.value) {\r\n getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n manageProjectStore.projectData?.submitTypeInfo.value,\r\n )\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n // const fileTokenInfo: Array = uploadObj.uploadFileObj.fileList?.map((file) => file.fileToken) ?? []\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n const getParameterForSave = (value: requestFormType.MyRequestFormType) => {\r\n let submittedTypeID = projectSubmittedTypeID\r\n if (manageProjectStore && manageProjectStore?.projectData) {\r\n if (manageProjectStore.projectData.submitTypeInfo && manageProjectStore.projectData.submitTypeInfo?.value) {\r\n submittedTypeID = manageProjectStore.projectData.submitTypeInfo?.value\r\n }\r\n }\r\n let isNeedEditForm = null\r\n if (value.isNeedEditForm) {\r\n if (value.isNeedEditForm === '1') {\r\n //ไม่ใช่\r\n isNeedEditForm = false\r\n } else if (value.isNeedEditForm === '2') {\r\n //ใช่\r\n isNeedEditForm = true\r\n }\r\n }\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = {\r\n projectID: manageProjectStore?.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore?.projectData?.submittedID ?? null,\r\n irb: value.IRB ? parseInt(value.IRB.value) : null, //parseInt(value?.faculty?.irb) || null\r\n userID: profile.userId as number,\r\n projectName_th: value?.projectNameTH || null,\r\n projectName_en: value?.projectNameEN || null,\r\n // projectSubmitTypeID: value?.isPhase ? parseInt(value.isPhase) : null, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n projectSubmitTypeID: submittedTypeID, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n\r\n facultyID: value.faculty ? parseInt(value.faculty.value) : null,\r\n requestPhase: value.numPhase ? value.numPhase : null,\r\n isTools: value.isPhase === '2' ? (value.isTools === '2' ? true : false) : null,\r\n researcherTypeID: value.researcherType ? parseInt(value.researcherType.value) : null,\r\n titleNameID: value.titleName ? parseInt(value.titleName) : null,\r\n // titleNameOther: value.otherTitleName ? value.otherTitleName : null,\r\n titleNameOther_th: value.otherTitleNameTH ? value.otherTitleNameTH : null,\r\n titleNameOther_en: value.otherTitleNameEN ? value.otherTitleNameEN : null,\r\n academicPositionID: value.academicPosition ? parseInt(value.academicPosition) : null,\r\n // academicPositionOther: value.otherAcademicPosition ? value.otherAcademicPosition : null,\r\n academicPositionOther_th: value.otherAcademicPositionTH ? value.otherAcademicPositionTH : null,\r\n academicPositionOther_en: value.otherAcademicPositionEN ? value.otherAcademicPositionEN : null,\r\n educationLevelID: value.educationLevel ? parseInt(value.educationLevel.value) : null,\r\n researcherName_th: value.nameTH ? value.nameTH : null,\r\n researcherName_en: value.nameEN ? value.nameEN : null,\r\n email: value.email ? value.email : null,\r\n homePhone: value.homePhone ? value.homePhone : null,\r\n mobilePhone: value.mobilePhone ? value.mobilePhone : null,\r\n fax: value.fax ? value.fax : null,\r\n isDraft: value?.submitType === 'save' ? false : true,\r\n documentInfo: getDocumentInfo(value),\r\n isLanguage_th: value.langTH ? value.langTH : false,\r\n isLanguage_en: value.langEN ? value.langEN : false,\r\n isRequestCertificatePaper: value.isCertificatePaperList === '1' ? true : false,\r\n isDr: value.isDr ? value.isDr : false,\r\n isNeedEditForm: isNeedEditForm,\r\n }\r\n\r\n return parameterForSave\r\n }\r\n const handleClickSubmit = (value: requestFormType.MyRequestFormType) => {\r\n submitValueRef.current = value\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(value)\r\n parameterForSaveRef.current = parameterForSave\r\n switch (value.submitType) {\r\n case 'save':\r\n // code block\r\n isDraftRef.current = false\r\n handleSave()\r\n\r\n break\r\n\r\n case 'draft':\r\n // code block\r\n isDraftRef.current = true\r\n handleSaveDraft()\r\n\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n const checkRequirePDF = (documentInfo: MyFileDataType[]) => {\r\n let isRequirePDF = false\r\n\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if (documentInfo[i]?.fileTokenInfo[j].fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n\r\n const checkSubtopic = (documentInfo: MyFileDataType[]) => {\r\n let isEmptyPage = false\r\n\r\n //หาว่าหัวข้ออัปโหลดเอกสารมีให้อัปโหลดหัวข้อย่อยมั้ย\r\n const docTopic = manageProjectStore.documentTopic?.filter((item) => item.subtopic.length > 0)\r\n\r\n //ถ้ามีให้เข้าไปเช็คตามเงื่อนไข if\r\n if (docTopic?.length) {\r\n // วน loop หัวข้อที่มีให้อัปโหลดเอกสารหัวข้อย่อย\r\n docTopic.forEach((mainTopic) => {\r\n // วน loop หัวข้อที่มีการอัปโหลดเอกสารเข้ามา\r\n documentInfo.forEach((itm) => {\r\n // เช็คว่าเอกสารที่มีการอัปโหลดเข้ามาใช่เอกสารที่มีหัวข้อย่อยให้อัปโหลดหรือป่าว\r\n if (mainTopic.id === itm.documentTopicID) {\r\n // เช็คว่าหัวข้อย่อยที่อัพโหลดเข้ามาครบมั้ย\r\n if (itm.subtopic?.length != mainTopic.subtopic.length) {\r\n isEmptyPage = true\r\n } else {\r\n // เช็คว่าที่อัปมาครบมีช่องไหนกรอกเป็น ช่องว่างมั้ย\r\n const chkEmpty = itm.subtopic.find(\r\n (e) => e.page == null || e.page == '' || e.page == undefined,\r\n )\r\n if (chkEmpty) {\r\n isEmptyPage = true\r\n }\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n return isEmptyPage\r\n }\r\n const validateRequiredUploadFile = (uploadFile: Array<{ uploadFileObj: any }>, skipValidate: boolean = false) => {\r\n let isValid = true\r\n if (!skipValidate) {\r\n uploadFile?.every(({ uploadFileObj: file }) => {\r\n if (file?.isRequired && file?.fileList?.length === 0) {\r\n //เป็นหัวข้อที่มีการ required แต่ว่าไม่ upload เอกสาร\r\n isValid = false\r\n return false //break\r\n }\r\n return true //continue\r\n })\r\n\r\n if (!isValid) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get2Element('ALERT.CONTENT.PLEASE_UPLOAD_REQUIRED_TOPIC', [\r\n '',\r\n ]) as any,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n return isValid\r\n }\r\n const handleSave = async () => {\r\n if (validateRequiredUploadFile(submitValueRef.current.uploadFile)) {\r\n if (parameterForSaveRef.current?.documentInfo?.length === 0) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n const isRequirePDF = checkRequirePDF(parameterForSaveRef.current?.documentInfo)\r\n const isEmptyPage = checkSubtopic(parameterForSaveRef.current?.documentInfo)\r\n if (isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else if (isEmptyPage) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.PLEASE_COMPLETE_PAGE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: handleClickConfirmSave,\r\n })\r\n }\r\n }\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const handleSaveDraft = async () => {\r\n handleClickConfirmSave()\r\n }\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const handleClickConfirmSave = async () => {\r\n loadingOpen()\r\n let res\r\n if (isApproveWithComment) {\r\n const parameterEditAfterReview = _.pick(parameterForSaveRef.current, [\r\n 'documentInfo',\r\n 'isDraft',\r\n 'projectID',\r\n 'submittedID',\r\n ])\r\n res = await callWebService.projectApproveWithComment(parameterEditAfterReview)\r\n } else {\r\n //Flow ยื่นโครงการใหม่ + Flow แก้ไขหลังพิจารณา\r\n res = await callWebService.projectAmendmentManagement(parameterForSaveRef.current)\r\n }\r\n loadingClose()\r\n\r\n setConfigDialog({}) //clear function dialog\r\n dialogTwoRef.current?.closeDialog()\r\n if (formMode === 'EDIT') {\r\n if (onSaveComplete) onSaveComplete(res?.status, parameterForSaveRef.current?.isDraft as boolean)\r\n } else if (formMode === 'CREATE') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: handleAfterCloseCreateSuccess,\r\n })\r\n appFolderAndTabAction.resetTabDirty()\r\n dialogTwoRef.current?.openDialog()\r\n projectIDRef.current = res.result?.projectInfo?.projectID\r\n submittedIDRef.current = res.result?.projectInfo?.submittedID\r\n irbRef.current = res.result?.projectInfo?.irb\r\n }\r\n }\r\n\r\n const handleAfterCloseCreateSuccess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n //เล่นใน mode create save เสร็จจะต้องไปเข้าหน้า Edit/View\r\n const encryptedProjectID = encryptionAES(`${projectIDRef.current}`)\r\n const encryptedSubmittedID = encryptionAES(`${submittedIDRef.current}`)\r\n const path = generatePath(RoutePath.manageProjectEdit, {\r\n projectID: encryptedProjectID,\r\n submittedID: encryptedSubmittedID,\r\n })\r\n history.push({\r\n pathname: path, // editMode\r\n })\r\n }\r\n\r\n const handleChangeFaculty = (irb?: string) => {\r\n if (irb) {\r\n const submittedTypeID =\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration\r\n getDocumentTopicLut(parseInt(irb), submittedTypeID)\r\n }\r\n }\r\n\r\n const handleChangeResearcherType = (val?: string) => {\r\n if (val) {\r\n filterTopicUpload(val)\r\n researcherTypeRef.current = val\r\n }\r\n }\r\n\r\n const filterTopicUpload = (val: string) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n if (documentTopic && documentTopicRef.current) {\r\n let isDocTopic = documentTopicRef.current\r\n if (val === '1') {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submittType: number) => {\r\n let submittedTypeID = projectSubmittedTypeID ? projectSubmittedTypeID : submittType\r\n\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submittedTypeID)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n\r\n if (researcherTypeRef.current) {\r\n filterTopicUpload(researcherTypeRef.current)\r\n }\r\n\r\n //กรองหัวข้อตามประเภทนักวิจัย กรณีที่มีข้อมูล projectData\r\n if (manageProjectStore.projectData?.researcherTypeInfo.value) {\r\n const researcherTypeID = manageProjectStore.projectData?.researcherTypeInfo.value\r\n filterTopicUpload(researcherTypeID.toString())\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n let documentInfo = manageProjectStore.projectData?.documentInfo\r\n let latestDocument = manageProjectStore.projectData?.latestDocument\r\n // const uploadFileinit: Array = documentTopicList?.map((itm: any, idx: number) => {\r\n let uploadFileInit = documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n let fileList = docInfo?.fileInfo?.map((file: any) => ({\r\n documentTopicID: docInfo.topicID,\r\n fileToken: file.fileToken, //fileToken\r\n filename: file.filename,\r\n fileID: file.fileID, //fileToken\r\n path: file.path,\r\n replaceFileID: file.replaceFileID,\r\n }))\r\n itm.uploadFileObj.fileList = fileList\r\n const subtopic = docInfo.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docInfo.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n itm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n })\r\n })\r\n\r\n //Section Replace File\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileInit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileID, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFileBy.replaceFileID,\r\n } as any,\r\n ]\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n // //**** Initial File Edit ****//\r\n // if (latestDocument && latestDocument.length > 0) {\r\n // uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n // latestDocument?.forEach((latestDocInfo: any) => {\r\n // let latestFile = []\r\n // let previousFile = []\r\n // if (latestDocInfo?.fileInfo[0]) {\r\n // latestFile = latestDocInfo.fileInfo[0].latestFileList.filter((itm: any) => itm.no === null)\r\n // previousFile =\r\n // latestDocInfo.fileInfo[0].latestFileList[\r\n // latestDocInfo.fileInfo[0].latestFileList.length - 2\r\n // ]\r\n // }\r\n // if (latestFile.length > 0) {\r\n // if (latestDocInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n // let fileList = [\r\n // {\r\n // documentTopicID: latestDocInfo.topicID,\r\n // fileToken: latestFile[0].fileToken, //fileToken\r\n // filename: latestFile[0].filename,\r\n // fileID: latestFile[0].fileToken, //fileToken\r\n // path: latestFile[0].path,\r\n // replaceFileID: previousFile?.fileID,\r\n // },\r\n // ]\r\n // itm.uploadFileObj.fileList = fileList\r\n // itm.uploadFileObj.subTopicPageList = []\r\n // }\r\n // }\r\n // })\r\n // })\r\n // }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const handleClickClose = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n const handleDirtyChange = (props: any) => {\r\n const paramsDirty = {\r\n tabDirty: isViewMode ? false : props.dirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n isDraftRef.current = true\r\n\r\n if (valuesForm) {\r\n const values = { ...valuesForm.current } as requestFormType.MyRequestFormType\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(values)\r\n parameterForSaveRef.current = parameterForSave\r\n newTabSelectedRef.current = newTabSelected\r\n tabSelectedIndexRef.current = tabIndex\r\n handleSaveDraft()\r\n }\r\n }\r\n\r\n const handleDeleteProject = () => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_DELETE'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: async () => {\r\n if (manageProjectStore?.projectData?.projectID) {\r\n const res = await callWebService.deleteProject(manageProjectStore?.projectData?.projectID)\r\n setConfigDialog({}) //clear function dialog\r\n history.push('/manage-project')\r\n }\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const chkDisplayBTNDeleteProject: boolean =\r\n (initialData?.projectSubmitType &&\r\n checkPermission.chkDisplayBTNDeleteProject(parseInt(initialData?.projectSubmitType.value)) &&\r\n initialData?.isDraft &&\r\n manageProjectStore.projectData?.verifyDocument == null) ||\r\n false\r\n return {\r\n isDraftData: chkDisplayBTNDeleteProject,\r\n initialUploadFile,\r\n configDialog,\r\n onRefDialogTwo,\r\n selectedIrb,\r\n configLoading,\r\n valuesForm,\r\n isApproveWithComment,\r\n projectData: manageProjectStore.projectData,\r\n handleDirtyChange,\r\n onClickSubmit: handleClickSubmit,\r\n onClickCancel: handleClickCancel,\r\n onClickClose: handleClickClose,\r\n handleChangeFaculty: handleChangeFaculty,\r\n onChangeResearcherType: handleChangeResearcherType,\r\n onClickDeleteProject: handleDeleteProject,\r\n }\r\n}\r\n\r\nexport default useRequestForm\r\n","import React from 'react'\r\nimport * as requestFormType from './projectAmendmentType'\r\nimport useRequestForm from './useProjectAmendment'\r\n\r\n// --- MaterialUI --- //\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\n\r\n// --- FinalForm --- //\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n// --- Control --- //\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\n\r\n// --- Share UI --- //\r\nimport EthicsForm from '../../../../shareUI/ethicsForm/ethicsForm'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport RemarkFromAdmin from '../../../../shareUI/remarkFromAdmin/remarkFromAdmin'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useSnackbarAction from '../../../../../../stores/snackbar/snackbarAction'\r\n\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\n\r\ntype ErrorsType = {\r\n langTH?: string\r\n langEN?: string\r\n}\r\n\r\n//View\r\nconst RequestFormView = (props: requestFormType.RequestFormView) => {\r\n const {\r\n onClickSubmit,\r\n onClickCancel,\r\n // onClickClose,\r\n onRefDialogTwo,\r\n configDialog,\r\n handleChangeFaculty,\r\n selectedIrb,\r\n // configLoading,\r\n isApproveWithComment,\r\n isEditAfterReview = false,\r\n // --- props from outer --- //\r\n btnClose,\r\n initialData = {},\r\n isViewMode = false,\r\n isDisableNeedEditForm = false,\r\n initialUploadFile = [],\r\n projectData,\r\n handleDirtyChange,\r\n onChangeResearcherType,\r\n valuesForm,\r\n formValueRef,\r\n isDraftData,\r\n onClickDeleteProject,\r\n } = props\r\n //* STORE *//\r\n const manageProjectStore = useManageProjectStore()\r\n const snackbarAction = useSnackbarAction()\r\n\r\n const { documentTopic } = manageProjectStore\r\n\r\n const translate = useTranslate()\r\n const uploadFileinit = documentTopic?.map(() => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n },\r\n }\r\n })\r\n\r\n const isNotCompleteDocument = projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument\r\n const isDisableDoc = isViewMode && (!isNotCompleteDocument || !isApproveWithComment)\r\n\r\n let isUploadEditMode = false\r\n if (isApproveWithComment || isNotCompleteDocument || isEditAfterReview) {\r\n isUploadEditMode = true\r\n }\r\n return (\r\n 0 ? initialUploadFile : uploadFileinit,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n validate={(values) => {\r\n const errors: ErrorsType = {}\r\n if (!values.langTH && !values.langEN) {\r\n errors.langTH = translate.get('MESSAGE.M016')\r\n\r\n errors.langEN = translate.get('MESSAGE.M016')\r\n }\r\n\r\n return errors\r\n }}\r\n >\r\n {({ handleSubmit, form, dirty, invalid, errors, values }) => {\r\n valuesForm.current = values\r\n if (formValueRef) formValueRef.current = values\r\n return (\r\n \r\n \r\n {isNotCompleteDocument && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {!btnClose && (\r\n \r\n {\r\n onClickDeleteProject()\r\n }\r\n : undefined\r\n }\r\n onClickClose={() => {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst RequestFormCtrl = (props: requestFormType.RequestFormType) => {\r\n const requestFormModel = useRequestForm(props)\r\n return \r\n}\r\nexport default RequestFormCtrl\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n gridBtn: {\r\n marginTop: '2%',\r\n },\r\n}))\r\n","import React from 'react'\r\nimport {\r\n fileExt as fileExtConst,\r\n memorandumTopic,\r\n topicForLecturer,\r\n topicForStudent,\r\n} from '../../../../../../constants/constants'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport * as resultOfConsiderType from './resultOfConsiderType'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport authenStore from '../../../../../../stores/authen/authenStore'\r\n// import * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\nimport _ from 'lodash'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport { requestWebServiceTypes } from '../../../../../../services/web/types'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport {\r\n DocumentInfo,\r\n SynthesisReviewInfo,\r\n SynthesisReviewRemarkInfo,\r\n} from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport path from 'path'\r\nimport useProjectHook from '../../../../shareLogic/useProjectHook'\r\nimport { SynthesisReviewProjectRequestType } from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\n\r\n// import { fileExt as fileExtConst, topicForLecturer, topicForStudent } from '../../../../../../constants/constants'\r\nconst useSynthesisReview = (props: resultOfConsiderType.UseResultOfConsiderType) => {\r\n // const { projectData } = props\r\n const { callbackSaveComplete } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const projectHook = useProjectHook()\r\n\r\n const projectData = manageProjectStore.projectData\r\n const loadingHook = useLoading()\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n // const defaultRemarkRef = React.useRef()\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const profileStore = authenStore()\r\n const { profile } = profileStore\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const history = useHistory()\r\n const [initialComment, setInitialComment] = React.useState()\r\n const [synthesisReviewInfoList, setSynthesisReviewInfo] = React.useState([])\r\n const [isLoadedSynthesisReview, setIsLoadedSynthesisReview] = React.useState(false)\r\n const [synthesisReviewRemarkInfoList, setSynthesisReviewRemarkInfo] = React.useState()\r\n const [documentInfoList, setDocumentInfo] = React.useState([])\r\n const [approveStatus, setApproveStatus] = React.useState()\r\n const [initialRichTextEditor, setInitialRichTextEditor] = React.useState()\r\n const [initialRichRemark, setInitialRichRemark] = React.useState()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n\r\n React.useEffect(() => {\r\n getSynthesisReviewData()\r\n getSynthesisData()\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n createInitialData()\r\n createInitialComment()\r\n createInitialRichTextEditor()\r\n createInitialRichRemark()\r\n createInitialMemorandumFile()\r\n }, [isLoadedSynthesisReview])\r\n\r\n React.useEffect(() => {\r\n createInitialComment()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n // const handleDirtyChange = (props: any) => {\r\n // let isDirty: boolean = false\r\n // //** จัดformat initValue และ Form Value เพื่อเตรียมตัวนำไปใช้เปรียบเทียบค่า **//\r\n // let newFormValue = { ...props.values }\r\n // let initValue = { ...initialValues }\r\n\r\n // // console.log('newFormValue', newFormValue)\r\n // // console.log('initValue', initValue)\r\n\r\n // //**********************************************************//\r\n // const isEqual = _.isEqual(initValue, newFormValue) //ข้อมูลเท่ากัน\r\n // if (!isViewMode) {\r\n // if (isEqual) {\r\n // isDirty = false\r\n // } else {\r\n // isDirty = true\r\n // }\r\n // } else {\r\n // isDirty = false\r\n // }\r\n // const paramsDirty = {\r\n // tabDirty: isDirty,\r\n // callbackDirty: callbackDirtyProcess,\r\n // }\r\n // appFolderAndTabAction.setDirty(paramsDirty)\r\n // }\r\n\r\n // const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n // // if (onSaveDirty) {\r\n // // onSaveDirty(formRenderPropsRef.current, tabIndex, newTabSelected)\r\n // // }\r\n // }\r\n\r\n const getParameterForSave = (val: resultOfConsiderType.TFormValue) => {\r\n let paramForSave = null\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n let isDraft = false\r\n if (val.submitType === 'draft') {\r\n isDraft = true\r\n }\r\n let isApproveWithCommentFlow\r\n if (manageProjectStore?.projectData) {\r\n // isEditAfterReview = projectHook.isEditAfterReview(manageProjectStore?.projectData)\r\n isApproveWithCommentFlow = projectHook.isFlowApproveWithComment(manageProjectStore?.projectData)\r\n }\r\n\r\n const isNotHaveStampFileList =\r\n val?.documentCertificate?.childSelected?.length === 0 &&\r\n val?.documentCertificate?.parentSelected?.length === 0\r\n\r\n if (isApproveWithCommentFlow) {\r\n const synthesisReviewProjectRequest: requestWebServiceTypes.SynthesisReviewApproveWithCommentType = {\r\n loginUserID: profileStore.profile.userId,\r\n submittedID: submittedID,\r\n // stampFileList: val.documentCertificate.childSelected.map((itm: any) => {\r\n // return itm.fileID\r\n // }),\r\n stampFileList: isNotHaveStampFileList ? null : val.documentCertificate,\r\n isDraft: isDraft,\r\n }\r\n paramForSave = synthesisReviewProjectRequest\r\n } else {\r\n const synthesisReviewProjectRequest: requestWebServiceTypes.SynthesisReviewProjectRequestType = {\r\n loginUserID: profileStore.profile.userId,\r\n submittedID: submittedID,\r\n synthesisReviewInfo: val.commentDirector?.map((itm: any) => {\r\n return {\r\n commentaryTopicId: itm.id,\r\n comment:\r\n itm.consideration && itm.consideration.contentText ? itm.consideration.contentText : null,\r\n comment_htmltag:\r\n itm.consideration && itm.consideration.contentHtml ? itm.consideration.contentHtml : null,\r\n }\r\n }),\r\n // stampFileList: val.documentCertificate.childSelected.map((itm: any) => {\r\n // return itm.fileID\r\n // }),\r\n stampFileList: isNotHaveStampFileList ? null : val.documentCertificate,\r\n synthesisReviewRemarkInfo: {\r\n remark: val.remark && val.remark.contentText ? val.remark.contentText : null,\r\n remark_htmltag: val.remark && val.remark.contentHtml ? val.remark.contentHtml : null,\r\n },\r\n isDraft: isDraft,\r\n }\r\n paramForSave = synthesisReviewProjectRequest\r\n }\r\n\r\n // paramForSave = synthesisProjectRequest\r\n\r\n return paramForSave\r\n }\r\n\r\n const handleSubmitForm = async (val: resultOfConsiderType.TFormValue) => {\r\n const parameter = getParameterForSave(val)\r\n if (val.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n handleConfirmSave(parameter)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n\r\n const handleConfirmSave = async (\r\n paramForSave:\r\n | requestWebServiceTypes.SynthesisReviewProjectRequestType\r\n | requestWebServiceTypes.SynthesisReviewApproveWithCommentType,\r\n ) => {\r\n let isApproveWithCommentFlow\r\n if (manageProjectStore?.projectData) {\r\n // isEditAfterReview = projectHook.isEditAfterReview(manageProjectStore?.projectData)\r\n isApproveWithCommentFlow = projectHook.isFlowApproveWithComment(manageProjectStore?.projectData)\r\n }\r\n dialogRef.current?.closeDialog()\r\n\r\n const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n loadingHook.loadingOpen()\r\n let res\r\n if (isApproveWithCommentFlow) {\r\n const param = { ...paramForSave } as SynthesisReviewProjectRequestType\r\n res = await callWebService.synthesisReviewApproveWithCommentProject(param)\r\n } else {\r\n const param = { ...paramForSave } as requestWebServiceTypes.SynthesisReviewProjectRequestType\r\n res = await callWebService.synthesisReviewProject(param)\r\n }\r\n\r\n loadingHook.loadingClose()\r\n if (callbackSaveComplete) {\r\n if (res && res.status) {\r\n callbackSaveComplete(res.status, isDraft)\r\n }\r\n }\r\n }\r\n\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const getSynthesisData = async () => {\r\n if (projectData?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const submittedID = projectData.submittedID\r\n const { result } = await callWebService.getSynthesisProjectByID(submittedID)\r\n loadingHook.loadingClose()\r\n\r\n if (result) {\r\n const approveStatus = {\r\n id: result.approveStatusID,\r\n nameTH: result.approveStatusName_th,\r\n nameEN: result.approveStatusName_en,\r\n }\r\n setApproveStatus(approveStatus)\r\n }\r\n }\r\n }\r\n\r\n const getSynthesisReviewData = async () => {\r\n if (projectData?.submittedID) {\r\n setIsLoadedSynthesisReview(false)\r\n loadingHook.loadingOpen()\r\n const submittedID = projectData.submittedID\r\n const data = await callWebService.getSynthesisReview(submittedID)\r\n loadingHook.loadingClose()\r\n if (data.status === 1) {\r\n let documentInfo = [...data.result.documentInfo]\r\n documentInfo.forEach((itm) => {\r\n const topicID = itm.topicID\r\n let isCheckAll: boolean | null = null\r\n itm.fileInfo.forEach((file) => {\r\n file.topicID = topicID\r\n if (path.extname(`${file.filename}`) === fileExtConst.pdf) {\r\n if (file.isStamp && isCheckAll !== false) {\r\n isCheckAll = true\r\n } else {\r\n isCheckAll = false\r\n }\r\n }\r\n })\r\n itm.isCheckAll = isCheckAll\r\n })\r\n // BUG IS STAMP ออกมาเป็น false หมดเลย\r\n // setApproveStatus(data?.result?.approveStatusName_th)\r\n // setDocumentInfo(data.result.documentInfo)\r\n\r\n filterTopicUpload(documentInfo)\r\n // setDocumentInfo(documentInfo)\r\n setSynthesisReviewInfo(data.result.synthesisReviewInfo)\r\n setSynthesisReviewRemarkInfo(data.result.synthesisReviewRemarkInfo)\r\n setIsLoadedSynthesisReview(true)\r\n }\r\n }\r\n }\r\n\r\n const filterTopicUpload = (documentTopic: DocumentInfo[]) => {\r\n let docTopic: DocumentInfo[] = []\r\n const researcherTypeID = projectData?.researcherTypeInfo.value\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = documentTopic?.filter((item: any) => {\r\n return item.topicID !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item: any) => {\r\n return item.topicID !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, topicNo: index + 1 }\r\n })\r\n }\r\n setDocumentInfo(docTopic)\r\n }\r\n }\r\n\r\n const createInitialComment = () => {\r\n const commentInit = synthesisReviewInfoList?.map((itm: any, idx: number) => {\r\n return {\r\n topic:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.topicName_th\r\n : itm.topicName_en,\r\n id: itm.topicID,\r\n no: itm.topicNo,\r\n commentList: itm.synthesisComment,\r\n }\r\n })\r\n setInitialComment(commentInit)\r\n }\r\n\r\n const createInitialData = () => {\r\n const { childSelectedList, parentSelectedList } = getInitialChildSelected()\r\n\r\n const initialData = {\r\n documentCertificate: {\r\n childSelected: childSelectedList,\r\n parentSelected: parentSelectedList,\r\n },\r\n commentRemarkList:\r\n synthesisReviewRemarkInfoList && synthesisReviewRemarkInfoList.synthesisRemark\r\n ? synthesisReviewRemarkInfoList.synthesisRemark\r\n : null,\r\n remarkList:\r\n synthesisReviewRemarkInfoList && synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n : '-',\r\n }\r\n\r\n // const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n // setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n\r\n const getInitialChildSelected = () => {\r\n let childSelectedList: any = []\r\n let parentSelectedList: any = []\r\n\r\n documentInfoList.forEach((documentItm) => {\r\n if (documentItm.fileInfo.length > 0) {\r\n documentItm.fileInfo.forEach((file) => {\r\n if (file.isStamp) {\r\n childSelectedList.push(file)\r\n }\r\n })\r\n }\r\n if (documentItm.isCheckAll) {\r\n parentSelectedList.push(documentItm)\r\n }\r\n })\r\n\r\n return { parentSelectedList, childSelectedList }\r\n }\r\n\r\n const createInitialRichTextEditor = () => {\r\n const initialData = synthesisReviewInfoList.map((itm) => {\r\n return {\r\n contentHtml: itm.synthesisReviewCommentHtmlTag\r\n ? itm.synthesisReviewCommentHtmlTag\r\n : itm.synthesisComment,\r\n contentText: itm.synthesisReviewComment,\r\n }\r\n })\r\n\r\n setInitialRichTextEditor(initialData)\r\n }\r\n\r\n const createInitialRichRemark = () => {\r\n const initialData = {\r\n contentHtml: isViewMode\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n : '-'\r\n : synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n : synthesisReviewRemarkInfoList?.synthesisRemark,\r\n contentText: synthesisReviewRemarkInfoList?.synthesisReviewRemark,\r\n }\r\n\r\n setInitialRichRemark(initialData)\r\n }\r\n\r\n const createInitialMemorandumFile = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n if (submittedID) {\r\n const res = await callWebService.getProjectAmendmentMemoMessage(submittedID)\r\n const result = res.result\r\n\r\n // const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n // setInitialMemorandumFile(initialMemorandumFile)\r\n const memorandumInfo = result.memoMessagePaperInfo\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map(\r\n (itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n },\r\n )\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.signPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.signPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n\r\n setInitialMemorandumFile(uploadFileMemoranduminit)\r\n }\r\n }\r\n\r\n return {\r\n approveStatus,\r\n initialValues,\r\n projectData,\r\n initialComment,\r\n documentInfoList,\r\n initialRichTextEditor,\r\n initialRichRemark,\r\n isViewMode,\r\n isFlowApproveWithComment: projectData ? projectHook.isFlowApproveWithComment(projectData) : false,\r\n configDialog,\r\n initialMemorandumFile,\r\n onRefDialog,\r\n onSubmitForm: handleSubmitForm,\r\n // handleDirtyChange: handleDirtyChange,\r\n onClickCancel: handleClickCancel,\r\n }\r\n}\r\n\r\nexport default useSynthesisReview\r\n","import * as resultOfConsiderType from './resultOfConsiderType'\r\nimport useResultOfConsider from './useResultOfConsider'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../.././../../../../control/richTextEditor/richTextEditor'\r\nimport { Grid, useTheme, makeStyles } from '@material-ui/core'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Button from '../../../../../../control/button/button'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport useSnackbarAction from '../../../../../../stores/snackbar/snackbarAction'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\n\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport constProjectStatus from '../../../../../../constants/projectStatus'\r\n// import constApproveStatus from '../../../../../../constants/approveStatus'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../../constants/approveStatus'\r\n\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\nconst ResultOfConsiderView: React.FC = (props) => {\r\n const {\r\n initialValues,\r\n approveStatus,\r\n projectData,\r\n initialComment,\r\n initialRichTextEditor,\r\n // documentInfoList,\r\n initialRichRemark,\r\n // handleDirtyChange,\r\n onClickCancel,\r\n onSubmitForm,\r\n configDialog,\r\n onRefDialog,\r\n isViewMode,\r\n initialMemorandumFile,\r\n // isHideDocumentCertificate = false,\r\n // isFlowApproveWithComment = false,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const checkPermission = useCheckPermission()\r\n const snackbarAction = useSnackbarAction()\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const isAdmin = checkPermission.isUserAdmin()\r\n // const isShowCommentRemarkList = initialValues?.commentRemarkList !== null\r\n\r\n const isShowComment =\r\n approveStatus &&\r\n approveStatus?.id !== approveStatusREC1.approve &&\r\n approveStatus?.id !== approveStatusREC2.approve &&\r\n approveStatus?.id !== approveStatusREC1.approveForContiueResearch &&\r\n approveStatus?.id !== approveStatusREC2.approveForContiueResearch //ผลการพิจารณาเป็นไม่ใช่อนุมัติและไม่ใช่อนุมัติให้ดำเนินการวิจัยต่อเนื่อง จะโชว์คอมเม้นเป็นหัวข้อ ถ้าเป็นอนุมัติและ อนุมัติให้ดำเนินการวิจัยต่อเนื่องจะโชว์แค่ผลไม่โชว์คอมเม้น\r\n\r\n const isStatusComplete = projectData && projectData?.projectStatusInfo?.value === constProjectStatus.completed\r\n const isShowCloseProjectButton = isStatusComplete && isAdmin\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSignMemoMessage: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete &&\r\n projectData?.isNeedEditForm === false\r\n\r\n const renderResearcherView = (name: string, index: number) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {(props) => {\r\n const { form, handleSubmit, dirty, invalid, errors, values } = props\r\n\r\n return (\r\n <>\r\n \r\n {/* {!isFlowApproveWithComment && (\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {approveStatus?.id === constApproveStatus.approveWithComment\r\n ? translate.get('LABEL.APPROVE')\r\n : translate.languageStore.currentLanguage ===\r\n translate.languageKey.th\r\n ? approveStatus?.nameTH\r\n : approveStatus?.nameEN}\r\n \r\n\r\n {isShowComment && (\r\n \r\n {({ fields }) => {\r\n return fields?.map((name, index) =>\r\n renderResearcherView(name, index),\r\n )\r\n }}\r\n \r\n )}\r\n \r\n \r\n \r\n )} */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {approveStatus?.id === approveStatusREC1.approveWithComment ||\r\n approveStatus?.id === approveStatusREC2.approveWithComment\r\n ? translate.get('LABEL.APPROVE')\r\n : translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? approveStatus?.nameTH\r\n : approveStatus?.nameEN}\r\n \r\n\r\n {isShowComment && (\r\n \r\n {({ fields }) => {\r\n return fields?.map((name, index) =>\r\n renderResearcherView(name, index),\r\n )\r\n }}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {isSignMemoMessage && (\r\n \r\n \r\n \r\n )}\r\n {!isViewMode ? (\r\n \r\n {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n ) : (\r\n \r\n {isShowCloseProjectButton && (\r\n \r\n \r\n {translate.get('BUTTON.CLOSE_PROJECT')}\r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n {/* */}\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nconst ResultConsider: React.FC = (props) => {\r\n const useResultOfConsiderModel = useResultOfConsider(props)\r\n return \r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: 128,\r\n padding: 20,\r\n },\r\n titleFont: {\r\n color: '#BDBDBD',\r\n },\r\n contentFont: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default ResultConsider\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport ProjectAmendment from '../../../page/requestNewProject/projectAmendment/projectAmendment'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/amendment/resultOfConsider'\r\nimport NoticeAdditionalDocument from '../../../page/noticeAdditionalDocument/noticeAdditionalDocument'\r\nimport CertificateStampDocument from '../../../page/certificateStampDocument/certificateStampDocument'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\nimport { menuTab } from '../../../../../../constants/constants'\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return (\r\n \r\n )\r\n case menuTab.tab22.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab24.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n isNeedEditForm: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n\r\n let isNeedEditForm = '1'\r\n if (manageProjectStore.projectData?.isFlowApproveWithComment) {\r\n if (manageProjectStore.projectData?.previousIsNeedEditForm === false) {\r\n isNeedEditForm = '1'\r\n }\r\n } else {\r\n if (manageProjectStore.projectData?.isNeedEditForm === false) {\r\n isNeedEditForm = '1'\r\n }\r\n }\r\n\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isNeedEditForm: isNeedEditForm,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as memoMessageType from './memoMessageType'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { DataSourceType } from '../../../../../../control/treeCheckboxNew/treeCheckbox'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { dateForAPI } from '../../../../../../utilities/date'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\nimport { validateModeAccordionError } from '../../../../../../utilities/validate'\r\n\r\nconst useMemomessageTerminate = (props: memoMessageType.UseMemoMessageType) => {\r\n const { onSaveComplete } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const editRef = React.useRef()\r\n const callLookup = useLookupService()\r\n const [terminateCauseList, setTerminateCause] = React.useState<{ id: number; name_th: string; name_en: string }[]>(\r\n [],\r\n )\r\n const [isCheckedOther, setIsCheckedOther] = React.useState(false)\r\n const [initialSuggestionNotice, setInitialSuggestionNotice] = React.useState()\r\n const [initialMemoMessagePaper, setInitialMemoMessagePaper] = React.useState<{\r\n TH: InitialRichTextEditorType\r\n EN: InitialRichTextEditorType\r\n }>()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n const [approveStatus, setApproveStatus] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n\r\n // }, [JSON.stringify(projectData)])\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getLutTerminateProjectCause()\r\n getApproveStatus()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getApproveStatus = async () => {\r\n let res\r\n if (projectData?.irb) {\r\n res = await callLookup.callApproveStatusLut(projectData?.irb, constSubmittedType.adverseEvent)\r\n if (res) {\r\n const formatedData = res?.result?.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n }) as []\r\n setApproveStatus(formatedData)\r\n }\r\n }\r\n }\r\n\r\n const getLutTerminateProjectCause = async () => {\r\n const res = await callLookup.getTerminateCause(1, 8)\r\n // const formatedData = res.result.map((itm: any) => {\r\n // return {\r\n // label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n // value: `${itm.id}`,\r\n // }\r\n // })\r\n\r\n setTerminateCause(res.result)\r\n }\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n if (submittedID) {\r\n const res = await callWebService.getProjectAmendmentMemoMessage(submittedID)\r\n const result = res.result\r\n\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n // approveStatus:\r\n // result && result?.approveStatusInfo\r\n // ? {\r\n // label:\r\n // translate.languageStore.currentLanguage === translate.languageKey.th\r\n // ? result?.approveStatusInfo.nameTH\r\n // : result?.approveStatusInfo.nameEN,\r\n // value: result?.approveStatusInfo.value.toString(),\r\n // }\r\n // : null,\r\n }\r\n const initialSugestionNotice = {\r\n contentHtml: result?.memoMessageComment_html,\r\n contentText: result?.memoMessageComment,\r\n }\r\n const initialMemoMessagePaper = {\r\n TH: {\r\n contentHtml: result?.memoMessagePaper_th_html,\r\n contentText: result?.memoMessagePaper_th,\r\n },\r\n EN: {\r\n contentHtml: result?.memoMessagePaper_en_html,\r\n contentText: result?.memoMessagePaper_en,\r\n },\r\n }\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n setInitialSuggestionNotice(initialSugestionNotice)\r\n setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.unSignPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.unSignPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n const approveStatus = manageProjectStore?.projectData?.synthesisApproveStatusInfo?.value\r\n\r\n let param: REQServiceType.ProjectAmendmentMemomessageType = {\r\n submittedID: submittedID,\r\n comment: value?.suggestionNotice?.contentText,\r\n comment_html: value?.suggestionNotice?.contentHtml,\r\n memoMessagePaper_th: value?.memoMessagePaper_TH?.contentText,\r\n memoMessagePaper_en: value?.memoMessagePaper_EN?.contentText,\r\n memoMessagePaper_th_html: value?.memoMessagePaper_TH?.contentHtml,\r\n memoMessagePaper_en_html: value?.memoMessagePaper_EN?.contentHtml,\r\n memoMessageDate: value?.memoMessageDate ? dateForAPI(value?.memoMessageDate) ?? null : null,\r\n approveStatusID: approveStatus ? approveStatus : null,\r\n isDraft: isDraft,\r\n }\r\n\r\n return param\r\n }\r\n\r\n const handleChangProjectType = (val: memoMessageType.OptType) => {\r\n if (parseInt(val?.value) === 3) {\r\n setRequired(false)\r\n } else {\r\n setRequired(true)\r\n }\r\n }\r\n\r\n const handleDirtyChange = (props: any) => {\r\n let isDirty: boolean = false\r\n let newFormValue = _.omit(props.values, ['submitType', 'memorandumFile'])\r\n let initValue = _.omit(\r\n {\r\n ...initialValues,\r\n memoMessagePaper_EN: initialMemoMessagePaper?.EN,\r\n memoMessagePaper_TH: initialMemoMessagePaper?.TH,\r\n suggestionNotice: initialSuggestionNotice,\r\n },\r\n ['submitType'],\r\n )\r\n\r\n const isEqual = _.isEqual(initValue, newFormValue)\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft = true\r\n const param: REQServiceType.ProjectAmendmentMemomessageType = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleSubmitForm = (value: any) => {\r\n // if (projectData?.projectID && projectData?.submittedID) {\r\n // let isReviewer = false\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param: REQServiceType.ProjectAmendmentMemomessageType = getSaveServiceParameter(isDraft)\r\n if (isDraft) {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.ProjectAmendmentMemomessageType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n try {\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.projectAmendmentMemoMessage(param)\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useMemomessageTerminate.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleClickCheckbox = (selectedItem: DataSourceType) => {\r\n if (selectedItem.id === 4) {\r\n setIsCheckedOther(!isCheckedOther)\r\n }\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n const handleChangeStatus = () => {}\r\n\r\n const updateMemoMessage = async (param: REQServiceType.UpdateMemoMessageType) => {\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.updateMemoMessagePaper(param)\r\n\r\n if (res.result.status === 200) {\r\n dialogRef.current?.openDialog()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n setConfigDialog({})\r\n },\r\n })\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleSubmitUpdateMemo = (fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formRef.current)\r\n return new Promise(async (resolve, reject) => {\r\n if (isError) {\r\n formRef.current?.form.submit()\r\n reject('')\r\n } else {\r\n resolve('')\r\n const param: REQServiceType.UpdateMemoMessageType = {\r\n submittedID: Number(projectData?.submittedID),\r\n memoMessagePaperTH: formRef.current?.values.memoMessagePaper_TH?.contentText,\r\n memoMessagePaperEN: formRef.current?.values.memoMessagePaper_EN?.contentText,\r\n memoMessagePaperTHHTML: formRef.current?.values.memoMessagePaper_TH?.contentHtml,\r\n memoMessagePaperENHTML: formRef.current?.values.memoMessagePaper_EN?.contentHtml,\r\n }\r\n\r\n updateMemoMessage(param)\r\n }\r\n })\r\n }\r\n\r\n const handleCancle = () => {\r\n const valueMessageTH: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_TH`]?.contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_TH`]?.contentText,\r\n }\r\n const valueMessageEN: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_EN`]?.contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_EN`]?.contentText,\r\n }\r\n setInitialMemoMessagePaper((prev) => ({\r\n TH: {\r\n ...prev?.TH,\r\n ...valueMessageTH,\r\n },\r\n EN: {\r\n ...prev?.EN,\r\n ...valueMessageEN,\r\n },\r\n }))\r\n }\r\n\r\n const onClickEdit = () => {\r\n editRef.current = formRef.current?.form.getState().values\r\n }\r\n return {\r\n formRef,\r\n required,\r\n isViewMode,\r\n configDialog,\r\n approveStatus,\r\n initialValues,\r\n isCheckedOther,\r\n isShowUpdateDate,\r\n terminateCauseList,\r\n initialMemorandumFile,\r\n initialSuggestionNotice,\r\n initialMemoMessagePaper,\r\n onRefDialog,\r\n onChangProjectType: handleChangProjectType,\r\n onDirtyChange: handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCheckbox: handleClickCheckbox,\r\n onClickOpenFile: handleClickOpenFile,\r\n onChangeStatus: handleChangeStatus,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n }\r\n}\r\n\r\nexport default useMemomessageTerminate\r\n","import * as memoMessageType from './memoMessageType'\r\nimport useMemomessageTerminate from './useMemomessage'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport MyDatePicker from '../../../../../../control/datepicker/datepicker'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { richEditorRequired } from '../../../../../../utilities/validate'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialMemoMessagePaper,\r\n initialSuggestionNotice,\r\n onRefDialog,\r\n onSubmitForm,\r\n onDirtyChange,\r\n onClickOpenFile,\r\n onClickBackToSearch,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const latestFolderIdx = 0\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n const isEdit = isViewMode && currentSelectFolder\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n

\\n'\r\n ? [richEditorRequired(translate.get('MESSAGE.M015'))]\r\n : []\r\n }\r\n />\r\n
\r\n
\r\n )\r\n }\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_TH']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_TH'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_EN']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_EN'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n\r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import * as memoMessageType from './memoMessageType'\r\nimport useMemomessageTerminate from './useMemomessage'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport MyDatePicker from '../../../../../../control/datepicker/datepicker'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { richEditorRequired } from '../../../../../../utilities/validate'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialMemoMessagePaper,\r\n initialSuggestionNotice,\r\n onRefDialog,\r\n onSubmitForm,\r\n onDirtyChange,\r\n onClickOpenFile,\r\n onClickBackToSearch,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const latestFolderIdx = 0\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n const isEdit = isViewMode && currentSelectFolder\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n

\\n'\r\n ? [richEditorRequired(translate.get('MESSAGE.M015'))]\r\n : []\r\n }\r\n />\r\n
\r\n
\r\n )\r\n }\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_TH']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_TH'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n isViewMode={isEdit}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_EN'])}\r\n fieldNames={['memoMessagePaper_EN']}\r\n onCancel={handleCancle}\r\n />\r\n \r\n\r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import SynthesisREC1 from '../../../page/synthesis/synthesisREC1' //padge\r\nimport SynthesisREC2 from '../../../page/synthesis/synthesisREC2' //padge\r\nimport AdditionalDocumentREC1 from '../../../page/additionalDocument/additionalDocumentREC1'\r\nimport AdditionalDocumentREC2 from '../../../page/additionalDocument/additionalDocumentREC2'\r\nimport VerifyDocumentREC1 from '../../../page/verifyDocument/verifyDocumentREC1'\r\nimport VerifyDocumentREC2 from '../../../page/verifyDocument/verifyDocumentREC2'\r\nimport DefineProjectREC1 from '../../../page/defineProject/defineProjectREC1'\r\nimport DefineProjectREC2 from '../../../page/defineProject/defineProjectREC2'\r\nimport GenerateCertificateREC1 from '../../../page/generateCertificate/generateCertificateREC1'\r\nimport GenerateCertificateREC2 from '../../../page/generateCertificate/generateCertificateREC2'\r\nimport DefineSubmittedDateREC1 from '../../../page/defineSubmittedDate/defineSubmittedDateREC1'\r\nimport DefineSubmittedDateREC2 from '../../../page/defineSubmittedDate/defineSubmittedDateREC2'\r\nimport ReviewerCommentREC1 from '../../../page/reviewerComment/reviewerCommentREC1'\r\nimport ReviewerCommentREC2 from '../../../page/reviewerComment/reviewerCommentREC2'\r\n\r\nimport SynthesisReviewREC1 from '../../../page/synthesisReview/synthesisReviewREC1'\r\nimport SynthesisReviewREC2 from '../../../page/synthesisReview/synthesisReviewREC2'\r\n\r\nimport { OfficerType } from './officerType'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\n\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport SignREC2 from '../../../page/sign/signREC2'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentREC1'\r\nimport SignREC1 from '../../../page/sign/signREC1'\r\nimport MemoMessageREC1 from '../../../page/memoMessage/projectAmendment/memoMessageREC1'\r\nimport MemoMessageREC2 from '../../../page/memoMessage/projectAmendment/memoMessageREC2'\r\n\r\nimport SignMemoREC2 from '../../../page/sign/signMemoMessage/signREC2'\r\nimport SignMemoREC1 from '../../../page/sign/signMemoMessage/signREC1'\r\nimport SignMemoRepresentREC2 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC2'\r\nimport SignMemoRepresentREC1 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC1'\r\nimport SignVicePresidentREC2 from '../../../page/signVicePresident/signVicePresidentREC2'\r\nimport SignVicePresidentREC1 from '../../../page/signVicePresident/signVicePresidentREC1'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n let isNotDisableTestResult = false\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC1
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n // code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block สังเคราะห์\r\n\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block ออกผล\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block ออกใบรับรอง\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block ลงนาม\r\n return renderSign(1)\r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block ลงนามแทน\r\n return renderSignRepresent(1)\r\n case Constants.menuTab.tab11.id:\r\n // code block\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC2
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n /// code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return renderSign(2)\r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return renderSignRepresent(2)\r\n case Constants.menuTab.tab11.id:\r\n // code block\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n const renderSign = (REC: number) => {\r\n const isNeedEditForm = manageProjectStore?.projectData?.isNeedEditForm\r\n //Business** ถ้านักวิจัยมีการแก้ไข from จะทำการออกใบรับรองใหม่แต่ถ้าไม่แก้ไขจะอกเป็นใบบันทึกข้อความ\r\n if (REC === 1) {\r\n if (isNeedEditForm) {\r\n return \r\n } else {\r\n return \r\n }\r\n } else if (REC === 2) {\r\n if (isNeedEditForm) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n }\r\n const renderSignRepresent = (REC: number) => {\r\n const isVicePresident = checkPermission.isUserViceChairman()\r\n let isNeedEditForm = manageProjectStore?.projectData?.isNeedEditForm\r\n if (\r\n manageProjectStore?.projectData?.isNeedEditForm === undefined ||\r\n manageProjectStore?.projectData?.isNeedEditForm === null\r\n ) {\r\n isNeedEditForm = true\r\n }\r\n //Business** ถ้านักวิจัยมีการแก้ไข from จะทำการออกใบรับรองใหม่แต่ถ้าไม่แก้ไขจะอกเป็นใบบันทึกข้อความ\r\n if (REC === 1) {\r\n if (isNeedEditForm) {\r\n if (isVicePresident) {\r\n //Business** กรณีเป็นรองประธานเข้ามาจะแสดงหน้าลงนามสำหรับรองประธาน **//\r\n return \r\n } else {\r\n return \r\n }\r\n } else {\r\n return \r\n }\r\n } else if (REC === 2) {\r\n if (isNeedEditForm) {\r\n if (isVicePresident) {\r\n //Business** กรณีเป็นรองประธานเข้ามาจะแสดงหน้าลงนามสำหรับรองประธาน **//\r\n return \r\n } else {\r\n return \r\n }\r\n } else {\r\n return \r\n }\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useProjectAmendment from './useProjectAmendment'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\ntype ProjectAmendmentViewType = ReturnType & Omit\r\nconst ProjectAmendmentView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n projectData,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const currentSelectTab = appFolderAndTabStore.tabSelected?.stepID\r\n\r\n const checkConditionBtnClose = () => {\r\n let isEditDirector = false\r\n\r\n //เช็คว่ามีการกลับมาแก้ไขกรรมการมั้ย และไม่ใช่กรรมการเข้ามาใช่มั้ย (ปุ่มถอนยื่นต้องแสดงทุก step)\r\n if (projectData?.stepID) {\r\n isEditDirector = projectData?.stepID >= constSubmittedStep.submit && projectData?.committeeInfo.length >= 0\r\n }\r\n\r\n // เช็คว่าแก๊งประธานมาตรวจสอบเอกสารในขั้นตอนกำหนดประเภทโครงการมั้ย\r\n const isChairmanVerifyDoc =\r\n checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.specifyProjectType\r\n\r\n // เช็คว่าผ่านstepการกำหนดประเภทโครงการและกรรมการไปรึยัง และกำลังเปิด tab กำหนดประเภทและกรรมการอยู่ใช่มั้ย\r\n const isChkStepEditDirector =\r\n currentSelectTab === constSubmittedStep.specifyProjectType &&\r\n projectData?.stepID !== constSubmittedStep.specifyProjectType\r\n\r\n let isBtnClose = isChairmanVerifyDoc ? false : isChkStepEditDirector ? isEditDirector : isViewMode\r\n\r\n return isBtnClose\r\n }\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {checkConditionBtnClose() && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n\r\nexport type ProjectAmendmentType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst ProjectAmendment: React.FC = (props) => {\r\n const requestNewProject = useProjectAmendment(props)\r\n return \r\n}\r\nexport default ProjectAmendment\r\n","import React from 'react'\r\nimport { ProjectAmendmentType } from './projectAmendment'\r\nimport * as RequestNewProjectOtherType from './projectAmendmentOtherType'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nexport default (props: ProjectAmendmentType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n // const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n console.log('####Project Amendment####')\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport ProjectAmendment from '../../../page/requestNewProject/projectAmendment/projectAmendment'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/amendment/resultOfConsider'\r\nimport NoticeAdditionalDocument from '../../../page/noticeAdditionalDocument/noticeAdditionalDocument'\r\nimport CertificateStampDocument from '../../../page/certificateStampDocument/certificateStampDocument'\r\n\r\nimport { menuTab } from '../../../../../../constants/constants'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return (\r\n \r\n )\r\n case menuTab.tab22.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab24.id:\r\n return \r\n\r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let isNeedEditForm = '2'\r\n if (manageProjectStore.projectData?.previousIsNeedEditForm === false) {\r\n isNeedEditForm = '1'\r\n }\r\n\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n isNeedEditForm: isNeedEditForm,\r\n langTH: true,\r\n\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let isNeedEditForm = '2'\r\n if (manageProjectStore.projectData?.previousIsNeedEditForm === false) {\r\n isNeedEditForm = '1'\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isNeedEditForm: isNeedEditForm,\r\n\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n projectData: manageProjectStore.projectData,\r\n initialData: initialData,\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import SynthesisREC1 from '../../../page/synthesis/synthesisREC1' //padge\r\nimport SynthesisREC2 from '../../../page/synthesis/synthesisREC2' //padge\r\nimport AdditionalDocumentREC1 from '../../../page/additionalDocument/additionalDocumentREC1'\r\nimport AdditionalDocumentREC2 from '../../../page/additionalDocument/additionalDocumentREC2'\r\nimport VerifyDocumentREC1 from '../../../page/verifyDocument/verifyDocumentREC1'\r\nimport VerifyDocumentREC2 from '../../../page/verifyDocument/verifyDocumentREC2'\r\nimport DefineProjectREC1 from '../../../page/defineProject/defineProjectREC1'\r\nimport DefineProjectREC2 from '../../../page/defineProject/defineProjectREC2'\r\nimport GenerateCertificateREC1 from '../../../page/generateCertificate/generateCertificateREC1'\r\nimport GenerateCertificateREC2 from '../../../page/generateCertificate/generateCertificateREC2'\r\nimport DefineSubmittedDateREC1 from '../../../page/defineSubmittedDate/defineSubmittedDateREC1'\r\nimport DefineSubmittedDateREC2 from '../../../page/defineSubmittedDate/defineSubmittedDateREC2'\r\nimport ReviewerCommentREC1 from '../../../page/reviewerComment/reviewerCommentREC1'\r\nimport ReviewerCommentREC2 from '../../../page/reviewerComment/reviewerCommentREC2'\r\n\r\nimport SynthesisReviewREC1 from '../../../page/synthesisReview/synthesisReviewREC1'\r\nimport SynthesisReviewREC2 from '../../../page/synthesisReview/synthesisReviewREC2'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\n\r\nimport SignREC1 from '../../../page/sign/signREC1'\r\nimport SignREC2 from '../../../page/sign/signREC2'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentREC1'\r\n\r\nimport { OfficerType, OfficerViewType } from './officerType'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useOfficer from './useOfficer'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport MemoMessageREC1 from '../../../page/memoMessage/projectAmendment/memoMessageREC1'\r\nimport MemoMessageREC2 from '../../../page/memoMessage/projectAmendment/memoMessageREC2'\r\n\r\nimport SignMemoREC2 from '../../../page/sign/signMemoMessage/signREC2'\r\nimport SignMemoREC1 from '../../../page/sign/signMemoMessage/signREC1'\r\nimport SignMemoRepresentREC2 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC2'\r\nimport SignMemoRepresentREC1 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC1'\r\n\r\nimport SignVicePresidentREC2 from '../../../page/signVicePresident/signVicePresidentREC2'\r\nimport SignVicePresidentREC1 from '../../../page/signVicePresident/signVicePresidentREC1'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete, projectData } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n let isNotDisableTestResult = false\r\n\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC1
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n // code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return renderSign(1) // \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return renderSignRepresent(1) //return \r\n\r\n case Constants.menuTab.tab11.id:\r\n // code block\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC2
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n /// code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return renderSign(2) // return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return renderSignRepresent(2) //return \r\n case Constants.menuTab.tab11.id:\r\n // code block\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n const renderSign = (REC: number) => {\r\n const isNeedEditForm = manageProjectStore?.projectData?.isNeedEditForm\r\n //Business** ถ้านักวิจัยมีการแก้ไข from จะทำการออกใบรับรองใหม่แต่ถ้าไม่แก้ไขจะอกเป็นใบบันทึกข้อความ\r\n if (REC === 1) {\r\n if (isNeedEditForm) {\r\n return \r\n } else {\r\n return \r\n }\r\n } else if (REC === 2) {\r\n if (isNeedEditForm) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n }\r\n const renderSignRepresent = (REC: number) => {\r\n const isVicePresident = checkPermission.isUserViceChairman()\r\n\r\n let isNeedEditForm = manageProjectStore?.projectData?.isNeedEditForm\r\n if (\r\n manageProjectStore?.projectData?.isNeedEditForm === undefined ||\r\n manageProjectStore?.projectData?.isNeedEditForm === null\r\n ) {\r\n isNeedEditForm = true\r\n }\r\n //Business** ถ้านักวิจัยมีการแก้ไข from จะทำการออกใบรับรองใหม่แต่ถ้าไม่แก้ไขจะอกเป็นใบบันทึกข้อความ\r\n if (REC === 1) {\r\n if (isNeedEditForm) {\r\n if (isVicePresident) {\r\n //Business** กรณีเป็นรองประธานเข้ามาจะแสดงหน้าลงนามสำหรับรองประธาน **//\r\n return \r\n } else {\r\n return \r\n }\r\n } else {\r\n return \r\n }\r\n } else if (REC === 2) {\r\n if (isNeedEditForm) {\r\n if (isVicePresident) {\r\n //Business** กรณีเป็นรองประธานเข้ามาจะแสดงหน้าลงนามสำหรับรองประธาน **//\r\n return \r\n } else {\r\n return \r\n }\r\n } else {\r\n return \r\n }\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n const useOfficerModel = useOfficer(props)\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\nimport { UseOfficerType } from './officerType'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nexport default (props: UseOfficerType) => {\r\n const {} = props\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n\r\n return {\r\n projectData: manageProjectStore.projectData,\r\n }\r\n}\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useRequestNewProjectEditAfterReview from './useProjectAmendmentEditAfterReview'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\ntype RequestNewProjectViewType = ReturnType &\r\n Omit\r\nconst RequestNewProjectView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const currentSelectTab = appFolderAndTabStore.tabSelected.stepID\r\n const checkConditionBtnClose = () => {\r\n let isEditDirector = false\r\n\r\n //เช็คว่ามีการกลับมาแก้ไขกรรมการมั้ย และไม่ใช่กรรมการเข้ามาใช่มั้ย (ปุ่มถอนยื่นต้องแสดงทุก step)\r\n if (projectData?.stepID) {\r\n isEditDirector = projectData?.stepID >= constSubmittedStep.submit && projectData?.committeeInfo.length >= 0\r\n }\r\n // เช็คว่าแก๊งประธานมาตรวจสอบเอกสารในขั้นตอนกำหนดประเภทโครงการมั้ย\r\n const isChairmanVerifyDoc =\r\n checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.specifyProjectType\r\n\r\n // เช็คว่าผ่านstepการกำหนดประเภทโครงการและกรรมการไปรึยัง และกำลังเปิด tab กำหนดประเภทและกรรมการอยู่ใช่มั้ย\r\n const isChkStepEditDirector =\r\n currentSelectTab === constSubmittedStep.specifyProjectType &&\r\n projectData?.stepID !== constSubmittedStep.specifyProjectType\r\n\r\n let isBtnClose = isChairmanVerifyDoc ? false : isChkStepEditDirector ? isEditDirector : isViewMode\r\n\r\n return isBtnClose\r\n }\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {checkConditionBtnClose() && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type RequestNewProjectType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst RequestNewProject: React.FC = (props) => {\r\n const requestNewProjectEditAfterReview = useRequestNewProjectEditAfterReview(props)\r\n return \r\n}\r\nexport default RequestNewProject\r\n","import React from 'react'\r\nimport { RequestNewProjectType } from './projectAmendmentEditAfterReview'\r\nimport * as RequestNewProjectOtherType from './projectAmendmentEditAfterReviewOtherType'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\n\r\nexport default (props: RequestNewProjectType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n console.log('####Project Amendment EditAfter Review####')\r\n }, [])\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n // history.push(RoutePath.manageProject)\r\n history.goBack()\r\n }\r\n\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\n","import React from 'react'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport * as closeProjectFormType from './closeProjectResearcherType'\r\nimport * as REQServiceTypes from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { customFolder, topicForLecturer, topicForStudent } from '../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport { ResultDocumentTopicLut } from '../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport { UploadFileObjType } from './closeProjectResearcherType'\r\n\r\nconst useCloseProjectResearcher = (props: closeProjectFormType.UseCloseProjectFormType) => {\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n const parameterForSaveRef = React.useRef()\r\n const submitValueRef = React.useRef()\r\n const isDraftRef = React.useRef(false)\r\n const dialogTwoRef = React.useRef>()\r\n const projectIDRef = React.useRef()\r\n const submittedIDRef = React.useRef()\r\n const irbRef = React.useRef()\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const { loadingClose, loadingOpen } = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n\r\n // --- Store --- //\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectAction = useManageProjectAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const { documentTopic, projectData } = manageProjectStore\r\n const { folderSelected } = folderAndTabStore\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n type MyFileDataType = {\r\n documentTopicID?: number\r\n fileTokenInfo: Array<{\r\n fileID: any\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n }>\r\n subtopic?: {\r\n subtopicID: number\r\n page: number | string\r\n }[]\r\n }\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n loadDocumentTopic()\r\n }\r\n }, [projectData?.submittedID])\r\n\r\n const loadDocumentTopic = async () => {\r\n if (projectData?.irb) {\r\n const lstDocumentTopic = await getDocumentTopicLut(projectData?.irb, constSubmittedType.closeProject)\r\n\r\n manageProjectAction.setDocumentTopic(lstDocumentTopic)\r\n createInitialUploadFile(lstDocumentTopic)\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submitTypeID: number) => {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitTypeID)\r\n if (res.status === 1) {\r\n let docTopic = res.result\r\n //กรองหัวข้อตามประเภทนักวิจัย กรณีที่มีข้อมูล projectData\r\n if (manageProjectStore.projectData?.researcherTypeInfo.value) {\r\n const researcherTypeID = manageProjectStore.projectData?.researcherTypeInfo.value\r\n docTopic = filterTopicUpload(researcherTypeID, res.result)\r\n }\r\n return docTopic\r\n } else {\r\n return []\r\n }\r\n }\r\n\r\n const filterTopicUpload = (researcherTypeID: number, documentTopic: ResultDocumentTopicLut[]) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n }\r\n }\r\n return docTopic\r\n }\r\n\r\n const createInitialData = () => {\r\n const initialData = {\r\n remarkFromAdmin: projectData?.verifyDocumentRemark || null,\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const createInitialUploadFile = (documentTopicInfo: Array) => {\r\n let uploadFileinit = documentTopicInfo?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n if (folderSelected.id !== customFolder.closeProject.id) {\r\n uploadFileinit?.forEach((itm: closeProjectFormType.UploadFileObjType) => {\r\n projectData?.documentInfo?.forEach((docInfo) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList = docInfo.fileInfo\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic\r\n }\r\n })\r\n })\r\n }\r\n\r\n //Section Replace File\r\n let latestDocument = projectData?.latestDocument\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileinit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileID, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFileBy.replaceFileID,\r\n } as any,\r\n ]\r\n\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n\r\n // //**** Initial File Edit ****//\r\n // if (projectData?.latestDocument && projectData?.latestDocument.length > 0) {\r\n // uploadFileinit?.forEach((itm: closeProjectFormType.UploadFileObjType) => {\r\n // projectData?.latestDocument?.forEach((latestDocInfo: any) => {\r\n // let latestFile = []\r\n // let previousFile = []\r\n // if (latestDocInfo?.fileInfo[0]) {\r\n // latestFile = latestDocInfo.fileInfo[0].latestFileList.filter((itm: any) => itm.no === null)\r\n // previousFile =\r\n // latestDocInfo.fileInfo[0].latestFileList[\r\n // latestDocInfo.fileInfo[0].latestFileList.length - 2\r\n // ]\r\n // }\r\n // if (latestFile.length > 0) {\r\n // if (latestDocInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n // let fileList = [\r\n // {\r\n // documentTopicID: latestDocInfo.topicID,\r\n // fileToken: latestFile[0].fileToken, //fileToken\r\n // filename: latestFile[0].filename,\r\n // fileID: latestFile[0].fileToken, //fileToken\r\n // path: latestFile[0].path,\r\n // replaceFileID: previousFile?.fileID,\r\n // },\r\n // ]\r\n // itm.uploadFileObj.fileList = fileList\r\n // itm.uploadFileObj.subTopicPageList = []\r\n // }\r\n // }\r\n // })\r\n // })\r\n // }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileinit?.length > 0) {\r\n uploadFileinit = uploadFileinit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileinit)\r\n }\r\n\r\n const handelClickSubmit = (val: any) => {\r\n submitValueRef.current = val\r\n const projectID = projectData?.projectID ?? null\r\n let submittedID: number | null = folderSelected.submittedID\r\n if (folderSelected.submittedID === customFolder.closeProject.submittedID) {\r\n submittedID = null\r\n }\r\n const parameterForSave: REQServiceTypes.CloseProject = {\r\n projectID: projectID,\r\n submittedID: submittedID,\r\n isDraft: null,\r\n documentInfo: getDocumentInfo(val),\r\n }\r\n\r\n parameterForSaveRef.current = parameterForSave\r\n switch (val.submitType) {\r\n case 'save':\r\n // code block\r\n isDraftRef.current = false\r\n handleSave()\r\n\r\n break\r\n\r\n case 'draft':\r\n // code block\r\n isDraftRef.current = true\r\n handleSaveDraft()\r\n\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n\r\n const checkRequirePDF = (documentInfo: MyFileDataType[]) => {\r\n let isRequirePDF = false\r\n\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if (documentInfo[i]?.fileTokenInfo[j]?.fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n\r\n const checkSubtopic = (documentInfo: MyFileDataType[]) => {\r\n let isEmptyPage = false\r\n\r\n //หาว่าหัวข้ออัปโหลดเอกสารมีให้อัปโหลดหัวข้อย่อยมั้ย\r\n const docTopic = manageProjectStore.documentTopic?.filter((item) => item.subtopic.length > 0)\r\n\r\n //ถ้ามีให้เข้าไปเช็คตามเงื่อนไข if\r\n if (docTopic?.length) {\r\n // วน loop หัวข้อที่มีให้อัปโหลดเอกสารหัวข้อย่อย\r\n docTopic.forEach((mainTopic) => {\r\n // วน loop หัวข้อที่มีการอัปโหลดเอกสารเข้ามา\r\n documentInfo.forEach((itm) => {\r\n // เช็คว่าเอกสารที่มีการอัปโหลดเข้ามาใช่เอกสารที่มีหัวข้อย่อยให้อัปโหลดหรือป่าว\r\n if (mainTopic.id === itm.documentTopicID) {\r\n // เช็คว่าหัวข้อย่อยที่อัพโหลดเข้ามาครบมั้ย\r\n if (itm.subtopic?.length != mainTopic.subtopic.length) {\r\n isEmptyPage = true\r\n } else {\r\n // เช็คว่าที่อัปมาครบมีช่องไหนกรอกเป็น ช่องว่างมั้ย\r\n const chkEmpty = itm.subtopic.find(\r\n (e) => e.page == null || e.page == '' || e.page == undefined,\r\n )\r\n if (chkEmpty) {\r\n isEmptyPage = true\r\n }\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n return isEmptyPage\r\n }\r\n\r\n const validateRequiredUploadFile = (uploadFile: Array<{ uploadFileObj: any }>, skipValidate: boolean = false) => {\r\n let isValid = true\r\n if (!skipValidate) {\r\n uploadFile?.every(({ uploadFileObj: file }) => {\r\n if (file?.isRequired && file?.fileList?.length === 0) {\r\n //เป็นหัวข้อที่มีการ required แต่ว่าไม่ upload เอกสาร\r\n isValid = false\r\n return false //break\r\n }\r\n return true //continue\r\n })\r\n\r\n if (!isValid) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get2Element('ALERT.CONTENT.PLEASE_UPLOAD_REQUIRED_TOPIC', [\r\n '',\r\n ]) as any,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n return isValid\r\n }\r\n\r\n const handleSave = () => {\r\n if (validateRequiredUploadFile(submitValueRef.current.uploadFile)) {\r\n parameterForSaveRef.current.isDraft = false\r\n if (parameterForSaveRef.current?.documentInfo?.length === 0) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n const isRequirePDF = checkRequirePDF(parameterForSaveRef.current?.documentInfo)\r\n const isEmptyPage = checkSubtopic(parameterForSaveRef.current?.documentInfo)\r\n if (isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else if (isEmptyPage) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.PLEASE_COMPLETE_PAGE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: handleClickConfirmSave,\r\n })\r\n }\r\n }\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const handleSaveDraft = async () => {\r\n parameterForSaveRef.current.isDraft = true\r\n handleClickConfirmSave()\r\n }\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n const onRefDialogTwo = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const handleClickConfirmSave = async () => {\r\n loadingOpen()\r\n const res = await callWebService.closeProject(parameterForSaveRef.current)\r\n\r\n if (res.status === 1) {\r\n loadingClose()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: loadLatestFolder,\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n projectIDRef.current = res.result?.projectInfo.projectID\r\n submittedIDRef.current = res.result?.projectInfo.submittedID\r\n irbRef.current = res.result?.projectInfo.irb\r\n } else {\r\n loadingClose()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const loadLatestFolder = async () => {\r\n try {\r\n loadingOpen()\r\n const currentProjectID = manageProjectStore.projectData?.projectID\r\n manageProjectAction.setProjectData()\r\n if (currentProjectID) {\r\n const resProjectFolder = await callWebService.getProjectFolder(currentProjectID)\r\n\r\n const projectFolder = resProjectFolder.result?.folders?.map((itm: any, index: number) => {\r\n return {\r\n ...itm,\r\n id: itm.submittedID,\r\n isLastProcess: index === 0 ? true : false,\r\n }\r\n })\r\n\r\n if (projectFolder?.length !== 0) {\r\n appFolderAndTabAction.setState({\r\n folderList: projectFolder,\r\n folderSelected: projectFolder[0],\r\n })\r\n }\r\n if (projectFolder?.length !== 0) {\r\n const selectedFolder = projectFolder[0]\r\n const resProject = await callWebService.getProjectByID(currentProjectID, selectedFolder.submittedID)\r\n if (resProject.result) {\r\n manageProjectAction.setProjectData(resProject.result)\r\n }\r\n }\r\n }\r\n } catch (ex) {\r\n } finally {\r\n loadingClose()\r\n }\r\n }\r\n const handleDirtyChange = (props: any) => {\r\n appFolderAndTabAction.setTabDirty(props.dirty)\r\n }\r\n\r\n const checkUseUploadEdit = () => {\r\n let isUseUploadEdit = false\r\n\r\n switch (projectData?.submitTypeInfo?.value) {\r\n case constSubmittedType.editAfterReview_closeProject:\r\n isUseUploadEdit = true\r\n break\r\n default:\r\n isUseUploadEdit = false\r\n }\r\n\r\n return isUseUploadEdit\r\n }\r\n const handleDeleteProject = () => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_DELETE'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: async () => {\r\n if (manageProjectStore?.projectData?.projectID) {\r\n const res = await callWebService.deleteProject(manageProjectStore?.projectData?.projectID)\r\n setConfigDialog({}) //clear function dialog\r\n history.push('/manage-project')\r\n }\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const chkDisplayBTNDeleteProject: boolean =\r\n (projectData?.submitTypeInfo &&\r\n checkPermissionHook.chkDisplayBTNDeleteProject(projectData?.submitTypeInfo?.value) &&\r\n projectData?.isDraft &&\r\n manageProjectStore.projectData?.verifyDocument == null) ||\r\n false\r\n\r\n return {\r\n isDraftData: chkDisplayBTNDeleteProject,\r\n projectData,\r\n isViewMode,\r\n initialValues,\r\n documentTopicList: documentTopic,\r\n initialUploadFile,\r\n configDialog,\r\n onRefDialogTwo,\r\n handleDirtyChange,\r\n onClickSubmit: handelClickSubmit,\r\n onClickCancel: handleClickCancel,\r\n onClickDeleteProject: handleDeleteProject,\r\n checkUseUploadEdit,\r\n }\r\n}\r\n\r\nexport default useCloseProjectResearcher\r\n","import ResearchDetail from '../../../shareUI/ResearchDetail/researchDetail'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { Grid, makeStyles, useMediaQuery, useTheme } from '@material-ui/core'\r\nimport { CloseProjectFormViewPropsType, CloseProjectFormType } from './closeProjectResearcherType'\r\nimport useCloseProjectResearcher from './useCloseProjectResearcher'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport React from 'react'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\nimport RemarkFromAdmin from '../../../shareUI/remarkFromAdmin/remarkFromAdmin'\r\nimport PageAction from '../pageAction'\r\n\r\nconst CloseProjectResearcherView = (props: CloseProjectFormViewPropsType) => {\r\n const {\r\n documentTopicList,\r\n initialValues,\r\n projectData,\r\n initialUploadFile,\r\n isViewMode,\r\n onClickSubmit,\r\n configDialog,\r\n onRefDialogTwo,\r\n onClickCancel,\r\n handleDirtyChange,\r\n checkUseUploadEdit,\r\n isDraftData,\r\n onClickDeleteProject,\r\n } = props\r\n\r\n const isNotCompleteDocument = projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument\r\n\r\n return (\r\n \r\n {({ handleSubmit, form, dirty }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n {!isViewMode && (\r\n {\r\n onClickDeleteProject()\r\n }\r\n : undefined\r\n }\r\n onClickClose={() => {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n // renderSnackbar(props)\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst CloseProjectResearcher = (props: CloseProjectFormType) => {\r\n const useCloseProjectFormModel = useCloseProjectResearcher(props)\r\n return \r\n}\r\nexport default CloseProjectResearcher\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as memoMessageType from './resultOfConsiderType'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { DataSourceType } from '../../../../../../control/treeCheckboxNew/treeCheckbox'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { dateForAPI } from '../../../../../../utilities/date'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\nimport { ResultCertificateCloseProjectResponse } from '../../../../../../services/web/types/responseWebServiceTypes'\r\n\r\nconst useMemomessageTerminate = (props: memoMessageType.UseMemoMessageType) => {\r\n const { onSaveComplete } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const callLookup = useLookupService()\r\n\r\n const [initialSuggestionNotice, setInitialSuggestionNotice] = React.useState()\r\n // const [initialMemoMessagePaper, setInitialMemoMessagePaper] = React.useState<{\r\n // TH: InitialRichTextEditorType\r\n // EN: InitialRichTextEditorType\r\n // }>()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n const [approveStatus, setApproveStatus] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n\r\n // }, [JSON.stringify(projectData)])\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getApproveStatus()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getApproveStatus = async () => {\r\n let res\r\n if (projectData?.irb) {\r\n res = await callLookup.callApproveStatusLut(projectData?.irb, constSubmittedType.adverseEvent)\r\n if (res) {\r\n const formatedData = res?.result?.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n }) as []\r\n setApproveStatus(formatedData)\r\n }\r\n }\r\n }\r\n\r\n const getMemoMessage = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n const { result } = await callWebService.getCertificateCloseProject(submittedID)\r\n return result\r\n }\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n /**\r\n * Default value form\r\n */\r\n const createInitialData = async () => {\r\n const result = await getMemoMessage()\r\n if (result) {\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n approveStatus:\r\n result && result?.approveStatusInfo\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result.approveStatusInfo.nameTH\r\n : result.approveStatusInfo.nameEN,\r\n value: result?.approveStatusInfo.value.toString(),\r\n }\r\n : null,\r\n }\r\n\r\n /******* SuggestionNotice ********/\r\n const initialSugestionNotice = createInitialSuggestion(result)\r\n //************ file *************/\r\n const initialMemorandumFile = createInitialFileMemorandum(result)\r\n\r\n /******set state *******/\r\n setInitialValues(initialData)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialSuggestionNotice(initialSugestionNotice)\r\n }\r\n }\r\n\r\n /**\r\n * SuggestionNotice\r\n */\r\n\r\n const createInitialSuggestion = (content: ResultCertificateCloseProjectResponse) => {\r\n const initialSugestionNotice = {\r\n contentHtml: content?.synthesisReviewRemark_html,\r\n contentText: content?.synthesisReviewRemark,\r\n }\r\n return initialSugestionNotice\r\n }\r\n\r\n /**\r\n * file\r\n */\r\n\r\n const createInitialFileMemorandum = (content: ResultCertificateCloseProjectResponse) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: content?.memoMessagePaperInfo.name_th,\r\n filename: content?.memoMessagePaperInfo.name_th,\r\n fileID: content?.memoMessagePaperInfo.name_th,\r\n path: content?.memoMessagePaperInfo.signPathInfo.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: content?.memoMessagePaperInfo.name_en,\r\n filename: content?.memoMessagePaperInfo.name_en,\r\n fileID: content?.memoMessagePaperInfo.name_en,\r\n path: content?.memoMessagePaperInfo.signPathInfo.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n const handleChangeStatus = () => {}\r\n return {\r\n formRef,\r\n configDialog,\r\n isViewMode: isViewMode,\r\n initialValues,\r\n initialMemorandumFile,\r\n initialSuggestionNotice,\r\n required,\r\n approveStatus,\r\n onRefDialog,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickOpenFile: handleClickOpenFile,\r\n onChangeStatus: handleChangeStatus,\r\n }\r\n}\r\n\r\nexport default useMemomessageTerminate\r\n","import * as memoMessageType from './resultOfConsiderType'\r\nimport useMemomessageTerminate from './useResultOfConsider'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\n// import useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../../constants/approveStatus'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n initialValues,\r\n projectData,\r\n configDialog,\r\n onRefDialog,\r\n onClickBackToSearch,\r\n // onClickOpenFile,\r\n initialMemorandumFile,\r\n initialSuggestionNotice,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n // const checkPermission = useCheckPermission()\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSignMemoMessage: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n const isApproveWithComment =\r\n initialValues?.approveStatus?.value === approveStatusREC1.approveWithComment.toString() ||\r\n initialValues?.approveStatus?.value === approveStatusREC2.approveWithComment.toString()\r\n\r\n const isApprove =\r\n initialValues?.approveStatus?.value === approveStatusREC1.approve.toString() ||\r\n initialValues?.approveStatus?.value === approveStatusREC2.approve.toString()\r\n\r\n return (\r\n {}}\r\n initialValues={{ ...initialValues, memorandumFile: initialMemorandumFile }}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n >\r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {/* {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? initialValues?.approveStatus?.label\r\n : initialValues?.approveStatus?.label} */}\r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {isApproveWithComment\r\n ? translate.get('LABEL.APPROVE')\r\n : initialValues?.approveStatus?.label}\r\n \r\n \r\n \r\n\r\n {!isApprove && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {isSignMemoMessage && (\r\n \r\n \r\n \r\n )}\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { menuTab } from '../../../../../../constants/constants'\r\nimport CloseProjectResearcher from '../../../page/closeProjectResearcher/closeProjectResearcher'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/closeProject/resultOfConsider'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return \r\n case menuTab.tab23.id:\r\n return \r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\nimport { ResultDocumentTopicLut } from '../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport * as Utils from '../../../../../utilities/date'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\n\r\nimport * as VerifyDocumentType from './verifyDocumentType'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../constants/approveStatus'\r\nimport useVerifyDocumentProjectDetail from '../../../shareLogic/useVerifyDocumentProjectDetail'\r\nimport useIRB from '../../../../../services/um/lookups/useIRB'\r\nimport { validateModeAccordionError } from '../../../../../utilities/validate'\r\ntype OptType = {\r\n label: string\r\n value: string\r\n}\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\n\r\nconst useVerifyDocument = (props: VerifyDocumentType.VerifyDocumentType) => {\r\n const { projectData, onSaveComplete } = props\r\n\r\n const history = useHistory()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const [isCompletely, setIsCompletely] = React.useState(true)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n const documentTopicRef = React.useRef()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const reviewerLutRef = React.useRef()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const { createInitialProjectDetail, updateProjectDetailFormatting } = useVerifyDocumentProjectDetail()\r\n const { getIRB } = useIRB()\r\n const formHistoryRef = React.useRef>({})\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n setIsCompletely(projectData?.verifyDocument ?? true)\r\n getReviewer(projectData.irb)\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.irb && projectData?.submitTypeInfo?.value) {\r\n getDocumentTopicLut(projectData?.irb, projectData?.submitTypeInfo.value)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const filterTopicUpload = (documentTopic: ResultDocumentTopicLut[]) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n const researcherTypeID = manageProjectStore?.projectData?.researcherTypeInfo.value\r\n\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n Constants.topicForLecturer.forEach((element) => {\r\n docTopic = documentTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n Constants.topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submitType: number) => {\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitType)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n filterTopicUpload(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n const documentInfo = projectData?.documentInfo\r\n // ------------------------------------------------------------- //\r\n let uploadFileInit = manageProjectStore.documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: VerifyDocumentType.uploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList = docInfo.fileInfo\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic\r\n }\r\n })\r\n })\r\n\r\n let latestDocument = manageProjectStore.projectData?.latestDocument\r\n //Section Replace File\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileInit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileToken, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFile.fileID,\r\n } as any,\r\n ]\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const getReviewer = async (irb: number) => {\r\n if (irb) {\r\n const res = await callLookup.callReviewerLut(irb)\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: itm.name_th,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n reviewerLutRef.current = formatedData\r\n }\r\n }\r\n\r\n const handleChangeDocCompletely = (val: string) => {\r\n const isCompletely = val === '1' ? true : false\r\n setIsCompletely(isCompletely)\r\n }\r\n\r\n const createInitialData = async () => {\r\n loadingHook.loadingOpen()\r\n const defaultCompletely = projectData?.verifyDocument ?? '1'\r\n const lutIrb = await getIRB()\r\n const projectDetail = createInitialProjectDetail(projectData, lutIrb)\r\n const initialData = {\r\n isCompletelyDoc: defaultCompletely === '1' ? defaultCompletely : projectData?.verifyDocument ? '1' : '2',\r\n resubmitDocDate: projectData?.resubmitDocDate ? projectData?.resubmitDocDate : null,\r\n //@ts-ignore\r\n reviewer: projectData?.reviewerUserID\r\n ? {\r\n label: `${projectData?.reviewerName_th}`,\r\n value: `${projectData?.reviewerUserID}`,\r\n }\r\n : null,\r\n remark: projectData?.verifyDocumentRemark,\r\n ...projectDetail,\r\n }\r\n\r\n setInitialValues(initialData)\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const checkUseUploadEdit = () => {\r\n let isUseUploadEdit = false\r\n\r\n switch (projectData?.submitTypeInfo?.value) {\r\n case constSubmittedType.firstSubmitConsideration:\r\n isUseUploadEdit = false\r\n break\r\n case constSubmittedType.editAfterReview:\r\n isUseUploadEdit = true\r\n break\r\n case constSubmittedType.editAfterReview_nextPhaseProject:\r\n isUseUploadEdit = true\r\n break\r\n case constSubmittedType.exitAfterReview_AmendmentProject:\r\n isUseUploadEdit = true\r\n break\r\n case constSubmittedType.editAfterReview_closeProject:\r\n isUseUploadEdit = true\r\n break\r\n default:\r\n isUseUploadEdit = false\r\n }\r\n if (projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument) {\r\n //เอกสารไม่ครบถ้วน\r\n isUseUploadEdit = true\r\n }\r\n if (\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC1.approveWithComment ||\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC2.approveWithComment\r\n ) {\r\n //Approve With Comment\r\n isUseUploadEdit = true\r\n }\r\n\r\n return isUseUploadEdit\r\n }\r\n const handleDirtyChange = (props: { dirty: boolean }) => {\r\n let isDirty: boolean = false\r\n if (!isViewMode) {\r\n isDirty = props.dirty\r\n }\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n const isCompletelyDoc = value?.isCompletelyDoc === '1'\r\n let reviewerUserID = null\r\n // if (isCompletelyDoc && value?.reviewer?.value) {\r\n if (value?.reviewer?.value) {\r\n reviewerUserID = parseInt(value.reviewer.value)\r\n }\r\n\r\n let sendEditData = null\r\n if (!isCompletelyDoc && value?.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(value.resubmitDocDate) ?? null\r\n }\r\n\r\n const verifyProjectServiceParam: REQServiceType.VerifyProjectRequestType = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n reviewerUserID: reviewerUserID,\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : value?.remark ? value.remark : null,\r\n isDraft: isDraft,\r\n }\r\n\r\n return verifyProjectServiceParam\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft: boolean = true\r\n const param = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.VerifyProjectRequestType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n try {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n let isEditAfterReviewCloseProject = false\r\n if (constSubmittedType.editAfterReview_closeProject === projectData?.submitTypeInfo?.value) {\r\n isEditAfterReviewCloseProject = true\r\n } //แก้ไขหลังพิจารณา (ขอปิดโครงการ)\r\n\r\n let response\r\n if (isEditAfterReviewCloseProject) {\r\n response = await callWebService.verifyEditAfterReviewCloseProject(param)\r\n } else {\r\n response = await callWebService.verifyProject(param)\r\n }\r\n\r\n // const response = await callWebService.verifyProject(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useVerifyDocument.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleSubmitForm = async (value: any) => {\r\n if (projectData?.projectID && projectData?.submittedID) {\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param = getSaveServiceParameter(isDraft)\r\n\r\n if (value.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n }\r\n }\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const confirmEditDocResult = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n let isCompletelyDoc = formProps.values.isCompletelyDoc === '1'\r\n let sendEditData = null\r\n if (!isCompletelyDoc && formProps.values.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(formProps.values.resubmitDocDate) ?? null\r\n }\r\n const param = {\r\n ...getEditDocParams(formHistoryRef.current['docResult']),\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : formProps.values?.remark ? formProps.values.remark : null,\r\n }\r\n processSaveData(param)\r\n .then(() => {\r\n handleEditDocResult(formProps)\r\n handleEditDocReviewer(formProps)\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const confirmEditDocReviewer = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n let reviewerUserID = null\r\n if (formProps?.values?.reviewer?.value) {\r\n reviewerUserID = parseInt(formProps.values.reviewer.value)\r\n }\r\n const param = {\r\n ...getEditDocParams(formHistoryRef.current['docResult']),\r\n reviewerUserID: reviewerUserID,\r\n }\r\n const formatParam = {\r\n submittedID: Number(param.submittedID),\r\n loginUserID: Number(param.loginUserID),\r\n reviewerUserID: Number(reviewerUserID),\r\n }\r\n Promise.all([callWebService.updateProjectReviewer(formatParam)])\r\n .then(() => {\r\n handleEditDocResult(formProps)\r\n handleEditDocReviewer(formProps)\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const handleEditDocResult = (formProps: FormRenderProps) => {\r\n formHistoryRef.current['docResult'] = formProps.values\r\n }\r\n\r\n const handleEditDocReviewer = (formProps: FormRenderProps) => {\r\n formHistoryRef.current['docReviewer'] = formProps.values\r\n }\r\n\r\n const getEditDocParams = (formValues: any) => {\r\n let verifyProjectServiceParam: REQServiceType.VerifyProjectRequestType\r\n const isCompletelyDoc = formValues?.isCompletelyDoc === '1'\r\n let reviewerUserID = null\r\n if (formValues?.reviewer?.value) {\r\n reviewerUserID = parseInt(formValues.reviewer.value)\r\n }\r\n\r\n let sendEditData = null\r\n if (!isCompletelyDoc && formValues?.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(formValues.resubmitDocDate) ?? null\r\n }\r\n\r\n verifyProjectServiceParam = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n reviewerUserID: reviewerUserID,\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : formValues?.remark ? formValues.remark : null,\r\n isDraft: false,\r\n }\r\n\r\n return verifyProjectServiceParam\r\n }\r\n\r\n const confirmEditEthics = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n loadingHook.loadingOpen()\r\n const rawData = formRef.current?.values\r\n const formattingParam = updateProjectDetailFormatting(rawData, projectData)\r\n callWebService\r\n .updateProjectDetail(formattingParam)\r\n .then(async () => {\r\n if (projectData) {\r\n await tabAndFolderHook.reloadProjectData(projectData.projectID, projectData.submittedID)\r\n await createInitialData()\r\n }\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n .finally(() => {\r\n loadingHook.loadingClose()\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n return {\r\n formRef,\r\n configDialog,\r\n onRefDialog,\r\n isCompletely,\r\n initialUploadFile: initialUploadFile,\r\n isViewMode,\r\n initialValues,\r\n isShowUpdateDate,\r\n onSubmitForm: handleSubmitForm,\r\n onChangeDocCompletely: handleChangeDocCompletely,\r\n checkUseUploadEdit: checkUseUploadEdit,\r\n onDirtyChange: handleDirtyChange,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n projectDetailLabel: translate.get('LABEL.PROJECT_DETAIL'),\r\n confirmEditDocResult,\r\n confirmEditDocReviewer,\r\n handleEditDocResult,\r\n handleEditDocReviewer,\r\n confirmEditEthics,\r\n }\r\n}\r\n\r\nexport default useVerifyDocument\r\n","import ResearchDetail from '../../../shareUI/ResearchDetail/researchDetail'\r\nimport DocumentTestResult from '../../../shareUI/documentTestResult/documentTestResult'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport { Grid } from '@material-ui/core'\r\nimport { VerifyDocumentViewType, VerifyDocumentType } from './verifyDocumentType'\r\nimport useVerifyDocument from './useVerifyDocument'\r\nimport React from 'react'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport EthicsForm from '../../../shareUI/ethicsForm/ethicsForm'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport { ethicsFormResetList } from '../../../shareUI/ethicsForm/formResetList'\r\n\r\nconst VerifyDocumentView = (props: VerifyDocumentViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n projectData,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialUploadFile,\r\n isNotDisableTestResult = false,\r\n projectDetailLabel,\r\n onRefDialog,\r\n checkUseUploadEdit,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n onChangeDocCompletely,\r\n confirmEditDocResult,\r\n handleEditDocResult,\r\n confirmEditEthics,\r\n } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const { documentTopic } = manageProjectStore\r\n\r\n const checkPermission = useCheckPermission()\r\n const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n const isDisabledTestResult = isNotDisableTestResult || canOfficerEdit ? false : true\r\n const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n return (\r\n \r\n \r\n \r\n {checkPermission.isUserAdmin() ? (\r\n (\r\n \r\n )}\r\n renderViewComponent={() => (\r\n \r\n )}\r\n fieldNames={ethicsFormResetList}\r\n isViewMode={true}\r\n onConfirm={() => confirmEditEthics(props, ethicsFormResetList)}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n\r\n \r\n {\r\n await confirmEditDocResult(props, [\r\n 'isCompletelyDoc',\r\n 'resubmitDocDate',\r\n 'remark',\r\n ])\r\n }}\r\n onClickModeEdit={() => handleEditDocResult(props)}\r\n />\r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {(isNotDisableTestResult || !isViewMode) && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }\r\n : undefined\r\n }\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst VerifyDocument = (props: VerifyDocumentType) => {\r\n const verifyDocumentModel = useVerifyDocument(props)\r\n return \r\n}\r\nexport default VerifyDocument\r\n","import ResearchDetail from '../../../shareUI/ResearchDetail/researchDetail'\r\nimport DocumentTestResult from '../../../shareUI/documentTestResult/documentTestResult'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport DesignateReviewer from '../../../shareUI/designateReviewer/designateReviewer'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport { Grid } from '@material-ui/core'\r\nimport { VerifyDocumentViewType, VerifyDocumentType } from './verifyDocumentType'\r\nimport useVerifyDocument from './useVerifyDocument'\r\nimport React from 'react'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport EthicsForm from '../../../shareUI/ethicsForm/ethicsForm'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport { ethicsFormResetList } from '../../../shareUI/ethicsForm/formResetList'\r\n\r\nconst VerifyDocumentView = (props: VerifyDocumentViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n projectData,\r\n isCompletely,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialUploadFile,\r\n isNotDisableTestResult = false,\r\n projectDetailLabel,\r\n onRefDialog,\r\n checkUseUploadEdit,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n onChangeDocCompletely,\r\n confirmEditDocResult,\r\n confirmEditDocReviewer,\r\n handleEditDocResult,\r\n handleEditDocReviewer,\r\n confirmEditEthics,\r\n } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const { documentTopic } = manageProjectStore\r\n\r\n const irb = projectData?.irb\r\n const checkPermission = useCheckPermission()\r\n const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n const isDisabledTestResult = isNotDisableTestResult || canOfficerEdit ? false : true\r\n const isDisableReviewer = checkPermission.checkDisabledProjectReviewer(projectData)\r\n const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n return (\r\n \r\n \r\n \r\n {checkPermission.isUserAdmin() ? (\r\n (\r\n \r\n )}\r\n renderViewComponent={() => (\r\n \r\n )}\r\n fieldNames={ethicsFormResetList}\r\n isViewMode={true}\r\n onConfirm={() => confirmEditEthics(props, ethicsFormResetList)}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n\r\n \r\n {\r\n await confirmEditDocResult(props, [\r\n 'isCompletelyDoc',\r\n 'resubmitDocDate',\r\n 'remark',\r\n ])\r\n }}\r\n onClickModeEdit={() => handleEditDocResult(props)}\r\n />\r\n \r\n\r\n {isCompletely && (\r\n \r\n {\r\n await confirmEditDocReviewer(props, ['reviewer'])\r\n }}\r\n onClickModeEdit={() => handleEditDocReviewer(props)}\r\n />\r\n \r\n )}\r\n\r\n {isShowUpdateDate && }\r\n\r\n {(isNotDisableTestResult || !isViewMode) && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }\r\n : undefined\r\n }\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst VerifyDocument = (props: VerifyDocumentType) => {\r\n const verifyDocumentModel = useVerifyDocument(props)\r\n return \r\n}\r\nexport default VerifyDocument\r\n","import React, { useRef } from 'react'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport authenStore from '../../../../../../stores/authen/authenStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport { OptType, TFormValue } from '../synthesisType'\r\nimport { SynthesisType } from './synthesis'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport { TabSelectedType } from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport _ from 'lodash'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport { GetSynthesisProjectByIDResultType } from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport useEditSynthesis from '../../../../shareLogic/useEditSynthesis'\r\n\r\nconst useSynthesis = (props: SynthesisType) => {\r\n const { projectData, onSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const [consideration, setConsideration] = React.useState([])\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const manageProjectStore = useManageProjectStore()\r\n const loadingHook = useLoading()\r\n const profileStore = authenStore()\r\n const { profile } = profileStore\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const formValues = React.useRef()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const formRef = useRef()\r\n const editSynthesis = useEditSynthesis({ form: formRef.current })\r\n\r\n React.useEffect(() => {\r\n createInitialData()\r\n }, [projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n if (projectData?.irb) {\r\n getConsideration(projectData?.irb)\r\n }\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const getConsideration = async (irb: number) => {\r\n let res = await callLookup.getApproveStatusByCloseProject(irb)\r\n const formatData = res?.result?.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.approveStatusName_th\r\n : itm.approveStatusName_en,\r\n value: `${itm.approveStatusId}`,\r\n }\r\n }) as []\r\n setConsideration(formatData)\r\n }\r\n\r\n const getSynthesis = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getSynthesisProjectByID(projectData.submittedID)\r\n\r\n loadingHook.loadingClose()\r\n return result\r\n }\r\n }\r\n\r\n /**\r\n * Default value form\r\n */\r\n const createInitialData = async () => {\r\n const result = await getSynthesis()\r\n\r\n if (result) {\r\n const initialData = {\r\n approveStatus:\r\n result && result?.approveStatusID\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result.approveStatusName_th\r\n : result.approveStatusName_en,\r\n value: result?.approveStatusID.toString(),\r\n }\r\n : null,\r\n synthesis: conditionRenderSynthesisView(result),\r\n }\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const conditionRenderSynthesisView = (result: GetSynthesisProjectByIDResultType) => {\r\n const isFirstTime = !result?.synthesisRemarkInfo && !result?.isDraft\r\n if (isFirstTime) {\r\n return null\r\n }\r\n\r\n if (result.synthesisRemarkInfo && result.synthesisRemarkInfo?.remark) {\r\n return result.synthesisRemarkInfo?.remark\r\n } else {\r\n return isViewMode ? '-' : null\r\n }\r\n }\r\n\r\n /**\r\n * process save\r\n */\r\n const handleSubmitForm = async (val: TFormValue) => {\r\n const parameter = getParameterForSave(val)\r\n if (val.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n handleConfirmSave(parameter)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n const getParameterForSave = (val: TFormValue) => {\r\n let paramForSave = null\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n let isDraft = false\r\n if (val.submitType === 'draft') {\r\n isDraft = true\r\n }\r\n\r\n const synthesisProjectRequest: REQServiceType.SynthesisProjectType = {\r\n loginUserID: profile.userId,\r\n submittedID: submittedID,\r\n reviewerID: profile.userId,\r\n approveStatusID:\r\n val && val.approveStatus && val.approveStatus.value ? parseInt(val?.approveStatus.value) : null,\r\n synthesisInfo: [],\r\n synthesisRemark: val && val?.synthesis ? val?.synthesis : null,\r\n isDraft: isDraft,\r\n }\r\n paramForSave = synthesisProjectRequest\r\n\r\n return paramForSave\r\n }\r\n\r\n const handleConfirmSave = async (\r\n paramForSave: REQServiceType.SynthesisProjectType,\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n\r\n const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.synthesisProject(paramForSave)\r\n\r\n if (!isFolder) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n if (tabIndex && newTabSelected) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n } else {\r\n //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n if (onSaveComplete) {\r\n if (res && res.status) {\r\n onSaveComplete(res.status, isDraft)\r\n }\r\n }\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleClickBackToSearch = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n /**\r\n * Dirty\r\n */\r\n\r\n const handleDirtyChange = (props: any) => {\r\n formValues.current = { ...props.values }\r\n let isDirty: boolean = false\r\n //** จัดformat initValue และ Form Value เพื่อเตรียมตัวนำไปใช้เปรียบเทียบค่า **//\r\n let newFormValue = { ...props.values }\r\n let initValue = { ...initialValues }\r\n\r\n //**********************************************************//\r\n const isEqual = _.isEqual(initValue, newFormValue) //ข้อมูลเท่ากัน\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n const parameter = getParameterForSave(formValues.current)\r\n if (parameter) {\r\n parameter.isDraft = true\r\n handleConfirmSave(parameter, tabIndex, newTabSelected, isFolder)\r\n }\r\n }\r\n\r\n const updateAfterSubmitted = async (names: string[]) => {\r\n formRef.current?.change('submitType', 'save')\r\n const formProps = formRef.current?.getState()\r\n const parameter = {\r\n ...getParameterForSave(formValues.current),\r\n approveStatusID: formProps?.values?.approveStatus?.value ?? null,\r\n synthesisRemark: formProps?.values?.synthesis ?? null,\r\n }\r\n let isError = false\r\n const errKeys = Object.keys(formProps.errors)\r\n names.forEach((name) => {\r\n const findError = errKeys.includes(name)\r\n if (findError) {\r\n isError = true\r\n }\r\n })\r\n loadingHook.loadingOpen()\r\n return new Promise((resolve, reject) => {\r\n if (isError) {\r\n Promise.all([callWebService.synthesisProject(parameter)])\r\n .then(async () => {\r\n await loadTabAndFolder()\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formRef.current?.submit()\r\n reject('')\r\n }\r\n }).finally(() => {\r\n loadingHook.loadingClose()\r\n })\r\n }\r\n\r\n const loadTabAndFolder = async () => {\r\n if (manageProjectStore?.projectData) {\r\n await tabAndFolderHook.reloadProjectData(\r\n manageProjectStore.projectData.projectID,\r\n manageProjectStore.projectData.submittedID,\r\n )\r\n }\r\n }\r\n\r\n return {\r\n configDialog,\r\n isViewMode,\r\n consideration,\r\n initialValues,\r\n isShowUpdateDate,\r\n useAccordionMode: editSynthesis.useAccordionMode,\r\n formRef,\r\n updateAfterSubmitted,\r\n onRefDialog,\r\n\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onDirtyChange: handleDirtyChange,\r\n }\r\n}\r\nexport default useSynthesis\r\n","import { Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useSynthesis from './useSynthesis'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport Autocomplete from '../../../../../../control/autocomplete/autocomplete'\r\nimport MyTextfield from '../../../../../../control/textfield/textfield'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\n\r\ntype SynthesisViewType = ReturnType\r\nconst SynthesisView = (props: SynthesisViewType) => {\r\n const {\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n consideration,\r\n isShowUpdateDate,\r\n useAccordionMode,\r\n formRef,\r\n updateAfterSubmitted,\r\n onRefDialog,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n onDirtyChange,\r\n } = props\r\n const translate = useTranslate()\r\n\r\n const renderComment = (isDisabled: boolean) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n\r\n return (\r\n
\r\n {(props) => {\r\n const { form, dirty } = props\r\n formRef.current = form\r\n return (\r\n \r\n \r\n {useAccordionMode ? (\r\n renderComment(false)}\r\n renderViewComponent={() => renderComment(true)}\r\n isViewMode={true}\r\n fieldNames={['approveStatus', 'synthesis']}\r\n onConfirm={() => updateAfterSubmitted(['approveStatus', 'synthesis'])}\r\n />\r\n ) : (\r\n \r\n {renderComment(isViewMode)}\r\n \r\n )}\r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={() => {\r\n onClickBackToSearch(dirty)\r\n }}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport type SynthesisType = {\r\n onSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n projectData: any\r\n}\r\nconst Synthesis = (props: SynthesisType) => {\r\n const synthesis = useSynthesis(props)\r\n return \r\n}\r\nexport default Synthesis\r\n","import React from 'react'\r\nimport { SynthesisReviewType } from './synthesisReview'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport authenStore from '../../../../../../stores/authen/authenStore'\r\nimport { TabSelectedType } from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { SynthesisReviewProjectRequestType } from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport { TFormValue } from '../synthesisReviewType'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport _ from 'lodash'\r\nimport {\r\n SynthesisReviewInfo,\r\n SynthesisReviewRemarkInfo,\r\n} from '../../../../../../services/web/types/responseWebServiceTypes'\r\n\r\nconst useSynthesisReview = (props: SynthesisReviewType) => {\r\n const { projectData, onSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const callWebService = useWebService()\r\n const loadingHook = useLoading()\r\n const { profile } = authenStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const translate = useTranslate()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const formValues = React.useRef()\r\n const [isLoadedSynthesisReview, setIsLoadedSynthesisReview] = React.useState(false)\r\n const [synthesisReviewRemarkInfoList, setSynthesisReviewRemarkInfo] = React.useState()\r\n const [initialRichTextEditor, setInitialRichTextEditor] = React.useState()\r\n\r\n React.useEffect(() => {\r\n getSynthesisReviewData()\r\n }, [projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n createInitialData()\r\n createInitialRichTextEditor()\r\n }, [isLoadedSynthesisReview])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const getSynthesisReviewData = async () => {\r\n if (projectData) {\r\n setIsLoadedSynthesisReview(false)\r\n loadingHook.loadingOpen()\r\n const submittedID = projectData.submittedID\r\n const data = await callWebService.getSynthesisReview(submittedID)\r\n loadingHook.loadingClose()\r\n if (data.status === 1) {\r\n setSynthesisReviewRemarkInfo(data.result.synthesisReviewRemarkInfo)\r\n setIsLoadedSynthesisReview(true)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Default value form\r\n */\r\n const createInitialData = async () => {\r\n if (synthesisReviewRemarkInfoList) {\r\n const initialData = {\r\n synthesisList: synthesisReviewRemarkInfoList?.synthesisRemark\r\n ? synthesisReviewRemarkInfoList?.synthesisRemark\r\n : '-',\r\n }\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const createInitialRichTextEditor = () => {\r\n if (synthesisReviewRemarkInfoList) {\r\n const initialData = {\r\n contentHtml: synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n : synthesisReviewRemarkInfoList?.synthesisRemark,\r\n contentText: synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n : synthesisReviewRemarkInfoList?.synthesisRemark,\r\n }\r\n\r\n setInitialRichTextEditor(initialData)\r\n }\r\n }\r\n\r\n /**\r\n * process save\r\n */\r\n const handleSubmitForm = async (val: TFormValue) => {\r\n const parameter = getParameterForSave(val)\r\n\r\n if (val.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n handleConfirmSave(parameter)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n const getParameterForSave = (val: TFormValue) => {\r\n let paramForSave = null\r\n const submittedID = projectData?.submittedID ?? null\r\n\r\n let isDraft = false\r\n if (val.submitType === 'draft') {\r\n isDraft = true\r\n }\r\n\r\n const synthesisReviewProjectRequest: SynthesisReviewProjectRequestType = {\r\n loginUserID: profile.userId,\r\n submittedID: submittedID,\r\n synthesisReviewInfo: null,\r\n stampFileList: null,\r\n synthesisReviewRemarkInfo: {\r\n remark: val.consideration && val.consideration.contentText ? val.consideration.contentText : null,\r\n remark_htmltag:\r\n val.consideration && val.consideration.contentHtml ? val.consideration.contentHtml : null,\r\n },\r\n isDraft: isDraft,\r\n }\r\n paramForSave = synthesisReviewProjectRequest\r\n return paramForSave\r\n }\r\n\r\n const handleConfirmSave = async (\r\n paramForSave: SynthesisReviewProjectRequestType,\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n loadingHook.loadingOpen()\r\n\r\n const param = { ...paramForSave } as SynthesisReviewProjectRequestType\r\n const res = await callWebService.synthesisReviewCloseProject(param)\r\n dialogRef.current?.closeDialog()\r\n\r\n if (!isFolder) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n if (tabIndex && newTabSelected) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n } else {\r\n //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n if (onSaveComplete) {\r\n if (res && res.status) {\r\n onSaveComplete(res.status, isDraft)\r\n }\r\n }\r\n }\r\n }\r\n\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleClickBackToSearch = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n /**\r\n * Dirty\r\n */\r\n\r\n const handleDirtyChange = (props: any) => {\r\n formValues.current = { ...props.values }\r\n\r\n let isDirty: boolean = false\r\n const consideration = {\r\n contentHtml: initialRichTextEditor?.contentHtml,\r\n contenText: initialRichTextEditor?.contentText,\r\n }\r\n const initialVal = {\r\n ...initialValues,\r\n consideration: consideration,\r\n }\r\n //** จัดformat initValue และ Form Value เพื่อเตรียมตัวนำไปใช้เปรียบเทียบค่า **//\r\n let newFormValue = _.omit(props.values, ['submitType'])\r\n\r\n let initValue = _.omit(initialVal, ['submitType'])\r\n\r\n //**********************************************************//\r\n const isEqual = _.isEqual(initValue, newFormValue) //ข้อมูลเท่ากัน\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n const parameter = getParameterForSave(formValues.current)\r\n if (parameter) {\r\n parameter.isDraft = true\r\n handleConfirmSave(parameter, tabIndex, newTabSelected, isFolder)\r\n }\r\n }\r\n return {\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialRichTextEditor,\r\n onRefDialog,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onDirtyChange: handleDirtyChange,\r\n }\r\n}\r\nexport default useSynthesisReview\r\n","import { Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useSynthesisReview from './useSynthesisReview'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport MyTextfield from '../../../../../../control/textfield/textfield'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\n\r\ntype SynthesisReviewViewType = ReturnType\r\nconst SynthesisReviewView = (props: SynthesisReviewViewType) => {\r\n const {\r\n configDialog,\r\n isViewMode,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialRichTextEditor,\r\n onRefDialog,\r\n onSubmitForm,\r\n onDirtyChange,\r\n onClickBackToSearch,\r\n } = props\r\n const translate = useTranslate()\r\n return (\r\n
\r\n {(props) => {\r\n // const { dirty } = props\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={() => {\r\n onClickBackToSearch(props.dirty)\r\n }}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport type SynthesisReviewType = {\r\n onSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n projectData: any\r\n}\r\nconst SynthesisReview = (props: SynthesisReviewType) => {\r\n const synthesis = useSynthesisReview(props)\r\n return \r\n}\r\nexport default SynthesisReview\r\n","import React from 'react'\r\nimport _ from 'lodash'\r\n\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport {\r\n ResultCertificateCloseProjectResponse,\r\n SynthesisReviewResultType,\r\n} from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport { CertificateCloseProjectType } from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport { dateForAPI } from '../../../../../../utilities/date'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport { ReportedCloseProjectType } from './reportedCloseProject'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport { OptType } from '../../memoMessageTerminateProject/memoMessageType'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport { validateModeAccordionError } from '../../../../../../utilities/validate'\r\n\r\nconst useCloseProject = (props: ReportedCloseProjectType) => {\r\n const { projectData, onSaveComplete, projectModeEdit = false } = props\r\n\r\n const callWebService = useWebService()\r\n const callLookup = useLookupService()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const manageProjectStore = useManageProjectStore()\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const editRef = React.useRef()\r\n\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n const [initialMemoMessagePaper, setInitialMemoMessagePaper] = React.useState<{\r\n TH: InitialRichTextEditorType\r\n EN: InitialRichTextEditorType\r\n }>()\r\n const [initialSuggestionNotice, setInitialSuggestionNotice] = React.useState()\r\n const [consideration, setConsideration] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n getConsideration(projectData?.irb)\r\n }\r\n }, [\r\n projectData?.projectID ?? null,\r\n projectData?.submittedID ?? null,\r\n projectData?.considerInfo ?? null,\r\n translate.languageStore.currentLanguage,\r\n ])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const getMemoMessage = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n const { result } = await callWebService.getCertificateCloseProject(submittedID)\r\n return result\r\n }\r\n }\r\n\r\n const getConsideration = async (irb: number) => {\r\n let res = await callLookup.getApproveStatusByCloseProject(irb)\r\n const formatData = res?.result?.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.approveStatusName_th\r\n : itm.approveStatusName_en,\r\n value: `${itm.approveStatusId}`,\r\n }\r\n }) as []\r\n setConsideration(formatData)\r\n }\r\n\r\n const getSynthesisReviewData = async (submittedID: number) => {\r\n if (submittedID) {\r\n const { result } = await callWebService.getSynthesisReview(submittedID)\r\n return result\r\n }\r\n }\r\n\r\n /**\r\n * Default value form\r\n */\r\n const createInitialData = async () => {\r\n const result = await getMemoMessage()\r\n\r\n if (result) {\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n approveStatus:\r\n result && result?.approveStatusInfo\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result.approveStatusInfo.nameTH\r\n : result.approveStatusInfo.nameEN,\r\n value: result?.approveStatusInfo.value.toString(),\r\n }\r\n : null,\r\n }\r\n\r\n let initialSugestionNotice\r\n if (projectModeEdit) {\r\n if (manageProjectStore?.projectData?.aroundSubmittedIDInfo.previousSubmittedID) {\r\n const resultSynthesisReview = await getSynthesisReviewData(\r\n manageProjectStore?.projectData?.aroundSubmittedIDInfo.previousSubmittedID,\r\n )\r\n /******* SuggestionNotice edit********/\r\n initialSugestionNotice = createInitialSuggestionModeEdit(resultSynthesisReview)\r\n }\r\n } else {\r\n /******* SuggestionNotice ********/\r\n initialSugestionNotice = createInitialSuggestion(result)\r\n }\r\n\r\n /******* Paper ********/\r\n const initialMemoMessagePaper = createInitialPaper(result)\r\n //************ file *************/\r\n const initialMemorandumFile = createInitialFileMemorandum(result)\r\n\r\n /******set state *******/\r\n setInitialValues(initialData)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialSuggestionNotice(initialSugestionNotice)\r\n }\r\n }\r\n\r\n /**\r\n * SuggestionNotice\r\n */\r\n\r\n const createInitialSuggestion = (content: ResultCertificateCloseProjectResponse) => {\r\n const initialSugestionNotice = {\r\n contentHtml: content?.synthesisReviewRemark_html,\r\n contentText: content?.synthesisReviewRemark,\r\n }\r\n\r\n return initialSugestionNotice\r\n }\r\n\r\n const createInitialSuggestionModeEdit = (content?: SynthesisReviewResultType) => {\r\n const initialSugestionNotice = {\r\n contentHtml: content?.synthesisReviewRemarkInfo.synthesisReviewRemark_html ?? '',\r\n contentText: content?.synthesisReviewRemarkInfo.synthesisReviewRemark ?? '',\r\n }\r\n return initialSugestionNotice\r\n }\r\n\r\n /**\r\n * Paper\r\n */\r\n const createInitialPaper = (content: ResultCertificateCloseProjectResponse) => {\r\n const initialMemoMessagePaper = {\r\n TH: {\r\n contentHtml: content?.memoMessagePaper_th_html,\r\n contentText: content?.memoMessagePaper_th,\r\n },\r\n EN: {\r\n contentHtml: content?.memoMessagePaper_en_html,\r\n contentText: content?.memoMessagePaper_en,\r\n },\r\n }\r\n return initialMemoMessagePaper\r\n }\r\n\r\n /**\r\n * file\r\n */\r\n\r\n const createInitialFileMemorandum = (content: ResultCertificateCloseProjectResponse) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: content?.memoMessagePaperInfo.name_th,\r\n filename: content?.memoMessagePaperInfo.name_th,\r\n fileID: content?.memoMessagePaperInfo.name_th,\r\n path: content?.memoMessagePaperInfo.unSignPathInfo.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: content?.memoMessagePaperInfo.name_en,\r\n filename: content?.memoMessagePaperInfo.name_en,\r\n fileID: content?.memoMessagePaperInfo.name_en,\r\n path: content?.memoMessagePaperInfo.unSignPathInfo.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n\r\n /**\r\n *\r\n * process save\r\n */\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n let param: CertificateCloseProjectType = {\r\n submittedID: submittedID,\r\n memoMessagePaper_th:\r\n value?.memoMessagePaper_TH && value?.memoMessagePaper_TH.contentText\r\n ? value?.memoMessagePaper_TH.contentText\r\n : null,\r\n memoMessagePaper_en:\r\n value?.memoMessagePaper_EN && value?.memoMessagePaper_EN.contentText\r\n ? value?.memoMessagePaper_EN.contentText\r\n : null,\r\n memoMessagePaper_th_html:\r\n value?.memoMessagePaper_TH && value?.memoMessagePaper_TH.contentHtml\r\n ? value?.memoMessagePaper_TH.contentHtml\r\n : null,\r\n memoMessagePaper_en_html:\r\n value?.memoMessagePaper_EN && value?.memoMessagePaper_EN.contentHtml\r\n ? value?.memoMessagePaper_EN.contentHtml\r\n : null,\r\n memoMessageDate: value?.memoMessageDate ? dateForAPI(value?.memoMessageDate) ?? null : null,\r\n isDraft: isDraft,\r\n }\r\n return param\r\n }\r\n const processSaveData = async (\r\n param: CertificateCloseProjectType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n try {\r\n loadingHook.loadingOpen()\r\n\r\n const response = await callWebService.certificateCloseProject(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useDefineProject.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleSubmitForm = (value: any) => {\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param = getSaveServiceParameter(isDraft)\r\n if (isDraft) {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * button back to search\r\n */\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n /**\r\n *\r\n * Dirty\r\n */\r\n\r\n const handleDirtyChange = (props: any) => {\r\n let isDirty: boolean = false\r\n const initialVal = {\r\n ...initialValues,\r\n memoMessagePaper_EN: {\r\n contentHtml: initialMemoMessagePaper?.EN.contentHtml ?? '',\r\n contentText: initialMemoMessagePaper?.EN.contentText ?? '',\r\n },\r\n memoMessagePaper_TH: {\r\n contentHtml: initialMemoMessagePaper?.TH.contentHtml ?? '',\r\n contentText: initialMemoMessagePaper?.TH.contentText ?? '',\r\n },\r\n memorandumFile: initialMemorandumFile,\r\n suggestionNotice: {\r\n contentHtml: initialSuggestionNotice?.contentHtml ?? '',\r\n contentText: initialSuggestionNotice?.contentText ?? '',\r\n },\r\n }\r\n let newFormValue = _.omit(props.values, ['submitType'])\r\n let initValue = _.omit(initialVal, ['submitType'])\r\n\r\n const isEqual = _.isEqual(initValue, newFormValue)\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft = true\r\n const param = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const updateMemoMessage = async (param: REQServiceType.UpdateMemoMessageType) => {\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.updateMemoMessagePaper(param)\r\n\r\n if (res.result.status === 200) {\r\n dialogRef.current?.openDialog()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n setConfigDialog({})\r\n },\r\n })\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleSubmitUpdateMemo = (fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formRef.current)\r\n return new Promise(async (resolve, reject) => {\r\n if (isError) {\r\n formRef.current?.form.submit()\r\n reject('')\r\n } else {\r\n resolve('')\r\n const param: REQServiceType.UpdateMemoMessageType = {\r\n submittedID: Number(projectData?.submittedID),\r\n memoMessagePaperTH: formRef.current?.values.memoMessagePaper_TH.contentText,\r\n memoMessagePaperEN: formRef.current?.values.memoMessagePaper_EN.contentText,\r\n memoMessagePaperTHHTML: formRef.current?.values.memoMessagePaper_TH.contentHtml,\r\n memoMessagePaperENHTML: formRef.current?.values.memoMessagePaper_EN.contentHtml,\r\n }\r\n\r\n updateMemoMessage(param)\r\n }\r\n })\r\n }\r\n\r\n const handleCancle = () => {\r\n const valueMessageTH: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_TH`].contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_TH`].contentText,\r\n }\r\n const valueMessageEN: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_EN`].contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_EN`].contentText,\r\n }\r\n setInitialMemoMessagePaper((prev) => ({\r\n TH: {\r\n ...prev?.TH,\r\n ...valueMessageTH,\r\n },\r\n EN: {\r\n ...prev?.EN,\r\n ...valueMessageEN,\r\n },\r\n }))\r\n }\r\n\r\n const onClickEdit = () => {\r\n editRef.current = formRef.current?.form.getState().values\r\n }\r\n return {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n consideration,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialMemoMessagePaper,\r\n initialSuggestionNotice,\r\n\r\n onRefDialog,\r\n onDirtyChange: handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickOpenFile: handleClickOpenFile,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n }\r\n}\r\nexport default useCloseProject\r\n","import useReportedCloseProject from './useReportedCloseProject'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport MyAutocomplete from '../../../../../../control/autocomplete/autocomplete'\r\nimport MyDatePicker from '../../../../../../control/datepicker/datepicker'\r\n\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport { GetProjectResultType } from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { richEditorRequired } from '../../../../../../utilities/validate'\r\n\r\nexport type ReportedCloseProjectTypeViewType = ReturnType & ReportedCloseProjectType\r\nconst ReportedCloseProjectView = (props: ReportedCloseProjectTypeViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n consideration,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialSuggestionNotice,\r\n initialMemoMessagePaper,\r\n\r\n onRefDialog,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n onClickOpenFile,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n } = props\r\n const translate = useTranslate()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const latestFolderIdx = 0\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n const isEdit = isViewMode && currentSelectFolder\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n

\\n'\r\n ? [richEditorRequired(translate.get('MESSAGE.M015'))]\r\n : []\r\n }\r\n />\r\n
\r\n
\r\n )\r\n }\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_TH']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_TH'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_EN']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_EN'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type ReportedCloseProjectType = {\r\n projectData?: GetProjectResultType | null | undefined\r\n onSaveComplete?: ((status: number, isDraft: boolean) => void) | undefined\r\n isDisableApproveStatus?: boolean\r\n projectModeEdit?: boolean\r\n}\r\nconst ReportedCloseProject = (props: ReportedCloseProjectType) => {\r\n const reportedNonconformance = useReportedCloseProject(props)\r\n return \r\n}\r\nexport default ReportedCloseProject\r\n","import VerifyDocumentCloseProjectREC1 from '../../../page/verifyDocumentCloseProject/verifyDocumentCloseProjectREC1'\r\nimport VerifyDocumentCloseProjectREC2 from '../../../page/verifyDocumentCloseProject/verifyDocumentCloseProjectREC2'\r\nimport { OfficerType } from './officerType'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport Synthesis from '../../../page/synthesis/closeProject/synthesis'\r\nimport SynthesisReview from '../../../page/synthesisReview/closeProject/synthesisReview'\r\nimport ReportedCloseProject from '../../../page/memoMessage/reportedCloseProject/reportedCloseProject'\r\nimport SignREC1 from '../../../page/sign/signMemoMessage/signREC1'\r\nimport SignREC2 from '../../../page/sign/signMemoMessage/signREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC1'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC2'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n let isNotDisableTestResult = false\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.synthesis\r\n }\r\n return (\r\n \r\n )\r\n // case Constants.menuTab.tab12.id:\r\n // return (\r\n // \r\n // )\r\n\r\n case Constants.menuTab.tab6.id:\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab7.id:\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab11.id:\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab9.id:\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n return \r\n default:\r\n return
\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.synthesis\r\n }\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab6.id:\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab7.id:\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab11.id:\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab9.id:\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n return \r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useCloseProject from './useCloseProject'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\n\r\ntype CloseProjectViewType = ReturnType & Omit\r\nconst CloseProjectView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const isBtnClose =\r\n checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.synthesis ? false : isViewMode\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n React.useEffect(() => {\r\n console.log('CloseProjectView')\r\n }, [])\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {isBtnClose && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n\r\nexport type CloseProjectType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst CloseProject: React.FC = (props) => {\r\n const closeProjectModel = useCloseProject(props)\r\n\r\n return \r\n}\r\nexport default CloseProject\r\n","import React from 'react'\r\nimport { CloseProjectType } from './closeProject'\r\nimport * as closeProjectOtherType from './closeProjectOtherType'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nexport default (props: CloseProjectType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n // const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n console.log('####CloseProject####')\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n // const isReloadProjectData = false\r\n // loadTabAndFolder(isReloadProjectData)\r\n\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n // const loadTabAndFolder = async (isReloadProjectData: boolean = true) => {\r\n // const mode = projectMode\r\n // if (mode === 'CREATE') {\r\n // tabAndFolderHook.createProjectLoadTabAndFolder()\r\n // } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n // tabAndFolderHook.loadTabAndFolder(manageProjectStore.projectData, appFolderAndTabStore, isReloadProjectData)\r\n // }\r\n // }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n // setConfigDialog({}) //clear function dialog\r\n // // loadLatestFolder()\r\n // const isReloadProjectData = true\r\n // loadTabAndFolder(isReloadProjectData)\r\n // appFolderAndTabAction.resetTabDirty()\r\n\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\n// import NewProject from '../../../page/requestNewProject/newProject/newProject'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/resultOfConsider'\r\nimport NoticeAdditionalDocument from '../../../page/noticeAdditionalDocument/noticeAdditionalDocument'\r\nimport CertificateStampDocument from '../../../page/certificateStampDocument/certificateStampDocument'\r\n\r\nimport { menuTab } from '../../../../../../constants/constants'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\nimport ProjectPhase from '../../../page/requestNewProject/projectPhase/projectPhase'\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return (\r\n \r\n )\r\n case menuTab.tab22.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab24.id:\r\n return \r\n\r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n projectData: manageProjectStore.projectData,\r\n initialData: initialData,\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import SynthesisREC1 from '../../../page/synthesis/synthesisREC1' //padge\r\nimport SynthesisREC2 from '../../../page/synthesis/synthesisREC2' //padge\r\nimport AdditionalDocumentREC1 from '../../../page/additionalDocument/additionalDocumentREC1'\r\nimport AdditionalDocumentREC2 from '../../../page/additionalDocument/additionalDocumentREC2'\r\nimport VerifyDocumentREC1 from '../../../page/verifyDocument/verifyDocumentREC1'\r\nimport VerifyDocumentREC2 from '../../../page/verifyDocument/verifyDocumentREC2'\r\nimport DefineProjectREC1 from '../../../page/defineProject/defineProjectREC1'\r\nimport DefineProjectREC2 from '../../../page/defineProject/defineProjectREC2'\r\nimport GenerateCertificateREC1 from '../../../page/generateCertificate/generateCertificateREC1'\r\nimport GenerateCertificateREC2 from '../../../page/generateCertificate/generateCertificateREC2'\r\nimport DefineSubmittedDateREC1 from '../../../page/defineSubmittedDate/defineSubmittedDateREC1'\r\nimport DefineSubmittedDateREC2 from '../../../page/defineSubmittedDate/defineSubmittedDateREC2'\r\nimport ReviewerCommentREC1 from '../../../page/reviewerComment/reviewerCommentREC1'\r\nimport ReviewerCommentREC2 from '../../../page/reviewerComment/reviewerCommentREC2'\r\n\r\nimport SynthesisReviewREC1 from '../../../page/synthesisReview/synthesisReviewREC1'\r\nimport SynthesisReviewREC2 from '../../../page/synthesisReview/synthesisReviewREC2'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\n\r\nimport SignREC1 from '../../../page/sign/signREC1'\r\nimport SignREC2 from '../../../page/sign/signREC2'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentREC1'\r\n\r\nimport { OfficerType, OfficerViewType } from './officerType'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useOfficer from './useOfficer'\r\nimport * as Constants from '../../../../../../constants/constants'\r\n\r\nimport SignVicePresidentREC2 from '../../../page/signVicePresident/signVicePresidentREC2'\r\nimport SignVicePresidentREC1 from '../../../page/signVicePresident/signVicePresidentREC1'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete, projectData } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n let isNotDisableTestResult = false\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC1
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n // code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n // return \r\n return renderSignRepresentElement(1)\r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC2
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n /// code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n // return \r\n return renderSignRepresentElement(2)\r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n const renderSignRepresentElement = (REC: 1 | 2) => {\r\n const isVicePresident = checkPermission.isUserViceChairman()\r\n if (REC === 1) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n } else if (REC === 2) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n const useOfficerModel = useOfficer(props)\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\nimport { UseOfficerType } from './officerType'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nexport default (props: UseOfficerType) => {\r\n const {} = props\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n\r\n return {\r\n projectData: manageProjectStore.projectData,\r\n }\r\n}\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useProjectPhaseEditAfterReview from './useProjectPhaseEditAfterReview'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\ntype ProjectPhaseEditAfterReviewViewType = ReturnType &\r\n Omit\r\nconst ProjectPhaseEditAfterReviewView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const currentSelectTab = appFolderAndTabStore.tabSelected.stepID\r\n\r\n const checkConditionBtnClose = () => {\r\n let isEditDirector = false\r\n\r\n //เช็คว่ามีการกลับมาแก้ไขกรรมการมั้ย และไม่ใช่กรรมการเข้ามาใช่มั้ย (ปุ่มถอนยื่นต้องแสดงทุก step)\r\n if (projectData?.stepID) {\r\n isEditDirector = projectData?.stepID >= constSubmittedStep.submit && projectData?.committeeInfo.length >= 0\r\n }\r\n\r\n // เช็คว่าแก๊งประธานมาตรวจสอบเอกสารในขั้นตอนกำหนดประเภทโครงการมั้ย\r\n const isChairmanVerifyDoc =\r\n checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.specifyProjectType\r\n\r\n // เช็คว่าผ่านstepการกำหนดประเภทโครงการและกรรมการไปรึยัง และกำลังเปิด tab กำหนดประเภทและกรรมการอยู่ใช่มั้ย\r\n const isChkStepEditDirector =\r\n currentSelectTab === constSubmittedStep.specifyProjectType &&\r\n projectData?.stepID !== constSubmittedStep.specifyProjectType\r\n\r\n let isBtnClose = isChairmanVerifyDoc ? false : isChkStepEditDirector ? isEditDirector : isViewMode\r\n\r\n return isBtnClose\r\n }\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {checkConditionBtnClose() && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type ProjectPhaseEditAfterReviewType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst ProjectPhaseEditAfterReview: React.FC = (props) => {\r\n const useProjectPhaseEditAfterReviewModel = useProjectPhaseEditAfterReview(props)\r\n return \r\n}\r\nexport default ProjectPhaseEditAfterReview\r\n","import React from 'react'\r\nimport { ProjectPhaseEditAfterReviewType } from './projectPhaseEditAfterReview'\r\nimport * as RequestNewProjectOtherType from './projectPhaseEditAfterReviewOtherType'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\n\r\nexport default (props: ProjectPhaseEditAfterReviewType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n console.log('####Request NewProject EditAfter Review####')\r\n }, [])\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\n","import React from 'react'\r\nimport * as TerminateProjectType from './terminateProjectType'\r\n\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\n\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport { topicForLecturer, topicForStudent } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\n\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport * as REQServiceTypes from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport _ from 'lodash'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport { encryptionAES } from '../../../../../../utilities/encryption'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { ResultDocumentTopicLut } from '../../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport useProjectHook from '../../../../shareLogic/useProjectHook'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\n\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\n\r\ntype MyFileDataType = {\r\n documentTopicID?: number\r\n fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }>\r\n subtopic?: {\r\n subtopicID: number\r\n page: number | string\r\n }[]\r\n}\r\n\r\nconst useRequestForm = (props: TerminateProjectType.UseRequestFormType) => {\r\n const { formMode, projectSubmittedTypeID, isViewMode, onSaveComplete, initialData } = props\r\n\r\n const translate = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const projectHook = useProjectHook()\r\n\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const checkPermission = useCheckPermission()\r\n\r\n const { profile } = authenStore\r\n\r\n const { configLoading, loadingClose, loadingOpen } = useLoading()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const callLookup = useLookupService()\r\n const [selectedIrb, setSelectedIrb] = React.useState('1')\r\n\r\n const dialogTwoRef = React.useRef>()\r\n const projectIDRef = React.useRef()\r\n const submittedIDRef = React.useRef()\r\n const irbRef = React.useRef()\r\n const parameterForSaveRef = React.useRef()\r\n const submitValueRef = React.useRef()\r\n const isDraftRef = React.useRef(false)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const { documentTopic } = manageProjectStore\r\n const researcherTypeRef = React.useRef()\r\n const documentTopicRef = React.useRef()\r\n const valuesForm = React.useRef()\r\n const tabSelectedIndexRef = React.useRef(null)\r\n const newTabSelectedRef = React.useRef(null)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n //clear ค่า tabRef\r\n tabSelectedIndexRef.current = null\r\n newTabSelectedRef.current = null\r\n }\r\n }, [])\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData?.irb && manageProjectStore.projectData?.submitTypeInfo.value) {\r\n getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n manageProjectStore.projectData?.submitTypeInfo.value,\r\n )\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n // const fileTokenInfo: Array = uploadObj.uploadFileObj.fileList?.map((file) => file.fileToken) ?? []\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n const getParameterForSave = (value: TerminateProjectType.MyRequestFormType) => {\r\n let submittedTypeID = projectSubmittedTypeID\r\n if (manageProjectStore && manageProjectStore?.projectData) {\r\n if (manageProjectStore.projectData.submitTypeInfo && manageProjectStore.projectData.submitTypeInfo?.value) {\r\n submittedTypeID = manageProjectStore.projectData.submitTypeInfo?.value\r\n }\r\n }\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = {\r\n projectID: manageProjectStore?.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore?.projectData?.submittedID ?? null,\r\n irb: value.IRB ? parseInt(value.IRB.value) : null, //parseInt(value?.faculty?.irb) || null\r\n userID: profile.userId as number,\r\n projectName_th: value?.projectNameTH || null,\r\n projectName_en: value?.projectNameEN || null,\r\n // projectSubmitTypeID: value?.isPhase ? parseInt(value.isPhase) : null, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n projectSubmitTypeID: submittedTypeID, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n\r\n facultyID: value.faculty ? parseInt(value.faculty.value) : null,\r\n requestPhase: value.numPhase ? value.numPhase : null,\r\n isTools: value.isPhase === '2' ? (value.isTools === '2' ? true : false) : null,\r\n researcherTypeID: value.researcherType ? parseInt(value.researcherType.value) : null,\r\n titleNameID: value.titleName ? parseInt(value.titleName) : null,\r\n // titleNameOther: value.otherTitleName ? value.otherTitleName : null,\r\n titleNameOther_th: value.otherTitleNameTH ? value.otherTitleNameTH : null,\r\n titleNameOther_en: value.otherTitleNameEN ? value.otherTitleNameEN : null,\r\n academicPositionID: value.academicPosition ? parseInt(value.academicPosition) : null,\r\n // academicPositionOther: value.otherAcademicPosition ? value.otherAcademicPosition : null,\r\n academicPositionOther_th: value.otherAcademicPositionTH ? value.otherAcademicPositionTH : null,\r\n academicPositionOther_en: value.otherAcademicPositionEN ? value.otherAcademicPositionEN : null,\r\n educationLevelID: value.educationLevel ? parseInt(value.educationLevel.value) : null,\r\n researcherName_th: value.nameTH ? value.nameTH : null,\r\n researcherName_en: value.nameEN ? value.nameEN : null,\r\n email: value.email ? value.email : null,\r\n homePhone: value.homePhone ? value.homePhone : null,\r\n mobilePhone: value.mobilePhone ? value.mobilePhone : null,\r\n fax: value.fax ? value.fax : null,\r\n isDraft: value?.submitType === 'save' ? false : true,\r\n documentInfo: getDocumentInfo(value),\r\n isLanguage_th: value.langTH ? value.langTH : false,\r\n isLanguage_en: value.langEN ? value.langEN : false,\r\n isRequestCertificatePaper: value.isCertificatePaperList === '1' ? true : false,\r\n isDr: value.isDr ? value.isDr : false,\r\n }\r\n\r\n return parameterForSave\r\n }\r\n const handleClickSubmit = (value: TerminateProjectType.MyRequestFormType) => {\r\n submitValueRef.current = value\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(value)\r\n parameterForSaveRef.current = parameterForSave\r\n switch (value.submitType) {\r\n case 'save':\r\n // code block\r\n isDraftRef.current = false\r\n handleSave()\r\n\r\n break\r\n\r\n case 'draft':\r\n // code block\r\n isDraftRef.current = true\r\n handleSaveDraft()\r\n\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n const checkRequirePDF = (documentInfo: MyFileDataType[]) => {\r\n let isRequirePDF = false\r\n\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if (documentInfo[i]?.fileTokenInfo[j].fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n\r\n const checkSubtopic = (documentInfo: MyFileDataType[]) => {\r\n let isEmptyPage = false\r\n\r\n //หาว่าหัวข้ออัปโหลดเอกสารมีให้อัปโหลดหัวข้อย่อยมั้ย\r\n const docTopic = manageProjectStore.documentTopic?.filter((item) => item.subtopic.length > 0)\r\n\r\n //ถ้ามีให้เข้าไปเช็คตามเงื่อนไข if\r\n if (docTopic?.length) {\r\n // วน loop หัวข้อที่มีให้อัปโหลดเอกสารหัวข้อย่อย\r\n docTopic.forEach((mainTopic) => {\r\n // วน loop หัวข้อที่มีการอัปโหลดเอกสารเข้ามา\r\n documentInfo.forEach((itm) => {\r\n // เช็คว่าเอกสารที่มีการอัปโหลดเข้ามาใช่เอกสารที่มีหัวข้อย่อยให้อัปโหลดหรือป่าว\r\n if (mainTopic.id === itm.documentTopicID) {\r\n // เช็คว่าหัวข้อย่อยที่อัพโหลดเข้ามาครบมั้ย\r\n if (itm.subtopic?.length != mainTopic.subtopic.length) {\r\n isEmptyPage = true\r\n } else {\r\n // เช็คว่าที่อัปมาครบมีช่องไหนกรอกเป็น ช่องว่างมั้ย\r\n const chkEmpty = itm.subtopic.find(\r\n (e) => e.page == null || e.page == '' || e.page == undefined,\r\n )\r\n if (chkEmpty) {\r\n isEmptyPage = true\r\n }\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n return isEmptyPage\r\n }\r\n const validateRequiredUploadFile = (uploadFile: Array<{ uploadFileObj: any }>, skipValidate: boolean = false) => {\r\n let isValid = true\r\n if (!skipValidate) {\r\n uploadFile?.every(({ uploadFileObj: file }) => {\r\n if (file?.isRequired && file?.fileList?.length === 0) {\r\n //เป็นหัวข้อที่มีการ required แต่ว่าไม่ upload เอกสาร\r\n isValid = false\r\n return false //break\r\n }\r\n return true //continue\r\n })\r\n\r\n if (!isValid) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get2Element('ALERT.CONTENT.PLEASE_UPLOAD_REQUIRED_TOPIC', [\r\n '',\r\n ]) as any,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n return isValid\r\n }\r\n const handleSave = async () => {\r\n if (validateRequiredUploadFile(submitValueRef.current.uploadFile)) {\r\n if (parameterForSaveRef.current?.documentInfo?.length === 0) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n const isRequirePDF = checkRequirePDF(parameterForSaveRef.current?.documentInfo)\r\n const isEmptyPage = checkSubtopic(parameterForSaveRef.current?.documentInfo)\r\n if (isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else if (isEmptyPage) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.PLEASE_COMPLETE_PAGE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: handleClickConfirmSave,\r\n })\r\n }\r\n }\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const handleSaveDraft = async () => {\r\n handleClickConfirmSave()\r\n }\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const handleClickConfirmSave = async () => {\r\n loadingOpen()\r\n // let res\r\n // if (isApproveWithComment) {\r\n // const parameterEditAfterReview = _.pick(parameterForSaveRef.current, [\r\n // 'documentInfo',\r\n // 'isDraft',\r\n // 'projectID',\r\n // 'submittedID',\r\n // ])\r\n // res = await callWebService.projectApproveWithComment(parameterEditAfterReview)\r\n // } else {\r\n //Flow ยื่นโครงการใหม่ + Flow แก้ไขหลังพิจารณา\r\n const res = await callWebService.terminateProject(parameterForSaveRef.current)\r\n // }\r\n loadingClose()\r\n\r\n setConfigDialog({}) //clear function dialog\r\n dialogTwoRef.current?.closeDialog()\r\n if (formMode === 'EDIT') {\r\n if (onSaveComplete) onSaveComplete(res?.status, parameterForSaveRef.current?.isDraft as boolean)\r\n } else if (formMode === 'CREATE') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: handleAfterCloseCreateSuccess,\r\n })\r\n appFolderAndTabAction.resetTabDirty()\r\n dialogTwoRef.current?.openDialog()\r\n projectIDRef.current = res.result?.projectInfo?.projectID\r\n submittedIDRef.current = res.result?.projectInfo?.submittedID\r\n irbRef.current = res.result?.projectInfo?.irb\r\n }\r\n }\r\n\r\n const handleAfterCloseCreateSuccess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n //เล่นใน mode create save เสร็จจะต้องไปเข้าหน้า Edit/View\r\n const encryptedProjectID = encryptionAES(`${projectIDRef.current}`)\r\n const encryptedSubmittedID = encryptionAES(`${submittedIDRef.current}`)\r\n const path = generatePath(RoutePath.manageProjectEdit, {\r\n projectID: encryptedProjectID,\r\n submittedID: encryptedSubmittedID,\r\n })\r\n history.push({\r\n pathname: path, // editMode\r\n })\r\n }\r\n\r\n const handleChangeFaculty = (irb?: string) => {\r\n if (irb) {\r\n const submittedTypeID =\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration\r\n getDocumentTopicLut(parseInt(irb), submittedTypeID)\r\n }\r\n }\r\n\r\n const handleChangeResearcherType = (val?: string) => {\r\n if (val) {\r\n filterTopicUpload(val)\r\n researcherTypeRef.current = val\r\n }\r\n }\r\n\r\n const filterTopicUpload = (val: string) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n if (documentTopic && documentTopicRef.current) {\r\n let isDocTopic = documentTopicRef.current\r\n if (val === '1') {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submittType: number) => {\r\n let submittedTypeID = projectSubmittedTypeID ? projectSubmittedTypeID : submittType\r\n\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submittedTypeID)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n\r\n if (researcherTypeRef.current) {\r\n filterTopicUpload(researcherTypeRef.current)\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n let documentInfo = manageProjectStore.projectData?.documentInfo\r\n let latestDocument = manageProjectStore.projectData?.latestDocument\r\n // const uploadFileinit: Array = documentTopicList?.map((itm: any, idx: number) => {\r\n let uploadFileInit = documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n let fileList = docInfo?.fileInfo?.map((file: any) => ({\r\n documentTopicID: docInfo.topicID,\r\n fileToken: file.fileToken, //fileToken\r\n filename: file.filename,\r\n fileID: file.fileID, //fileToken\r\n path: file.path,\r\n replaceFileID: file.replaceFileID,\r\n }))\r\n itm.uploadFileObj.fileList = fileList\r\n const subtopic = docInfo.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docInfo.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n itm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n })\r\n })\r\n\r\n //Section Replace File\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileInit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileID, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFileBy.replaceFileID,\r\n } as any,\r\n ]\r\n\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n // //**** Initial File Edit ****//\r\n // if (latestDocument && latestDocument.length > 0) {\r\n // uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n // latestDocument?.forEach((latestDocInfo: any) => {\r\n // let latestFile = []\r\n // let previousFile = []\r\n // if (latestDocInfo?.fileInfo[0]) {\r\n // latestFile = latestDocInfo.fileInfo[0].latestFileList.filter((itm: any) => itm.no === null)\r\n // previousFile =\r\n // latestDocInfo.fileInfo[0].latestFileList[\r\n // latestDocInfo.fileInfo[0].latestFileList.length - 2\r\n // ]\r\n // }\r\n // if (latestFile.length > 0) {\r\n // if (latestDocInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n // let fileList = [\r\n // {\r\n // documentTopicID: latestDocInfo.topicID,\r\n // fileToken: latestFile[0].fileToken, //fileToken\r\n // filename: latestFile[0].filename,\r\n // fileID: latestFile[0].fileToken, //fileToken\r\n // path: latestFile[0].path,\r\n // replaceFileID: previousFile?.fileID,\r\n // },\r\n // ]\r\n // itm.uploadFileObj.fileList = fileList\r\n // itm.uploadFileObj.subTopicPageList = []\r\n // }\r\n // }\r\n // })\r\n // })\r\n // }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const handleClickClose = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n const handleDirtyChange = (props: any) => {\r\n const paramsDirty = {\r\n tabDirty: isViewMode ? false : props.dirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n isDraftRef.current = true\r\n\r\n if (valuesForm) {\r\n const values = { ...valuesForm.current } as TerminateProjectType.MyRequestFormType\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(values)\r\n parameterForSaveRef.current = parameterForSave\r\n newTabSelectedRef.current = newTabSelected\r\n tabSelectedIndexRef.current = tabIndex\r\n handleSaveDraft()\r\n }\r\n }\r\n\r\n const checkUseUploadEdit = () => {\r\n let isUseUploadEdit = false\r\n\r\n switch (manageProjectStore.projectData?.submitTypeInfo?.value) {\r\n case constSubmittedType.editAfterReview_terminateProject:\r\n isUseUploadEdit = true\r\n break\r\n default:\r\n isUseUploadEdit = false\r\n }\r\n\r\n return isUseUploadEdit\r\n }\r\n\r\n const handleDeleteProject = () => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_DELETE'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: async () => {\r\n if (manageProjectStore?.projectData?.projectID) {\r\n const res = await callWebService.deleteProject(manageProjectStore?.projectData?.projectID)\r\n setConfigDialog({}) //clear function dialog\r\n history.push('/manage-project')\r\n }\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const chkDisplayBTNDeleteProject: boolean =\r\n (initialData?.projectSubmitType &&\r\n checkPermission.chkDisplayBTNDeleteProject(parseInt(initialData?.projectSubmitType.value)) &&\r\n initialData?.isDraft &&\r\n manageProjectStore.projectData?.verifyDocument == null) ||\r\n false\r\n return {\r\n isDraftData: chkDisplayBTNDeleteProject,\r\n initialUploadFile,\r\n configDialog,\r\n onRefDialogTwo,\r\n selectedIrb,\r\n configLoading,\r\n valuesForm,\r\n projectData: manageProjectStore.projectData,\r\n handleDirtyChange,\r\n onClickSubmit: handleClickSubmit,\r\n onClickCancel: handleClickCancel,\r\n onClickClose: handleClickClose,\r\n onClickDeleteProject: handleDeleteProject,\r\n handleChangeFaculty: handleChangeFaculty,\r\n onChangeResearcherType: handleChangeResearcherType,\r\n checkUseUploadEdit,\r\n }\r\n}\r\n\r\nexport default useRequestForm\r\n","import React from 'react'\r\nimport * as terminateProjectOtherType from './terminateProjectType'\r\nimport useTerminateProject from './useTerminateProject'\r\n\r\n// --- MaterialUI --- //\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\n\r\n// --- FinalForm --- //\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n// --- Control --- //\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\n\r\n// --- Share UI --- //\r\nimport EthicsForm from '../../../../shareUI/ethicsForm/ethicsForm'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport RemarkFromAdmin from '../../../../shareUI/remarkFromAdmin/remarkFromAdmin'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useSnackbarAction from '../../../../../../stores/snackbar/snackbarAction'\r\n\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\n\r\ntype ErrorsType = {\r\n langTH?: string\r\n langEN?: string\r\n}\r\n\r\n//View\r\nconst RequestFormView = (props: terminateProjectOtherType.RequestFormView) => {\r\n const {\r\n onClickSubmit,\r\n onClickCancel,\r\n // onClickClose,\r\n onRefDialogTwo,\r\n configDialog,\r\n handleChangeFaculty,\r\n selectedIrb,\r\n // configLoading,\r\n // isEditAfterReview = false,\r\n // --- props from outer --- //\r\n btnClose,\r\n initialData = {},\r\n isViewMode = false,\r\n initialUploadFile = [],\r\n projectData,\r\n handleDirtyChange,\r\n onChangeResearcherType,\r\n valuesForm,\r\n formValueRef,\r\n checkUseUploadEdit,\r\n isDraftData,\r\n onClickDeleteProject,\r\n } = props\r\n //* STORE *//\r\n const manageProjectStore = useManageProjectStore()\r\n const snackbarAction = useSnackbarAction()\r\n\r\n const { documentTopic } = manageProjectStore\r\n\r\n const translate = useTranslate()\r\n const uploadFileinit = documentTopic?.map(() => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n },\r\n }\r\n })\r\n\r\n const isNotCompleteDocument = projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument\r\n const isDisableDoc = isViewMode && (!isNotCompleteDocument || !checkUseUploadEdit())\r\n\r\n // let isDisableIRB = false\r\n // if (isApproveWithComment) {\r\n // isDisableIRB = true //Flow approveWithComment ให้ Disable IRB\r\n // }\r\n\r\n // let isUploadEditMode = false\r\n // // if (isApproveWithComment || isNotCompleteDocument || isEditAfterReview) {\r\n // if (isApproveWithComment || isEditAfterReview) {\r\n // isUploadEditMode = true\r\n // }\r\n return (\r\n 0 ? initialUploadFile : uploadFileinit,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n validate={(values) => {\r\n const errors: ErrorsType = {}\r\n if (!values.langTH && !values.langEN) {\r\n errors.langTH = translate.get('MESSAGE.M016')\r\n\r\n errors.langEN = translate.get('MESSAGE.M016')\r\n }\r\n\r\n return errors\r\n }}\r\n >\r\n {({ handleSubmit, form, dirty, invalid, errors, values }) => {\r\n valuesForm.current = values\r\n if (formValueRef) formValueRef.current = values\r\n return (\r\n \r\n \r\n {isNotCompleteDocument && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {!btnClose && (\r\n \r\n {\r\n onClickDeleteProject()\r\n }\r\n : undefined\r\n }\r\n onClickClose={() => {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst RequestFormCtrl = (props: terminateProjectOtherType.RequestFormType) => {\r\n const requestFormModel = useTerminateProject(props)\r\n return \r\n}\r\nexport default RequestFormCtrl\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n gridBtn: {\r\n marginTop: '2%',\r\n },\r\n}))\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as memoMessageType from './resultOfConsiderType'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\nimport { SynthesisReviewResultType } from '../../../../../../services/web/types/responseWebServiceTypes'\r\n\r\nconst useMemomessageTerminate = (props: memoMessageType.UseMemoMessageType) => {\r\n const { onSaveComplete } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const callLookup = useLookupService()\r\n const [terminateCauseList, setTerminateCause] = React.useState<{ id: number; name_th: string; name_en: string }[]>(\r\n [],\r\n )\r\n const [isCheckedOther, setIsCheckedOther] = React.useState(false)\r\n const [initialCommentCommitee, setInitialCommentCommitee] = React.useState()\r\n const [initialMemoMessagePaper, setInitialMemoMessagePaper] = React.useState<{\r\n TH: InitialRichTextEditorType\r\n EN: InitialRichTextEditorType\r\n }>()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n\r\n // }, [JSON.stringify(projectData)])\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getLutTerminateProjectCause()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getLutTerminateProjectCause = async () => {\r\n const res = await callLookup.getTerminateCause(1, 8)\r\n setTerminateCause(res.result)\r\n }\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const getSynthesisReviewData = async (submittedID: number) => {\r\n if (submittedID) {\r\n const { result } = await callWebService.getSynthesisReview(submittedID)\r\n return result\r\n }\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n if (submittedID) {\r\n const res = await callWebService.getProjectTerminateMemoMessage(submittedID)\r\n const result = res.result\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n terminateCause: {\r\n childSelected: [],\r\n parentSelected: result.causeInfo,\r\n },\r\n terminateCauseOther: result.causeRemark,\r\n approveStatus:\r\n result && result?.approveStatusInfo\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result.approveStatusInfo.nameTH\r\n : result.approveStatusInfo.nameEN,\r\n value: result?.approveStatusInfo.value.toString(),\r\n }\r\n : null,\r\n }\r\n\r\n const resultSynthesisReview = await getSynthesisReviewData(submittedID)\r\n const initialCommentCommittee = createInitialSuggestion(resultSynthesisReview)\r\n\r\n const initialMemoMessagePaper = {\r\n TH: {\r\n contentHtml: result?.memoMessagePaper_th_html,\r\n contentText: result?.memoMessagePaper_th,\r\n },\r\n EN: {\r\n contentHtml: result?.memoMessagePaper_en_html,\r\n contentText: result?.memoMessagePaper_en,\r\n },\r\n }\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n setInitialCommentCommitee(initialCommentCommittee)\r\n setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n /**\r\n * createInitial\r\n */\r\n const createInitialSuggestion = (content?: SynthesisReviewResultType) => {\r\n const initialSugestionNotice = {\r\n contentHtml: content?.synthesisReviewRemarkInfo.synthesisReviewRemark_html ?? '',\r\n contentText: content?.synthesisReviewRemarkInfo.synthesisReviewRemark ?? '',\r\n }\r\n\r\n return initialSugestionNotice\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.signPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.signPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n /**\r\n * process click button\r\n */\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n\r\n return {\r\n formRef,\r\n configDialog,\r\n isViewMode: isViewMode,\r\n initialValues,\r\n initialCommentCommitee,\r\n initialMemoMessagePaper,\r\n initialMemorandumFile,\r\n terminateCauseList,\r\n required,\r\n isCheckedOther,\r\n onRefDialog,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickOpenFile: handleClickOpenFile,\r\n }\r\n}\r\n\r\nexport default useMemomessageTerminate\r\n","import * as memoMessageType from './resultOfConsiderType'\r\nimport useMemomessageTerminate from './useResultOfConsider'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport TreeCheckbox from '../../../../../../control/treeCheckboxNew/treeCheckbox'\r\nimport MyTextfield from '../../../../../../control/textfield/textfield'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\n// import UploadDocCtrl from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\n// import * as Constants from '../../../../../../constants/constants'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../../constants/approveStatus'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n projectData,\r\n isViewMode,\r\n initialValues,\r\n\r\n configDialog,\r\n terminateCauseList,\r\n onRefDialog,\r\n isCheckedOther,\r\n onClickBackToSearch,\r\n // onClickOpenFile,\r\n initialCommentCommitee,\r\n // initialMemoMessagePaper,\r\n initialMemorandumFile,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSignMemoMessage: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n // //มีการออกใบบันทึกข้อความไปแล้ว\r\n // const isMemoMessage: boolean = projectData?.stepID === constSubmittedStep.sign\r\n\r\n const isApproveWithComment =\r\n initialValues?.approveStatus?.value === approveStatusREC1.approveWithComment.toString() ||\r\n initialValues?.approveStatus?.value === approveStatusREC2.approveWithComment.toString()\r\n\r\n const isApprove =\r\n initialValues?.approveStatus?.value === approveStatusREC1.approve.toString() ||\r\n initialValues?.approveStatus?.value === approveStatusREC2.approve.toString()\r\n\r\n return (\r\n {}}\r\n initialValues={{ ...initialValues, memorandumFile: initialMemorandumFile }}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n >\r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {/* {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? initialValues?.approveStatus?.label\r\n : initialValues?.approveStatus?.label} */}\r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {isApproveWithComment\r\n ? translate.get('LABEL.APPROVE')\r\n : initialValues?.approveStatus?.label}\r\n \r\n \r\n \r\n {/* {isMemoMessage && (\r\n \r\n \r\n \r\n \r\n {}}\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )} */}\r\n {!isApprove && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {isSignMemoMessage && (\r\n \r\n \r\n \r\n )}\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n {/* */}\r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as resultOfConsiderPreviousType from './resultOfConsiderPreviousType'\r\nimport _ from 'lodash'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\nimport {\r\n ResultCertificateCloseProjectResponse,\r\n SynthesisReviewResultType,\r\n} from '../../../../../../services/web/types/responseWebServiceTypes'\r\n\r\nconst useResultOfConsiderPrevious = (props: resultOfConsiderPreviousType.UseResultOfConsiderPreviousType) => {\r\n const { submittedID } = props\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const translate = useTranslate()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const callLookup = useLookupService()\r\n\r\n const [initialSuggestionNotice, setInitialSuggestionNotice] = React.useState()\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n const getMemoMessage = async () => {\r\n if (submittedID) {\r\n const { result } = await callWebService.getCertificateCloseProject(submittedID)\r\n return result\r\n }\r\n }\r\n\r\n const getSynthesisReviewData = async () => {\r\n if (submittedID) {\r\n const { result } = await callWebService.getSynthesisReview(submittedID)\r\n return result\r\n }\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n /**\r\n * Default value form\r\n */\r\n const createInitialData = async () => {\r\n const result = await getMemoMessage()\r\n const resultSynthesisReview = await getSynthesisReviewData()\r\n if (result) {\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n approveStatus:\r\n result && result?.approveStatusInfo\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result.approveStatusInfo.nameTH\r\n : result.approveStatusInfo.nameEN,\r\n value: result?.approveStatusInfo.value.toString(),\r\n }\r\n : null,\r\n }\r\n\r\n /******* SuggestionNotice ********/\r\n const initialSugestionNotice = createInitialSuggestion(resultSynthesisReview)\r\n\r\n /******set state *******/\r\n setInitialValues(initialData)\r\n setInitialSuggestionNotice(initialSugestionNotice)\r\n }\r\n }\r\n\r\n /**\r\n * SuggestionNotice\r\n */\r\n\r\n const createInitialSuggestion = (content?: SynthesisReviewResultType) => {\r\n const initialSugestionNotice = {\r\n contentHtml: content?.synthesisReviewRemarkInfo.synthesisReviewRemark_html ?? '',\r\n contentText: content?.synthesisReviewRemarkInfo.synthesisReviewRemark ?? '',\r\n }\r\n return initialSugestionNotice\r\n }\r\n\r\n return {\r\n formRef,\r\n configDialog,\r\n isViewMode: isViewMode,\r\n initialValues,\r\n initialSuggestionNotice,\r\n required,\r\n onRefDialog,\r\n }\r\n}\r\n\r\nexport default useResultOfConsiderPrevious\r\n","import * as resultOfConsiderPreviousType from './resultOfConsiderPreviousType'\r\nimport useResultOfConsiderPrevious from './useResultOfConsiderPrevious'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\n// import useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../../constants/approveStatus'\r\n\r\n//View\r\nconst ResultOfConsiderPreviousView = (props: resultOfConsiderPreviousType.ResultOfConsiderPreviousViewType) => {\r\n const { formRef, isViewMode, initialValues, /*projectData,*/ configDialog, onRefDialog, initialSuggestionNotice } =\r\n props\r\n\r\n const translate = useTranslate()\r\n // const checkPermission = useCheckPermission()\r\n\r\n const isApproveWithComment =\r\n initialValues?.approveStatus?.value === approveStatusREC1.approveWithComment.toString() ||\r\n initialValues?.approveStatus?.value === approveStatusREC2.approveWithComment.toString()\r\n\r\n const isApprove =\r\n initialValues?.approveStatus?.value === approveStatusREC1.approve.toString() ||\r\n initialValues?.approveStatus?.value === approveStatusREC2.approve.toString()\r\n\r\n return (\r\n {}}\r\n initialValues={{ ...initialValues }}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n >\r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {/* {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? initialValues?.approveStatus?.label\r\n : initialValues?.approveStatus?.label} */}\r\n {isApproveWithComment\r\n ? translate.get('LABEL.APPROVE')\r\n : initialValues?.approveStatus?.label}\r\n \r\n \r\n \r\n\r\n {!isApprove && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst ResultOfConsiderPrevious = (props: resultOfConsiderPreviousType.ResultOfConsiderPreviousType) => {\r\n const useMemomessageTerminateModel = useResultOfConsiderPrevious(props)\r\n return \r\n}\r\nexport default ResultOfConsiderPrevious\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport TerminateProjectRequestForm from '../../../page/requestNewProject/terminateProject/terminateProject'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/terminateProject/resultOfConsider'\r\nimport NoticeAdditionalDocument from '../../../page/noticeAdditionalDocument/noticeAdditionalDocument'\r\nimport CertificateStampDocument from '../../../page/certificateStampDocument/certificateStampDocument'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/terminateProject/resultOfConsiderPrevious'\r\nimport { menuTab } from '../../../../../../constants/constants'\r\n\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return (\r\n //
PROJECT RENEWAL
\r\n \r\n )\r\n case menuTab.tab22.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab24.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\nimport { ResultDocumentTopicLut } from '../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport * as Utils from '../../../../../utilities/date'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\n\r\nimport * as VerifyDocumentType from './verifyDocumentType'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../constants/approveStatus'\r\nimport useVerifyDocumentProjectDetail from '../../../shareLogic/useVerifyDocumentProjectDetail'\r\nimport useIRB from '../../../../../services/um/lookups/useIRB'\r\nimport { validateModeAccordionError } from '../../../../../utilities/validate'\r\ntype OptType = {\r\n label: string\r\n value: string\r\n}\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\n\r\nconst useVerifyDocument = (props: VerifyDocumentType.VerifyDocumentType) => {\r\n const { projectData, onSaveComplete } = props\r\n\r\n const history = useHistory()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const [isCompletely, setIsCompletely] = React.useState(true)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n const documentTopicRef = React.useRef()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const reviewerLutRef = React.useRef()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const { createInitialProjectDetail, updateProjectDetailFormatting } = useVerifyDocumentProjectDetail()\r\n const { getIRB } = useIRB()\r\n const formHistoryRef = React.useRef>({})\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n setIsCompletely(projectData?.verifyDocument ?? true)\r\n getReviewer(projectData.irb)\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.irb && projectData?.submitTypeInfo?.value) {\r\n getDocumentTopicLut(projectData?.irb, projectData?.submitTypeInfo.value)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const filterTopicUpload = (documentTopic: ResultDocumentTopicLut[]) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n const researcherTypeID = manageProjectStore?.projectData?.researcherTypeInfo.value\r\n\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n Constants.topicForLecturer.forEach((element) => {\r\n docTopic = documentTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n Constants.topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submitType: number) => {\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitType)\r\n if (res.status === 1) {\r\n loadingHook.loadingClose()\r\n manageProjectAction.setDocumentTopic(res.result)\r\n filterTopicUpload(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n loadingHook.loadingClose()\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n const documentInfo = projectData?.documentInfo\r\n // ------------------------------------------------------------- //\r\n let uploadFileInit = manageProjectStore.documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: VerifyDocumentType.uploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList = docInfo.fileInfo\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic\r\n }\r\n })\r\n })\r\n\r\n let latestDocument = manageProjectStore.projectData?.latestDocument\r\n //Section Replace File\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileInit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileToken, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFile.fileID,\r\n } as any,\r\n ]\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const getReviewer = async (irb: number) => {\r\n if (irb) {\r\n const res = await callLookup.callReviewerLut(irb)\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: itm.name_th,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n reviewerLutRef.current = formatedData\r\n }\r\n }\r\n\r\n const handleChangeDocCompletely = (val: string) => {\r\n const isCompletely = val === '1' ? true : false\r\n setIsCompletely(isCompletely)\r\n }\r\n\r\n const createInitialData = async () => {\r\n loadingHook.loadingOpen()\r\n const defaultCompletely = projectData?.verifyDocument ?? '1'\r\n const lutIrb = await getIRB()\r\n const projectDetail = createInitialProjectDetail(projectData, lutIrb)\r\n const initialData = {\r\n isCompletelyDoc: defaultCompletely === '1' ? defaultCompletely : projectData?.verifyDocument ? '1' : '2',\r\n resubmitDocDate: projectData?.resubmitDocDate ? projectData?.resubmitDocDate : null,\r\n //@ts-ignore\r\n reviewer: projectData?.reviewerUserID\r\n ? {\r\n label: `${projectData?.reviewerName_th}`,\r\n value: `${projectData?.reviewerUserID}`,\r\n }\r\n : null,\r\n remark: projectData?.verifyDocumentRemark,\r\n ...projectDetail,\r\n }\r\n\r\n setInitialValues(initialData)\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const checkUseUploadEdit = () => {\r\n let isUseUploadEdit = false\r\n\r\n switch (projectData?.submitTypeInfo?.value) {\r\n case constSubmittedType.firstSubmitConsideration:\r\n isUseUploadEdit = false\r\n break\r\n case constSubmittedType.editAfterReview:\r\n isUseUploadEdit = true\r\n break\r\n case constSubmittedType.editAfterReview_nextPhaseProject:\r\n isUseUploadEdit = true\r\n break\r\n case constSubmittedType.exitAfterReview_AmendmentProject:\r\n isUseUploadEdit = true\r\n break\r\n case constSubmittedType.editAfterReview_terminateProject:\r\n isUseUploadEdit = true\r\n break\r\n default:\r\n isUseUploadEdit = false\r\n }\r\n if (projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument) {\r\n //เอกสารไม่ครบถ้วน\r\n isUseUploadEdit = true\r\n }\r\n if (\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC1.approveWithComment ||\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC2.approveWithComment\r\n ) {\r\n //Approve With Comment\r\n isUseUploadEdit = true\r\n }\r\n\r\n return isUseUploadEdit\r\n }\r\n const handleDirtyChange = (props: { dirty: boolean }) => {\r\n let isDirty: boolean = false\r\n if (!isViewMode) {\r\n isDirty = props.dirty\r\n }\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n const isCompletelyDoc = value?.isCompletelyDoc === '1'\r\n let reviewerUserID = null\r\n if (value?.reviewer?.value) {\r\n reviewerUserID = parseInt(value.reviewer.value)\r\n }\r\n\r\n let sendEditData = null\r\n if (!isCompletelyDoc && value?.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(value.resubmitDocDate) ?? null\r\n }\r\n\r\n const verifyProjectServiceParam: REQServiceType.VerifyProjectRequestType = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n reviewerUserID: reviewerUserID,\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : value?.remark ? value.remark : null,\r\n isDraft: isDraft,\r\n }\r\n\r\n return verifyProjectServiceParam\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft: boolean = true\r\n const param = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.VerifyProjectRequestType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n try {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.verifyProjectTerminate(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useVerifyDocument.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleSubmitForm = async (value: any) => {\r\n if (projectData?.projectID && projectData?.submittedID) {\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param = getSaveServiceParameter(isDraft)\r\n\r\n if (value.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n }\r\n }\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const confirmEditDocResult = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n let isCompletelyDoc = formProps.values.isCompletelyDoc === '1'\r\n let sendEditData = null\r\n if (!isCompletelyDoc && formProps.values.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(formProps.values.resubmitDocDate) ?? null\r\n }\r\n const param = {\r\n ...getEditDocParams(formHistoryRef.current['docResult']),\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : formProps.values?.remark ? formProps.values.remark : null,\r\n }\r\n processSaveData(param)\r\n .then(() => {\r\n handleEditDocResult(formProps)\r\n handleEditDocReviewer(formProps)\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const confirmEditDocReviewer = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n let reviewerUserID = null\r\n if (formProps?.values?.reviewer?.value) {\r\n reviewerUserID = parseInt(formProps.values.reviewer.value)\r\n }\r\n const param = {\r\n ...getEditDocParams(formHistoryRef.current['docResult']),\r\n reviewerUserID: reviewerUserID,\r\n }\r\n const formatParam = {\r\n submittedID: Number(param.submittedID),\r\n loginUserID: Number(param.loginUserID),\r\n reviewerUserID: Number(reviewerUserID),\r\n }\r\n Promise.all([callWebService.updateProjectReviewer(formatParam)])\r\n .then(() => {\r\n handleEditDocResult(formProps)\r\n handleEditDocReviewer(formProps)\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const handleEditDocResult = (formProps: FormRenderProps) => {\r\n formHistoryRef.current['docResult'] = formProps.values\r\n }\r\n\r\n const handleEditDocReviewer = (formProps: FormRenderProps) => {\r\n formHistoryRef.current['docReviewer'] = formProps.values\r\n }\r\n\r\n const getEditDocParams = (formValues: any) => {\r\n const isCompletelyDoc = formValues?.isCompletelyDoc === '1'\r\n let reviewerUserID = null\r\n if (formValues?.reviewer?.value) {\r\n reviewerUserID = parseInt(formValues.reviewer.value)\r\n }\r\n\r\n let sendEditData = null\r\n if (!isCompletelyDoc && formValues?.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(formValues.resubmitDocDate) ?? null\r\n }\r\n\r\n const verifyProjectServiceParam: REQServiceType.VerifyProjectRequestType = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n reviewerUserID: reviewerUserID,\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : formValues?.remark ? formValues.remark : null,\r\n isDraft: false,\r\n }\r\n\r\n return verifyProjectServiceParam\r\n }\r\n\r\n const confirmEditEthics = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n loadingHook.loadingOpen()\r\n const rawData = formRef.current?.values\r\n const formattingParam = updateProjectDetailFormatting(rawData, projectData)\r\n callWebService\r\n .updateProjectDetail(formattingParam)\r\n .then(async () => {\r\n if (projectData) {\r\n await tabAndFolderHook.reloadProjectData(projectData.projectID, projectData.submittedID)\r\n await createInitialData()\r\n }\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n .finally(() => {\r\n loadingHook.loadingClose()\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n return {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n isCompletely,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialUploadFile: initialUploadFile,\r\n onRefDialog,\r\n onSubmitForm: handleSubmitForm,\r\n onChangeDocCompletely: handleChangeDocCompletely,\r\n checkUseUploadEdit: checkUseUploadEdit,\r\n onDirtyChange: handleDirtyChange,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n projectDetailLabel: translate.get('LABEL.PROJECT_DETAIL'),\r\n confirmEditDocResult,\r\n confirmEditDocReviewer,\r\n handleEditDocResult,\r\n handleEditDocReviewer,\r\n confirmEditEthics,\r\n }\r\n}\r\n\r\nexport default useVerifyDocument\r\n","import ResearchDetail from '../../../shareUI/ResearchDetail/researchDetail'\r\nimport DocumentTestResult from '../../../shareUI/documentTestResult/documentTestResult'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport DesignateReviewer from '../../../shareUI/designateReviewer/designateReviewer'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport { VerifyDocumentViewType, VerifyDocumentType } from './verifyDocumentType'\r\nimport useVerifyDocument from './useVerifyDocument'\r\nimport React from 'react'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport { Grid, useTheme, makeStyles } from '@material-ui/core'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport EthicsForm from '../../../shareUI/ethicsForm/ethicsForm'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport { ethicsFormResetList } from '../../../shareUI/ethicsForm/formResetList'\r\n\r\nconst VerifyDocumentView = (props: VerifyDocumentViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n projectData,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialUploadFile,\r\n isNotDisableTestResult = false,\r\n projectDetailLabel,\r\n onRefDialog,\r\n checkUseUploadEdit,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n onChangeDocCompletely,\r\n confirmEditDocResult,\r\n handleEditDocResult,\r\n confirmEditEthics,\r\n } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const { documentTopic } = manageProjectStore\r\n const checkPermission = useCheckPermission()\r\n const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n const isDisabledTestResult = isNotDisableTestResult || canOfficerEdit ? false : true\r\n const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n return (\r\n \r\n \r\n \r\n {checkPermission.isUserAdmin() ? (\r\n (\r\n \r\n )}\r\n renderViewComponent={() => (\r\n \r\n )}\r\n fieldNames={ethicsFormResetList}\r\n isViewMode={true}\r\n onConfirm={() => confirmEditEthics(props, ethicsFormResetList)}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n await confirmEditDocResult(props, [\r\n 'isCompletelyDoc',\r\n 'resubmitDocDate',\r\n 'remark',\r\n ])\r\n }}\r\n onClickModeEdit={() => handleEditDocResult(props)}\r\n />\r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {(isNotDisableTestResult || !isViewMode) && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }\r\n : undefined\r\n }\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst VerifyDocument = (props: VerifyDocumentType) => {\r\n const verifyDocumentModel = useVerifyDocument(props)\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: 128,\r\n padding: 20,\r\n },\r\n titleFont: {\r\n color: '#BDBDBD',\r\n },\r\n contentFont: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default VerifyDocument\r\n","import ResearchDetail from '../../../shareUI/ResearchDetail/researchDetail'\r\nimport DocumentTestResult from '../../../shareUI/documentTestResult/documentTestResult'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport DesignateReviewer from '../../../shareUI/designateReviewer/designateReviewer'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport { Grid } from '@material-ui/core'\r\nimport { VerifyDocumentViewType, VerifyDocumentType } from './verifyDocumentType'\r\nimport useVerifyDocument from './useVerifyDocument'\r\nimport React from 'react'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport EthicsForm from '../../../shareUI/ethicsForm/ethicsForm'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport { ethicsFormResetList } from '../../../shareUI/ethicsForm/formResetList'\r\n\r\nconst VerifyDocumentView = (props: VerifyDocumentViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n projectData,\r\n isCompletely,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialUploadFile,\r\n isNotDisableTestResult = false,\r\n projectDetailLabel,\r\n onRefDialog,\r\n checkUseUploadEdit,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n onChangeDocCompletely,\r\n confirmEditDocResult,\r\n confirmEditDocReviewer,\r\n handleEditDocResult,\r\n handleEditDocReviewer,\r\n confirmEditEthics,\r\n } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const { documentTopic } = manageProjectStore\r\n\r\n const irb = projectData?.irb\r\n\r\n const checkPermission = useCheckPermission()\r\n const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n const isDisabledTestResult = isNotDisableTestResult || canOfficerEdit ? false : true\r\n const isDisableReviewer = checkPermission.checkDisabledProjectReviewer(projectData)\r\n const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n return (\r\n \r\n \r\n \r\n {!canOfficerSaveDraft && checkPermission.isUserAdmin() ? (\r\n (\r\n \r\n )}\r\n renderViewComponent={() => (\r\n \r\n )}\r\n fieldNames={ethicsFormResetList}\r\n isViewMode={true}\r\n onConfirm={() => confirmEditEthics(props, ethicsFormResetList)}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n await confirmEditDocResult(props, [\r\n 'isCompletelyDoc',\r\n 'resubmitDocDate',\r\n 'remark',\r\n ])\r\n }}\r\n onClickModeEdit={() => handleEditDocResult(props)}\r\n />\r\n \r\n {isCompletely && (\r\n \r\n {\r\n await confirmEditDocReviewer(props, ['reviewer'])\r\n }}\r\n onClickModeEdit={() => handleEditDocReviewer(props)}\r\n />\r\n \r\n )}\r\n\r\n {isShowUpdateDate && }\r\n\r\n {(isNotDisableTestResult || !isViewMode) && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }\r\n : undefined\r\n }\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst VerifyDocument = (props: VerifyDocumentType) => {\r\n const verifyDocumentModel = useVerifyDocument(props)\r\n return \r\n}\r\nexport default VerifyDocument\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport * as memoMessageType from './memoMessageType'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport { DataSourceType } from '../../../../../control/treeCheckboxNew/treeCheckbox'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport { dateForAPI } from '../../../../../utilities/date'\r\nimport { InitialRichTextEditorType } from '../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../constants/constants'\r\nimport { UploadFileObjCerType } from '../generateCertificate/generateCertificateType'\r\nimport useAppAlertMessageAction from '../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport constConsiderType from '../../../../../constants/considerType'\r\nimport { SynthesisReviewResultType } from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport { validateModeAccordionError } from '../../../../../utilities/validate'\r\n\r\nconst useMemomessageTerminate = (props: memoMessageType.UseMemoMessageType) => {\r\n const { onSaveComplete, projectModeEdit = false } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const editRef = React.useRef()\r\n const callLookup = useLookupService()\r\n const [terminateCauseList, setTerminateCause] = React.useState<{ id: number; name_th: string; name_en: string }[]>(\r\n [],\r\n )\r\n const [isCheckedOther, setIsCheckedOther] = React.useState(false)\r\n const [initialCommentCommitee, setInitialCommentCommitee] = React.useState()\r\n const [initialMemoMessagePaper, setInitialMemoMessagePaper] = React.useState<{\r\n TH: InitialRichTextEditorType\r\n EN: InitialRichTextEditorType\r\n }>()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n\r\n // }, [JSON.stringify(projectData)])\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getLutTerminateProjectCause()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getLutTerminateProjectCause = async () => {\r\n const res = await callLookup.getTerminateCause(1, 8)\r\n // const formatedData = res.result.map((itm: any) => {\r\n // return {\r\n // label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n // value: `${itm.id}`,\r\n // }\r\n // })\r\n setTerminateCause(res.result)\r\n }\r\n\r\n const getSynthesisReviewData = async (submittedID: number) => {\r\n if (submittedID) {\r\n const { result } = await callWebService.getSynthesisReview(submittedID)\r\n return result\r\n }\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n if (submittedID) {\r\n const res = await callWebService.getProjectTerminateMemoMessage(submittedID)\r\n const result = res.result\r\n\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n terminateCause: {\r\n childSelected: [],\r\n parentSelected: result.causeInfo,\r\n },\r\n terminateCauseOther: result.causeRemark,\r\n }\r\n\r\n let initialCommentCommittee\r\n if (projectModeEdit) {\r\n /******* SuggestionNotice edit********/\r\n if (manageProjectStore?.projectData?.aroundSubmittedIDInfo.previousSubmittedID) {\r\n const resultSynthesisReview = await getSynthesisReviewData(\r\n manageProjectStore?.projectData?.aroundSubmittedIDInfo.previousSubmittedID,\r\n )\r\n\r\n initialCommentCommittee = createInitialSuggestion(resultSynthesisReview)\r\n }\r\n } else {\r\n /******* SuggestionNotice ********/\r\n if (manageProjectStore?.projectData?.submittedID) {\r\n const resultSynthesisReview = await getSynthesisReviewData(\r\n manageProjectStore?.projectData?.submittedID,\r\n )\r\n initialCommentCommittee = createInitialSuggestion(resultSynthesisReview)\r\n }\r\n }\r\n\r\n // const initialCommentCommittee = {\r\n // contentHtml: result?.memoMessageComment_html,\r\n // contentText: result?.memoMessageComment,\r\n // }\r\n\r\n const initialMemoMessagePaper = {\r\n TH: {\r\n contentHtml: result?.memoMessagePaper_th_html,\r\n contentText: result?.memoMessagePaper_th,\r\n },\r\n EN: {\r\n contentHtml: result?.memoMessagePaper_en_html,\r\n contentText: result?.memoMessagePaper_en,\r\n },\r\n }\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n setInitialCommentCommitee(initialCommentCommittee)\r\n setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n /**\r\n * SuggestionNotice\r\n */\r\n\r\n const createInitialSuggestion = (content?: SynthesisReviewResultType) => {\r\n const initialSugestionNotice = {\r\n contentHtml: content?.synthesisReviewRemarkInfo.synthesisReviewRemark_html ?? '',\r\n contentText: content?.synthesisReviewRemarkInfo.synthesisReviewRemark ?? '',\r\n }\r\n\r\n return initialSugestionNotice\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.unSignPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.unSignPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n const listTerminateCauseID = value?.terminateCause.parentSelected.map(\r\n (terminateCause: { id: number; name_th: string; name_en: string }) => {\r\n return `${terminateCause.id}`\r\n },\r\n )\r\n let param: REQServiceType.ProjectTerminateMemomessageType = {\r\n submittedID: submittedID,\r\n comment: value?.commentCommittee?.contentText,\r\n comment_html: value?.commentCommittee?.contentHtml,\r\n memoMessagePaper_th: value?.memoMessagePaper_TH?.contentText,\r\n memoMessagePaper_en: value?.memoMessagePaper_EN?.contentText,\r\n memoMessagePaper_th_html: value?.memoMessagePaper_TH?.contentHtml,\r\n memoMessagePaper_en_html: value?.memoMessagePaper_EN?.contentHtml,\r\n memoMessageDate: value?.memoMessageDate ? dateForAPI(value?.memoMessageDate) ?? null : null,\r\n lstTerminateCauseID: listTerminateCauseID,\r\n terminateCauseOther: value?.terminateCauseOther,\r\n isDraft: isDraft,\r\n }\r\n\r\n return param\r\n }\r\n\r\n const handleChangProjectType = (val: memoMessageType.OptType) => {\r\n if (parseInt(val?.value) === 3) {\r\n setRequired(false)\r\n } else {\r\n setRequired(true)\r\n }\r\n }\r\n\r\n const handleDirtyChange = (props: any) => {\r\n let isDirty: boolean = false\r\n let newFormValue = _.omit(props.values, ['submitType'])\r\n let initValue = _.omit(\r\n {\r\n ...initialValues,\r\n memorandumFile: initialMemorandumFile,\r\n commentCommittee: {\r\n contentHtml: initialCommentCommitee?.contentHtml ?? '',\r\n contentText: initialCommentCommitee?.contentText ?? '',\r\n },\r\n memoMessagePaper_TH: {\r\n contentHtml: initialMemoMessagePaper?.TH.contentHtml ?? '',\r\n contentText: initialMemoMessagePaper?.TH.contentText ?? '',\r\n },\r\n memoMessagePaper_EN: {\r\n contentHtml: initialMemoMessagePaper?.EN.contentHtml ?? '',\r\n contentText: initialMemoMessagePaper?.EN.contentText ?? '',\r\n },\r\n },\r\n ['submitType'],\r\n )\r\n\r\n const isEqual = _.isEqual(initValue, newFormValue)\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n // if (isViewMode) {\r\n // isDirty = false\r\n // } else {\r\n // isDirty = props.dirty\r\n // }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft = true\r\n const param: REQServiceType.ProjectTerminateMemomessageType = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleSubmitForm = (value: any) => {\r\n // if (projectData?.projectID && projectData?.submittedID) {\r\n // let isReviewer = false\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param: REQServiceType.ProjectTerminateMemomessageType = getSaveServiceParameter(isDraft)\r\n if (isDraft) {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.ProjectTerminateMemomessageType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n try {\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.projectTerminateMemoMessage(param)\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useMemomessageTerminate.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleClickCheckbox = (selectedItem: DataSourceType) => {\r\n if (selectedItem.id === 4) {\r\n setIsCheckedOther(!isCheckedOther)\r\n }\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n\r\n const updateMemoMessage = async (param: REQServiceType.UpdateMemoMessageType) => {\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.updateMemoMessagePaper(param)\r\n\r\n if (res.result.status === 200) {\r\n dialogRef.current?.openDialog()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n setConfigDialog({})\r\n },\r\n })\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleSubmitUpdateMemo = (fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formRef.current)\r\n return new Promise(async (resolve, reject) => {\r\n if (isError) {\r\n formRef.current?.form?.submit()\r\n reject('')\r\n } else {\r\n resolve('')\r\n const param: REQServiceType.UpdateMemoMessageType = {\r\n submittedID: Number(projectData?.submittedID),\r\n memoMessagePaperTH: formRef.current?.values.memoMessagePaper_TH.contentText,\r\n memoMessagePaperEN: formRef.current?.values.memoMessagePaper_EN.contentText,\r\n memoMessagePaperTHHTML: formRef.current?.values.memoMessagePaper_TH.contentHtml,\r\n memoMessagePaperENHTML: formRef.current?.values.memoMessagePaper_EN.contentHtml,\r\n }\r\n\r\n updateMemoMessage(param)\r\n }\r\n })\r\n }\r\n\r\n const handleCancle = () => {\r\n const valueMessageTH: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_TH`].contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_TH`].contentText,\r\n }\r\n const valueMessageEN: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_EN`].contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_EN`].contentText,\r\n }\r\n setInitialMemoMessagePaper((prev) => ({\r\n TH: {\r\n ...prev?.TH,\r\n ...valueMessageTH,\r\n },\r\n EN: {\r\n ...prev?.EN,\r\n ...valueMessageEN,\r\n },\r\n }))\r\n }\r\n\r\n const onClickEdit = () => {\r\n editRef.current = formRef.current?.form.getState().values\r\n }\r\n return {\r\n formRef,\r\n required,\r\n configDialog,\r\n isViewMode: isViewMode,\r\n initialValues,\r\n initialCommentCommitee,\r\n initialMemoMessagePaper,\r\n initialMemorandumFile,\r\n terminateCauseList,\r\n isCheckedOther,\r\n isShowUpdateDate,\r\n onRefDialog,\r\n onChangProjectType: handleChangProjectType,\r\n onDirtyChange: handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCheckbox: handleClickCheckbox,\r\n onClickOpenFile: handleClickOpenFile,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n }\r\n}\r\n\r\nexport default useMemomessageTerminate\r\n","import * as memoMessageType from './memoMessageType'\r\nimport useMemomessageTerminate from './useMemomessageTerminate'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../constants/constants'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport MyDatePicker from '../../../../../control/datepicker/datepicker'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport { richEditorRequired } from '../../../../../utilities/validate'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialCommentCommitee,\r\n initialMemoMessagePaper,\r\n onRefDialog,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickOpenFile,\r\n onClickBackToSearch,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const latestFolderIdx = 0\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n const isEdit = isViewMode && currentSelectFolder\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n

\\n'\r\n ? [richEditorRequired(translate.get('MESSAGE.M015'))]\r\n : []\r\n }\r\n />\r\n
\r\n
\r\n )\r\n }\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_TH']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_TH'])}\r\n onCancel={handleCancle}\r\n onClickEdit={onClickEdit}\r\n />\r\n \r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_EN']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_EN'])}\r\n onCancel={handleCancle}\r\n onClickEdit={onClickEdit}\r\n />\r\n \r\n\r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import * as memoMessageType from './memoMessageType'\r\nimport useMemomessageTerminate from './useMemomessageTerminate'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../constants/constants'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport MyDatePicker from '../../../../../control/datepicker/datepicker'\r\n// import UploadDocCtrl from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport { richEditorRequired } from '../../../../../utilities/validate'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialCommentCommitee,\r\n initialMemoMessagePaper,\r\n onRefDialog,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickOpenFile,\r\n onClickBackToSearch,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const latestFolderIdx = 0\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n const isEdit = isViewMode && currentSelectFolder\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n

\\n'\r\n ? [richEditorRequired(translate.get('MESSAGE.M015'))]\r\n : []\r\n }\r\n />\r\n
\r\n
\r\n )\r\n }\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_TH']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_TH'])}\r\n onCancel={handleCancle}\r\n onClickEdit={onClickEdit}\r\n />\r\n \r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_EN']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_EN'])}\r\n onCancel={handleCancle}\r\n onClickEdit={onClickEdit}\r\n />\r\n \r\n\r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import React, { useRef } from 'react'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport authenStore from '../../../../../../stores/authen/authenStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport { OptType, TFormValue } from '../synthesisType'\r\nimport { SynthesisType } from './synthesis'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport { TabSelectedType } from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport _ from 'lodash'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport { GetSynthesisProjectByIDResultType } from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport useEditSynthesis from '../../../../shareLogic/useEditSynthesis'\r\nimport { validateModeAccordionError } from '../../../../../../utilities/validate'\r\n\r\nconst useSynthesis = (props: SynthesisType) => {\r\n const { projectData, onSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const [consideration, setConsideration] = React.useState([])\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const manageProjectStore = useManageProjectStore()\r\n const loadingHook = useLoading()\r\n const profileStore = authenStore()\r\n const { profile } = profileStore\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const formValues = React.useRef()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const formRef = useRef()\r\n const editSynthesis = useEditSynthesis({ form: formRef.current })\r\n\r\n React.useEffect(() => {\r\n createInitialData()\r\n }, [projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n if (projectData?.irb) {\r\n getConsideration(projectData?.irb)\r\n }\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const getConsideration = async (irb: number) => {\r\n let res = await callLookup.getApproveStatusByCloseProject(irb)\r\n const formatData = res?.result?.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.approveStatusName_th\r\n : itm.approveStatusName_en,\r\n value: `${itm.approveStatusId}`,\r\n }\r\n }) as []\r\n setConsideration(formatData)\r\n }\r\n\r\n const getSynthesis = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getSynthesisProjectByID(projectData.submittedID)\r\n loadingHook.loadingClose()\r\n return result\r\n }\r\n }\r\n\r\n /**\r\n * Default value form\r\n */\r\n const createInitialData = async () => {\r\n const result = await getSynthesis()\r\n if (result) {\r\n const initialData = {\r\n approveStatus:\r\n result && result?.approveStatusID\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result.approveStatusName_th\r\n : result.approveStatusName_en,\r\n value: result?.approveStatusID.toString(),\r\n }\r\n : null,\r\n synthesis: conditionRenderSynthesisView(result),\r\n }\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const conditionRenderSynthesisView = (result: GetSynthesisProjectByIDResultType) => {\r\n const isFirstTime = !result?.synthesisRemarkInfo && !result?.isDraft\r\n if (isFirstTime) {\r\n return null\r\n }\r\n\r\n if (result.synthesisRemarkInfo && result.synthesisRemarkInfo?.remark) {\r\n return result.synthesisRemarkInfo?.remark\r\n } else {\r\n return isViewMode ? '-' : null\r\n }\r\n }\r\n\r\n /**\r\n * process save\r\n */\r\n const handleSubmitForm = async (val: TFormValue) => {\r\n const parameter = getParameterForSave(val)\r\n if (val.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n handleConfirmSave(parameter)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n const getParameterForSave = (val: TFormValue) => {\r\n let paramForSave = null\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n let isDraft = false\r\n if (val.submitType === 'draft') {\r\n isDraft = true\r\n }\r\n\r\n const synthesisProjectRequest: REQServiceType.SynthesisProjectType = {\r\n loginUserID: profile.userId,\r\n submittedID: submittedID,\r\n reviewerID: profile.userId,\r\n approveStatusID:\r\n val && val.approveStatus && val.approveStatus.value ? parseInt(val?.approveStatus.value) : null,\r\n synthesisInfo: [],\r\n synthesisRemark: val && val?.synthesis ? val?.synthesis : null,\r\n isDraft: isDraft,\r\n }\r\n paramForSave = synthesisProjectRequest\r\n\r\n return paramForSave\r\n }\r\n\r\n const handleConfirmSave = async (\r\n paramForSave: REQServiceType.SynthesisProjectType,\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n\r\n const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.synthesisProject(paramForSave)\r\n\r\n if (!isFolder) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n if (tabIndex && newTabSelected) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n } else {\r\n //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n if (onSaveComplete) {\r\n if (res && res.status) {\r\n onSaveComplete(res.status, isDraft)\r\n }\r\n }\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleClickBackToSearch = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n /**\r\n * Dirty\r\n */\r\n\r\n const handleDirtyChange = (props: any) => {\r\n formValues.current = { ...props.values }\r\n let isDirty: boolean = false\r\n //** จัดformat initValue และ Form Value เพื่อเตรียมตัวนำไปใช้เปรียบเทียบค่า **//\r\n let newFormValue = { ...props.values }\r\n let initValue = { ...initialValues }\r\n\r\n //**********************************************************//\r\n const isEqual = _.isEqual(initValue, newFormValue) //ข้อมูลเท่ากัน\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n const parameter = getParameterForSave(formValues.current)\r\n if (parameter) {\r\n parameter.isDraft = true\r\n handleConfirmSave(parameter, tabIndex, newTabSelected, isFolder)\r\n }\r\n }\r\n\r\n const updateAfterSubmitted = async (fieldNames: string[]) => {\r\n formRef.current?.change('submitType', 'save')\r\n const formProps = formRef.current?.getState()\r\n const parameter = {\r\n ...getParameterForSave(formValues.current),\r\n approveStatusID: formProps?.values?.approveStatus?.value ?? null,\r\n synthesisRemark: formProps?.values?.synthesis ?? null,\r\n }\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n loadingHook.loadingOpen()\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n Promise.all([callWebService.synthesisProject(parameter)])\r\n .then(async () => {\r\n await loadTabAndFolder()\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formRef.current?.submit()\r\n reject('')\r\n }\r\n }).finally(() => {\r\n loadingHook.loadingClose()\r\n })\r\n }\r\n\r\n const loadTabAndFolder = async () => {\r\n if (manageProjectStore?.projectData) {\r\n await tabAndFolderHook.reloadProjectData(\r\n manageProjectStore.projectData.projectID,\r\n manageProjectStore.projectData.submittedID,\r\n )\r\n }\r\n }\r\n\r\n return {\r\n configDialog,\r\n initialValues,\r\n isViewMode,\r\n consideration,\r\n isShowUpdateDate,\r\n useAccordionMode: editSynthesis.useAccordionMode,\r\n formRef,\r\n updateAfterSubmitted,\r\n onRefDialog,\r\n\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onDirtyChange: handleDirtyChange,\r\n }\r\n}\r\nexport default useSynthesis\r\n","import { Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useSynthesis from './useSynthesis'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport Autocomplete from '../../../../../../control/autocomplete/autocomplete'\r\nimport MyTextfield from '../../../../../../control/textfield/textfield'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\n\r\ntype SynthesisViewType = ReturnType\r\nconst SynthesisView = (props: SynthesisViewType) => {\r\n const {\r\n isViewMode,\r\n configDialog,\r\n consideration,\r\n initialValues,\r\n isShowUpdateDate,\r\n useAccordionMode,\r\n formRef,\r\n updateAfterSubmitted,\r\n onRefDialog,\r\n onSubmitForm,\r\n onDirtyChange,\r\n onClickBackToSearch,\r\n } = props\r\n const translate = useTranslate()\r\n\r\n const renderComment = (isDisabled: boolean) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n\r\n return (\r\n
\r\n {(props) => {\r\n const { form, dirty } = props\r\n formRef.current = form\r\n return (\r\n \r\n \r\n {useAccordionMode ? (\r\n renderComment(false)}\r\n renderViewComponent={() => renderComment(true)}\r\n isViewMode={true}\r\n fieldNames={['approveStatus', 'synthesis']}\r\n onConfirm={() => updateAfterSubmitted(['approveStatus', 'synthesis'])}\r\n />\r\n ) : (\r\n \r\n {renderComment(isViewMode)}\r\n \r\n )}\r\n {isShowUpdateDate && }\r\n {!isViewMode && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={() => {\r\n onClickBackToSearch(dirty)\r\n }}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport type SynthesisType = {\r\n onSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n projectData: any\r\n}\r\nconst Synthesis = (props: SynthesisType) => {\r\n const synthesis = useSynthesis(props)\r\n return \r\n}\r\nexport default Synthesis\r\n","import React from 'react'\r\nimport { SynthesisReviewType } from './synthesisReview'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport authenStore from '../../../../../../stores/authen/authenStore'\r\nimport { TabSelectedType } from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { SynthesisReviewProjectRequestType } from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport { TFormValue } from '../synthesisReviewType'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport _ from 'lodash'\r\nimport { SynthesisReviewRemarkInfo } from '../../../../../../services/web/types/responseWebServiceTypes'\r\n\r\nconst useSynthesisReview = (props: SynthesisReviewType) => {\r\n const { projectData, onSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const callWebService = useWebService()\r\n const loadingHook = useLoading()\r\n const { profile } = authenStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const translate = useTranslate()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const formValues = React.useRef()\r\n const [isLoadedSynthesisReview, setIsLoadedSynthesisReview] = React.useState(false)\r\n const [synthesisReviewRemarkInfoList, setSynthesisReviewRemarkInfo] = React.useState()\r\n const [initialRichTextEditor, setInitialRichTextEditor] = React.useState()\r\n\r\n React.useEffect(() => {\r\n getSynthesisReviewData()\r\n }, [projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n createInitialData()\r\n createInitialRichTextEditor()\r\n }, [isLoadedSynthesisReview])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const getSynthesisReviewData = async () => {\r\n if (projectData) {\r\n setIsLoadedSynthesisReview(false)\r\n loadingHook.loadingOpen()\r\n const submittedID = projectData.submittedID\r\n const data = await callWebService.getSynthesisReview(submittedID)\r\n loadingHook.loadingClose()\r\n if (data.status === 1) {\r\n setSynthesisReviewRemarkInfo(data.result.synthesisReviewRemarkInfo)\r\n setIsLoadedSynthesisReview(true)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Default value form\r\n */\r\n const createInitialData = async () => {\r\n if (synthesisReviewRemarkInfoList) {\r\n const initialData = {\r\n synthesisList: synthesisReviewRemarkInfoList?.synthesisRemark\r\n ? synthesisReviewRemarkInfoList?.synthesisRemark\r\n : '-',\r\n }\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const createInitialRichTextEditor = () => {\r\n if (synthesisReviewRemarkInfoList) {\r\n const initialData = {\r\n contentHtml: synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html\r\n : synthesisReviewRemarkInfoList?.synthesisRemark,\r\n contentText: synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n ? synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n : synthesisReviewRemarkInfoList?.synthesisRemark,\r\n }\r\n\r\n setInitialRichTextEditor(initialData)\r\n }\r\n }\r\n\r\n /**\r\n * process save\r\n */\r\n const handleSubmitForm = async (val: TFormValue) => {\r\n const parameter = getParameterForSave(val)\r\n\r\n if (val.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n handleConfirmSave(parameter)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n const getParameterForSave = (val: TFormValue) => {\r\n let paramForSave = null\r\n const submittedID = projectData?.submittedID ?? null\r\n\r\n let isDraft = false\r\n if (val.submitType === 'draft') {\r\n isDraft = true\r\n }\r\n\r\n const synthesisReviewProjectRequest: SynthesisReviewProjectRequestType = {\r\n loginUserID: profile.userId,\r\n submittedID: submittedID,\r\n synthesisReviewInfo: null,\r\n stampFileList: null,\r\n synthesisReviewRemarkInfo: {\r\n remark: val.consideration && val.consideration.contenText ? val.consideration.contenText : null,\r\n remark_htmltag:\r\n val.consideration && val.consideration.contentHtml ? val.consideration.contentHtml : null,\r\n },\r\n isDraft: isDraft,\r\n }\r\n paramForSave = synthesisReviewProjectRequest\r\n return paramForSave\r\n }\r\n\r\n const handleConfirmSave = async (\r\n paramForSave: SynthesisReviewProjectRequestType,\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n loadingHook.loadingOpen()\r\n\r\n const param = { ...paramForSave } as SynthesisReviewProjectRequestType\r\n const res = await callWebService.synthesisReviewTerminatedProject(param)\r\n dialogRef.current?.closeDialog()\r\n\r\n if (!isFolder) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n if (tabIndex && newTabSelected) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n } else {\r\n //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n if (onSaveComplete) {\r\n if (res && res.status) {\r\n onSaveComplete(res.status, isDraft)\r\n }\r\n }\r\n }\r\n }\r\n\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleClickBackToSearch = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n /**\r\n * Dirty\r\n */\r\n\r\n const handleDirtyChange = (props: any) => {\r\n formValues.current = { ...props.values }\r\n\r\n let isDirty: boolean = false\r\n const consideration = {\r\n contentHtml: initialRichTextEditor?.contentHtml,\r\n contentText: initialRichTextEditor?.contentText,\r\n }\r\n const initialVal = {\r\n ...initialValues,\r\n consideration: consideration,\r\n }\r\n //** จัดformat initValue และ Form Value เพื่อเตรียมตัวนำไปใช้เปรียบเทียบค่า **//\r\n let newFormValue = _.omit(props.values, ['submitType'])\r\n\r\n let initValue = _.omit(initialVal, ['submitType'])\r\n\r\n //**********************************************************//\r\n const isEqual = _.isEqual(initValue, newFormValue) //ข้อมูลเท่ากัน\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n const parameter = getParameterForSave(formValues.current)\r\n if (parameter) {\r\n parameter.isDraft = true\r\n handleConfirmSave(parameter, tabIndex, newTabSelected, isFolder)\r\n }\r\n }\r\n return {\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialRichTextEditor,\r\n onRefDialog,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onDirtyChange: handleDirtyChange,\r\n }\r\n}\r\nexport default useSynthesisReview\r\n","import { Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useSynthesisReview from './useSynthesisReview'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport Autocomplete from '../../../../../../control/autocomplete/autocomplete'\r\nimport MyTextfield from '../../../../../../control/textfield/textfield'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\n\r\ntype SynthesisReviewViewType = ReturnType\r\nconst SynthesisReviewView = (props: SynthesisReviewViewType) => {\r\n const {\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialRichTextEditor,\r\n onRefDialog,\r\n onSubmitForm,\r\n onDirtyChange,\r\n onClickBackToSearch,\r\n } = props\r\n const translate = useTranslate()\r\n return (\r\n
\r\n {(props) => {\r\n // const { dirty } = props\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={() => {\r\n onClickBackToSearch(props.dirty)\r\n }}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport type SynthesisReviewType = {\r\n onSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n projectData: any\r\n}\r\nconst SynthesisReview = (props: SynthesisReviewType) => {\r\n const synthesis = useSynthesisReview(props)\r\n return \r\n}\r\nexport default SynthesisReview\r\n","import VerifyDocumentREC1 from '../../../page/verifyDocumentTerminate/verifyDocumentREC1'\r\nimport VerifyDocumentREC2 from '../../../page/verifyDocumentTerminate/verifyDocumentREC2'\r\nimport MemoMessageTerminateREC1 from '../../../page/memoMessageTerminateProject/memoMessageTerminateREC1'\r\nimport MemoMessageTerminateREC2 from '../../../page/memoMessageTerminateProject/memoMessageTerminateREC2'\r\nimport Synthesis from '../../../page/synthesis/terminateProject/synthesis'\r\nimport SynthesisReview from '../../../page/synthesisReview/terminateProject/synthesisReview'\r\n\r\nimport { OfficerType } from './officerType'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport SignREC2 from '../../../page/sign/signMemoMessage/signREC2'\r\nimport SignREC1 from '../../../page/sign/signMemoMessage/signREC1'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC1'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n\r\n let isNotDisableTestResult = false\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.synthesis\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab6.id:\r\n // tab1
สังเคราะห์ความเห็น REC1
\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab7.id:\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab11.id:\r\n // code block\r\n return (\r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.synthesis\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab6.id:\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab7.id:\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab11.id:\r\n // code block\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useTerminateProject from './useTerminateProject'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\n\r\ntype RequestNewProjectViewType = ReturnType & Omit\r\nconst RequestProjectRenewalView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const isBtnClose =\r\n checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.synthesis ? false : isViewMode\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {isBtnClose && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type RequestProjectRenewalType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst RequestProjectRenewal: React.FC = (props) => {\r\n const requestProjectRenewalModel = useTerminateProject(props)\r\n return \r\n}\r\nexport default RequestProjectRenewal\r\n","import React from 'react'\r\nimport { RequestProjectRenewalType } from './terminateProject'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\n\r\nexport default (props: RequestProjectRenewalType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n const loadingHook = useLoading()\r\n\r\n React.useEffect(() => {\r\n console.log('####TERMINATE PROJECT####')\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\n","import React from 'react'\r\nimport * as TerminateProjectType from './adverseEventType'\r\n\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\n\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport { topicForLecturer, topicForStudent } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\n\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport * as REQServiceTypes from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport _ from 'lodash'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport { encryptionAES } from '../../../../../../utilities/encryption'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { ResultDocumentTopicLut } from '../../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport useProjectHook from '../../../../shareLogic/useProjectHook'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\n\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\n\r\ntype MyFileDataType = {\r\n documentTopicID?: number\r\n fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }>\r\n subtopic?: {\r\n subtopicID: number\r\n page: number | string\r\n }[]\r\n}\r\n\r\nconst useRequestForm = (props: TerminateProjectType.UseRequestFormType) => {\r\n const { formMode, projectSubmittedTypeID, isViewMode, onSaveComplete, initialData } = props\r\n\r\n const translate = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const projectHook = useProjectHook()\r\n\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n\r\n const { profile } = authenStore\r\n\r\n const { configLoading, loadingClose, loadingOpen } = useLoading()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const callLookup = useLookupService()\r\n const [selectedIrb, setSelectedIrb] = React.useState('1')\r\n const checkPermission = useCheckPermission()\r\n\r\n const dialogTwoRef = React.useRef>()\r\n const projectIDRef = React.useRef()\r\n const submittedIDRef = React.useRef()\r\n const irbRef = React.useRef()\r\n const parameterForSaveRef = React.useRef()\r\n const submitValueRef = React.useRef()\r\n const isDraftRef = React.useRef(false)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const { documentTopic } = manageProjectStore\r\n const researcherTypeRef = React.useRef()\r\n const documentTopicRef = React.useRef()\r\n const valuesForm = React.useRef()\r\n const tabSelectedIndexRef = React.useRef(null)\r\n const newTabSelectedRef = React.useRef(null)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n let isApproveWithComment = false\r\n if (manageProjectStore.projectData) {\r\n isApproveWithComment = projectHook.isFlowApproveWithComment(manageProjectStore.projectData)\r\n }\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n //clear ค่า tabRef\r\n tabSelectedIndexRef.current = null\r\n newTabSelectedRef.current = null\r\n }\r\n }, [])\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData?.irb && manageProjectStore.projectData?.submitTypeInfo.value) {\r\n getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n manageProjectStore.projectData?.submitTypeInfo.value,\r\n )\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n // const fileTokenInfo: Array = uploadObj.uploadFileObj.fileList?.map((file) => file.fileToken) ?? []\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n const getParameterForSave = (value: TerminateProjectType.MyRequestFormType) => {\r\n let submittedTypeID = projectSubmittedTypeID\r\n if (manageProjectStore && manageProjectStore?.projectData) {\r\n if (manageProjectStore.projectData.submitTypeInfo && manageProjectStore.projectData.submitTypeInfo?.value) {\r\n submittedTypeID = manageProjectStore.projectData.submitTypeInfo?.value\r\n }\r\n }\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = {\r\n projectID: manageProjectStore?.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore?.projectData?.submittedID ?? null,\r\n irb: value.IRB ? parseInt(value.IRB.value) : null, //parseInt(value?.faculty?.irb) || null\r\n userID: profile.userId as number,\r\n projectName_th: value?.projectNameTH || null,\r\n projectName_en: value?.projectNameEN || null,\r\n // projectSubmitTypeID: value?.isPhase ? parseInt(value.isPhase) : null, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n projectSubmitTypeID: submittedTypeID, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n\r\n facultyID: value.faculty ? parseInt(value.faculty.value) : null,\r\n requestPhase: value.numPhase ? value.numPhase : null,\r\n isTools: value.isPhase === '2' ? (value.isTools === '2' ? true : false) : null,\r\n researcherTypeID: value.researcherType ? parseInt(value.researcherType.value) : null,\r\n titleNameID: value.titleName ? parseInt(value.titleName) : null,\r\n // titleNameOther: value.otherTitleName ? value.otherTitleName : null,\r\n titleNameOther_th: value.otherTitleNameTH ? value.otherTitleNameTH : null,\r\n titleNameOther_en: value.otherTitleNameEN ? value.otherTitleNameEN : null,\r\n academicPositionID: value.academicPosition ? parseInt(value.academicPosition) : null,\r\n // academicPositionOther: value.otherAcademicPosition ? value.otherAcademicPosition : null,\r\n academicPositionOther_th: value.otherAcademicPositionTH ? value.otherAcademicPositionTH : null,\r\n academicPositionOther_en: value.otherAcademicPositionEN ? value.otherAcademicPositionEN : null,\r\n educationLevelID: value.educationLevel ? parseInt(value.educationLevel.value) : null,\r\n researcherName_th: value.nameTH ? value.nameTH : null,\r\n researcherName_en: value.nameEN ? value.nameEN : null,\r\n email: value.email ? value.email : null,\r\n homePhone: value.homePhone ? value.homePhone : null,\r\n mobilePhone: value.mobilePhone ? value.mobilePhone : null,\r\n fax: value.fax ? value.fax : null,\r\n isDraft: value?.submitType === 'save' ? false : true,\r\n documentInfo: getDocumentInfo(value),\r\n isLanguage_th: value.langTH ? value.langTH : false,\r\n isLanguage_en: value.langEN ? value.langEN : false,\r\n isRequestCertificatePaper: value.isCertificatePaperList === '1' ? true : false,\r\n isDr: value.isDr ? value.isDr : false,\r\n }\r\n\r\n return parameterForSave\r\n }\r\n const handleClickSubmit = (value: TerminateProjectType.MyRequestFormType) => {\r\n submitValueRef.current = value\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(value)\r\n parameterForSaveRef.current = parameterForSave\r\n switch (value.submitType) {\r\n case 'save':\r\n // code block\r\n isDraftRef.current = false\r\n handleSave()\r\n\r\n break\r\n\r\n case 'draft':\r\n // code block\r\n isDraftRef.current = true\r\n handleSaveDraft()\r\n\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n const checkRequirePDF = (documentInfo: MyFileDataType[]) => {\r\n let isRequirePDF = false\r\n\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if (documentInfo[i]?.fileTokenInfo[j].fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n const checkSubtopic = (documentInfo: MyFileDataType[]) => {\r\n let isEmptyPage = false\r\n\r\n //หาว่าหัวข้ออัปโหลดเอกสารมีให้อัปโหลดหัวข้อย่อยมั้ย\r\n const docTopic = manageProjectStore.documentTopic?.filter((item) => item.subtopic.length > 0)\r\n\r\n //ถ้ามีให้เข้าไปเช็คตามเงื่อนไข if\r\n if (docTopic?.length) {\r\n // วน loop หัวข้อที่มีให้อัปโหลดเอกสารหัวข้อย่อย\r\n docTopic.forEach((mainTopic) => {\r\n // วน loop หัวข้อที่มีการอัปโหลดเอกสารเข้ามา\r\n documentInfo.forEach((itm) => {\r\n // เช็คว่าเอกสารที่มีการอัปโหลดเข้ามาใช่เอกสารที่มีหัวข้อย่อยให้อัปโหลดหรือป่าว\r\n if (mainTopic.id === itm.documentTopicID) {\r\n // เช็คว่าหัวข้อย่อยที่อัพโหลดเข้ามาครบมั้ย\r\n if (itm.subtopic?.length != mainTopic.subtopic.length) {\r\n isEmptyPage = true\r\n } else {\r\n // เช็คว่าที่อัปมาครบมีช่องไหนกรอกเป็น ช่องว่างมั้ย\r\n const chkEmpty = itm.subtopic.find(\r\n (e) => e.page == null || e.page == '' || e.page == undefined,\r\n )\r\n if (chkEmpty) {\r\n isEmptyPage = true\r\n }\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n return isEmptyPage\r\n }\r\n const validateRequiredUploadFile = (uploadFile: Array<{ uploadFileObj: any }>, skipValidate: boolean = false) => {\r\n let isValid = true\r\n if (!skipValidate) {\r\n uploadFile?.every(({ uploadFileObj: file }) => {\r\n if (file?.isRequired && file?.fileList?.length === 0) {\r\n //เป็นหัวข้อที่มีการ required แต่ว่าไม่ upload เอกสาร\r\n isValid = false\r\n return false //break\r\n }\r\n return true //continue\r\n })\r\n\r\n if (!isValid) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get2Element('ALERT.CONTENT.PLEASE_UPLOAD_REQUIRED_TOPIC', [\r\n '',\r\n ]) as any,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n return isValid\r\n }\r\n const handleSave = async () => {\r\n if (validateRequiredUploadFile(submitValueRef.current.uploadFile)) {\r\n if (parameterForSaveRef.current?.documentInfo?.length === 0) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n const isRequirePDF = checkRequirePDF(parameterForSaveRef.current?.documentInfo)\r\n const isEmptyPage = checkSubtopic(parameterForSaveRef.current?.documentInfo)\r\n if (isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else if (isEmptyPage) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.PLEASE_COMPLETE_PAGE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: handleClickConfirmSave,\r\n })\r\n }\r\n }\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const handleSaveDraft = async () => {\r\n handleClickConfirmSave()\r\n }\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const handleClickConfirmSave = async () => {\r\n loadingOpen()\r\n let res\r\n if (isApproveWithComment) {\r\n const parameterEditAfterReview = _.pick(parameterForSaveRef.current, [\r\n 'documentInfo',\r\n 'isDraft',\r\n 'projectID',\r\n 'submittedID',\r\n ])\r\n res = await callWebService.projectApproveWithComment(parameterEditAfterReview)\r\n } else {\r\n //Flow ยื่นโครงการใหม่ + Flow แก้ไขหลังพิจารณา\r\n res = await callWebService.adverseEvent(parameterForSaveRef.current)\r\n }\r\n loadingClose()\r\n\r\n setConfigDialog({}) //clear function dialog\r\n dialogTwoRef.current?.closeDialog()\r\n if (formMode === 'EDIT') {\r\n if (onSaveComplete) onSaveComplete(res?.status, parameterForSaveRef.current?.isDraft as boolean)\r\n } else if (formMode === 'CREATE') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: handleAfterCloseCreateSuccess,\r\n })\r\n appFolderAndTabAction.resetTabDirty()\r\n dialogTwoRef.current?.openDialog()\r\n projectIDRef.current = res.result?.projectInfo?.projectID\r\n submittedIDRef.current = res.result?.projectInfo?.submittedID\r\n irbRef.current = res.result?.projectInfo?.irb\r\n }\r\n }\r\n\r\n const handleAfterCloseCreateSuccess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n //เล่นใน mode create save เสร็จจะต้องไปเข้าหน้า Edit/View\r\n const encryptedProjectID = encryptionAES(`${projectIDRef.current}`)\r\n const encryptedSubmittedID = encryptionAES(`${submittedIDRef.current}`)\r\n const path = generatePath(RoutePath.manageProjectEdit, {\r\n projectID: encryptedProjectID,\r\n submittedID: encryptedSubmittedID,\r\n })\r\n history.push({\r\n pathname: path, // editMode\r\n })\r\n }\r\n\r\n const handleChangeFaculty = (irb?: string) => {\r\n if (irb) {\r\n const submittedTypeID =\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration\r\n getDocumentTopicLut(parseInt(irb), submittedTypeID)\r\n }\r\n }\r\n\r\n const handleChangeResearcherType = (val?: string) => {\r\n if (val) {\r\n filterTopicUpload(val)\r\n researcherTypeRef.current = val\r\n }\r\n }\r\n\r\n const filterTopicUpload = (val: string) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n if (documentTopic && documentTopicRef.current) {\r\n let isDocTopic = documentTopicRef.current\r\n if (val === '1') {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submittType: number) => {\r\n let submittedTypeID = projectSubmittedTypeID ? projectSubmittedTypeID : submittType\r\n\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submittedTypeID)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n\r\n if (researcherTypeRef.current) {\r\n filterTopicUpload(researcherTypeRef.current)\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n let documentInfo = manageProjectStore.projectData?.documentInfo\r\n let latestDocument = manageProjectStore.projectData?.latestDocument\r\n // const uploadFileinit: Array = documentTopicList?.map((itm: any, idx: number) => {\r\n let uploadFileInit = documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n let fileList = docInfo?.fileInfo?.map((file: any) => ({\r\n documentTopicID: docInfo.topicID,\r\n fileToken: file.fileToken, //fileToken\r\n filename: file.filename,\r\n fileID: file.fileID, //fileToken\r\n path: file.path,\r\n replaceFileID: file.replaceFileID,\r\n }))\r\n itm.uploadFileObj.fileList = fileList\r\n const subtopic = docInfo.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docInfo.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n itm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n })\r\n })\r\n\r\n //Section Replace File\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileInit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileID, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFileBy.replaceFileID,\r\n } as any,\r\n ]\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n // //**** Initial File Edit ****//\r\n // if (latestDocument && latestDocument.length > 0) {\r\n // uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n // latestDocument?.forEach((latestDocInfo: any) => {\r\n // let latestFile = []\r\n // let previousFile = []\r\n // if (latestDocInfo?.fileInfo[0]) {\r\n // latestFile = latestDocInfo.fileInfo[0].latestFileList.filter((itm: any) => itm.no === null)\r\n // previousFile =\r\n // latestDocInfo.fileInfo[0].latestFileList[\r\n // latestDocInfo.fileInfo[0].latestFileList.length - 2\r\n // ]\r\n // }\r\n // if (latestFile.length > 0) {\r\n // if (latestDocInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n // let fileList = [\r\n // {\r\n // documentTopicID: latestDocInfo.topicID,\r\n // fileToken: latestFile[0].fileToken, //fileToken\r\n // filename: latestFile[0].filename,\r\n // fileID: latestFile[0].fileToken, //fileToken\r\n // path: latestFile[0].path,\r\n // replaceFileID: previousFile?.fileID,\r\n // },\r\n // ]\r\n // itm.uploadFileObj.fileList = fileList\r\n // itm.uploadFileObj.subTopicPageList = []\r\n // }\r\n // }\r\n // })\r\n // })\r\n // }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const handleClickClose = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n const handleDirtyChange = (props: any) => {\r\n const paramsDirty = {\r\n tabDirty: isViewMode ? false : props.dirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n isDraftRef.current = true\r\n\r\n if (valuesForm) {\r\n const values = { ...valuesForm.current } as TerminateProjectType.MyRequestFormType\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(values)\r\n parameterForSaveRef.current = parameterForSave\r\n newTabSelectedRef.current = newTabSelected\r\n tabSelectedIndexRef.current = tabIndex\r\n handleSaveDraft()\r\n }\r\n }\r\n\r\n const handleDeleteProject = () => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_DELETE'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: async () => {\r\n if (manageProjectStore?.projectData?.projectID) {\r\n const res = await callWebService.deleteProject(manageProjectStore?.projectData?.projectID)\r\n setConfigDialog({}) //clear function dialog\r\n history.push('/manage-project')\r\n }\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const chkDisplayBTNDeleteProject: boolean =\r\n (initialData?.projectSubmitType &&\r\n checkPermission.chkDisplayBTNDeleteProject(parseInt(initialData?.projectSubmitType.value)) &&\r\n initialData?.isDraft &&\r\n manageProjectStore.projectData?.verifyDocument == null) ||\r\n false\r\n\r\n return {\r\n isDraftData: chkDisplayBTNDeleteProject,\r\n initialUploadFile,\r\n configDialog,\r\n onRefDialogTwo,\r\n selectedIrb,\r\n configLoading,\r\n valuesForm,\r\n isApproveWithComment,\r\n projectData: manageProjectStore.projectData,\r\n handleDirtyChange,\r\n onClickDeleteProject: handleDeleteProject,\r\n onClickSubmit: handleClickSubmit,\r\n onClickCancel: handleClickCancel,\r\n onClickClose: handleClickClose,\r\n handleChangeFaculty: handleChangeFaculty,\r\n onChangeResearcherType: handleChangeResearcherType,\r\n }\r\n}\r\n\r\nexport default useRequestForm\r\n","import React from 'react'\r\nimport * as terminateProjectOtherType from './adverseEventType'\r\nimport useTerminateProject from './useAdverseEvent'\r\n\r\n// --- MaterialUI --- //\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\n\r\n// --- FinalForm --- //\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n// --- Control --- //\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\n\r\n// --- Share UI --- //\r\nimport EthicsForm from '../../../../shareUI/ethicsForm/ethicsForm'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport RemarkFromAdmin from '../../../../shareUI/remarkFromAdmin/remarkFromAdmin'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useSnackbarAction from '../../../../../../stores/snackbar/snackbarAction'\r\n\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\ntype ErrorsType = {\r\n langTH?: string\r\n langEN?: string\r\n}\r\n\r\n//View\r\nconst RequestFormView = (props: terminateProjectOtherType.RequestFormView) => {\r\n const {\r\n onClickSubmit,\r\n onClickCancel,\r\n // onClickClose,\r\n onRefDialogTwo,\r\n configDialog,\r\n handleChangeFaculty,\r\n selectedIrb,\r\n // configLoading,\r\n isApproveWithComment,\r\n isEditAfterReview = false,\r\n // --- props from outer --- //\r\n btnClose,\r\n initialData = {},\r\n isViewMode = false,\r\n initialUploadFile = [],\r\n projectData,\r\n handleDirtyChange,\r\n onChangeResearcherType,\r\n valuesForm,\r\n formValueRef,\r\n isDraftData,\r\n onClickDeleteProject,\r\n } = props\r\n //* STORE *//\r\n const manageProjectStore = useManageProjectStore()\r\n const snackbarAction = useSnackbarAction()\r\n\r\n const { documentTopic } = manageProjectStore\r\n\r\n const translate = useTranslate()\r\n const uploadFileinit = documentTopic?.map(() => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n },\r\n }\r\n })\r\n\r\n const isNotCompleteDocument = projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument\r\n const isDisableDoc = isViewMode && (!isNotCompleteDocument || !isApproveWithComment)\r\n\r\n let isDisableIRB = false\r\n if (isApproveWithComment) {\r\n isDisableIRB = true //Flow approveWithComment ให้ Disable IRB\r\n }\r\n\r\n let isUploadEditMode = false\r\n // if (isApproveWithComment || isNotCompleteDocument || isEditAfterReview) {\r\n if (isApproveWithComment || isEditAfterReview) {\r\n isUploadEditMode = true\r\n }\r\n return (\r\n 0 ? initialUploadFile : uploadFileinit,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n validate={(values) => {\r\n const errors: ErrorsType = {}\r\n if (!values.langTH && !values.langEN) {\r\n errors.langTH = translate.get('MESSAGE.M016')\r\n\r\n errors.langEN = translate.get('MESSAGE.M016')\r\n }\r\n\r\n return errors\r\n }}\r\n >\r\n {({ handleSubmit, form, dirty, invalid, errors, values }) => {\r\n valuesForm.current = values\r\n if (formValueRef) formValueRef.current = values\r\n return (\r\n \r\n \r\n {isNotCompleteDocument && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {!btnClose && (\r\n \r\n {\r\n onClickDeleteProject()\r\n }\r\n : undefined\r\n }\r\n onClickClose={() => {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst RequestFormCtrl = (props: terminateProjectOtherType.RequestFormType) => {\r\n const requestFormModel = useTerminateProject(props)\r\n return \r\n}\r\nexport default RequestFormCtrl\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n gridBtn: {\r\n marginTop: '2%',\r\n },\r\n}))\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as memoMessageType from './resultOfConsiderType'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { DataSourceType } from '../../../../../../control/treeCheckboxNew/treeCheckbox'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { dateForAPI } from '../../../../../../utilities/date'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\n\r\nconst useMemomessageTerminate = (props: memoMessageType.UseMemoMessageType) => {\r\n const { onSaveComplete } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const callLookup = useLookupService()\r\n\r\n const [initialSuggestionNotice, setInitialSuggestionNotice] = React.useState()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n const [approveStatus, setApproveStatus] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n if (projectData && projectData?.submittedID) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getApproveStatus()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getApproveStatus = async () => {\r\n let res\r\n if (projectData?.irb) {\r\n res = await callLookup.callApproveStatusLut(projectData?.irb, constSubmittedType.adverseEvent)\r\n if (res) {\r\n const formatedData = res?.result?.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n }) as []\r\n setApproveStatus(formatedData)\r\n }\r\n }\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n const res = await callWebService.getProjectAdverseEventMemoMessage(submittedID)\r\n const result = res.result\r\n\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n approveStatus:\r\n result && result?.approveStatusInfo\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result?.approveStatusInfo.nameTH\r\n : result?.approveStatusInfo.nameEN,\r\n value: result?.approveStatusInfo.value.toString(),\r\n }\r\n : null,\r\n }\r\n\r\n const initialSugestionNotice = {\r\n contentHtml: result?.memoMessageComment_html,\r\n contentText: result?.memoMessageComment,\r\n }\r\n // const initialMemoMessagePaper = {\r\n // TH: {\r\n // contentHtml: result?.memoMessagePaper_th_html,\r\n // contentText: result?.memoMessagePaper_th,\r\n // },\r\n // EN: {\r\n // contentHtml: result?.memoMessagePaper_en_html,\r\n // contentText: result?.memoMessagePaper_en,\r\n // },\r\n // }\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n setInitialSuggestionNotice(initialSugestionNotice)\r\n // setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.signPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.signPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n const handleChangeStatus = () => {}\r\n return {\r\n formRef,\r\n configDialog,\r\n isViewMode: isViewMode,\r\n initialValues,\r\n initialMemorandumFile,\r\n initialSuggestionNotice,\r\n required,\r\n approveStatus,\r\n onRefDialog,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickOpenFile: handleClickOpenFile,\r\n onChangeStatus: handleChangeStatus,\r\n }\r\n}\r\n\r\nexport default useMemomessageTerminate\r\n","import * as memoMessageType from './resultOfConsiderType'\r\nimport useMemomessageTerminate from './useResultOfConsider'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\n// import UploadDocCtrl from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../../constants/approveStatus'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n initialValues,\r\n projectData,\r\n configDialog,\r\n onRefDialog,\r\n onClickBackToSearch,\r\n initialMemorandumFile,\r\n initialSuggestionNotice,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSignMemoMessage: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n const isNotShowComment =\r\n initialValues?.approveStatus?.value === approveStatusREC1.acknowledgeAndDonotTakeAnyaAction.toString() ||\r\n initialValues?.approveStatus?.value === approveStatusREC2.acknowledgeAndDonotTakeAnyaAction.toString()\r\n\r\n return (\r\n {}}\r\n initialValues={{ ...initialValues, memorandumFile: initialMemorandumFile }}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n >\r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? initialValues?.approveStatus?.label\r\n : initialValues?.approveStatus?.label}\r\n \r\n \r\n \r\n\r\n {!isNotShowComment && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {isSignMemoMessage && (\r\n \r\n \r\n \r\n )}\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n {/* */}\r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport AdverseEventRequestPage from '../../../page/requestNewProject/adverseEvent/adverseEvent'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/adverseEvent/resultOfConsider'\r\nimport NoticeAdditionalDocument from '../../../page/noticeAdditionalDocument/noticeAdditionalDocument'\r\nimport CertificateStampDocument from '../../../page/certificateStampDocument/certificateStampDocument'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\nimport { menuTab } from '../../../../../../constants/constants'\r\n\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return (\r\n //
PROJECT RENEWAL
\r\n \r\n )\r\n case menuTab.tab22.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab24.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport { ResultDocumentTopicLut } from '../../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport * as Utils from '../../../../../../utilities/date'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\n\r\nimport * as VerifyDocumentType from '../verifyDocumentType'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../../constants/approveStatus'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\nimport useVerifyDocumentProjectDetail from '../../../../shareLogic/useVerifyDocumentProjectDetail'\r\nimport { validateModeAccordionError } from '../../../../../../utilities/validate'\r\ntype OptType = {\r\n label: string\r\n value: string\r\n}\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\n\r\nconst useVerifyDocument = (props: VerifyDocumentType.VerifyDocumentType) => {\r\n const { projectData, onSaveComplete } = props\r\n\r\n const history = useHistory()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const [isCompletely, setIsCompletely] = React.useState(true)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n const documentTopicRef = React.useRef()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const reviewerLutRef = React.useRef()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const { createInitialProjectDetail, updateProjectDetailFormatting } = useVerifyDocumentProjectDetail()\r\n const { getIRB } = useIRB()\r\n const formHistoryRef = React.useRef>({})\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n setIsCompletely(projectData?.verifyDocument ?? true)\r\n getReviewer(projectData.irb)\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.irb && projectData?.submitTypeInfo?.value) {\r\n getDocumentTopicLut(projectData?.irb, projectData?.submitTypeInfo.value)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const filterTopicUpload = (documentTopic: ResultDocumentTopicLut[]) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n const researcherTypeID = manageProjectStore?.projectData?.researcherTypeInfo.value\r\n\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n Constants.topicForLecturer.forEach((element) => {\r\n docTopic = documentTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n Constants.topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submitType: number) => {\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitType)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n filterTopicUpload(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n const documentInfo = projectData?.documentInfo\r\n // ------------------------------------------------------------- //\r\n let uploadFileInit = manageProjectStore.documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: VerifyDocumentType.uploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList = docInfo.fileInfo\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic\r\n }\r\n })\r\n })\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const getReviewer = async (irb: number) => {\r\n if (irb) {\r\n const res = await callLookup.callReviewerLut(irb)\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: itm.name_th,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n reviewerLutRef.current = formatedData\r\n }\r\n }\r\n\r\n const handleChangeDocCompletely = (val: string) => {\r\n const isCompletely = val === '1' ? true : false\r\n setIsCompletely(isCompletely)\r\n }\r\n\r\n const createInitialData = async () => {\r\n loadingHook.loadingOpen()\r\n const defaultCompletely = projectData?.verifyDocument ?? '1'\r\n const lutIrb = await getIRB()\r\n const projectDetail = createInitialProjectDetail(projectData, lutIrb)\r\n const initialData = {\r\n isCompletelyDoc: defaultCompletely === '1' ? defaultCompletely : projectData?.verifyDocument ? '1' : '2',\r\n resubmitDocDate: projectData?.resubmitDocDate ? projectData?.resubmitDocDate : null,\r\n //@ts-ignore\r\n reviewer: projectData?.reviewerUserID\r\n ? {\r\n label: `${projectData?.reviewerName_th}`,\r\n value: `${projectData?.reviewerUserID}`,\r\n }\r\n : null,\r\n remark: projectData?.verifyDocumentRemark,\r\n ...projectDetail,\r\n }\r\n\r\n setInitialValues(initialData)\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const checkUseUploadEdit = () => {\r\n let isUseUploadEdit = false\r\n\r\n switch (projectData?.submitTypeInfo?.value) {\r\n case constSubmittedType.firstSubmitConsideration:\r\n isUseUploadEdit = false\r\n break\r\n case constSubmittedType.editAfterReview:\r\n isUseUploadEdit = true\r\n break\r\n case constSubmittedType.editAfterReview_nextPhaseProject:\r\n isUseUploadEdit = true\r\n break\r\n case constSubmittedType.exitAfterReview_AmendmentProject:\r\n isUseUploadEdit = true\r\n break\r\n default:\r\n isUseUploadEdit = false\r\n }\r\n if (projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument) {\r\n //เอกสารไม่ครบถ้วน\r\n isUseUploadEdit = true\r\n }\r\n if (\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC1.approveWithComment ||\r\n projectData?.synthesisApproveStatusInfo?.value === approveStatusREC2.approveWithComment\r\n ) {\r\n //Approve With Comment\r\n isUseUploadEdit = true\r\n }\r\n\r\n return isUseUploadEdit\r\n }\r\n const handleDirtyChange = (props: { dirty: boolean }) => {\r\n let isDirty: boolean = false\r\n if (!isViewMode) {\r\n isDirty = props.dirty\r\n }\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n const isCompletelyDoc = value?.isCompletelyDoc === '1'\r\n let reviewerUserID = null\r\n if (value?.reviewer?.value) {\r\n reviewerUserID = parseInt(value.reviewer.value)\r\n }\r\n\r\n let sendEditData = null\r\n if (!isCompletelyDoc && value?.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(value.resubmitDocDate) ?? null\r\n }\r\n\r\n const verifyProjectServiceParam: REQServiceType.VerifyProjectRequestType = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n reviewerUserID: reviewerUserID,\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : value?.remark ? value.remark : null,\r\n isDraft: isDraft,\r\n }\r\n\r\n return verifyProjectServiceParam\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft: boolean = true\r\n const param = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.VerifyProjectRequestType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n try {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.verifyProjectAdverseEvent(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useVerifyDocument.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleSubmitForm = async (value: any) => {\r\n if (projectData?.projectID && projectData?.submittedID) {\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param = getSaveServiceParameter(isDraft)\r\n\r\n if (value.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n }\r\n }\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const confirmEditDocResult = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n let isCompletelyDoc = formProps.values.isCompletelyDoc === '1'\r\n let sendEditData = null\r\n if (!isCompletelyDoc && formProps.values.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(formProps.values.resubmitDocDate) ?? null\r\n }\r\n const param = {\r\n ...getEditDocParams(formHistoryRef.current['docResult']),\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : formProps.values?.remark ? formProps.values.remark : null,\r\n }\r\n processSaveData(param)\r\n .then(() => {\r\n handleEditDocResult(formProps)\r\n handleEditDocReviewer(formProps)\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const confirmEditDocReviewer = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n let reviewerUserID = null\r\n if (formProps?.values?.reviewer?.value) {\r\n reviewerUserID = parseInt(formProps.values.reviewer.value)\r\n }\r\n const param = {\r\n ...getEditDocParams(formHistoryRef.current['docResult']),\r\n }\r\n const formatParam = {\r\n submittedID: Number(param.submittedID),\r\n loginUserID: Number(param.loginUserID),\r\n reviewerUserID: Number(reviewerUserID),\r\n }\r\n Promise.all([callWebService.updateProjectReviewer(formatParam)])\r\n .then(() => {\r\n handleEditDocResult(formProps)\r\n handleEditDocReviewer(formProps)\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const handleEditDocResult = (formProps: FormRenderProps) => {\r\n formHistoryRef.current['docResult'] = formProps.values\r\n }\r\n\r\n const handleEditDocReviewer = (formProps: FormRenderProps) => {\r\n formHistoryRef.current['docReviewer'] = formProps.values\r\n }\r\n\r\n const getEditDocParams = (formValues: any) => {\r\n let verifyProjectServiceParam: REQServiceType.VerifyProjectRequestType\r\n const isCompletelyDoc = formValues?.isCompletelyDoc === '1'\r\n let reviewerUserID = null\r\n if (formValues?.reviewer?.value) {\r\n reviewerUserID = parseInt(formValues.reviewer.value)\r\n }\r\n\r\n let sendEditData = null\r\n if (!isCompletelyDoc && formValues?.resubmitDocDate) {\r\n sendEditData = Utils.dateForAPI(formValues.resubmitDocDate) ?? null\r\n }\r\n\r\n verifyProjectServiceParam = {\r\n loginUserID: authenStore.profile.userId,\r\n projectID: projectData?.projectID ?? null,\r\n submittedID: projectData?.submittedID ?? null,\r\n reviewerUserID: reviewerUserID,\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : formValues?.remark ? formValues.remark : null,\r\n isDraft: false,\r\n }\r\n\r\n return verifyProjectServiceParam\r\n }\r\n\r\n const confirmEditEthics = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n loadingHook.loadingOpen()\r\n const rawData = formRef.current?.values\r\n const formattingParam = updateProjectDetailFormatting(rawData, projectData)\r\n callWebService\r\n .updateProjectDetail(formattingParam)\r\n .then(async () => {\r\n if (projectData) {\r\n await tabAndFolderHook.reloadProjectData(projectData.projectID, projectData.submittedID)\r\n await createInitialData()\r\n }\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n .finally(() => {\r\n loadingHook.loadingClose()\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n return {\r\n formRef,\r\n configDialog,\r\n onRefDialog,\r\n isCompletely,\r\n initialUploadFile: initialUploadFile,\r\n isViewMode,\r\n initialValues,\r\n isShowUpdateDate,\r\n onSubmitForm: handleSubmitForm,\r\n onChangeDocCompletely: handleChangeDocCompletely,\r\n checkUseUploadEdit: checkUseUploadEdit,\r\n onDirtyChange: handleDirtyChange,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n projectDetailLabel: translate.get('LABEL.PROJECT_DETAIL'),\r\n confirmEditDocResult,\r\n confirmEditDocReviewer,\r\n handleEditDocResult,\r\n handleEditDocReviewer,\r\n confirmEditEthics,\r\n }\r\n}\r\n\r\nexport default useVerifyDocument\r\n","import ResearchDetail from '../../../../shareUI/ResearchDetail/researchDetail'\r\nimport DocumentTestResult from '../../../../shareUI/documentTestResult/documentTestResult'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport { VerifyDocumentViewType, VerifyDocumentType } from './verifyDocumentType'\r\nimport useVerifyDocument from './useVerifyDocument'\r\nimport React from 'react'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport EthicsForm from '../../../../shareUI/ethicsForm/ethicsForm'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\nimport { ethicsFormResetList } from '../../../../shareUI/ethicsForm/formResetList'\r\n\r\nconst VerifyDocumentView = (props: VerifyDocumentViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n projectData,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialUploadFile,\r\n projectDetailLabel,\r\n onRefDialog,\r\n onSubmitForm,\r\n onDirtyChange,\r\n checkUseUploadEdit,\r\n onClickBackToSearch,\r\n onChangeDocCompletely,\r\n confirmEditDocResult,\r\n handleEditDocResult,\r\n confirmEditEthics,\r\n } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const { documentTopic } = manageProjectStore\r\n const checkPermission = useCheckPermission()\r\n const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n const isDisabledTestResult = canOfficerEdit ? false : true\r\n const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n return (\r\n \r\n \r\n \r\n {checkPermission.isUserAdmin() ? (\r\n (\r\n \r\n )}\r\n renderViewComponent={() => (\r\n \r\n )}\r\n fieldNames={ethicsFormResetList}\r\n isViewMode={true}\r\n onConfirm={() => confirmEditEthics(props, ethicsFormResetList)}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n await confirmEditDocResult(props, [\r\n 'isCompletelyDoc',\r\n 'resubmitDocDate',\r\n 'remark',\r\n ])\r\n }}\r\n onClickModeEdit={() => handleEditDocResult(props)}\r\n />\r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }\r\n : undefined\r\n }\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst VerifyDocument = (props: VerifyDocumentType) => {\r\n const verifyDocumentModel = useVerifyDocument(props)\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: 128,\r\n padding: 20,\r\n },\r\n titleFont: {\r\n color: '#BDBDBD',\r\n },\r\n contentFont: {\r\n fontWeight: 'bold',\r\n },\r\n}))\r\n\r\nexport default VerifyDocument\r\n","import ResearchDetail from '../../../../shareUI/ResearchDetail/researchDetail'\r\nimport DocumentTestResult from '../../../../shareUI/documentTestResult/documentTestResult'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport DesignateReviewer from '../../../../shareUI/designateReviewer/designateReviewer'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport { VerifyDocumentViewType, VerifyDocumentType } from './verifyDocumentType'\r\nimport useVerifyDocument from './useVerifyDocument'\r\nimport React from 'react'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport { Grid } from '@material-ui/core'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport EthicsForm from '../../../../shareUI/ethicsForm/ethicsForm'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\nimport { ethicsFormResetList } from '../../../../shareUI/ethicsForm/formResetList'\r\n\r\nconst VerifyDocumentView = (props: VerifyDocumentViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n projectData,\r\n isCompletely,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialUploadFile,\r\n projectDetailLabel,\r\n onRefDialog,\r\n onSubmitForm,\r\n onDirtyChange,\r\n checkUseUploadEdit,\r\n onClickBackToSearch,\r\n onChangeDocCompletely,\r\n confirmEditDocResult,\r\n confirmEditDocReviewer,\r\n handleEditDocResult,\r\n handleEditDocReviewer,\r\n confirmEditEthics,\r\n } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const { documentTopic } = manageProjectStore\r\n const checkPermission = useCheckPermission()\r\n const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n const isDisabledTestResult = canOfficerEdit ? false : true\r\n const isDisableReviewer = checkPermission.checkDisabledProjectReviewer(projectData)\r\n const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n const irb = manageProjectStore.projectData?.irb\r\n\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n return (\r\n \r\n \r\n \r\n {checkPermission.isUserAdmin() ? (\r\n (\r\n \r\n )}\r\n renderViewComponent={() => (\r\n \r\n )}\r\n fieldNames={ethicsFormResetList}\r\n isViewMode={true}\r\n onConfirm={() => confirmEditEthics(props, ethicsFormResetList)}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n await confirmEditDocResult(props, [\r\n 'isCompletelyDoc',\r\n 'resubmitDocDate',\r\n 'remark',\r\n ])\r\n }}\r\n onClickModeEdit={() => handleEditDocResult(props)}\r\n />\r\n \r\n {isCompletely && (\r\n \r\n {\r\n await confirmEditDocReviewer(props, ['reviewer'])\r\n }}\r\n onClickModeEdit={() => handleEditDocReviewer(props)}\r\n />\r\n \r\n )}\r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }\r\n : undefined\r\n }\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst VerifyDocument = (props: VerifyDocumentType) => {\r\n const verifyDocumentModel = useVerifyDocument(props)\r\n return \r\n}\r\nexport default VerifyDocument\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as memoMessageType from './memoMessageType'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { DataSourceType } from '../../../../../../control/treeCheckboxNew/treeCheckbox'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { dateForAPI } from '../../../../../../utilities/date'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\nimport * as Constant from '../../../../../../constants/constants'\r\nimport { validateModeAccordionError } from '../../../../../../utilities/validate'\r\n\r\nconst useMemomessageTerminate = (props: memoMessageType.UseMemoMessageType) => {\r\n const { onSaveComplete } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const editRef = React.useRef()\r\n const callLookup = useLookupService()\r\n const [terminateCauseList, setTerminateCause] = React.useState<{ id: number; name_th: string; name_en: string }[]>(\r\n [],\r\n )\r\n const [isCheckedOther, setIsCheckedOther] = React.useState(false)\r\n const [initialSuggestionNotice, setInitialSuggestionNotice] = React.useState()\r\n const [initialMemoMessagePaper, setInitialMemoMessagePaper] = React.useState<{\r\n TH: InitialRichTextEditorType\r\n EN: InitialRichTextEditorType\r\n }>()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n const [approveStatus, setApproveStatus] = React.useState([])\r\n\r\n const [approveStatusServiceResult, setApproveStatusServiceResult] = React.useState>([])\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n\r\n // }, [JSON.stringify(projectData)])\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getLutTerminateProjectCause()\r\n getApproveStatus()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getApproveStatus = async () => {\r\n let res\r\n if (projectData?.irb) {\r\n res = await callLookup.callApproveStatusLut(projectData?.irb, constSubmittedType.adverseEvent)\r\n if (res) {\r\n setApproveStatusServiceResult(res?.result ?? [])\r\n const formatedData = res?.result?.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n }) as []\r\n setApproveStatus(formatedData)\r\n }\r\n }\r\n }\r\n\r\n const getLutTerminateProjectCause = async () => {\r\n const res = await callLookup.getTerminateCause(1, 8)\r\n // const formatedData = res.result.map((itm: any) => {\r\n // return {\r\n // label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n // value: `${itm.id}`,\r\n // }\r\n // })\r\n\r\n setTerminateCause(res.result)\r\n }\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n if (submittedID) {\r\n const res = await callWebService.getProjectAdverseEventMemoMessage(submittedID)\r\n const result = res.result\r\n\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n approveStatus:\r\n result && result?.approveStatusInfo\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result?.approveStatusInfo.nameTH\r\n : result?.approveStatusInfo.nameEN,\r\n value: result?.approveStatusInfo.value.toString(),\r\n }\r\n : null,\r\n }\r\n\r\n const initialSugestionNotice = {\r\n contentHtml: result?.memoMessageComment_html ?? '',\r\n contentText: result?.memoMessageComment ?? '',\r\n }\r\n const initialMemoMessagePaper = {\r\n TH: {\r\n contentHtml: result?.memoMessagePaper_th_html ?? '',\r\n contentText: result?.memoMessagePaper_th ?? '',\r\n },\r\n EN: {\r\n contentHtml: result?.memoMessagePaper_en_html ?? '',\r\n contentText: result?.memoMessagePaper_en ?? '',\r\n },\r\n }\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n setInitialSuggestionNotice(initialSugestionNotice)\r\n setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.unSignPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.unSignPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n let param: REQServiceType.ProjectAdverseEventMemomessageType = {\r\n submittedID: submittedID,\r\n comment: value?.suggestionNotice?.contentText,\r\n comment_html: value?.suggestionNotice?.contentHtml,\r\n memoMessagePaper_th: value?.memoMessagePaper_TH?.contentText,\r\n memoMessagePaper_en: value?.memoMessagePaper_EN?.contentText,\r\n memoMessagePaper_th_html: value?.memoMessagePaper_TH?.contentHtml,\r\n memoMessagePaper_en_html: value?.memoMessagePaper_EN?.contentHtml,\r\n memoMessageDate: value?.memoMessageDate ? dateForAPI(value?.memoMessageDate) ?? null : null,\r\n approveStatusID: value?.approveStatus ? parseInt(value?.approveStatus.contentText) : null,\r\n isDraft: isDraft,\r\n }\r\n\r\n return param\r\n }\r\n\r\n const handleChangProjectType = (val: memoMessageType.OptType) => {\r\n if (parseInt(val?.value) === 3) {\r\n setRequired(false)\r\n } else {\r\n setRequired(true)\r\n }\r\n }\r\n\r\n const handleDirtyChange = (props: any) => {\r\n let isDirty: boolean = false\r\n let newFormValue = _.omit(props.values, ['memorandumFile'])\r\n let initValue = _.omit(\r\n {\r\n ...initialValues,\r\n memoMessagePaper_EN: initialMemoMessagePaper?.EN,\r\n memoMessagePaper_TH: initialMemoMessagePaper?.TH,\r\n suggestionNotice: initialSuggestionNotice,\r\n },\r\n ['submitType'],\r\n )\r\n\r\n const isEqual = _.isEqual(initValue, newFormValue)\r\n console.log(newFormValue)\r\n console.log(initValue)\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft = true\r\n const param: REQServiceType.ProjectAdverseEventMemomessageType = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleSubmitForm = (value: any) => {\r\n // if (projectData?.projectID && projectData?.submittedID) {\r\n // let isReviewer = false\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param: REQServiceType.ProjectAdverseEventMemomessageType = getSaveServiceParameter(isDraft)\r\n if (isDraft) {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.ProjectAdverseEventMemomessageType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n try {\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.projectAdverseEventMemoMessage(param)\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useMemomessageTerminate.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleClickCheckbox = (selectedItem: DataSourceType) => {\r\n if (selectedItem.id === 4) {\r\n setIsCheckedOther(!isCheckedOther)\r\n }\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n const handleChangeStatus = (val: any) => {\r\n const selectItem = approveStatusServiceResult?.filter(\r\n (status) => status.id.toString() === val?.value?.toString(),\r\n )?.[0]\r\n\r\n if (selectItem && selectItem?.id) {\r\n let fieldMemoMessagePaperTH = {\r\n contentHtml: formRef.current?.values?.memoMessagePaper_TH?.contentHtml ?? null,\r\n contentText: formRef.current?.values?.memoMessagePaper_TH?.contentText ?? null,\r\n }\r\n let fieldMemoMessagePaperEN = {\r\n contentHtml: formRef.current?.values?.memoMessagePaper_EN?.contentHtml ?? null,\r\n contentText: formRef.current?.values?.memoMessagePaper_EN?.value ?? null,\r\n }\r\n\r\n //TH {{---กรุณาเลือกผลการพิจารณา---}}\r\n if (fieldMemoMessagePaperTH.contentHtml && fieldMemoMessagePaperTH.contentHtml?.trim() !== '') {\r\n fieldMemoMessagePaperTH.contentHtml = fieldMemoMessagePaperTH.contentHtml.replaceAll(\r\n Constant.pleaseSelectApproveStatus.th,\r\n selectItem.name_th,\r\n )\r\n\r\n if (fieldMemoMessagePaperTH.contentText && fieldMemoMessagePaperTH.contentText?.trim() !== '') {\r\n fieldMemoMessagePaperTH.contentText = fieldMemoMessagePaperTH.contentText.replaceAll(\r\n Constant.pleaseSelectApproveStatus.th,\r\n selectItem.name_th,\r\n )\r\n }\r\n }\r\n\r\n //EN {{---กรุณาเลือกผลการพิจารณา---}}\r\n if (fieldMemoMessagePaperEN.contentHtml && fieldMemoMessagePaperEN.contentHtml?.trim() !== '') {\r\n fieldMemoMessagePaperEN.contentHtml = fieldMemoMessagePaperEN.contentHtml.replaceAll(\r\n Constant.pleaseSelectApproveStatus.en,\r\n selectItem.name_en,\r\n )\r\n\r\n if (fieldMemoMessagePaperEN.contentText && fieldMemoMessagePaperEN.contentText?.trim() !== '') {\r\n fieldMemoMessagePaperEN.contentText = fieldMemoMessagePaperEN.contentText.replaceAll(\r\n Constant.pleaseSelectApproveStatus.en,\r\n selectItem.name_en,\r\n )\r\n }\r\n }\r\n approveStatusServiceResult.forEach((status) => {\r\n if (fieldMemoMessagePaperTH.contentHtml && fieldMemoMessagePaperTH.contentHtml?.trim() !== '') {\r\n fieldMemoMessagePaperTH.contentHtml = fieldMemoMessagePaperTH.contentHtml.replaceAll(\r\n status.name_th,\r\n selectItem.name_th,\r\n )\r\n\r\n if (fieldMemoMessagePaperTH.contentText && fieldMemoMessagePaperTH.contentText?.trim() !== '') {\r\n fieldMemoMessagePaperTH.contentText = fieldMemoMessagePaperTH.contentText.replaceAll(\r\n status.name_th,\r\n selectItem.name_th,\r\n )\r\n }\r\n }\r\n\r\n if (fieldMemoMessagePaperEN.contentHtml && fieldMemoMessagePaperEN.contentHtml?.trim() !== '') {\r\n fieldMemoMessagePaperEN.contentHtml = fieldMemoMessagePaperEN.contentHtml.replaceAll(\r\n status.name_en,\r\n selectItem.name_en,\r\n )\r\n\r\n if (fieldMemoMessagePaperEN.contentText && fieldMemoMessagePaperEN.contentText?.trim() !== '') {\r\n fieldMemoMessagePaperEN.contentText = fieldMemoMessagePaperEN.contentText.replaceAll(\r\n status.name_en,\r\n selectItem.name_en,\r\n )\r\n }\r\n }\r\n })\r\n\r\n setInitialMemoMessagePaper({\r\n TH: {\r\n contentHtml: fieldMemoMessagePaperTH.contentHtml,\r\n contentText: fieldMemoMessagePaperTH.contentText,\r\n },\r\n EN: {\r\n contentHtml: fieldMemoMessagePaperEN.contentHtml,\r\n contentText: fieldMemoMessagePaperEN.contentText,\r\n },\r\n })\r\n\r\n // if (formRef.current) {\r\n // formRef.current.form.batch(() => {\r\n // if (formRef.current) {\r\n // formRef.current.form.change('memoMessagePaper_TH', fieldMemoMessagePaperTH)\r\n // formRef.current.form.change('memoMessagePaper_EN', fieldMemoMessagePaperEN)\r\n // }\r\n // }) // NOW all listeners notified\r\n // }\r\n }\r\n }\r\n\r\n const updateMemoMessage = async (param: REQServiceType.UpdateMemoMessageType) => {\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.updateMemoMessagePaper(param)\r\n\r\n if (res.result.status === 200) {\r\n dialogRef.current?.openDialog()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n setConfigDialog({})\r\n },\r\n })\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleSubmitUpdateMemo = (fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formRef.current)\r\n return new Promise(async (resolve, reject) => {\r\n if (isError) {\r\n formRef.current?.form.submit()\r\n reject('')\r\n } else {\r\n resolve('')\r\n const param: REQServiceType.UpdateMemoMessageType = {\r\n submittedID: Number(projectData?.submittedID),\r\n memoMessagePaperTH: formRef.current?.values.memoMessagePaper_TH.contentText,\r\n memoMessagePaperEN: formRef.current?.values.memoMessagePaper_EN.contentText,\r\n memoMessagePaperTHHTML: formRef.current?.values.memoMessagePaper_TH.contentHtml,\r\n memoMessagePaperENHTML: formRef.current?.values.memoMessagePaper_EN.contentHtml,\r\n }\r\n updateMemoMessage(param)\r\n }\r\n })\r\n }\r\n\r\n const handleCancle = () => {\r\n const valueMessageTH: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_TH`].contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_TH`].contentText,\r\n }\r\n const valueMessageEN: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_EN`].contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_EN`].contentText,\r\n }\r\n setInitialMemoMessagePaper((prev) => ({\r\n TH: {\r\n ...prev?.TH,\r\n ...valueMessageTH,\r\n },\r\n EN: {\r\n ...prev?.EN,\r\n ...valueMessageEN,\r\n },\r\n }))\r\n }\r\n\r\n const onClickEdit = () => {\r\n editRef.current = formRef.current?.form.getState().values\r\n }\r\n return {\r\n formRef,\r\n required,\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n approveStatus,\r\n isCheckedOther,\r\n isShowUpdateDate,\r\n terminateCauseList,\r\n initialMemorandumFile,\r\n initialMemoMessagePaper,\r\n initialSuggestionNotice,\r\n onRefDialog,\r\n onSubmitForm: handleSubmitForm,\r\n onDirtyChange: handleDirtyChange,\r\n onChangeStatus: handleChangeStatus,\r\n onClickCheckbox: handleClickCheckbox,\r\n onClickOpenFile: handleClickOpenFile,\r\n onChangProjectType: handleChangProjectType,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n }\r\n}\r\n\r\nexport default useMemomessageTerminate\r\n","import * as memoMessageType from './memoMessageType'\r\nimport useMemomessageTerminate from './useMemomessage'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport MyDatePicker from '../../../../../../control/datepicker/datepicker'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport MyAutocomplete from '../../../../../../control/autocomplete/autocomplete'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { richEditorRequired } from '../../../../../../utilities/validate'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n approveStatus,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialMemoMessagePaper,\r\n initialSuggestionNotice,\r\n onRefDialog,\r\n onSubmitForm,\r\n onChangeStatus,\r\n onDirtyChange,\r\n onClickOpenFile,\r\n onClickBackToSearch,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const latestFolderIdx = 0\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n const isEdit = isViewMode && currentSelectFolder\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n

\\n'\r\n ? [richEditorRequired(translate.get('MESSAGE.M015'))]\r\n : []\r\n }\r\n />\r\n
\r\n
\r\n )\r\n }\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_TH']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_TH'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_EN']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_EN'])}\r\n onCancel={handleCancle}\r\n onClickEdit={onClickEdit}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import * as memoMessageType from './memoMessageType'\r\nimport useMemomessageTerminate from './useMemomessage'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport MyDatePicker from '../../../../../../control/datepicker/datepicker'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport MyAutocomplete from '../../../../../../control/autocomplete/autocomplete'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { richEditorRequired } from '../../../../../../utilities/validate'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n approveStatus,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialMemoMessagePaper,\r\n initialSuggestionNotice,\r\n onRefDialog,\r\n onSubmitForm,\r\n onChangeStatus,\r\n onDirtyChange,\r\n onClickOpenFile,\r\n onClickBackToSearch,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const latestFolderIdx = 0\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n const isEdit = isViewMode && currentSelectFolder\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n

\\n'\r\n ? [richEditorRequired(translate.get('MESSAGE.M015'))]\r\n : []\r\n }\r\n />\r\n
\r\n
\r\n )\r\n }\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_TH']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_TH'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_EN']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_EN'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import VerifyDocumentREC1 from '../../../page/verifyDocument/adverseEvent/verifyDocumentREC1'\r\nimport VerifyDocumentREC2 from '../../../page/verifyDocument/adverseEvent/verifyDocumentREC2'\r\nimport MemoMessageREC1 from '../../../page/memoMessage/adverseEvent/memoMessageREC1'\r\nimport MemoMessageREC2 from '../../../page/memoMessage/adverseEvent/memoMessageREC2'\r\n\r\nimport { OfficerType } from './officerType'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport SignREC2 from '../../../page/sign/signMemoMessage/signREC2'\r\nimport SignREC1 from '../../../page/sign/signMemoMessage/signREC1'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC1'\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab11.id:\r\n // code block\r\n return (\r\n \r\n )\r\n\r\n // case Constants.menuTab.tab26.id:\r\n // return (\r\n // \r\n // )\r\n default:\r\n return <>\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n return (\r\n \r\n )\r\n\r\n // case Constants.menuTab.tab2.id:\r\n // // code block\r\n // // return
กำหนดประเภทโครงการและกรรมการ REC2
\r\n // return (\r\n // (manageProjectStore?.projectData && (\r\n // \r\n // )) || <>\r\n // )\r\n // case Constants.menuTab.tab3.id:\r\n // /// code block กำหนดชุดโครงการที่ต้องส่ง\r\n // return \r\n // case Constants.menuTab.tab4.id:\r\n // // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n // return \r\n // case Constants.menuTab.tab5.id:\r\n // // code block บันทึกข้อคิดเห็นของกรรมการ\r\n // return \r\n\r\n // case Constants.menuTab.tab6.id:\r\n // // code block\r\n\r\n // return \r\n // case Constants.menuTab.tab7.id:\r\n // // code block\r\n // return \r\n\r\n // case Constants.menuTab.tab8.id:\r\n // // code block\r\n // return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab11.id:\r\n // code block\r\n return (\r\n \r\n )\r\n // case Constants.menuTab.tab26.id:\r\n // return (\r\n // \r\n // )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useTerminateProject from './useAdverseEvent'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\n\r\ntype RequestNewProjectViewType = ReturnType & Omit\r\nconst RequestProjectRenewalView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n onClickCloseProject,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const isAdmin = checkPermission.isUserAdmin()\r\n const isStatusComplete = projectData && projectData?.projectStatusInfo?.value === 2\r\n const isShowCloseProjectButton = isStatusComplete && isAdmin\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {/* \r\n {isViewMode && isShowCloseProjectButton && (\r\n \r\n {translate.get('BUTTON.CLOSE_PROJECT')}\r\n \r\n )}\r\n */}\r\n {isViewMode && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type RequestProjectRenewalType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst RequestProjectRenewal: React.FC = (props) => {\r\n const requestProjectRenewalModel = useTerminateProject(props)\r\n return \r\n}\r\nexport default RequestProjectRenewal\r\n","import React from 'react'\r\nimport { RequestProjectRenewalType } from './adverseEvent'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\n\r\nexport default (props: RequestProjectRenewalType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n const loadingHook = useLoading()\r\n\r\n React.useEffect(() => {\r\n console.log('####ADVERSE EVENT####')\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\n","import { useEffect, useRef, useState } from 'react'\r\nimport { useRouteMatch } from 'react-router-dom'\r\n\r\nimport { ProjectManagerType } from './projectManager'\r\nimport { RoutePath } from '../../../router/routesConfig'\r\nimport { decryptionAES } from '../../../utilities/encryption'\r\n\r\nimport useWebService from '../../../services/web/useWebService'\r\n\r\nimport useLoading from '../../../control/loading/useLoading'\r\nimport useManageProjectStore from '../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../stores/manageProject/useManageProjectAction'\r\nimport useAppFolderAndTabStore from '../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useCheckPermission from '../../../utilities/checkPermission'\r\nimport * as Constants from '../../../constants/constants'\r\nimport constSubmittedType from '../../../constants/submittedType'\r\nimport { DialogType } from '../../../control/dialog/dialog'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useFolderAndTab from './useFolderAndTab'\r\nimport * as RESWebServiceType from '../../../services/web/types/responseWebServiceTypes'\r\nimport constSubmittedStep from '../../../constants/submittedStep'\r\nimport { customFolder } from '../../../constants/constants'\r\nimport useHistoryAction from '../../../stores/history/useHistoryAction'\r\nimport submittedType from '../../../constants/submittedType'\r\n\r\ntype MatchParams = {\r\n projectID: string\r\n submittedID: string\r\n}\r\n\r\nconst useProjectManager = (props: ProjectManagerType) => {\r\n const {} = props\r\n const matchPath = useRouteMatch(RoutePath.manageProjectEdit)\r\n const encryptedProjectID = matchPath ? matchPath.params.projectID : null\r\n const projectID = encryptedProjectID ? decryptionAES(encryptedProjectID) : null\r\n const encryptedSubmittedID = matchPath ? matchPath.params.submittedID : null\r\n const submittedID = encryptedSubmittedID ? decryptionAES(encryptedSubmittedID) : null\r\n\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const { callbackDirty } = appFolderAndTabStore\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const historyStoreAction = useHistoryAction()\r\n\r\n const checkPermission = useCheckPermission()\r\n const callWebService = useWebService()\r\n const loadingStore = useLoading()\r\n const folderAndTabHook = useFolderAndTab()\r\n\r\n const dialogRequestConsiderDocRef = useRef()\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogRef = useRef>()\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const firstRender = useRef(true)\r\n const appFolderAndTabStoreRef = useRef()\r\n\r\n const translate = useTranslate()\r\n\r\n useEffect(() => {\r\n appFolderAndTabStoreRef.current = appFolderAndTabStore\r\n })\r\n\r\n useEffect(() => {\r\n if (firstRender.current && projectID && submittedID) {\r\n firstRender.current = false\r\n getProjectByID(Number(projectID), Number(submittedID))\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n return () => {\r\n manageProjectAction.clearStore()\r\n appFolderAndTabAction.clearStore()\r\n }\r\n }, [])\r\n\r\n const getMode = () => {\r\n let mode: 'CREATE' | 'EDIT' = 'CREATE'\r\n if (projectID && submittedID) {\r\n mode = 'EDIT'\r\n }\r\n\r\n return mode\r\n }\r\n\r\n const getProjectByID = async (projectID: number, submittedID: number) => {\r\n loadingStore.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectID, submittedID)\r\n if (result) {\r\n manageProjectAction.setProjectData(result)\r\n historyStoreAction.updateDisplayHistory(submittedID)\r\n }\r\n loadingStore.loadingClose()\r\n\r\n return result\r\n }\r\n\r\n const isCustomFolder = (selectedFolderID: number) => {\r\n const lstCustomFolderID: Array = Object.keys(Constants.customFolder).map((key) => {\r\n const lstCustomFolder = Constants.customFolder as any\r\n return Number(lstCustomFolder[key].id)\r\n })\r\n const isCustomFolder: boolean = lstCustomFolderID.indexOf(selectedFolderID ?? NaN) !== -1\r\n return isCustomFolder\r\n }\r\n\r\n const getCustomFolderSubmitTypeInfo = (selectedFolder: any) => {\r\n switch (selectedFolder?.id) {\r\n case Constants.customFolder.closeProject.id:\r\n return {\r\n value: constSubmittedType.closeProject,\r\n nameTH: customFolder.closeProject.folderName_th,\r\n nameEN: customFolder.closeProject.folderName_en,\r\n }\r\n case Constants.customFolder.projectPhase.id:\r\n return {\r\n value: constSubmittedType.amendmentProject,\r\n nameTH: customFolder.projectPhase.folderName_th,\r\n nameEN: customFolder.projectPhase.folderName_en,\r\n }\r\n case Constants.customFolder.projectAmendment.id:\r\n return {\r\n value: constSubmittedType.amendmentProject,\r\n nameTH: customFolder.projectAmendment.folderName_th,\r\n nameEN: customFolder.projectAmendment.folderName_en,\r\n }\r\n case Constants.customFolder.projectRenewal.id:\r\n return {\r\n value: constSubmittedType.renewalProject,\r\n nameTH: customFolder.projectRenewal.folderName_th,\r\n nameEN: customFolder.projectRenewal.folderName_en,\r\n }\r\n case Constants.customFolder.terminateProject.id:\r\n return {\r\n value: constSubmittedType.terminateProject,\r\n nameTH: customFolder.terminateProject.folderName_th,\r\n nameEN: customFolder.terminateProject.folderName_en,\r\n }\r\n case Constants.customFolder.adverseEvents.id:\r\n return {\r\n value: constSubmittedType.adverseEvent,\r\n nameTH: customFolder.adverseEvents.folderName_th,\r\n nameEN: customFolder.adverseEvents.folderName_en,\r\n }\r\n case Constants.customFolder.raeProject.id:\r\n return {\r\n value: constSubmittedType.nonconformance,\r\n nameTH: customFolder.raeProject.folderName_th,\r\n nameEN: customFolder.raeProject.folderName_en,\r\n }\r\n case Constants.customFolder.closeProjectByAdmin.id:\r\n return {\r\n value: constSubmittedType.closeProjectByAdmin,\r\n nameTH: customFolder.closeProjectByAdmin.folderName_th,\r\n nameEN: customFolder.closeProjectByAdmin.folderName_en,\r\n }\r\n case Constants.customFolder.terminateProjectByAdmin.id:\r\n return {\r\n value: constSubmittedType.terminateProjectByAdmin,\r\n nameTH: customFolder.terminateProjectByAdmin.folderName_th,\r\n nameEN: customFolder.terminateProjectByAdmin.folderName_en,\r\n }\r\n case Constants.customFolder.withdrawProject.id:\r\n return {\r\n value: constSubmittedType.withdrawalProject,\r\n nameTH: customFolder.withdrawProject.folderName_th,\r\n nameEN: customFolder.withdrawProject.folderName_en,\r\n }\r\n case Constants.customFolder.withdrawSubmitted.id:\r\n return {\r\n value: constSubmittedType.withdrawalSubmitted,\r\n nameTH: customFolder.withdrawSubmitted.folderName_th,\r\n nameEN: customFolder.withdrawSubmitted.folderName_en,\r\n }\r\n default:\r\n return null\r\n }\r\n }\r\n const loadCustomFolderData = async (selectedFolder: any) => {\r\n const projectID = manageProjectStore.projectData?.projectID\r\n const folderListLen = appFolderAndTabStore.folderList?.length ?? 0\r\n const latestFolderIdx = folderListLen - 1 > 0 ? 1 : 0\r\n const latestFolder = appFolderAndTabStore.folderList[latestFolderIdx] // example : [customFolder, serverFolder1, serverFolder2]\r\n const submittedID = latestFolder.submittedID\r\n if (projectID && submittedID) {\r\n loadingStore.loadingOpen()\r\n const lstFolder = appFolderAndTabStore.folderList.map((itm) => ({\r\n ...itm,\r\n isLastProcess: itm.id === selectedFolder.id,\r\n }))\r\n const updFolderAndTab = { ...appFolderAndTabStore, folderList: lstFolder, folderSelected: selectedFolder }\r\n appFolderAndTabAction.setState(updFolderAndTab)\r\n\r\n const response = await callWebService.getProjectByID(projectID, submittedID)\r\n const projectResult = response.result\r\n const submittedTypeInfo = getCustomFolderSubmitTypeInfo(selectedFolder) ?? projectResult.submitTypeInfo\r\n let customProjectRes: Partial | undefined\r\n if (projectResult) {\r\n customProjectRes = {\r\n ...projectResult,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: submittedTypeInfo,\r\n }\r\n }\r\n\r\n manageProjectAction.setState({\r\n projectData: customProjectRes as RESWebServiceType.GetProjectResultType,\r\n })\r\n\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n folderAndTabHook.loadTabAndFolder(\r\n customProjectRes as RESWebServiceType.GetProjectResultType,\r\n updFolderAndTab,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n\r\n loadingStore.loadingClose()\r\n }\r\n }\r\n\r\n const changeFolderProcess = async (selectedFolder: any) => {\r\n const projectID = manageProjectStore.projectData?.projectID\r\n let submittedID = selectedFolder.submittedID\r\n\r\n if (isCustomFolder(selectedFolder.id)) {\r\n loadCustomFolderData(selectedFolder)\r\n } else {\r\n if (projectID && submittedID) {\r\n const lstFolder = appFolderAndTabStore.folderList.map((itm) => ({\r\n ...itm,\r\n isLastProcess: itm.id === selectedFolder.id,\r\n }))\r\n const updFolderAndTab = {\r\n ...appFolderAndTabStore,\r\n folderList: lstFolder,\r\n folderSelected: selectedFolder,\r\n }\r\n appFolderAndTabAction.setState(updFolderAndTab)\r\n const result = await getProjectByID(projectID, selectedFolder.submittedID)\r\n\r\n const isReloadProjectData = false\r\n folderAndTabHook.loadTabAndFolder(\r\n result as RESWebServiceType.GetProjectResultType,\r\n updFolderAndTab,\r\n isReloadProjectData,\r\n )\r\n }\r\n }\r\n }\r\n\r\n const onClickRequestConsider = () => {\r\n //Click ยื่นเอกสารเพื่อพิจารณา\r\n dialogRequestConsiderDocRef.current?.open()\r\n }\r\n\r\n const manageClickActionFolder = (id: number) => {\r\n if (id === Constants.customFolder.docAdditional.id) {\r\n //Click ยื่นเอกสารเพื่อพิจารณา\r\n onClickRequestConsider()\r\n }\r\n }\r\n\r\n const handleClickFolder = (selectedFolder: any) => {\r\n const { folderSelected, tabDirty, tabSelected } = appFolderAndTabStore\r\n if (folderAndTabHook.isActionFolder(selectedFolder.id)) {\r\n manageClickActionFolder(selectedFolder.id)\r\n } else {\r\n if (selectedFolder.id === folderSelected?.id) return\r\n\r\n if (tabDirty) {\r\n dialogRef.current?.openDialog()\r\n if (\r\n tabSelected.id === Constants.menuTab.tab10.id ||\r\n folderSelected.submittedTypeID === submittedType.withdrawalSubmitted\r\n ) {\r\n //กรณีเป็นแท็บลงนามแทนและการถอนยื่นจะไม่มี saveDraft จึงให้เป็นการเปลี่ยน tab โดยไม่ต้องบันทึกข้อมูล\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n changeFolderProcess(selectedFolder)\r\n dialogRef.current?.closeDialog()\r\n },\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_DRAFT_BEFORE_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n if (callbackDirty) {\r\n callbackDirty()\r\n }\r\n changeFolderProcess(selectedFolder)\r\n dialogRef.current?.closeDialog()\r\n },\r\n })\r\n }\r\n } else {\r\n changeFolderProcess(selectedFolder)\r\n }\r\n }\r\n }\r\n return {\r\n projectMode: getMode(),\r\n dialogRequestConsiderDocRef,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onClickFolder: handleClickFolder,\r\n onRefDialog: onRefDialog,\r\n }\r\n}\r\n\r\nexport default useProjectManager\r\n","import { useRef, useEffect, useState } from 'react'\r\nimport { RequestConsiderDocType, RequestConsiderDocViewType } from './requestConsiderDoc'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\n\r\n//Hook Service\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\n\r\n//Store & Action\r\nimport useAppFolderAndTabStore, * as appFolderAndTabStoreType from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\n// import useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport { GetProjectResultType } from '../../../../../services/web/types/responseWebServiceTypes'\r\n// import { ResultDocumentTopicLut } from '../../../../../services/lookup/types/responseLookupServiceTypes'\r\n// import { topicForLecturer, topicForStudent } from '../../../../../constants/constants'\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\n\r\nconst useSubmitDocConsider = (props: RequestConsiderDocType) => {\r\n const { bindRef } = props\r\n\r\n const [lstOption, setLSTOption] = useState([])\r\n\r\n const dialogRef = useRef<{ open: Function; close: Function }>()\r\n // const checkPermission = useCheckPermission()\r\n const authenStore = useAuthenStore()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n // const isAdmin = checkPermission.isUserAdmin()\r\n const translate = useTranslate()\r\n\r\n // const checkPermission = useCheckPermission()\r\n\r\n const callWebService = useWebService()\r\n const callLookupService = useLookupService()\r\n\r\n useEffect(() => {\r\n loadLookupRequestConsiderDoc()\r\n }, [\r\n manageProjectStore?.projectData?.projectID,\r\n manageProjectStore?.projectData?.projectStatusInfo?.value,\r\n translate.languageStore.currentLanguage,\r\n ])\r\n\r\n const loadLookupRequestConsiderDoc = async () => {\r\n try {\r\n loadingHook.loadingOpen()\r\n const userGroupID = authenStore?.profile?.userGroupId\r\n const projectID = manageProjectStore?.projectData?.projectID\r\n\r\n if (userGroupID && projectID) {\r\n const res = await callLookupService.getRequestConsiderDoc(userGroupID, projectID)\r\n const formatLookup = res.result.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n setLSTOption(formatLookup)\r\n }\r\n loadingHook.loadingClose()\r\n } catch (ex) {\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const createFolderCloseProject = async () => {\r\n const projectData = manageProjectStore.projectData\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n const cloneFolderList: Array = [\r\n { ...Constants.customFolder.closeProject, isLastProcess: true },\r\n ...appFolderAndTabStore.folderList.map((itm) => ({ ...itm, isLastProcess: false })),\r\n ]\r\n\r\n if (projectData?.projectID && latestFolder?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n let customResult: Partial | null = null\r\n customResult = {\r\n ...result,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: {\r\n value: constSubmittedType.closeProject,\r\n nameTH: Constants.customFolder.closeProject.folderName_th,\r\n nameEN: Constants.customFolder.closeProject.folderName_en,\r\n },\r\n }\r\n manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n //SetFolder\r\n const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n appFolderAndTabAction.setState({\r\n folderList: folder,\r\n folderSelected: Constants.customFolder.closeProject,\r\n tabSelected: Constants.menuTab.tab21,\r\n tabRenderList: [Constants.menuTab.tab21],\r\n tabIndexSelected: 0,\r\n })\r\n loadingHook.loadingClose()\r\n }\r\n\r\n dialogRef.current?.close()\r\n }\r\n\r\n const createFolderNextPhaseProject = async () => {\r\n const projectData = manageProjectStore.projectData\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n\r\n const folderList = appFolderAndTabStore.folderList.map((itm) => ({\r\n ...itm,\r\n isLastProcess: false,\r\n }))\r\n\r\n const cloneFolderList: Array = [\r\n {\r\n ...Constants.customFolder.projectPhase,\r\n isLastProcess: true,\r\n },\r\n ...folderList,\r\n ]\r\n\r\n if (projectData?.projectID && latestFolder?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n\r\n let customResult: Partial | null = null\r\n\r\n customResult = {\r\n ...result,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: {\r\n value: constSubmittedType.nextPhaseProject,\r\n nameTH: Constants.customFolder.projectPhase.folderName_th,\r\n nameEN: Constants.customFolder.projectPhase.folderName_en,\r\n },\r\n }\r\n\r\n manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n //SetFolder\r\n const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n\r\n appFolderAndTabAction.setState({\r\n folderList: folder,\r\n folderSelected: {\r\n ...Constants.customFolder.projectPhase,\r\n },\r\n tabSelected: Constants.menuTab.tab21,\r\n tabRenderList: [Constants.menuTab.tab21],\r\n })\r\n loadingHook.loadingClose()\r\n }\r\n dialogRef.current?.close()\r\n }\r\n\r\n const createFolderReportedAdverseEventsProject = async () => {\r\n //เหตุการณ์ไม่เป็นไปตามข้อกำหนด\r\n const projectData = manageProjectStore.projectData\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n const folderList = appFolderAndTabStore.folderList.map((itm) => ({\r\n ...itm,\r\n isLastProcess: false,\r\n }))\r\n const cloneFolderList: Array = [\r\n {\r\n ...Constants.customFolder.raeProject,\r\n isLastProcess: true,\r\n },\r\n ...folderList,\r\n ]\r\n\r\n if (projectData?.projectID && latestFolder?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n let customResult: Partial | null = null\r\n customResult = {\r\n ...result,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: {\r\n value: constSubmittedType.nonconformance,\r\n nameTH: Constants.customFolder.raeProject.folderName_th,\r\n nameEN: Constants.customFolder.raeProject.folderName_en,\r\n },\r\n }\r\n manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n //SetFolder\r\n const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n appFolderAndTabAction.setState({\r\n folderList: folder,\r\n folderSelected: Constants.customFolder.raeProject,\r\n tabSelected: Constants.menuTab.tab1,\r\n tabRenderList: [Constants.menuTab.tab1],\r\n tabIndexSelected: 0,\r\n })\r\n loadingHook.loadingClose()\r\n }\r\n\r\n dialogRef.current?.close()\r\n }\r\n\r\n const createFolderProjectAmendment = async () => {\r\n // loadingHook.loadingOpen()\r\n const projectData = manageProjectStore.projectData\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n const folderList = appFolderAndTabStore.folderList.map((itm) => ({\r\n ...itm,\r\n isLastProcess: false,\r\n }))\r\n const cloneFolderList: Array = [\r\n {\r\n ...Constants.customFolder.projectAmendment,\r\n isLastProcess: true,\r\n },\r\n ...folderList,\r\n ]\r\n if (projectData?.projectID && latestFolder?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n let customResult: Partial | null = null\r\n\r\n customResult = {\r\n ...result,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: {\r\n value: constSubmittedType.amendmentProject,\r\n nameTH: Constants.customFolder.projectAmendment.folderName_th,\r\n nameEN: Constants.customFolder.projectAmendment.folderName_en,\r\n },\r\n }\r\n manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n //SetFolder\r\n const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n appFolderAndTabAction.setState({\r\n folderList: folder,\r\n folderSelected: {\r\n ...Constants.customFolder.projectAmendment,\r\n },\r\n tabSelected: Constants.menuTab.tab21,\r\n tabRenderList: [Constants.menuTab.tab21],\r\n })\r\n loadingHook.loadingClose()\r\n }\r\n\r\n dialogRef.current?.close()\r\n }\r\n\r\n const createFolderProjectRenewal = async () => {\r\n const projectData = manageProjectStore.projectData\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n\r\n const folderList = appFolderAndTabStore.folderList.map((itm) => ({\r\n ...itm,\r\n isLastProcess: false,\r\n }))\r\n\r\n const cloneFolderList: Array = [\r\n {\r\n ...Constants.customFolder.projectRenewal,\r\n isLastProcess: true,\r\n },\r\n ...folderList,\r\n ]\r\n\r\n if (projectData?.projectID && latestFolder?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n\r\n let customResult: Partial | null = null\r\n customResult = {\r\n ...result,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: {\r\n value: constSubmittedType.renewalProject,\r\n nameTH: Constants.customFolder.projectRenewal.folderName_th,\r\n nameEN: Constants.customFolder.projectRenewal.folderName_en,\r\n },\r\n }\r\n manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n //SetFolder\r\n const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n\r\n appFolderAndTabAction.setState({\r\n folderList: folder,\r\n folderSelected: {\r\n ...Constants.customFolder.projectRenewal,\r\n },\r\n tabSelected: Constants.menuTab.tab21,\r\n tabRenderList: [Constants.menuTab.tab21],\r\n })\r\n loadingHook.loadingClose()\r\n }\r\n dialogRef.current?.close()\r\n }\r\n\r\n const createFolderTerminateProject = async () => {\r\n const projectData = manageProjectStore.projectData\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n\r\n const folderList = appFolderAndTabStore.folderList.map((itm) => ({\r\n ...itm,\r\n isLastProcess: false,\r\n }))\r\n\r\n const cloneFolderList: Array = [\r\n {\r\n ...Constants.customFolder.terminateProject,\r\n isLastProcess: true,\r\n },\r\n ...folderList,\r\n ]\r\n\r\n if (projectData?.projectID && latestFolder?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n\r\n let customResult: Partial | null = null\r\n customResult = {\r\n ...result,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: {\r\n value: constSubmittedType.terminateProject,\r\n nameTH: Constants.customFolder.terminateProject.folderName_th,\r\n nameEN: Constants.customFolder.terminateProject.folderName_en,\r\n },\r\n }\r\n manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n //SetFolder\r\n const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n\r\n appFolderAndTabAction.setState({\r\n folderList: folder,\r\n folderSelected: {\r\n ...Constants.customFolder.terminateProject,\r\n },\r\n tabSelected: Constants.menuTab.tab21,\r\n tabRenderList: [Constants.menuTab.tab21],\r\n })\r\n loadingHook.loadingClose()\r\n }\r\n dialogRef.current?.close()\r\n }\r\n\r\n const createFolderAdverseEvents = async () => {\r\n const projectData = manageProjectStore.projectData\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n\r\n const folderList = appFolderAndTabStore.folderList.map((itm) => ({\r\n ...itm,\r\n isLastProcess: false,\r\n }))\r\n\r\n const cloneFolderList: Array = [\r\n {\r\n ...Constants.customFolder.adverseEvents,\r\n isLastProcess: true,\r\n },\r\n ...folderList,\r\n ]\r\n\r\n if (projectData?.projectID && latestFolder?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n\r\n let customResult: Partial | null = null\r\n customResult = {\r\n ...result,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: {\r\n value: constSubmittedType.adverseEvent,\r\n nameTH: Constants.customFolder.adverseEvents.folderName_th,\r\n nameEN: Constants.customFolder.adverseEvents.folderName_en,\r\n },\r\n }\r\n manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n //SetFolder\r\n const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n\r\n appFolderAndTabAction.setState({\r\n folderList: folder,\r\n folderSelected: {\r\n ...Constants.customFolder.adverseEvents,\r\n },\r\n tabSelected: Constants.menuTab.tab21,\r\n tabRenderList: [Constants.menuTab.tab21],\r\n })\r\n loadingHook.loadingClose()\r\n }\r\n dialogRef.current?.close()\r\n }\r\n\r\n const createFolderCloseProjectByAdmin = async () => {\r\n const projectData = manageProjectStore.projectData\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n const folderList = appFolderAndTabStore.folderList.map((itm) => ({\r\n ...itm,\r\n isLastProcess: false,\r\n }))\r\n const cloneFolderList: Array = [\r\n {\r\n ...Constants.customFolder.closeProjectByAdmin,\r\n isLastProcess: true,\r\n },\r\n ...folderList,\r\n ]\r\n\r\n if (projectData?.projectID && latestFolder?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n let customResult: Partial | null = null\r\n customResult = {\r\n ...result,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: {\r\n value: constSubmittedType.closeProjectByAdmin,\r\n nameTH: Constants.customFolder.closeProjectByAdmin.folderName_th,\r\n nameEN: Constants.customFolder.closeProjectByAdmin.folderName_en,\r\n },\r\n }\r\n manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n //SetFolder\r\n const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n appFolderAndTabAction.setState({\r\n folderList: folder,\r\n folderSelected: Constants.customFolder.closeProjectByAdmin,\r\n tabSelected: Constants.menuTab.tab1,\r\n tabRenderList: [Constants.menuTab.tab1],\r\n tabIndexSelected: 0,\r\n })\r\n loadingHook.loadingClose()\r\n }\r\n\r\n dialogRef.current?.close()\r\n }\r\n\r\n const createFolderTerminateProjectByAdmin = async () => {\r\n const projectData = manageProjectStore.projectData\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n const folderList = appFolderAndTabStore.folderList.map((itm) => ({\r\n ...itm,\r\n isLastProcess: false,\r\n }))\r\n const cloneFolderList: Array = [\r\n {\r\n ...Constants.customFolder.terminateProjectByAdmin,\r\n isLastProcess: true,\r\n },\r\n ...folderList,\r\n ]\r\n\r\n if (projectData?.projectID && latestFolder?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n let customResult: Partial | null = null\r\n customResult = {\r\n ...result,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: {\r\n value: constSubmittedType.terminateProjectByAdmin,\r\n nameTH: Constants.customFolder.terminateProjectByAdmin.folderName_th,\r\n nameEN: Constants.customFolder.terminateProjectByAdmin.folderName_en,\r\n },\r\n }\r\n manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n //SetFolder\r\n const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n appFolderAndTabAction.setState({\r\n folderList: folder,\r\n folderSelected: Constants.customFolder.terminateProjectByAdmin,\r\n tabSelected: Constants.menuTab.tab21,\r\n tabRenderList: [Constants.menuTab.tab21],\r\n tabIndexSelected: 0,\r\n })\r\n loadingHook.loadingClose()\r\n }\r\n\r\n dialogRef.current?.close()\r\n }\r\n\r\n const createFolderWithdrawProject = async () => {\r\n const projectData = manageProjectStore.projectData\r\n const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n const cloneFolderList: Array = [\r\n { ...Constants.customFolder.withdrawProject, isLastProcess: true },\r\n ...appFolderAndTabStore.folderList.map((itm) => ({ ...itm, isLastProcess: false })),\r\n ]\r\n\r\n if (projectData?.projectID && latestFolder?.submittedID) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n let customResult: Partial | null = null\r\n customResult = {\r\n ...result,\r\n submittedID: undefined,\r\n stepID: constSubmittedStep.submit,\r\n latestDocument: [],\r\n documentInfo: [],\r\n isFlowApproveWithComment: false,\r\n synthesisApproveStatusInfo: undefined,\r\n submitTypeInfo: {\r\n value: constSubmittedType.withdrawalProject,\r\n nameTH: Constants.customFolder.withdrawProject.folderName_th,\r\n nameEN: Constants.customFolder.withdrawProject.folderName_en,\r\n },\r\n }\r\n manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n //SetFolder\r\n const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n appFolderAndTabAction.setState({\r\n folderList: folder,\r\n folderSelected: Constants.customFolder.withdrawProject,\r\n tabSelected: Constants.menuTab.tab21,\r\n tabRenderList: [Constants.menuTab.tab21],\r\n tabIndexSelected: 0,\r\n })\r\n loadingHook.loadingClose()\r\n }\r\n\r\n dialogRef.current?.close()\r\n }\r\n\r\n // const createFolderWithdrawSubmitted = async () => {\r\n // const projectData = manageProjectStore.projectData\r\n // const latestFolder: appFolderAndTabStoreType.FolderType = appFolderAndTabStore.folderList[0]\r\n // const cloneFolderList: Array = [\r\n // { ...Constants.customFolder.withdrawSubmitted, isLastProcess: true },\r\n // ...appFolderAndTabStore.folderList.map((itm) => ({ ...itm, isLastProcess: false })),\r\n // ]\r\n\r\n // if (projectData?.projectID && latestFolder?.submittedID) {\r\n // loadingHook.loadingOpen()\r\n // const { result } = await callWebService.getProjectByID(projectData.projectID, latestFolder.submittedID)\r\n // let customResult: Partial | null = null\r\n // customResult = {\r\n // ...result,\r\n // submittedID: undefined,\r\n // stepID: constSubmittedStep.submit,\r\n // latestDocument: [],\r\n // documentInfo: [],\r\n // isFlowApproveWithComment: false,\r\n // synthesisApproveStatusInfo: undefined,\r\n // submitTypeInfo: {\r\n // value: constSubmittedType.withdrawalSubmitted,\r\n // nameTH: Constants.customFolder.withdrawSubmitted.folderName_th,\r\n // nameEN: Constants.customFolder.withdrawSubmitted.folderName_en,\r\n // },\r\n // }\r\n // manageProjectAction.setProjectData(customResult as GetProjectResultType)\r\n\r\n // //SetFolder\r\n // const folder = cloneFolderList?.filter((itm: any) => itm.id !== Constants.customFolder.docAdditional.id)\r\n // //แบบนี้ลดจำนวนการ render ลดการเกิดการไม่ทันกันของข้อมูล\r\n // appFolderAndTabAction.setState({\r\n // folderList: folder,\r\n // folderSelected: Constants.customFolder.withdrawSubmitted,\r\n // tabSelected: Constants.menuTab.tab21,\r\n // tabRenderList: [Constants.menuTab.tab21],\r\n // tabIndexSelected: 0,\r\n // })\r\n // loadingHook.loadingClose()\r\n // }\r\n\r\n // dialogRef.current?.close()\r\n // }\r\n\r\n const handleRefDialog = (fn: Record) => {\r\n dialogRef.current = {\r\n open: fn?.openDialog,\r\n close: fn?.closeDialog,\r\n }\r\n bindRef.current = dialogRef.current\r\n }\r\n\r\n const handleClickSave = (param: any) => {\r\n const submitTypeID: number = Number(param.projectSubmitType.value)\r\n switch (submitTypeID) {\r\n case constSubmittedType.closeProject:\r\n createFolderCloseProject()\r\n break\r\n case constSubmittedType.amendmentProject: //แก้ไขโครงการ\r\n createFolderProjectAmendment()\r\n break\r\n case constSubmittedType.nextPhaseProject:\r\n createFolderNextPhaseProject()\r\n break\r\n case constSubmittedType.nonconformance:\r\n createFolderReportedAdverseEventsProject()\r\n break\r\n case constSubmittedType.renewalProject:\r\n createFolderProjectRenewal()\r\n break\r\n case constSubmittedType.terminateProject:\r\n createFolderTerminateProject()\r\n break\r\n case constSubmittedType.adverseEvent:\r\n createFolderAdverseEvents()\r\n break\r\n case constSubmittedType.terminateProjectByAdmin:\r\n createFolderTerminateProjectByAdmin()\r\n break\r\n case constSubmittedType.closeProjectByAdmin:\r\n createFolderCloseProjectByAdmin()\r\n break\r\n case constSubmittedType.withdrawalProject:\r\n createFolderWithdrawProject()\r\n break\r\n // case constSubmittedType.withdrawalSubmitted:\r\n // createFolderWithdrawSubmitted()\r\n // break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n const handleClickClose = () => {\r\n dialogRef.current?.close()\r\n }\r\n\r\n // const filterTopicUpload = (documentTopic: ResultDocumentTopicLut[]) => {\r\n // let docTopic: ResultDocumentTopicLut[] = []\r\n // const researcherTypeID = manageProjectStore?.projectData?.researcherTypeInfo.value\r\n\r\n // if (documentTopic) {\r\n // let isDocTopic = documentTopic\r\n // if (researcherTypeID === 1) {\r\n // topicForLecturer.forEach((element) => {\r\n // docTopic = documentTopic?.filter((item) => {\r\n // return item.id !== element.id\r\n // })\r\n // })\r\n // } else {\r\n // topicForStudent.forEach((element) => {\r\n // docTopic = isDocTopic?.filter((item) => {\r\n // return item.id !== element.id\r\n // })\r\n // isDocTopic = docTopic\r\n // })\r\n // }\r\n // if (docTopic.length > 1) {\r\n // docTopic = docTopic?.map((itm, index: number) => {\r\n // return { ...itm, no: index + 1 }\r\n // })\r\n // manageProjectAction.setDocumentTopic(docTopic)\r\n // }\r\n // }\r\n // }\r\n\r\n return {\r\n lstOption: lstOption,\r\n onRefDialog: handleRefDialog,\r\n onClickClose: handleClickClose,\r\n onClickSave: handleClickSave,\r\n }\r\n}\r\n\r\nexport default useSubmitDocConsider\r\n","import { Grid } from '@material-ui/core'\r\nimport { Form } from 'react-final-form'\r\n\r\nimport Autocomplete from '../../../../../control/autocomplete/autocomplete'\r\nimport { TOptions } from '../../../../../control/autocomplete/autocompleteType'\r\nimport Button from '../../../../../control/button/button'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\n\r\nimport useRequestConsiderDoc from './useRequestConsiderDoc'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\n\r\ntype SentDocOtherView = {\r\n option: Array>\r\n onClickSave: (val: any) => void\r\n onClickClose: (val: any) => void\r\n}\r\n\r\nconst SentDocOtherView = (props: SentDocOtherView) => {\r\n const { option, onClickSave, onClickClose } = props\r\n const translate = useTranslate()\r\n return (\r\n
\r\n {(props) => {\r\n const { handleSubmit } = props\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport type RequestConsiderDocViewType = {\r\n onRefDialog: (fn: Record) => void\r\n lstOption: SentDocOtherView['option']\r\n onClickClose: () => void\r\n onClickSave: (projectInfo: any) => void\r\n}\r\nconst RequestConsiderDocView = (props: RequestConsiderDocViewType) => {\r\n const { lstOption, onRefDialog, onClickClose, onClickSave } = props\r\n const translate = useTranslate()\r\n return (\r\n }\r\n />\r\n )\r\n}\r\n\r\nexport type RequestConsiderDocType = {\r\n bindRef: React.MutableRefObject\r\n // onRef: (fn: { open: () => void; close: () => void }) => void\r\n}\r\nconst RequestConsiderDoc = (props: RequestConsiderDocType) => {\r\n const sentDocConsider = useRequestConsiderDoc(props)\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport default RequestConsiderDoc\r\n","import React from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { ReportedNonconformanceType } from './reportedNonconformance'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\n\r\nconst useReportedNonconformance = (props: ReportedNonconformanceType) => {\r\n const { projectMode } = props\r\n const checkPermission = useCheckPermission()\r\n const manageProjectStore = useManageProjectStore()\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const authenStore = useAuthenStore()\r\n const tabAndFolderHook = useFolderAndTab()\r\n\r\n const history = useHistory()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const isFirstRender = React.useRef(true)\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n\r\n onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\nexport default useReportedNonconformance\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport { ResultDocumentTopicLut } from '../../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport * as Utils from '../../../../../../utilities/date'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\n\r\nimport * as VerifyDocumentType from '../../verifyDocument/verifyDocumentType'\r\nimport { ReportedAnonconformanceType } from './reportedAnonconformance'\r\ntype OptType = {\r\n label: string\r\n value: string\r\n}\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\ntype MyFileDataType = {\r\n documentTopicID?: number\r\n fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }>\r\n subtopic?: {\r\n subtopicID: number\r\n page: number | string\r\n }[]\r\n}\r\nconst useReportedAnonconformance = (props: ReportedAnonconformanceType) => {\r\n const { projectData, onSaveComplete } = props\r\n\r\n const history = useHistory()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const authenStore = useAuthenStore()\r\n const { profile } = authenStore\r\n\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const [isCompletely, setIsCompletely] = React.useState(true)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n const documentTopicRef = React.useRef()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const reviewerLutRef = React.useRef()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n setIsCompletely(projectData?.verifyDocument ?? true)\r\n getReviewer(projectData.irb)\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.irb && projectData?.submitTypeInfo?.value) {\r\n getDocumentTopicLut(projectData?.irb, projectData?.submitTypeInfo.value)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const filterTopicUpload = (documentTopic: ResultDocumentTopicLut[]) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n const researcherTypeID = manageProjectStore?.projectData?.researcherTypeInfo.value\r\n\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n Constants.topicForLecturer.forEach((element) => {\r\n docTopic = documentTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n Constants.topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submitType: number) => {\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitType)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n filterTopicUpload(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n const documentInfo = projectData?.documentInfo\r\n // ------------------------------------------------------------- //\r\n let uploadFileInit = manageProjectStore.documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: VerifyDocumentType.uploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList = docInfo.fileInfo\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic\r\n }\r\n })\r\n })\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const getReviewer = async (irb: number) => {\r\n if (irb) {\r\n const res = await callLookup.callReviewerLut(irb)\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: itm.name_th,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n reviewerLutRef.current = formatedData\r\n }\r\n }\r\n\r\n const handleChangeDocCompletely = (val: string) => {\r\n const isCompletely = val === '1' ? true : false\r\n setIsCompletely(isCompletely)\r\n }\r\n\r\n const createInitialData = () => {\r\n const defaultCompletely = projectData?.verifyDocument ?? '1'\r\n const initialData = {\r\n isCompletelyDoc: defaultCompletely === '1' ? defaultCompletely : projectData?.verifyDocument ? '1' : '2',\r\n resubmitDocDate: projectData?.resubmitDocDate ? projectData?.resubmitDocDate : null,\r\n //@ts-ignore\r\n reviewer: projectData?.reviewerUserID\r\n ? {\r\n label: `${projectData?.reviewerName_th}`,\r\n value: `${projectData?.reviewerUserID}`,\r\n }\r\n : null,\r\n remark: projectData?.verifyDocumentRemark,\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const checkUseUploadEdit = () => {\r\n let isUseUploadEdit = false\r\n\r\n switch (projectData?.submitTypeInfo?.value) {\r\n case constSubmittedType.nonconformance:\r\n isUseUploadEdit = true\r\n break\r\n default:\r\n isUseUploadEdit = false\r\n break\r\n }\r\n\r\n return isUseUploadEdit\r\n }\r\n const handleDirtyChange = (props: { dirty: boolean }) => {\r\n let isDirty: boolean = false\r\n if (!isViewMode) {\r\n isDirty = props.dirty\r\n }\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const parameterForSave = {\r\n projectID: projectData?.projectID || null,\r\n submittedID: projectData?.submittedID || null,\r\n irb: projectData?.irb || null,\r\n userID: profile.userId as number,\r\n projectName_th: projectData?.projectName_th || null,\r\n projectName_en: projectData?.projectName_en || null,\r\n projectSubmitTypeID: projectData?.submitTypeInfo.value || null,\r\n\r\n facultyID: projectData?.facultyInfo.value || null,\r\n requestPhase: projectData?.requestPhase || null,\r\n isTools: projectData?.isTools,\r\n researcherTypeID: projectData?.researcherTypeInfo.value || null,\r\n titleNameID: projectData?.titleNameInfo.value || null,\r\n titleNameOther_th: projectData?.titleNameOther_th || null,\r\n titleNameOther_en: projectData?.titleNameOther_en || null,\r\n academicPositionID: projectData?.academicPositionInfo?.value || null,\r\n academicPositionOther_th: projectData?.academicPositionOther_th || null,\r\n academicPositionOther_en: projectData?.academicPositionOther_en || null,\r\n educationLevelID: projectData?.educationLevelInfo ? projectData?.educationLevelInfo.value : null,\r\n researcherName_th: projectData?.researcherName_th || null,\r\n researcherName_en: projectData?.researcherName_en || null,\r\n email: projectData?.email || null,\r\n homePhone: projectData?.homePhone || null,\r\n mobilePhone: projectData?.mobilePhone || null,\r\n fax: projectData?.fax || null,\r\n isDraft: isDraft,\r\n isLanguage_th: projectData?.isLanguageTH,\r\n isLanguage_en: projectData?.isLanguageEN,\r\n isRequestCertificatePaper: projectData?.isRequestCertificatePager ? true : false,\r\n isDr: projectData?.isDr,\r\n } as REQServiceType.ReportedAdverseEventsRequestType\r\n\r\n return parameterForSave\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft: boolean = true\r\n const param = getSaveServiceParameter(isDraft)\r\n\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.ReportedAdverseEventsRequestType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n try {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.reportedAdverseEvents(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useVerifyDocument.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleSubmitForm = async (value: any) => {\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param = getSaveServiceParameter(isDraft)\r\n const paramSave = {\r\n ...param,\r\n documentInfo: getDocumentInfo(value),\r\n }\r\n\r\n switch (value.submitType) {\r\n case 'save':\r\n handleSave(paramSave)\r\n break\r\n\r\n case 'draft':\r\n handleSaveDraft(paramSave)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n const handleSaveDraft = (param: any) => {\r\n processSaveData(param)\r\n }\r\n\r\n const handleSave = async (param: any) => {\r\n // if (param.documentInfo?.length === 0) {\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n // content: translate.get('ALERT.CONTENT.UPLOAD_AT_LEAST_1_FILE'),\r\n // type: 'alert-message',\r\n // })\r\n // } else {\r\n const isRequirePDF = checkRequirePDF(param.documentInfo)\r\n if (isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => handleClickConfirmSave(param),\r\n })\r\n }\r\n // }\r\n dialogRef.current?.openDialog()\r\n }\r\n const checkRequirePDF = (documentInfo: MyFileDataType[]) => {\r\n let isRequirePDF = false\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if (documentInfo[i]?.fileTokenInfo[j].fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n\r\n const handleClickConfirmSave = (param: any) => {\r\n processSaveData(param)\r\n }\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n return {\r\n formRef,\r\n configDialog,\r\n onRefDialog,\r\n isCompletely,\r\n initialUploadFile: initialUploadFile,\r\n isViewMode,\r\n initialValues,\r\n onSubmitForm: handleSubmitForm,\r\n onChangeDocCompletely: handleChangeDocCompletely,\r\n checkUseUploadEdit: checkUseUploadEdit,\r\n onDirtyChange: handleDirtyChange,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n }\r\n}\r\nexport default useReportedAnonconformance\r\n","import React from 'react'\r\nimport { Grid, useTheme, makeStyles } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport ResearchDetail from '../../../../shareUI/ResearchDetail/researchDetail'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { GetProjectResultType } from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport useReportedAnonconformance from './useReportedAnonconformance'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nexport type ReportedAnonconformanceViewType = ReportedAnonconformanceType &\r\n ReturnType\r\nconst ReportedAnonconformanceView = (props: ReportedAnonconformanceViewType) => {\r\n const {\r\n formRef,\r\n onRefDialog,\r\n configDialog,\r\n initialValues,\r\n projectData,\r\n initialUploadFile,\r\n onChangeDocCompletely,\r\n isCompletely,\r\n isViewMode,\r\n checkUseUploadEdit,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const { documentTopic } = manageProjectStore\r\n const checkPermissionHook = checkPermission()\r\n const isResearcher = checkPermissionHook.isUserResearcher()\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {!isResearcher && (\r\n \r\n \r\n {/* */}\r\n \r\n )}\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type ReportedAnonconformanceType = {\r\n projectData?: GetProjectResultType\r\n onSaveComplete?: (status: number, isDraft: boolean) => void\r\n}\r\nconst ReportedAnonconformance = (props: ReportedAnonconformanceType) => {\r\n const reportedAnonconformance = useReportedAnonconformance(props)\r\n return \r\n}\r\nexport default ReportedAnonconformance\r\n","import useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport ReportedAnonconformance from '../../../page/requestNewProject/reportedAnonconformance/reportedAnonconformance'\r\nimport ReportedNonconformance from '../../../page/memoMessageTerminateProject/reportedNonconformance/reportedNonconformance'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport React from 'react'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/adverseEvent/resultOfConsider'\r\n\r\ntype ResearcherViewType = ResearcherType //& ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id: //หน้าตรวจสอบ\r\n case Constants.menuTab.tab21.id: //หน้ายื่นโครงการ\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab23.id:\r\n return \r\n default:\r\n return <>\r\n }\r\n }\r\n return <> {renderPage()} \r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { ReportedNonconformanceType } from './reportedNonconformance'\r\nimport * as resultConsiderationTypes from '../../../../shareUI/resultConsideration/resultConsiderationTypes'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport * as Constant from '../../../../../../constants/constants'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { dateForAPI } from '../../../../../../utilities/date'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\nimport { validateModeAccordionError } from '../../../../../../utilities/validate'\r\n\r\nconst useReportedNonconformance = (props: ReportedNonconformanceType) => {\r\n const { projectData, onSaveComplete } = props\r\n\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const manageProjectStore = useManageProjectStore()\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n const [approveStatus, setApproveStatus] = React.useState([])\r\n const [approveStatusServiceResult, setApproveStatusServiceResult] = React.useState>([])\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const editRef = React.useRef()\r\n const callLookup = useLookupService()\r\n\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n const [initialMemoMessagePaper, setInitialMemoMessagePaper] = React.useState<{\r\n TH: InitialRichTextEditorType\r\n EN: InitialRichTextEditorType\r\n }>()\r\n const [initialCommentCommitee, setInitialCommentCommitee] = React.useState()\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getApproveStatus()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getApproveStatus = async () => {\r\n let res = await callLookup.callApproveStatusLutSubmitType({ irbID: 1, submitType: 6 })\r\n\r\n const formatedData = res?.result?.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n }) as []\r\n\r\n setApproveStatusServiceResult(res?.result ?? [])\r\n setApproveStatus(formatedData)\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n const res = await callWebService.getProjectNonconformanceMemoMessage(submittedID)\r\n const result = res.result\r\n\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n approveStatus: result?.approveStatusInfo,\r\n // result && result?.approveStatusInfo\r\n // ? {\r\n // label:\r\n // translate.languageStore.currentLanguage === translate.languageKey.th\r\n // ? result?.approveStatusInfo?.nameTH\r\n // : result?.approveStatusInfo?.nameEN,\r\n // value: result?.approveStatusInfo?.value.toString(),\r\n // }\r\n // : null,\r\n }\r\n\r\n const initialCommentCommittee = {\r\n contentHtml: result?.memoMessageComment_html,\r\n contentText: result?.memoMessageComment,\r\n }\r\n const initialMemoMessagePaper = {\r\n TH: {\r\n contentHtml: result?.memoMessagePaper_th_html,\r\n contentText: result?.memoMessagePaper_th,\r\n },\r\n EN: {\r\n contentHtml: result?.memoMessagePaper_en_html,\r\n contentText: result?.memoMessagePaper_en,\r\n },\r\n }\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n setInitialCommentCommitee(initialCommentCommittee)\r\n setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.unSignPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.unSignPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n let param: REQServiceType.ProjectNonconformanceMemoMessageType = {\r\n submittedID: submittedID,\r\n comment: value?.commentCommittee?.contentText,\r\n comment_html: value?.commentCommittee?.contentHtml,\r\n memoMessagePaper_th: value?.memoMessagePaper_TH?.contentText,\r\n memoMessagePaper_en: value?.memoMessagePaper_EN?.contentText,\r\n memoMessagePaper_th_html: value?.memoMessagePaper_TH?.contentHtml,\r\n memoMessagePaper_en_html: value?.memoMessagePaper_EN?.contentHtml,\r\n memoMessageDate: value?.memoMessageDate ? dateForAPI(value?.memoMessageDate) ?? null : null,\r\n approveStatusID: value?.approveStatus?.value,\r\n isDraft: isDraft,\r\n }\r\n\r\n return param\r\n }\r\n const processSaveData = async (\r\n param: REQServiceType.ProjectNonconformanceMemoMessageType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n try {\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.projectNonconformanceMemoMessage(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useDefineProject.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleDirtyChange = (props: any) => {\r\n let isDirty: boolean = false\r\n let newFormValue = _.omit(props.values, ['submitType'])\r\n let initValue = _.omit(\r\n {\r\n ...initialValues,\r\n commentCommittee: {\r\n contentHtml: initialCommentCommitee?.contentHtml ?? '',\r\n contentText: initialCommentCommitee?.contentText ?? '',\r\n },\r\n memoMessagePaper_TH: {\r\n contentHtml: initialMemoMessagePaper?.TH.contentHtml ?? '',\r\n contentText: initialMemoMessagePaper?.TH.contentText ?? '',\r\n },\r\n memoMessagePaper_EN: {\r\n contentHtml: initialMemoMessagePaper?.EN.contentHtml ?? '',\r\n contentText: initialMemoMessagePaper?.EN.contentText ?? '',\r\n },\r\n memorandumFile: initialMemorandumFile,\r\n },\r\n ['submitType'],\r\n )\r\n\r\n const isEqual = _.isEqual(initValue, newFormValue)\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft = true\r\n const param: REQServiceType.ProjectNonconformanceMemoMessageType = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n const handleSubmitForm = (value: any) => {\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param: REQServiceType.ProjectNonconformanceMemoMessageType = getSaveServiceParameter(isDraft)\r\n\r\n if (isDraft) {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const handleChangStatus = (val: any) => {\r\n const selectItem = approveStatusServiceResult?.filter(\r\n (status) => status.id.toString() === val?.value?.toString(),\r\n )?.[0]\r\n\r\n if (selectItem && selectItem?.id) {\r\n let fieldMemoMessagePaperTH = {\r\n contentHtml: formRef.current?.values?.memoMessagePaper_TH?.contentHtml ?? null,\r\n contentText: formRef.current?.values?.memoMessagePaper_TH?.contentText ?? null,\r\n }\r\n let fieldMemoMessagePaperEN = {\r\n contentHtml: formRef.current?.values?.memoMessagePaper_EN?.contentHtml ?? null,\r\n contentText: formRef.current?.values?.memoMessagePaper_EN?.contentText ?? null,\r\n }\r\n\r\n //TH {{---กรุณาเลือกผลการพิจารณา---}}\r\n if (fieldMemoMessagePaperTH.contentHtml && fieldMemoMessagePaperTH.contentHtml?.trim() !== '') {\r\n fieldMemoMessagePaperTH.contentHtml = fieldMemoMessagePaperTH.contentHtml.replaceAll(\r\n Constant.pleaseSelectApproveStatus.th,\r\n selectItem.name_th,\r\n )\r\n\r\n if (fieldMemoMessagePaperTH.contentText && fieldMemoMessagePaperTH.contentText?.trim() !== '') {\r\n fieldMemoMessagePaperTH.contentText = fieldMemoMessagePaperTH.contentText.replaceAll(\r\n Constant.pleaseSelectApproveStatus.th,\r\n selectItem.name_th,\r\n )\r\n }\r\n }\r\n\r\n //EN {{---กรุณาเลือกผลการพิจารณา---}}\r\n if (fieldMemoMessagePaperEN.contentHtml && fieldMemoMessagePaperEN.contentHtml?.trim() !== '') {\r\n fieldMemoMessagePaperEN.contentHtml = fieldMemoMessagePaperEN.contentHtml.replaceAll(\r\n Constant.pleaseSelectApproveStatus.en,\r\n selectItem.name_en,\r\n )\r\n\r\n if (fieldMemoMessagePaperEN.contentText && fieldMemoMessagePaperEN.contentText?.trim() !== '') {\r\n fieldMemoMessagePaperEN.contentText = fieldMemoMessagePaperEN.contentText.replaceAll(\r\n Constant.pleaseSelectApproveStatus.en,\r\n selectItem.name_en,\r\n )\r\n }\r\n }\r\n approveStatusServiceResult.forEach((status) => {\r\n if (fieldMemoMessagePaperTH.contentHtml && fieldMemoMessagePaperTH.contentHtml?.trim() !== '') {\r\n fieldMemoMessagePaperTH.contentHtml = fieldMemoMessagePaperTH.contentHtml.replaceAll(\r\n status.name_th,\r\n selectItem.name_th,\r\n )\r\n\r\n if (fieldMemoMessagePaperTH.contentText && fieldMemoMessagePaperTH.contentText?.trim() !== '') {\r\n fieldMemoMessagePaperTH.contentText = fieldMemoMessagePaperTH.contentText.replaceAll(\r\n status.name_th,\r\n selectItem.name_th,\r\n )\r\n }\r\n }\r\n\r\n if (fieldMemoMessagePaperEN.contentHtml && fieldMemoMessagePaperEN.contentHtml?.trim() !== '') {\r\n fieldMemoMessagePaperEN.contentHtml = fieldMemoMessagePaperEN.contentHtml.replaceAll(\r\n status.name_en,\r\n selectItem.name_en,\r\n )\r\n\r\n if (fieldMemoMessagePaperEN.contentText && fieldMemoMessagePaperEN.contentText?.trim() !== '') {\r\n fieldMemoMessagePaperEN.contentText = fieldMemoMessagePaperEN.contentText.replaceAll(\r\n status.name_en,\r\n selectItem.name_en,\r\n )\r\n }\r\n }\r\n })\r\n\r\n setInitialMemoMessagePaper({\r\n TH: {\r\n contentHtml: fieldMemoMessagePaperTH.contentHtml,\r\n contentText: fieldMemoMessagePaperTH.contentText,\r\n },\r\n EN: {\r\n contentHtml: fieldMemoMessagePaperEN.contentHtml,\r\n contentText: fieldMemoMessagePaperEN.contentText,\r\n },\r\n })\r\n\r\n // if (formRef.current) {\r\n // formRef.current.form.batch(() => {\r\n // if (formRef.current) {\r\n // formRef.current.form.change('memoMessagePaper_TH', fieldMemoMessagePaperTH)\r\n // formRef.current.form.change('memoMessagePaper_EN', fieldMemoMessagePaperEN)\r\n // }\r\n // }) // NOW all listeners notified\r\n // }\r\n }\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n\r\n const updateMemoMessage = async (param: REQServiceType.UpdateMemoMessageType) => {\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.updateMemoMessagePaper(param)\r\n\r\n if (res.result.status === 200) {\r\n dialogRef.current?.openDialog()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n setConfigDialog({})\r\n },\r\n })\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleSubmitUpdateMemo = (fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formRef.current)\r\n return new Promise(async (resolve, reject) => {\r\n if (isError) {\r\n formRef.current?.form?.submit()\r\n reject('')\r\n } else {\r\n resolve('')\r\n const param: REQServiceType.UpdateMemoMessageType = {\r\n submittedID: Number(projectData?.submittedID),\r\n memoMessagePaperTH: formRef.current?.values.memoMessagePaper_TH?.contentText,\r\n memoMessagePaperEN: formRef.current?.values.memoMessagePaper_EN?.contentText,\r\n memoMessagePaperTHHTML: formRef.current?.values.memoMessagePaper_TH?.contentHtml,\r\n memoMessagePaperENHTML: formRef.current?.values.memoMessagePaper_EN?.contentHtml,\r\n }\r\n\r\n updateMemoMessage(param)\r\n }\r\n })\r\n }\r\n\r\n const handleCancle = () => {\r\n const valueMessageTH: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_TH`]?.contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_TH`]?.contentText,\r\n }\r\n const valueMessageEN: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_EN`]?.contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_EN`]?.contentText,\r\n }\r\n setInitialMemoMessagePaper((prev) => ({\r\n TH: {\r\n ...prev?.TH,\r\n ...valueMessageTH,\r\n },\r\n EN: {\r\n ...prev?.EN,\r\n ...valueMessageEN,\r\n },\r\n }))\r\n }\r\n\r\n const onClickEdit = () => {\r\n editRef.current = formRef.current?.form.getState().values\r\n }\r\n return {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n approveStatus,\r\n isShowUpdateDate,\r\n initialCommentCommitee,\r\n initialMemoMessagePaper,\r\n initialMemorandumFile,\r\n onRefDialog,\r\n onDirtyChange: handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickOpenFile: handleClickOpenFile,\r\n onChangStatus: handleChangStatus,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n }\r\n}\r\nexport default useReportedNonconformance\r\n","import { GetProjectResultType } from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport useReportedNonconformance from './useReportedNonconformance'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport MyDatePicker from '../../../../../../control/datepicker/datepicker'\r\nimport UploadDocCtrl from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport Autocomplete from '../../../../../../control/autocomplete/autocomplete'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { richEditorRequired } from '../../../../../../utilities/validate'\r\n\r\nexport type ReportedNonconformanceTypeViewType = ReturnType &\r\n ReportedNonconformanceType\r\nconst ReportedNonconformanceView = (props: ReportedNonconformanceTypeViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n approveStatus,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialCommentCommitee,\r\n initialMemoMessagePaper,\r\n onRefDialog,\r\n onSubmitForm,\r\n onDirtyChange,\r\n onChangStatus,\r\n onClickOpenFile,\r\n onClickBackToSearch,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n } = props\r\n const translate = useTranslate()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const latestFolderIdx = 0\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n const isEdit = isViewMode && currentSelectFolder\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n

\\n'\r\n ? [richEditorRequired(translate.get('MESSAGE.M015'))]\r\n : []\r\n }\r\n />\r\n
\r\n
\r\n )\r\n }\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_TH']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_TH'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n\r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_EN']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_EN'])}\r\n onClickEdit={onClickEdit}\r\n onCancel={handleCancle}\r\n />\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type ReportedNonconformanceType = {\r\n projectData?: GetProjectResultType | null | undefined\r\n onSaveComplete?: ((status: number, isDraft: boolean) => void) | undefined\r\n}\r\nconst ReportedNonconformance = (props: ReportedNonconformanceType) => {\r\n const reportedNonconformance = useReportedNonconformance(props)\r\n return \r\n}\r\nexport default ReportedNonconformance\r\n","import useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport ReportedNonconformance from '../../../page/memoMessageTerminateProject/reportedNonconformance/reportedNonconformance'\r\nimport { OfficerType } from './officerType'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ReportedAnonconformance from '../../../page/requestNewProject/reportedAnonconformance/reportedAnonconformance'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC1'\r\nimport SignREC1 from '../../../page/sign/signMemoMessage/signREC1'\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id: //หน้าตรวจสอบ\r\n case Constants.menuTab.tab21.id: //หน้ายื่นโครงการ\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab11.id:\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab10.id:\r\n return \r\n case Constants.menuTab.tab9.id:\r\n return \r\n default:\r\n return <>\r\n }\r\n }\r\n return <> {renderPage()} \r\n}\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useReportedNonconformance from './useReportedNonconformance'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constProjectStatus from '../../../../../constants/projectStatus'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\n\r\ntype ReportedNonconformanceViewType = ReturnType &\r\n Omit\r\nconst ReportedNonconformanceView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n onClickCloseProject,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const isAdmin = checkPermission.isUserAdmin()\r\n const isStatusComplete = projectData && projectData?.projectStatusInfo?.value === constProjectStatus.completed\r\n const isShowCloseProjectButton = isStatusComplete && isAdmin\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {isViewMode && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type ReportedNonconformanceType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst ReportedNonconformance: React.FC = (props) => {\r\n const reportedNonconformance = useReportedNonconformance(props)\r\n return \r\n}\r\nexport default ReportedNonconformance\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as resultOfConsiderPreviousType from './resultOfConsiderPreviousType'\r\nimport _ from 'lodash'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\nimport {\r\n ResultCertificateCloseProjectResponse,\r\n SynthesisReviewResultType,\r\n} from '../../../../../../services/web/types/responseWebServiceTypes'\r\n\r\nconst useResultOfConsiderPrevious = (props: resultOfConsiderPreviousType.UseResultOfConsiderPreviousType) => {\r\n const { submittedID } = props\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const translate = useTranslate()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const callLookup = useLookupService()\r\n\r\n const [initialSuggestionNotice, setInitialSuggestionNotice] = React.useState()\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n const getMemoMessage = async () => {\r\n if (submittedID) {\r\n const { result } = await callWebService.getCertificateCloseProject(submittedID)\r\n return result\r\n }\r\n }\r\n\r\n const getSynthesisReviewData = async () => {\r\n if (submittedID) {\r\n const { result } = await callWebService.getSynthesisReview(submittedID)\r\n return result\r\n }\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n /**\r\n * Default value form\r\n */\r\n const createInitialData = async () => {\r\n const result = await getMemoMessage()\r\n const resultSynthesisReview = await getSynthesisReviewData()\r\n if (result) {\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n approveStatus:\r\n result && result?.approveStatusInfo\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result.approveStatusInfo.nameTH\r\n : result.approveStatusInfo.nameEN,\r\n value: result?.approveStatusInfo.value.toString(),\r\n }\r\n : null,\r\n }\r\n\r\n /******* SuggestionNotice ********/\r\n const initialSugestionNotice = createInitialSuggestion(resultSynthesisReview)\r\n\r\n /******set state *******/\r\n setInitialValues(initialData)\r\n setInitialSuggestionNotice(initialSugestionNotice)\r\n }\r\n }\r\n\r\n /**\r\n * SuggestionNotice\r\n */\r\n\r\n const createInitialSuggestion = (content?: SynthesisReviewResultType) => {\r\n const initialSugestionNotice = {\r\n contentHtml: content?.synthesisReviewRemarkInfo.synthesisReviewRemark_html ?? '',\r\n contentText: content?.synthesisReviewRemarkInfo.synthesisReviewRemark ?? '',\r\n }\r\n return initialSugestionNotice\r\n }\r\n\r\n return {\r\n formRef,\r\n configDialog,\r\n isViewMode: isViewMode,\r\n initialValues,\r\n initialSuggestionNotice,\r\n required,\r\n onRefDialog,\r\n }\r\n}\r\n\r\nexport default useResultOfConsiderPrevious\r\n","import * as resultOfConsiderPreviousType from './resultOfConsiderPreviousType'\r\nimport useResultOfConsiderPrevious from './useResultOfConsiderPrevious'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\n// import useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../../constants/approveStatus'\r\n\r\n//View\r\nconst ResultOfConsiderPreviousView = (props: resultOfConsiderPreviousType.ResultOfConsiderPreviousViewType) => {\r\n const { formRef, isViewMode, initialValues, /*projectData,*/ configDialog, onRefDialog, initialSuggestionNotice } =\r\n props\r\n\r\n const translate = useTranslate()\r\n // const checkPermission = useCheckPermission()\r\n\r\n const isApproveWithComment =\r\n initialValues?.approveStatus?.value === approveStatusREC1.approveWithComment.toString() ||\r\n initialValues?.approveStatus?.value === approveStatusREC2.approveWithComment.toString()\r\n\r\n const isApprove =\r\n initialValues?.approveStatus?.value === approveStatusREC1.approve.toString() ||\r\n initialValues?.approveStatus?.value === approveStatusREC2.approve.toString()\r\n\r\n return (\r\n {}}\r\n initialValues={{ ...initialValues }}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n >\r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {/* {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? initialValues?.approveStatus?.label\r\n : initialValues?.approveStatus?.label} */}\r\n {isApproveWithComment\r\n ? translate.get('LABEL.APPROVE')\r\n : initialValues?.approveStatus?.label}\r\n \r\n \r\n \r\n\r\n {!isApprove && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst ResultOfConsiderPrevious = (props: resultOfConsiderPreviousType.ResultOfConsiderPreviousType) => {\r\n const useMemomessageTerminateModel = useResultOfConsiderPrevious(props)\r\n return \r\n}\r\nexport default ResultOfConsiderPrevious\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { menuTab } from '../../../../../../constants/constants'\r\nimport CloseProjectResearcher from '../../../page/closeProjectResearcher/closeProjectResearcher'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/closeProject/resultOfConsiderPrevious'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/closeProject/resultOfConsider'\r\n\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectData } = props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return \r\n case menuTab.tab23.id:\r\n return \r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import VerifyDocumentCloseProjectREC1 from '../../../page/verifyDocumentCloseProject/verifyDocumentCloseProjectREC1'\r\nimport VerifyDocumentCloseProjectREC2 from '../../../page/verifyDocumentCloseProject/verifyDocumentCloseProjectREC2'\r\nimport { OfficerType } from './officerType'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport Synthesis from '../../../page/synthesis/closeProject/synthesis'\r\nimport ReportedCloseProject from '../../../page/memoMessage/reportedCloseProject/reportedCloseProject'\r\nimport SignREC1 from '../../../page/sign/signMemoMessage/signREC1'\r\nimport SignREC2 from '../../../page/sign/signMemoMessage/signREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC1'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC2'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/closeProject/resultOfConsiderPrevious'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport submittedStatus from '../../../../../../constants/submittedStatus'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n let isNotDisableTestResult = false\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.sign &&\r\n manageProjectStore?.projectData?.submittedStatusInfo?.value !== submittedStatus.complete\r\n }\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab11.id:\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab9.id:\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n return \r\n case Constants.menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.sign &&\r\n manageProjectStore?.projectData?.submittedStatusInfo?.value !== submittedStatus.complete\r\n }\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab6.id:\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab11.id:\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab9.id:\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n return \r\n case Constants.menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useCloseProjectEditAfterReview from './useCloseProjectEditAfterReview'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport Button from '../../../../../control/button/button'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\n\r\ntype CloseProjectEditAfterReviewViewType = ReturnType &\r\n Omit\r\nconst CloseProjectEditAfterReviewView: React.FC = (props) => {\r\n const { projectMode, configDialog, isViewMode, onRefDialog, onCallbackSaveComplete, onClickBackToSearch } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n {isViewMode && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n\r\nexport type CloseProjectEditAfterType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst CloseProjectEditAfterReview: React.FC = (props) => {\r\n const closeProjectModel = useCloseProjectEditAfterReview(props)\r\n\r\n return \r\n}\r\nexport default CloseProjectEditAfterReview\r\n","import React from 'react'\r\nimport { CloseProjectEditAfterType } from './closeProjectEditAfterReview'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nexport default (props: CloseProjectEditAfterType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n // const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n console.log('####CloseProject Edit AfterReview####')\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n // const isReloadProjectData = false\r\n // loadTabAndFolder(isReloadProjectData)\r\n\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n // const loadTabAndFolder = async (isReloadProjectData: boolean = true) => {\r\n // const mode = projectMode\r\n // if (mode === 'CREATE') {\r\n // tabAndFolderHook.createProjectLoadTabAndFolder()\r\n // } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n // tabAndFolderHook.loadTabAndFolder(manageProjectStore.projectData, appFolderAndTabStore, isReloadProjectData)\r\n // }\r\n // }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n // setConfigDialog({}) //clear function dialog\r\n // // loadLatestFolder()\r\n // const isReloadProjectData = true\r\n // loadTabAndFolder(isReloadProjectData)\r\n // appFolderAndTabAction.resetTabDirty()\r\n\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { menuTab } from '../../../../../../constants/constants'\r\nimport TerminateProjectRequestForm from '../../../page/requestNewProject/terminateProject/terminateProject'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/closeProject/resultOfConsiderPrevious'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/terminateProject/resultOfConsider'\r\n\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { initialData, isViewMode, submittedType, formValueRef, projectData, projectMode, callbackSaveComplete } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return (\r\n \r\n )\r\n case menuTab.tab23.id:\r\n return \r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n // return
ผลพิจารณาครั้งก่อน
\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ??\r\n constSubmittedType.editAfterReview_terminateProject,\r\n }\r\n}\r\n","import VerifyDocumentREC1 from '../../../page/verifyDocumentTerminate/verifyDocumentREC1'\r\nimport VerifyDocumentREC2 from '../../../page/verifyDocumentTerminate/verifyDocumentREC2'\r\nimport { OfficerType } from './officerType'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport SignREC1 from '../../../page/sign/signMemoMessage/signREC1'\r\nimport SignREC2 from '../../../page/sign/signMemoMessage/signREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC1'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC2'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/terminateProject/resultOfConsiderPrevious'\r\nimport MemoMessageTerminateREC1 from '../../../page/memoMessageTerminateProject/memoMessageTerminateREC1'\r\nimport MemoMessageTerminateREC2 from '../../../page/memoMessageTerminateProject/memoMessageTerminateREC2'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport submittedStatus from '../../../../../../constants/submittedStatus'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n let isNotDisableTestResult = false\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.sign &&\r\n manageProjectStore?.projectData?.submittedStatusInfo?.value !== submittedStatus.complete\r\n }\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab11.id:\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab9.id:\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n return \r\n case Constants.menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n // return
ผลพิจารณาครั้งก่อน
\r\n default:\r\n return
\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.sign &&\r\n manageProjectStore?.projectData?.submittedStatusInfo?.value !== submittedStatus.complete\r\n }\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab11.id:\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab9.id:\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n return \r\n case Constants.menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n // return
ผลพิจารณาครั้งก่อน
\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useTerminateProjectEditAfterReview from './useTerminateProjectEditAfterReview'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport Button from '../../../../../control/button/button'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\nimport submittedStatus from '../../../../../constants/submittedStatus'\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\n\r\ntype TerminateProjectEditAfterReviewViewType = ReturnType &\r\n Omit\r\nconst TerminateProjectEditAfterReviewView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n configDialog,\r\n isViewMode,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const isBtnClose =\r\n checkPermission.isUserChairman() &&\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value !== submittedStatus.complete\r\n ? false\r\n : isViewMode\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {isBtnClose && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n\r\nexport type TerminateProjectEditAfterReview = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst TerminateProjectEditAfterReview: React.FC = (props) => {\r\n const terminateProjectEditAfterReviewModel = useTerminateProjectEditAfterReview(props)\r\n\r\n return \r\n}\r\nexport default TerminateProjectEditAfterReview\r\n","import React from 'react'\r\nimport { TerminateProjectEditAfterReview } from './terminateProjectEditAfterReview'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nexport default (props: TerminateProjectEditAfterReview) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n // const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n console.log('####Request NewProject####')\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n // const isReloadProjectData = false\r\n // loadTabAndFolder(isReloadProjectData)\r\n\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n // const loadTabAndFolder = async (isReloadProjectData: boolean = true) => {\r\n // const mode = projectMode\r\n // if (mode === 'CREATE') {\r\n // tabAndFolderHook.createProjectLoadTabAndFolder()\r\n // } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n // tabAndFolderHook.loadTabAndFolder(manageProjectStore.projectData, appFolderAndTabStore, isReloadProjectData)\r\n // }\r\n // }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n // setConfigDialog({}) //clear function dialog\r\n // // loadLatestFolder()\r\n // const isReloadProjectData = true\r\n // loadTabAndFolder(isReloadProjectData)\r\n // appFolderAndTabAction.resetTabDirty()\r\n\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n }\r\n}\r\n","import React from 'react'\r\nimport * as TerminateProjectByAdminType from './terminateProjectByAdminType'\r\n\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\n\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport { topicForLecturer, topicForStudent } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\n\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport * as REQServiceTypes from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport _ from 'lodash'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport { encryptionAES } from '../../../../../../utilities/encryption'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { ResultDocumentTopicLut } from '../../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport useProjectHook from '../../../../shareLogic/useProjectHook'\r\n\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\n\r\ntype MyFileDataType = {\r\n documentTopicID?: number\r\n fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }>\r\n subtopic?: {\r\n subtopicID: number\r\n page: number\r\n }[]\r\n}\r\n\r\nconst useTerminateProjectByAdmin = (props: TerminateProjectByAdminType.UseTerminateProjectByAdminType) => {\r\n const { formMode, projectSubmittedTypeID, isViewMode, onSaveComplete } = props\r\n\r\n const translate = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const projectHook = useProjectHook()\r\n\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n\r\n const { profile } = authenStore\r\n\r\n const { configLoading, loadingClose, loadingOpen } = useLoading()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const callLookup = useLookupService()\r\n const [selectedIrb, setSelectedIrb] = React.useState('1')\r\n\r\n const dialogTwoRef = React.useRef>()\r\n const projectIDRef = React.useRef()\r\n const submittedIDRef = React.useRef()\r\n const irbRef = React.useRef()\r\n const parameterForSaveRef = React.useRef()\r\n const isDraftRef = React.useRef(false)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const { documentTopic } = manageProjectStore\r\n const researcherTypeRef = React.useRef()\r\n const documentTopicRef = React.useRef()\r\n const valuesForm = React.useRef()\r\n const tabSelectedIndexRef = React.useRef(null)\r\n const newTabSelectedRef = React.useRef(null)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n React.useEffect(() => {\r\n console.log('####Page: New terminate project####')\r\n return () => {\r\n //clear ค่า tabRef\r\n tabSelectedIndexRef.current = null\r\n newTabSelectedRef.current = null\r\n }\r\n }, [])\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData?.irb && manageProjectStore.projectData?.submitTypeInfo.value) {\r\n getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n manageProjectStore.projectData?.submitTypeInfo.value,\r\n )\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n // const fileTokenInfo: Array = uploadObj.uploadFileObj.fileList?.map((file) => file.fileToken) ?? []\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n const getParameterForSave = (value: TerminateProjectByAdminType.MyRequestFormType) => {\r\n let submittedTypeID = projectSubmittedTypeID\r\n if (manageProjectStore && manageProjectStore?.projectData) {\r\n if (manageProjectStore.projectData.submitTypeInfo && manageProjectStore.projectData.submitTypeInfo?.value) {\r\n submittedTypeID = manageProjectStore.projectData.submitTypeInfo?.value\r\n }\r\n }\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = {\r\n projectID: manageProjectStore?.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore?.projectData?.submittedID ?? null,\r\n irb: value.IRB ? parseInt(value.IRB.value) : null, //parseInt(value?.faculty?.irb) || null\r\n userID: profile.userId as number,\r\n projectName_th: value?.projectNameTH || null,\r\n projectName_en: value?.projectNameEN || null,\r\n // projectSubmitTypeID: value?.isPhase ? parseInt(value.isPhase) : null, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n projectSubmitTypeID: submittedTypeID, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n\r\n facultyID: value.faculty ? parseInt(value.faculty.value) : null,\r\n requestPhase: value.numPhase ? value.numPhase : null,\r\n isTools: value.isPhase === '2' ? (value.isTools === '2' ? true : false) : null,\r\n researcherTypeID: value.researcherType ? parseInt(value.researcherType.value) : null,\r\n titleNameID: value.titleName ? parseInt(value.titleName) : null,\r\n // titleNameOther: value.otherTitleName ? value.otherTitleName : null,\r\n titleNameOther_th: value.otherTitleNameTH ? value.otherTitleNameTH : null,\r\n titleNameOther_en: value.otherTitleNameEN ? value.otherTitleNameEN : null,\r\n academicPositionID: value.academicPosition ? parseInt(value.academicPosition) : null,\r\n // academicPositionOther: value.otherAcademicPosition ? value.otherAcademicPosition : null,\r\n academicPositionOther_th: value.otherAcademicPositionTH ? value.otherAcademicPositionTH : null,\r\n academicPositionOther_en: value.otherAcademicPositionEN ? value.otherAcademicPositionEN : null,\r\n educationLevelID: value.educationLevel ? parseInt(value.educationLevel.value) : null,\r\n researcherName_th: value.nameTH ? value.nameTH : null,\r\n researcherName_en: value.nameEN ? value.nameEN : null,\r\n email: value.email ? value.email : null,\r\n homePhone: value.homePhone ? value.homePhone : null,\r\n mobilePhone: value.mobilePhone ? value.mobilePhone : null,\r\n fax: value.fax ? value.fax : null,\r\n isDraft: value?.submitType === 'save' ? false : true,\r\n documentInfo: getDocumentInfo(value),\r\n isLanguage_th: value.langTH ? value.langTH : false,\r\n isLanguage_en: value.langEN ? value.langEN : false,\r\n isRequestCertificatePaper: value.isCertificatePaperList === '1' ? true : false,\r\n isDr: value.isDr ? value.isDr : false,\r\n }\r\n\r\n return parameterForSave\r\n }\r\n const handleClickSubmit = (value: TerminateProjectByAdminType.MyRequestFormType) => {\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(value)\r\n parameterForSaveRef.current = parameterForSave\r\n switch (value.submitType) {\r\n case 'save':\r\n // code block\r\n isDraftRef.current = false\r\n handleSave()\r\n\r\n break\r\n\r\n case 'draft':\r\n // code block\r\n isDraftRef.current = true\r\n handleSaveDraft()\r\n\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n const checkRequirePDF = (documentInfo: MyFileDataType[]) => {\r\n let isRequirePDF = false\r\n\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if (documentInfo[i]?.fileTokenInfo[j].fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n const handleSave = async () => {\r\n // if (parameterForSaveRef.current?.documentInfo?.length === 0) {\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n // content: translate.get('ALERT.CONTENT.UPLOAD_AT_LEAST_1_FILE'),\r\n // type: 'alert-message',\r\n // })\r\n // } else {\r\n const isRequirePDF = checkRequirePDF(parameterForSaveRef.current?.documentInfo)\r\n if (isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: handleClickConfirmSave,\r\n })\r\n }\r\n // }\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const handleSaveDraft = async () => {\r\n handleClickConfirmSave()\r\n }\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const handleClickConfirmSave = async () => {\r\n loadingOpen()\r\n\r\n //Flow ยื่นโครงการใหม่\r\n const res = await callWebService.terminateProjectByAdmin(parameterForSaveRef.current)\r\n\r\n loadingClose()\r\n\r\n setConfigDialog({}) //clear function dialog\r\n dialogTwoRef.current?.closeDialog()\r\n if (formMode === 'EDIT') {\r\n if (onSaveComplete) onSaveComplete(res?.status, parameterForSaveRef.current?.isDraft as boolean)\r\n } else if (formMode === 'CREATE') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: handleAfterCloseCreateSuccess,\r\n })\r\n appFolderAndTabAction.resetTabDirty()\r\n dialogTwoRef.current?.openDialog()\r\n projectIDRef.current = res.result?.projectInfo?.projectID\r\n submittedIDRef.current = res.result?.projectInfo?.submittedID\r\n irbRef.current = res.result?.projectInfo?.irb\r\n }\r\n }\r\n\r\n const handleAfterCloseCreateSuccess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n //เล่นใน mode create save เสร็จจะต้องไปเข้าหน้า Edit/View\r\n const encryptedProjectID = encryptionAES(`${projectIDRef.current}`)\r\n const encryptedSubmittedID = encryptionAES(`${submittedIDRef.current}`)\r\n const path = generatePath(RoutePath.manageProjectEdit, {\r\n projectID: encryptedProjectID,\r\n submittedID: encryptedSubmittedID,\r\n })\r\n history.push({\r\n pathname: path, // editMode\r\n })\r\n }\r\n\r\n const handleChangeFaculty = (irb?: string) => {\r\n if (irb) {\r\n const submittedTypeID =\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration\r\n getDocumentTopicLut(parseInt(irb), submittedTypeID)\r\n }\r\n }\r\n\r\n const handleChangeResearcherType = (val?: string) => {\r\n if (val) {\r\n filterTopicUpload(val)\r\n researcherTypeRef.current = val\r\n }\r\n }\r\n\r\n const filterTopicUpload = (val: string) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n if (documentTopic && documentTopicRef.current) {\r\n let isDocTopic = documentTopicRef.current\r\n if (val === '1') {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submittType: number) => {\r\n let submittedTypeID = projectSubmittedTypeID ? projectSubmittedTypeID : submittType\r\n\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submittedTypeID)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n\r\n if (researcherTypeRef.current) {\r\n filterTopicUpload(researcherTypeRef.current)\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n let documentInfo = manageProjectStore.projectData?.documentInfo\r\n let latestDocument = manageProjectStore.projectData?.latestDocument\r\n let uploadFileInit = documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n let fileList = docInfo?.fileInfo?.map((file: any) => ({\r\n documentTopicID: docInfo.topicID,\r\n fileToken: file.fileToken, //fileToken\r\n filename: file.filename,\r\n fileID: file.fileID, //fileToken\r\n path: file.path,\r\n replaceFileID: file.replaceFileID,\r\n }))\r\n itm.uploadFileObj.fileList = fileList\r\n const subtopic = docInfo.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docInfo.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n itm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n })\r\n })\r\n\r\n //Section Replace File\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileInit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileID, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFileBy.replaceFileID,\r\n } as any,\r\n ]\r\n\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n\r\n // //**** Initial File Edit ****//\r\n // if (latestDocument && latestDocument.length > 0) {\r\n // uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n // latestDocument?.forEach((latestDocInfo: any) => {\r\n // let latestFile = []\r\n // let previousFile = []\r\n // if (latestDocInfo?.fileInfo[0]) {\r\n // latestFile = latestDocInfo.fileInfo[0].latestFileList.filter((itm: any) => itm.no === null)\r\n // previousFile =\r\n // latestDocInfo.fileInfo[0].latestFileList[\r\n // latestDocInfo.fileInfo[0].latestFileList.length - 2\r\n // ]\r\n // }\r\n // if (latestFile.length > 0) {\r\n // if (latestDocInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n // let fileList = [\r\n // {\r\n // documentTopicID: latestDocInfo.topicID,\r\n // fileToken: latestFile[0].fileToken, //fileToken\r\n // filename: latestFile[0].filename,\r\n // fileID: latestFile[0].fileToken, //fileToken\r\n // path: latestFile[0].path,\r\n // replaceFileID: previousFile?.fileID,\r\n // },\r\n // ]\r\n // itm.uploadFileObj.fileList = fileList\r\n // itm.uploadFileObj.subTopicPageList = []\r\n // }\r\n // }\r\n // })\r\n // })\r\n // }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const handleClickClose = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n const handleDirtyChange = (props: any) => {\r\n const paramsDirty = {\r\n tabDirty: isViewMode ? false : props.dirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n isDraftRef.current = true\r\n\r\n if (valuesForm) {\r\n const values = { ...valuesForm.current } as TerminateProjectByAdminType.MyRequestFormType\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(values)\r\n parameterForSaveRef.current = parameterForSave\r\n newTabSelectedRef.current = newTabSelected\r\n tabSelectedIndexRef.current = tabIndex\r\n handleSaveDraft()\r\n }\r\n }\r\n\r\n const checkUseUploadEdit = () => {\r\n let isUseUploadEdit = false\r\n\r\n switch (manageProjectStore.projectData?.submitTypeInfo?.value) {\r\n case constSubmittedType.editAfterReview_terminateProject:\r\n isUseUploadEdit = true\r\n break\r\n default:\r\n isUseUploadEdit = false\r\n }\r\n\r\n return isUseUploadEdit\r\n }\r\n return {\r\n initialUploadFile,\r\n configDialog,\r\n onRefDialogTwo,\r\n selectedIrb,\r\n configLoading,\r\n valuesForm,\r\n projectData: manageProjectStore.projectData,\r\n handleDirtyChange,\r\n onClickSubmit: handleClickSubmit,\r\n onClickCancel: handleClickCancel,\r\n onClickClose: handleClickClose,\r\n handleChangeFaculty: handleChangeFaculty,\r\n onChangeResearcherType: handleChangeResearcherType,\r\n checkUseUploadEdit,\r\n }\r\n}\r\n\r\nexport default useTerminateProjectByAdmin\r\n","import React from 'react'\r\nimport * as TerminateProjectByAdminType from './terminateProjectByAdminType'\r\nimport useTerminateProjectByAdmin from './useTerminateProjectByAdmin'\r\n\r\n// --- MaterialUI --- //\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\n\r\n// --- FinalForm --- //\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n// --- Control --- //\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\n\r\n// --- Share UI --- //\r\nimport EthicsForm from '../../../../shareUI/ethicsForm/ethicsForm'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport RemarkFromAdmin from '../../../../shareUI/remarkFromAdmin/remarkFromAdmin'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useSnackbarAction from '../../../../../../stores/snackbar/snackbarAction'\r\n\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\ntype ErrorsType = {\r\n langTH?: string\r\n langEN?: string\r\n}\r\n\r\n//View\r\nconst TerminateProjectByAdminView = (props: TerminateProjectByAdminType.TerminateProjectByAdminViewType) => {\r\n const {\r\n onClickSubmit,\r\n onClickCancel,\r\n onRefDialogTwo,\r\n configDialog,\r\n handleChangeFaculty,\r\n selectedIrb,\r\n // --- props from outer --- //\r\n btnClose,\r\n initialData = {},\r\n isViewMode = false,\r\n initialUploadFile = [],\r\n projectData,\r\n handleDirtyChange,\r\n onChangeResearcherType,\r\n valuesForm,\r\n formValueRef,\r\n checkUseUploadEdit,\r\n } = props\r\n //* STORE *//\r\n const manageProjectStore = useManageProjectStore()\r\n const snackbarAction = useSnackbarAction()\r\n const checkPermissionHook = checkPermission()\r\n const isResearcher = checkPermissionHook.isUserResearcher()\r\n\r\n const { documentTopic } = manageProjectStore\r\n\r\n const translate = useTranslate()\r\n const uploadFileinit = documentTopic?.map(() => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n },\r\n }\r\n })\r\n\r\n const isNotCompleteDocument = projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument\r\n const isDisableDoc = isViewMode && (!isNotCompleteDocument || !checkUseUploadEdit())\r\n\r\n return (\r\n 0 ? initialUploadFile : uploadFileinit,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n validate={(values) => {\r\n const errors: ErrorsType = {}\r\n if (!values.langTH && !values.langEN) {\r\n errors.langTH = translate.get('MESSAGE.M016')\r\n\r\n errors.langEN = translate.get('MESSAGE.M016')\r\n }\r\n\r\n return errors\r\n }}\r\n >\r\n {({ handleSubmit, form, dirty, invalid, errors, values }) => {\r\n valuesForm.current = values\r\n if (formValueRef) formValueRef.current = values\r\n return (\r\n \r\n \r\n {isNotCompleteDocument && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {!isResearcher && (\r\n \r\n \r\n \r\n )}\r\n\r\n {!btnClose && (\r\n \r\n {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst TerminateProjectByAdmin = (props: TerminateProjectByAdminType.TerminateProjectByAdminType) => {\r\n const terminateProjectByAdminModel = useTerminateProjectByAdmin(props)\r\n return \r\n}\r\nexport default TerminateProjectByAdmin\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n gridBtn: {\r\n marginTop: '2%',\r\n },\r\n}))\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as memoMessageType from './resultOfConsiderType'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\nimport { ResultTerminateMemoMessageResponse } from '../../../../../../services/web/types/responseWebServiceTypes'\r\n\r\nconst useMemomessageTerminate = (props: memoMessageType.UseMemoMessageType) => {\r\n const {} = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const callLookup = useLookupService()\r\n const [terminateCauseList, setTerminateCause] = React.useState<{ id: number; name_th: string; name_en: string }[]>(\r\n [],\r\n )\r\n const [isCheckedOther, setIsCheckedOther] = React.useState(false)\r\n const [initialCommentCommitee, setInitialCommentCommitee] = React.useState()\r\n const [initialMemoMessagePaper, setInitialMemoMessagePaper] = React.useState<{\r\n TH: InitialRichTextEditorType\r\n EN: InitialRichTextEditorType\r\n }>()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n\r\n // }, [JSON.stringify(projectData)])\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getLutTerminateProjectCause()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getLutTerminateProjectCause = async () => {\r\n const res = await callLookup.getTerminateCause(1, 8)\r\n setTerminateCause(res.result)\r\n }\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n if (submittedID) {\r\n const res = await callWebService.getProjectTerminateMemoMessage(submittedID)\r\n const result = res.result\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n terminateCause: {\r\n childSelected: [],\r\n parentSelected: result.causeInfo,\r\n },\r\n terminateCauseOther: result.causeRemark,\r\n approveStatus:\r\n result && result?.approveStatusInfo\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result.approveStatusInfo.nameTH\r\n : result.approveStatusInfo.nameEN,\r\n value: result?.approveStatusInfo.value.toString(),\r\n }\r\n : null,\r\n }\r\n\r\n const initialCommentCommittee = createInitialSuggestion(result)\r\n\r\n const initialMemoMessagePaper = {\r\n TH: {\r\n contentHtml: result?.memoMessagePaper_th_html,\r\n contentText: result?.memoMessagePaper_th,\r\n },\r\n EN: {\r\n contentHtml: result?.memoMessagePaper_en_html,\r\n contentText: result?.memoMessagePaper_en,\r\n },\r\n }\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n setInitialCommentCommitee(initialCommentCommittee)\r\n setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n /**\r\n * createInitial\r\n */\r\n const createInitialSuggestion = (content?: ResultTerminateMemoMessageResponse) => {\r\n const initialSugestionNotice = {\r\n contentHtml: content?.memoMessageComment_html ?? '',\r\n contentText: content?.memoMessageComment ?? '',\r\n }\r\n\r\n return initialSugestionNotice\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.signPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.signPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n /**\r\n * process click button\r\n */\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n\r\n return {\r\n formRef,\r\n configDialog,\r\n isViewMode: isViewMode,\r\n initialValues,\r\n initialCommentCommitee,\r\n initialMemoMessagePaper,\r\n initialMemorandumFile,\r\n terminateCauseList,\r\n required,\r\n isCheckedOther,\r\n onRefDialog,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickOpenFile: handleClickOpenFile,\r\n }\r\n}\r\n\r\nexport default useMemomessageTerminate\r\n","import * as memoMessageType from './resultOfConsiderType'\r\nimport useMemomessageTerminate from './useResultOfConsider'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport TreeCheckbox from '../../../../../../control/treeCheckboxNew/treeCheckbox'\r\nimport MyTextfield from '../../../../../../control/textfield/textfield'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n projectData,\r\n isViewMode,\r\n initialValues,\r\n configDialog,\r\n terminateCauseList,\r\n onRefDialog,\r\n isCheckedOther,\r\n onClickBackToSearch,\r\n initialCommentCommitee,\r\n initialMemorandumFile,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSignMemoMessage: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n // //มีการออกใบบันทึกข้อความไปแล้ว\r\n // const isMemoMessage: boolean = projectData?.stepID === constSubmittedStep.sign\r\n\r\n return (\r\n {}}\r\n initialValues={{ ...initialValues, memorandumFile: initialMemorandumFile }}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n >\r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} : {translate.get('LABEL.APPROVE')}\r\n \r\n \r\n \r\n {/* {isMemoMessage && (\r\n \r\n \r\n \r\n \r\n {}}\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )} */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {isSignMemoMessage && (\r\n \r\n \r\n \r\n )}\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n {/* */}\r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport TerminateProjectRequestForm from '../../../page/requestNewProject/terminateProjectByAdmin/terminateProjectByAdmin'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/terminateProjectByAdmin/resultOfConsider'\r\nimport { menuTab } from '../../../../../../constants/constants'\r\n\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n return (\r\n \r\n )\r\n\r\n case menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as memoMessageType from './memoMessageType'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { DataSourceType } from '../../../../../../control/treeCheckboxNew/treeCheckbox'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { dateForAPI } from '../../../../../../utilities/date'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\nimport { ResultTerminateMemoMessageResponse } from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport { validateModeAccordionError } from '../../../../../../utilities/validate'\r\n\r\nconst useMemomessageTerminate = (props: memoMessageType.UseMemoMessageType) => {\r\n const { onSaveComplete } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const editRef = React.useRef()\r\n const callLookup = useLookupService()\r\n const [terminateCauseList, setTerminateCause] = React.useState<{ id: number; name_th: string; name_en: string }[]>(\r\n [],\r\n )\r\n const [isCheckedOther, setIsCheckedOther] = React.useState(false)\r\n const [initialCommentCommitee, setInitialCommentCommitee] = React.useState()\r\n const [initialMemoMessagePaper, setInitialMemoMessagePaper] = React.useState<{\r\n TH: InitialRichTextEditorType\r\n EN: InitialRichTextEditorType\r\n }>()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getLutTerminateProjectCause()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getLutTerminateProjectCause = async () => {\r\n const res = await callLookup.getTerminateCause(1, 8)\r\n // const formatedData = res.result.map((itm: any) => {\r\n // return {\r\n // label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n // value: `${itm.id}`,\r\n // }\r\n // })\r\n setTerminateCause(res.result)\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n const res = await callWebService.getProjectTerminateMemoMessage(submittedID)\r\n const result = res.result\r\n\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n terminateCause: {\r\n childSelected: [],\r\n parentSelected: result.causeInfo,\r\n },\r\n terminateCauseOther: result.causeRemark,\r\n }\r\n\r\n const initialCommentCommittee = createInitialSuggestion(result)\r\n const initialMemoMessagePaper = {\r\n TH: {\r\n contentHtml: result?.memoMessagePaper_th_html,\r\n contentText: result?.memoMessagePaper_th,\r\n },\r\n EN: {\r\n contentHtml: result?.memoMessagePaper_en_html,\r\n contentText: result?.memoMessagePaper_en,\r\n },\r\n }\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n setInitialCommentCommitee(initialCommentCommittee)\r\n setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n /**\r\n * SuggestionNotice\r\n */\r\n\r\n const createInitialSuggestion = (content?: ResultTerminateMemoMessageResponse) => {\r\n const initialSugestionNotice = {\r\n contentHtml: content?.memoMessageComment_html ?? '',\r\n contentText: content?.memoMessageComment ?? '',\r\n }\r\n\r\n return initialSugestionNotice\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.unSignPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.unSignPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n const listTerminateCauseID = value?.terminateCause.parentSelected.map(\r\n (terminateCause: { id: number; name_th: string; name_en: string }) => {\r\n return `${terminateCause.id}`\r\n },\r\n )\r\n let param: REQServiceType.ProjectTerminateMemomessageType = {\r\n submittedID: submittedID,\r\n comment: value?.commentCommittee?.contentText,\r\n comment_html: value?.commentCommittee?.contentHtml,\r\n memoMessagePaper_th: value?.memoMessagePaper_TH?.contentText,\r\n memoMessagePaper_en: value?.memoMessagePaper_EN?.contentText,\r\n memoMessagePaper_th_html: value?.memoMessagePaper_TH?.contentHtml,\r\n memoMessagePaper_en_html: value?.memoMessagePaper_EN?.contentHtml,\r\n memoMessageDate: value?.memoMessageDate ? dateForAPI(value?.memoMessageDate) ?? null : null,\r\n lstTerminateCauseID: listTerminateCauseID,\r\n terminateCauseOther: value?.terminateCauseOther,\r\n isDraft: isDraft,\r\n }\r\n\r\n return param\r\n }\r\n\r\n const handleChangProjectType = (val: memoMessageType.OptType) => {\r\n if (parseInt(val?.value) === 3) {\r\n setRequired(false)\r\n } else {\r\n setRequired(true)\r\n }\r\n }\r\n\r\n const handleDirtyChange = (props: any) => {\r\n let isDirty: boolean = false\r\n let newFormValue = _.omit(props.values, ['submitType'])\r\n let initValue = _.omit(\r\n {\r\n ...initialValues,\r\n memorandumFile: initialMemorandumFile,\r\n commentCommittee: {\r\n contentHtml: initialCommentCommitee?.contentHtml ?? '',\r\n contentText: initialCommentCommitee?.contentText ?? '',\r\n },\r\n memoMessagePaper_TH: {\r\n contentHtml: initialMemoMessagePaper?.TH.contentHtml ?? '',\r\n contentText: initialMemoMessagePaper?.TH.contentText ?? '',\r\n },\r\n memoMessagePaper_EN: {\r\n contentHtml: initialMemoMessagePaper?.EN.contentHtml ?? '',\r\n contentText: initialMemoMessagePaper?.EN.contentText ?? '',\r\n },\r\n },\r\n ['submitType'],\r\n )\r\n\r\n const isEqual = _.isEqual(initValue, newFormValue)\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft = true\r\n const param: REQServiceType.ProjectTerminateMemomessageType = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleSubmitForm = (value: any) => {\r\n // if (projectData?.projectID && projectData?.submittedID) {\r\n // let isReviewer = false\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param: REQServiceType.ProjectTerminateMemomessageType = getSaveServiceParameter(isDraft)\r\n if (isDraft) {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.ProjectTerminateMemomessageType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n try {\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.projectTerminateMemoMessage(param)\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useMemomessageTerminate.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleClickCheckbox = (selectedItem: DataSourceType) => {\r\n if (selectedItem.id === 4) {\r\n setIsCheckedOther(!isCheckedOther)\r\n }\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n\r\n const updateMemoMessage = async (param: REQServiceType.UpdateMemoMessageType) => {\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.updateMemoMessagePaper(param)\r\n\r\n if (res.result.status === 200) {\r\n dialogRef.current?.openDialog()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n setConfigDialog({})\r\n },\r\n })\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleSubmitUpdateMemo = (fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formRef.current)\r\n return new Promise(async (resolve, reject) => {\r\n if (isError) {\r\n formRef.current?.form?.submit()\r\n reject('')\r\n } else {\r\n resolve('')\r\n const param: REQServiceType.UpdateMemoMessageType = {\r\n submittedID: Number(projectData?.submittedID),\r\n memoMessagePaperTH: formRef.current?.values.memoMessagePaper_TH.contentText,\r\n memoMessagePaperEN: formRef.current?.values.memoMessagePaper_EN.contentText,\r\n memoMessagePaperTHHTML: formRef.current?.values.memoMessagePaper_TH.contentHtml,\r\n memoMessagePaperENHTML: formRef.current?.values.memoMessagePaper_EN.contentHtml,\r\n }\r\n\r\n updateMemoMessage(param)\r\n }\r\n })\r\n }\r\n\r\n const handleCancle = () => {\r\n const valueMessageTH: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_TH`].contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_TH`].contentText,\r\n }\r\n const valueMessageEN: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_EN`].contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_EN`].contentText,\r\n }\r\n setInitialMemoMessagePaper((prev) => ({\r\n TH: {\r\n ...prev?.TH,\r\n ...valueMessageTH,\r\n },\r\n EN: {\r\n ...prev?.EN,\r\n ...valueMessageEN,\r\n },\r\n }))\r\n }\r\n\r\n const onClickEdit = () => {\r\n editRef.current = formRef.current?.form.getState().values\r\n }\r\n return {\r\n formRef,\r\n required,\r\n configDialog,\r\n isCheckedOther,\r\n isViewMode: isViewMode,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialCommentCommitee,\r\n initialMemoMessagePaper,\r\n initialMemorandumFile,\r\n terminateCauseList,\r\n\r\n onRefDialog,\r\n onChangProjectType: handleChangProjectType,\r\n onDirtyChange: handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCheckbox: handleClickCheckbox,\r\n onClickOpenFile: handleClickOpenFile,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n }\r\n}\r\n\r\nexport default useMemomessageTerminate\r\n","import * as memoMessageType from './memoMessageType'\r\nimport useMemomessageTerminate from './useMemomessageTerminate'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport MyDatePicker from '../../../../../../control/datepicker/datepicker'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { richEditorRequired } from '../../../../../../utilities/validate'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialCommentCommitee,\r\n initialMemoMessagePaper,\r\n onRefDialog,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n onClickOpenFile,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const latestFolderIdx = 0\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n const isEdit = isViewMode && currentSelectFolder\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n

\\n'\r\n ? [richEditorRequired(translate.get('MESSAGE.M015'))]\r\n : []\r\n }\r\n />\r\n
\r\n
\r\n )\r\n }\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n {/* \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n */}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_TH']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_TH'])}\r\n onCancel={handleCancle}\r\n onClickEdit={onClickEdit}\r\n />\r\n \r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_EN']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_EN'])}\r\n onCancel={handleCancle}\r\n onClickEdit={onClickEdit}\r\n />\r\n \r\n\r\n \r\n \r\n \r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import MemoMessageTerminateREC1 from '../../../page/memoMessageTerminateProject/memoMessageTerminateREC1'\r\nimport MemoMessageTerminate from '../../../page/memoMessageTerminateProject/terminateProjectByAdmin/memoMessageTerminate'\r\n\r\nimport { OfficerType, OfficerViewType } from './officerType'\r\nimport useOfficer from './useOfficer'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport SignREC2 from '../../../page/sign/signMemoMessage/signREC2'\r\nimport SignREC1 from '../../../page/sign/signMemoMessage/signREC1'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC1'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport TerminateProjectRequestForm from '../../../page/requestNewProject/terminateProjectByAdmin/terminateProjectByAdmin'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/terminateProjectByAdmin/resultOfConsider'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete, projectMode, submittedType, initialData, isViewMode, formValueRef } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab21.id:\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab11.id:\r\n // code block
save REC1
\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab21.id:\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab11.id:\r\n // code block
save REC2
\r\n return (\r\n \r\n )\r\n case Constants.menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n const officer = useOfficer(props)\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as officerType from './officerType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: officerType.OfficerType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: officerType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: officerType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useTerminateProjectByAdmin from './useTerminateProjectByAdmin'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constProjectStatus from '../../../../../constants/projectStatus'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\n\r\ntype TerminateProjectByAdminViewType = ReturnType &\r\n Omit\r\nconst TerminateProjectByAdminView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const isAdmin = checkPermission.isUserAdmin()\r\n const isStatusComplete = projectData && projectData?.projectStatusInfo?.value === constProjectStatus.completed\r\n const isShowCloseProjectButton = isStatusComplete && isAdmin\r\n\r\n // const isBtnClose =\r\n // checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.synthesis ? false : isViewMode\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {isViewMode && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type TerminateProjectByAdminType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst TerminateProjectByAdmin: React.FC = (props) => {\r\n const terminateProjectByAdminModel = useTerminateProjectByAdmin(props)\r\n return \r\n}\r\nexport default TerminateProjectByAdmin\r\n","import React from 'react'\r\nimport { TerminateProjectByAdminType } from './terminateProjectByAdmin'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\n\r\nexport default (props: TerminateProjectByAdminType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n const loadingHook = useLoading()\r\n\r\n React.useEffect(() => {\r\n console.log('####TERMINATE PROJECT####')\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\n","import React from 'react'\r\nimport * as ProjectRenewalType from './projectRenewalType'\r\n\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\n\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport { topicForLecturer, topicForStudent } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\n\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport * as REQServiceTypes from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport _ from 'lodash'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport { encryptionAES } from '../../../../../../utilities/encryption'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { ResultDocumentTopicLut } from '../../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport useProjectHook from '../../../../shareLogic/useProjectHook'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\n\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\n\r\ntype MyFileDataType = {\r\n documentTopicID?: number\r\n fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }>\r\n subtopic?: {\r\n subtopicID: number\r\n page: number | string\r\n }[]\r\n}\r\n\r\nconst useRequestForm = (props: ProjectRenewalType.UseRequestFormType) => {\r\n const { formMode, projectSubmittedTypeID, isViewMode, onSaveComplete, initialData } = props\r\n\r\n const translate = useTranslate()\r\n const authenStore = useAuthenStore()\r\n const projectHook = useProjectHook()\r\n\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const checkPermission = useCheckPermission()\r\n\r\n const { profile } = authenStore\r\n\r\n const { configLoading, loadingClose, loadingOpen } = useLoading()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const callLookup = useLookupService()\r\n const [selectedIrb, setSelectedIrb] = React.useState('1')\r\n\r\n const dialogTwoRef = React.useRef>()\r\n const projectIDRef = React.useRef()\r\n const submittedIDRef = React.useRef()\r\n const irbRef = React.useRef()\r\n const parameterForSaveRef = React.useRef()\r\n const submitValueRef = React.useRef()\r\n const isDraftRef = React.useRef(false)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const { documentTopic } = manageProjectStore\r\n const researcherTypeRef = React.useRef()\r\n const documentTopicRef = React.useRef()\r\n const valuesForm = React.useRef()\r\n const tabSelectedIndexRef = React.useRef(null)\r\n const newTabSelectedRef = React.useRef(null)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n let isApproveWithComment = false\r\n if (manageProjectStore.projectData) {\r\n isApproveWithComment = projectHook.isFlowApproveWithComment(manageProjectStore.projectData)\r\n }\r\n\r\n React.useEffect(() => {\r\n console.log('####Page: New Project####')\r\n return () => {\r\n //clear ค่า tabRef\r\n tabSelectedIndexRef.current = null\r\n newTabSelectedRef.current = null\r\n }\r\n }, [])\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData?.irb && manageProjectStore.projectData?.submitTypeInfo.value) {\r\n getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n manageProjectStore.projectData?.submitTypeInfo.value,\r\n )\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n // const fileTokenInfo: Array = uploadObj.uploadFileObj.fileList?.map((file) => file.fileToken) ?? []\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n const getParameterForSave = (value: ProjectRenewalType.MyRequestFormType) => {\r\n let submittedTypeID = projectSubmittedTypeID\r\n if (manageProjectStore && manageProjectStore?.projectData) {\r\n if (manageProjectStore.projectData.submitTypeInfo && manageProjectStore.projectData.submitTypeInfo?.value) {\r\n submittedTypeID = manageProjectStore.projectData.submitTypeInfo?.value\r\n }\r\n }\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = {\r\n projectID: manageProjectStore?.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore?.projectData?.submittedID ?? null,\r\n irb: value.IRB ? parseInt(value.IRB.value) : null, //parseInt(value?.faculty?.irb) || null\r\n userID: profile.userId as number,\r\n projectName_th: value?.projectNameTH || null,\r\n projectName_en: value?.projectNameEN || null,\r\n // projectSubmitTypeID: value?.isPhase ? parseInt(value.isPhase) : null, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n projectSubmitTypeID: submittedTypeID, //1, // hard code ประเภทการยื่น เป็น 1 (โครงการใหม่)\r\n\r\n facultyID: value.faculty ? parseInt(value.faculty.value) : null,\r\n requestPhase: value.numPhase ? value.numPhase : null,\r\n isTools: value.isPhase === '2' ? (value.isTools === '2' ? true : false) : null,\r\n researcherTypeID: value.researcherType ? parseInt(value.researcherType.value) : null,\r\n titleNameID: value.titleName ? parseInt(value.titleName) : null,\r\n // titleNameOther: value.otherTitleName ? value.otherTitleName : null,\r\n titleNameOther_th: value.otherTitleNameTH ? value.otherTitleNameTH : null,\r\n titleNameOther_en: value.otherTitleNameEN ? value.otherTitleNameEN : null,\r\n academicPositionID: value.academicPosition ? parseInt(value.academicPosition) : null,\r\n // academicPositionOther: value.otherAcademicPosition ? value.otherAcademicPosition : null,\r\n academicPositionOther_th: value.otherAcademicPositionTH ? value.otherAcademicPositionTH : null,\r\n academicPositionOther_en: value.otherAcademicPositionEN ? value.otherAcademicPositionEN : null,\r\n educationLevelID: value.educationLevel ? parseInt(value.educationLevel.value) : null,\r\n researcherName_th: value.nameTH ? value.nameTH : null,\r\n researcherName_en: value.nameEN ? value.nameEN : null,\r\n email: value.email ? value.email : null,\r\n homePhone: value.homePhone ? value.homePhone : null,\r\n mobilePhone: value.mobilePhone ? value.mobilePhone : null,\r\n fax: value.fax ? value.fax : null,\r\n isDraft: value?.submitType === 'save' ? false : true,\r\n documentInfo: getDocumentInfo(value),\r\n isLanguage_th: value.langTH ? value.langTH : false,\r\n isLanguage_en: value.langEN ? value.langEN : false,\r\n isRequestCertificatePaper: value.isCertificatePaperList === '1' ? true : false,\r\n isDr: value.isDr ? value.isDr : false,\r\n }\r\n\r\n return parameterForSave\r\n }\r\n const handleClickSubmit = (value: ProjectRenewalType.MyRequestFormType) => {\r\n submitValueRef.current = value\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(value)\r\n parameterForSaveRef.current = parameterForSave\r\n switch (value.submitType) {\r\n case 'save':\r\n // code block\r\n isDraftRef.current = false\r\n handleSave()\r\n\r\n break\r\n\r\n case 'draft':\r\n // code block\r\n isDraftRef.current = true\r\n handleSaveDraft()\r\n\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n const checkRequirePDF = (documentInfo: MyFileDataType[]) => {\r\n let isRequirePDF = false\r\n\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if (documentInfo[i]?.fileTokenInfo[j].fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n const checkSubtopic = (documentInfo: MyFileDataType[]) => {\r\n let isEmptyPage = false\r\n\r\n //หาว่าหัวข้ออัปโหลดเอกสารมีให้อัปโหลดหัวข้อย่อยมั้ย\r\n const docTopic = manageProjectStore.documentTopic?.filter((item) => item.subtopic.length > 0)\r\n\r\n //ถ้ามีให้เข้าไปเช็คตามเงื่อนไข if\r\n if (docTopic?.length) {\r\n // วน loop หัวข้อที่มีให้อัปโหลดเอกสารหัวข้อย่อย\r\n docTopic.forEach((mainTopic) => {\r\n // วน loop หัวข้อที่มีการอัปโหลดเอกสารเข้ามา\r\n documentInfo.forEach((itm) => {\r\n // เช็คว่าเอกสารที่มีการอัปโหลดเข้ามาใช่เอกสารที่มีหัวข้อย่อยให้อัปโหลดหรือป่าว\r\n if (mainTopic.id === itm.documentTopicID) {\r\n // เช็คว่าหัวข้อย่อยที่อัพโหลดเข้ามาครบมั้ย\r\n if (itm.subtopic?.length != mainTopic.subtopic.length) {\r\n isEmptyPage = true\r\n } else {\r\n // เช็คว่าที่อัปมาครบมีช่องไหนกรอกเป็น ช่องว่างมั้ย\r\n const chkEmpty = itm.subtopic.find(\r\n (e) => e.page == null || e.page == '' || e.page == undefined,\r\n )\r\n if (chkEmpty) {\r\n isEmptyPage = true\r\n }\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n return isEmptyPage\r\n }\r\n const validateRequiredUploadFile = (uploadFile: Array<{ uploadFileObj: any }>, skipValidate: boolean = false) => {\r\n let isValid = true\r\n if (!skipValidate) {\r\n uploadFile?.every(({ uploadFileObj: file }) => {\r\n if (file?.isRequired && file?.fileList?.length === 0) {\r\n //เป็นหัวข้อที่มีการ required แต่ว่าไม่ upload เอกสาร\r\n isValid = false\r\n return false //break\r\n }\r\n return true //continue\r\n })\r\n\r\n if (!isValid) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get2Element('ALERT.CONTENT.PLEASE_UPLOAD_REQUIRED_TOPIC', [\r\n '',\r\n ]) as any,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n return isValid\r\n }\r\n const handleSave = async () => {\r\n if (validateRequiredUploadFile(submitValueRef.current.uploadFile)) {\r\n if (parameterForSaveRef.current?.documentInfo?.length === 0) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n const isRequirePDF = checkRequirePDF(parameterForSaveRef.current?.documentInfo)\r\n const isEmptyPage = checkSubtopic(parameterForSaveRef.current?.documentInfo)\r\n if (isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else if (isEmptyPage) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.PLEASE_COMPLETE_PAGE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: handleClickConfirmSave,\r\n })\r\n }\r\n }\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const handleSaveDraft = async () => {\r\n handleClickConfirmSave()\r\n }\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const handleClickConfirmSave = async () => {\r\n loadingOpen()\r\n let res\r\n if (isApproveWithComment) {\r\n const parameterEditAfterReview = _.pick(parameterForSaveRef.current, [\r\n 'documentInfo',\r\n 'isDraft',\r\n 'projectID',\r\n 'submittedID',\r\n ])\r\n res = await callWebService.projectApproveWithComment(parameterEditAfterReview)\r\n } else {\r\n //Flow ยื่นโครงการใหม่ + Flow แก้ไขหลังพิจารณา\r\n res = await callWebService.projectRenewalManagement(parameterForSaveRef.current)\r\n }\r\n loadingClose()\r\n\r\n setConfigDialog({}) //clear function dialog\r\n dialogTwoRef.current?.closeDialog()\r\n if (formMode === 'EDIT') {\r\n if (onSaveComplete) onSaveComplete(res?.status, parameterForSaveRef.current?.isDraft as boolean)\r\n } else if (formMode === 'CREATE') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: handleAfterCloseCreateSuccess,\r\n })\r\n appFolderAndTabAction.resetTabDirty()\r\n dialogTwoRef.current?.openDialog()\r\n projectIDRef.current = res.result?.projectInfo?.projectID\r\n submittedIDRef.current = res.result?.projectInfo?.submittedID\r\n irbRef.current = res.result?.projectInfo?.irb\r\n }\r\n }\r\n\r\n const handleAfterCloseCreateSuccess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n //เล่นใน mode create save เสร็จจะต้องไปเข้าหน้า Edit/View\r\n const encryptedProjectID = encryptionAES(`${projectIDRef.current}`)\r\n const encryptedSubmittedID = encryptionAES(`${submittedIDRef.current}`)\r\n const path = generatePath(RoutePath.manageProjectEdit, {\r\n projectID: encryptedProjectID,\r\n submittedID: encryptedSubmittedID,\r\n })\r\n history.push({\r\n pathname: path, // editMode\r\n })\r\n }\r\n\r\n const handleChangeFaculty = (irb?: string) => {\r\n if (irb) {\r\n const submittedTypeID =\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration\r\n getDocumentTopicLut(parseInt(irb), submittedTypeID)\r\n }\r\n }\r\n\r\n const handleChangeResearcherType = (val?: string) => {\r\n if (val) {\r\n filterTopicUpload(val)\r\n researcherTypeRef.current = val\r\n }\r\n }\r\n\r\n const filterTopicUpload = (val: string) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n if (documentTopic && documentTopicRef.current) {\r\n let isDocTopic = documentTopicRef.current\r\n if (val === '1') {\r\n topicForLecturer.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submittType: number) => {\r\n let submittedTypeID = projectSubmittedTypeID ? projectSubmittedTypeID : submittType\r\n\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submittedTypeID)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n\r\n if (researcherTypeRef.current) {\r\n filterTopicUpload(researcherTypeRef.current)\r\n }\r\n\r\n //กรองหัวข้อตามประเภทนักวิจัย กรณีที่มีข้อมูล projectData\r\n if (manageProjectStore.projectData?.researcherTypeInfo.value) {\r\n const researcherTypeID = manageProjectStore.projectData?.researcherTypeInfo.value\r\n filterTopicUpload(researcherTypeID.toString())\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n let documentInfo = manageProjectStore.projectData?.documentInfo\r\n let latestDocument = manageProjectStore.projectData?.latestDocument\r\n // const uploadFileinit: Array = documentTopicList?.map((itm: any, idx: number) => {\r\n let uploadFileInit = documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n let fileList = docInfo?.fileInfo?.map((file: any) => ({\r\n documentTopicID: docInfo.topicID,\r\n fileToken: file.fileToken, //fileToken\r\n filename: file.filename,\r\n fileID: file.fileID, //fileToken\r\n path: file.path,\r\n replaceFileID: file.replaceFileID,\r\n }))\r\n itm.uploadFileObj.fileList = fileList\r\n const subtopic = docInfo.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docInfo.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n itm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n })\r\n })\r\n\r\n //Section Replace File\r\n if (latestDocument && latestDocument?.length > 0) {\r\n uploadFileInit?.forEach((initFileItm) => {\r\n //loop structure init file\r\n\r\n latestDocument?.forEach((docItm) => {\r\n //loop document topic\r\n const docFileInfo = docItm.fileInfo\r\n\r\n docFileInfo?.forEach((replaceFileItm: any) => {\r\n //loop file in document\r\n const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n if (replaceFile && replaceFileBy) {\r\n if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n initFileItm.uploadFileObj.fileList = [\r\n ...initFileItm.uploadFileObj.fileList,\r\n {\r\n documentTopicID: docItm.topicID,\r\n fileToken: replaceFileBy.fileToken, //fileToken\r\n filename: replaceFileBy.filename,\r\n fileID: replaceFileBy.fileID, //fileToken\r\n path: replaceFileBy.path,\r\n replaceFileID: replaceFileBy.replaceFileID,\r\n } as any,\r\n ]\r\n\r\n const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n page: sub.page,\r\n documentTopicID: docItm.topicID,\r\n subtopicID: sub.subtopicID,\r\n }))\r\n initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n }\r\n }\r\n })\r\n })\r\n })\r\n }\r\n // //**** Initial File Edit ****//\r\n // if (latestDocument && latestDocument.length > 0) {\r\n // uploadFileInit?.forEach((itm: UploadFileObjType) => {\r\n // latestDocument?.forEach((latestDocInfo: any) => {\r\n // let latestFile = []\r\n // let previousFile = []\r\n // if (latestDocInfo?.fileInfo[0]) {\r\n // latestFile = latestDocInfo.fileInfo[0].latestFileList.filter((itm: any) => itm.no === null)\r\n // previousFile =\r\n // latestDocInfo.fileInfo[0].latestFileList[\r\n // latestDocInfo.fileInfo[0].latestFileList.length - 2\r\n // ]\r\n // }\r\n // if (latestFile.length > 0) {\r\n // if (latestDocInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n // let fileList = [\r\n // {\r\n // documentTopicID: latestDocInfo.topicID,\r\n // fileToken: latestFile[0].fileToken, //fileToken\r\n // filename: latestFile[0].filename,\r\n // fileID: latestFile[0].fileToken, //fileToken\r\n // path: latestFile[0].path,\r\n // replaceFileID: previousFile?.fileID,\r\n // },\r\n // ]\r\n // itm.uploadFileObj.fileList = fileList\r\n // itm.uploadFileObj.subTopicPageList = []\r\n // }\r\n // }\r\n // })\r\n // })\r\n // }\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const handleClickClose = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n const handleDirtyChange = (props: any) => {\r\n const paramsDirty = {\r\n tabDirty: isViewMode ? false : props.dirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n isDraftRef.current = true\r\n\r\n if (valuesForm) {\r\n const values = { ...valuesForm.current } as ProjectRenewalType.MyRequestFormType\r\n const parameterForSave: REQServiceTypes.CreateProjectRequestType = getParameterForSave(values)\r\n parameterForSaveRef.current = parameterForSave\r\n newTabSelectedRef.current = newTabSelected\r\n tabSelectedIndexRef.current = tabIndex\r\n handleSaveDraft()\r\n }\r\n }\r\n const handleDeleteProject = () => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_DELETE'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: async () => {\r\n if (manageProjectStore?.projectData?.projectID) {\r\n const res = await callWebService.deleteProject(manageProjectStore?.projectData?.projectID)\r\n setConfigDialog({}) //clear function dialog\r\n history.push('/manage-project')\r\n }\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const chkDisplayBTNDeleteProject: boolean =\r\n (initialData?.projectSubmitType &&\r\n checkPermission.chkDisplayBTNDeleteProject(parseInt(initialData?.projectSubmitType.value)) &&\r\n initialData?.isDraft &&\r\n manageProjectStore.projectData?.verifyDocument == null) ||\r\n false\r\n\r\n return {\r\n isDraftData: chkDisplayBTNDeleteProject,\r\n initialUploadFile,\r\n configDialog,\r\n onRefDialogTwo,\r\n selectedIrb,\r\n configLoading,\r\n valuesForm,\r\n isApproveWithComment,\r\n projectData: manageProjectStore.projectData,\r\n handleDirtyChange,\r\n onClickSubmit: handleClickSubmit,\r\n onClickCancel: handleClickCancel,\r\n onClickClose: handleClickClose,\r\n handleChangeFaculty: handleChangeFaculty,\r\n onChangeResearcherType: handleChangeResearcherType,\r\n onClickDeleteProject: handleDeleteProject,\r\n }\r\n}\r\n\r\nexport default useRequestForm\r\n","import React from 'react'\r\nimport * as projectRenewalType from './projectRenewalType'\r\nimport useProjectRenewal from './useProjectRenewal'\r\n\r\n// --- MaterialUI --- //\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\n\r\n// --- FinalForm --- //\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n// --- Control --- //\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\n\r\n// --- Share UI --- //\r\nimport EthicsForm from '../../../../shareUI/ethicsForm/ethicsForm'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport RemarkFromAdmin from '../../../../shareUI/remarkFromAdmin/remarkFromAdmin'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useSnackbarAction from '../../../../../../stores/snackbar/snackbarAction'\r\n\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\ntype ErrorsType = {\r\n langTH?: string\r\n langEN?: string\r\n}\r\n\r\n//View\r\nconst RequestFormView = (props: projectRenewalType.RequestFormView) => {\r\n const {\r\n onClickSubmit,\r\n onClickCancel,\r\n // onClickClose,\r\n onRefDialogTwo,\r\n configDialog,\r\n handleChangeFaculty,\r\n selectedIrb,\r\n // configLoading,\r\n isApproveWithComment,\r\n isEditAfterReview = false,\r\n // --- props from outer --- //\r\n btnClose,\r\n initialData = {},\r\n isViewMode = false,\r\n initialUploadFile = [],\r\n projectData,\r\n handleDirtyChange,\r\n onChangeResearcherType,\r\n valuesForm,\r\n formValueRef,\r\n isDraftData,\r\n onClickDeleteProject,\r\n } = props\r\n //* STORE *//\r\n const manageProjectStore = useManageProjectStore()\r\n const snackbarAction = useSnackbarAction()\r\n\r\n const { documentTopic } = manageProjectStore\r\n\r\n const translate = useTranslate()\r\n const uploadFileinit = documentTopic?.map(() => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n },\r\n }\r\n })\r\n\r\n const isNotCompleteDocument = projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument\r\n const isDisableDoc = isViewMode && (!isNotCompleteDocument || !isApproveWithComment)\r\n\r\n let isDisableIRB = false\r\n if (isApproveWithComment) {\r\n isDisableIRB = true //Flow approveWithComment ให้ Disable IRB\r\n }\r\n\r\n let isUploadEditMode = false\r\n // if (isApproveWithComment || isNotCompleteDocument || isEditAfterReview) {\r\n if (isApproveWithComment || isEditAfterReview) {\r\n isUploadEditMode = true\r\n }\r\n\r\n return (\r\n 0 ? initialUploadFile : uploadFileinit,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n validate={(values) => {\r\n const errors: ErrorsType = {}\r\n if (!values.langTH && !values.langEN) {\r\n errors.langTH = translate.get('MESSAGE.M016')\r\n\r\n errors.langEN = translate.get('MESSAGE.M016')\r\n }\r\n\r\n return errors\r\n }}\r\n >\r\n {({ handleSubmit, form, dirty, invalid, errors, values }) => {\r\n valuesForm.current = values\r\n if (formValueRef) formValueRef.current = values\r\n return (\r\n \r\n \r\n {isNotCompleteDocument && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {!btnClose && (\r\n \r\n {\r\n onClickDeleteProject()\r\n }\r\n : undefined\r\n }\r\n onClickClose={() => {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n form.change('submitType', 'save')\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={() => {\r\n form.change('submitType', 'draft')\r\n handleSubmit()\r\n }}\r\n />\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst RequestFormCtrl = (props: projectRenewalType.RequestFormType) => {\r\n const requestFormModel = useProjectRenewal(props)\r\n return \r\n}\r\nexport default RequestFormCtrl\r\nconst useStyles = makeStyles((theme) => ({\r\n spacingButton: {\r\n marginBottom: '10px',\r\n },\r\n gridBtn: {\r\n marginTop: '2%',\r\n },\r\n}))\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport ProjectRenewal from '../../../page/requestNewProject/projectRenewal/projectRenewal'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/resultOfConsider'\r\nimport NoticeAdditionalDocument from '../../../page/noticeAdditionalDocument/noticeAdditionalDocument'\r\nimport CertificateStampDocument from '../../../page/certificateStampDocument/certificateStampDocument'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\nimport { menuTab } from '../../../../../../constants/constants'\r\n\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return (\r\n //
PROJECT RENEWAL
\r\n \r\n )\r\n case menuTab.tab22.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab24.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import React from 'react'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as syntheticFormTypes from './synthesisType'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\nimport _ from 'lodash'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { requestWebServiceTypes } from '../../../../../services/web/types'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport { TabSelectedType } from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { DatasourceForCopyToClipbaord } from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport submittedStep from '../../../../../constants/submittedStep'\r\nimport { convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport useEditSynthesis from '../../../shareLogic/useEditSynthesis'\r\nimport { DatasourceForExport } from '../../../../../control/exportToMSWord/exportToMSWord'\r\n\r\nconst useSynthesis = (props: syntheticFormTypes.UseSynthetic) => {\r\n const { callbackSaveComplete, isOneComment } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const tabAndFolderHook = useFolderAndTab()\r\n\r\n const projectData = manageProjectStore.projectData\r\n const [isExempt, setIsExempt] = React.useState(false)\r\n const loadingHook = useLoading()\r\n const translate = useTranslate()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [reviewer, setReviewer] = React.useState([])\r\n const [commentTitleList, setCommentTitleList] = React.useState([])\r\n const [initialSynthesis, setInitialSynthesis] = React.useState()\r\n const [synthesisProject, setSynthesisProject] = React.useState()\r\n const [commentList, setCommentList] = React.useState([])\r\n const [remarkList, setRemarkList] = React.useState([])\r\n const [isRequired, setIsRequired] = React.useState(false)\r\n const [isEditSynthsisSuccess, setIsEditSynthesisSuccess] = React.useState(false)\r\n const formRef = React.useRef()\r\n const [textRemaining, setTextRemaining] = React.useState([])\r\n const [textRemainingRemark, setTextRemainingRemark] = React.useState()\r\n const defaultRemarkRef = React.useRef()\r\n const checkPermissionHook = checkPermission()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const profileStore = authenStore()\r\n const { profile } = profileStore\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const history = useHistory()\r\n const formValues = React.useRef()\r\n\r\n const [dataSourceForCopyToClipboard, setDataSourceForCopyToClipboard] = React.useState<\r\n DatasourceForCopyToClipbaord[]\r\n >([])\r\n const [dataSourceForExport, setDataSourceForExport] = React.useState([])\r\n const editSynthesis = useEditSynthesis({ form: formRef.current, setIsEditSynthesisSuccess })\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n React.useEffect(() => {\r\n if (projectData) {\r\n //check ประเภทพโครงการ กรณีเป็นโครงการประเภท excempt ถ้าเป็น excempt แสดงแบบกล่องเดียว\r\n\r\n if (isOneComment) {\r\n setIsExempt(true)\r\n } else {\r\n setIsExempt(false)\r\n }\r\n if (projectData?.irb) {\r\n getReviewer(projectData.irb)\r\n }\r\n\r\n getCommentaryTopicLut(projectData?.irb)\r\n }\r\n\r\n getSynthesisProjectByID()\r\n getAllCommentaryForExport()\r\n }, [\r\n projectData?.projectID ?? null,\r\n projectData?.submittedID ?? null,\r\n translate.languageStore.currentLanguage,\r\n isEditSynthsisSuccess,\r\n ])\r\n\r\n React.useEffect(() => {\r\n createInitialSynthesis()\r\n }, [commentTitleList, synthesisProject])\r\n\r\n const getReviewer = async (irb: number) => {\r\n if (irb) {\r\n const res = await callLookup.callReviewerLut(irb)\r\n const formatData = res.result.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n setReviewer(formatData)\r\n }\r\n }\r\n\r\n const getCommentaryTopicLut = async (irb: number) => {\r\n if (irb) {\r\n const res = await callLookup.callCommentaryTopicLut(irb)\r\n if (res.result) {\r\n const formatData = res.result.map((itm: any, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n setCommentTitleList(formatData)\r\n }\r\n }\r\n }\r\n\r\n const getSynthesisProjectByID = async () => {\r\n if (projectData) {\r\n loadingHook.loadingOpen()\r\n const { result } = await callWebService.getSynthesisProjectByID(projectData.submittedID)\r\n const dataForCopyToClipboard = [\r\n {\r\n fullNameTH: result.fullReviewer_th ? result.fullReviewer_th : ' ',\r\n fullNameEN: result.fullReviewer_en ? result.fullReviewer_en : ' ',\r\n updatedDate: convertDateToFormatTH(result.updatedDate),\r\n updateByNameTH: result.updatedByNameTH,\r\n updateByNameEN: result.updatedByNameEN,\r\n approveStatusNameTH: result.approveStatusName_th ?? '',\r\n approveStatusNameEN: result.approveStatusName_en ?? '',\r\n commentaryInfo: result.synthesisInfo.map((itm) => {\r\n return {\r\n topicID: itm.topicID,\r\n no: itm.no,\r\n comment: itm.comment.contentText,\r\n comment_htmltag: itm.comment?.contentHtml\r\n ? itm.comment?.contentHtml\r\n .replaceAll('', '')\r\n .replaceAll('', '')\r\n .replaceAll('', '')\r\n .replaceAll('', '')\r\n : itm.comment?.contentHtml,\r\n name_th:\r\n profile.irb === 1 && itm.topicName_th_irb1\r\n ? itm.topicName_th_irb1\r\n : profile.irb === 2 && itm.topicName_th_irb2\r\n ? itm.topicName_th_irb2\r\n : 'ข้อคิดเห็น / ข้อสังเกต',\r\n name_en:\r\n profile.irb === 1 && itm.topicName_en_irb1\r\n ? itm.topicName_en_irb1\r\n : profile.irb === 2 && itm.topicName_en_irb2\r\n ? itm.topicName_en_irb2\r\n : 'ข้อคิดเห็น / ข้อสังเกต',\r\n }\r\n }),\r\n },\r\n ]\r\n setDataSourceForCopyToClipboard(dataForCopyToClipboard)\r\n\r\n loadingHook.loadingClose()\r\n setSynthesisProject(result)\r\n }\r\n }\r\n\r\n const createInitialData = () => {\r\n const conditionRemark =\r\n synthesisProject && synthesisProject?.synthesisRemarkInfo && synthesisProject?.synthesisRemarkInfo?.remark\r\n\r\n const remark = synthesisProject?.synthesisRemarkInfo?.remark\r\n const countStrRemark = remark ? remark.length : 0\r\n const textRemainingRemarkInitial = 4000 - countStrRemark\r\n\r\n const initialData = {\r\n reviewer:\r\n projectData && projectData.reviewerName_th\r\n ? { label: projectData.reviewerName_th, value: projectData.reviewerUserID.toString() }\r\n : {},\r\n approveStatus:\r\n synthesisProject && synthesisProject?.approveStatusID\r\n ? {\r\n label: synthesisProject.approveStatusName_th,\r\n value: synthesisProject?.approveStatusID.toString(),\r\n }\r\n : null,\r\n submittedID: synthesisProject && synthesisProject?.submittedID ? synthesisProject?.submittedID : null,\r\n remark: conditionRemark ? synthesisProject?.synthesisRemarkInfo?.remark : isViewMode ? '-' : null,\r\n progress_6_months: synthesisProject?.progress_6_months,\r\n progress_12_months: synthesisProject?.progress_12_months,\r\n }\r\n setTextRemainingRemark(textRemainingRemarkInitial)\r\n setInitialValues(initialData)\r\n }\r\n\r\n const createInitialSynthesis = () => {\r\n setInitialSynthesisInfo()\r\n setInitialRemarkSynthesisInfo()\r\n\r\n createInitialData()\r\n }\r\n const setInitialSynthesisInfo = () => {\r\n if (projectData && synthesisProject) {\r\n if (\r\n synthesisProject?.synthesisInfo.length > 1\r\n // projectData.submitTypeInfo.value !== constSubmittedType.editAfterReview //เช็คว่าต้องไม่ใช่โครงการที่เป็น แก้ไขหลังพิจารณา\r\n ) {\r\n setInitialSubComment() //เป็นหัวข้อ\r\n } else {\r\n setInitialComment() //เป็นแบบข้อเดียว\r\n }\r\n }\r\n }\r\n\r\n const setInitialSubComment = () => {\r\n const synthesisInit = commentTitleList?.map((itm: any) => {\r\n return {\r\n topic: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n id: itm.id,\r\n synthesisList: { contentHtml: '', contentText: '' },\r\n commentList: null,\r\n strTheRest: 4000,\r\n }\r\n })\r\n synthesisInit.forEach((item: any) => {\r\n synthesisProject?.synthesisInfo.forEach((info: syntheticFormTypes.synthesisProjectType) => {\r\n if (info.topicID === item.id) {\r\n item.topic =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? info.topicName_th\r\n : info.topicName_en\r\n item.id = info.topicID\r\n let defaultTextSynthesisList = ''\r\n let defaultHTMLSynthesisList = ''\r\n\r\n //จัดความคิดเห็นของกรรมการ\r\n const objComment = info.committeeCommentTopicInfo.map((itm: any, index) => {\r\n // //เอาคอมเม้นของกรรมการทุกคนมายำรวมกัน ขึ้นบรรทัดใหม่เมื่อเป็นอาจารย์คนถัดไป\r\n defaultTextSynthesisList =\r\n index === 0\r\n ? `${itm.comment?.contentText}`\r\n : `${defaultTextSynthesisList}\\n${itm.comment?.contentText}`\r\n defaultHTMLSynthesisList =\r\n index === 0\r\n ? `${itm.comment?.contentHtml}`\r\n : `${defaultHTMLSynthesisList}\\n${itm.comment?.contentHtml}`\r\n\r\n return {\r\n no: info.no,\r\n topicID: info.topicID,\r\n director:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.fullName_th\r\n : itm.fullName_en,\r\n comment: { contentText: itm.comment.contentText, contentHtml: itm.comment.contentHtml },\r\n approveStatusName:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.approveStatusName_th\r\n : itm.approveStatusName_en,\r\n saveCommentDate: itm.saveCommentDate,\r\n }\r\n })\r\n item.commentList = objComment\r\n item.synthesisList.contentText = info.comment?.contentText\r\n ? info.comment?.contentText\r\n : defaultTextSynthesisList\r\n item.synthesisList.contentHtml = info.comment?.contentHtml\r\n ? info.comment?.contentHtml\r\n : defaultHTMLSynthesisList\r\n const countTextComment = info.comment.contentText ? info.comment.contentText?.length : 0\r\n item.strTheRest = 4000 - countTextComment\r\n }\r\n })\r\n })\r\n\r\n const commentDirector = synthesisInit.map((itm) => {\r\n return itm.commentList\r\n })\r\n\r\n const textRemain = synthesisInit?.map((item) => {\r\n return item.strTheRest\r\n })\r\n setTextRemaining(textRemain)\r\n\r\n setCommentList(commentDirector)\r\n setInitialSynthesis(synthesisInit)\r\n }\r\n const setInitialComment = () => {\r\n const synthesisInit = [\r\n {\r\n topic: 'โครงการวิจัย',\r\n id: 1,\r\n synthesisList: { contentHtml: '', contentText: '' },\r\n commentList: null,\r\n strTheRest: 4000,\r\n },\r\n ]\r\n synthesisInit.forEach((item: any) => {\r\n synthesisProject?.synthesisInfo.forEach((info: syntheticFormTypes.synthesisProjectType) => {\r\n item.synthesisList = info.comment\r\n item.topic =\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? info.topicName_th\r\n : info.topicName_en\r\n item.id = info.topicID\r\n\r\n let defaultTextSynthesisList = ''\r\n let defaultHTMLSynthesisList = ''\r\n\r\n //จัดความคิดเห็นของกรรมการ\r\n const objComment = info.committeeCommentTopicInfo.map((itm: any, index) => {\r\n // //เอาคอมเม้นของกรรมการทุกคนมายำรวมกัน ขึ้นบรรทัดใหม่เมื่อเป็นอาจารย์คนถัดไป\r\n defaultTextSynthesisList =\r\n index === 0\r\n ? `${itm.comment?.contentText}`\r\n : `${defaultTextSynthesisList}\\n${itm.comment?.contentText}`\r\n defaultHTMLSynthesisList =\r\n index === 0\r\n ? `${itm.comment?.contentHtml}`\r\n : `${defaultHTMLSynthesisList}\\n${itm.comment?.contentHtml}`\r\n return {\r\n no: info.no,\r\n topicID: info.topicID,\r\n director:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.fullName_th\r\n : itm.fullName_en,\r\n comment: { contentText: itm.comment.contentText, contentHtml: itm.comment.contentHtml },\r\n approveStatusName:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.approveStatusName_th\r\n : itm.approveStatusName_en,\r\n saveCommentDate: itm.saveCommentDate,\r\n }\r\n })\r\n item.commentList = objComment\r\n item.synthesisList.contentText = info.comment?.contentText\r\n ? info.comment?.contentText\r\n : defaultTextSynthesisList\r\n item.synthesisList.contentHtml = info.comment?.contentHtml\r\n ? info.comment?.contentHtml\r\n : defaultHTMLSynthesisList\r\n const countTextComment = info.comment.contentText ? info.comment.contentText?.length : 0\r\n item.strTheRest = 4000 - countTextComment\r\n })\r\n })\r\n const commentDirector = synthesisInit.map((itm: any) => {\r\n return itm.commentList\r\n })\r\n\r\n const textRemain = synthesisInit?.map((item) => {\r\n return item.strTheRest\r\n })\r\n setTextRemaining(textRemain)\r\n setCommentList(commentDirector)\r\n setInitialSynthesis(synthesisInit)\r\n }\r\n\r\n const setInitialRemarkSynthesisInfo = () => {\r\n const remarkList = synthesisProject?.synthesisRemarkInfo?.committeeRemarkInfo\r\n remarkList?.forEach((element: syntheticFormTypes.CommitteeCommentTopicInfo, idx: number) => {\r\n defaultRemarkRef.current =\r\n idx === 0 ? `${element.comment}` : `${defaultRemarkRef.current}\\n${element.comment}`\r\n })\r\n setRemarkList(remarkList)\r\n }\r\n /* function สำหรับ set ข้อมูลเมื่อเลือกผลพิจารณา */\r\n const handleChangStatus = (val: syntheticFormTypes.OptType) => {\r\n // if (val && val.value === '8') {\r\n // setIsRequired(true)\r\n // } else {\r\n // setIsRequired(false)\r\n // }\r\n // setTimeout(() => {\r\n // formRef.current.resetFieldState('remark')\r\n // })\r\n }\r\n\r\n const handleDirtyChange = (props: any) => {\r\n formValues.current = { ...props.values }\r\n let isDirty: boolean = false\r\n //** จัดformat initValue และ Form Value เพื่อเตรียมตัวนำไปใช้เปรียบเทียบค่า **//\r\n let newFormValue = _.omit({ ...props.values }, ['commentList1'])\r\n let initValue = _.omit({ ...initialValues, synthesisInfo: initialSynthesis }, ['commentList1'])\r\n\r\n //**********************************************************//\r\n const isEqual = _.isEqual(newFormValue, initValue) //ข้อมูลเท่ากัน\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: callbackDirtyProcess,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const callbackDirtyProcess = (\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n const parameter = getParameterForSave(formValues.current)\r\n if (parameter) {\r\n parameter.isDraft = true\r\n handleConfirmSave(parameter, tabIndex, newTabSelected, isFolder)\r\n }\r\n }\r\n\r\n const handleChangTextField = (val: string, index: number) => {\r\n if (textRemaining?.length > 0) {\r\n textRemaining[index] = 4000 - val.length\r\n }\r\n }\r\n const handleChangRemark = (val: string) => {\r\n if (textRemainingRemark) {\r\n setTextRemainingRemark(4000 - val.length)\r\n }\r\n }\r\n const getParameterForSave = (val: syntheticFormTypes.TFormValue) => {\r\n let paramForSave = null\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n let isDraft = false\r\n if (val.submitType === 'draft') {\r\n isDraft = true\r\n }\r\n const synthesisInfo = val?.synthesisInfo.map((item: any) => {\r\n return {\r\n topicID: item && item?.id ? item?.id : null,\r\n contentHtml: item && item?.synthesisList?.contentHtml ? item?.synthesisList?.contentHtml : null,\r\n contentText: item && item?.synthesisList?.contentText ? item?.synthesisList?.contentText : null,\r\n }\r\n })\r\n const synthesisProjectRequest: REQServiceType.SynthesisProjectType = {\r\n loginUserID: profileStore.profile.userId,\r\n submittedID: submittedID,\r\n reviewerID:\r\n profile.userGroupId === constUserGroup.officer\r\n ? val && val.reviewer && val.reviewer.value\r\n ? parseInt(val?.reviewer.value)\r\n : null\r\n : profileStore.profile.userId,\r\n approveStatusID:\r\n val && val.approveStatus && val.approveStatus.value ? parseInt(val?.approveStatus.value) : null,\r\n synthesisInfo: synthesisInfo ? synthesisInfo : [],\r\n synthesisRemark: val && val.remark ? val?.remark : null,\r\n isDraft: isDraft,\r\n progress_6_months: val.progress_6_months,\r\n progress_12_months: val.progress_12_months,\r\n }\r\n paramForSave = synthesisProjectRequest\r\n\r\n return paramForSave\r\n }\r\n const handleSubmitForm = async (val: syntheticFormTypes.TFormValue) => {\r\n const parameter = getParameterForSave(val)\r\n if (val.submitType === 'save') {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n handleConfirmSave(parameter)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n handleConfirmSave(parameter)\r\n }\r\n }\r\n\r\n const handleConfirmSave = async (\r\n paramForSave: requestWebServiceTypes.SynthesisProjectType,\r\n tabIndex: number | null = null,\r\n newTabSelected: TabSelectedType | null = null,\r\n isFolder?: boolean,\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n\r\n const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.synthesisProject(paramForSave)\r\n\r\n if (!isFolder) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n if (tabIndex && newTabSelected) {\r\n //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n } else {\r\n //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n if (callbackSaveComplete) {\r\n if (res && res.status) {\r\n callbackSaveComplete(res.status, isDraft)\r\n }\r\n }\r\n }\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n const checkIsDisplayCopyToClipboard = () => {\r\n let isDisplayCopyToClipboard = false\r\n if (projectData) {\r\n if (projectData?.stepID > submittedStep.synthesis) {\r\n isDisplayCopyToClipboard = true\r\n } else {\r\n isDisplayCopyToClipboard = false\r\n }\r\n }\r\n return isDisplayCopyToClipboard\r\n }\r\n\r\n const editInitialSynthesis = (data: any) => {\r\n setInitialSynthesis(data)\r\n }\r\n\r\n const getAllCommentaryForExport = async () => {\r\n if (projectData) {\r\n const { result } = await callWebService.getHistorySynthesis(projectData?.submittedID)\r\n const allCommentList = result.map((itm) => {\r\n if (itm.commentary.length === 1) {\r\n itm.commentary.forEach((comment) => {\r\n comment.nameTopicTH1 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n comment.nameTopicEN1 = 'Suggestion / Notice'\r\n comment.nameTopicTH2 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n comment.nameTopicEN2 = 'Suggestion / Notice'\r\n })\r\n }\r\n\r\n return {\r\n userID: itm.userID,\r\n fullUsername_en: itm.fullUsername_en,\r\n fullUsername_th: itm.fullUsername_th,\r\n commentary: itm.commentary,\r\n updatedDate: itm.updatedDate,\r\n updateByNameTH: itm.updateByNameTH,\r\n updateByNameEN: itm.updateByNameEN,\r\n approveStatusName_th: itm.approveStatusName_th,\r\n approveStatusName_en: itm.approveStatusName_en,\r\n approveStatusID: itm.approveStatusID,\r\n historyCommentary: itm.historyCommentary,\r\n }\r\n })\r\n setDataSourceForExport(allCommentList)\r\n }\r\n }\r\n return {\r\n commentList,\r\n isViewMode,\r\n initialValues,\r\n reviewerList: reviewer,\r\n commentTitleList,\r\n initialSynthesis,\r\n isExempt,\r\n remarkList,\r\n isRequired,\r\n formRef,\r\n configDialog,\r\n projectData,\r\n // textRemaining,\r\n // textRemainingRemark,\r\n isShowUpdateDate,\r\n dataSourceForCopyToClipboard,\r\n isDisplayCopyToClipboard: checkIsDisplayCopyToClipboard(),\r\n useAccordionMode: editSynthesis.useAccordionMode,\r\n dataSourceForExport,\r\n defineValueFromInit: editSynthesis.defineValueFromInit,\r\n resetField: editSynthesis.resetField,\r\n confirmField: editSynthesis.confirmField,\r\n updateCommentary: editSynthesis.updateCommentary,\r\n editInitialSynthesis,\r\n onRefDialog,\r\n onChangTextField: handleChangTextField,\r\n handleDirtyChange,\r\n onChangStatus: handleChangStatus,\r\n onChangRemark: handleChangRemark,\r\n onSubmitForm: handleSubmitForm,\r\n onClickCancel: handleClickCancel,\r\n }\r\n}\r\n\r\nexport default useSynthesis\r\n","import React from 'react'\r\n\r\n// --- MaterialUI --- //\r\nimport * as synthesisType from './synthesisType'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport Autocomplete from '../../../../../control/autocomplete/autocomplete'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport ResultConsideration from '../../../shareUI/resultConsideration/resultConsideration'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport useSynthesis from './useSynthesis'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport { Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport PageAction from '../pageAction'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport CopyToClipboard from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport { richEditorRequired } from '../../../../../utilities/validate'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport ExportToMSWord from '../../../../../control/exportToMSWord/exportToMSWord'\r\n\r\nconst SynthesisREC1View = (props: synthesisType.SynthesisViewType) => {\r\n const {\r\n formRef,\r\n isExempt,\r\n isViewMode,\r\n commentList,\r\n projectData,\r\n configDialog,\r\n reviewerList,\r\n initialValues,\r\n initialSynthesis,\r\n commentTitleList,\r\n isShowUpdateDate,\r\n isDisplayCopyToClipboard,\r\n dataSourceForCopyToClipboard,\r\n useAccordionMode,\r\n dataSourceForExport,\r\n resetField,\r\n confirmField,\r\n defineValueFromInit,\r\n editInitialSynthesis,\r\n updateCommentary,\r\n onSubmitForm,\r\n onRefDialog,\r\n onClickCancel,\r\n onChangStatus,\r\n handleDirtyChange,\r\n } = props\r\n // const isViewMode = false\r\n const checkPermission = useCheckPermission()\r\n\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const isAdmin = checkPermission.isUserAdmin()\r\n const isDisableReviewer = isViewMode //irb1 จะเปิดให้สามารถเลือกรายชื่อผู้ให้ความเห็นได้\r\n const irb = projectData?.irb\r\n const snackbarAction = useSnackbarAction()\r\n\r\n const isRequiredSynthesize = {\r\n errorMessage: `${translate.get('MESSAGE.M013')}`,\r\n showAsterisk: true,\r\n triggedValidate: true,\r\n }\r\n\r\n const getDisplayCommitteeSaveDate = (itm: any) => {\r\n return translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? convertDateToFormatTH(itm.saveCommentDate)\r\n : convertDateToFormatEN(itm.saveCommentDate)\r\n }\r\n\r\n const renderCommitteeComment = (itm: any, index: number) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderComment = (name: string, index: number, isDisabled: boolean) => {\r\n return (\r\n \r\n \r\n {commentList &&\r\n commentList?.map((itm: any, idx: number) => {\r\n const filterArr = itm?.map((item: any) => {\r\n if (commentTitleList[index]?.id === item?.topicID || isExempt) {\r\n return renderCommitteeComment(item, index)\r\n }\r\n })\r\n\r\n return filterArr\r\n })}\r\n \r\n\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderFieldArray = (isDisabled: boolean, useAccordion: boolean) => {\r\n return (\r\n \r\n \r\n {({ fields }) => {\r\n return fields?.map((name, index) => (\r\n \r\n {useAccordion ? (\r\n \r\n {renderComment(name, index, isDisabled)}\r\n \r\n ) : (\r\n <>\r\n
\r\n                                        \r\n                                            {isExempt\r\n                                                ? translate.get('LABEL.SUGGESTION_NOTICE')\r\n                                                : `${index + 1}. ${\r\n                                                      translate.languageStore.currentLanguage ===\r\n                                                      translate.languageKey.th\r\n                                                          ? commentTitleList[index]?.name_th\r\n                                                          : commentTitleList[index]?.name_en\r\n                                                  }`}\r\n                                        \r\n                                        {renderComment(name, index, isDisabled)}\r\n                                    \r\n                                )}\r\n                            \r\n                        ))\r\n                    }}\r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    return (\r\n        <>\r\n            {isDisplayCopyToClipboard && (\r\n                \r\n                    \r\n                    \r\n                \r\n            )}\r\n            \r\n                {(props) => {\r\n                    const { form, handleSubmit, dirty, invalid, errors } = props\r\n                    formRef.current = form\r\n                    // formRenderPropsRef.current = props\r\n                    return (\r\n                        \r\n                            {isAdmin && (\r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            )}\r\n\r\n                            \r\n                                {useAccordionMode ? (\r\n                                     renderFieldArray(false, true)}\r\n                                        renderViewComponent={() => renderFieldArray(true, true)}\r\n                                        fieldNames={['synthesisInfo']}\r\n                                        onCancel={() => {\r\n                                            resetField('synthesisInfo', (data: any) => {\r\n                                                editInitialSynthesis(data)\r\n                                            })\r\n                                        }}\r\n                                        onConfirm={() => {\r\n                                            confirmField('synthesisInfo', (data: any) => {\r\n                                                editInitialSynthesis(data)\r\n                                            })\r\n                                            return updateCommentary('synthesisInfo')\r\n                                        }}\r\n                                        onClickEdit={() => defineValueFromInit('synthesisInfo')}\r\n                                    />\r\n                                ) : (\r\n                                    renderFieldArray(isViewMode, true)\r\n                                )}\r\n                            \r\n\r\n                            \r\n                                \r\n                            \r\n\r\n                            {/* \r\n                            \r\n                                \r\n                                    \r\n                                        {remarkList &&\r\n                                            remarkList?.map((itm: any, idx: number) => {\r\n                                                return renderCommitteeCommentRemark(itm, idx)\r\n                                            })}\r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n                                \r\n                            \r\n                         */}\r\n                            {isShowUpdateDate && }\r\n                            {!isViewMode && (\r\n                                \r\n                                     {\r\n                                            onClickCancel(dirty)\r\n                                        }}\r\n                                        onClickSave={() => {\r\n                                            form.change('submitType', 'save')\r\n                                            handleSubmit()\r\n                                            invalid &&\r\n                                                errors &&\r\n                                                snackbarAction.openSnackbar({\r\n                                                    message: translate.get('MESSAGE.M012'),\r\n                                                    type: 'error',\r\n                                                })\r\n                                        }}\r\n                                        onClickSaveDraft={() => {\r\n                                            form.change('submitType', 'draft')\r\n                                            handleSubmit()\r\n                                        }}\r\n                                    />\r\n                                \r\n                            )}\r\n\r\n                            \r\n                            \r\n                        \r\n                    )\r\n                }}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nconst SynthesisREC1: React.FC = (props) => {\r\n    const useSyntheticModel = useSynthesis(props)\r\n    return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    spacingButton: {\r\n        marginBottom: '10px',\r\n    },\r\n    paper: {\r\n        width: '100%',\r\n        height: 128,\r\n        padding: 20,\r\n    },\r\n    titleFont: {\r\n        color: '#BDBDBD',\r\n    },\r\n    contentFont: {\r\n        fontWeight: 'bold',\r\n    },\r\n    btnGroup: {\r\n        padding: '18px',\r\n    },\r\n}))\r\n\r\nexport default SynthesisREC1\r\n","import React from 'react'\r\n\r\n// --- MaterialUI --- //\r\nimport * as synthesisType from './synthesisType'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport Autocomplete from '../../../../../control/autocomplete/autocomplete'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport ResultConsideration from '../../../shareUI/resultConsideration/resultConsideration'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport useSynthesis from './useSynthesis'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport PageAction from '../pageAction'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport CopyToClipboard from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport { richEditorRequired } from '../../../../../utilities/validate'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport ExportToMSWord from '../../../../../control/exportToMSWord/exportToMSWord'\r\n\r\nconst SynthesisREC2View = (props: synthesisType.SynthesisViewType) => {\r\n    const {\r\n        formRef,\r\n        isExempt,\r\n        isViewMode,\r\n        commentList,\r\n        projectData,\r\n        configDialog,\r\n        reviewerList,\r\n        initialValues,\r\n        initialSynthesis,\r\n        commentTitleList,\r\n        isShowUpdateDate,\r\n        isDisplayCopyToClipboard,\r\n        dataSourceForCopyToClipboard,\r\n        useAccordionMode,\r\n        dataSourceForExport,\r\n        resetField,\r\n        confirmField,\r\n        defineValueFromInit,\r\n        editInitialSynthesis,\r\n        updateCommentary,\r\n        onSubmitForm,\r\n        onRefDialog,\r\n        onClickCancel,\r\n        onChangStatus,\r\n        handleDirtyChange,\r\n    } = props\r\n    // const isViewMode = false\r\n    const checkPermission = useCheckPermission()\r\n\r\n    const translate = useTranslate()\r\n    const classes = useStyles()\r\n    const isAdmin = checkPermission.isUserAdmin()\r\n    const isDisableReviewer = isViewMode //irb1 จะเปิดให้สามารถเลือกรายชื่อผู้ให้ความเห็นได้\r\n    const irb = projectData?.irb\r\n    const snackbarAction = useSnackbarAction()\r\n\r\n    const isRequiredSynthesize = {\r\n        errorMessage: `${translate.get('MESSAGE.M013')}`,\r\n        showAsterisk: true,\r\n        triggedValidate: true,\r\n    }\r\n\r\n    const getDisplayCommitteeSaveDate = (itm: any) => {\r\n        return translate.languageStore.currentLanguage === translate.languageKey.th\r\n            ? convertDateToFormatTH(itm.saveCommentDate)\r\n            : convertDateToFormatEN(itm.saveCommentDate)\r\n    }\r\n\r\n    const renderCommitteeComment = (itm: any, index: number) => {\r\n        return (\r\n            <>\r\n                \r\n                    \r\n                \r\n                \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    const renderComment = (name: string, index: number, isDisabled: boolean) => {\r\n        return (\r\n            \r\n                \r\n                    {commentList &&\r\n                        commentList?.map((itm: any, idx: number) => {\r\n                            const filterArr = itm?.map((item: any) => {\r\n                                if (commentTitleList[index]?.id === item?.topicID || isExempt) {\r\n                                    return renderCommitteeComment(item, index)\r\n                                }\r\n                            })\r\n\r\n                            return filterArr\r\n                        })}\r\n                \r\n\r\n                \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    const renderFieldArray = (isDisabled: boolean) => {\r\n        return (\r\n            \r\n                \r\n                    {({ fields }) => {\r\n                        return fields?.map((name, index) => (\r\n                            \r\n                                \r\n                                    {renderComment(name, index, isDisabled)}\r\n                                \r\n                            \r\n                        ))\r\n                    }}\r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    return (\r\n        <>\r\n            {isDisplayCopyToClipboard && (\r\n                \r\n                    \r\n                    \r\n                \r\n            )}\r\n            \r\n                {(props) => {\r\n                    const { form, handleSubmit, dirty, invalid, errors } = props\r\n                    formRef.current = form\r\n                    // formRenderPropsRef.current = props\r\n                    return (\r\n                        \r\n                            {isAdmin && (\r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            )}\r\n\r\n                            \r\n                                {useAccordionMode ? (\r\n                                     renderFieldArray(false)}\r\n                                        renderViewComponent={() => renderFieldArray(true)}\r\n                                        fieldNames={['synthesisInfo']}\r\n                                        onCancel={() => {\r\n                                            resetField('synthesisInfo', (data: any) => {\r\n                                                editInitialSynthesis(data)\r\n                                            })\r\n                                        }}\r\n                                        onConfirm={() => {\r\n                                            confirmField('synthesisInfo', (data: any) => {\r\n                                                editInitialSynthesis(data)\r\n                                            })\r\n                                            return updateCommentary('synthesisInfo')\r\n                                        }}\r\n                                        onClickEdit={() => defineValueFromInit('synthesisInfo')}\r\n                                    />\r\n                                ) : (\r\n                                    renderFieldArray(isViewMode)\r\n                                )}\r\n                            \r\n\r\n                            \r\n                                \r\n                            \r\n\r\n                            {/* \r\n                            \r\n                                \r\n                                    \r\n                                        {remarkList &&\r\n                                            remarkList?.map((itm: any, idx: number) => {\r\n                                                return renderCommitteeCommentRemark(itm, idx)\r\n                                            })}\r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n                                \r\n                            \r\n                         */}\r\n                            {isShowUpdateDate && }\r\n                            {!isViewMode && (\r\n                                \r\n                                     {\r\n                                            onClickCancel(dirty)\r\n                                        }}\r\n                                        onClickSave={() => {\r\n                                            form.change('submitType', 'save')\r\n                                            handleSubmit()\r\n                                            invalid &&\r\n                                                errors &&\r\n                                                snackbarAction.openSnackbar({\r\n                                                    message: translate.get('MESSAGE.M012'),\r\n                                                    type: 'error',\r\n                                                })\r\n                                        }}\r\n                                        onClickSaveDraft={() => {\r\n                                            form.change('submitType', 'draft')\r\n                                            handleSubmit()\r\n                                        }}\r\n                                    />\r\n                                \r\n                            )}\r\n\r\n                            \r\n                            \r\n                        \r\n                    )\r\n                }}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nconst SynthesisREC2: React.FC = (props) => {\r\n    const useSyntheticModel = useSynthesis(props)\r\n    return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    spacingButton: {\r\n        marginBottom: '10px',\r\n    },\r\n    paper: {\r\n        width: '100%',\r\n        height: 128,\r\n        padding: 20,\r\n    },\r\n    titleFont: {\r\n        color: '#BDBDBD',\r\n    },\r\n    contentFont: {\r\n        fontWeight: 'bold',\r\n    },\r\n    btnGroup: {\r\n        padding: '18px',\r\n    },\r\n}))\r\n\r\nexport default SynthesisREC2\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport constSubmittedStatus from '../../../../../constants/submittedStatus'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\nimport { ResultDocumentTopicLut } from '../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport * as Utils from '../../../../../utilities/date'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\n\r\nimport * as VerifyDocumentType from './verifyDocumentType'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../constants/approveStatus'\r\nimport useVerifyDocumentProjectDetail from '../../../shareLogic/useVerifyDocumentProjectDetail'\r\nimport useIRB from '../../../../../services/um/lookups/useIRB'\r\nimport { validateModeAccordionError } from '../../../../../utilities/validate'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport * as REQServiceTypes from '../../../../../services/web/types/requestWebServiceTypes'\r\ntype OptType = {\r\n    label: string\r\n    value: string\r\n}\r\ntype UploadFileObjType = {\r\n    uploadFileObj: {\r\n        documentTopicID: number\r\n\r\n        fileList: {\r\n            documentTopicID: number\r\n            fileID: string\r\n            fileToken: string\r\n            filename: string\r\n            path: string\r\n        }[]\r\n\r\n        subTopicPageList?: {\r\n            page: string\r\n            documentTopicID: number\r\n            subtopicID: number\r\n        }[]\r\n    }\r\n}\r\n\r\nconst useVerifyDocument = (props: VerifyDocumentType.VerifyDocumentType) => {\r\n    const { projectData, onSaveComplete } = props\r\n\r\n    const history = useHistory()\r\n    const tabAndFolderHook = useFolderAndTab()\r\n    const loadingHook = useLoading()\r\n    const callLookup = useLookupService()\r\n    const callWebService = useWebService()\r\n    const translate = useTranslate()\r\n    const checkPermissionHook = checkPermission()\r\n    const authenStore = useAuthenStore()\r\n    const manageProjectStore = useManageProjectStore()\r\n    const manageProjectAction = useManageProjectAction()\r\n    const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n    const [isCompletely, setIsCompletely] = React.useState(true)\r\n    const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n    const documentTopicRef = React.useRef()\r\n    const [initialValues, setInitialValues] = React.useState({})\r\n    const reviewerLutRef = React.useRef()\r\n    const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n    const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n    const [configDialog, setConfigDialog] =\r\n        React.useState>()\r\n    const dialogRef = React.useRef>()\r\n    const formRef = React.useRef()\r\n    const { createInitialProjectDetail, updateProjectDetailFormatting } = useVerifyDocumentProjectDetail()\r\n    const { getIRB } = useIRB()\r\n    const formHistoryRef = React.useRef>({})\r\n    const snackbarAction = useSnackbarAction()\r\n\r\n    React.useEffect(() => {\r\n        if (projectData) {\r\n            setIsCompletely(projectData?.verifyDocument ?? true)\r\n            getReviewer(projectData.irb)\r\n            createInitialData()\r\n        }\r\n\r\n        if (projectData?.irb && projectData?.submitTypeInfo?.value) {\r\n            getDocumentTopicLut(projectData?.irb, projectData?.submitTypeInfo.value)\r\n        }\r\n    }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n    React.useEffect(() => {\r\n        createInitialUploadFile()\r\n    }, [\r\n        manageProjectStore.documentTopic,\r\n        JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n        JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n    ])\r\n\r\n    const onRefDialog = (func: Record) => {\r\n        //ห้าม set State หรือเรียก Action ในนี้\r\n        dialogRef.current = func\r\n    }\r\n\r\n    const filterTopicUpload = (documentTopic: ResultDocumentTopicLut[]) => {\r\n        let docTopic: ResultDocumentTopicLut[] = []\r\n        const researcherTypeID = manageProjectStore?.projectData?.researcherTypeInfo.value\r\n\r\n        if (documentTopic) {\r\n            let isDocTopic = documentTopic\r\n            if (researcherTypeID === 1) {\r\n                Constants.topicForLecturer.forEach((element) => {\r\n                    docTopic = documentTopic?.filter((item) => {\r\n                        return item.id !== element.id\r\n                    })\r\n                })\r\n            } else {\r\n                Constants.topicForStudent.forEach((element) => {\r\n                    docTopic = isDocTopic?.filter((item) => {\r\n                        return item.id !== element.id\r\n                    })\r\n                    isDocTopic = docTopic\r\n                })\r\n            }\r\n            if (docTopic.length > 1) {\r\n                docTopic = docTopic?.map((itm, index: number) => {\r\n                    return { ...itm, no: index + 1 }\r\n                })\r\n                manageProjectAction.setDocumentTopic(docTopic)\r\n            }\r\n        }\r\n    }\r\n\r\n    const getDocumentTopicLut = async (irb: number, submitType: number) => {\r\n        if (irb) {\r\n            const res = await callLookup.callDocumentTopicLut(irb, submitType)\r\n            if (res.status === 1) {\r\n                manageProjectAction.setDocumentTopic(res.result)\r\n                filterTopicUpload(res.result)\r\n                documentTopicRef.current = res.result\r\n            } else {\r\n                manageProjectAction.setDocumentTopic([])\r\n                documentTopicRef.current = []\r\n            }\r\n        }\r\n    }\r\n\r\n    const createInitialUploadFile = () => {\r\n        const documentInfo = projectData?.documentInfo\r\n        // ------------------------------------------------------------- //\r\n        let uploadFileInit = manageProjectStore.documentTopic?.map((itm: any, idx: number) => {\r\n            return {\r\n                uploadFileObj: {\r\n                    fileList: [],\r\n                    subTopicPageList: [],\r\n                    documentTopicID: itm.id,\r\n                    isDisplay: itm.isDisplay,\r\n                    isRequired: itm.isRequired,\r\n                },\r\n            }\r\n        }) as Array\r\n\r\n        uploadFileInit?.forEach((itm: VerifyDocumentType.uploadFileObjType) => {\r\n            documentInfo?.forEach((docInfo: any) => {\r\n                if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n                    //@ts-ignore\r\n                    itm.uploadFileObj.fileList = docInfo.fileInfo\r\n                    //@ts-ignore\r\n                    itm.uploadFileObj.subTopicPageList = docInfo.subtopic\r\n                }\r\n            })\r\n        })\r\n\r\n        let latestDocument = manageProjectStore.projectData?.latestDocument\r\n        //Section Replace File\r\n        if (latestDocument && latestDocument?.length > 0) {\r\n            uploadFileInit?.forEach((initFileItm) => {\r\n                //loop structure init file\r\n\r\n                latestDocument?.forEach((docItm) => {\r\n                    //loop document topic\r\n                    const docFileInfo = docItm.fileInfo\r\n\r\n                    docFileInfo?.forEach((replaceFileItm: any) => {\r\n                        //loop file in document\r\n                        const lstReplaceFileGroup: Array = replaceFileItm.latestFileList\r\n                        const replaceFile = lstReplaceFileGroup.filter((file) => file.no !== null)?.[0] //ไฟล์เก่าที่ถูกแทนที่\r\n                        const replaceFileBy = lstReplaceFileGroup.filter((file) => file.no === null)?.[0] //ไฟล์ใหม่ที่นำมาแทนที่\r\n                        if (replaceFile && replaceFileBy) {\r\n                            if (docItm.topicID === initFileItm.uploadFileObj.documentTopicID) {\r\n                                initFileItm.uploadFileObj.fileList = [\r\n                                    ...initFileItm.uploadFileObj.fileList,\r\n                                    {\r\n                                        documentTopicID: docItm.topicID,\r\n                                        fileToken: replaceFileBy.fileToken, //fileToken\r\n                                        filename: replaceFileBy.filename,\r\n                                        fileID: replaceFileBy.fileToken, //fileToken\r\n                                        path: replaceFileBy.path,\r\n                                        replaceFileID: replaceFile.fileID,\r\n                                    } as any,\r\n                                ]\r\n                                const subtopic = docItm.subtopic?.map((sub: any) => ({\r\n                                    page: sub.page,\r\n                                    documentTopicID: docItm.topicID,\r\n                                    subtopicID: sub.subtopicID,\r\n                                }))\r\n                                initFileItm.uploadFileObj.subTopicPageList = subtopic\r\n                            }\r\n                        }\r\n                    })\r\n                })\r\n            })\r\n        }\r\n\r\n        //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n        if (uploadFileInit?.length > 0) {\r\n            uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n                return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n            })\r\n        }\r\n        setInitialUploadFile(uploadFileInit)\r\n    }\r\n\r\n    const getReviewer = async (irb: number) => {\r\n        if (irb) {\r\n            const res = await callLookup.callReviewerLut(irb)\r\n            const formatedData = res.result.map((itm) => {\r\n                return {\r\n                    label: itm.name_th,\r\n                    value: `${itm.id}`,\r\n                }\r\n            })\r\n            reviewerLutRef.current = formatedData\r\n        }\r\n    }\r\n\r\n    const handleChangeDocCompletely = (val: string) => {\r\n        const isCompletely = val === '1' ? true : false\r\n        setIsCompletely(isCompletely)\r\n    }\r\n\r\n    const createInitialData = async () => {\r\n        loadingHook.loadingOpen()\r\n        const defaultCompletely = projectData?.verifyDocument ?? '1'\r\n        const lutIrb = await getIRB()\r\n        const projectDetail = createInitialProjectDetail(projectData, lutIrb)\r\n        const initialData = {\r\n            isCompletelyDoc: defaultCompletely === '1' ? defaultCompletely : projectData?.verifyDocument ? '1' : '2',\r\n            resubmitDocDate: projectData?.resubmitDocDate ? projectData?.resubmitDocDate : null,\r\n            //@ts-ignore\r\n            reviewer: projectData?.reviewerUserID\r\n                ? {\r\n                      label: `${projectData?.reviewerName_th}`,\r\n                      value: `${projectData?.reviewerUserID}`,\r\n                  }\r\n                : null,\r\n            remark: projectData?.verifyDocumentRemark,\r\n            ...projectDetail,\r\n        }\r\n\r\n        setInitialValues(initialData)\r\n        loadingHook.loadingClose()\r\n    }\r\n\r\n    const checkUseUploadEdit = () => {\r\n        let isUseUploadEdit = false\r\n\r\n        switch (projectData?.submitTypeInfo?.value) {\r\n            case constSubmittedType.firstSubmitConsideration:\r\n                isUseUploadEdit = false\r\n                break\r\n            case constSubmittedType.editAfterReview:\r\n                isUseUploadEdit = true\r\n                break\r\n            case constSubmittedType.editAfterReview_nextPhaseProject:\r\n                isUseUploadEdit = true\r\n                break\r\n            case constSubmittedType.exitAfterReview_AmendmentProject:\r\n                isUseUploadEdit = true\r\n                break\r\n            case constSubmittedType.renewalProject:\r\n                if (\r\n                    projectData?.synthesisApproveStatusInfo?.value ===\r\n                        approveStatusREC1.approveForContiueResearchWhenEdited ||\r\n                    projectData?.synthesisApproveStatusInfo?.value ===\r\n                        approveStatusREC2.approveForContiueResearchWhenEdited\r\n                ) {\r\n                    isUseUploadEdit = true\r\n                }\r\n                break\r\n            case constSubmittedType.editAfterReview_renewalProject:\r\n                isUseUploadEdit = true\r\n                break\r\n            default:\r\n                isUseUploadEdit = false\r\n        }\r\n        if (projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument) {\r\n            //เอกสารไม่ครบถ้วน\r\n            isUseUploadEdit = true\r\n        }\r\n        if (\r\n            projectData?.synthesisApproveStatusInfo?.value === approveStatusREC1.approveWithComment ||\r\n            projectData?.synthesisApproveStatusInfo?.value === approveStatusREC2.approveWithComment\r\n        ) {\r\n            //Approve With Comment\r\n            isUseUploadEdit = true\r\n        }\r\n\r\n        return isUseUploadEdit\r\n    }\r\n    const handleDirtyChange = (props: { dirty: boolean }) => {\r\n        let isDirty: boolean = false\r\n        if (!isViewMode) {\r\n            isDirty = props.dirty\r\n        }\r\n        const paramsDirty = {\r\n            tabDirty: isDirty,\r\n            callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n        }\r\n        appFolderAndTabAction.setDirty(paramsDirty)\r\n    }\r\n\r\n    const getSaveServiceParameter = (isDraft: boolean) => {\r\n        const value = formRef.current?.values\r\n        const isCompletelyDoc = value?.isCompletelyDoc === '1'\r\n        let reviewerUserID = null\r\n        if (value?.reviewer?.value) {\r\n            reviewerUserID = parseInt(value.reviewer.value)\r\n        }\r\n\r\n        let sendEditData = null\r\n        if (!isCompletelyDoc && value?.resubmitDocDate) {\r\n            sendEditData = Utils.dateForAPI(value.resubmitDocDate) ?? null\r\n        }\r\n\r\n        const verifyProjectServiceParam: REQServiceType.VerifyProjectRequestType = {\r\n            loginUserID: authenStore.profile.userId,\r\n            projectID: projectData?.projectID ?? null,\r\n            submittedID: projectData?.submittedID ?? null,\r\n            reviewerUserID: reviewerUserID,\r\n            isCompletely: isCompletelyDoc,\r\n            resubmitDocDate: sendEditData,\r\n            remark: isCompletelyDoc ? null : value?.remark ? value.remark : null,\r\n            isDraft: isDraft,\r\n        }\r\n\r\n        return verifyProjectServiceParam\r\n    }\r\n    const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n        const isDraft: boolean = true\r\n        const param = getSaveServiceParameter(isDraft)\r\n        processSaveData(param, {\r\n            idx: tabIndex,\r\n            selectedInfo: newTabSelected,\r\n        })\r\n    }\r\n\r\n    const processSaveData = async (\r\n        param: REQServiceType.VerifyProjectRequestType,\r\n        changeTabOpt?: { idx: number; selectedInfo: any },\r\n    ) => {\r\n        try {\r\n            dialogRef.current?.closeDialog()\r\n            loadingHook.loadingOpen()\r\n            const response = await callWebService.verifyProjectRenewal(param)\r\n\r\n            if (changeTabOpt) {\r\n                if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n                    tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n                }\r\n            } else {\r\n                if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n            }\r\n        } catch (ex) {\r\n            console.log('useVerifyDocument.ts => processSaveData : ', ex)\r\n        } finally {\r\n            loadingHook.loadingClose()\r\n        }\r\n    }\r\n\r\n    const handleSubmitForm = async (value: any) => {\r\n        if (projectData?.projectID && projectData?.submittedID) {\r\n            const isDraft: boolean = value?.submitType !== 'save'\r\n            const param = getSaveServiceParameter(isDraft)\r\n\r\n            if (value.submitType === 'save') {\r\n                setConfigDialog({\r\n                    title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                    content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n                    type: 'alert-confirm',\r\n                    onClickConfirm: () => {\r\n                        processSaveData(param)\r\n                    },\r\n                })\r\n                dialogRef.current?.openDialog()\r\n            } else {\r\n                //ถ้า save draft ไม่ต้องมี alert confirm\r\n                processSaveData(param)\r\n            }\r\n        }\r\n    }\r\n\r\n    const handleClickBackToSearch = () => {\r\n        history.push(RoutePath.manageProject)\r\n    }\r\n\r\n    const confirmEditDocResult = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n        const isError = validateModeAccordionError(fieldNames, formProps)\r\n        return new Promise((resolve, reject) => {\r\n            if (!isError) {\r\n                let isCompletelyDoc = formProps.values.isCompletelyDoc === '1'\r\n                let sendEditData = null\r\n                if (!isCompletelyDoc && formProps.values.resubmitDocDate) {\r\n                    sendEditData = Utils.dateForAPI(formProps.values.resubmitDocDate) ?? null\r\n                }\r\n                const param = {\r\n                    ...getEditDocParams(formHistoryRef.current['docResult']),\r\n                    isCompletely: isCompletelyDoc,\r\n                    resubmitDocDate: sendEditData,\r\n                    remark: isCompletelyDoc ? null : formProps.values?.remark ? formProps.values.remark : null,\r\n                }\r\n                processSaveData(param)\r\n                    .then(() => {\r\n                        handleEditDocResult(formProps)\r\n                        handleEditDocReviewer(formProps)\r\n                        resolve('')\r\n                    })\r\n                    .catch(() => {\r\n                        reject('')\r\n                    })\r\n            } else {\r\n                formProps.form.submit()\r\n                reject('')\r\n            }\r\n        })\r\n    }\r\n\r\n    const confirmEditDocReviewer = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n        const isError = validateModeAccordionError(fieldNames, formProps)\r\n        return new Promise((resolve, reject) => {\r\n            if (!isError) {\r\n                let reviewerUserID = null\r\n                if (formProps?.values?.reviewer?.value) {\r\n                    reviewerUserID = parseInt(formProps.values.reviewer.value)\r\n                }\r\n                const param = {\r\n                    ...getEditDocParams(formHistoryRef.current['docResult']),\r\n                    reviewerUserID: reviewerUserID,\r\n                }\r\n                const formatParam = {\r\n                    submittedID: Number(param.submittedID),\r\n                    loginUserID: Number(param.loginUserID),\r\n                    reviewerUserID: Number(reviewerUserID),\r\n                }\r\n                Promise.all([callWebService.updateProjectReviewer(formatParam)])\r\n                    .then(() => {\r\n                        handleEditDocResult(formProps)\r\n                        handleEditDocReviewer(formProps)\r\n                        resolve('')\r\n                    })\r\n                    .catch(() => {\r\n                        reject('')\r\n                    })\r\n            } else {\r\n                formProps.form.submit()\r\n                reject('')\r\n            }\r\n        })\r\n    }\r\n\r\n    const handleEditDocResult = (formProps: FormRenderProps) => {\r\n        formHistoryRef.current['docResult'] = formProps.values\r\n    }\r\n\r\n    const handleEditDocReviewer = (formProps: FormRenderProps) => {\r\n        formHistoryRef.current['docReviewer'] = formProps.values\r\n    }\r\n\r\n    const getEditDocParams = (formValues: any) => {\r\n        let verifyProjectServiceParam: REQServiceType.VerifyProjectRequestType\r\n        const isCompletelyDoc = formValues?.isCompletelyDoc === '1'\r\n        let reviewerUserID = null\r\n        if (formValues?.reviewer?.value) {\r\n            reviewerUserID = parseInt(formValues.reviewer.value)\r\n        }\r\n\r\n        let sendEditData = null\r\n        if (!isCompletelyDoc && formValues?.resubmitDocDate) {\r\n            sendEditData = Utils.dateForAPI(formValues.resubmitDocDate) ?? null\r\n        }\r\n\r\n        verifyProjectServiceParam = {\r\n            loginUserID: authenStore.profile.userId,\r\n            projectID: projectData?.projectID ?? null,\r\n            submittedID: projectData?.submittedID ?? null,\r\n            reviewerUserID: reviewerUserID,\r\n            isCompletely: isCompletelyDoc,\r\n            resubmitDocDate: sendEditData,\r\n            remark: isCompletelyDoc ? null : formValues?.remark ? formValues.remark : null,\r\n            isDraft: false,\r\n        }\r\n\r\n        return verifyProjectServiceParam\r\n    }\r\n\r\n    const getDocumentInfo = (val: any) => {\r\n        let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n        let myFileData: Array = []\r\n\r\n        fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n            const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n                return {\r\n                    subtopicID: subtopic.subtopicID,\r\n                    page: subtopic.page,\r\n                }\r\n            })\r\n\r\n            // const fileTokenInfo: Array = uploadObj.uploadFileObj.fileList?.map((file) => file.fileToken) ?? []\r\n            const fileTokenInfo: Array<{\r\n                replaceFileID: number\r\n                fileToken: string\r\n                fileExtension?: string\r\n                fileID: any\r\n            }> =\r\n                uploadObj.uploadFileObj.fileList?.map((file) => {\r\n                    return {\r\n                        //@ts-ignore\r\n                        replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n                        fileToken: file.fileToken,\r\n                        fileExtension: file.filename.split('.').pop(),\r\n                        fileID: file?.fileID ? file.fileID : null,\r\n                    }\r\n                }) ?? []\r\n\r\n            myFileData.push({\r\n                documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n                fileTokenInfo: fileTokenInfo,\r\n                subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n            })\r\n        })\r\n        // console.log('myFileData : ', myFileData)\r\n        return myFileData\r\n    }\r\n\r\n    const confirmEditEthics = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n        const isError = validateModeAccordionError(fieldNames, formProps)\r\n        return new Promise((resolve, reject) => {\r\n            if (!isError) {\r\n                loadingHook.loadingOpen()\r\n                const rawData = formRef.current?.values\r\n                const formattingParam = updateProjectDetailFormatting(rawData, projectData)\r\n                callWebService\r\n                    .updateProjectDetail(formattingParam)\r\n                    .then(async () => {\r\n                        if (projectData) {\r\n                            await tabAndFolderHook.reloadProjectData(projectData.projectID, projectData.submittedID)\r\n                            await createInitialData()\r\n                        }\r\n                        resolve('')\r\n                    })\r\n                    .catch(() => {\r\n                        reject('')\r\n                    })\r\n                    .finally(() => {\r\n                        loadingHook.loadingClose()\r\n                    })\r\n            } else {\r\n                formProps.form.submit()\r\n                reject('')\r\n            }\r\n        })\r\n    }\r\n\r\n    const confirmEditUploadDoc = (formProps: FormRenderProps, fieldNames: string[]) => {\r\n        const isError = validateModeAccordionError(fieldNames, formProps)\r\n        return new Promise((resolve, reject) => {\r\n            if (isError) {\r\n                snackbarAction.openSnackbar({\r\n                    message: translate.get('ALERT.CONTENT.PLEASE_COMPLETE_PAGE'),\r\n                    type: 'error',\r\n                })\r\n                reject('')\r\n            } else {\r\n                const value = formRef.current?.values\r\n                const doc = getDocumentInfo(value)\r\n                const paramDoc: REQServiceType.UpdateFileProjectRequestType = {\r\n                    projectID: projectData?.projectID ?? null,\r\n                    submittedID: projectData?.submittedID ?? null,\r\n                    documentInfo: doc ?? null,\r\n                }\r\n                saveDataUploadDoc(paramDoc)\r\n                    .then(() => {\r\n                        resolve('')\r\n                    })\r\n                    .catch(() => {\r\n                        reject('')\r\n                    })\r\n            }\r\n        })\r\n    }\r\n\r\n    const saveDataUploadDoc = async (paramDoc: REQServiceType.UpdateFileProjectRequestType) => {\r\n        try {\r\n            loadingHook.loadingOpen()\r\n            await callWebService.updateFileProject(paramDoc)\r\n        } catch (ex) {\r\n            console.log('useVerifyDocument.ts => confirmEditUploadDoc : ', ex)\r\n        } finally {\r\n            loadingHook.loadingClose()\r\n        }\r\n    }\r\n    return {\r\n        formRef,\r\n        isViewMode,\r\n        configDialog,\r\n        isCompletely,\r\n        initialValues,\r\n        isShowUpdateDate,\r\n        initialUploadFile: initialUploadFile,\r\n        onRefDialog,\r\n        onSubmitForm: handleSubmitForm,\r\n        onChangeDocCompletely: handleChangeDocCompletely,\r\n        checkUseUploadEdit: checkUseUploadEdit,\r\n        onDirtyChange: handleDirtyChange,\r\n        onClickBackToSearch: handleClickBackToSearch,\r\n        projectDetailLabel: translate.get('LABEL.PROJECT_DETAIL'),\r\n        confirmEditDocResult,\r\n        confirmEditDocReviewer,\r\n        handleEditDocResult,\r\n        handleEditDocReviewer,\r\n        confirmEditEthics,\r\n        confirmEditUploadDoc,\r\n    }\r\n}\r\n\r\nexport default useVerifyDocument\r\n","import ResearchDetail from '../../../shareUI/ResearchDetail/researchDetail'\r\nimport DocumentTestResult from '../../../shareUI/documentTestResult/documentTestResult'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport { VerifyDocumentViewType, VerifyDocumentType } from './verifyDocumentType'\r\nimport useVerifyDocument from './useVerifyDocument'\r\nimport React from 'react'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport EthicsForm from '../../../shareUI/ethicsForm/ethicsForm'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport { ethicsFormResetList } from '../../../shareUI/ethicsForm/formResetList'\r\n\r\nconst VerifyDocumentView = (props: VerifyDocumentViewType) => {\r\n    const {\r\n        formRef,\r\n        isViewMode,\r\n        projectData,\r\n        configDialog,\r\n        initialValues,\r\n        isShowUpdateDate,\r\n        initialUploadFile,\r\n        isDisableTestResult,\r\n        projectDetailLabel,\r\n        onRefDialog,\r\n        onSubmitForm,\r\n        onDirtyChange,\r\n        checkUseUploadEdit,\r\n        onClickBackToSearch,\r\n        onChangeDocCompletely,\r\n        confirmEditDocResult,\r\n        handleEditDocResult,\r\n        confirmEditEthics,\r\n        confirmEditUploadDoc,\r\n    } = props\r\n    const manageProjectStore = useManageProjectStore()\r\n    const { documentTopic } = manageProjectStore\r\n    const checkPermission = useCheckPermission()\r\n    const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n    const isDisabledTestResult = isDisableTestResult || canOfficerEdit ? false : true\r\n    const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n\r\n    return (\r\n        \r\n            {(props) => {\r\n                formRef.current = props\r\n                return (\r\n                    \r\n                        \r\n                            \r\n                                {checkPermission.isUserAdmin() ? (\r\n                                     (\r\n                                            \r\n                                        )}\r\n                                        renderViewComponent={() => (\r\n                                            \r\n                                        )}\r\n                                        fieldNames={ethicsFormResetList}\r\n                                        isViewMode={true}\r\n                                        onConfirm={() => confirmEditEthics(props, ethicsFormResetList)}\r\n                                    />\r\n                                ) : (\r\n                                    \r\n                                )}\r\n                            \r\n                            \r\n                                 {\r\n                                        await confirmEditUploadDoc(props, ['uploadFile'])\r\n                                    }}\r\n                                    zipDownload={true}\r\n                                />\r\n                            \r\n                            \r\n                                 {\r\n                                        await confirmEditDocResult(props, [\r\n                                            'isCompletelyDoc',\r\n                                            'resubmitDocDate',\r\n                                            'remark',\r\n                                        ])\r\n                                    }}\r\n                                    onClickModeEdit={() => handleEditDocResult(props)}\r\n                                />\r\n                            \r\n\r\n                            {isShowUpdateDate && }\r\n\r\n                            {(isDisableTestResult || !isViewMode) && (\r\n                                \r\n                                     {\r\n                                                      props.form.change('submitType', 'draft')\r\n                                                      props.handleSubmit()\r\n                                                  }\r\n                                                : undefined\r\n                                        }\r\n                                        onClickSave={() => {\r\n                                            props.form.change('submitType', 'save')\r\n                                            props.handleSubmit()\r\n                                        }}\r\n                                        onClickClose={onClickBackToSearch}\r\n                                    />\r\n                                \r\n                            )}\r\n                        \r\n                        \r\n                        \r\n                    \r\n                )\r\n            }}\r\n        \r\n    )\r\n}\r\n\r\n//Controller\r\nconst VerifyDocument = (props: VerifyDocumentType) => {\r\n    const verifyDocumentModel = useVerifyDocument(props)\r\n    return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    spacingButton: {\r\n        marginBottom: '10px',\r\n    },\r\n    paper: {\r\n        width: '100%',\r\n        height: 128,\r\n        padding: 20,\r\n    },\r\n    titleFont: {\r\n        color: '#BDBDBD',\r\n    },\r\n    contentFont: {\r\n        fontWeight: 'bold',\r\n    },\r\n}))\r\n\r\nexport default VerifyDocument\r\n","import ResearchDetail from '../../../shareUI/ResearchDetail/researchDetail'\r\nimport DocumentTestResult from '../../../shareUI/documentTestResult/documentTestResult'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport DesignateReviewer from '../../../shareUI/designateReviewer/designateReviewer'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\nimport { Grid } from '@material-ui/core'\r\nimport { VerifyDocumentViewType, VerifyDocumentType } from './verifyDocumentType'\r\nimport useVerifyDocument from './useVerifyDocument'\r\nimport React from 'react'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport PageAction from '../pageAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport EthicsForm from '../../../shareUI/ethicsForm/ethicsForm'\r\nimport ModeAccordion from '../../../shareUI/modeAccordion/ModeAccordion'\r\nimport { ethicsFormResetList } from '../../../shareUI/ethicsForm/formResetList'\r\n\r\nconst VerifyDocumentView = (props: VerifyDocumentViewType) => {\r\n    const {\r\n        formRef,\r\n        isViewMode,\r\n        projectData,\r\n        configDialog,\r\n        isCompletely,\r\n        initialValues,\r\n        isShowUpdateDate,\r\n        initialUploadFile,\r\n        isDisableTestResult,\r\n        projectDetailLabel,\r\n        onRefDialog,\r\n        onSubmitForm,\r\n        onDirtyChange,\r\n        checkUseUploadEdit,\r\n        onClickBackToSearch,\r\n        onChangeDocCompletely,\r\n        confirmEditDocResult,\r\n        confirmEditDocReviewer,\r\n        handleEditDocResult,\r\n        handleEditDocReviewer,\r\n        confirmEditEthics,\r\n        confirmEditUploadDoc,\r\n    } = props\r\n    const manageProjectStore = useManageProjectStore()\r\n    const { documentTopic } = manageProjectStore\r\n\r\n    const irb = projectData?.irb\r\n\r\n    const checkPermission = useCheckPermission()\r\n    const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n    const isDisabledTestResult = isDisableTestResult || canOfficerEdit ? false : true\r\n    const isDisableReviewer = checkPermission.checkDisabledProjectReviewer(projectData)\r\n    const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n\r\n    return (\r\n        \r\n            {(props) => {\r\n                formRef.current = props\r\n                return (\r\n                    \r\n                        \r\n                            \r\n                                {checkPermission.isUserAdmin() ? (\r\n                                     (\r\n                                            \r\n                                        )}\r\n                                        renderViewComponent={() => (\r\n                                            \r\n                                        )}\r\n                                        fieldNames={ethicsFormResetList}\r\n                                        isViewMode={true}\r\n                                        onConfirm={() => confirmEditEthics(props, ethicsFormResetList)}\r\n                                    />\r\n                                ) : (\r\n                                    \r\n                                )}\r\n                            \r\n                            \r\n                                 {\r\n                                        await confirmEditUploadDoc(props, ['uploadFile'])\r\n                                    }}\r\n                                    zipDownload={true}\r\n                                />\r\n                            \r\n                            \r\n                                 {\r\n                                        await confirmEditDocResult(props, [\r\n                                            'isCompletelyDoc',\r\n                                            'resubmitDocDate',\r\n                                            'remark',\r\n                                        ])\r\n                                    }}\r\n                                    onClickModeEdit={() => handleEditDocResult(props)}\r\n                                />\r\n                            \r\n                            {isCompletely && (\r\n                                \r\n                                     {\r\n                                            await confirmEditDocReviewer(props, ['reviewer'])\r\n                                        }}\r\n                                        onClickModeEdit={() => handleEditDocReviewer(props)}\r\n                                    />\r\n                                \r\n                            )}\r\n\r\n                            {isShowUpdateDate && }\r\n\r\n                            {(isDisableTestResult || !isViewMode) && (\r\n                                \r\n                                     {\r\n                                                      props.form.change('submitType', 'draft')\r\n                                                      props.handleSubmit()\r\n                                                  }\r\n                                                : undefined\r\n                                        }\r\n                                        onClickSave={() => {\r\n                                            props.form.change('submitType', 'save')\r\n                                            props.handleSubmit()\r\n                                        }}\r\n                                        onClickClose={onClickBackToSearch}\r\n                                    />\r\n                                \r\n                            )}\r\n                        \r\n                        \r\n                        \r\n                    \r\n                )\r\n            }}\r\n        \r\n    )\r\n}\r\n\r\n//Controller\r\nconst VerifyDocument = (props: VerifyDocumentType) => {\r\n    const verifyDocumentModel = useVerifyDocument(props)\r\n    return \r\n}\r\nexport default VerifyDocument\r\n","import React from 'react'\r\nimport _ from 'lodash'\r\n\r\nimport * as reviewerCommentType from './reviewerCommentType'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { CommentaryProjectType } from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport { TabSelectedType } from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { topicIsExempt, topicIsUploadComment } from '../../../../../constants/constants'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\nimport { ResultDocumentTopicLut } from '../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport { DatasourceForCopyToClipbaord } from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport submittedStep from '../../../../../constants/submittedStep'\r\nimport * as REQServiceTypes from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport { convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport useCommentaryAction from '../../../../../stores/commentary/useCommentaryAction'\r\nimport { DatasourceForExport } from '../../../../../control/exportToMSWord/exportToMSWord'\r\n\r\nconst useReviewerComment = (props: reviewerCommentType.UseReviewerComment) => {\r\n    const { callbackSaveComplete, isOneComment = false } = props\r\n    const translate = useTranslate()\r\n    const callLookup = useLookupService()\r\n    const callWebService = useWebService()\r\n    const profileStore = authenStore()\r\n    const [isShowSubComment, setIsShowSubComment] = React.useState(false)\r\n    const [initialValues, setInitialValues] = React.useState({})\r\n    const [commentTitleList, setCommentTitleList] = React.useState([])\r\n    const [initialComment, setInitialComment] = React.useState([])\r\n    const [director, setDirector] = React.useState([])\r\n    const [commentaryProject, setCommentaryProject] = React.useState()\r\n    const isCommitteeInfo = React.useRef([])\r\n    const [configDialog, setConfigDialog] =\r\n        React.useState>()\r\n    const dialogTwoRef = React.useRef>()\r\n    const directorRef = React.useRef()\r\n    const formRef = React.useRef()\r\n    const isDirectorEmptyRef = React.useRef(false)\r\n    const checkPermissionHook = checkPermission()\r\n    const { projectData } = useManageProjectStore()\r\n    const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n    const [isRequired, setIsRequired] = React.useState(false)\r\n    const isLanguageRef = React.useRef()\r\n    const [textRemaining, setTextRemaining] = React.useState([])\r\n    const [textRemainingRemark, setTextRemainingRemark] = React.useState()\r\n    const paramsRef = React.useRef()\r\n    const [documentTopic, setDocumentTopic] = React.useState([])\r\n    const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n    const isDeadlineRef = React.useRef(false)\r\n\r\n    const appFolderAndTabAction = useAppFolderAndTabAction()\r\n    const loadingHook = useLoading()\r\n    const history = useHistory()\r\n    const tabAndFolderHook = useFolderAndTab()\r\n    const [dataSourceForCopyToClipboard, setDataSourceForCopyToClipboard] = React.useState<\r\n        DatasourceForCopyToClipbaord[]\r\n    >([])\r\n    const [dataSourceForExport, setDataSourceForExport] = React.useState([])\r\n    const [dataForShowUpdateDate, setDataForShowUpdateDate] = React.useState<{\r\n        nameTH: string\r\n        nameEN: string\r\n        date: string\r\n    }>()\r\n\r\n    const showSaveDraft = checkPermissionHook.checkSaveDraft()\r\n    const commentaryAction = useCommentaryAction()\r\n\r\n    React.useEffect(() => {\r\n        if (\r\n            profileStore?.profile.userId &&\r\n            checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? [])\r\n        ) {\r\n            getCommentaryProjectCommitteeByID(profileStore?.profile.userId)\r\n            checkIsDeadLine()\r\n        }\r\n    }, [profileStore?.profile.userId ?? null])\r\n\r\n    React.useEffect(() => {\r\n        if (projectData) {\r\n            getAllCommentary()\r\n            getAllCommentaryForExport()\r\n            if (isOneComment) {\r\n                // isOneComment หมายถึง ให้ UI เป็นแบบกล่องเดียว หรือแบบหลายกล่อง\r\n                setIsShowSubComment(false)\r\n                const topicIsExemption = topicIsExempt.map((itm) => {\r\n                    return { ...itm, irb: projectData?.irb }\r\n                })\r\n                setCommentTitleList(topicIsExemption)\r\n            } else {\r\n                getCommentaryTopicLut(projectData?.irb)\r\n                setIsShowSubComment(true)\r\n            }\r\n\r\n            if (!checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? []) && projectData) {\r\n                setInitDirector(projectData?.submittedID)\r\n            }\r\n            else if (checkPermissionHook.isUserChairman() && projectData) {\r\n                setInitDirector(projectData?.submittedID)\r\n            }\r\n            isLanguageRef.current = translate.languageStore.currentLanguage\r\n        }\r\n    }, [projectData?.projectID ?? null, projectData?.submittedID])\r\n\r\n    React.useEffect(() => {\r\n        createInitialComment()\r\n    }, [commentTitleList, commentaryProject])\r\n\r\n    React.useEffect(() => {\r\n        if (!checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? []) && projectData) {\r\n            setInitDirector(projectData?.submittedID)\r\n        }\r\n        else if (checkPermissionHook.isUserChairman() && projectData) {\r\n            setInitDirector(projectData?.submittedID)\r\n        }\r\n    }, [translate.languageStore.currentLanguage])\r\n\r\n    const onRefDialogTwo = (func: Record) => {\r\n        //ห้าม set State หรือเรียก Action ในนี้\r\n        dialogTwoRef.current = func\r\n    }\r\n\r\n    const checkIsDeadLine = async () => {\r\n        const { isDeadline } = await callWebService.checkAdvisorDueDate(Number(projectData?.submittedID))\r\n        isDeadlineRef.current = isDeadline\r\n    }\r\n\r\n    const getCommentaryProjectCommitteeByID = async (committeeUserID: number) => {\r\n        if (projectData) {\r\n            loadingHook.loadingOpen()\r\n            const { result } = await callWebService.getCommentaryProjectCommitteeByID(\r\n                projectData.submittedID,\r\n                committeeUserID,\r\n            )\r\n            const showUpdater = {\r\n                nameTH: result.updateByNameTH,\r\n                nameEN: result.updateByNameEN,\r\n                date: result.updatedDate,\r\n            }\r\n            setCommentaryProject(result)\r\n            setDataForShowUpdateDate(showUpdater)\r\n            loadingHook.loadingClose()\r\n        }\r\n    }\r\n\r\n    const getAllCommentary = async () => {\r\n        if (projectData) {\r\n            loadingHook.loadingOpen()\r\n\r\n            const res = await callWebService.getAllCommentaryProjectCommittee(projectData.submittedID)\r\n            const allCommentList = res.result.map((itm) => {\r\n                itm.commentaryInfo.forEach((commentary) => {\r\n                    if (commentary.name_th === null && commentary.name_en === null) {\r\n                        commentary.name_th = 'ข้อคิดเห็น / ข้อสังเกต'\r\n                        commentary.name_en = 'Suggestion / Notice'\r\n                    }\r\n                })\r\n                return {\r\n                    fullNameEN: itm.fullUsername_en ? itm.fullUsername_en : ' ',\r\n                    fullNameTH: itm.fullUsername_th ? itm.fullUsername_th : ' ',\r\n                    commentaryInfo: itm.commentaryInfo.map((item) => {\r\n                        return {\r\n                            ...item,\r\n                            comment_htmltag: item.comment_htmltag\r\n                                ? item.comment_htmltag\r\n                                      .replaceAll('', '')\r\n                                      .replaceAll('', '')\r\n                                      .replaceAll('', '')\r\n                                      .replaceAll('', '')\r\n                                : item.comment_htmltag,\r\n                        }\r\n                    }),\r\n                    updatedDate: convertDateToFormatTH(itm.updatedDate),\r\n                    updateByNameTH: itm.updateByNameTH,\r\n                    updateByNameEN: itm.updateByNameEN,\r\n                    approveStatusNameTH: itm.approveStatusName_th ?? '',\r\n                    approveStatusNameEN: itm.approveStatusName_en ?? '',\r\n                }\r\n            })\r\n            if (allCommentList) {\r\n                setDataSourceForCopyToClipboard(allCommentList)\r\n            }\r\n            loadingHook.loadingClose()\r\n        }\r\n    }\r\n\r\n    const getCommentaryTopicLut = async (irb: number) => {\r\n        if (irb) {\r\n            const res = await callLookup.callCommentaryTopicLut(irb)\r\n\r\n            if (res.result) {\r\n                const formatData = res.result.map((itm: any, index: number) => {\r\n                    return { ...itm, no: index + 1 }\r\n                })\r\n                setCommentTitleList(formatData)\r\n            }\r\n        }\r\n    }\r\n\r\n    const setInitDirector = async (submittedID: number) => {\r\n        if (submittedID) {\r\n            const { result, status } = await callLookup.callCommitteeLut(submittedID)\r\n            if (status === 1) {\r\n                const committeeInfo = result.map((item: any) => {\r\n                    return {\r\n                        director:\r\n                            item.fullUsername_th && item.userID\r\n                                ? {\r\n                                      label:\r\n                                          translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                              ? item.fullUsername_th\r\n                                              : item.fullUsername_en,\r\n                                      value: item.userID.toString(),\r\n                                  }\r\n                                : {},\r\n                        role:\r\n                            item?.projectRoleName_th && item?.projectRoleID\r\n                                ? {\r\n                                      label:\r\n                                          translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                              ? item.projectRoleName_th\r\n                                              : item.projectRoleName_en,\r\n                                      value: item.projectRoleID.toString(),\r\n                                  }\r\n                                : {},\r\n                    }\r\n                })\r\n\r\n                isCommitteeInfo.current = committeeInfo\r\n                const isDirector = committeeInfo?.map((itm: any) => {\r\n                    return itm.director\r\n                })\r\n\r\n                const form = formRef.current.getState().values\r\n                if (isCommitteeInfo.current && formRef.current) {\r\n                    const findRole = isCommitteeInfo.current?.find(\r\n                        (e: any) => e.director?.value === form?.director?.value,\r\n                    )\r\n\r\n                    if (findRole) {\r\n                        formRef.current.change('role', findRole.role)\r\n                    }\r\n                }\r\n                setDirector(isDirector)\r\n\r\n                await conditionGetCommentary(isDirector)\r\n            }\r\n        }\r\n    }\r\n\r\n    const conditionGetCommentary = (director: reviewerCommentType.OptType[]) => {\r\n        const formValueRef = formRef.current?.getState().values\r\n        if (isLanguageRef.current === translate.languageStore.currentLanguage) {\r\n            \r\n            if (!checkPermissionHook.isUserCommittee()) {\r\n                if (formValueRef && formValueRef.director) {\r\n                    if (profileStore?.profile.userId \r\n                        && checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? [])) {\r\n                        getCommentaryProjectCommitteeByID(profileStore?.profile.userId)\r\n                    }\r\n                    else {\r\n                        //กรณีที่เรียกข้อมูลกรรมคนปัจจุบัน\r\n                        getCommentaryProjectCommitteeByID(parseInt(formValueRef?.director?.value))\r\n                    }\r\n                    directorRef.current = formValueRef.director\r\n                } else if (director[0]?.value) {\r\n                    if (profileStore?.profile.userId \r\n                        && checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? [])) {\r\n                        getCommentaryProjectCommitteeByID(profileStore?.profile.userId)\r\n                    }\r\n                    else {\r\n                        getCommentaryProjectCommitteeByID(parseInt(director[0]?.value))\r\n                        directorRef.current = director[0]\r\n                    }\r\n                }\r\n            } else if (profileStore?.profile.userId) {\r\n                getCommentaryProjectCommitteeByID(profileStore?.profile.userId)\r\n            }\r\n        }\r\n\r\n        isLanguageRef.current = translate.languageStore.currentLanguage\r\n    }\r\n\r\n    const createInitialComment = () => {\r\n        let commentInit: reviewerCommentType.CommentType[] = commentTitleList?.map((itm: any) => {\r\n            return {\r\n                topic: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n                id: itm.id,\r\n                commentList: {\r\n                    contentHtml: itm.comment_htmltag ?? '',\r\n                    contentText: itm.comment ?? '',\r\n                },\r\n                no: itm.no,\r\n                strTheRest: 4000,\r\n            }\r\n        })\r\n\r\n        if (commentaryProject?.commentaryInfo?.length === 1) {\r\n            commentInit = commentaryProject?.commentaryInfo.map((itm: any) => {\r\n                const countTextComment = itm.comment ? itm.comment?.length : 0\r\n                return {\r\n                    topic: translate.get('LABEL.SUGGESTION_NOTICE'),\r\n                    commentList: itm.comment,\r\n                    strTheRest: 4000 - countTextComment,\r\n                }\r\n            })\r\n        } else {\r\n            commentInit.forEach((item: any) => {\r\n                commentaryProject?.commentaryInfo.forEach((info: reviewerCommentType.CommitteeInfoApi) => {\r\n                    if (info.topicID === item.id) {\r\n                        const countTextComment = info.comment.contentText ? info.comment.contentText?.length : 0\r\n                        item.strTheRest = 4000 - countTextComment\r\n                        item.commentList = info.comment\r\n                        item.topic =\r\n                            translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                ? info.topicName_th\r\n                                : info.topicName_en\r\n                        item.id = info.topicID\r\n                        item.no = info.no\r\n                    }\r\n                })\r\n            })\r\n        }\r\n\r\n        if (formRef.current) {\r\n            formRef.current.change('commentDirector', commentInit)\r\n            formRef.current.restart()\r\n        }\r\n\r\n        const textRemain = commentInit?.map((item) => {\r\n            return item.strTheRest\r\n        })\r\n        setTextRemaining(textRemain)\r\n        setInitialComment(commentInit)\r\n        createInitialData()\r\n        createTopicUpload()\r\n    }\r\n\r\n    /*function สำหรับสร้างข้อมูลเริ่มต้นในฟอร์ม */\r\n    const createInitialData = () => {\r\n        if (commentaryProject) {\r\n            const remark = commentaryProject.commentaryRemark\r\n            const countStrRemark = remark ? remark.length : 0\r\n            const textRemainingRemarkInitial = 4000 - countStrRemark\r\n            //set ค่าเริ่มต้นฟอร์ม\r\n            const initialData = {\r\n                approveStatus:\r\n                    commentaryProject && commentaryProject?.approveStatusID\r\n                        ? {\r\n                              label:\r\n                                  translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                      ? commentaryProject.approveStatusName_th\r\n                                      : commentaryProject.approveStatusName_en,\r\n                              value: commentaryProject?.approveStatusID.toString(),\r\n                          }\r\n                        : null,\r\n                isDisableFrm:\r\n                    commentaryProject && commentaryProject?.isDraft == null\r\n                        ? false\r\n                        : commentaryProject?.isDraft\r\n                        ? false\r\n                        : true,\r\n                submittedID: commentaryProject && commentaryProject?.submittedID,\r\n                director:\r\n                    isCommitteeInfo.current && isCommitteeInfo.current[0]?.director\r\n                        ? isCommitteeInfo.current[0]?.director\r\n                        : null,\r\n                role:\r\n                    isCommitteeInfo.current && isCommitteeInfo.current[0]?.role\r\n                        ? isCommitteeInfo.current[0]?.role\r\n                        : null,\r\n                remark: remark ? remark : isViewMode ? '-' : null,\r\n                comment: isShowSubComment\r\n                    ? null\r\n                    : commentaryProject?.commentaryInfo[0]?.comment\r\n                    ? commentaryProject?.commentaryInfo[0]?.comment\r\n                    : null,\r\n                isShowUpdateDate:\r\n                    commentaryProject && commentaryProject?.isDraft == null\r\n                        ? false\r\n                        : commentaryProject?.isDraft\r\n                        ? true\r\n                        : true,\r\n            }\r\n\r\n            if (formRef.current) {\r\n                formRef.current.change('approveStatus', initialData.approveStatus)\r\n                formRef.current.restart()\r\n            }\r\n            commentaryAction.setSelectedCommittedID(commentaryProject?.userID)\r\n            setTextRemainingRemark(textRemainingRemarkInitial)\r\n            setInitialValues(initialData)\r\n        }\r\n    }\r\n\r\n    /**\r\n     * หัวข้ออัพโหลดเอกสาร\r\n     */\r\n    const createTopicUpload = () => {\r\n        const formatTopic = topicIsUploadComment.map((itm) => {\r\n            return { ...itm, code: null, subtopic: [] }\r\n        })\r\n        setDocumentTopic(formatTopic)\r\n\r\n        createInitialUploadFile(formatTopic)\r\n    }\r\n\r\n    /**\r\n     *\r\n     * การเช็ตค่าไฟล์เริ่มต้น\r\n     */\r\n    const createInitialUploadFile = (docTopic: ResultDocumentTopicLut[]) => {\r\n        if (commentaryProject) {\r\n            let documentInfo = commentaryProject.documentInfo\r\n            const uploadFileInit = docTopic?.map((itm: any, idx: number) => {\r\n                return {\r\n                    uploadFileObj: {\r\n                        fileList: [],\r\n                        subTopicPageList: [],\r\n                        documentTopicID: itm.id,\r\n                    },\r\n                }\r\n            }) as Array\r\n\r\n            if (documentInfo && documentInfo[0]?.fileInfo.length > 0) {\r\n                let fileList = documentInfo[0]?.fileInfo?.map((file: any) => ({\r\n                    documentTopicID: topicIsUploadComment[0].id,\r\n                    fileToken: file.fileToken, //fileToken\r\n                    filename: file.filename,\r\n                    fileID: file.fileToken, //fileToken\r\n                    path: file.path,\r\n                }))\r\n\r\n                uploadFileInit[0].uploadFileObj.fileList = fileList\r\n            }\r\n\r\n            setInitialUploadFile(uploadFileInit)\r\n        }\r\n    }\r\n\r\n    /* function สำหรับ set ข้อมูลเมื่อเลือกกรรมการคนใหม่ */\r\n    const handleChangDirector = (val: reviewerCommentType.OptType, chang: any) => {\r\n        if (val) {\r\n            const formValue = formRef.current.getState().values\r\n            let newFormValue = { ...formValue, director: null, role: null }\r\n            let initValue = {\r\n                ...initialValues,\r\n                commentDirector: initialComment,\r\n                uploadFile: initialUploadFile,\r\n                director: null,\r\n                role: null,\r\n            }\r\n\r\n            const isEqual = _.isEqual(initValue, newFormValue)\r\n            if (director.length > 1) {\r\n                if (\r\n                    !isEqual &&\r\n                    (commentaryProject?.isDraft || commentaryProject?.isDraft === null) &&\r\n                    !isDirectorEmptyRef.current\r\n                ) {\r\n                    chang('director', directorRef.current)\r\n                    setConfigDialog({\r\n                        title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                        content: translate.get('ALERT.CONTENT.CONFIRM_CHANGE_DIRECTOR'),\r\n                        type: 'alert-confirm',\r\n                        onClickConfirm: () => {\r\n                            if (showSaveDraft) {\r\n                                //บันทึกร่าง\r\n                                paramsRef.current = { ...newFormValue, director: directorRef.current }\r\n                                const parameter = getParameterForSave(paramsRef.current)\r\n                                if (parameter) {\r\n                                    parameter.isDraft = true\r\n                                    handleConfirmSave(parameter)\r\n                                }\r\n                            }\r\n\r\n                            isCommitteeInfo.current.forEach((itm: any) => {\r\n                                if (val === itm.director) {\r\n                                    chang('role', itm.role)\r\n                                    chang('director', itm.director)\r\n                                    directorRef.current = itm.director\r\n                                }\r\n                            })\r\n                            dialogTwoRef.current?.closeDialog()\r\n                            getCommentaryProjectCommitteeByID(parseInt(val.value))\r\n                        },\r\n                    })\r\n                    dialogTwoRef.current?.openDialog()\r\n                } else {\r\n                    isCommitteeInfo.current.forEach((itm: any) => {\r\n                        if (val === itm.director) {\r\n                            chang('role', itm.role)\r\n                            directorRef.current = itm.director\r\n                        }\r\n                    })\r\n                    if (val?.value) {\r\n                        getCommentaryProjectCommitteeByID(parseInt(val?.value))\r\n                    }\r\n                }\r\n                isDirectorEmptyRef.current = false\r\n            }\r\n        } else {\r\n            isDirectorEmptyRef.current = true\r\n        }\r\n    }\r\n\r\n    /* function สำหรับ set ข้อมูลเมื่อเลือกผลพิจารณา */\r\n    const handleChangStatus = (val: reviewerCommentType.OptType) => {\r\n        // if (val && val.value === '8') {\r\n        //     setIsRequired(true)\r\n        // } else {\r\n        //     setIsRequired(false)\r\n        // }\r\n        // setTimeout(() => {\r\n        //     formRef.current.resetFieldState('remark')\r\n        // })\r\n    }\r\n\r\n    const handleChangTextField = (val: string, idex: number) => {\r\n        if (textRemaining?.length > 0) {\r\n            textRemaining[idex] = 4000 - val.length\r\n        }\r\n    }\r\n\r\n    const handleChangRemark = (val: string) => {\r\n        if (textRemainingRemark) {\r\n            setTextRemainingRemark(4000 - val.length)\r\n        }\r\n    }\r\n\r\n    /**\r\n     * process for save\r\n     */\r\n\r\n    const handleClickCancel = (dirty: boolean) => {\r\n        if (dirty) {\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.WARNING'),\r\n                content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n                type: 'alert-confirm',\r\n\r\n                onClickConfirm: () => {\r\n                    history.push(RoutePath.manageProject)\r\n                },\r\n            })\r\n            dialogTwoRef.current?.openDialog()\r\n        } else {\r\n            history.push(RoutePath.manageProject)\r\n        }\r\n    }\r\n\r\n    const handleSubmitForm = async (val: any) => {\r\n        const parameter = getParameterForSave(val)\r\n        if (val.submitType === 'save') {\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n                type: 'alert-confirm',\r\n                onClickConfirm: () => {\r\n                    handleConfirmSave(parameter)\r\n                },\r\n            })\r\n            dialogTwoRef.current?.openDialog()\r\n        } else {\r\n            //ถ้า save draft ไม่ต้องมี alert confirm\r\n            handleConfirmSave(parameter)\r\n        }\r\n    }\r\n    const getParameterForSave = (val: any) => {\r\n        if (projectData && val) {\r\n            let isDraft = false\r\n            if (val.submitType === 'draft') {\r\n                isDraft = true\r\n            }\r\n            const commentaryInfo = val?.commentDirector?.map((item: any) => {\r\n                return {\r\n                    topicID: item && item?.id ? item?.id : null,\r\n                    contentHtml: item && item?.commentList?.contentHtml ? item?.commentList?.contentHtml : null,\r\n                    contentText: item && item?.commentList?.contentText ? item?.commentList?.contentText : null,\r\n                }\r\n            })\r\n            const commentaryProjectRequest: CommentaryProjectType = {\r\n                loginUserID: profileStore.profile.userId,\r\n                submittedID: projectData?.submittedID,\r\n                committeeUserID:\r\n                    profileStore.profile.userGroupId === constUserGroup.officer\r\n                        ? val && val.director && val.director.value\r\n                            ? parseInt(val?.director.value)\r\n                            : null\r\n                        : profileStore.profile.userId,\r\n                approveStatusID:\r\n                    val && val.approveStatus && val.approveStatus.value ? parseInt(val?.approveStatus.value) : null,\r\n                commentaryRemark: val && val.remark ? val.remark : null,\r\n                commentaryInfo: commentaryInfo ? commentaryInfo : [],\r\n                documentInfo: getDocumentInfo(val),\r\n                isDraft: isDraft,\r\n            }\r\n            return commentaryProjectRequest\r\n        }\r\n    }\r\n\r\n    const getDocumentInfo = (val: any) => {\r\n        let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n        let myFileData: Array = []\r\n\r\n        fileDataList.forEach((uploadObj: reviewerCommentType.UploadFileObjType) => {\r\n            const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n                return {\r\n                    subtopicID: subtopic.subtopicID,\r\n                    page: subtopic.page,\r\n                }\r\n            })\r\n\r\n            // const fileTokenInfo: Array = uploadObj.uploadFileObj.fileList?.map((file) => file.fileToken) ?? []\r\n            const fileTokenInfo: Array<{\r\n                replaceFileID: number\r\n                fileToken: string\r\n                fileExtension?: string\r\n                fileID: any\r\n            }> =\r\n                uploadObj.uploadFileObj.fileList?.map((file) => {\r\n                    return {\r\n                        //@ts-ignore\r\n                        replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n                        fileToken: file.fileToken,\r\n                        fileExtension: file.filename.split('.').pop(),\r\n                        fileID: file?.fileID ? file.fileID : null,\r\n                    }\r\n                }) ?? []\r\n\r\n            myFileData.push({\r\n                documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n                fileTokenInfo: fileTokenInfo,\r\n                subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n            })\r\n        })\r\n\r\n        return myFileData\r\n    }\r\n\r\n    const handleConfirmSave = async (\r\n        paramForSave: any,\r\n        tabIndex: number | null = null,\r\n        newTabSelected: TabSelectedType | null = null,\r\n        isFolder?: boolean,\r\n    ) => {\r\n        dialogTwoRef.current?.closeDialog()\r\n        const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n        loadingHook.loadingOpen()\r\n        const res = await callWebService.commentaryProject(paramForSave)\r\n\r\n        if (!isFolder) {\r\n            //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n            if (tabIndex && newTabSelected) {\r\n                //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n                tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n            } else {\r\n                //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n                if (callbackSaveComplete) {\r\n                    if (res && res.status) {\r\n                        callbackSaveComplete(res.status, isDraft)\r\n                    }\r\n                    if (res && res.status === 1) {\r\n                        const formValue = formRef.current.getState().values\r\n                        if (formValue && profileStore.profile.userId) {\r\n                            const directorID =\r\n                                formValue && formValue.director\r\n                                    ? parseInt(formValue.director.value)\r\n                                    : profileStore.profile.userId\r\n                            getCommentaryProjectCommitteeByID(directorID)\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        loadingHook.loadingClose()\r\n    }\r\n\r\n    /**\r\n     *\r\n     * Dirty\r\n     */\r\n    const handleDirtyChange = (props: { values: any }) => {\r\n        let isDirty: boolean = false\r\n        paramsRef.current = { ...props.values }\r\n\r\n        //** ตอน checkdirty จะไม่สนใจ รายชื่อกรรมการและหน้าที่  **//\r\n        let newFormValue = _.omit({ ...props.values }, ['director', 'role'])\r\n        let initValue = _.omit({ ...initialValues, commentDirector: initialComment, uploadFile: initialUploadFile }, [\r\n            'director',\r\n            'role',\r\n        ])\r\n        //**********************************************************//\r\n\r\n        const isEqual = _.isEqual(initValue, newFormValue) //ข้อมูลเท่ากัน\r\n        if (!isViewMode && !initialValues?.isDisableFrm) {\r\n            if (isEqual) {\r\n                isDirty = false\r\n            } else {\r\n                isDirty = true\r\n            }\r\n        }\r\n\r\n        // paramsRef.current = getParameterForSave(props.values)\r\n\r\n        const paramsDirty = {\r\n            tabDirty: isDirty,\r\n            callbackDirty: callbackDirtyProcess,\r\n        }\r\n        appFolderAndTabAction.setDirty(paramsDirty)\r\n    }\r\n\r\n    const callbackDirtyProcess = (\r\n        tabIndex: number | null = null,\r\n        newTabSelected: TabSelectedType | null = null,\r\n        isFolder?: boolean,\r\n    ) => {\r\n        const parameter = getParameterForSave(paramsRef.current)\r\n        if (parameter) {\r\n            parameter.isDraft = true\r\n            handleConfirmSave(parameter, tabIndex, newTabSelected, isFolder)\r\n        }\r\n    }\r\n    const checkIsDisplayCopyToClipboard = () => {\r\n        let isDisplayCopyToClipboard = false\r\n        if (projectData) {\r\n            if (projectData?.stepID > submittedStep.commentary) {\r\n                isDisplayCopyToClipboard = true\r\n            } else {\r\n                isDisplayCopyToClipboard = false\r\n            }\r\n        }\r\n        return isDisplayCopyToClipboard\r\n    }\r\n\r\n    const handleClickBackToSearch = () => {\r\n        history.push(RoutePath.manageProject)\r\n    }\r\n\r\n    const getAllCommentaryForExport = async () => {\r\n        if (projectData) {\r\n            const { result } = await callWebService.getHistoryCommentaryProjectCommittee(projectData?.submittedID)\r\n            const allCommentList = result.map((itm) => {\r\n                if (itm.commentary.length === 1) {\r\n                    itm.commentary.forEach((comment) => {\r\n                        comment.nameTopicTH1 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n                        comment.nameTopicEN1 = 'Suggestion / Notice'\r\n                        comment.nameTopicTH2 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n                        comment.nameTopicEN2 = 'Suggestion / Notice'\r\n                    })\r\n                }\r\n                if (itm.historyCommentary.length === 1) {\r\n                    itm.historyCommentary.forEach((comment) => {\r\n                        comment.nameTopicTH1 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n                        comment.nameTopicEN1 = 'Suggestion / Notice'\r\n                        comment.nameTopicTH2 = 'ข้อคิดเห็น / ข้อสังเกต'\r\n                        comment.nameTopicEN2 = 'Suggestion / Notice'\r\n                    })\r\n                }\r\n\r\n                return {\r\n                    userID: itm.userID,\r\n                    fullUsername_en: itm.fullUsername_en,\r\n                    fullUsername_th: itm.fullUsername_th,\r\n                    commentary: itm.commentary,\r\n                    updatedDate: itm.updatedDate,\r\n                    updateByNameTH: itm.updateByNameTH,\r\n                    updateByNameEN: itm.updateByNameEN,\r\n                    approveStatusName_th: itm.approveStatusName_th,\r\n                    approveStatusName_en: itm.approveStatusName_en,\r\n                    approveStatusID: itm.approveStatusID,\r\n                    historyCommentary: itm.historyCommentary,\r\n                }\r\n            })\r\n            setDataSourceForExport(allCommentList)\r\n        }\r\n    }\r\n    return {\r\n        role: [],\r\n        director,\r\n        isViewMode,\r\n        isCommittee: checkPermissionHook.isCommitteeInProject(projectData?.committeeInfo ?? []),\r\n        isUserChairman: checkPermissionHook.isUserChairman(),\r\n        initialValues,\r\n        commentTitleList,\r\n        initialComment,\r\n        configDialog,\r\n        formRef,\r\n        isShowSubComment,\r\n        isRequired,\r\n        textRemaining,\r\n        textRemainingRemark,\r\n        documentTopic,\r\n        initialUploadFile,\r\n        dataSourceForCopyToClipboard,\r\n        isDisplayCopyToClipboard: checkIsDisplayCopyToClipboard(),\r\n        projectData,\r\n        showSaveDraft,\r\n        dataSourceForExport,\r\n        dataForShowUpdateDate,\r\n\r\n        onDirtyChange: handleDirtyChange,\r\n        onChangeDirector: handleChangDirector,\r\n        onChangStatus: handleChangStatus,\r\n        onRefDialogTwo,\r\n        onChangTextField: handleChangTextField,\r\n        onChangRemark: handleChangRemark,\r\n        onClickCancel: handleClickCancel,\r\n        onSubmitForm: handleSubmitForm,\r\n        onClickBackToSearch: handleClickBackToSearch,\r\n    }\r\n}\r\n\r\nexport default useReviewerComment\r\n","import React from 'react'\r\nimport * as reviewerCommentType from './reviewerCommentType'\r\n\r\nimport arrayMutators from 'final-form-arrays'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport ResultConsideration from '../../../shareUI/resultConsideration/resultConsideration'\r\nimport CommentDirector from '../../../shareUI/commentDirector/commentDirector'\r\nimport Autocomplete from '../../../../../control/autocomplete/autocomplete'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport useReviewerComment from './useReviewerComment'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport PageAction from '../pageAction'\r\nimport Button from '../../../../../control/button/button'\r\n\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport { Grid, makeStyles, useMediaQuery, useTheme } from '@material-ui/core'\r\nimport CopyToclipboard from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport ExportToMSWord from '../../../../../control/exportToMSWord/exportToMSWord'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport useCommentaryStore from '../../../../../stores/commentary/useCommentaryStore'\r\n\r\nconst ReviewerCommentREC1View: React.FC = (props) => {\r\n    const {\r\n        role,\r\n        formRef,\r\n        director,\r\n        isViewMode,\r\n        isCommittee,\r\n        isUserChairman,\r\n        configDialog,\r\n        initialValues,\r\n        documentTopic,\r\n        initialComment,\r\n        commentTitleList,\r\n        initialUploadFile,\r\n        isDisplayCopyToClipboard,\r\n        dataSourceForCopyToClipboard,\r\n        projectData,\r\n        showSaveDraft,\r\n        dataSourceForExport,\r\n        dataForShowUpdateDate,\r\n        onSubmitForm,\r\n        onClickCancel,\r\n        onDirtyChange,\r\n        onChangStatus,\r\n        onRefDialogTwo,\r\n        onChangeDirector,\r\n        onClickBackToSearch,\r\n    } = props\r\n    const translate = useTranslate()\r\n    const snackbarAction = useSnackbarAction()\r\n    const classes = useStyles()\r\n    const isDisable = initialValues?.isDisableFrm || isViewMode\r\n    const theme = useTheme()\r\n    const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n    const irb = projectData?.irb\r\n    const { selectedCommitteeID } = useCommentaryStore()\r\n\r\n    const renderMainReviewer = (change: (name: F, value?: any) => void) => {\r\n        return (\r\n            \r\n                \r\n                     {\r\n                            onChangeDirector(val, change)\r\n                        }}\r\n                        required\r\n                    />\r\n                \r\n                \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    return (\r\n        <>\r\n            {isDisplayCopyToClipboard && (\r\n                \r\n                    \r\n                    \r\n                \r\n            )}\r\n            \r\n                {(props) => {\r\n                    const { form, handleSubmit, dirty, invalid, errors } = props\r\n                    formRef.current = form\r\n                    return (\r\n                        \r\n                            \r\n                                {(!isCommittee || isUserChairman) && (\r\n                                    \r\n                                        \r\n                                            \r\n                                                {renderMainReviewer(form.change)}\r\n                                            \r\n                                        \r\n                                    \r\n                                )}\r\n\r\n                                \r\n                                    \r\n                                \r\n\r\n                                \r\n                                    \r\n                                \r\n                                \r\n                                    \r\n                                \r\n\r\n                                {initialValues.isShowUpdateDate && (\r\n                                    \r\n                                        {translate.get('LABEL.UPDATER')} :\r\n                                        {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                            ? dataForShowUpdateDate?.nameTH\r\n                                            : dataForShowUpdateDate?.nameEN}\r\n                                          \r\n                                        {translate.get('LABEL.UPDATE_DATE')} :\r\n                                        {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                            ? convertDateToFormatTH(dataForShowUpdateDate?.date ?? '')\r\n                                            : convertDateToFormatEN(dataForShowUpdateDate?.date ?? '')}\r\n                                    \r\n                                )}\r\n\r\n                                {!isDisable && (\r\n                                    \r\n                                         {\r\n                                                onClickCancel(dirty)\r\n                                            }}\r\n                                            onClickSave={() => {\r\n                                                form.change('submitType', 'save')\r\n                                                handleSubmit()\r\n                                                invalid &&\r\n                                                    errors &&\r\n                                                    snackbarAction.openSnackbar({\r\n                                                        message: translate.get('MESSAGE.M012'),\r\n                                                        type: 'error',\r\n                                                    })\r\n                                            }}\r\n                                            onClickSaveDraft={\r\n                                                showSaveDraft\r\n                                                    ? () => {\r\n                                                          form.change('submitType', 'draft')\r\n                                                          handleSubmit()\r\n                                                      }\r\n                                                    : undefined\r\n                                            }\r\n                                        />\r\n                                    \r\n                                )}\r\n\r\n                                {isDisable && !isViewMode && (\r\n                                    \r\n                                        \r\n                                            {translate.get('BUTTON.CLOSE')}\r\n                                        \r\n                                    \r\n                                )}\r\n                            \r\n                            \r\n                            \r\n                        \r\n                    )\r\n                }}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nconst ReviewerCommentREC1: React.FC = (props) => {\r\n    const useReviewerCommentModel = useReviewerComment(props)\r\n    return \r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n    grid: {\r\n        marginBottom: '0px',\r\n    },\r\n    btnGroup: {\r\n        padding: '18px',\r\n    },\r\n}))\r\n\r\nexport default ReviewerCommentREC1\r\n","import React from 'react'\r\nimport * as reviewerCommentType from './reviewerCommentType'\r\n\r\nimport arrayMutators from 'final-form-arrays'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport ResultConsideration from '../../../shareUI/resultConsideration/resultConsideration'\r\nimport CommentDirector from '../../../shareUI/commentDirector/commentDirector'\r\nimport Autocomplete from '../../../../../control/autocomplete/autocomplete'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport useReviewerComment from './useReviewerComment'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport PageAction from '../pageAction'\r\nimport Button from '../../../../../control/button/button'\r\n\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport { Grid, makeStyles, useMediaQuery, useTheme } from '@material-ui/core'\r\nimport CopyToclipboard from '../../../../../control/copyToClipboard/copyToclipboard'\r\nimport ExportToMSWord from '../../../../../control/exportToMSWord/exportToMSWord'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport useChecklistStore from '../../../../../stores/checklist/useChecklistStore'\r\nimport useCommentaryStore from '../../../../../stores/commentary/useCommentaryStore'\r\nimport { ChildType } from '../../../../../services/web/types/requestWebServiceTypes'\r\n\r\nconst ReviewerCommentREC2View: React.FC = (props) => {\r\n    const {\r\n        role,\r\n        formRef,\r\n        director,\r\n        isViewMode,\r\n        isCommittee,\r\n        configDialog,\r\n        initialValues,\r\n        documentTopic,\r\n        initialComment,\r\n        commentTitleList,\r\n        initialUploadFile,\r\n        isDisplayCopyToClipboard,\r\n        dataSourceForCopyToClipboard,\r\n        projectData,\r\n        showSaveDraft,\r\n        dataSourceForExport,\r\n        dataForShowUpdateDate,\r\n        onSubmitForm,\r\n        onClickCancel,\r\n        onDirtyChange,\r\n        onChangStatus,\r\n        onRefDialogTwo,\r\n        onChangeDirector,\r\n        onClickBackToSearch,\r\n    } = props\r\n    const translate = useTranslate()\r\n    const snackbarAction = useSnackbarAction()\r\n    const classes = useStyles()\r\n    const isDisable = initialValues?.isDisableFrm || isViewMode\r\n    const theme = useTheme()\r\n    const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n    const irb = projectData?.irb\r\n    const { checklist } = useChecklistStore()\r\n    const { selectedCommitteeID } = useCommentaryStore()\r\n\r\n    const renderMainReviewer = (change: (name: F, value?: any) => void) => {\r\n        return (\r\n            \r\n                \r\n                     {\r\n                            onChangeDirector(val, change)\r\n                        }}\r\n                        required\r\n                    />\r\n                \r\n                \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    return (\r\n        <>\r\n            {isDisplayCopyToClipboard && (\r\n                \r\n                    \r\n                    \r\n                \r\n            )}\r\n            \r\n                {(props) => {\r\n                    const { form, handleSubmit, dirty, invalid, errors } = props\r\n                    formRef.current = form\r\n                    return (\r\n                        \r\n                            \r\n                                {!isCommittee && (\r\n                                    \r\n                                        \r\n                                            \r\n                                                {renderMainReviewer(form.change)}\r\n                                            \r\n                                        \r\n                                    \r\n                                )}\r\n\r\n                                \r\n                                    \r\n                                \r\n\r\n                                \r\n                                    \r\n                                \r\n\r\n                                \r\n                                    \r\n                                \r\n\r\n                                {initialValues.isShowUpdateDate && (\r\n                                    \r\n                                        {translate.get('LABEL.UPDATER')} :\r\n                                        {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                            ? dataForShowUpdateDate?.nameTH\r\n                                            : dataForShowUpdateDate?.nameEN}\r\n                                          \r\n                                        {translate.get('LABEL.UPDATE_DATE')} :\r\n                                        {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                            ? convertDateToFormatTH(dataForShowUpdateDate?.date ?? '')\r\n                                            : convertDateToFormatEN(dataForShowUpdateDate?.date ?? '')}\r\n                                    \r\n                                )}\r\n\r\n                                {!isDisable && (\r\n                                    \r\n                                         {\r\n                                                onClickCancel(dirty)\r\n                                            }}\r\n                                            onClickSave={() => {\r\n                                                form.change('submitType', 'save')\r\n                                                handleSubmit()\r\n                                                invalid &&\r\n                                                    errors &&\r\n                                                    snackbarAction.openSnackbar({\r\n                                                        message: translate.get('MESSAGE.M012'),\r\n                                                        type: 'error',\r\n                                                    })\r\n                                            }}\r\n                                            onClickSaveDraft={\r\n                                                showSaveDraft\r\n                                                    ? () => {\r\n                                                          form.change('submitType', 'draft')\r\n                                                          handleSubmit()\r\n                                                      }\r\n                                                    : undefined\r\n                                            }\r\n                                        />\r\n                                    \r\n                                )}\r\n\r\n                                {isDisable && !isViewMode && (\r\n                                    \r\n                                        \r\n                                            {translate.get('BUTTON.CLOSE')}\r\n                                        \r\n                                    \r\n                                )}\r\n                            \r\n                            \r\n                            \r\n                        \r\n                    )\r\n                }}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nconst ReviewerCommentREC2: React.FC = (props) => {\r\n    const useReviewerCommentModel = useReviewerComment(props)\r\n    return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    grid: {\r\n        marginBottom: '0px',\r\n    },\r\n    btnGroup: {\r\n        padding: '18px',\r\n    },\r\n}))\r\n\r\nexport default ReviewerCommentREC2\r\n","import React from 'react'\r\nimport { fileExt as fileExtConst, topicForLecturer, topicForStudent } from '../../../../../constants/constants'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as synthesisReviewType from './synthesisReviewType'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport authenStore from '../../../../../stores/authen/authenStore'\r\n\r\nimport _ from 'lodash'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { requestWebServiceTypes } from '../../../../../services/web/types'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport {\r\n    DocumentInfo,\r\n    SynthesisReviewInfo,\r\n    SynthesisReviewRemarkInfo,\r\n} from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport path from 'path'\r\nimport useProjectHook from '../../../shareLogic/useProjectHook'\r\nimport { SynthesisReviewProjectRequestType } from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport { TabSelectedType } from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport { FormApi } from 'final-form'\r\n\r\nconst useSynthesisReview = (props: synthesisReviewType.UseSynthesisReviewType) => {\r\n    const { callbackSaveComplete } = props\r\n    const manageProjectStore = useManageProjectStore()\r\n    const projectHook = useProjectHook()\r\n\r\n    const projectData = manageProjectStore.projectData\r\n    const loadingHook = useLoading()\r\n    const translate = useTranslate()\r\n    const callWebService = useWebService()\r\n    const [initialValues, setInitialValues] = React.useState({})\r\n    const checkPermissionHook = checkPermission()\r\n    const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n    const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n    const appFolderAndTabAction = useAppFolderAndTabAction()\r\n    const profileStore = authenStore()\r\n    const [configDialog, setConfigDialog] =\r\n        React.useState>()\r\n    const dialogRef = React.useRef>()\r\n    const history = useHistory()\r\n    const [initialComment, setInitialComment] = React.useState([])\r\n    const [synthesisReviewInfoList, setSynthesisReviewInfo] = React.useState([])\r\n    const [isLoadedSynthesisReview, setIsLoadedSynthesisReview] = React.useState(false)\r\n    const [synthesisReviewRemarkInfoList, setSynthesisReviewRemarkInfo] = React.useState()\r\n    const [documentInfoList, setDocumentInfo] = React.useState([])\r\n    const [approveStatus, setApproveStatus] = React.useState()\r\n    const [initialRichTextEditor, setInitialRichTextEditor] = React.useState([])\r\n    const [initialCommentRichTextEditor, setInitialCommentRichTextEditor] = React.useState([])\r\n    const [initialRichRemark, setInitialRichRemark] = React.useState()\r\n    const formValues = React.useRef()\r\n    const tabAndFolderHook = useFolderAndTab()\r\n\r\n    React.useEffect(() => {\r\n        getSynthesisReviewData()\r\n        getSynthesisData()\r\n    }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n    React.useEffect(() => {\r\n        if (Number(projectData?.stepID) > 8) {\r\n            createInitialRichTextEditor()\r\n        }\r\n        createInitialData()\r\n        createInitialComment()\r\n        createInitialRichRemark()\r\n    }, [isLoadedSynthesisReview])\r\n\r\n    React.useEffect(() => {\r\n        createInitialComment()\r\n    }, [translate.languageStore.currentLanguage])\r\n\r\n    const onRefDialog = (func: Record) => {\r\n        //ห้าม set State หรือเรียก Action ในนี้\r\n        dialogRef.current = func\r\n    }\r\n\r\n    const handleDirtyChange = (props: any, formRef: FormApi>) => {\r\n        formValues.current = { ...props.values }\r\n        let isDirty: boolean = false\r\n        //** จัดformat initValue และ Form Value เพื่อเตรียมตัวนำไปใช้เปรียบเทียบค่า  **//\r\n        //const documentSelected = documentInfoList.filter((item) => item.isCheckAll === true)\r\n        let newFormValue = { ...props.values }\r\n        // if (documentSelected.length > 0) {\r\n        //     newFormValue.documentCertificate = {\r\n        //         childSelected: _.flattenDeep(documentSelected.map((itm) => itm.fileInfo)),\r\n        //         parentSelected: documentSelected,\r\n        //     }\r\n        // }\r\n        let initValue = { ...formRef.getState().initialValues }\r\n        initValue.commentDirector = initValue.commentDirector?.map((data: any, idx: number) => ({\r\n            ...data,\r\n            consideration: initialRichTextEditor[idx],\r\n            commentList: initialRichTextEditor[idx],\r\n        }))\r\n        initValue.remark = initialRichRemark\r\n        //**********************************************************//\r\n        const isEqual = _.isEqual(newFormValue, initValue) //ข้อมูลเท่ากัน\r\n        if (!isViewMode) {\r\n            if (isEqual) {\r\n                isDirty = false\r\n            } else {\r\n                isDirty = true\r\n            }\r\n        } else {\r\n            isDirty = false\r\n        }\r\n\r\n        const paramsDirty = {\r\n            tabDirty: isDirty,\r\n            callbackDirty: callbackDirtyProcess,\r\n        }\r\n        appFolderAndTabAction.setDirty(paramsDirty)\r\n    }\r\n\r\n    const callbackDirtyProcess = (\r\n        tabIndex: number | null = null,\r\n        newTabSelected: TabSelectedType | null = null,\r\n        isFolder?: boolean,\r\n    ) => {\r\n        const parameter = getParameterForSave(formValues.current)\r\n        if (parameter) {\r\n            parameter.isDraft = true\r\n            handleConfirmSave(parameter, tabIndex, newTabSelected, isFolder)\r\n        }\r\n    }\r\n\r\n    const getParameterForSave = (val: synthesisReviewType.TFormValue) => {\r\n        let paramForSave = null\r\n        const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n        const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n        let isDraft = false\r\n        if (val.submitType === 'draft') {\r\n            isDraft = true\r\n        }\r\n        let isApproveWithCommentFlow\r\n        if (manageProjectStore?.projectData) {\r\n            // isEditAfterReview = projectHook.isEditAfterReview(manageProjectStore?.projectData)\r\n            isApproveWithCommentFlow = projectHook.isFlowApproveWithComment(manageProjectStore?.projectData)\r\n        }\r\n\r\n        const isNotHaveStampFileList =\r\n            val?.documentCertificate?.childSelected?.length === 0 &&\r\n            val?.documentCertificate?.parentSelected?.length === 0\r\n\r\n        // if (isApproveWithCommentFlow) {\r\n        //     const synthesisReviewProjectRequest: requestWebServiceTypes.SynthesisReviewApproveWithCommentType = {\r\n        //         loginUserID: profileStore.profile.userId,\r\n        //         submittedID: submittedID,\r\n        //         // stampFileList: val.documentCertificate.childSelected.map((itm: any) => {\r\n        //         //     return itm.fileID\r\n        //         // }),\r\n        //         stampFileList: isNotHaveStampFileList ? null : val.documentCertificate,\r\n        //         isDraft: isDraft,\r\n        //     }\r\n        //     paramForSave = synthesisReviewProjectRequest\r\n        // } else {\r\n        const synthesisReviewProjectRequest: requestWebServiceTypes.SynthesisReviewProjectRequestType = {\r\n            loginUserID: profileStore.profile.userId,\r\n            submittedID: submittedID,\r\n            synthesisReviewInfo: val.commentDirector?.map((itm: any) => {\r\n                return {\r\n                    commentaryTopicId: itm.id,\r\n                    comment: itm.consideration && itm.consideration.contentText ? itm.consideration.contentText : null,\r\n                    comment_htmltag:\r\n                        itm.consideration && itm.consideration.contentHtml ? itm.consideration.contentHtml : null,\r\n                }\r\n            }),\r\n            // stampFileList: val.documentCertificate.childSelected.map((itm: any) => {\r\n            //     return itm.fileID\r\n            // }),\r\n            stampFileList: isNotHaveStampFileList ? null : val.documentCertificate,\r\n            synthesisReviewRemarkInfo: {\r\n                remark: val.remark && val.remark.contentText ? val.remark.contentText : null,\r\n                remark_htmltag: val.remark && val.remark.contentHtml ? val.remark.contentHtml : null,\r\n            },\r\n            isDraft: isDraft,\r\n        }\r\n        paramForSave = synthesisReviewProjectRequest\r\n        // }\r\n\r\n        // paramForSave = synthesisProjectRequest\r\n\r\n        return paramForSave\r\n    }\r\n\r\n    const handleSubmitForm = async (val: synthesisReviewType.TFormValue) => {\r\n        const parameter = getParameterForSave(val)\r\n        if (val.submitType === 'save') {\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n                type: 'alert-confirm',\r\n                onClickConfirm: () => {\r\n                    handleConfirmSave(parameter)\r\n                },\r\n            })\r\n            dialogRef.current?.openDialog()\r\n        } else {\r\n            //ถ้า save draft ไม่ต้องมี alert confirm\r\n            handleConfirmSave(parameter)\r\n        }\r\n    }\r\n\r\n    const handleConfirmSave = async (\r\n        paramForSave:\r\n            | requestWebServiceTypes.SynthesisReviewProjectRequestType\r\n            | requestWebServiceTypes.SynthesisReviewApproveWithCommentType,\r\n        tabIndex: number | null = null,\r\n        newTabSelected: TabSelectedType | null = null,\r\n        isFolder?: boolean,\r\n    ) => {\r\n        let isApproveWithCommentFlow\r\n        if (manageProjectStore?.projectData) {\r\n            // isEditAfterReview = projectHook.isEditAfterReview(manageProjectStore?.projectData)\r\n            isApproveWithCommentFlow = projectHook.isFlowApproveWithComment(manageProjectStore?.projectData)\r\n        }\r\n        dialogRef.current?.closeDialog()\r\n\r\n        const isDraft = paramForSave.isDraft ? paramForSave.isDraft : false\r\n        loadingHook.loadingOpen()\r\n        let res\r\n        if (isApproveWithCommentFlow) {\r\n            const param = { ...paramForSave } as SynthesisReviewProjectRequestType\r\n            res = await callWebService.synthesisReviewApproveWithCommentProject(param)\r\n        } else {\r\n            const param = { ...paramForSave } as requestWebServiceTypes.SynthesisReviewProjectRequestType\r\n            res = await callWebService.synthesisReviewProjectRenewal(param)\r\n        }\r\n\r\n        if (!isFolder) {\r\n            //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน folder ใช่หรือไม่?\r\n            if (tabIndex && newTabSelected) {\r\n                //if นี้จะเช็คว่าเป็นการติด dirty จากการกดเปลี่ยน Tab ใช่หรือไม่?\r\n                tabAndFolderHook.setTab(tabIndex, newTabSelected)\r\n            } else {\r\n                //หากเข้า else หมายความว่าเป็นการบันทึกจากกดปุ่มบันทึกไม่ใช่จากการติด dirty\r\n                if (callbackSaveComplete) {\r\n                    if (res && res.status) {\r\n                        callbackSaveComplete(res.status, isDraft)\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        loadingHook.loadingClose()\r\n    }\r\n\r\n    const handleClickCancel = (dirty: boolean) => {\r\n        if (dirty) {\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.WARNING'),\r\n                content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n                type: 'alert-confirm',\r\n                onClickConfirm: () => {\r\n                    history.push(RoutePath.manageProject)\r\n                },\r\n            })\r\n            dialogRef.current?.openDialog()\r\n        } else {\r\n            history.push(RoutePath.manageProject)\r\n        }\r\n    }\r\n\r\n    const getSynthesisData = async () => {\r\n        if (projectData) {\r\n            loadingHook.loadingOpen()\r\n            const submittedID = projectData.submittedID\r\n            const { result } = await callWebService.getSynthesisProjectByID(submittedID)\r\n            loadingHook.loadingClose()\r\n\r\n            if (result) {\r\n                const approveStatus = {\r\n                    id: result.approveStatusID,\r\n                    nameTH: result.approveStatusName_th,\r\n                    nameEN: result.approveStatusName_en,\r\n                }\r\n                setApproveStatus(approveStatus)\r\n            }\r\n\r\n            const commentList = result.synthesisInfo.map((item) => {\r\n                let comment: { contentHtml: string | null; contentText: string | null } = {\r\n                    contentHtml: '',\r\n                    contentText: '',\r\n                }\r\n                comment.contentText = item.comment.contentText ?? null\r\n                comment.contentHtml = item.comment.contentHtml ?? null\r\n                return comment\r\n            })\r\n            setInitialCommentRichTextEditor(commentList)\r\n            // if (projectData.stepID === 8) {\r\n            //     setInitialRichTextEditor(commentList)\r\n            // }\r\n        }\r\n    }\r\n\r\n    const getSynthesisReviewData = async () => {\r\n        if (projectData) {\r\n            setIsLoadedSynthesisReview(false)\r\n            loadingHook.loadingOpen()\r\n            const submittedID = projectData.submittedID\r\n            const data = await callWebService.getSynthesisReview(submittedID)\r\n            loadingHook.loadingClose()\r\n            if (data.status === 1) {\r\n                let documentInfo = [...data.result.documentInfo]\r\n                documentInfo.forEach((itm) => {\r\n                    const topicID = itm.topicID\r\n                    let isCheckAll: boolean | null = null\r\n                    itm.fileInfo.forEach((file) => {\r\n                        file.topicID = topicID\r\n                        if (path.extname(`${file.filename}`) === fileExtConst.pdf) {\r\n                            if (file.isStamp && isCheckAll !== false) {\r\n                                isCheckAll = true\r\n                            } else {\r\n                                isCheckAll = false\r\n                            }\r\n                        }\r\n                    })\r\n                    itm.isCheckAll = isCheckAll\r\n                })\r\n                //  BUG IS STAMP ออกมาเป็น false หมดเลย\r\n                // setApproveStatus(data?.result?.approveStatusName_th)\r\n                // setDocumentInfo(data.result.documentInfo)\r\n\r\n                const commentList = data.result.synthesisReviewInfo.map((item) => {\r\n                    let comment: { contentHtml: string | null; contentText: string | null } = {\r\n                        contentHtml: '',\r\n                        contentText: '',\r\n                    }\r\n                    comment.contentText = item.synthesisReviewComment ?? null\r\n                    comment.contentHtml = item.synthesisReviewCommentHtmlTag ?? null\r\n                    return comment\r\n                })\r\n                setInitialRichTextEditor(commentList)\r\n\r\n                filterTopicUpload(documentInfo)\r\n                // setDocumentInfo(documentInfo)\r\n                setSynthesisReviewInfo(data.result.synthesisReviewInfo)\r\n                setSynthesisReviewRemarkInfo(data.result.synthesisReviewRemarkInfo)\r\n                setIsLoadedSynthesisReview(true)\r\n            }\r\n        }\r\n    }\r\n\r\n    const filterTopicUpload = (documentTopic: DocumentInfo[]) => {\r\n        let docTopic: DocumentInfo[] = []\r\n        const researcherTypeID = projectData?.researcherTypeInfo.value\r\n        if (documentTopic) {\r\n            let isDocTopic = documentTopic\r\n            if (researcherTypeID === 1) {\r\n                topicForLecturer.forEach((element) => {\r\n                    docTopic = documentTopic?.filter((item: any) => {\r\n                        return item.topicID !== element.id\r\n                    })\r\n                })\r\n            } else {\r\n                topicForStudent.forEach((element) => {\r\n                    docTopic = isDocTopic?.filter((item: any) => {\r\n                        return item.topicID !== element.id\r\n                    })\r\n                    isDocTopic = docTopic\r\n                })\r\n            }\r\n            if (docTopic.length > 1) {\r\n                docTopic = docTopic?.map((itm, index: number) => {\r\n                    return { ...itm, topicNo: index + 1 }\r\n                })\r\n            }\r\n            setDocumentInfo(docTopic)\r\n        }\r\n    }\r\n\r\n    const createInitialComment = () => {\r\n        const commentInit = synthesisReviewInfoList?.map((itm: any) => {\r\n            return {\r\n                topic:\r\n                    translate.languageStore.currentLanguage === translate.languageKey.th\r\n                        ? itm.topicName_th\r\n                        : itm.topicName_en,\r\n                id: itm.topicID,\r\n                no: itm.topicNo,\r\n                commentList: itm.synthesisComment,\r\n            }\r\n        })\r\n        setInitialComment(commentInit)\r\n    }\r\n\r\n    const createInitialData = () => {\r\n        const { childSelectedList, parentSelectedList } = getInitialChildSelected()\r\n\r\n        const initialData = {\r\n            documentCertificate: {\r\n                childSelected: childSelectedList,\r\n                parentSelected: parentSelectedList,\r\n            },\r\n            commentRemarkList:\r\n                synthesisReviewRemarkInfoList && synthesisReviewRemarkInfoList.synthesisRemark\r\n                    ? synthesisReviewRemarkInfoList.synthesisRemark\r\n                    : null,\r\n            remarkList:\r\n                synthesisReviewRemarkInfoList && synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n                    ? synthesisReviewRemarkInfoList?.synthesisReviewRemark\r\n                    : '-',\r\n        }\r\n\r\n        setInitialValues(initialData)\r\n    }\r\n\r\n    const getInitialChildSelected = () => {\r\n        let childSelectedList: any = []\r\n        let parentSelectedList: any = []\r\n\r\n        documentInfoList.forEach((documentItm) => {\r\n            if (documentItm.fileInfo.length > 0) {\r\n                documentItm.fileInfo.forEach((file) => {\r\n                    if (file.isStamp) {\r\n                        childSelectedList.push(file)\r\n                    }\r\n                })\r\n            }\r\n            if (documentItm.isCheckAll) {\r\n                parentSelectedList.push(documentItm)\r\n            }\r\n        })\r\n\r\n        return { parentSelectedList, childSelectedList }\r\n    }\r\n\r\n    const createInitialRichTextEditor = () => {\r\n        const initialData = synthesisReviewInfoList.map((itm) => {\r\n            return {\r\n                contentHtml: itm.synthesisReviewCommentHtmlTag\r\n                    ? itm.synthesisReviewCommentHtmlTag\r\n                    : itm.synthesisComment,\r\n                contentText: itm.synthesisReviewComment,\r\n            }\r\n        })\r\n\r\n        setInitialRichTextEditor(initialData)\r\n    }\r\n\r\n    const createInitialRichRemark = () => {\r\n        const initialData = {\r\n            contentHtml: isViewMode\r\n                ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html ?? ''\r\n                    ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html ?? ''\r\n                    : '-'\r\n                : synthesisReviewRemarkInfoList?.synthesisReviewRemark_html ?? ''\r\n                ? synthesisReviewRemarkInfoList?.synthesisReviewRemark_html ?? ''\r\n                : synthesisReviewRemarkInfoList?.synthesisRemark ?? '',\r\n            contentText: synthesisReviewRemarkInfoList?.synthesisReviewRemark ?? '',\r\n        }\r\n\r\n        setInitialRichRemark(initialData)\r\n    }\r\n\r\n    return {\r\n        isViewMode,\r\n        projectData,\r\n        configDialog,\r\n        approveStatus,\r\n        initialValues,\r\n        initialComment,\r\n        initialCommentRichTextEditor,\r\n        isShowUpdateDate,\r\n        documentInfoList,\r\n        initialRichRemark,\r\n        initialRichTextEditor,\r\n        isFlowApproveWithComment: projectData ? projectHook.isFlowApproveWithComment(projectData) : false,\r\n        onRefDialog,\r\n        onSubmitForm: handleSubmitForm,\r\n        handleDirtyChange: handleDirtyChange,\r\n        onClickCancel: handleClickCancel,\r\n    }\r\n}\r\n\r\nexport default useSynthesisReview\r\n","import * as SynthesisReviewType from './synthesisReviewType'\r\nimport useSyntheticReview from './useSyntheticReview'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport TreeCheckbox from '../../../../../control/treeCheckbox/treeCheckbox'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport PageAction from '../pageAction'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../constants/approveStatus'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\n\r\nconst SynthesisReviewREC1View: React.FC = (props) => {\r\n    const {\r\n        isViewMode,\r\n        projectData,\r\n        configDialog,\r\n        initialValues,\r\n        initialComment,\r\n        initialCommentRichTextEditor,\r\n        isShowUpdateDate,\r\n        initialRichRemark,\r\n        documentInfoList,\r\n        initialRichTextEditor,\r\n        isHideDocumentCertificate = false,\r\n        isFlowApproveWithComment = false,\r\n        onRefDialog,\r\n        onSubmitForm,\r\n        onClickCancel,\r\n        handleDirtyChange,\r\n    } = props\r\n\r\n    const translate = useTranslate()\r\n    const snackbarAction = useSnackbarAction()\r\n\r\n    // const isAdmin = checkPermission.isUserAdmin()\r\n    // const isShowCommentRemarkList = initialValues?.commentRemarkList !== null\r\n    // const isShowCommentRemarkList = true\r\n    // const isShowComment = (approveStatus && approveStatus?.id !== 1 && approveStatus?.id !== 8) || !isResearcherView\r\n    const isShowComment = true\r\n    const isSynthesisApprove: boolean =\r\n        projectData?.synthesisApproveStatusInfo?.value === approveStatusREC1.approveForContiueResearch ||\r\n        projectData?.synthesisApproveStatusInfo?.value === approveStatusREC2.approveForContiueResearch //ผลการพิจารณาเป็น อนุมัติให้ดำเนินการวิจัยต่อเนื่อง\r\n    const isDisplayTreeCheckboxSection: boolean =\r\n        !isHideDocumentCertificate && (isFlowApproveWithComment || isSynthesisApprove)\r\n\r\n    const renderOfficerView = (name: string, index: number) => {\r\n        return (\r\n            <>\r\n                \r\n                    \r\n                \r\n                \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    return (\r\n        \r\n            {(props) => {\r\n                const { form, handleSubmit, dirty, invalid, errors } = props\r\n\r\n                return (\r\n                    <>\r\n                        \r\n                            {!isFlowApproveWithComment && (\r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                \r\n                                                    \r\n                                                \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            )}\r\n                            {!isFlowApproveWithComment && (\r\n                                \r\n                                    \r\n                                        \r\n                                            {isShowComment && (\r\n                                                \r\n                                                    {({ fields }) => {\r\n                                                        return fields?.map((name, index) =>\r\n                                                            renderOfficerView(name, index),\r\n                                                        )\r\n                                                    }}\r\n                                                \r\n                                            )}\r\n                                        \r\n                                    \r\n                                \r\n                            )}\r\n                            {isDisplayTreeCheckboxSection && (\r\n                                \r\n                                    \r\n                                        \r\n                                    \r\n                                \r\n                            )}\r\n                            {/* {!isFlowApproveWithComment && (\r\n                                \r\n                                    \r\n                                        \r\n                                            {!isResearcherView ? (\r\n                                                \r\n                                                    {isShowCommentRemarkList && (\r\n                                                        \r\n                                                            \r\n                                                        \r\n                                                    )}\r\n\r\n                                                    \r\n                                                        \r\n                                                    \r\n                                                \r\n                                            ) : (\r\n                                                \r\n                                                    \r\n                                                \r\n                                            )}\r\n                                        \r\n                                    \r\n                                \r\n                            )} */}\r\n                            {isShowUpdateDate && }\r\n                            {!isViewMode && (\r\n                                \r\n                                     {\r\n                                            onClickCancel(dirty)\r\n                                        }}\r\n                                        onClickSave={() => {\r\n                                            form.change('submitType', 'save')\r\n                                            handleSubmit()\r\n                                            invalid &&\r\n                                                errors &&\r\n                                                snackbarAction.openSnackbar({\r\n                                                    message: translate.get('MESSAGE.M012'),\r\n                                                    type: 'error',\r\n                                                })\r\n                                        }}\r\n                                        onClickSaveDraft={() => {\r\n                                            form.change('submitType', 'draft')\r\n                                            handleSubmit()\r\n                                        }}\r\n                                    />\r\n                                \r\n                            )}\r\n                        \r\n\r\n                        \r\n                         {\r\n                                handleDirtyChange(formState, form)\r\n                            }}\r\n                        />\r\n                    \r\n                )\r\n            }}\r\n        \r\n    )\r\n}\r\n\r\nconst SynthesisReviewREC1: React.FC = (props) => {\r\n    const useSyntheticReviewModel = useSyntheticReview(props)\r\n    return \r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n    spacingButton: {\r\n        marginBottom: '10px',\r\n    },\r\n    paper: {\r\n        width: '100%',\r\n        height: 128,\r\n        padding: 20,\r\n    },\r\n    titleFont: {\r\n        color: '#BDBDBD',\r\n    },\r\n    contentFont: {\r\n        fontWeight: 'bold',\r\n    },\r\n}))\r\n\r\nexport default SynthesisReviewREC1\r\n","import * as SynthesisReviewType from './synthesisReviewType'\r\nimport useSyntheticReview from './useSyntheticReview'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../control/richTextEditor/richTextEditor'\r\nimport { Grid, makeStyles } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport TreeCheckbox from '../../../../../control/treeCheckbox/treeCheckbox'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport PageAction from '../pageAction'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport constProjectStatus from '../../../../../constants/projectStatus'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../constants/approveStatus'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\n\r\nconst SynthesisReviewREC2View: React.FC = (props) => {\r\n    const {\r\n        isViewMode,\r\n        projectData,\r\n        configDialog,\r\n        initialValues,\r\n        initialComment,\r\n        initialCommentRichTextEditor,\r\n        isShowUpdateDate,\r\n        initialRichRemark,\r\n        documentInfoList,\r\n        initialRichTextEditor,\r\n        isHideDocumentCertificate = false,\r\n        isFlowApproveWithComment = false,\r\n        onRefDialog,\r\n        onSubmitForm,\r\n        onClickCancel,\r\n        handleDirtyChange,\r\n    } = props\r\n\r\n    const translate = useTranslate()\r\n    const checkPermission = useCheckPermission()\r\n    const snackbarAction = useSnackbarAction()\r\n\r\n    const isAdmin = checkPermission.isUserAdmin()\r\n    const isShowCommentRemarkList = initialValues?.commentRemarkList !== null\r\n    const isShowComment = true\r\n    const isSynthesisApprove: boolean =\r\n        projectData?.synthesisApproveStatusInfo?.value === approveStatusREC1.approveForContiueResearch ||\r\n        projectData?.synthesisApproveStatusInfo?.value === approveStatusREC2.approveForContiueResearch //ผลการพิจารณาเป็น อนุมัติให้ดำเนินการวิจัยต่อเนื่อง\r\n\r\n    const isDisplayTreeCheckboxSection: boolean =\r\n        !isHideDocumentCertificate && (isFlowApproveWithComment || isSynthesisApprove)\r\n    const isStatusComplete = projectData && projectData?.projectStatusInfo?.value === constProjectStatus.completed\r\n\r\n    const renderOfficerView = (name: string, index: number) => {\r\n        return (\r\n            <>\r\n                \r\n                    \r\n                \r\n                \r\n                    \r\n                \r\n            \r\n        )\r\n    }\r\n\r\n    return (\r\n        \r\n            {(props) => {\r\n                const { form, handleSubmit, dirty, invalid, errors } = props\r\n\r\n                return (\r\n                    <>\r\n                        \r\n                            {!isFlowApproveWithComment && (\r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                \r\n                                                    \r\n                                                \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            )}\r\n                            {!isFlowApproveWithComment && (\r\n                                \r\n                                    \r\n                                        \r\n                                            {isShowComment && (\r\n                                                \r\n                                                    {({ fields }) => {\r\n                                                        return fields?.map((name, index) =>\r\n                                                            renderOfficerView(name, index),\r\n                                                        )\r\n                                                    }}\r\n                                                \r\n                                            )}\r\n                                        \r\n                                    \r\n                                \r\n                            )}\r\n                            {isDisplayTreeCheckboxSection && (\r\n                                \r\n                                    \r\n                                        \r\n                                    \r\n                                \r\n                            )}\r\n                            {/* {!isFlowApproveWithComment && (\r\n                                \r\n                                    \r\n                                        \r\n                                            {!isResearcherView ? (\r\n                                                \r\n                                                    {isShowCommentRemarkList && (\r\n                                                        \r\n                                                            \r\n                                                        \r\n                                                    )}\r\n\r\n                                                    \r\n                                                        \r\n                                                    \r\n                                                \r\n                                            ) : (\r\n                                                \r\n                                                    \r\n                                                \r\n                                            )}\r\n                                        \r\n                                    \r\n                                \r\n                            )} */}\r\n                            {isShowUpdateDate && }\r\n                            {!isViewMode && (\r\n                                \r\n                                     {\r\n                                            onClickCancel(dirty)\r\n                                        }}\r\n                                        onClickSave={() => {\r\n                                            form.change('submitType', 'save')\r\n                                            handleSubmit()\r\n                                            invalid &&\r\n                                                errors &&\r\n                                                snackbarAction.openSnackbar({\r\n                                                    message: translate.get('MESSAGE.M012'),\r\n                                                    type: 'error',\r\n                                                })\r\n                                        }}\r\n                                        onClickSaveDraft={() => {\r\n                                            form.change('submitType', 'draft')\r\n                                            handleSubmit()\r\n                                        }}\r\n                                    />\r\n                                \r\n                            )}\r\n                        \r\n\r\n                        \r\n                         {\r\n                                handleDirtyChange(formState, form)\r\n                            }}\r\n                        />\r\n                    \r\n                )\r\n            }}\r\n        \r\n    )\r\n}\r\n\r\nconst SynthesisReviewREC2: React.FC = (props) => {\r\n    const useSyntheticReviewModel = useSyntheticReview(props)\r\n    return \r\n}\r\nconst useStyles = makeStyles((theme) => ({\r\n    spacingButton: {\r\n        marginBottom: '10px',\r\n    },\r\n    paper: {\r\n        width: '100%',\r\n        height: 128,\r\n        padding: 20,\r\n    },\r\n    titleFont: {\r\n        color: '#BDBDBD',\r\n    },\r\n    contentFont: {\r\n        fontWeight: 'bold',\r\n    },\r\n}))\r\n\r\nexport default SynthesisReviewREC2\r\n","import SynthesisREC1 from '../../../page/synthesisRenewal/synthesisREC1' //padge\r\nimport SynthesisREC2 from '../../../page/synthesisRenewal/synthesisREC2' //padge\r\nimport AdditionalDocumentREC1 from '../../../page/additionalDocument/additionalDocumentREC1'\r\nimport AdditionalDocumentREC2 from '../../../page/additionalDocument/additionalDocumentREC2'\r\nimport VerifyDocumentREC1 from '../../../page/verifyDocumentRenewal/verifyDocumentREC1'\r\nimport VerifyDocumentREC2 from '../../../page/verifyDocumentRenewal/verifyDocumentREC2'\r\nimport DefineProjectREC1 from '../../../page/defineProject/defineProjectREC1'\r\nimport DefineProjectREC2 from '../../../page/defineProject/defineProjectREC2'\r\nimport GenerateCertificateREC1 from '../../../page/generateCertificate/generateCertificateREC1'\r\nimport GenerateCertificateREC2 from '../../../page/generateCertificate/generateCertificateREC2'\r\nimport DefineSubmittedDateREC1 from '../../../page/defineSubmittedDate/defineSubmittedDateREC1'\r\nimport DefineSubmittedDateREC2 from '../../../page/defineSubmittedDate/defineSubmittedDateREC2'\r\nimport ReviewerCommentREC1 from '../../../page/reviewerCommentRenewal/reviewerCommentREC1'\r\nimport ReviewerCommentREC2 from '../../../page/reviewerCommentRenewal/reviewerCommentREC2'\r\n\r\nimport SynthesisReviewREC1 from '../../../page/synthesisReviewRenewal/synthesisReviewREC1'\r\nimport SynthesisReviewREC2 from '../../../page/synthesisReviewRenewal/synthesisReviewREC2'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\n\r\nimport { OfficerType } from './officerType'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport SignREC2 from '../../../page/sign/signREC2'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentREC1'\r\nimport SignREC1 from '../../../page/sign/signREC1'\r\n\r\nimport SignVicePresidentREC2 from '../../../page/signVicePresident/signVicePresidentREC2'\r\nimport SignVicePresidentREC1 from '../../../page/signVicePresident/signVicePresidentREC1'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n    const { callbackSaveComplete } = props\r\n    const appFolderAndTabStore = useAppFolderAndTabStore()\r\n    const manageProjectStore = useManageProjectStore()\r\n    const checkPermission = useCheckPermission()\r\n\r\n    const renderPage = () => {\r\n        const tabID = appFolderAndTabStore?.tabSelected?.id\r\n        const REC = manageProjectStore?.projectData?.irbType\r\n        let isDisableTestRes = false\r\n        switch (REC) {\r\n            case 1:\r\n                switch (tabID) {\r\n                    case Constants.menuTab.tab1.id:\r\n                        // tab1 
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isDisableTestRes =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC1
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n // code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return renderSignRepresentElement(1) //\r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isDisableTestRes =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC2
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n /// code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return renderSignRepresentElement(2)\r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n const renderSignRepresentElement = (REC: 1 | 2) => {\r\n const isVicePresident = checkPermission.isUserViceChairman()\r\n if (REC === 1) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n } else if (REC === 2) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useRequestProjectRenewal from './useRequestProjectRenewal'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\ntype RequestNewProjectViewType = ReturnType &\r\n Omit\r\nconst RequestProjectRenewalView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const currentSelectTab = appFolderAndTabStore.tabSelected.stepID\r\n\r\n const checkConditionBtnClose = () => {\r\n let isEditDirector = false\r\n\r\n //เช็คว่ามีการกลับมาแก้ไขกรรมการมั้ย และไม่ใช่กรรมการเข้ามาใช่มั้ย (ปุ่มถอนยื่นต้องแสดงทุก step)\r\n if (projectData?.stepID) {\r\n isEditDirector = projectData?.stepID >= constSubmittedStep.submit && projectData?.committeeInfo.length >= 0\r\n }\r\n\r\n // เช็คว่าแก๊งประธานมาตรวจสอบเอกสารในขั้นตอนกำหนดประเภทโครงการมั้ย\r\n const isChairmanVerifyDoc =\r\n checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.specifyProjectType\r\n\r\n // เช็คว่าผ่านstepการกำหนดประเภทโครงการและกรรมการไปรึยัง และกำลังเปิด tab กำหนดประเภทและกรรมการอยู่ใช่มั้ย\r\n const isChkStepEditDirector =\r\n currentSelectTab === constSubmittedStep.specifyProjectType &&\r\n projectData?.stepID !== constSubmittedStep.specifyProjectType\r\n\r\n let isBtnClose = isChairmanVerifyDoc ? false : isChkStepEditDirector ? isEditDirector : isViewMode\r\n\r\n return isBtnClose\r\n }\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {checkConditionBtnClose() && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type RequestProjectRenewalType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst RequestProjectRenewal: React.FC = (props) => {\r\n const requestProjectRenewalModel = useRequestProjectRenewal(props)\r\n return \r\n}\r\nexport default RequestProjectRenewal\r\n","import React from 'react'\r\nimport { RequestProjectRenewalType } from './requestProjectRenewal'\r\nimport * as RequestProjectRenewalOtherType from './requestProjectRenewalOtherType'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\n\r\nexport default (props: RequestProjectRenewalType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n const loadingHook = useLoading()\r\n\r\n React.useEffect(() => {\r\n console.log('####Project Renewal####')\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport useResearcher from './useResearcher'\r\nimport ProjectRenewal from '../../../page/requestNewProject/projectRenewal/projectRenewal'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/resultOfConsider'\r\nimport NoticeAdditionalDocument from '../../../page/noticeAdditionalDocument/noticeAdditionalDocument'\r\nimport CertificateStampDocument from '../../../page/certificateStampDocument/certificateStampDocument'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\nimport { menuTab } from '../../../../../../constants/constants'\r\n\r\ntype ResearcherViewType = ResearcherType & ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { projectMode, callbackSaveComplete, initialData, isViewMode, submittedType, formValueRef, projectData } =\r\n props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return (\r\n //
PROJECT RENEWAL
\r\n \r\n )\r\n case menuTab.tab22.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab23.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab24.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n case menuTab.tab26.id:\r\n return (\r\n <>\r\n \r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcher = useResearcher(props)\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { ResearcherType } from './researcher'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport * as ResearcherOtherType from './researcherOtherType'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useIRB from '../../../../../../services/um/lookups/useIRB'\r\n\r\nexport default (props: ResearcherType) => {\r\n const { projectMode } = props\r\n const manageProjectStore = useManageProjectStore()\r\n\r\n const checkPermission = useCheckPermission()\r\n const { irb } = useIRB()\r\n\r\n const formValueRef = React.useRef()\r\n\r\n const [initialData, setInitialData] = React.useState()\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n createInitialFormData()\r\n } else if (mode === 'EDIT') {\r\n editInitialFormData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID ?? null, irb ?? null])\r\n\r\n const createInitialFormData = () => {\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n isPhase: '1',\r\n langTH: true,\r\n isCertificatePaperList: '1',\r\n academicPosition: `7`, //ไม่ระบุ\r\n }\r\n setInitialData(initialData)\r\n }\r\n\r\n const editInitialFormData = () => {\r\n let isRequestCertificatePager: string | null = null\r\n if (typeof manageProjectStore.projectData?.isRequestCertificatePager === 'boolean') {\r\n if (manageProjectStore.projectData?.isRequestCertificatePager === true) {\r\n isRequestCertificatePager = '1'\r\n } else {\r\n isRequestCertificatePager = '2'\r\n }\r\n }\r\n let initialData: ResearcherOtherType.InitialFormValueType = {\r\n academicPositionID: manageProjectStore.projectData?.academicPositionInfo?.value,\r\n // otherAcademicPosition: manageProjectStore.projectData?.academicPositionOther,\r\n otherAcademicPositionTH: manageProjectStore.projectData?.academicPositionOther_th,\r\n otherAcademicPositionEN: manageProjectStore.projectData?.academicPositionOther_en,\r\n email: manageProjectStore.projectData?.email,\r\n faculty: {\r\n label: `${manageProjectStore.projectData?.facultyInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.facultyInfo?.value}`,\r\n },\r\n fax: manageProjectStore.projectData?.fax,\r\n homePhone: manageProjectStore.projectData?.homePhone,\r\n irb: manageProjectStore.projectData?.irb,\r\n isDraft: manageProjectStore.projectData?.isDraft,\r\n mobilePhone: manageProjectStore.projectData?.mobilePhone,\r\n projectNameEN: manageProjectStore.projectData?.projectName_en,\r\n projectNameTH: manageProjectStore.projectData?.projectName_th,\r\n projectSubmitType: {\r\n label: `${manageProjectStore.projectData?.submitTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.submitTypeInfo?.value}`,\r\n },\r\n nameEN: manageProjectStore.projectData?.researcherName_en,\r\n nameTH: manageProjectStore.projectData?.researcherName_th,\r\n //@ts-ignore\r\n researcherType:\r\n manageProjectStore.projectData?.researcherTypeInfo &&\r\n manageProjectStore.projectData?.researcherTypeInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.researcherTypeInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.researcherTypeInfo?.value}`,\r\n }\r\n : null,\r\n educationLevel:\r\n manageProjectStore.projectData?.educationLevelInfo &&\r\n manageProjectStore.projectData?.educationLevelInfo.value\r\n ? {\r\n label: `${manageProjectStore.projectData?.educationLevelInfo?.nameTH}`,\r\n value: `${manageProjectStore.projectData?.educationLevelInfo?.value}`,\r\n }\r\n : null,\r\n titleNameID: manageProjectStore.projectData?.titleNameInfo?.value,\r\n // otherTitleName: manageProjectStore.projectData?.titleNameOther,\r\n otherTitleNameTH: manageProjectStore.projectData?.titleNameOther_th,\r\n otherTitleNameEN: manageProjectStore.projectData?.titleNameOther_en,\r\n isPhase: manageProjectStore.projectData?.requestPhase ? '2' : '1', //`${manageProjectStore.projectData?.submitTypeInfo.value}`, //'2', // hardcode\r\n isTools: manageProjectStore.projectData?.isTools ? '2' : '1',\r\n IRB: irb.filter((itm) => parseInt(itm.value) === manageProjectStore.projectData?.irb)[0] || null,\r\n titleName: `${manageProjectStore.projectData?.titleNameInfo?.value}` || null,\r\n academicPosition: `${manageProjectStore.projectData?.academicPositionInfo?.value}` || null,\r\n langTH: manageProjectStore.projectData?.isLanguageTH ? manageProjectStore.projectData?.isLanguageTH : false,\r\n langEN: manageProjectStore.projectData?.isLanguageEN ? manageProjectStore.projectData?.isLanguageEN : false,\r\n isCertificatePaperList: isRequestCertificatePager,\r\n remarkFromAdmin: manageProjectStore.projectData?.verifyDocumentRemark || null,\r\n numPhase: manageProjectStore.projectData?.requestPhase,\r\n isDr: manageProjectStore.projectData?.isDr ? manageProjectStore.projectData?.isDr : false,\r\n }\r\n\r\n setInitialData(initialData)\r\n }\r\n\r\n return {\r\n formValueRef,\r\n isViewMode,\r\n initialData: initialData,\r\n projectData: manageProjectStore.projectData,\r\n\r\n submittedType:\r\n manageProjectStore.projectData?.submitTypeInfo?.value ?? constSubmittedType.firstSubmitConsideration,\r\n }\r\n}\r\n","import SynthesisREC1 from '../../../page/synthesisRenewal/synthesisREC1' //padge\r\nimport SynthesisREC2 from '../../../page/synthesisRenewal/synthesisREC2' //padge\r\nimport AdditionalDocumentREC1 from '../../../page/additionalDocument/additionalDocumentREC1'\r\nimport AdditionalDocumentREC2 from '../../../page/additionalDocument/additionalDocumentREC2'\r\nimport VerifyDocumentREC1 from '../../../page/verifyDocumentRenewal/verifyDocumentREC1'\r\nimport VerifyDocumentREC2 from '../../../page/verifyDocumentRenewal/verifyDocumentREC2'\r\nimport DefineProjectREC1 from '../../../page/defineProject/defineProjectREC1'\r\nimport DefineProjectREC2 from '../../../page/defineProject/defineProjectREC2'\r\nimport GenerateCertificateREC1 from '../../../page/generateCertificate/generateCertificateREC1'\r\nimport GenerateCertificateREC2 from '../../../page/generateCertificate/generateCertificateREC2'\r\nimport DefineSubmittedDateREC1 from '../../../page/defineSubmittedDate/defineSubmittedDateREC1'\r\nimport DefineSubmittedDateREC2 from '../../../page/defineSubmittedDate/defineSubmittedDateREC2'\r\nimport ReviewerCommentREC1 from '../../../page/reviewerCommentRenewal/reviewerCommentREC1'\r\nimport ReviewerCommentREC2 from '../../../page/reviewerCommentRenewal/reviewerCommentREC2'\r\n\r\nimport SynthesisReviewREC1 from '../../../page/synthesisReviewRenewal/synthesisReviewREC1'\r\nimport SynthesisReviewREC2 from '../../../page/synthesisReviewRenewal/synthesisReviewREC2'\r\nimport ResultOfConsiderPrevious from '../../../page/resultOfConsiderPrevious/resultOfConsiderPrevious'\r\n\r\nimport { OfficerType } from './officerType'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport SignREC2 from '../../../page/sign/signREC2'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentREC1'\r\nimport SignREC1 from '../../../page/sign/signREC1'\r\n\r\nimport SignVicePresidentREC2 from '../../../page/signVicePresident/signVicePresidentREC2'\r\nimport SignVicePresidentREC1 from '../../../page/signVicePresident/signVicePresidentREC1'\r\n\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n // const tabID = 19\r\n const REC = manageProjectStore?.projectData?.irbType\r\n let isDisableTestRes = false\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isDisableTestRes =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC1
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n // code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return renderSignRepresentElement(1) //\r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isDisableTestRes =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.specifyProjectType\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab2.id:\r\n // code block\r\n // return
กำหนดประเภทโครงการและกรรมการ REC2
\r\n return (\r\n (manageProjectStore?.projectData && (\r\n \r\n )) || <>\r\n )\r\n case Constants.menuTab.tab3.id:\r\n /// code block กำหนดชุดโครงการที่ต้องส่ง\r\n return \r\n case Constants.menuTab.tab4.id:\r\n // code blockชุดโครงการครบถ้วนและกำหนดส่งความคิดเห็นของผู้ทบทวนหลัก\r\n return \r\n case Constants.menuTab.tab5.id:\r\n // code block บันทึกข้อคิดเห็นของกรรมการ\r\n return \r\n\r\n case Constants.menuTab.tab6.id:\r\n // code block\r\n\r\n return \r\n case Constants.menuTab.tab7.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab8.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab9.id:\r\n // code block\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n // code block\r\n return renderSignRepresentElement(2)\r\n\r\n case Constants.menuTab.tab26.id:\r\n return (\r\n \r\n )\r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n\r\n const renderSignRepresentElement = (REC: 1 | 2) => {\r\n const isVicePresident = checkPermission.isUserViceChairman()\r\n if (REC === 1) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n } else if (REC === 2) {\r\n if (isVicePresident) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n }\r\n\r\n return <> {renderPage()} \r\n}\r\n\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useRequestProjectRenewalEditAfterReview from './useRequestProjectRenewalEditAfterReview'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\ntype RequestNewProjectEditAfterReviewViewType = ReturnType &\r\n Omit\r\nconst RequestProjectRenewalEditAfterReviewView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const currentSelectTab = appFolderAndTabStore.tabSelected.stepID\r\n\r\n const checkConditionBtnClose = () => {\r\n let isEditDirector = false\r\n\r\n //เช็คว่ามีการกลับมาแก้ไขกรรมการมั้ย และไม่ใช่กรรมการเข้ามาใช่มั้ย (ปุ่มถอนยื่นต้องแสดงทุก step)\r\n if (projectData?.stepID) {\r\n isEditDirector = projectData?.stepID >= constSubmittedStep.submit && projectData?.committeeInfo.length >= 0\r\n }\r\n\r\n // เช็คว่าแก๊งประธานมาตรวจสอบเอกสารในขั้นตอนกำหนดประเภทโครงการมั้ย\r\n const isChairmanVerifyDoc =\r\n checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.specifyProjectType\r\n\r\n // เช็คว่าผ่านstepการกำหนดประเภทโครงการและกรรมการไปรึยัง และกำลังเปิด tab กำหนดประเภทและกรรมการอยู่ใช่มั้ย\r\n const isChkStepEditDirector =\r\n currentSelectTab === constSubmittedStep.specifyProjectType &&\r\n projectData?.stepID !== constSubmittedStep.specifyProjectType\r\n\r\n let isBtnClose = isChairmanVerifyDoc ? false : isChkStepEditDirector ? isEditDirector : isViewMode\r\n\r\n return isBtnClose\r\n }\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {checkConditionBtnClose() && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type RequestProjectRenewalEditAfterReviewType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst RequestProjectRenewalEditAfterReview: React.FC = (props) => {\r\n const requestProjectRenewalEditAfterReviewModel = useRequestProjectRenewalEditAfterReview(props)\r\n return \r\n}\r\nexport default RequestProjectRenewalEditAfterReview\r\n","import React from 'react'\r\nimport { RequestProjectRenewalEditAfterReviewType } from './requestProjectRenewalEditAfterReview'\r\n// import * as requestProjectRenewalEditAfterReviewType from './requestProjectRenewalEditAfterReviewType'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n// import useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\n\r\nexport default (props: RequestProjectRenewalEditAfterReviewType) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n const loadingHook = useLoading()\r\n\r\n React.useEffect(() => {\r\n console.log('####Project Renewal####')\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\n","import React from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { CloseProjectByAdminType } from './closeProjectByAdmin'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport * as REQServiceType from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport CloseProjectOfficer from '../../page/closeProjectOfficer/closeProjectOfficer'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\n\r\nconst useCloseProjectByAdmin = (props: CloseProjectByAdminType) => {\r\n const { projectMode } = props\r\n const checkPermission = useCheckPermission()\r\n const manageProjectStore = useManageProjectStore()\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const authenStore = useAuthenStore()\r\n const tabAndFolderHook = useFolderAndTab()\r\n\r\n const history = useHistory()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const isFirstRender = React.useRef(true)\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n const handleClickCloseProject = () => {\r\n setConfigDialog({\r\n title: translate.get('LABEL.CLOSE_PROJECT'),\r\n content: React.createElement(CloseProjectOfficer, {\r\n onClickClose: () => {\r\n dialogRef.current?.closeDialog()\r\n setConfigDialog({})\r\n },\r\n onClickSave: handleSaveCloseProject,\r\n }),\r\n type: '',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleSaveCloseProject = async (val: any) => {\r\n dialogRef.current?.closeDialog()\r\n const projectID = manageProjectStore?.projectData?.projectID ?? null\r\n const paramForSave: REQServiceType.CloseProjectByAdmin = {\r\n projectID: projectID,\r\n remark: val?.remark,\r\n }\r\n loadingHook.loadingOpen()\r\n const { status } = await callWebService.closeProjectByAdmin(paramForSave)\r\n loadingHook.loadingClose()\r\n\r\n if (status) {\r\n // conditionDialog(status)\r\n if (handleCallbackSaveComplete) handleCallbackSaveComplete(status, false)\r\n }\r\n }\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n\r\n onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickCloseProject: handleClickCloseProject,\r\n }\r\n}\r\nexport default useCloseProjectByAdmin\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport { ResultDocumentTopicLut } from '../../../../../../services/lookup/types/responseLookupServiceTypes'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport * as Utils from '../../../../../../utilities/date'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\n\r\nimport { uploadFileObjType } from '../../verifyDocument/verifyDocumentType'\r\nimport { CloseProjectByAdminType } from './closeProjectByAdmin'\r\ntype OptType = {\r\n label: string\r\n value: string\r\n}\r\ntype UploadFileObjType = {\r\n uploadFileObj: {\r\n documentTopicID: number\r\n\r\n fileList: {\r\n documentTopicID: number\r\n fileID: string\r\n fileToken: string\r\n filename: string\r\n path: string\r\n }[]\r\n\r\n subTopicPageList?: {\r\n page: string\r\n documentTopicID: number\r\n subtopicID: number\r\n }[]\r\n }\r\n}\r\ntype MyFileDataType = {\r\n documentTopicID?: number\r\n fileTokenInfo: Array<{\r\n fileID: any\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n }>\r\n subtopic?: {\r\n subtopicID: number\r\n page: number\r\n }[]\r\n}\r\nconst useCloseProjectByAdmin = (props: CloseProjectByAdminType) => {\r\n const { projectData, onSaveComplete } = props\r\n\r\n const history = useHistory()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const authenStore = useAuthenStore()\r\n const { profile } = authenStore\r\n\r\n const manageProjectStore = useManageProjectStore()\r\n const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const [isCompletely, setIsCompletely] = React.useState(true)\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n\r\n const documentTopicRef = React.useRef()\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const reviewerLutRef = React.useRef()\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n setIsCompletely(projectData?.verifyDocument ?? true)\r\n getReviewer(projectData.irb)\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.irb && projectData?.submitTypeInfo?.value) {\r\n getDocumentTopicLut(projectData?.irb, projectData?.submitTypeInfo.value)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null])\r\n\r\n React.useEffect(() => {\r\n createInitialUploadFile()\r\n }, [\r\n manageProjectStore.documentTopic,\r\n JSON.stringify(manageProjectStore.projectData?.documentInfo),\r\n JSON.stringify(manageProjectStore.projectData?.latestDocument),\r\n ])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const filterTopicUpload = (documentTopic: ResultDocumentTopicLut[]) => {\r\n let docTopic: ResultDocumentTopicLut[] = []\r\n const researcherTypeID = manageProjectStore?.projectData?.researcherTypeInfo.value\r\n\r\n if (documentTopic) {\r\n let isDocTopic = documentTopic\r\n if (researcherTypeID === 1) {\r\n Constants.topicForLecturer.forEach((element) => {\r\n docTopic = documentTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n })\r\n } else {\r\n Constants.topicForStudent.forEach((element) => {\r\n docTopic = isDocTopic?.filter((item) => {\r\n return item.id !== element.id\r\n })\r\n isDocTopic = docTopic\r\n })\r\n }\r\n if (docTopic.length > 1) {\r\n docTopic = docTopic?.map((itm, index: number) => {\r\n return { ...itm, no: index + 1 }\r\n })\r\n manageProjectAction.setDocumentTopic(docTopic)\r\n }\r\n }\r\n }\r\n\r\n const getDocumentTopicLut = async (irb: number, submitType: number) => {\r\n if (irb) {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitType)\r\n if (res.status === 1) {\r\n manageProjectAction.setDocumentTopic(res.result)\r\n filterTopicUpload(res.result)\r\n documentTopicRef.current = res.result\r\n } else {\r\n manageProjectAction.setDocumentTopic([])\r\n documentTopicRef.current = []\r\n }\r\n }\r\n }\r\n\r\n const createInitialUploadFile = () => {\r\n const documentInfo = projectData?.documentInfo\r\n // ------------------------------------------------------------- //\r\n let uploadFileInit = manageProjectStore.documentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n uploadFileInit?.forEach((itm: uploadFileObjType) => {\r\n documentInfo?.forEach((docInfo: any) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList = docInfo.fileInfo\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic\r\n }\r\n })\r\n })\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n\r\n const getReviewer = async (irb: number) => {\r\n if (irb) {\r\n const res = await callLookup.callReviewerLut(irb)\r\n const formatedData = res.result.map((itm) => {\r\n return {\r\n label: itm.name_th,\r\n value: `${itm.id}`,\r\n }\r\n })\r\n reviewerLutRef.current = formatedData\r\n }\r\n }\r\n\r\n const handleChangeDocCompletely = (val: string) => {\r\n const isCompletely = val === '1' ? true : false\r\n setIsCompletely(isCompletely)\r\n }\r\n\r\n const createInitialData = () => {\r\n const defaultCompletely = projectData?.verifyDocument ?? '1'\r\n const initialData = {\r\n isCompletelyDoc: defaultCompletely === '1' ? defaultCompletely : projectData?.verifyDocument ? '1' : '2',\r\n resubmitDocDate: projectData?.resubmitDocDate ? projectData?.resubmitDocDate : null,\r\n //@ts-ignore\r\n reviewer: projectData?.reviewerUserID\r\n ? {\r\n label: `${projectData?.reviewerName_th}`,\r\n value: `${projectData?.reviewerUserID}`,\r\n }\r\n : null,\r\n remark: projectData?.verifyDocumentRemark,\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const checkUseUploadEdit = () => {\r\n let isUseUploadEdit = false\r\n\r\n switch (projectData?.submitTypeInfo?.value) {\r\n case constSubmittedType.nonconformance:\r\n isUseUploadEdit = true\r\n break\r\n default:\r\n isUseUploadEdit = false\r\n break\r\n }\r\n\r\n return isUseUploadEdit\r\n }\r\n const handleDirtyChange = (props: { dirty: boolean }) => {\r\n let isDirty: boolean = false\r\n if (!isViewMode) {\r\n isDirty = props.dirty\r\n }\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const parameterForSave = {\r\n projectID: projectData?.projectID || null,\r\n submittedID: projectData?.submittedID || null,\r\n irb: projectData?.irb || null,\r\n userID: profile.userId as number,\r\n projectName_th: projectData?.projectName_th || null,\r\n projectName_en: projectData?.projectName_en || null,\r\n projectSubmitTypeID: projectData?.submitTypeInfo.value || null,\r\n\r\n facultyID: projectData?.facultyInfo.value || null,\r\n requestPhase: projectData?.requestPhase || null,\r\n isTools: projectData?.isTools,\r\n researcherTypeID: projectData?.researcherTypeInfo.value || null,\r\n titleNameID: projectData?.titleNameInfo.value || null,\r\n titleNameOther_th: projectData?.titleNameOther_th || null,\r\n titleNameOther_en: projectData?.titleNameOther_en || null,\r\n academicPositionID: projectData?.academicPositionInfo?.value || null,\r\n academicPositionOther_th: projectData?.academicPositionOther_th || null,\r\n academicPositionOther_en: projectData?.academicPositionOther_en || null,\r\n educationLevelID: projectData?.educationLevelInfo ? projectData?.educationLevelInfo.value : null,\r\n researcherName_th: projectData?.researcherName_th || null,\r\n researcherName_en: projectData?.researcherName_en || null,\r\n email: projectData?.email || null,\r\n homePhone: projectData?.homePhone || null,\r\n mobilePhone: projectData?.mobilePhone || null,\r\n fax: projectData?.fax || null,\r\n isDraft: isDraft,\r\n isLanguage_th: projectData?.isLanguageTH,\r\n isLanguage_en: projectData?.isLanguageEN,\r\n isRequestCertificatePaper: projectData?.isRequestCertificatePager ? true : false,\r\n isDr: projectData?.isDr,\r\n } as REQServiceType.ReportedAdverseEventsRequestType\r\n\r\n return parameterForSave\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft: boolean = true\r\n const param = getSaveServiceParameter(isDraft)\r\n\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceType.CloseProjectByAdminNew,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n try {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.closeProjectByAdminNew(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useVerifyDocument.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleSubmitForm = async (value: any) => {\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param = getSaveServiceParameter(isDraft)\r\n const paramSave = {\r\n ...param,\r\n documentInfo: getDocumentInfo(value),\r\n }\r\n\r\n switch (value.submitType) {\r\n case 'save':\r\n handleSave(paramSave)\r\n break\r\n\r\n case 'draft':\r\n handleSaveDraft(paramSave)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n const handleSaveDraft = (param: any) => {\r\n processSaveData(param)\r\n }\r\n\r\n const handleSave = async (param: any) => {\r\n // if (param.documentInfo?.length === 0) {\r\n // setConfigDialog({\r\n // title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n // content: translate.get('ALERT.CONTENT.UPLOAD_AT_LEAST_1_FILE'),\r\n // type: 'alert-message',\r\n // })\r\n // } else {\r\n const isRequirePDF = checkRequirePDF(param.documentInfo)\r\n if (isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => handleClickConfirmSave(param),\r\n })\r\n }\r\n // }\r\n dialogRef.current?.openDialog()\r\n }\r\n const checkRequirePDF = (documentInfo: MyFileDataType[]) => {\r\n let isRequirePDF = false\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if (documentInfo[i]?.fileTokenInfo[j].fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n\r\n const handleClickConfirmSave = (param: any) => {\r\n processSaveData(param)\r\n }\r\n const getDocumentInfo = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n return {\r\n formRef,\r\n configDialog,\r\n onRefDialog,\r\n isCompletely,\r\n initialUploadFile: initialUploadFile,\r\n isViewMode,\r\n initialValues,\r\n isShowUpdateDate,\r\n onSubmitForm: handleSubmitForm,\r\n onChangeDocCompletely: handleChangeDocCompletely,\r\n checkUseUploadEdit: checkUseUploadEdit,\r\n onDirtyChange: handleDirtyChange,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n }\r\n}\r\nexport default useCloseProjectByAdmin\r\n","import React from 'react'\r\nimport { Grid } from '@material-ui/core'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport ResearchDetail from '../../../../shareUI/ResearchDetail/researchDetail'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { GetProjectResultType } from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport useCloseProjectByAdmin from './useCloseProjectByAdmin'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nexport type CloseProjectByAdminViewType = CloseProjectByAdminType & ReturnType\r\nconst CloseProjectByAdminView = (props: CloseProjectByAdminViewType) => {\r\n const {\r\n formRef,\r\n onRefDialog,\r\n configDialog,\r\n initialValues,\r\n projectData,\r\n initialUploadFile,\r\n // onChangeDocCompletely,\r\n // isCompletely,\r\n isViewMode,\r\n checkUseUploadEdit,\r\n onDirtyChange,\r\n onSubmitForm,\r\n onClickBackToSearch,\r\n // isShowUpdateDate,\r\n } = props\r\n const manageProjectStore = useManageProjectStore()\r\n const { documentTopic } = manageProjectStore\r\n const checkPermissionHook = checkPermission()\r\n const isResearcher = checkPermissionHook.isUserResearcher()\r\n console.log('in')\r\n return (\r\n \r\n {(props) => {\r\n formRef.current = props\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {!isResearcher && (\r\n \r\n \r\n {/* */}\r\n \r\n )}\r\n\r\n {/* {isShowUpdateDate && } */}\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n props.form.change('submitType', 'draft')\r\n props.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n props.form.change('submitType', 'save')\r\n props.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type CloseProjectByAdminType = {\r\n projectData?: GetProjectResultType\r\n onSaveComplete?: (status: number, isDraft: boolean) => void\r\n}\r\nconst CloseProjectByAdmin = (props: CloseProjectByAdminType) => {\r\n const closeProjectByAdminModel = useCloseProjectByAdmin(props)\r\n return \r\n}\r\nexport default CloseProjectByAdmin\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport * as memoMessageType from './resultOfConsiderType'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useAuthenStore from '../../../../../../stores/authen/authenStore'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { DataSourceType } from '../../../../../../control/treeCheckboxNew/treeCheckbox'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { dateForAPI } from '../../../../../../utilities/date'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\n\r\nconst useMemomessageTerminate = (props: memoMessageType.UseMemoMessageType) => {\r\n const { onSaveComplete } = props\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const callWebService = useWebService()\r\n const checkPermissionHook = checkPermission()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const manageProjectStore = useManageProjectStore()\r\n const projectData = manageProjectStore.projectData\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const callLookup = useLookupService()\r\n\r\n const [initialSuggestionNotice, setInitialSuggestionNotice] = React.useState()\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n const [approveStatus, setApproveStatus] = React.useState([])\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getApproveStatus()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getApproveStatus = async () => {\r\n let res\r\n if (projectData?.irb) {\r\n res = await callLookup.callApproveStatusLut(projectData?.irb, constSubmittedType.adverseEvent)\r\n if (res) {\r\n const formatedData = res?.result?.map((itm) => {\r\n return {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? itm.name_th\r\n : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n }) as []\r\n setApproveStatus(formatedData)\r\n }\r\n }\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n const res = await callWebService.getCloseProjectByAdminMemoMessage(submittedID)\r\n const result = res.result\r\n\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n approveStatus:\r\n result && result?.approveStatusInfo\r\n ? {\r\n label:\r\n translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? result?.approveStatusInfo.nameTH\r\n : result?.approveStatusInfo.nameEN,\r\n value: result?.approveStatusInfo.value.toString(),\r\n }\r\n : null,\r\n }\r\n\r\n const initialSugestionNotice = {\r\n contentHtml: result?.memoMessageComment_html,\r\n contentText: result?.memoMessageComment,\r\n }\r\n // const initialMemoMessagePaper = {\r\n // TH: {\r\n // contentHtml: result?.memoMessagePaper_th_html,\r\n // contentText: result?.memoMessagePaper_th,\r\n // },\r\n // EN: {\r\n // contentHtml: result?.memoMessagePaper_en_html,\r\n // contentText: result?.memoMessagePaper_en,\r\n // },\r\n // }\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n setInitialSuggestionNotice(initialSugestionNotice)\r\n // setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.signPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.signPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n const handleChangeStatus = () => {}\r\n return {\r\n formRef,\r\n configDialog,\r\n isViewMode: isViewMode,\r\n initialValues,\r\n initialMemorandumFile,\r\n initialSuggestionNotice,\r\n required,\r\n approveStatus,\r\n onRefDialog,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickOpenFile: handleClickOpenFile,\r\n onChangeStatus: handleChangeStatus,\r\n }\r\n}\r\n\r\nexport default useMemomessageTerminate\r\n","import * as memoMessageType from './resultOfConsiderType'\r\nimport useMemomessageTerminate from './useResultOfConsider'\r\n\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\n// import UploadDocCtrl from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\nimport { approveStatusREC1, approveStatusREC2 } from '../../../../../../constants/approveStatus'\r\n\r\n//View\r\nconst MemoMessageView = (props: memoMessageType.MemomessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n initialValues,\r\n projectData,\r\n configDialog,\r\n onRefDialog,\r\n onClickBackToSearch,\r\n initialMemorandumFile,\r\n initialSuggestionNotice,\r\n } = props\r\n\r\n const translate = useTranslate()\r\n\r\n //มีการลงนามไปแล้ว\r\n const isSignMemoMessage: boolean =\r\n projectData?.stepID === constSubmittedStep.sign &&\r\n projectData?.submittedStatusInfo?.value === constSubmittedStatus.complete\r\n\r\n const isNotShowComment =\r\n initialValues?.approveStatus?.value === approveStatusREC1.acknowledgeAndDonotTakeAnyaAction.toString() ||\r\n initialValues?.approveStatus?.value === approveStatusREC2.acknowledgeAndDonotTakeAnyaAction.toString()\r\n\r\n return (\r\n {}}\r\n initialValues={{ ...initialValues, memorandumFile: initialMemorandumFile }}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n keepDirtyOnReinitialize={true}\r\n >\r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.ETHIC_REVIEW_OUTCOME')} :{' '}\r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? initialValues?.approveStatus?.label\r\n : initialValues?.approveStatus?.label}\r\n \r\n \r\n \r\n\r\n {!isNotShowComment && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {isSignMemoMessage && (\r\n \r\n \r\n \r\n )}\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n {/* */}\r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\n//Controller\r\nconst MemomessageCtrl = (props: memoMessageType.MemomessageCtrlType) => {\r\n const useMemomessageTerminateModel = useMemomessageTerminate(props)\r\n return \r\n}\r\nexport default MemomessageCtrl\r\n","import useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n// import ReportedAnonconformance from '../../../page/requestNewProject/reportedAnonconformance/reportedAnonconformance'\r\n// import ReportedNonconformance from '../../../page/memoMessageTerminateProject/reportedNonconformance/reportedNonconformance'\r\nimport CloseProjectByAdmin from '../../../page/requestNewProject/closeProjectByAdmin/closeProjectByAdmin'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport React from 'react'\r\nimport ResultOfConsider from '../../../page/resultOfConsider/closeProjectByAdmin/resultOfConsider'\r\n\r\ntype ResearcherViewType = ResearcherType //& ReturnType\r\nconst ResearcherView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n switch (tabID) {\r\n // case Constants.menuTab.tab1.id: //หน้าตรวจสอบ\r\n case Constants.menuTab.tab21.id: //หน้ายื่นโครงการ\r\n return (\r\n // \r\n \r\n )\r\n case Constants.menuTab.tab23.id:\r\n return \r\n default:\r\n return <>\r\n }\r\n }\r\n return <> {renderPage()} \r\n}\r\n\r\nexport type ResearcherType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n return \r\n}\r\nexport default Researcher\r\n","import React from 'react'\r\nimport { FormRenderProps } from 'react-final-form'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport _ from 'lodash'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport * as REQServiceType from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useFolderAndTab from '../../../useFolderAndTab'\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport { MemoMessageType } from './memoMessage'\r\nimport * as resultConsiderationTypes from '../../../../shareUI/resultConsideration/resultConsiderationTypes'\r\nimport useAppAlertMessageAction from '../../../../../../stores/appAlertMessage/appAlertMessageAction'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport { UploadFileObjCerType } from '../../generateCertificate/generateCertificateType'\r\nimport { InitialRichTextEditorType } from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport { dateForAPI } from '../../../../../../utilities/date'\r\nimport constConsiderType from '../../../../../../constants/considerType'\r\nimport { approveStatusREC1 } from '../../../../../../constants/approveStatus'\r\nimport { validateModeAccordionError } from '../../../../../../utilities/validate'\r\n\r\nconst useMemomessage = (props: MemoMessageType) => {\r\n const { projectData, onSaveComplete } = props\r\n\r\n const callWebService = useWebService()\r\n\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const appAlertMessageAction = useAppAlertMessageAction()\r\n const manageProjectStore = useManageProjectStore()\r\n\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [required, setRequired] = React.useState(true)\r\n const [approveStatus, setApproveStatus] = React.useState([])\r\n\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(projectData)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n const formRef = React.useRef()\r\n const editRef = React.useRef()\r\n const callLookup = useLookupService()\r\n\r\n const [initialMemorandumFile, setInitialMemorandumFile] = React.useState()\r\n const [initialMemoMessagePaper, setInitialMemoMessagePaper] = React.useState<{\r\n TH: InitialRichTextEditorType\r\n EN: InitialRichTextEditorType\r\n }>()\r\n const [initialCommentCommitee, setInitialCommentCommitee] = React.useState()\r\n\r\n React.useEffect(() => {\r\n if (projectData) {\r\n createInitialData()\r\n }\r\n\r\n if (projectData?.considerInfo && projectData?.considerInfo?.value) {\r\n setRequired(projectData?.considerInfo?.value === constConsiderType.exempt ? false : true)\r\n }\r\n }, [projectData?.projectID ?? null, projectData?.submittedID ?? null, projectData?.considerInfo ?? null])\r\n\r\n React.useEffect(() => {\r\n getApproveStatus()\r\n }, [translate.languageStore.currentLanguage])\r\n\r\n const getApproveStatus = async () => {\r\n let res = await callLookup.callApproveStatusLutSubmitType({ irbID: 1, submitType: 6 })\r\n\r\n const formatedData = res?.result?.map((itm) => {\r\n return {\r\n label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n value: `${itm.id}`,\r\n }\r\n }) as []\r\n setApproveStatus(formatedData)\r\n }\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const createInitialData = async () => {\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n if (submittedID) {\r\n const res = await callWebService.getCloseProjectByAdminMemoMessage(submittedID)\r\n const result = res.result\r\n\r\n const initialData = {\r\n memoMessageDate: result.memoMessageCommentDate ? new Date(result.memoMessageCommentDate) : new Date(),\r\n // approveStatus: result?.approveStatusInfo,\r\n // result && result?.approveStatusInfo\r\n // ? {\r\n // label:\r\n // translate.languageStore.currentLanguage === translate.languageKey.th\r\n // ? result?.approveStatusInfo?.nameTH\r\n // : result?.approveStatusInfo?.nameEN,\r\n // value: result?.approveStatusInfo?.value.toString(),\r\n // }\r\n // : null,\r\n }\r\n\r\n const initialCommentCommittee = {\r\n contentHtml: result?.memoMessageComment_html ?? '',\r\n contentText: result?.memoMessageComment ?? '',\r\n }\r\n const initialMemoMessagePaper = {\r\n TH: {\r\n contentHtml: result?.memoMessagePaper_th_html ?? '',\r\n contentText: result?.memoMessagePaper_th ?? '',\r\n },\r\n EN: {\r\n contentHtml: result?.memoMessagePaper_en_html ?? '',\r\n contentText: result?.memoMessagePaper_en ?? '',\r\n },\r\n }\r\n const initialMemorandumFile = createInitialFileMemorandum(result.memoMessagePaperInfo)\r\n\r\n setInitialCommentCommitee(initialCommentCommittee)\r\n setInitialMemoMessagePaper(initialMemoMessagePaper)\r\n setInitialMemorandumFile(initialMemorandumFile)\r\n setInitialValues(initialData)\r\n }\r\n }\r\n\r\n const createInitialFileMemorandum = (memorandumInfo: any) => {\r\n const uploadFileMemoranduminit: Array = memorandumTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n },\r\n }\r\n })\r\n uploadFileMemoranduminit.forEach((itm: UploadFileObjCerType) => {\r\n if (itm.uploadFileObj.documentTopicID === 0) {\r\n if (memorandumInfo?.name_th) {\r\n let fileListTH = {\r\n documentTopicID: 0,\r\n fileToken: memorandumInfo?.name_th,\r\n filename: memorandumInfo?.name_th,\r\n fileID: memorandumInfo?.name_th,\r\n path: memorandumInfo?.unSignPathInfo?.path_th,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListTH)\r\n }\r\n } else if (itm.uploadFileObj.documentTopicID === 1) {\r\n if (memorandumInfo?.name_en) {\r\n let fileListEN = {\r\n documentTopicID: 1,\r\n fileToken: memorandumInfo?.name_en,\r\n filename: memorandumInfo?.name_en,\r\n fileID: memorandumInfo?.name_en,\r\n path: memorandumInfo?.unSignPathInfo?.path_en,\r\n }\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push(fileListEN)\r\n }\r\n }\r\n\r\n itm.uploadFileObj.subTopicPageList = []\r\n })\r\n return uploadFileMemoranduminit\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const value = formRef.current?.values\r\n const submittedID = manageProjectStore?.projectData?.submittedID ?? null\r\n\r\n let param: REQServiceType.ProjectNonconformanceMemoMessageType = {\r\n submittedID: submittedID,\r\n comment: value?.commentCommittee?.contentText,\r\n comment_html: value?.commentCommittee?.contentHtml,\r\n memoMessagePaper_th: value?.memoMessagePaper_TH?.contentText,\r\n memoMessagePaper_en: value?.memoMessagePaper_EN?.contentText,\r\n memoMessagePaper_th_html: value?.memoMessagePaper_TH?.contentHtml,\r\n memoMessagePaper_en_html: value?.memoMessagePaper_EN?.contentHtml,\r\n memoMessageDate: value?.memoMessageDate ? dateForAPI(value?.memoMessageDate) ?? null : null,\r\n approveStatusID: approveStatusREC1.approve, //value?.approveStatus?.value,\r\n isDraft: isDraft,\r\n }\r\n\r\n return param\r\n }\r\n const processSaveData = async (\r\n param: REQServiceType.CloseProjectByAdminMemoMessageType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n dialogRef.current?.closeDialog()\r\n try {\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.closeProjectByAdminMemoMessage(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useDefineProject.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const handleDirtyChange = (props: any) => {\r\n let isDirty: boolean = false\r\n let newFormValue = _.omit(props.values, ['submitType', 'memorandumFile'])\r\n let initValue = _.omit(\r\n {\r\n ...initialValues,\r\n commentCommittee: initialCommentCommitee,\r\n memoMessagePaper_EN: initialMemoMessagePaper?.EN,\r\n memoMessagePaper_TH: initialMemoMessagePaper?.TH,\r\n },\r\n ['submitType'],\r\n )\r\n\r\n const isEqual = _.isEqual(initValue, newFormValue)\r\n\r\n if (!isViewMode) {\r\n if (isEqual) {\r\n isDirty = false\r\n } else {\r\n isDirty = true\r\n }\r\n }\r\n\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft = true\r\n const param: REQServiceType.ProjectNonconformanceMemoMessageType = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n const handleSubmitForm = (value: any) => {\r\n const isDraft: boolean = value?.submitType !== 'save'\r\n const param: REQServiceType.ProjectNonconformanceMemoMessageType = getSaveServiceParameter(isDraft)\r\n\r\n if (isDraft) {\r\n //ถ้า save draft ไม่ต้องมี alert confirm\r\n processSaveData(param)\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(param)\r\n },\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const handleChangStatus = () => {}\r\n const handleClickOpenFile = async (url: string) => {\r\n let xmlHttp = new XMLHttpRequest()\r\n xmlHttp.open('GET', url, true) // false for synchronous request\r\n xmlHttp.onreadystatechange = function () {\r\n // In local files, status is 0 upon success in Mozilla Firefox\r\n if (xmlHttp.readyState === XMLHttpRequest.DONE) {\r\n var status = xmlHttp.status\r\n if (status === 0 || (status >= 200 && status < 400)) {\r\n // The request has been completed successfully\r\n window.open(url)\r\n } else {\r\n // Oh no! There has been an error with the request!\r\n appAlertMessageAction.openAlertMessage({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n message: translate.get('MESSAGE.M011'),\r\n })\r\n }\r\n }\r\n }\r\n xmlHttp.send()\r\n }\r\n\r\n const updateMemoMessage = async (param: REQServiceType.UpdateMemoMessageType) => {\r\n loadingHook.loadingOpen()\r\n const res = await callWebService.updateMemoMessagePaper(param)\r\n\r\n if (res.result.status === 200) {\r\n dialogRef.current?.openDialog()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n setConfigDialog({})\r\n },\r\n })\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleSubmitUpdateMemo = (fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formRef.current)\r\n return new Promise(async (resolve, reject) => {\r\n if (isError) {\r\n formRef.current?.form.submit()\r\n reject('')\r\n } else {\r\n resolve('')\r\n const param: REQServiceType.UpdateMemoMessageType = {\r\n submittedID: Number(projectData?.submittedID),\r\n memoMessagePaperTH: formRef.current?.values.memoMessagePaper_TH.contentText,\r\n memoMessagePaperEN: formRef.current?.values.memoMessagePaper_EN.contentText,\r\n memoMessagePaperTHHTML: formRef.current?.values.memoMessagePaper_TH.contentHtml,\r\n memoMessagePaperENHTML: formRef.current?.values.memoMessagePaper_EN.contentHtml,\r\n }\r\n\r\n updateMemoMessage(param)\r\n }\r\n })\r\n }\r\n\r\n const handleCancle = () => {\r\n const valueMessageTH: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_TH`].contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_TH`].contentText,\r\n }\r\n const valueMessageEN: InitialRichTextEditorType = {\r\n contentHtml: editRef.current[`memoMessagePaper_EN`].contentHtml,\r\n contentText: editRef.current[`memoMessagePaper_EN`].contentText,\r\n }\r\n setInitialMemoMessagePaper((prev) => ({\r\n TH: {\r\n ...prev?.TH,\r\n ...valueMessageTH,\r\n },\r\n EN: {\r\n ...prev?.EN,\r\n ...valueMessageEN,\r\n },\r\n }))\r\n }\r\n\r\n const onClickEdit = () => {\r\n editRef.current = formRef.current?.form.getState().values\r\n }\r\n return {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n approveStatus,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialCommentCommitee,\r\n initialMemoMessagePaper,\r\n onRefDialog,\r\n onDirtyChange: handleDirtyChange,\r\n onSubmitForm: handleSubmitForm,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n onClickOpenFile: handleClickOpenFile,\r\n onChangStatus: handleChangStatus,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n }\r\n}\r\nexport default useMemomessage\r\n","import { GetProjectResultType } from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport useMemomessage from './useMemomessage'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport PageAction from '../../pageAction'\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RichTextEditor from '../../../../../../control/richTextEditor/richTextEditor'\r\nimport MyDatePicker from '../../../../../../control/datepicker/datepicker'\r\nimport UploadDocCtrl from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport { memorandumTopic } from '../../../../../../constants/constants'\r\nimport DisplayUpdater from '../../../../shareUI/displayUpdater/displayUpdater'\r\nimport ModeAccordion from '../../../../shareUI/modeAccordion/ModeAccordion'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport { richEditorRequired } from '../../../../../../utilities/validate'\r\n\r\nexport type MemoMessageViewType = ReturnType & MemoMessageType\r\nconst MemoMessageView = (props: MemoMessageViewType) => {\r\n const {\r\n formRef,\r\n isViewMode,\r\n configDialog,\r\n initialValues,\r\n isShowUpdateDate,\r\n initialMemorandumFile,\r\n initialCommentCommitee,\r\n initialMemoMessagePaper,\r\n onRefDialog,\r\n onSubmitForm,\r\n onDirtyChange,\r\n onClickOpenFile,\r\n onClickBackToSearch,\r\n handleSubmitUpdateMemo,\r\n handleCancle,\r\n onClickEdit,\r\n } = props\r\n const translate = useTranslate()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const latestFolderIdx = 0\r\n const currentSelectFolder =\r\n appFolderAndTabStore.folderList[latestFolderIdx].submittedID === appFolderAndTabStore.folderSelected.submittedID\r\n const isEdit = isViewMode && currentSelectFolder\r\n\r\n const renderViewComponent = (language: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderEditComponent = (language: string) => {\r\n return (\r\n \r\n \r\n

\\n'\r\n ? [richEditorRequired(translate.get('MESSAGE.M015'))]\r\n : []\r\n }\r\n />\r\n
\r\n
\r\n )\r\n }\r\n return (\r\n \r\n {(formProps) => {\r\n formRef.current = formProps\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n renderViewComponent('TH')}\r\n renderEditComponent={() => renderEditComponent('TH')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_TH']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_TH'])}\r\n onCancel={handleCancle}\r\n onClickEdit={onClickEdit}\r\n />\r\n \r\n\r\n \r\n renderViewComponent('EN')}\r\n renderEditComponent={() => renderEditComponent('EN')}\r\n isViewMode={isEdit}\r\n fieldNames={['memoMessagePaper_EN']}\r\n onConfirm={() => handleSubmitUpdateMemo(['memoMessagePaper_EN'])}\r\n onCancel={handleCancle}\r\n onClickEdit={onClickEdit}\r\n />\r\n \r\n\r\n \r\n \r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n formProps.form.change('submitType', 'draft')\r\n formProps.handleSubmit()\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('submitType', 'save')\r\n formProps.handleSubmit()\r\n }}\r\n onClickClose={onClickBackToSearch}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\nexport type MemoMessageType = {\r\n projectData?: GetProjectResultType | null | undefined\r\n onSaveComplete?: ((status: number, isDraft: boolean) => void) | undefined\r\n}\r\nconst Memomessage = (props: MemoMessageType) => {\r\n const memomessageModel = useMemomessage(props)\r\n return \r\n}\r\nexport default Memomessage\r\n","import useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport { OfficerType } from './officerType'\r\nimport * as Constants from '../../../../../../constants/constants'\r\nimport useAppFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport CloseProjectByAdmin from '../../../page/requestNewProject/closeProjectByAdmin/closeProjectByAdmin'\r\nimport SignREC1 from '../../../page/sign/signMemoMessage/signREC1'\r\nimport SignREC2 from '../../../page/sign/signMemoMessage/signREC2'\r\nimport SignRepresentREC1 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC1'\r\nimport SignRepresentREC2 from '../../../page/signRepresent/signRepresentMemoMessage/signRepresentREC2'\r\nimport Memomessage from '../../../page/memoMessage/closeProjectByAdmin/memoMessage'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport submittedStep from '../../../../../../constants/submittedStep'\r\n\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = appFolderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n let isNotDisableTestResult = false\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1Chairman.id:\r\n // tab1Chairman
ตรวจสอบเอกสาร REC1
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult = manageProjectStore?.projectData?.stepID === submittedStep.synthesis\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab1Committee.id:\r\n if (checkPermission.isUserCommittee()) {\r\n isNotDisableTestResult = manageProjectStore?.projectData?.stepID === submittedStep.synthesis\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab21.id:\r\n return (\r\n //
ยื่นเอกสารโครงการ ปิดโครงการ
\r\n \r\n )\r\n\r\n case Constants.menuTab.tab11.id:\r\n return (\r\n //
ออกใบบันทึกข้อความ ปิดโครงการ
\r\n\r\n \r\n )\r\n\r\n case Constants.menuTab.tab9.id:\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n return \r\n default:\r\n return <>\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case Constants.menuTab.tab1Chairman.id:\r\n // tab1\r\n // return
ตรวจสอบเอกสาร REC2
\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult = manageProjectStore?.projectData?.stepID === submittedStep.synthesis\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab1Committee.id:\r\n if (checkPermission.isUserCommittee()) {\r\n isNotDisableTestResult = manageProjectStore?.projectData?.stepID === submittedStep.synthesis\r\n }\r\n return (\r\n \r\n )\r\n\r\n case Constants.menuTab.tab21.id:\r\n return (\r\n //
ยื่นเอกสารโครงการ ปิดโครงการ
\r\n \r\n )\r\n\r\n case Constants.menuTab.tab11.id:\r\n return (\r\n //
ออกใบบันทึกข้อความ ปิดโครงการ
\r\n\r\n \r\n )\r\n\r\n case Constants.menuTab.tab9.id:\r\n return \r\n\r\n case Constants.menuTab.tab10.id:\r\n return \r\n default:\r\n return
\r\n }\r\n\r\n default:\r\n return
\r\n }\r\n }\r\n return <> {renderPage()} \r\n}\r\nconst Officer: React.FC = (props) => {\r\n return \r\n}\r\nexport default Officer\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport useCloseProjectByAdmin from './useCloseProjectByAdmin'\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport constProjectStatus from '../../../../../constants/projectStatus'\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\n\r\ntype CloseProjectByAdminViewType = ReturnType &\r\n Omit\r\nconst CloseProjectByAdminView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n onClickCloseProject,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const isAdmin = checkPermission.isUserAdmin()\r\n const isStatusComplete = projectData && projectData?.projectStatusInfo?.value === constProjectStatus.completed\r\n const isShowCloseProjectButton = isStatusComplete && isAdmin\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n\r\n {/* \r\n {isViewMode && isShowCloseProjectButton && (\r\n \r\n {translate.get('BUTTON.CLOSE_PROJECT')}\r\n \r\n )}\r\n */}\r\n {/* เช็คตอน create กับ หลัง ใหม่ดีๆ */}\r\n {isViewMode && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport type CloseProjectByAdminType = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst CloseProjectByAdmin: React.FC = (props) => {\r\n const closeProjectByAdminModel = useCloseProjectByAdmin(props)\r\n return \r\n}\r\nexport default CloseProjectByAdmin\r\n","import React from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nimport { customFolder } from '../../../../../../constants/constants'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\n\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\n\r\nimport * as projectWithdrawType from './projectWithdrawType'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport * as REQServiceTypes from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as RESServiceTypes from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport { responseWebServiceTypes } from '../../../../../../services/web/types'\r\n\r\nconst useProjectWithdraw = () => {\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n const [projectPageData, setProjectPageData] = React.useState()\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n\r\n const parameterForSaveRef = React.useRef()\r\n const dialogRef = React.useRef>()\r\n\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectAction = useManageProjectAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const { folderSelected } = folderAndTabStore\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(manageProjectStore.projectData)\r\n\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData) {\r\n loadProjectPageData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n const getDocumentTopicLut = async (irb: number, submitTypeID: number) => {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitTypeID)\r\n if (res.status === 1) {\r\n return res.result\r\n } else {\r\n return []\r\n }\r\n }\r\n\r\n const checkRequirePDF = (documentInfo: Array) => {\r\n let isRequirePDF = false\r\n\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if ((documentInfo[i]?.fileTokenInfo[j] as any)?.fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n\r\n const loadProjectPageData = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n initialProcessUpdate()\r\n } else {\r\n initialProcessCreate()\r\n }\r\n }\r\n\r\n const initialProcessCreate = () => {\r\n createInitialData()\r\n initialUpload()\r\n }\r\n\r\n const initialProcessUpdate = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n const res = await callWebService.getProjectWithdraw(manageProjectStore.projectData.submittedID)\r\n\r\n if (res.status === 1) {\r\n setProjectPageData(res.result)\r\n\r\n createInitialData(res.result)\r\n initialUpload(res.result.documentInfo)\r\n } else {\r\n setProjectPageData(undefined)\r\n }\r\n }\r\n }\r\n\r\n const createInitialData = (initVal?: responseWebServiceTypes.GetProjectWithdrawResponse) => {\r\n const initialData: Record = {\r\n withdrawCause: null,\r\n }\r\n if (initVal) {\r\n initialData.withdrawCause = initVal.reason\r\n initialData.remarkFromAdmin = manageProjectStore.projectData?.verifyDocumentRemark || null\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const initialUpload = async (\r\n initDocumentInfo?: responseWebServiceTypes.GetProjectWithdrawResponse['documentInfo'],\r\n ) => {\r\n if (manageProjectStore.projectData?.irb) {\r\n const lstDocumentTopic = await getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n constSubmittedType.withdrawalProject,\r\n )\r\n manageProjectAction.setDocumentTopic(lstDocumentTopic)\r\n\r\n let uploadFileInit = lstDocumentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n if (folderSelected.id !== customFolder.withdrawProject.id) {\r\n uploadFileInit?.forEach((itm: projectWithdrawType.UploadFileObjType) => {\r\n initDocumentInfo?.forEach((docInfo) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n if (docInfo.fileInfo?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push({\r\n ...docInfo.fileInfo[0],\r\n fileID: docInfo.fileInfo[0].fileID,\r\n documentTopicID: docInfo.fileInfo[0].topicID as number,\r\n fileToken: docInfo.fileInfo[0].fileToken, //fileToken\r\n filename: docInfo.fileInfo[0].filename,\r\n path: docInfo.fileInfo[0].path,\r\n replaceFileID: docInfo.fileInfo[0].replaceFileID,\r\n })\r\n }\r\n\r\n if (docInfo?.subtopic?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic[0]\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n }\r\n\r\n const getDocumentInfoForSave = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n fileDataList.forEach((uploadObj: projectWithdrawType.UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n const loadLatestFolder = async () => {\r\n try {\r\n loadingHook.loadingOpen()\r\n const currentProjectID = manageProjectStore.projectData?.projectID\r\n manageProjectAction.setProjectData()\r\n if (currentProjectID) {\r\n const resProjectFolder = await callWebService.getProjectFolder(currentProjectID)\r\n\r\n const projectFolder = resProjectFolder.result?.folders?.map((itm: any, index: number) => {\r\n return {\r\n ...itm,\r\n id: itm.submittedID,\r\n isLastProcess: index === 0 ? true : false,\r\n }\r\n })\r\n\r\n if (projectFolder?.length !== 0) {\r\n loadingHook.loadingClose()\r\n appFolderAndTabAction.setState({\r\n folderList: projectFolder,\r\n folderSelected: projectFolder[0],\r\n })\r\n }\r\n if (projectFolder?.length !== 0) {\r\n loadingHook.loadingClose()\r\n const selectedFolder = projectFolder[0]\r\n const resProject = await callWebService.getProjectByID(currentProjectID, selectedFolder.submittedID)\r\n if (resProject.result) {\r\n manageProjectAction.setProjectData(resProject.result)\r\n }\r\n }\r\n }\r\n } catch (ex) {\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n const onConfirmSave = async () => {\r\n if (parameterForSaveRef.current) {\r\n loadingHook.loadingOpen()\r\n let res = null\r\n if (manageProjectStore.projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument) {\r\n res = await callWebService.saveProjectWithdrawResubmit(parameterForSaveRef.current)\r\n } else {\r\n res = await callWebService.saveProjectWithdraw(parameterForSaveRef.current)\r\n }\r\n\r\n if (res.status === 1) {\r\n loadingHook.loadingClose()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: loadLatestFolder,\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n loadingHook.loadingClose()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n }\r\n const validateRequiredUploadFile = (uploadFile: Array<{ uploadFileObj: any }>, skipValidate: boolean = false) => {\r\n let isValid = true\r\n if (!skipValidate) {\r\n uploadFile?.every(({ uploadFileObj: file }) => {\r\n if (file?.isRequired && file?.fileList?.length === 0) {\r\n //เป็นหัวข้อที่มีการ required แต่ว่าไม่ upload เอกสาร\r\n isValid = false\r\n return false //break\r\n }\r\n return true //continue\r\n })\r\n\r\n if (!isValid) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get2Element('ALERT.CONTENT.PLEASE_UPLOAD_REQUIRED_TOPIC', [\r\n '',\r\n ]) as any,\r\n type: 'alert-message',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n return isValid\r\n }\r\n const onSubmit = (values: any) => {\r\n const loginType = localStorage.getItem('loginType')\r\n const isSubmitByAdmin = loginType === '2' ? true : false\r\n const projectID = manageProjectStore.projectData?.projectID ?? null\r\n let submittedID: number | null = folderSelected.submittedID\r\n if (folderSelected.submittedID === customFolder.withdrawProject.submittedID) {\r\n submittedID = null\r\n }\r\n parameterForSaveRef.current = {\r\n projectID: projectID,\r\n submittedID: submittedID,\r\n reason: values.withdrawCause,\r\n isWithdrawProject: true,\r\n documentInfo: getDocumentInfoForSave(values),\r\n isSubmitByAdmin: isSubmitByAdmin,\r\n }\r\n\r\n const skipCheckRequiredUploadFile = isSubmitByAdmin\r\n if (validateRequiredUploadFile(values.uploadFile, skipCheckRequiredUploadFile)) {\r\n const countUploadFile = parameterForSaveRef.current?.documentInfo?.length ?? 0\r\n const isRequirePDF = checkRequirePDF(parameterForSaveRef.current.documentInfo)\r\n const isEmptyPage = checkSubtopic(parameterForSaveRef.current?.documentInfo)\r\n if (countUploadFile > 0 && isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else if (isEmptyPage) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.PLEASE_COMPLETE_PAGE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: onConfirmSave,\r\n })\r\n }\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const checkSubtopic = (documentInfo: Array) => {\r\n let isEmptyPage = false\r\n\r\n //หาว่าหัวข้ออัปโหลดเอกสารมีให้อัปโหลดหัวข้อย่อยมั้ย\r\n const docTopic = manageProjectStore.documentTopic?.filter((item) => item.subtopic.length > 0)\r\n\r\n //ถ้ามีให้เข้าไปเช็คตามเงื่อนไข if\r\n if (docTopic?.length) {\r\n // วน loop หัวข้อที่มีให้อัปโหลดเอกสารหัวข้อย่อย\r\n docTopic.forEach((mainTopic) => {\r\n // วน loop หัวข้อที่มีการอัปโหลดเอกสารเข้ามา\r\n documentInfo.forEach((itm) => {\r\n // เช็คว่าเอกสารที่มีการอัปโหลดเข้ามาใช่เอกสารที่มีหัวข้อย่อยให้อัปโหลดหรือป่าว\r\n if (mainTopic.id === itm.documentTopicID) {\r\n // เช็คว่าหัวข้อย่อยที่อัพโหลดเข้ามาครบมั้ย\r\n if (itm.subtopic?.length != mainTopic.subtopic.length) {\r\n isEmptyPage = true\r\n } else {\r\n // เช็คว่าที่อัปมาครบมีช่องไหนกรอกเป็น ช่องว่างมั้ย\r\n const chkEmpty = itm.subtopic.find(\r\n (e) => e.page == null || e.page == '' || e.page == undefined,\r\n )\r\n if (chkEmpty) {\r\n isEmptyPage = true\r\n }\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n return isEmptyPage\r\n }\r\n const onClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const onDirtyChange = (formState: Record) => {\r\n // appFolderAndTabAction.setTabDirty(formState.dirty)\r\n }\r\n const conditionHideUploadSection = () => {\r\n let isHide = false\r\n const isUserResearcher = checkPermissionHook.isUserResearcher()\r\n\r\n if (isUserResearcher) {\r\n isHide = manageProjectStore.projectData?.isSubmitByAdmin ?? false\r\n }\r\n return isHide\r\n }\r\n return {\r\n initialVal: {\r\n ...initialValues,\r\n uploadFile: initialUploadFile,\r\n },\r\n initialUploadFile,\r\n uploadDocumentTopic: manageProjectStore.documentTopic,\r\n isViewMode: isViewMode,\r\n isHideUploadSection: conditionHideUploadSection(),\r\n configDialog,\r\n onClickCancel,\r\n onSubmit,\r\n onRefDialog,\r\n onDirtyChange,\r\n }\r\n}\r\nexport default useProjectWithdraw\r\n","import React from 'react'\r\n\r\n//Final Form\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n//Material-UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\n\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport TextField from '../../../../../../control/textfield/textfield'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport PageAction from '../../pageAction'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\nimport RemarkFromAdmin from '../../../../shareUI/remarkFromAdmin/remarkFromAdmin'\r\n\r\nimport useSnackbarAction from '../../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useProjectWithdraw from './useProjectWithdraw'\r\n\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\n\r\ntype ProjectWithdrawViewProps = ReturnType & ProjectWithdrawProps\r\nconst ProjectWithdrawView: React.FC = (props) => {\r\n const {\r\n initialVal,\r\n initialUploadFile,\r\n uploadDocumentTopic,\r\n isViewMode,\r\n isHideUploadSection,\r\n configDialog,\r\n onClickCancel,\r\n onSubmit,\r\n onRefDialog,\r\n onDirtyChange,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n const { projectData } = useManageProjectStore()\r\n const isNotCompleteDocument = projectData?.submittedStatusInfo?.value === constSubmittedStatus.incorrectDocument\r\n return (\r\n \r\n {({ handleSubmit, form, dirty, invalid, errors, values }) => {\r\n return (\r\n \r\n {isNotCompleteDocument && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {!isHideUploadSection && (\r\n \r\n \r\n \r\n )}\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n />\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\ntype ProjectWithdrawProps = {}\r\nconst ProjectWithdraw: React.FC = (props) => {\r\n const projectWithdrawModel = useProjectWithdraw()\r\n return \r\n}\r\n\r\nexport default ProjectWithdraw\r\n","const useResearcher = () => {\r\n return {}\r\n}\r\n\r\nexport default useResearcher\r\n","import React from 'react'\r\n\r\nimport { menuTab } from '../../../../../../constants/constants'\r\n\r\n//View\r\nimport ProjectWithdrawPage from '../../../page/requestNewProject/projectWithdraw/projectWithdraw'\r\n\r\n//Model\r\nimport useResearcher from './useResearcher'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\ntype ResearcherViewProps = ReturnType & {}\r\nconst ResearcherView: React.FC = (props) => {\r\n const {} = props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return \r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\ntype ResearcherProps = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcherModel = useResearcher()\r\n return \r\n}\r\n\r\nexport default Researcher\r\n","const useResearcher = () => {\r\n return {}\r\n}\r\n\r\nexport default useResearcher\r\n","import React from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nimport { customFolder } from '../../../../../constants/constants'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\n\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\n\r\nimport * as verifyDocumentProjectWithdrawType from './verifyDocumentProjectWithdrawType'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport * as REQServiceTypes from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as RESServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport { responseWebServiceTypes } from '../../../../../services/web/types'\r\nimport * as DateUtils from '../../../../../utilities/date'\r\n\r\nimport { VerifyDocProjectWithdrawProps } from './verifyDocumentProjectWithdrawREC1'\r\nimport { validateModeAccordionError } from '../../../../../utilities/validate'\r\n\r\nconst useVerifyDocProjectWithdraw = (props: VerifyDocProjectWithdrawProps) => {\r\n const { onSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n const [projectPageData, setProjectPageData] = React.useState()\r\n const [isCompletely, setIsCompletely] = React.useState(true)\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n\r\n const formRef = React.useRef()\r\n const dialogRef = React.useRef>()\r\n\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectAction = useManageProjectAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const { folderSelected } = folderAndTabStore\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(manageProjectStore.projectData)\r\n const isShowUpdateDate = checkPermissionHook.chkShowUpdateDate(manageProjectStore.projectData)\r\n const formHistoryRef = React.useRef>({})\r\n\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData) {\r\n console.log('####Page: Project Withdraw####')\r\n loadProjectPageData()\r\n setIsCompletely(manageProjectStore.projectData?.verifyDocument ?? true)\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n const getDocumentTopicLut = async (irb: number, submitTypeID: number) => {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitTypeID)\r\n if (res.status === 1) {\r\n return res.result\r\n } else {\r\n return []\r\n }\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const values = formRef.current?.values\r\n\r\n let reviewerUserID = null\r\n if (values?.reviewer?.value) {\r\n reviewerUserID = parseInt(values.reviewer.value)\r\n }\r\n const isCompletelyDoc = values?.isCompletelyDoc === '1'\r\n const param: REQServiceTypes.SaveVerifyProjectWithdrawType = {\r\n projectID: manageProjectStore.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore.projectData?.submittedID ?? null,\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: DateUtils.dateForAPI(values?.resubmitDocDate) ?? null,\r\n verifyDocRemark: values?.remark ?? null,\r\n isDraft: isDraft,\r\n reviewerUserID: reviewerUserID,\r\n }\r\n return param\r\n }\r\n\r\n const loadProjectPageData = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n initialProcessUpdate()\r\n } else {\r\n initialProcessCreate()\r\n }\r\n }\r\n\r\n const initialProcessCreate = () => {\r\n createInitialData()\r\n initialUpload()\r\n }\r\n\r\n const initialProcessUpdate = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n const res = await callWebService.getProjectWithdraw(manageProjectStore.projectData.submittedID)\r\n if (res.status === 1) {\r\n setProjectPageData(res.result)\r\n\r\n createInitialData(res.result)\r\n initialUpload(res.result.documentInfo)\r\n } else {\r\n setProjectPageData(undefined)\r\n }\r\n }\r\n }\r\n\r\n const createInitialData = (initVal?: responseWebServiceTypes.GetProjectWithdrawResponse) => {\r\n const initialData: Record = {\r\n withdrawCause: null,\r\n isCompletelyDoc: '1',\r\n isCompletely: true,\r\n resubmitDocDate: null,\r\n remark: null,\r\n }\r\n\r\n if (initVal) {\r\n initialData.withdrawCause = initVal.reason\r\n initialData.isCompletelyDoc =\r\n initVal.isVerifyDocumentCompleted !== null ? (initVal.isVerifyDocumentCompleted ? '1' : '2') : '1'\r\n\r\n initialData.isCompletely = initVal.isVerifyDocumentCompleted\r\n initialData.remark = initVal.verifyDocRemark\r\n initialData.resubmitDocDate = initVal.resubmittedDate ? new Date(initVal.resubmittedDate) : null\r\n //@ts-ignore\r\n initialData.reviewer = initVal?.reviewerID\r\n ? { label: `${initVal?.reviewerName_th}`, value: `${initVal?.reviewerID}` }\r\n : {}\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const initialUpload = async (\r\n initDocumentInfo?: responseWebServiceTypes.GetProjectWithdrawResponse['documentInfo'],\r\n ) => {\r\n if (manageProjectStore.projectData?.irb) {\r\n const lstDocumentTopic = await getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n constSubmittedType.withdrawalProject,\r\n )\r\n manageProjectAction.setDocumentTopic(lstDocumentTopic)\r\n\r\n let uploadFileInit = lstDocumentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n if (folderSelected.id !== customFolder.withdrawProject.id) {\r\n uploadFileInit?.forEach((itm: verifyDocumentProjectWithdrawType.UploadFileObjType) => {\r\n initDocumentInfo?.forEach((docInfo) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n if (docInfo.fileInfo?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push({\r\n ...docInfo.fileInfo[0],\r\n fileID: docInfo.fileInfo[0].fileToken,\r\n documentTopicID: docInfo.fileInfo[0].topicID as number,\r\n fileToken: docInfo.fileInfo[0].fileToken, //fileToken\r\n filename: docInfo.fileInfo[0].filename,\r\n path: docInfo.fileInfo[0].path,\r\n })\r\n }\r\n\r\n if (docInfo?.subtopic?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic[0]\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceTypes.SaveVerifyProjectWithdrawType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n try {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.saveVerifyProjectWithdraw(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useVerifyDocumentProjectWithdraw.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const onSubmit = (values: any) => {\r\n if (manageProjectStore.projectData?.projectID && manageProjectStore.projectData?.submittedID) {\r\n const isDraft: boolean = values.saveType === 'DRAFT'\r\n const saveParam = getSaveServiceParameter(isDraft)\r\n\r\n if (isDraft) {\r\n processSaveData(saveParam)\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(saveParam)\r\n },\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n }\r\n\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft: boolean = true\r\n const param = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n const onClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const onDirtyChange = (formState: Record) => {\r\n let isDirty: boolean = false\r\n if (!isViewMode) {\r\n isDirty = formState.dirty\r\n }\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const onRefForm = (formProps: any) => {\r\n formRef.current = formProps\r\n }\r\n\r\n const handleChangeDocCompletely = (val: string) => {\r\n const isCompletely = val === '1' ? true : false\r\n setIsCompletely(isCompletely)\r\n }\r\n\r\n const confirmEditDocResult = (formProps: any, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n let isCompletelyDoc = formProps.values.isCompletelyDoc === '1'\r\n let sendEditData = null\r\n if (!isCompletelyDoc && formProps.values.resubmitDocDate) {\r\n sendEditData = DateUtils.dateForAPI(formProps.values.resubmitDocDate) ?? null\r\n }\r\n const param = {\r\n ...getEditDocParams(formHistoryRef.current['docResult']),\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : formProps.values?.remark ? formProps.values.remark : null,\r\n }\r\n processSaveData(param)\r\n .then(() => {\r\n handleEditDocResult(formProps)\r\n handleEditDocReviewer(formProps)\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const confirmEditDocReviewer = (formProps: any, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n let reviewerUserID = null\r\n if (formProps?.values?.reviewer?.value) {\r\n reviewerUserID = parseInt(formProps.values.reviewer.value)\r\n }\r\n const param = {\r\n ...getEditDocParams(formHistoryRef.current['docResult']),\r\n reviewerUserID: reviewerUserID,\r\n }\r\n processSaveData(param)\r\n .then(() => {\r\n handleEditDocResult(formProps)\r\n handleEditDocReviewer(formProps)\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const handleEditDocResult = (formProps: any) => {\r\n formHistoryRef.current['docResult'] = formProps.values\r\n }\r\n\r\n const handleEditDocReviewer = (formProps: any) => {\r\n formHistoryRef.current['docReviewer'] = formProps.values\r\n }\r\n\r\n const getEditDocParams = (formValues: any) => {\r\n let reviewerUserID = null\r\n if (formValues?.reviewer?.value) {\r\n reviewerUserID = parseInt(formValues.reviewer.value)\r\n }\r\n const isCompletelyDoc = formValues?.isCompletelyDoc === '1'\r\n const param: REQServiceTypes.SaveVerifyProjectWithdrawType = {\r\n projectID: manageProjectStore.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore.projectData?.submittedID ?? null,\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: DateUtils.dateForAPI(formValues?.resubmitDocDate) ?? null,\r\n verifyDocRemark: formValues?.remark ?? null,\r\n isDraft: false,\r\n reviewerUserID: reviewerUserID,\r\n }\r\n return param\r\n }\r\n\r\n return {\r\n initialVal: {\r\n ...initialValues,\r\n uploadFile: initialUploadFile,\r\n },\r\n initialUploadFile,\r\n uploadDocumentTopic: manageProjectStore.documentTopic,\r\n isViewMode: isViewMode,\r\n configDialog,\r\n isShowUpdateDate,\r\n projectData: manageProjectStore.projectData,\r\n isCompletely,\r\n onRefForm,\r\n onClickCancel,\r\n onSubmit,\r\n onRefDialog,\r\n onDirtyChange,\r\n onChangeDocCompletely: handleChangeDocCompletely,\r\n confirmEditDocResult,\r\n confirmEditDocReviewer,\r\n handleEditDocResult,\r\n handleEditDocReviewer,\r\n }\r\n}\r\nexport default useVerifyDocProjectWithdraw\r\n","import React from 'react'\r\n\r\n//Final Form\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n//Material-UI\r\nimport Grid from '@material-ui/core/Grid'\r\n\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport TextField from '../../../../../control/textfield/textfield'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport PageAction from '../pageAction'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\n\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\n\r\nimport DocumentTestResult from '../../../shareUI/documentTestResult/documentTestResult'\r\nimport useVerifyDocumentProjectWithdraw from './useVerifyDocumentProjectWithdraw'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\n\r\ntype VerifyDocProjectWithdrawViewProps = ReturnType &\r\n VerifyDocProjectWithdrawProps\r\nconst VerifyDocProjectWithdrawView: React.FC = (props) => {\r\n const {\r\n initialVal,\r\n initialUploadFile,\r\n uploadDocumentTopic,\r\n isViewMode,\r\n configDialog,\r\n isShowUpdateDate,\r\n isNotDisableTestResult = false,\r\n onRefForm,\r\n onClickCancel,\r\n onSubmit,\r\n onRefDialog,\r\n onDirtyChange,\r\n onChangeDocCompletely,\r\n projectData,\r\n confirmEditDocResult,\r\n handleEditDocResult,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n const checkPermission = useCheckPermission()\r\n const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n const isDisabledTestResult = isNotDisableTestResult || canOfficerEdit ? false : true\r\n const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n\r\n return (\r\n \r\n {(formProps) => {\r\n onRefForm?.(formProps)\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n await confirmEditDocResult(formProps, [\r\n 'isCompletelyDoc',\r\n 'resubmitDocDate',\r\n 'remark',\r\n ])\r\n }}\r\n onClickModeEdit={() => handleEditDocResult(formProps)}\r\n />\r\n \r\n\r\n {isShowUpdateDate && }\r\n\r\n {(isNotDisableTestResult || !isViewMode) && (\r\n \r\n {\r\n onClickCancel(formProps.dirty)\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('saveType', 'SAVE')\r\n formProps.handleSubmit()\r\n formProps.invalid &&\r\n formProps.errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={\r\n canOfficerSaveDraft\r\n ? () => {\r\n formProps.form.change('saveType', 'DRAFT')\r\n formProps.handleSubmit()\r\n }\r\n : undefined\r\n }\r\n isViewMode={isViewMode}\r\n />\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport type VerifyDocProjectWithdrawProps = {\r\n onSaveComplete?: (status: number, isDraft: boolean) => void\r\n isNotDisableTestResult?: boolean\r\n}\r\nconst VerifyDocumentProjectWithdraw: React.FC = (props) => {\r\n const model = useVerifyDocumentProjectWithdraw(props)\r\n return \r\n}\r\n\r\nexport default VerifyDocumentProjectWithdraw\r\n","import React from 'react'\r\n\r\n//Final Form\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n//Material-UI\r\nimport Grid from '@material-ui/core/Grid'\r\n\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport TextField from '../../../../../control/textfield/textfield'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport PageAction from '../pageAction'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\n\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\n\r\nimport DocumentTestResult from '../../../shareUI/documentTestResult/documentTestResult'\r\nimport useVerifyDocumentProjectWithdraw from './useVerifyDocumentProjectWithdraw'\r\nimport DisplayUpdater from '../../../shareUI/displayUpdater/displayUpdater'\r\nimport DesignateReviewer from '../../../shareUI/designateReviewer/designateReviewer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\n\r\ntype VerifyDocProjectWithdrawViewProps = ReturnType &\r\n VerifyDocProjectWithdrawProps\r\nconst VerifyDocProjectWithdrawView: React.FC = (props) => {\r\n const {\r\n initialVal,\r\n initialUploadFile,\r\n uploadDocumentTopic,\r\n isViewMode,\r\n configDialog,\r\n isShowUpdateDate,\r\n projectData,\r\n isNotDisableTestResult = false,\r\n isCompletely,\r\n onRefForm,\r\n onClickCancel,\r\n onSubmit,\r\n onRefDialog,\r\n onDirtyChange,\r\n onChangeDocCompletely,\r\n confirmEditDocResult,\r\n confirmEditDocReviewer,\r\n handleEditDocResult,\r\n handleEditDocReviewer,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n\r\n const irb = projectData?.irb\r\n\r\n const checkPermission = useCheckPermission()\r\n const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n const isDisabledTestResult = isNotDisableTestResult || canOfficerEdit ? false : true\r\n const isDisableReviewer = checkPermission.checkDisabledProjectReviewer(projectData)\r\n const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n\r\n return (\r\n \r\n {(formProps) => {\r\n onRefForm?.(formProps)\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n await confirmEditDocResult(formProps, [\r\n 'isCompletelyDoc',\r\n 'resubmitDocDate',\r\n 'remark',\r\n ])\r\n }}\r\n onClickModeEdit={() => handleEditDocResult(formProps)}\r\n />\r\n \r\n {isCompletely && (\r\n \r\n {\r\n await confirmEditDocReviewer(props, ['reviewer'])\r\n }}\r\n onClickModeEdit={() => handleEditDocReviewer(props)}\r\n />\r\n \r\n )}\r\n\r\n {isShowUpdateDate && }\r\n\r\n {(isNotDisableTestResult || !isViewMode) && (\r\n \r\n {\r\n onClickCancel(formProps.dirty)\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('saveType', 'SAVE')\r\n formProps.handleSubmit()\r\n formProps.invalid &&\r\n formProps.errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={\r\n canOfficerSaveDraft\r\n ? () => {\r\n formProps.form.change('saveType', 'DRAFT')\r\n formProps.handleSubmit()\r\n }\r\n : undefined\r\n }\r\n isViewMode={isViewMode}\r\n />\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport type VerifyDocProjectWithdrawProps = {\r\n onSaveComplete?: (status: number, isDraft: boolean) => void\r\n isNotDisableTestResult?: boolean\r\n}\r\nconst VerifyDocumentProjectWithdraw: React.FC = (props) => {\r\n const model = useVerifyDocumentProjectWithdraw(props)\r\n return \r\n}\r\n\r\nexport default VerifyDocumentProjectWithdraw\r\n","import React from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nimport { customFolder } from '../../../../../constants/constants'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\n\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\n\r\nimport * as confirmProjectWithdrawType from './confirmProjectWithdrawType'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport * as REQServiceTypes from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as RESServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport { responseWebServiceTypes } from '../../../../../services/web/types'\r\nimport * as DateUtils from '../../../../../utilities/date'\r\n\r\nimport { ConfirmProjectWithdrawProps } from './confirmProjectWithdraw'\r\n\r\nconst useConfirmProjectWithdraw = (props: ConfirmProjectWithdrawProps) => {\r\n const { onSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n const [projectPageData, setProjectPageData] = React.useState()\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n\r\n const formRef = React.useRef()\r\n const dialogRef = React.useRef>()\r\n\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectAction = useManageProjectAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const { folderSelected } = folderAndTabStore\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(manageProjectStore.projectData)\r\n\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData) {\r\n console.log('####Page: Project Withdraw####')\r\n loadProjectPageData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n const getDocumentTopicLut = async (irb: number, submitTypeID: number) => {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitTypeID)\r\n if (res.status === 1) {\r\n return res.result\r\n } else {\r\n return []\r\n }\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const values = formRef.current?.values\r\n let reviewerUserID = null\r\n if (values?.reviewer?.value) {\r\n reviewerUserID = parseInt(values.reviewer.value)\r\n }\r\n const param: REQServiceTypes.SaveVerifyProjectWithdrawType = {\r\n projectID: manageProjectStore.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore.projectData?.submittedID ?? null,\r\n isCompletely: values?.isCompletely ?? false,\r\n resubmitDocDate: DateUtils.dateForAPI(values?.resubmitDocDate) ?? null,\r\n verifyDocRemark: values?.remark ?? null,\r\n isDraft: isDraft,\r\n reviewerUserID: reviewerUserID,\r\n }\r\n return param\r\n }\r\n\r\n const loadProjectPageData = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n initialProcessUpdate()\r\n } else {\r\n initialProcessCreate()\r\n }\r\n }\r\n\r\n const initialProcessCreate = () => {\r\n createInitialData()\r\n initialUpload()\r\n }\r\n\r\n const initialProcessUpdate = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n const res = await callWebService.getProjectWithdraw(manageProjectStore.projectData.submittedID)\r\n if (res.status === 1) {\r\n setProjectPageData(res.result)\r\n\r\n createInitialData(res.result)\r\n initialUpload(res.result.documentInfo)\r\n } else {\r\n setProjectPageData(undefined)\r\n }\r\n }\r\n }\r\n\r\n const createInitialData = (initVal?: responseWebServiceTypes.GetProjectWithdrawResponse) => {\r\n const initialData: Record = {\r\n withdrawCause: null,\r\n isCompletelyDoc: '1',\r\n isCompletely: true,\r\n resubmitDocDate: null,\r\n remark: null,\r\n }\r\n if (initVal) {\r\n initialData.withdrawCause = initVal.reason\r\n initialData.isCompletelyDoc =\r\n initVal.isVerifyDocumentCompleted !== null ? (initVal.isVerifyDocumentCompleted ? '1' : '2') : null\r\n\r\n initialData.isCompletely = initVal.isVerifyDocumentCompleted\r\n initialData.remark = initVal.verifyDocRemark\r\n initialData.resubmitDocDate = initVal.resubmittedDate ? new Date(initVal.resubmittedDate) : null\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const initialUpload = async (\r\n initDocumentInfo?: responseWebServiceTypes.GetProjectWithdrawResponse['documentInfo'],\r\n ) => {\r\n if (manageProjectStore.projectData?.irb) {\r\n const lstDocumentTopic = await getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n constSubmittedType.withdrawalProject,\r\n )\r\n manageProjectAction.setDocumentTopic(lstDocumentTopic)\r\n\r\n let uploadFileInit = lstDocumentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n if (folderSelected.id !== customFolder.withdrawProject.id) {\r\n uploadFileInit?.forEach((itm: confirmProjectWithdrawType.UploadFileObjType) => {\r\n initDocumentInfo?.forEach((docInfo) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n if (docInfo.fileInfo?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push({\r\n ...docInfo.fileInfo[0],\r\n fileID: docInfo.fileInfo[0].fileToken,\r\n documentTopicID: docInfo.fileInfo[0].topicID as number,\r\n fileToken: docInfo.fileInfo[0].fileToken, //fileToken\r\n filename: docInfo.fileInfo[0].filename,\r\n path: docInfo.fileInfo[0].path,\r\n })\r\n }\r\n\r\n if (docInfo?.subtopic?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic[0]\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n }\r\n\r\n const processSaveData2 = async (\r\n param: REQServiceTypes.SaveVerifyProjectWithdrawType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n try {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.saveVerifyProjectWithdraw(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useVerifyDocumentProjectWithdraw.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n const onClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const onRefForm = (formProps: any) => {\r\n formRef.current = formProps\r\n }\r\n\r\n const processSaveData = async () => {\r\n try {\r\n const param: REQServiceTypes.SaveConfirmProjectWithdraw = {\r\n projectID: manageProjectStore.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore.projectData?.submittedID ?? null,\r\n isDelete: false,\r\n }\r\n\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.saveConfirmProjectWithdraw(param)\r\n\r\n if (onSaveComplete) {\r\n if (response && response.status) {\r\n const isDraft: boolean = false\r\n onSaveComplete(response.status, isDraft)\r\n }\r\n }\r\n } catch (ex) {\r\n console.log('useConfirmProjectWithdraw.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const onConfirmWithdraw = () => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_PROJECT_WITHDRAW'),\r\n type: 'alert-confirm',\r\n onClickConfirm: processSaveData,\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n return {\r\n initialVal: {\r\n ...initialValues,\r\n uploadFile: initialUploadFile,\r\n },\r\n initialUploadFile,\r\n uploadDocumentTopic: manageProjectStore.documentTopic,\r\n isViewMode: isViewMode,\r\n configDialog,\r\n onRefForm,\r\n onClickCancel,\r\n onRefDialog,\r\n onConfirmWithdraw,\r\n }\r\n}\r\nexport default useConfirmProjectWithdraw\r\n","import React from 'react'\r\n\r\n//Final Form\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n//Material-UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\n\r\nimport Button from '../../../../../control/button/button'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport TextField from '../../../../../control/textfield/textfield'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\n\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport ButtonSubmittedWithdraw from '../_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\n\r\nimport useConfirmProjectWithdraw from './useConfirmProjectWithdraw'\r\n\r\ntype ConfirmProjectWithdrawViewProps = ReturnType & ConfirmProjectWithdrawProps\r\nconst ConfirmProjectWithdrawView: React.FC = (props) => {\r\n const {\r\n initialVal,\r\n initialUploadFile,\r\n uploadDocumentTopic,\r\n isViewMode,\r\n configDialog,\r\n onRefDialog,\r\n onConfirmWithdraw,\r\n } = props\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n return (\r\n {}}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n initialValues={initialVal}\r\n keepDirtyOnReinitialize={true}\r\n >\r\n {({ handleSubmit, form, dirty, invalid, errors, values }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {!isViewMode && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE_WITHDRAW')}\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport type ConfirmProjectWithdrawProps = {\r\n onSaveComplete?: (status: number, isDraft: boolean) => void\r\n}\r\nconst ConfirmProjectWithdraw: React.FC = (props) => {\r\n const model = useConfirmProjectWithdraw(props)\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n saveButton: {\r\n border: 'solid 1px #db5f8e',\r\n // [theme.breakpoints.down('xs')]: {\r\n // marginTop: '8px',\r\n // },\r\n },\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n [theme.breakpoints.down('xs')]: {\r\n marginTop: '16px',\r\n },\r\n },\r\n container: {\r\n padding: '8px 0px',\r\n },\r\n}))\r\nexport default ConfirmProjectWithdraw\r\n","import React from 'react'\r\n\r\nimport { menuTab } from '../../../../../../constants/constants'\r\n\r\nimport useOfficer from './useOfficer'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport ProjectWithdrawPage from '../../../page/requestNewProject/projectWithdraw/projectWithdraw'\r\nimport VerifyDocumentProjectWithdrawREC1 from '../../../page/verifyDocumentProjectWithdraw/verifyDocumentProjectWithdrawREC1'\r\nimport VerifyDocumentProjectWithdrawREC2 from '../../../page/verifyDocumentProjectWithdraw/verifyDocumentProjectWithdrawREC2'\r\nimport ConfirmProjectWithdrawPage from '../../../page/confirmProjectWithdraw/confirmProjectWithdraw'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useCheckPermission from '../../../../../../utilities/checkPermission'\r\nimport constSubmittedStep from '../../../../../../constants/submittedStep'\r\n\r\ntype officerViewProps = ReturnType & OfficerProps\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const manageProjectStore = useManageProjectStore()\r\n const checkPermission = useCheckPermission()\r\n\r\n const renderPage = () => {\r\n const tabID = folderAndTabStore?.tabSelected?.id\r\n const REC = manageProjectStore?.projectData?.irbType\r\n\r\n let isNotDisableTestResult = false\r\n\r\n switch (REC) {\r\n case 1:\r\n switch (tabID) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return \r\n case menuTab.tab1.id:\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.confirmProjectWithdraw\r\n }\r\n return (\r\n \r\n )\r\n case menuTab.tabConfirmProjectWithdraw.id:\r\n return \r\n default:\r\n return <>\r\n }\r\n\r\n case 2:\r\n switch (tabID) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return \r\n case menuTab.tab1.id:\r\n if (checkPermission.isUserChairman()) {\r\n isNotDisableTestResult =\r\n manageProjectStore?.projectData?.stepID === constSubmittedStep.confirmProjectWithdraw\r\n }\r\n return (\r\n \r\n )\r\n case menuTab.tabConfirmProjectWithdraw.id:\r\n return \r\n default:\r\n return <>\r\n }\r\n default:\r\n return
\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\ntype OfficerProps = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (status: number, isDraft: boolean) => void\r\n}\r\nconst Officer: React.FC = (props) => {\r\n const officerModel = useOfficer()\r\n return \r\n}\r\n\r\nexport default Officer\r\n","import React from 'react'\r\nimport { ProjectWithdrawalProps } from './projectWithdrawal'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore, * as AppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport * as RESWebServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nconst useProjectWithdrawal = (props: ProjectWithdrawalProps) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n // const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n reloadProcess()\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n }\r\n}\r\n\r\nexport default useProjectWithdrawal\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\n\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useProjectWithdrawal from './useProjectWithdrawal'\r\nimport constSubmittedStep from '../../../../../constants/submittedStep'\r\n\r\ntype ProjectWithdrawalViewProps = ReturnType & ProjectWithdrawalProps\r\nconst ProjectWithdrawalView: React.FC = (props) => {\r\n const {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData,\r\n onRefDialog,\r\n onCallbackSaveComplete,\r\n onClickBackToSearch,\r\n } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const isBtnClose =\r\n checkPermission.isUserChairman() && projectData?.stepID === constSubmittedStep.confirmProjectWithdraw\r\n ? false\r\n : isViewMode\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n {isBtnClose && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\nexport type ProjectWithdrawalProps = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst ProjectWithdrawal: React.FC = (props) => {\r\n const projectWithdrawal = useProjectWithdrawal(props)\r\n return \r\n}\r\nexport default ProjectWithdrawal\r\n","import React from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nimport { customFolder } from '../../../../../../constants/constants'\r\nimport { RoutePath } from '../../../../../../router/routesConfig'\r\n\r\nimport useLookupService from '../../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../../control/loading/useLoading'\r\nimport useManageProjectAction from '../../../../../../stores/manageProject/useManageProjectAction'\r\nimport useManageProjectStore from '../../../../../../stores/manageProject/useManageProjectStore'\r\nimport useAppFolderAndTabAction from '../../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport checkPermission from '../../../../../../utilities/checkPermission'\r\n\r\nimport * as submittedWithdrawType from './submittedWithdrawType'\r\nimport { DialogType } from '../../../../../../control/dialog/dialog'\r\nimport constSubmittedType from '../../../../../../constants/submittedType'\r\nimport constSubmittedStatus from '../../../../../../constants/submittedStatus'\r\nimport * as REQServiceTypes from '../../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as RESServiceTypes from '../../../../../../services/web/types/responseWebServiceTypes'\r\nimport { responseWebServiceTypes } from '../../../../../../services/web/types'\r\nimport submittedType from '../../../../../../constants/submittedType'\r\n\r\nconst useSubmittedWithdraw = () => {\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n const [projectPageData, setProjectPageData] = React.useState()\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n\r\n const parameterForSaveRef = React.useRef()\r\n const dialogRef = React.useRef>()\r\n\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectAction = useManageProjectAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const { folderSelected } = folderAndTabStore\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(manageProjectStore.projectData)\r\n\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData) {\r\n loadProjectPageData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n const getDocumentTopicLut = async (irb: number, submitTypeID: number) => {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitTypeID)\r\n if (res.status === 1) {\r\n return res.result\r\n } else {\r\n return []\r\n }\r\n }\r\n\r\n const checkRequirePDF = (documentInfo: Array) => {\r\n let isRequirePDF = false\r\n\r\n for (let i = 0; i < documentInfo?.length; i++) {\r\n if (!isRequirePDF) {\r\n for (let j = 0; j < documentInfo[i]?.fileTokenInfo.length; j++) {\r\n if ((documentInfo[i]?.fileTokenInfo[j] as any)?.fileExtension === 'pdf') {\r\n isRequirePDF = false\r\n break\r\n } else {\r\n isRequirePDF = true\r\n }\r\n }\r\n }\r\n }\r\n return isRequirePDF\r\n }\r\n\r\n const loadProjectPageData = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n initialProcessUpdate()\r\n } else {\r\n initialProcessCreate()\r\n }\r\n }\r\n\r\n const initialProcessCreate = () => {\r\n createInitialData()\r\n initialUpload()\r\n }\r\n\r\n const initialProcessUpdate = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n const res = await callWebService.getProjectWithdraw(manageProjectStore.projectData.submittedID)\r\n\r\n if (res.status === 1) {\r\n setProjectPageData(res.result)\r\n\r\n createInitialData(res.result)\r\n initialUpload(res.result.documentInfo)\r\n } else {\r\n setProjectPageData(undefined)\r\n }\r\n }\r\n }\r\n\r\n const createInitialData = (initVal?: responseWebServiceTypes.GetProjectWithdrawResponse) => {\r\n const initialData: Record = {\r\n withdrawCause: null,\r\n }\r\n if (initVal) {\r\n initialData.withdrawCause = initVal.reason\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const initialUpload = async (\r\n initDocumentInfo?: responseWebServiceTypes.GetProjectWithdrawResponse['documentInfo'],\r\n ) => {\r\n if (manageProjectStore.projectData?.irb) {\r\n const lstDocumentTopic = await getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n constSubmittedType.withdrawalSubmitted,\r\n )\r\n manageProjectAction.setDocumentTopic(lstDocumentTopic)\r\n\r\n let uploadFileInit = lstDocumentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n if (folderSelected.id !== customFolder.withdrawSubmitted.id) {\r\n uploadFileInit?.forEach((itm: submittedWithdrawType.UploadFileObjType) => {\r\n initDocumentInfo?.forEach((docInfo) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n if (docInfo.fileInfo?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push({\r\n ...docInfo.fileInfo[0],\r\n fileID: docInfo.fileInfo[0].fileID,\r\n documentTopicID: docInfo.fileInfo[0].topicID as number,\r\n fileToken: docInfo.fileInfo[0].fileToken, //fileToken\r\n filename: docInfo.fileInfo[0].filename,\r\n path: docInfo.fileInfo[0].path,\r\n replaceFileID: docInfo.fileInfo[0].replaceFileID,\r\n })\r\n }\r\n\r\n if (docInfo?.subtopic?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic[0]\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n }\r\n\r\n const getDocumentInfoForSave = (val: any) => {\r\n let fileDataList = val.uploadFile.filter((itm: any) => itm.uploadFileObj.fileList.length > 0)\r\n let myFileData: Array = []\r\n\r\n fileDataList.forEach((uploadObj: submittedWithdrawType.UploadFileObjType) => {\r\n const subTopicLst = uploadObj?.uploadFileObj.subTopicPageList?.map((subtopic) => {\r\n return {\r\n subtopicID: subtopic.subtopicID,\r\n page: subtopic.page,\r\n }\r\n })\r\n\r\n const fileTokenInfo: Array<{\r\n replaceFileID: number\r\n fileToken: string\r\n fileExtension?: string\r\n fileID: any\r\n }> =\r\n uploadObj.uploadFileObj.fileList?.map((file) => {\r\n return {\r\n //@ts-ignore\r\n replaceFileID: file?.replaceFileID ? file.replaceFileID : null,\r\n fileToken: file.fileToken,\r\n fileExtension: file.filename.split('.').pop(),\r\n fileID: file?.fileID ? file.fileID : null,\r\n }\r\n }) ?? []\r\n\r\n myFileData.push({\r\n documentTopicID: uploadObj?.uploadFileObj?.documentTopicID,\r\n fileTokenInfo: fileTokenInfo,\r\n subtopic: subTopicLst && subTopicLst.length > 0 ? subTopicLst : [],\r\n })\r\n })\r\n\r\n return myFileData\r\n }\r\n const loadLatestFolder = async () => {\r\n try {\r\n loadingHook.loadingOpen()\r\n const currentProjectID = manageProjectStore.projectData?.projectID\r\n\r\n if (currentProjectID) {\r\n const resProjectFolder = await callWebService.getProjectFolder(currentProjectID)\r\n\r\n const projectFolder = resProjectFolder.result?.folders?.map((itm: any, index: number) => {\r\n return {\r\n ...itm,\r\n id: itm.submittedID,\r\n isLastProcess: index === 0 ? true : false,\r\n }\r\n })\r\n if (\r\n projectFolder?.length > 0 &&\r\n projectFolder[0]?.submittedTypeID === submittedType.withdrawalSubmitted\r\n ) {\r\n loadingHook.loadingClose()\r\n appFolderAndTabAction.setState({\r\n folderList: projectFolder,\r\n folderSelected: projectFolder[0],\r\n })\r\n }\r\n if (\r\n projectFolder?.length > 0 &&\r\n projectFolder[0]?.submittedTypeID === submittedType.withdrawalSubmitted\r\n ) {\r\n loadingHook.loadingClose()\r\n const selectedFolder = projectFolder[0]\r\n const resProject = await callWebService.getProjectByID(currentProjectID, selectedFolder.submittedID)\r\n if (resProject.result) {\r\n manageProjectAction.setProjectData(resProject.result)\r\n }\r\n }\r\n }\r\n } catch (ex) {\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n const onConfirmSave = async () => {\r\n if (parameterForSaveRef.current) {\r\n loadingHook.loadingOpen()\r\n let res = await callWebService.saveProjectWithdraw(parameterForSaveRef.current)\r\n\r\n if (res.status === 1) {\r\n loadingHook.loadingClose()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: loadLatestFolder,\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n loadingHook.loadingClose()\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n }\r\n const validateRequiredUploadFile = (uploadFile: Array<{ uploadFileObj: any }>, skipValidate: boolean = false) => {\r\n let isValid = true\r\n if (!skipValidate) {\r\n uploadFile?.every(({ uploadFileObj: file }) => {\r\n if (file?.isRequired && file?.fileList?.length === 0) {\r\n //เป็นหัวข้อที่มีการ required แต่ว่าไม่ upload เอกสาร\r\n isValid = false\r\n return false //break\r\n }\r\n return true //continue\r\n })\r\n\r\n if (!isValid) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get2Element('ALERT.CONTENT.PLEASE_UPLOAD_REQUIRED_TOPIC', [\r\n '',\r\n ]) as any,\r\n type: 'alert-message',\r\n })\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n return isValid\r\n }\r\n const onSubmit = (values: any) => {\r\n const loginType = localStorage.getItem('loginType')\r\n const isSubmitByAdmin = loginType === '2' ? true : false\r\n const projectID = manageProjectStore.projectData?.projectID ?? null\r\n let submittedID: number | null = folderSelected.submittedID\r\n if (folderSelected.submittedID === customFolder.withdrawSubmitted.submittedID) {\r\n submittedID = null\r\n }\r\n parameterForSaveRef.current = {\r\n projectID: projectID,\r\n submittedID: submittedID,\r\n reason: values.withdrawCause,\r\n isWithdrawProject: false, //ถอนการยื่น (Submitted)\r\n documentInfo: getDocumentInfoForSave(values),\r\n isSubmitByAdmin: isSubmitByAdmin,\r\n }\r\n\r\n const skipCheckRequiredUploadFile = isSubmitByAdmin\r\n if (validateRequiredUploadFile(values.uploadFile, skipCheckRequiredUploadFile)) {\r\n const countUploadFile = parameterForSaveRef.current?.documentInfo?.length ?? 0\r\n const isRequirePDF = checkRequirePDF(parameterForSaveRef.current.documentInfo)\r\n const isEmptyPage = checkSubtopic(parameterForSaveRef.current?.documentInfo)\r\n if (countUploadFile > 0 && isRequirePDF) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.UPLOAD_PDF_AT_LEAST_1_FILE'),\r\n type: 'alert-message',\r\n })\r\n } else if (isEmptyPage) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.PLEASE_COMPLETE_PAGE'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: onConfirmSave,\r\n })\r\n }\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n\r\n const checkSubtopic = (documentInfo: Array) => {\r\n let isEmptyPage = false\r\n\r\n //หาว่าหัวข้ออัปโหลดเอกสารมีให้อัปโหลดหัวข้อย่อยมั้ย\r\n const docTopic = manageProjectStore.documentTopic?.filter((item) => item.subtopic.length > 0)\r\n\r\n //ถ้ามีให้เข้าไปเช็คตามเงื่อนไข if\r\n if (docTopic?.length) {\r\n // วน loop หัวข้อที่มีให้อัปโหลดเอกสารหัวข้อย่อย\r\n docTopic.forEach((mainTopic) => {\r\n // วน loop หัวข้อที่มีการอัปโหลดเอกสารเข้ามา\r\n documentInfo.forEach((itm) => {\r\n // เช็คว่าเอกสารที่มีการอัปโหลดเข้ามาใช่เอกสารที่มีหัวข้อย่อยให้อัปโหลดหรือป่าว\r\n if (mainTopic.id === itm.documentTopicID) {\r\n // เช็คว่าหัวข้อย่อยที่อัพโหลดเข้ามาครบมั้ย\r\n if (itm.subtopic?.length != mainTopic.subtopic.length) {\r\n isEmptyPage = true\r\n } else {\r\n // เช็คว่าที่อัปมาครบมีช่องไหนกรอกเป็น ช่องว่างมั้ย\r\n const chkEmpty = itm.subtopic.find(\r\n (e) => e.page == null || e.page == '' || e.page == undefined,\r\n )\r\n if (chkEmpty) {\r\n isEmptyPage = true\r\n }\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n return isEmptyPage\r\n }\r\n const onClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const onDirtyChange = (formState: Record) => {\r\n // appFolderAndTabAction.setTabDirty(formState.dirty)\r\n }\r\n\r\n const conditionHideUploadSection = () => {\r\n let isHide = false\r\n const isUserResearcher = checkPermissionHook.isUserResearcher()\r\n\r\n if (isUserResearcher) {\r\n // isHide = manageProjectStore.projectData?.isSubmitByAdmin ?? false\r\n // ถ้า required ตลอดก็ผ่านตลอด\r\n isHide = false\r\n }\r\n return isHide\r\n }\r\n\r\n return {\r\n initialVal: {\r\n ...initialValues,\r\n uploadFile: initialUploadFile,\r\n },\r\n initialUploadFile,\r\n uploadDocumentTopic: manageProjectStore.documentTopic,\r\n isViewMode: isViewMode,\r\n isHideUploadSection: conditionHideUploadSection(),\r\n configDialog,\r\n onClickCancel,\r\n onSubmit,\r\n onRefDialog,\r\n onDirtyChange,\r\n }\r\n}\r\nexport default useSubmittedWithdraw\r\n","import React from 'react'\r\n\r\n//Final Form\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n//Material-UI\r\nimport Grid from '@material-ui/core/Grid'\r\n\r\nimport Dialog from '../../../../../../control/dialog/dialog'\r\nimport TextField from '../../../../../../control/textfield/textfield'\r\nimport UploadDoc from '../../../../shareUI/uploadDoc/uploadDoc'\r\nimport PageAction from '../../pageAction'\r\nimport MyAccordion from '../../../../../../control/accordion/accordion'\r\n\r\nimport useSnackbarAction from '../../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../../i18n/useTranslate'\r\nimport useSubmittedWithdraw from './useSubmittedWithdraw'\r\n\r\ntype SubmittedWithdrawViewProps = ReturnType & SubmittedWithdrawProps\r\nconst SubmittedWithdrawView: React.FC = (props) => {\r\n const {\r\n initialVal,\r\n initialUploadFile,\r\n uploadDocumentTopic,\r\n isViewMode,\r\n isHideUploadSection,\r\n configDialog,\r\n onClickCancel,\r\n onSubmit,\r\n onRefDialog,\r\n onDirtyChange,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n return (\r\n \r\n {({ handleSubmit, dirty, invalid, errors }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {!isHideUploadSection && (\r\n \r\n \r\n \r\n )}\r\n\r\n {!isViewMode && (\r\n \r\n {\r\n onClickCancel(dirty)\r\n }}\r\n onClickSave={() => {\r\n handleSubmit()\r\n invalid &&\r\n errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n />\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\ntype SubmittedWithdrawProps = {}\r\nconst SubmittedWithdraw: React.FC = (props) => {\r\n const model = useSubmittedWithdraw()\r\n return \r\n}\r\n\r\nexport default SubmittedWithdraw\r\n","const useResearcher = () => {\r\n return {}\r\n}\r\n\r\nexport default useResearcher\r\n","import React from 'react'\r\n\r\nimport { menuTab } from '../../../../../../constants/constants'\r\n\r\n//View\r\nimport SubmittedWithdrawPage from '../../../page/requestNewProject/submittedWithdraw/submittedWithdraw'\r\n\r\n//Model\r\nimport useResearcher from './useResearcher'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\ntype ResearcherViewProps = ReturnType & {}\r\nconst ResearcherView: React.FC = (props) => {\r\n const {} = props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return \r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\ntype ResearcherProps = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (resStatus: number, isDraft: boolean) => void\r\n}\r\nconst Researcher: React.FC = (props) => {\r\n const researcherModel = useResearcher()\r\n return \r\n}\r\n\r\nexport default Researcher\r\n","const useResearcher = () => {\r\n return {}\r\n}\r\n\r\nexport default useResearcher\r\n","import React from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nimport { customFolder } from '../../../../../constants/constants'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\n\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\n\r\nimport * as verifyDocumentSubmittedWithdrawType from './verifyDocumentSubmittedWithdrawType'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport * as REQServiceTypes from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as RESServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport { responseWebServiceTypes } from '../../../../../services/web/types'\r\nimport * as DateUtils from '../../../../../utilities/date'\r\n\r\nimport { VerifyDocSubmittedWithdraw } from './verifyDocumentSubmittedWithdraw'\r\nimport { validateModeAccordionError } from '../../../../../utilities/validate'\r\n\r\nconst useVerifyDocumentSubmittedWithdraw = (props: VerifyDocSubmittedWithdraw) => {\r\n const { onSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n const [projectPageData, setProjectPageData] = React.useState()\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n\r\n const formRef = React.useRef()\r\n const dialogRef = React.useRef>()\r\n\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectAction = useManageProjectAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const { folderSelected } = folderAndTabStore\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(manageProjectStore.projectData)\r\n const formHistoryRef = React.useRef>({})\r\n\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData) {\r\n console.log('####Page: Project Withdraw####')\r\n loadProjectPageData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n const getDocumentTopicLut = async (irb: number, submitTypeID: number) => {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitTypeID)\r\n if (res.status === 1) {\r\n return res.result\r\n } else {\r\n return []\r\n }\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const values = formRef.current?.values\r\n let reviewerUserID = null\r\n if (values?.reviewer?.value) {\r\n reviewerUserID = parseInt(values.reviewer.value)\r\n }\r\n const param: REQServiceTypes.SaveVerifyProjectWithdrawType = {\r\n projectID: manageProjectStore.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore.projectData?.submittedID ?? null,\r\n isCompletely: values?.isCompletely ?? false,\r\n resubmitDocDate: DateUtils.dateForAPI(values?.resubmitDocDate) ?? null,\r\n verifyDocRemark: values?.remark ?? null,\r\n isDraft: isDraft,\r\n reviewerUserID: reviewerUserID,\r\n }\r\n return param\r\n }\r\n\r\n const loadProjectPageData = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n initialProcessUpdate()\r\n } else {\r\n initialProcessCreate()\r\n }\r\n }\r\n\r\n const initialProcessCreate = () => {\r\n createInitialData()\r\n initialUpload()\r\n }\r\n\r\n const initialProcessUpdate = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n const res = await callWebService.getProjectWithdraw(manageProjectStore.projectData.submittedID)\r\n if (res.status === 1) {\r\n setProjectPageData(res.result)\r\n\r\n createInitialData(res.result)\r\n initialUpload(res.result.documentInfo)\r\n } else {\r\n setProjectPageData(undefined)\r\n }\r\n }\r\n }\r\n\r\n const createInitialData = (initVal?: responseWebServiceTypes.GetProjectWithdrawResponse) => {\r\n const initialData: Record = {\r\n withdrawCause: null,\r\n isCompletelyDoc: '1',\r\n isCompletely: true,\r\n resubmitDocDate: null,\r\n remark: null,\r\n }\r\n if (initVal) {\r\n initialData.withdrawCause = initVal.reason\r\n initialData.isCompletelyDoc =\r\n initVal.isVerifyDocumentCompleted !== null ? (initVal.isVerifyDocumentCompleted ? '1' : '2') : null\r\n\r\n initialData.isCompletely = initVal.isVerifyDocumentCompleted\r\n initialData.remark = initVal.verifyDocRemark\r\n initialData.resubmitDocDate = initVal.resubmittedDate ? new Date(initVal.resubmittedDate) : null\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const initialUpload = async (\r\n initDocumentInfo?: responseWebServiceTypes.GetProjectWithdrawResponse['documentInfo'],\r\n ) => {\r\n if (manageProjectStore.projectData?.irb) {\r\n const lstDocumentTopic = await getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n constSubmittedType.withdrawalSubmitted,\r\n )\r\n manageProjectAction.setDocumentTopic(lstDocumentTopic)\r\n\r\n let uploadFileInit = lstDocumentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n if (folderSelected.id !== customFolder.withdrawSubmitted.id) {\r\n uploadFileInit?.forEach((itm: verifyDocumentSubmittedWithdrawType.UploadFileObjType) => {\r\n initDocumentInfo?.forEach((docInfo) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n if (docInfo.fileInfo?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push({\r\n ...docInfo.fileInfo[0],\r\n fileID: docInfo.fileInfo[0].fileToken,\r\n documentTopicID: docInfo.fileInfo[0].topicID as number,\r\n fileToken: docInfo.fileInfo[0].fileToken, //fileToken\r\n filename: docInfo.fileInfo[0].filename,\r\n path: docInfo.fileInfo[0].path,\r\n })\r\n }\r\n\r\n if (docInfo?.subtopic?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic[0]\r\n }\r\n }\r\n })\r\n })\r\n }\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n }\r\n\r\n const processSaveData = async (\r\n param: REQServiceTypes.SaveVerifyProjectWithdrawType,\r\n changeTabOpt?: { idx: number; selectedInfo: any },\r\n ) => {\r\n try {\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.saveVerifyProjectWithdraw(param)\r\n\r\n if (changeTabOpt) {\r\n if (changeTabOpt.idx !== null && changeTabOpt.selectedInfo !== null) {\r\n tabAndFolderHook.setTab(changeTabOpt.idx, changeTabOpt.selectedInfo)\r\n }\r\n } else {\r\n if (onSaveComplete) onSaveComplete(response.status, param.isDraft as boolean)\r\n }\r\n } catch (ex) {\r\n console.log('useVerifyDocumentProjectWithdraw.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const onSubmit = (values: any) => {\r\n if (manageProjectStore.projectData?.projectID && manageProjectStore.projectData?.submittedID) {\r\n const isDraft: boolean = values.saveType === 'DRAFT'\r\n const saveParam = getSaveServiceParameter(isDraft)\r\n\r\n if (isDraft) {\r\n processSaveData(saveParam)\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n type: 'alert-confirm',\r\n onClickConfirm: () => {\r\n processSaveData(saveParam)\r\n },\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n }\r\n }\r\n\r\n const callbackDirtyProcess = (tabIndex: number, newTabSelected: any) => {\r\n const isDraft: boolean = true\r\n const param = getSaveServiceParameter(isDraft)\r\n processSaveData(param, {\r\n idx: tabIndex,\r\n selectedInfo: newTabSelected,\r\n })\r\n }\r\n const onClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n const onDirtyChange = (formState: Record) => {\r\n let isDirty: boolean = false\r\n if (!isViewMode) {\r\n isDirty = formState.dirty\r\n }\r\n const paramsDirty = {\r\n tabDirty: isDirty,\r\n callbackDirty: isDirty ? callbackDirtyProcess : undefined,\r\n }\r\n appFolderAndTabAction.setDirty(paramsDirty)\r\n }\r\n const onRefForm = (formProps: any) => {\r\n formRef.current = formProps\r\n }\r\n\r\n const confirmEditDocResult = (formProps: any, fieldNames: string[]) => {\r\n const isError = validateModeAccordionError(fieldNames, formProps)\r\n return new Promise((resolve, reject) => {\r\n if (!isError) {\r\n let isCompletelyDoc = formProps.values.isCompletelyDoc === '1'\r\n let sendEditData = null\r\n if (!isCompletelyDoc && formProps.values.resubmitDocDate) {\r\n sendEditData = DateUtils.dateForAPI(formProps.values.resubmitDocDate) ?? null\r\n }\r\n const param = {\r\n ...getEditDocParams(formHistoryRef.current['docResult']),\r\n isCompletely: isCompletelyDoc,\r\n resubmitDocDate: sendEditData,\r\n remark: isCompletelyDoc ? null : formProps.values?.remark ? formProps.values.remark : null,\r\n }\r\n processSaveData(param)\r\n .then(() => {\r\n handleEditDocResult(formProps)\r\n resolve('')\r\n })\r\n .catch(() => {\r\n reject('')\r\n })\r\n } else {\r\n formProps.form.submit()\r\n reject('')\r\n }\r\n })\r\n }\r\n\r\n const handleEditDocResult = (formProps: any) => {\r\n formHistoryRef.current['docResult'] = formProps.values\r\n }\r\n\r\n const getEditDocParams = (formValues: any) => {\r\n let reviewerUserID = null\r\n if (formValues?.reviewer?.value) {\r\n reviewerUserID = parseInt(formValues.reviewer.value)\r\n }\r\n const param: REQServiceTypes.SaveVerifyProjectWithdrawType = {\r\n projectID: manageProjectStore.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore.projectData?.submittedID ?? null,\r\n isCompletely: formValues?.isCompletely ?? false,\r\n resubmitDocDate: DateUtils.dateForAPI(formValues?.resubmitDocDate) ?? null,\r\n verifyDocRemark: formValues?.remark ?? null,\r\n isDraft: false,\r\n reviewerUserID: reviewerUserID,\r\n }\r\n return param\r\n }\r\n\r\n return {\r\n initialVal: {\r\n ...initialValues,\r\n uploadFile: initialUploadFile,\r\n },\r\n initialUploadFile,\r\n uploadDocumentTopic: manageProjectStore.documentTopic,\r\n isViewMode: isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefForm,\r\n onClickCancel,\r\n onSubmit,\r\n onRefDialog,\r\n onDirtyChange,\r\n confirmEditDocResult,\r\n handleEditDocResult,\r\n }\r\n}\r\nexport default useVerifyDocumentSubmittedWithdraw\r\n","import React from 'react'\r\n\r\n//Final Form\r\nimport { Form, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n//Material-UI\r\nimport Grid from '@material-ui/core/Grid'\r\n\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport TextField from '../../../../../control/textfield/textfield'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport PageAction from '../pageAction'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\n\r\nimport useSnackbarAction from '../../../../../stores/snackbar/snackbarAction'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\n\r\nimport DocumentTestResult from '../../../shareUI/documentTestResult/documentTestResult'\r\nimport useVerifyDocumentSubmittedWithdraw from './useVerifyDocumentSubmittedWithdraw'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\n\r\ntype VerifyDocSubmittedWithdrawViewProps = ReturnType &\r\n VerifyDocSubmittedWithdraw\r\nconst VerifySubmittedWithdrawView: React.FC = (props) => {\r\n const {\r\n initialVal,\r\n initialUploadFile,\r\n uploadDocumentTopic,\r\n isViewMode,\r\n configDialog,\r\n onRefForm,\r\n onClickCancel,\r\n onSubmit,\r\n onRefDialog,\r\n onDirtyChange,\r\n projectData,\r\n confirmEditDocResult,\r\n handleEditDocResult,\r\n } = props\r\n const translate = useTranslate()\r\n const snackbarAction = useSnackbarAction()\r\n const checkPermission = useCheckPermission()\r\n const canOfficerEdit = checkPermission.isAllowOfficerToEdit(projectData)\r\n const isDisabledTestResult = canOfficerEdit ? false : true\r\n const canOfficerSaveDraft = checkPermission.checkSaveDraft()\r\n\r\n return (\r\n \r\n {(formProps) => {\r\n onRefForm?.(formProps)\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n const isCompletely = val === '1' ? true : false\r\n formProps.form.change('isCompletely', isCompletely)\r\n }}\r\n isViewMode={isViewMode}\r\n useAccordionMode={isDisabledTestResult}\r\n onSubmitEdit={async () => {\r\n await confirmEditDocResult(formProps, [\r\n 'isCompletelyDoc',\r\n 'resubmitDocDate',\r\n 'remark',\r\n ])\r\n }}\r\n onClickModeEdit={() => handleEditDocResult(formProps)}\r\n />\r\n \r\n {!isViewMode && (\r\n \r\n {\r\n onClickCancel(formProps.dirty)\r\n }}\r\n onClickSave={() => {\r\n formProps.form.change('saveType', 'SAVE')\r\n formProps.handleSubmit()\r\n formProps.invalid &&\r\n formProps.errors &&\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M012'),\r\n type: 'error',\r\n })\r\n }}\r\n onClickSaveDraft={\r\n canOfficerSaveDraft\r\n ? () => {\r\n formProps.form.change('saveType', 'DRAFT')\r\n formProps.handleSubmit()\r\n }\r\n : undefined\r\n }\r\n />\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport type VerifyDocSubmittedWithdraw = {\r\n onSaveComplete?: (status: number, isDraft: boolean) => void\r\n}\r\nconst VerifyDocumentProjectWithdraw: React.FC = (props) => {\r\n const model = useVerifyDocumentSubmittedWithdraw(props)\r\n return \r\n}\r\n\r\nexport default VerifyDocumentProjectWithdraw\r\n","import React from 'react'\r\nimport { useHistory } from 'react-router-dom'\r\n\r\nimport { customFolder } from '../../../../../constants/constants'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\n\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\nimport useWebService from '../../../../../services/web/useWebService'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport useManageProjectAction from '../../../../../stores/manageProject/useManageProjectAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport checkPermission from '../../../../../utilities/checkPermission'\r\n\r\nimport * as confirmSubmittedWithdrawType from './confirmSubmittedWithdrawType'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport constSubmittedType from '../../../../../constants/submittedType'\r\nimport * as REQServiceTypes from '../../../../../services/web/types/requestWebServiceTypes'\r\nimport * as RESServiceTypes from '../../../../../services/web/types/responseWebServiceTypes'\r\nimport { responseWebServiceTypes } from '../../../../../services/web/types'\r\nimport * as DateUtils from '../../../../../utilities/date'\r\n\r\nimport { ConfirmSubmittedWithdrawProps } from './confirmSubmittedWithdraw'\r\n\r\nconst useConfirmSubmittedWithdraw = (props: ConfirmSubmittedWithdrawProps) => {\r\n const { onSaveComplete } = props\r\n const [initialValues, setInitialValues] = React.useState({})\r\n const [initialUploadFile, setInitialUploadFile] = React.useState()\r\n const [projectPageData, setProjectPageData] = React.useState()\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n\r\n const formRef = React.useRef()\r\n const dialogRef = React.useRef>()\r\n\r\n const loadingHook = useLoading()\r\n const callLookup = useLookupService()\r\n const callWebService = useWebService()\r\n const history = useHistory()\r\n const translate = useTranslate()\r\n const checkPermissionHook = checkPermission()\r\n const tabAndFolderHook = useFolderAndTab()\r\n const folderAndTabStore = useFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n const manageProjectAction = useManageProjectAction()\r\n const manageProjectStore = useManageProjectStore()\r\n const { folderSelected } = folderAndTabStore\r\n const isViewMode = checkPermissionHook.chkProjectStepViewMode(manageProjectStore.projectData)\r\n\r\n React.useEffect(() => {\r\n if (manageProjectStore.projectData) {\r\n console.log('####Page: Project Withdraw####')\r\n loadProjectPageData()\r\n }\r\n }, [manageProjectStore.projectData?.submittedID])\r\n\r\n const getDocumentTopicLut = async (irb: number, submitTypeID: number) => {\r\n const res = await callLookup.callDocumentTopicLut(irb, submitTypeID)\r\n if (res.status === 1) {\r\n return res.result\r\n } else {\r\n return []\r\n }\r\n }\r\n\r\n const getSaveServiceParameter = (isDraft: boolean) => {\r\n const values = formRef.current?.values\r\n let reviewerUserID = null\r\n if (values?.reviewer?.value) {\r\n reviewerUserID = parseInt(values.reviewer.value)\r\n }\r\n const param: REQServiceTypes.SaveVerifyProjectWithdrawType = {\r\n projectID: manageProjectStore.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore.projectData?.submittedID ?? null,\r\n isCompletely: values?.isCompletely ?? false,\r\n resubmitDocDate: DateUtils.dateForAPI(values?.resubmitDocDate) ?? null,\r\n verifyDocRemark: values?.remark ?? null,\r\n isDraft: isDraft,\r\n reviewerUserID: reviewerUserID,\r\n }\r\n return param\r\n }\r\n\r\n const loadProjectPageData = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n initialProcessUpdate()\r\n } else {\r\n initialProcessCreate()\r\n }\r\n }\r\n\r\n const initialProcessCreate = () => {\r\n createInitialData()\r\n initialUpload()\r\n }\r\n\r\n const initialProcessUpdate = async () => {\r\n if (manageProjectStore.projectData?.submittedID) {\r\n const res = await callWebService.getProjectWithdraw(manageProjectStore.projectData.submittedID)\r\n if (res.status === 1) {\r\n setProjectPageData(res.result)\r\n\r\n createInitialData(res.result)\r\n initialUpload(res.result.documentInfo)\r\n } else {\r\n setProjectPageData(undefined)\r\n }\r\n }\r\n }\r\n\r\n const createInitialData = (initVal?: responseWebServiceTypes.GetProjectWithdrawResponse) => {\r\n const initialData: Record = {\r\n withdrawCause: null,\r\n isCompletelyDoc: '1',\r\n isCompletely: true,\r\n resubmitDocDate: null,\r\n remark: null,\r\n }\r\n if (initVal) {\r\n initialData.withdrawCause = initVal.reason\r\n initialData.isCompletelyDoc =\r\n initVal.isVerifyDocumentCompleted !== null ? (initVal.isVerifyDocumentCompleted ? '1' : '2') : null\r\n\r\n initialData.isCompletely = initVal.isVerifyDocumentCompleted\r\n initialData.remark = initVal.verifyDocRemark\r\n initialData.resubmitDocDate = initVal.resubmittedDate ? new Date(initVal.resubmittedDate) : null\r\n }\r\n\r\n setInitialValues(initialData)\r\n }\r\n\r\n const initialUpload = async (\r\n initDocumentInfo?: responseWebServiceTypes.GetProjectWithdrawResponse['documentInfo'],\r\n ) => {\r\n if (manageProjectStore.projectData?.irb) {\r\n const lstDocumentTopic = await getDocumentTopicLut(\r\n manageProjectStore.projectData?.irb,\r\n constSubmittedType.withdrawalSubmitted,\r\n )\r\n manageProjectAction.setDocumentTopic(lstDocumentTopic)\r\n\r\n let uploadFileInit = lstDocumentTopic?.map((itm: any, idx: number) => {\r\n return {\r\n uploadFileObj: {\r\n fileList: [],\r\n subTopicPageList: [],\r\n documentTopicID: itm.id,\r\n isDisplay: itm.isDisplay,\r\n isRequired: itm.isRequired,\r\n },\r\n }\r\n }) as Array\r\n\r\n if (folderSelected.id !== customFolder.withdrawSubmitted.id) {\r\n uploadFileInit?.forEach((itm: confirmSubmittedWithdrawType.UploadFileObjType) => {\r\n initDocumentInfo?.forEach((docInfo) => {\r\n if (docInfo.topicID === itm.uploadFileObj.documentTopicID) {\r\n if (docInfo.fileInfo?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.fileList.push({\r\n ...docInfo.fileInfo[0],\r\n fileID: docInfo.fileInfo[0].fileToken,\r\n documentTopicID: docInfo.fileInfo[0].topicID as number,\r\n fileToken: docInfo.fileInfo[0].fileToken, //fileToken\r\n filename: docInfo.fileInfo[0].filename,\r\n path: docInfo.fileInfo[0].path,\r\n })\r\n }\r\n\r\n if (docInfo?.subtopic?.length > 0) {\r\n //@ts-ignore\r\n itm.uploadFileObj.subTopicPageList = docInfo.subtopic[0]\r\n }\r\n }\r\n })\r\n })\r\n }\r\n\r\n //Filter การซ่อนแสดงหัวข้อเอกสาร ถ้าฝั่งสำนักงานให้ซ่อนหัวข้อเอกสาร แต่ว่าหัวข้อนั้นมีไฟล์อยู่ให้ทำการแสดงหัวข้อนั้นออกมา\r\n if (uploadFileInit?.length > 0) {\r\n uploadFileInit = uploadFileInit.filter((itm: any) => {\r\n return itm.uploadFileObj.isDisplay || itm.uploadFileObj.fileList.length !== 0\r\n })\r\n }\r\n setInitialUploadFile(uploadFileInit)\r\n }\r\n }\r\n\r\n const onClickCancel = (dirty: boolean) => {\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n history.push(RoutePath.manageProject)\r\n },\r\n })\r\n dialogRef.current?.openDialog()\r\n } else {\r\n history.push(RoutePath.manageProject)\r\n }\r\n }\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const onRefForm = (formProps: any) => {\r\n formRef.current = formProps\r\n }\r\n\r\n const processSaveData = async () => {\r\n try {\r\n const param: REQServiceTypes.SaveConfirmProjectWithdraw = {\r\n projectID: manageProjectStore.projectData?.projectID ?? null,\r\n submittedID: manageProjectStore.projectData?.submittedID ?? null,\r\n isDelete: true,\r\n }\r\n\r\n dialogRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const response = await callWebService.saveConfirmProjectWithdraw(param)\r\n\r\n if (onSaveComplete) {\r\n if (response && response.status) {\r\n const isDraft: boolean = false\r\n onSaveComplete(response.status, isDraft)\r\n }\r\n }\r\n } catch (ex) {\r\n console.log('useConfirmSubmittedWithdraw.ts => processSaveData : ', ex)\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n const onConfirmWithdraw = () => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_PROJECT_WITHDRAW'),\r\n type: 'alert-confirm',\r\n onClickConfirm: processSaveData,\r\n })\r\n\r\n dialogRef.current?.openDialog()\r\n }\r\n return {\r\n initialVal: {\r\n ...initialValues,\r\n uploadFile: initialUploadFile,\r\n },\r\n initialUploadFile,\r\n uploadDocumentTopic: manageProjectStore.documentTopic,\r\n isViewMode: isViewMode,\r\n configDialog,\r\n onRefForm,\r\n onClickCancel,\r\n onRefDialog,\r\n onConfirmWithdraw,\r\n }\r\n}\r\nexport default useConfirmSubmittedWithdraw\r\n","import React from 'react'\r\n\r\n//Final Form\r\nimport { Form } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\n\r\n//Material-UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\n\r\nimport Button from '../../../../../control/button/button'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport TextField from '../../../../../control/textfield/textfield'\r\nimport UploadDoc from '../../../shareUI/uploadDoc/uploadDoc'\r\nimport MyAccordion from '../../../../../control/accordion/accordion'\r\n\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport ButtonSubmittedWithdraw from '../_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\nimport useConfirmSubmittedWithdraw from './useConfirmSubmittedWithdraw'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport submittedType from '../../../../../constants/submittedType'\r\n\r\ntype ConfirmProjectWithDrawViewProps = ReturnType & ConfirmSubmittedWithdrawProps\r\nconst ConfirmSubmittedWithdrawView: React.FC = (props) => {\r\n const {\r\n initialVal,\r\n initialUploadFile,\r\n uploadDocumentTopic,\r\n isViewMode,\r\n configDialog,\r\n onRefDialog,\r\n onConfirmWithdraw,\r\n } = props\r\n const classes = useStyles()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const { folderSelected } = useAppFolderAndTabStore()\r\n return (\r\n {}}\r\n mutators={{\r\n ...arrayMutators,\r\n }}\r\n initialValues={initialVal}\r\n keepDirtyOnReinitialize={true}\r\n >\r\n {() => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {!isViewMode && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {folderSelected?.folderName_th?.includes('แก้ไขหลังพิจารณา')\r\n ? translate.get('BUTTON.SAVE_CANCEL_SUBMITTED_WITHDRAW')\r\n : translate.get('BUTTON.SAVE_WITHDRAW')}\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport type ConfirmSubmittedWithdrawProps = {\r\n onSaveComplete?: (status: number, isDraft: boolean) => void\r\n}\r\nconst ConfirmProjectWithdraw: React.FC = (props) => {\r\n const model = useConfirmSubmittedWithdraw(props)\r\n return \r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n saveButton: {\r\n border: 'solid 1px #db5f8e',\r\n // [theme.breakpoints.down('xs')]: {\r\n // marginTop: '8px',\r\n // },\r\n },\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n [theme.breakpoints.down('xs')]: {\r\n marginTop: '16px',\r\n },\r\n },\r\n container: {\r\n padding: '8px 0px',\r\n },\r\n}))\r\nexport default ConfirmProjectWithdraw\r\n","import React from 'react'\r\n\r\nimport { menuTab } from '../../../../../../constants/constants'\r\n\r\nimport useOfficer from './useOfficer'\r\nimport useFolderAndTabStore from '../../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\n\r\nimport VerifyDocumentSubmittedWithdrawPage from '../../../page/verifyDocumentSubmittedWithdraw/verifyDocumentSubmittedWithdraw'\r\nimport ConfirmSubmittedWithdrawPage from '../../../page/confirmSubmittedWithdraw/confirmSubmittedWithdraw'\r\nimport SubmittedWithdrawPage from '../../../page/requestNewProject/submittedWithdraw/submittedWithdraw'\r\n\r\ntype officerViewProps = ReturnType & OfficerProps\r\nconst OfficerView: React.FC = (props) => {\r\n const { callbackSaveComplete } = props\r\n const folderAndTabStore = useFolderAndTabStore()\r\n\r\n const renderPage = () => {\r\n switch (folderAndTabStore?.tabSelected?.id) {\r\n case menuTab.tab21.id:\r\n case menuTab.tab25.id:\r\n return \r\n case menuTab.tab1.id:\r\n return \r\n case menuTab.tabConfirmProjectWithdraw.id:\r\n return \r\n default:\r\n return <>\r\n }\r\n }\r\n return renderPage()\r\n}\r\n\r\ntype OfficerProps = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n callbackSaveComplete?: (status: number, isDraft: boolean) => void\r\n}\r\nconst Officer: React.FC = (props) => {\r\n const officerModel = useOfficer()\r\n return \r\n}\r\n\r\nexport default Officer\r\n","import React from 'react'\r\nimport { SubmittedWithdrawProps } from './submittedWithdrawal'\r\nimport * as Constants from '../../../../../constants/constants'\r\nimport constUserGroup from '../../../../../constants/userGroup'\r\n\r\nimport useAuthenStore from '../../../../../stores/authen/authenStore'\r\nimport useAppFolderAndTabStore from '../../../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport useManageProjectStore from '../../../../../stores/manageProject/useManageProjectStore'\r\n\r\nimport useFolderAndTab from '../../useFolderAndTab'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { DialogType } from '../../../../../control/dialog/dialog'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useHistory } from 'react-router-dom'\r\nimport submittedStep from '../../../../../constants/submittedStep'\r\n\r\nconst useSubmittedWithdrawal = (props: SubmittedWithdrawProps) => {\r\n const { projectMode } = props\r\n const authenStore = useAuthenStore()\r\n const manageProjectStore = useManageProjectStore()\r\n // const manageProjectAction = useManageProjectAction()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n const appFolderAndTabAction = useAppFolderAndTabAction()\r\n\r\n const tabAndFolderHook = useFolderAndTab()\r\n // const callWebService = useWebService()\r\n const history = useHistory()\r\n const checkPermission = useCheckPermission()\r\n const translate = useTranslate()\r\n\r\n const [configDialog, setConfigDialog] =\r\n React.useState>()\r\n const dialogRef = React.useRef>()\r\n\r\n const isFirstRender = React.useRef(true)\r\n\r\n const isViewMode = checkPermission.chkProjectStepViewMode(\r\n manageProjectStore.projectData ? manageProjectStore.projectData : undefined,\r\n )\r\n\r\n React.useEffect(() => {\r\n if (isFirstRender) {\r\n isFirstRender.current = false\r\n const isReloadProjectData = false\r\n const ignoreCustomFolder = false\r\n loadTabAndFolder(appFolderAndTabStore, isReloadProjectData, ignoreCustomFolder)\r\n }\r\n }, [authenStore.profile.userId, manageProjectStore.projectData?.submittedID ?? null])\r\n\r\n const onRefDialog = (func: Record) => {\r\n //ห้าม set State หรือเรียก Action ในนี้\r\n dialogRef.current = func\r\n }\r\n\r\n const loadTabAndFolder = async (\r\n appFolderAndTabInfo: typeof appFolderAndTabStore,\r\n isReloadProjectData: boolean = true,\r\n ignoreCustomFolder: boolean = false,\r\n ) => {\r\n const mode = projectMode\r\n if (mode === 'CREATE') {\r\n tabAndFolderHook.createProjectLoadTabAndFolder()\r\n } else if (mode === 'EDIT' && manageProjectStore.projectData?.projectID) {\r\n tabAndFolderHook.loadTabAndFolder(\r\n manageProjectStore.projectData,\r\n appFolderAndTabInfo,\r\n isReloadProjectData,\r\n ignoreCustomFolder,\r\n )\r\n }\r\n }\r\n\r\n const handleCallbackSaveComplete = (status: number, isDraft: boolean) => {\r\n if (status === 1) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n handleAfterClose(isDraft)\r\n },\r\n })\r\n } else if (status === -2) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SECRET_PASSWORD_INCORRECT'),\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.ERROR'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n dialogRef.current?.openDialog()\r\n }\r\n const handleAfterClose = (isDraft: boolean) => {\r\n const { userGroupId } = authenStore.profile\r\n const { tabSelected } = appFolderAndTabStore\r\n if (!isDraft) {\r\n switch (userGroupId) {\r\n case constUserGroup.president:\r\n case constUserGroup.vicePresident:\r\n case constUserGroup.secretary:\r\n case constUserGroup.reviewer:\r\n if (\r\n tabSelected.id === Constants.menuTab.tab2Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab6Chairman.id ||\r\n tabSelected.id === Constants.menuTab.tab9.id\r\n ) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n break\r\n case constUserGroup.committee:\r\n if (tabSelected.id === Constants.menuTab.tab5Commitee.id) {\r\n history.push(RoutePath.manageProject)\r\n }\r\n break\r\n default:\r\n if (manageProjectStore?.projectData?.stepID === submittedStep.confirmProjectWithdraw) {\r\n history.push(RoutePath.manageProject)\r\n } else {\r\n reloadProcess()\r\n }\r\n\r\n break\r\n }\r\n } else {\r\n reloadProcess()\r\n }\r\n }\r\n const reloadProcess = () => {\r\n setConfigDialog({}) //clear function dialog\r\n let isSelectedCustomFolder = false\r\n\r\n if (appFolderAndTabStore?.folderSelected?.id) {\r\n isSelectedCustomFolder = tabAndFolderHook.isCustomFolder(appFolderAndTabStore.folderSelected.id)\r\n }\r\n\r\n let appFolderAndTabInfo = { ...appFolderAndTabStore }\r\n if (isSelectedCustomFolder) {\r\n appFolderAndTabInfo = {\r\n ...appFolderAndTabStore,\r\n folderSelected: {\r\n id: null,\r\n folderName_th: null,\r\n folderName_en: null,\r\n submittedID: null,\r\n isLastProcess: false,\r\n },\r\n }\r\n }\r\n\r\n const isReloadProjectData = true\r\n const ignoreCustomFolder = true\r\n loadTabAndFolder(appFolderAndTabInfo, isReloadProjectData, ignoreCustomFolder)\r\n appFolderAndTabAction.resetTabDirty()\r\n }\r\n\r\n const handleClickBackToSearch = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n return {\r\n projectMode,\r\n isViewMode,\r\n configDialog,\r\n projectData: manageProjectStore.projectData,\r\n onRefDialog: onRefDialog,\r\n onCallbackSaveComplete: handleCallbackSaveComplete,\r\n onClickBackToSearch: handleClickBackToSearch,\r\n }\r\n}\r\n\r\nexport default useSubmittedWithdrawal\r\n","import React from 'react'\r\n//=======Material UI\r\nimport Grid from '@material-ui/core/Grid'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\r\n\r\nimport Researcher from './researcher/researcher'\r\nimport Officer from './officer/officer'\r\nimport useCheckPermission from '../../../../../utilities/checkPermission'\r\nimport Dialog from '../../../../../control/dialog/dialog'\r\nimport Button from '../../../../../control/button/button'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport ButtonSubmittedWithdraw from '../../page/_sharedPageComponent/buttonSubmittedWithdraw/buttonSubmittedWithdraw'\r\n\r\nimport useSubmittedWithdrawal from './useSubmittedWithdrawal'\r\n\r\ntype SubmittedWithdrawViewProps = ReturnType & SubmittedWithdrawProps\r\nconst SubmittedWithdrawView: React.FC = (props) => {\r\n const { projectMode, isViewMode, configDialog, onRefDialog, onCallbackSaveComplete, onClickBackToSearch } = props\r\n const checkPermission = useCheckPermission()\r\n const isUserResearcher = checkPermission.isUserResearcher()\r\n const translate = useTranslate()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n const renderUserRoleComponent = () => {\r\n if (isUserResearcher) {\r\n return \r\n } else {\r\n return \r\n }\r\n }\r\n return (\r\n \r\n \r\n {renderUserRoleComponent()}\r\n \r\n {isViewMode && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n )\r\n}\r\nexport type SubmittedWithdrawProps = {\r\n projectMode: 'CREATE' | 'EDIT'\r\n}\r\nconst SubmittedWithdraw: React.FC = (props) => {\r\n const projectWithdrawal = useSubmittedWithdrawal(props)\r\n return \r\n}\r\nexport default SubmittedWithdraw\r\n","import React from 'react'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport Grid from '@material-ui/core/Grid'\r\n\r\nimport MenuFolder from '../../../control/menuFolder/menuFolder'\r\nimport EditFormHeader from '../shareUI/editFormHeader/editFormHeader'\r\nimport RequestNewProject from './flow/requestNewProject/requestNewProject'\r\nimport RequestNewProjectEditAfterReview from './flow/requestNewProjectEditAfterReview/requestNewProjectEditAfterReview'\r\nimport ProjectPhase from './flow/projectPhase/projectPhase'\r\nimport ProjectAmendment from './flow/projectAmendment/projectAmendment'\r\nimport ProjectAmendmentEditAfterReview from './flow/projectAmendmentEditAfterReview/projectAmendmentEditAfterReview'\r\nimport CloseProject from './flow/closeProject/closeProject'\r\nimport ProjectPhaseEditAfterReview from './flow/projectPhaseEditAfterReview/projectPhaseEditAfterReview'\r\nimport TerminateProject from './flow/terminateProject/terminateProject'\r\nimport AdverseEvent from './flow/adverseEvents/adverseEvent'\r\nimport useProjectManager from './useProjectManager'\r\nimport useAppFolderAndTabStore from '../../../stores/appFolderAndTab/appFolderAndTabStore'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport DialogRequestConsiderDoc from './dialog/requestConsiderDoc/requestConsiderDoc'\r\nimport ReportedNonconformance from './flow/reportedNonconformance/reportedNonconformance'\r\nimport constSubmittedType from '../../../constants/submittedType'\r\nimport CloseProjectEditAfterReview from './flow/closeProjectEditAfterReview/closeProjectEditAfterReview'\r\nimport TerminateProjectEditAfterReview from './flow/terminateProjectEditAfterReview/terminateProjectEditAfterReview'\r\nimport TerminateProjectByAdmin from './flow/terminateProjectByAdmin/terminateProjectByAdmin'\r\n\r\nimport RequestProjectRenewal from './flow/requestProjectRenewal/requestProjectRenewal'\r\nimport RequestProjectRenewalEditAfterReview from './flow/requestProjectRenewalEditAfterReview/requestProjectRenewalEditAfterReview'\r\nimport CloseProjectByAdmin from './flow/closeProjectByAdmin/closeProjectByAdmin'\r\n\r\nimport ProjectWithdrawal from './flow/projectWithdrawal/projectWithdrawal'\r\nimport SubmittedWithdrawal from './flow/submittedWithdrawal/submittedWithdrawal'\r\n\r\ntype ProjectManagerViewType = ReturnType & ProjectManagerType\r\nconst ProjectManagerView: React.FC = (props) => {\r\n const { dialogRequestConsiderDocRef, projectMode, projectData, onClickFolder, onRefDialog, configDialog } = props\r\n const classes = useStyles()\r\n const appFolderAndTabStore = useAppFolderAndTabStore()\r\n\r\n const renderFlow = () => {\r\n const submittedTypeID = projectData?.submitTypeInfo?.value\r\n switch (submittedTypeID) {\r\n case constSubmittedType.firstSubmitConsideration:\r\n case null:\r\n case undefined:\r\n return \r\n\r\n case constSubmittedType.editAfterReview:\r\n return \r\n\r\n case constSubmittedType.nextPhaseProject:\r\n return \r\n case constSubmittedType.renewalProject:\r\n return \r\n\r\n case constSubmittedType.amendmentProject:\r\n return \r\n case constSubmittedType.adverseEvent:\r\n return \r\n case constSubmittedType.nonconformance:\r\n return \r\n case constSubmittedType.exitAfterReview_AmendmentProject:\r\n return \r\n case constSubmittedType.closeProject:\r\n return \r\n case constSubmittedType.terminateProject:\r\n return \r\n case constSubmittedType.editAfterReview_nextPhaseProject:\r\n return \r\n case constSubmittedType.editAfterReview_closeProject:\r\n return \r\n case constSubmittedType.closeProjectByAdmin:\r\n return \r\n case constSubmittedType.editAfterReview_terminateProject:\r\n return \r\n case constSubmittedType.terminateProjectByAdmin:\r\n return \r\n case constSubmittedType.withdrawalProject:\r\n return \r\n case constSubmittedType.withdrawalSubmitted:\r\n return \r\n case constSubmittedType.editAfterReview_renewalProject:\r\n return \r\n default:\r\n return <>Other {projectData?.submitTypeInfo.value}\r\n }\r\n }\r\n return (\r\n \r\n {projectData && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n {/* */}\r\n \r\n {renderFlow()}\r\n \r\n {/* */}\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport type ProjectManagerType = {}\r\nconst ProjectManager: React.FC = (props) => {\r\n const projectManager = useProjectManager(props)\r\n return \r\n}\r\n\r\nexport default ProjectManager\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n}))\r\n","enum webFunction {\r\n manageProject = 1, //จัดการโครงการ\r\n manageExternalResearcher = 2, //จัดการข้อมูลนักวิจัยภายนอก\r\n manageCertificateAndStamp = 3, //จัดการใบรับรองและตราสำนักงาน\r\n manageREC = 4, //จัดการราายชื่อกลุ่มสหสถาบัน\r\n manageProjectSubmittedType = 5, //จัดการเอกสารยื่นโครงการแต่ละประเภท\r\n manageFaculty = 6, //จัดการคณะ / สำนักงาน / วิทยาลัยที่เกี่ยวข้องกับโครงการ\r\n manageEditResultOfConsideration = 7, //จัดการแก้ไขชื่อผลการพิจารณา\r\n manageUser = 8, //รายชื่อผู้ใช้งานระบบ\r\n dashboard = 9, //แดชบอร์ด\r\n manageExternalProject = 10, //จัดการโครงการนอกระบบก่อนปี 2565\r\n manageExpertises = 11, //จัดการความเชี่ยวชาญ\r\n manageCommittees = 12, //รายชื่อกรรมการ\r\n manageCheckList = 13, //จัดการรายการแบบฟอร์มความเห็นพิจารณาโครงการ(Checklist)\r\n manageResearcher = 14, //จัดการข้อมูลนักวิจัย\r\n preference = 99, //โปรไฟล์\r\n}\r\nexport default webFunction\r\n","import useCallApi from '../../utilities/axios'\r\nimport * as umServinceURL from '../um/umServiceURL'\r\nimport {\r\n DeleteExternalProjectResult,\r\n GetListAllResultType,\r\n InputAdd,\r\n NewExternalProjectResult,\r\n UpdateExternalProjectResult,\r\n} from './searchFormExternalProjectType'\r\n\r\ninterface KeywordSearch {\r\n keywordSearch?: string | null\r\n pageNo: number\r\n pageSize: number\r\n}\r\n\r\nconst useManageExternalProject = () => {\r\n const callApi = useCallApi()\r\n\r\n const getData = async (props: KeywordSearch) => {\r\n const { keywordSearch = null, pageNo = 1, pageSize = 10 } = props\r\n const { data } = await callApi.axiosPost({\r\n url: umServinceURL.getExternalProject,\r\n params: { keyword: keywordSearch, pageNo: pageNo, pageSize: pageSize },\r\n })\r\n return data.result\r\n }\r\n\r\n const postNewProject = async (props: InputAdd) => {\r\n const result = await callApi.axiosPost({\r\n url: umServinceURL.postExternalProject,\r\n params: { ...props },\r\n })\r\n return { result }\r\n }\r\n\r\n const editProject = async (props: InputAdd) => {\r\n const result = await callApi.axiosPost({\r\n url: umServinceURL.postExternalProject,\r\n params: { ...props },\r\n })\r\n return { result }\r\n }\r\n\r\n const deleteProject = async (props: number) => {\r\n const result = await callApi.axiosDelete({\r\n url: `${process.env.REACT_APP_CU_IRB_API_URL}/project/deleteProjectOutsource?projectID=${props}`,\r\n })\r\n return { result }\r\n }\r\n\r\n return { getData, postNewProject, editProject, deleteProject }\r\n}\r\n\r\nexport default useManageExternalProject\r\n","import { Grid, makeStyles } from '@material-ui/core'\r\nimport Button from '../../../../../control/button/button'\r\nimport { Form } from 'react-final-form'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport MyTextfield from '../../../../../control/textfield/textfield'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { SearchForm, SearchResult } from '../../../../../services/manageExternalProject/searchFormExternalProjectType'\r\nimport useManageExternalProject from '../../../../../services/manageExternalProject/useManageExternalProject'\r\n\r\nconst SearchFormExternalProject = (props: SearchResult) => {\r\n const { setData, keywordSearchRef, currentPageNoRef, allData } = props\r\n const onSearch = useManageExternalProject()\r\n const { loadingClose, loadingOpen } = useLoading()\r\n\r\n const translate = useTranslate()\r\n\r\n let keywordSearchPlaceholder: string = `${translate.get('LABEL.PROJECT_NAME')}, ${translate.get(\r\n 'LABEL.RESEARCHER_FL_NAME',\r\n )}, ${translate.get('LABEL.COA_NO')}`\r\n\r\n const classes = useStyles()\r\n\r\n const handleSubmit = async (values: SearchForm) => {\r\n try {\r\n loadingOpen()\r\n currentPageNoRef.current = 1\r\n const response = await onSearch.getData(values)\r\n setData(response.data)\r\n allData.current = response.total ?? 0\r\n keywordSearchRef.current = values.keywordSearch ? values.keywordSearch : ''\r\n } catch (error) {\r\n console.log(error)\r\n } finally {\r\n loadingClose()\r\n }\r\n }\r\n const onEnter = (val: { keywordSearch?: string; pageNo: number; pageSize: number }) => {\r\n handleSubmit(val)\r\n }\r\n\r\n return (\r\n {\r\n return (\r\n \r\n \r\n onEnter(values)}\r\n />\r\n \r\n \r\n \r\n {\r\n form.reset()\r\n handleSubmit()\r\n }}\r\n color=\"default\"\r\n type=\"button\"\r\n >\r\n {translate.get('BUTTON.RESET')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n />\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n padding: '15px',\r\n },\r\n btnGroup: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n },\r\n}))\r\n\r\nexport default SearchFormExternalProject\r\n","import { Button, Grid, makeStyles, Paper, Typography, IconButton, useMediaQuery, SvgIcon } from '@material-ui/core'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport { useTheme } from '@material-ui/core/styles'\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport { Delete } from '@material-ui/icons'\r\nimport { ReactComponent as DocumentIcon } from '../../../../../images/document.svg'\r\nimport { ResultSearchType } from '../../../../../services/manageExternalProject/searchFormExternalProjectType'\r\nimport useManageExternalProject from '../../../../../services/manageExternalProject/useManageExternalProject'\r\nimport { FC, useRef, useState } from 'react'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../../utilities/date'\r\nimport Dialog, { DialogType } from '../../../../../control/dialog/dialog'\r\nimport Tooltip from '../../../../../control/tooltip/tooltip'\r\nimport { GridRowData } from '@material-ui/data-grid'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\nimport { renderMode } from '../../../../../constants/constants'\r\nimport { encryptionAES } from '../../../../../utilities/encryption'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\n\r\ninterface ItemPropsExternal {\r\n dataItem: ResultSearchType\r\n getList: (projectID?: number) => void\r\n}\r\n\r\nconst ItemExternalProject: FC = ({ dataItem, getList }) => {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const { deleteProject } = useManageExternalProject()\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const dialogTwoRef = useRef>()\r\n const history = useHistory()\r\n const loadingHook = useLoading()\r\n\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('sm'))\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n const handleDelete = async () => {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_DELETE'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: async () => {\r\n loadingHook.loadingOpen()\r\n const response = await deleteProject(dataItem.projectID)\r\n if (response.result.status === 200) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.DELETE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n getList(dataItem.projectID)\r\n },\r\n })\r\n loadingHook.loadingClose()\r\n } else {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.DELETE_UNSUCCESS'),\r\n type: 'alert-message',\r\n })\r\n }\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const handleClickEdit = (row: GridRowData) => {\r\n const encryptedProjectID = encryptionAES(row.projectID)\r\n const idDraft = row.is_draft === 1 ? true : false\r\n\r\n const path = generatePath(RoutePath.manageExternalProjectFormEdit, {\r\n projectID: encryptedProjectID,\r\n })\r\n\r\n if (idDraft) {\r\n history.push({\r\n pathname: path,\r\n state: {\r\n irb: row.irb,\r\n mode: renderMode.edit,\r\n data: dataItem,\r\n },\r\n })\r\n } else {\r\n history.push({\r\n pathname: path,\r\n state: {\r\n irb: row.irb,\r\n mode: renderMode.view,\r\n data: dataItem,\r\n },\r\n })\r\n }\r\n }\r\n\r\n const itemExternalProject = () => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.EDIT')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('LABEL.COA_NO')}\r\n \r\n \r\n\r\n \r\n \r\n {dataItem.certificateID}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('LABEL.RESEARCHER_NAME')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n  {' '}\r\n \r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? dataItem.fullnameTH\r\n : dataItem.fullnameEN}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.get('LABEL.EXTERNAL_PROJECT_CREATION_DATE')}\r\n \r\n \r\n\r\n \r\n \r\n {translate.languageStore.currentLanguage === translate.languageKey.en\r\n ? convertDateToFormatEN(dataItem.certificateDate)\r\n : convertDateToFormatTH(dataItem.certificateDate)}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n )\r\n }\r\n\r\n const itemExternalProjectMobileView = () => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.COA_NO')}\r\n \r\n \r\n\r\n \r\n \r\n {dataItem.certificateID}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? dataItem.fullnameTH\r\n : dataItem.fullnameEN}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.EXTERNAL_PROJECT_CREATION_DATE')}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {translate.languageStore.currentLanguage === translate.languageKey.en\r\n ? convertDateToFormatEN(dataItem.certificateDate)\r\n : convertDateToFormatTH(dataItem.certificateDate)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n )\r\n }\r\n\r\n return isMobileView ? itemExternalProjectMobileView() : itemExternalProject()\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paper: {\r\n padding: '24px',\r\n marginBottom: '10px',\r\n marginRight: '0px',\r\n transition: '0.3s',\r\n borderRadius: '4px',\r\n position: 'relative',\r\n '&:hover': {\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n },\r\n btnEdit: {\r\n height: '44px',\r\n minWidth: '0px',\r\n borderRadius: '4px',\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n textAlign: 'center',\r\n marginRight: '10px',\r\n fontSize: '16px',\r\n },\r\n btnDelete: {\r\n height: '44px',\r\n minWidth: '0px',\r\n width: '64px',\r\n borderRadius: '4px',\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n textAlign: 'center',\r\n color: theme.palette.background.default,\r\n marginRight: '6vw',\r\n backgroundColor: theme.palette.secondary.main,\r\n fontSize: '16px',\r\n '&:hover': {\r\n backgroundColor: theme.palette.secondary.main,\r\n },\r\n },\r\n btnPopover: {\r\n minWidth: '0px',\r\n padding: '0px',\r\n backgroundColor: theme.palette.common.white,\r\n boxShadow: 'none',\r\n '&:hover': {\r\n backgroundColor: theme.palette.background.default,\r\n boxShadow: 'none',\r\n },\r\n },\r\n titleInCard: {\r\n border: 'unset',\r\n color: theme.palette.text.secondary,\r\n fontWeight: 400,\r\n },\r\n certificateDateTitle: {\r\n border: 'unset',\r\n color: theme.palette.text.secondary,\r\n fontWeight: 400,\r\n textAlign: 'end',\r\n },\r\n certificateDateTitleMobile: {\r\n border: 'unset',\r\n color: theme.palette.text.secondary,\r\n fontWeight: 400,\r\n textAlign: 'end',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n certificateDate: {\r\n textAlign: 'center',\r\n marginLeft: '25px',\r\n },\r\n coa: {\r\n border: 'unset',\r\n paddingLeft: '0px',\r\n },\r\n boxMobile: {\r\n marginLeft: '15px',\r\n textAlign: 'center',\r\n },\r\n}))\r\n\r\nexport default ItemExternalProject\r\n","import { Button, Grid, styled } from '@material-ui/core'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport ItemExternalProject from './ItemExternalProject'\r\nimport AddOutlinedIcon from '@material-ui/icons/AddOutlined'\r\nimport useRouter from '../../../../../router/useRouter'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { ResultSearchType } from '../../../../../services/manageExternalProject/searchFormExternalProjectType'\r\nimport { FC } from 'react'\r\n\r\nconst TitleResult = styled(Grid)({\r\n margin: '18px 0px',\r\n})\r\n\r\ninterface ResultPropsExternal {\r\n data: ResultSearchType[]\r\n allData: number\r\n getList: (projectID?: number) => void\r\n}\r\n\r\nconst ResultExternalProject: FC = ({ data, allData, getList }) => {\r\n const translate = useTranslate()\r\n const router = useRouter()\r\n\r\n const handleRoute = () => router.goTo(RoutePath.manageExternalProjectFormAdd)\r\n\r\n return (\r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${allData}`])}\r\n }\r\n >\r\n {translate.get('LABEL.ADD_PROJECT')}\r\n \r\n \r\n\r\n \r\n {data.map((item) => (\r\n \r\n ))}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default ResultExternalProject\r\n","import { Container, Grid } from '@material-ui/core'\r\nimport { FC, useEffect, useRef, useState } from 'react'\r\nimport SearchFormExternalProject from '../component/web/manageExternalProject/search/searchForm/SearchFormExternalProject'\r\nimport ResultExternalProject from '../component/web/manageExternalProject/search/searchResult/ResultExternalProject'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\nimport useLoading from '../control/loading/useLoading'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport { ResultSearchType } from '../services/manageExternalProject/searchFormExternalProjectType'\r\nimport useManageExternalProject from '../services/manageExternalProject/useManageExternalProject'\r\n\r\nconst ExternalProject: FC<{}> = () => {\r\n const [data, setData] = useState([])\r\n const { loadingOpen, loadingClose } = useLoading()\r\n const currentPageNoRef = useRef(1)\r\n const keywordSearchRef = useRef('')\r\n const sumResult = 10\r\n const allDataRef = useRef(0)\r\n\r\n const { getData } = useManageExternalProject()\r\n\r\n const translate = useTranslate()\r\n\r\n const handleScroll = () => {\r\n const divSearch = document.getElementById('boxSearch')\r\n if (isBottom(divSearch)) {\r\n window.removeEventListener('scroll', handleScroll)\r\n handleScrollEnd()\r\n setTimeout(() => {\r\n window.addEventListener('scroll', handleScroll, { passive: true })\r\n }, 1000)\r\n }\r\n }\r\n\r\n const isBottom = (el: any) => {\r\n return (\r\n el.getBoundingClientRect().bottom - window.innerHeight * 0.01 <= window.innerHeight && window.scrollY !== 0\r\n )\r\n }\r\n\r\n const handleScrollEnd = () => {\r\n currentPageNoRef.current = currentPageNoRef.current + 1\r\n getList()\r\n }\r\n\r\n const getList = async (projectID?: number) => {\r\n const param = {\r\n pageNo: currentPageNoRef.current,\r\n pageSize: sumResult,\r\n keywordSearch: keywordSearchRef.current || null,\r\n }\r\n loadingOpen()\r\n const res = await getData(param)\r\n if (projectID) {\r\n const cloneAllData = [...data]\r\n const idxData = cloneAllData.findIndex((item) => item.projectID === projectID)\r\n cloneAllData.splice(idxData, 1)\r\n setData(cloneAllData)\r\n } else {\r\n setData((prev) => [...prev, ...res.data])\r\n }\r\n allDataRef.current = res.total\r\n loadingClose()\r\n }\r\n\r\n useEffect(() => {\r\n getList()\r\n window.addEventListener('scroll', handleScroll, { passive: true })\r\n return () => {\r\n window.removeEventListener('scroll', handleScroll)\r\n }\r\n }, [])\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default ExternalProject\r\n","import useLoading from \"../../control/loading/useLoading\"\r\nimport useCallApi from \"../../utilities/axios\"\r\nimport { getVerifyDocumentHistory } from \"./webServiceURL\"\r\n\r\nconst useVerifyDocument = () => {\r\n const callApi = useCallApi()\r\n const loadingHook = useLoading()\r\n \r\n const getVerifyHistory = async (submittedId: number, submittedTypeId: number) => {\r\n try {\r\n loadingHook.loadingOpen()\r\n const apiUrl = `${getVerifyDocumentHistory}/${submittedId}/${submittedTypeId}`\r\n const { data } = await callApi.axiosGet({\r\n url: apiUrl\r\n })\r\n return data\r\n } catch(error) {\r\n /** Must Not Empty */\r\n } finally {\r\n loadingHook.loadingClose()\r\n }\r\n }\r\n\r\n return {\r\n getVerifyHistory\r\n }\r\n}\r\n\r\nexport default useVerifyDocument","import { Card, CardContent, CardHeader, Container, Grid, styled, Typography } from '@material-ui/core'\r\nimport { FC, useEffect, useState } from 'react'\r\nimport { generatePath, useHistory, useLocation, useRouteMatch } from 'react-router-dom'\r\nimport { ButtonClose } from '../component/web/project/page/pageAction'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport { RoutePath } from '../router/routesConfig'\r\nimport useVerifyDocument from '../services/web/useVerifyDocument'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../utilities/date'\r\nimport { decryptionAES, encryptionAES } from '../utilities/encryption'\r\n\r\ntype MatchParams = {\r\n projectData: string\r\n}\r\n\r\nconst CustomHeader = styled(CardHeader)({\r\n borderBottom: '1px solid #DCDCDC',\r\n})\r\n\r\nconst CustomUnderlineGrid = styled(Grid)({\r\n borderBottom: '1px solid #DCDCDC',\r\n})\r\n\r\ntype VerifiedInfo = {\r\n docStatus: { [key: string]: string }\r\n updatedDate: { [key: string]: string }\r\n verifyDocRemark: string\r\n uniqueId: number\r\n statusColor: string\r\n rowNo: string\r\n}\r\n\r\nconst DocumentVerifyHistory: FC<{}> = () => {\r\n const { state } = useLocation()\r\n const history = useHistory()\r\n const matchPath = useRouteMatch(RoutePath.documentVerifyHistory)\r\n const encryptedProjectData = matchPath ? matchPath.params.projectData : null\r\n const projectData = encryptedProjectData ? JSON.parse(decryptionAES(encryptedProjectData)) : null\r\n const { getVerifyHistory } = useVerifyDocument()\r\n const { projectID, submittedID, submittedTypeID } = projectData\r\n const translate = useTranslate()\r\n const [verifiedInfo, setVerifiedInfo] = useState([])\r\n const [projectInfo, setProjectInfo] = useState<{ [key: string]: any }>({\r\n th: {\r\n researcherName: '',\r\n projectName: '',\r\n projectType: '',\r\n },\r\n en: {\r\n researcherName: '',\r\n projectName: '',\r\n projectType: '',\r\n },\r\n })\r\n\r\n const getDocumentVerifyHistory = async () => {\r\n const response = await getVerifyHistory(submittedID, submittedTypeID)\r\n response && initialData(response?.result)\r\n }\r\n\r\n const initialData = (data: any) => {\r\n if (data) {\r\n const firstRow = data.projectInfo\r\n setProjectInfo({\r\n th: {\r\n researcherName: firstRow.researcherNameTH ?? '-',\r\n projectName: firstRow.projectNameTH ?? '-',\r\n projectType: firstRow.projectTypeTH ?? '-',\r\n },\r\n en: {\r\n researcherName: firstRow.researcherNameEN ?? '-',\r\n projectName: firstRow.projectNameEN ?? '-',\r\n projectType: firstRow.projectTypeEN ?? '-',\r\n },\r\n })\r\n const formatVerifiedData = data?.historyList?.map((verifiedData: any) => {\r\n return {\r\n docStatus: {\r\n th: verifiedData.verify_doc_name_th,\r\n en: verifiedData.verify_doc_name_en,\r\n },\r\n updatedDate: {\r\n th: verifiedData.history_updated_date\r\n ? convertDateToFormatTH(verifiedData.history_updated_date)\r\n : '-',\r\n en: verifiedData.history_updated_date\r\n ? convertDateToFormatEN(verifiedData.history_updated_date)\r\n : '-',\r\n },\r\n verifyDocRemark: verifiedData.verify_doc_remark,\r\n uniqueId: verifiedData.history_id,\r\n statusColor: verifiedData.verify_doc_color,\r\n rowNo: verifiedData.row_no ?? '-',\r\n }\r\n })\r\n setVerifiedInfo(formatVerifiedData)\r\n }\r\n }\r\n\r\n const handleClose = () => {\r\n const encryptedProjectID = encryptionAES(projectID)\r\n const encryptedSubmittedID = encryptionAES(submittedID)\r\n\r\n const path = generatePath(RoutePath.manageProjectEdit, {\r\n projectID: encryptedProjectID,\r\n submittedID: encryptedSubmittedID,\r\n })\r\n\r\n history.push({\r\n pathname: path,\r\n state: state,\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n getDocumentVerifyHistory()\r\n }, [])\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.DOCUMENT_VERIFICATION_HISTORY')}\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.RESEARCHER_FL_NAME')} :{' '}\r\n {projectInfo[translate.languageStore.currentLanguage].researcherName ?? '-'}\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.PROJECT_TYPE')} :{' '}\r\n {projectInfo[translate.languageStore.currentLanguage].projectType ?? '-'}\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.PROJECT_NAME')} :{' '}\r\n {projectInfo[translate.languageStore.currentLanguage].projectName ?? '-'}\r\n \r\n \r\n \r\n {verifiedInfo.map((data) => (\r\n \r\n \r\n  \r\n \r\n \r\n
\r\n                                        \r\n                                            {translate.get('LABEL.DOCUMENT_VERIFICATION_RESULT_TIMES', [data.rowNo])}\r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.STATUS')} :{' '}\r\n                                            \r\n                                                {data.docStatus[translate.languageStore.currentLanguage] ?? '-'}\r\n                                            \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.SPECIFIED_REASON_DATE')} :{' '}\r\n                                            {data.updatedDate[translate.languageStore.currentLanguage] ?? '-'}\r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.REASON')} : {data.verifyDocRemark ?? '-'}\r\n                                        \r\n                                    \r\n                                \r\n                            ))}\r\n                        \r\n                    \r\n                \r\n                \r\n                    \r\n                        \r\n                    \r\n                \r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default DocumentVerifyHistory\r\n","import useCallApi from '../../../utilities/axios'\r\nimport * as umServinceURL from '../../../services/um/umServiceURL'\r\nimport { useEffect, useState } from 'react'\r\n\r\nconst useResearcherType = () => {\r\n    const callApi = useCallApi()\r\n    const [researcherType, setResearcherType] = useState([])\r\n\r\n    const getResearcher = async () => {\r\n        try {\r\n            const { data } = await callApi.axiosGet({\r\n                url: umServinceURL.getResearcherType,\r\n            })\r\n            setResearcherType(data.result)\r\n        } catch (error) {\r\n            console.log('error', error)\r\n        }\r\n    }\r\n\r\n    useEffect(() => {\r\n        getResearcher()\r\n    }, [])\r\n\r\n    return { researcherType }\r\n}\r\n\r\nexport default useResearcherType\r\n","import { Dispatch, MutableRefObject, SetStateAction } from 'react'\r\n\r\nexport type SearchResult = {\r\n    setData: Dispatch>\r\n    keywordSearchRef: MutableRefObject\r\n    currentPageNoRef: MutableRefObject\r\n    allData: MutableRefObject\r\n}\r\n\r\nexport type ResultSearchType = {\r\n    projectID: number\r\n    createDate: string\r\n    irb: number\r\n    reseacherType: number\r\n    academicLevel: number\r\n    educationLevel: number | null\r\n    prefixId: number\r\n    titleNameOtherTh: string\r\n    titleNameOtherEh: string\r\n    nameTH: string\r\n    nameEN: string\r\n    fullnameTH: string\r\n    fullnameEN: string\r\n    projectNameTh: string\r\n    projectNameEn: string\r\n    isPhd: null\r\n    certificateID: string\r\n    otherAcademicLevelTh: string\r\n    otherAcademicLevelEn: string\r\n    certificateDate: string\r\n}\r\n\r\nexport type SearchForm = {\r\n    keywordSearch?: string\r\n    pageNo: number\r\n    pageSize: number\r\n}\r\n\r\nexport type InputAdd = {\r\n    projectID: string | null\r\n    researcherType: number\r\n    academicLevel: number | null\r\n    educationLevel: number | null\r\n    prefixID: number\r\n    titleNameOtherTh?: string | null\r\n    titleNameOtherEn?: string | null\r\n    nameTh: string\r\n    nameEn: string\r\n    projectNameTh: string\r\n    projectNameEn: string\r\n    isPhd: boolean\r\n    certificateDate: string\r\n    otherAcademicLevelTh?: string | null\r\n    otherAcademicLevelEn?: string | null\r\n    certificateID: string\r\n}\r\n\r\nexport type ListRequestType = {\r\n    keywordSearch?: string\r\n    pageNo: number\r\n    pageSize: number\r\n}\r\n\r\nexport type GetListAllResultType = {\r\n    status: number\r\n    message: string\r\n    result: {\r\n        data: ResultSearchType[]\r\n        total: number\r\n    }\r\n}\r\n\r\nexport type NewExternalProjectResult = {\r\n    status: number\r\n    message: string\r\n    result: {\r\n        projectID: number\r\n        certificateID: string\r\n    }\r\n}\r\n\r\nexport type UpdateExternalProjectResult = {\r\n    status: number\r\n    message: string\r\n    result: null\r\n}\r\n\r\nexport type DeleteExternalProjectResult = {\r\n    status: number\r\n    message: string\r\n    result: null\r\n}\r\n\r\nexport enum ResearcherType {\r\n    student = '1',\r\n    teacher = '2', // นักวิจัย/อาจารย์\r\n}\r\n","import { Form, FormSpy } from 'react-final-form'\r\nimport { InfoOutlined } from '@material-ui/icons'\r\nimport { Button, Grid, IconButton, makeStyles, Paper, Typography } from '@material-ui/core'\r\nimport MyTextfield from '../../../../../control/textfield/textfield'\r\nimport MyDatePicker from '../../../../../control/datepicker/datepicker'\r\nimport MySelectCtrl from '../../../../../control/select/select'\r\nimport MyCheckbox from '../../../../../control/checkbox/checkbox'\r\nimport useTranslate from '../../../../../i18n/useTranslate'\r\nimport useRouter from '../../../../../router/useRouter'\r\nimport Tooltip from '../../../../../control/tooltip/tooltip'\r\nimport useTitleName from '../../../../../services/um/lookups/useTitleName'\r\nimport usePosition from '../../../../../services/um/lookups/usePosition'\r\nimport { selectRequired, textRequired } from '../../../../../utilities/validate'\r\nimport useResearcherType from '../../../../../services/um/lookups/useResearcherType'\r\nimport { useEffect, useRef, useState } from 'react'\r\nimport Dialog, { DialogType } from '../../../../../control/dialog/dialog'\r\nimport useAppFolderAndTabAction from '../../../../../stores/appFolderAndTab/appFolderAndTabAction'\r\nimport { InputAdd, ResearcherType } from '../../../../../services/manageExternalProject/searchFormExternalProjectType'\r\nimport useManageExternalProject from '../../../../../services/manageExternalProject/useManageExternalProject'\r\nimport useLoading from '../../../../../control/loading/useLoading'\r\nimport { RoutePath } from '../../../../../router/routesConfig'\r\nimport { useLocation } from 'react-router-dom'\r\nimport moment from 'moment'\r\nimport useLookupService from '../../../../../services/lookup/useLookupService'\r\n\r\ninterface dataLookUp {\r\n    id: number\r\n    name_th: string\r\n    name_en: string\r\n}\r\n\r\ninterface LocaitonDataProps {\r\n    data: InputAdd\r\n}\r\n\r\nconst FormAddExternalProject = () => {\r\n    const [configDialog, setConfigDialog] =\r\n        useState>()\r\n    const [initialValueForm, setInitialValueForm] = useState()\r\n    const [educationList, setEducationList] = useState<{ label: string; value: string }[]>([])\r\n    const dialogTwoRef = useRef>()\r\n    const translate = useTranslate()\r\n    const classes = useStyles()\r\n    const router = useRouter()\r\n    const { state } = useTitleName()\r\n    const { position } = usePosition()\r\n    const { researcherType } = useResearcherType()\r\n    const appFolderAndTabAction = useAppFolderAndTabAction()\r\n    const { postNewProject, editProject } = useManageExternalProject()\r\n    const { loadingClose, loadingOpen } = useLoading()\r\n    const location = useLocation()\r\n    const certificateIDRef = useRef()\r\n    const defaultDate = moment(new Date()).format('YYYY-MM-DD')\r\n    const callLookup = useLookupService()\r\n\r\n    const lang = translate.languageStore.currentLanguage as 'th' | 'en'\r\n\r\n    const prefixName = state.map((item: dataLookUp) => {\r\n        return {\r\n            value: item.id.toString(),\r\n            label: lang === 'en' ? item.name_en : item.name_th,\r\n        }\r\n    })\r\n    const positionName = position.map((item: dataLookUp) => {\r\n        return {\r\n            value: item.id.toString(),\r\n            label: lang === 'en' ? item.name_en : item.name_th,\r\n        }\r\n    })\r\n    const researcher = researcherType.map((item: dataLookUp) => {\r\n        return {\r\n            value: item.id.toString(),\r\n            label: lang === 'en' ? item.name_en : item.name_th,\r\n        }\r\n    })\r\n    const educationLevel = async () => {\r\n        const res = await callLookup.getEducationLevel()\r\n        const formatData = res.result.map((itm) => {\r\n            return {\r\n                label: translate.languageStore.currentLanguage === translate.languageKey.th ? itm.name_th : itm.name_en,\r\n                value: `${itm.id}`,\r\n            }\r\n        })\r\n        setEducationList(formatData)\r\n    }\r\n    const handleAfterCloseCreateSuccess = () => {\r\n        setConfigDialog({})\r\n        router.goTo(RoutePath.manageExternalProject)\r\n    }\r\n\r\n    const handleSubmit = (values: InputAdd) => {\r\n        setConfigDialog({\r\n            title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n            content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n            type: 'alert-confirm',\r\n\r\n            onClickConfirm: async () => {\r\n                try {\r\n                    loadingOpen()\r\n                    if (location.pathname.includes('/add')) {\r\n                        const allValue = {\r\n                            ...values,\r\n                            projectID: null,\r\n                        }\r\n                        const response = await postNewProject(allValue)\r\n                        if (response.result.status === 201) {\r\n                            certificateIDRef.current = response.result.data.result.certificateID\r\n                            setConfigDialog({\r\n                                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                                content: (\r\n                                    <>\r\n                                        

{`${translate.get('ALERT.CONTENT.SAVE_SUCCESS')} ${translate.get(\r\n 'LABEL.COA_NO',\r\n )}: \"${certificateIDRef.current}\"`}

\r\n \r\n ),\r\n type: 'alert-message',\r\n onAfterClose: handleAfterCloseCreateSuccess,\r\n })\r\n }\r\n } else {\r\n const allValuseEdit: InputAdd = { ...values, projectID: String(initialValueForm?.projectID) }\r\n const response = await editProject(allValuseEdit)\r\n if (response.result.status === 201) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'alert-message',\r\n onAfterClose: () => {\r\n setConfigDialog({})\r\n router.goTo(RoutePath.manageExternalProject)\r\n },\r\n })\r\n }\r\n }\r\n } catch (error) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.WARNING'),\r\n content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n type: 'alert-message',\r\n })\r\n console.log(error)\r\n } finally {\r\n loadingClose()\r\n }\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const handleToManageExternalPage = (dirty: Boolean) => {\r\n if (location.pathname.includes('/edit')) {\r\n dirty = true\r\n }\r\n if (dirty) {\r\n setConfigDialog({\r\n title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n content: translate.get('ALERT.CONTENT.NEED_TO_CANCEL'),\r\n type: 'alert-confirm',\r\n\r\n onClickConfirm: () => {\r\n router.goTo(RoutePath.manageExternalProject)\r\n },\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n } else {\r\n router.goTo(RoutePath.manageExternalProject)\r\n }\r\n }\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const handleDirtyChange = (props: any) => {\r\n appFolderAndTabAction.setTabDirty(props.dirty)\r\n }\r\n\r\n const formattingInitialData = () => {\r\n if (location.state?.data) {\r\n const initialValue = {\r\n ...location.state?.data,\r\n }\r\n setInitialValueForm(initialValue)\r\n } else {\r\n const initialValue = {\r\n ...location.state?.data,\r\n certificateDate: defaultDate,\r\n }\r\n setInitialValueForm(initialValue)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n formattingInitialData()\r\n educationLevel()\r\n }, [])\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.EXTERNAL_PROJECT_MANAGEMENT')}\r\n \r\n \r\n\r\n {\r\n const isShowEducationLevel = String(values?.researcherType) === ResearcherType.student\r\n const isShowOtherAcademicLevel = String(values?.academicLevel) !== '6'\r\n const isShowOtherPrefix = String(values?.prefixID) !== '5'\r\n\r\n const handleChangeResearcherType = (val: string) => {\r\n if (val === '1') {\r\n form.change('academicLevel', null)\r\n form.change('otherAcademicLevelTh', null)\r\n form.change('otherAcademicLevelEn', null)\r\n } else {\r\n form.change('educationLevel', null)\r\n }\r\n }\r\n const handleChangeTitleName = (val: string) => {\r\n if (val !== '5') {\r\n form.change('titleNameOtherTh', null)\r\n form.change('titleNameOtherEn', null)\r\n }\r\n }\r\n const handleChangeAcademicLevel = (val: string) => {\r\n if (val !== '6') {\r\n form.change('otherAcademicLevelTh', null)\r\n form.change('otherAcademicLevelEn', null)\r\n }\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n {isShowEducationLevel && (\r\n \r\n \r\n \r\n )}\r\n \r\n\r\n {!isShowEducationLevel && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n required\r\n option={[...positionName]}\r\n validates={[selectRequired(translate.get('MESSAGE.M016'))]}\r\n defaultValue={[String(initialValueForm?.academicLevel)]}\r\n onChangeSelect={handleChangeAcademicLevel}\r\n />\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n option={[...prefixName]}\r\n required\r\n validates={[selectRequired(translate.get('MESSAGE.M016'))]}\r\n defaultValue={[String(values.prefixID)]}\r\n onChangeSelect={handleChangeTitleName}\r\n />\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n handleToManageExternalPage(dirty)}\r\n size=\"small\"\r\n >\r\n {translate.get('BUTTON.CLOSE')}\r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paper: {\r\n marginTop: '15px',\r\n marginBottom: '15px',\r\n },\r\n inbox: {\r\n padding: '10px 15px',\r\n },\r\n title: {\r\n fontWeight: 'bold',\r\n padding: '20px',\r\n borderBottom: '1px solid rgba(0, 0, 0, 0.12)',\r\n },\r\n fullInput: {\r\n paddingRight: '10px',\r\n paddingLeft: '20px',\r\n },\r\n btnSave: {\r\n marginLeft: '20px',\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n fontSize: '16px',\r\n },\r\n btnClose: {\r\n boxShadow: 'none',\r\n width: '114px',\r\n heigth: '40px',\r\n fontSize: '16px',\r\n },\r\n containerForm: {\r\n padding: '20px 35px',\r\n },\r\n boxBtn: {\r\n padding: '20px 10px 20px 0px',\r\n },\r\n infoIcon: {\r\n fontSize: '18px',\r\n },\r\n}))\r\n\r\nexport default FormAddExternalProject\r\n","import { Container, Grid } from '@material-ui/core'\r\nimport FormAddExternalProject from '../component/web/manageExternalProject/search/addExternalProject/FormAddExternalProject'\r\n\r\nconst AddExternalProject = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default AddExternalProject\r\n","import { Card, CardContent, CardHeader, Container, Grid, styled, Typography } from '@material-ui/core'\r\nimport { FC, useEffect, useState } from 'react'\r\nimport { useHistory, useRouteMatch } from 'react-router-dom'\r\nimport pendingStatus from '../../../../constants/pendingStatus'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport { RoutePath } from '../../../../router/routesConfig'\r\nimport useWebService from '../../../../services/web/useWebService'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../utilities/date'\r\nimport { decryptionAES } from '../../../../utilities/encryption'\r\nimport { ButtonClose } from '../../project/page/pageAction'\r\n\r\nconst CustomHeader = styled(CardHeader)({\r\n borderBottom: '1px solid #DCDCDC',\r\n})\r\n\r\nconst CustomUnderlineGrid = styled(Grid)({\r\n borderBottom: '1px solid #DCDCDC',\r\n})\r\n\r\nconst PendingHistory: FC<{}> = () => {\r\n const translate = useTranslate()\r\n const webServiceHook = useWebService()\r\n const history = useHistory()\r\n const matchPath = useRouteMatch<{ projectData: string }>(RoutePath.projectPendingHistory)\r\n const encryptedProjectData = matchPath ? matchPath.params.projectData : null\r\n const projectData = encryptedProjectData ? JSON.parse(decryptionAES(encryptedProjectData)) : null\r\n const [historyInfo, setHistoryInfo] = useState([])\r\n\r\n const getPendingHistory = async () => {\r\n /** Call service */\r\n const response = await webServiceHook.getHistoryPendingAndResume(Number(projectData?.submittedID))\r\n if (response?.result && response?.status === 1) {\r\n setHistoryInfo(\r\n response.result.map((data: any) => ({\r\n th: {\r\n statusName: data.status_name_th,\r\n updatedDate: data.updated_date ? convertDateToFormatTH(data.updated_date) : '-',\r\n },\r\n en: {\r\n statusName: data.status_name_en,\r\n updatedDate: data.updated_date ? convertDateToFormatEN(data.updated_date) : '-',\r\n },\r\n remark: data.remarks,\r\n statusColor: data.status_id === pendingStatus.pending ? '#000000' : '#379956',\r\n rowNo: data.row_no ?? '-',\r\n })),\r\n )\r\n }\r\n }\r\n\r\n const handleClose = () => {\r\n history.push(RoutePath.manageProject)\r\n }\r\n\r\n useEffect(() => {\r\n getPendingHistory()\r\n }, [])\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.PENDING_HISTORY')}}\r\n />\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.RESEARCHER_FL_NAME')} :{' '}\r\n {projectData[translate.languageStore.currentLanguage].researcherName ?? '-'}\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.PROJECT_TYPE')} :{' '}\r\n {projectData[translate.languageStore.currentLanguage].submitTypeName ?? '-'}\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.PROJECT_NAME')} :{' '}\r\n {projectData[translate.languageStore.currentLanguage].projectName ?? '-'}\r\n \r\n \r\n \r\n {historyInfo.map((data, index) => (\r\n \r\n \r\n  \r\n \r\n \r\n
\r\n                                        \r\n                                            {translate.get('LABEL.RESULT_TIMES', [data.rowNo])}\r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.STATUS')} :{' '}\r\n                                            \r\n                                                {data[translate.languageStore.currentLanguage].statusName ?? '-'}\r\n                                            \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.CHANGED_DATE')} :{' '}\r\n                                            {data[translate.languageStore.currentLanguage].updatedDate ?? '-'}\r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.REASON')} : {data.remark ?? '-'}\r\n                                        \r\n                                    \r\n                                \r\n                            ))}\r\n                        \r\n                    \r\n                \r\n                \r\n                    \r\n                        \r\n                    \r\n                \r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default PendingHistory\r\n","import { Card, CardContent, CardHeader, Container, Grid, styled, Typography } from '@material-ui/core'\r\nimport { FC, useEffect, useState } from 'react'\r\nimport { generatePath, useHistory, useLocation, useRouteMatch } from 'react-router-dom'\r\nimport useLoading from '../../../../control/loading/useLoading'\r\nimport useTranslate from '../../../../i18n/useTranslate'\r\nimport { RoutePath } from '../../../../router/routesConfig'\r\nimport { ConsiderHistoryInfo } from '../../../../services/web/types/responseWebServiceTypes'\r\nimport useWebService from '../../../../services/web/useWebService'\r\nimport { convertDateToFormatEN, convertDateToFormatTH } from '../../../../utilities/date'\r\nimport { decryptionAES, encryptionAES } from '../../../../utilities/encryption'\r\nimport { ButtonClose } from '../../project/page/pageAction'\r\n\r\ntype MatchParams = {\r\n    projectData: string\r\n}\r\n\r\nconst CustomHeader = styled(CardHeader)({\r\n    borderBottom: '1px solid #DCDCDC',\r\n})\r\n\r\nconst CustomUnderlineGrid = styled(Grid)({\r\n    borderBottom: '1px solid #DCDCDC',\r\n})\r\n\r\nconst ConsiderTypeHistory: FC<{}> = () => {\r\n    const translate = useTranslate()\r\n    const webServiceHook = useWebService()\r\n    const history = useHistory()\r\n    const matchPath = useRouteMatch(RoutePath.considerTypeHistory)\r\n    const encryptedProjectData = matchPath ? matchPath.params.projectData : null\r\n    const projectData = encryptedProjectData ? JSON.parse(decryptionAES(encryptedProjectData)) : null\r\n    const { projectID, submittedID } = projectData\r\n    const { state } = useLocation()\r\n    const [historyInfo, setHistoryInfo] = useState()\r\n    const loadingHook = useLoading()\r\n\r\n    const initialData = async () => {\r\n        loadingHook.loadingOpen()\r\n        const response = await webServiceHook.getConsiderTypeHistory(submittedID)\r\n        if (response.data && response.data?.status === 1) {\r\n            setHistoryInfo(response.data.result)\r\n        }\r\n        loadingHook.loadingClose()\r\n    }\r\n\r\n    const renderLanguages = (data: any, thKey: string, enKey: string) => {\r\n        return translate.languageStore.currentLanguage === 'th' ? data?.[thKey] : data?.[enKey]\r\n    }\r\n\r\n    const renderDate = (data: any, key: string) => {\r\n        let formatDate = '-'\r\n        const isTH = translate.languageStore.currentLanguage === 'th'\r\n        if (isTH && data?.[key]) {\r\n            formatDate = convertDateToFormatTH(data?.[key])\r\n        } else if (!isTH && data?.[key]) {\r\n            formatDate = convertDateToFormatEN(data?.[key])\r\n        }\r\n        return formatDate\r\n    }\r\n\r\n    useEffect(() => {\r\n        initialData()\r\n    }, [])\r\n\r\n    const handleClose = () => {\r\n        const encryptedProjectID = encryptionAES(projectID)\r\n        const encryptedSubmittedID = encryptionAES(submittedID)\r\n\r\n        const path = generatePath(RoutePath.manageProjectEdit, {\r\n            projectID: encryptedProjectID,\r\n            submittedID: encryptedSubmittedID,\r\n        })\r\n\r\n        history.push({\r\n            pathname: path,\r\n            state: state,\r\n        })\r\n    }\r\n\r\n    return (\r\n        \r\n            \r\n                \r\n                    \r\n                        {translate.get('LABEL.CONSIDER_TYPE_HISTORY')}}\r\n                        />\r\n                        \r\n                            {(historyInfo?.modifiedInfo ?? []).map((data, index) => (\r\n                                \r\n                                    {index !== 0 && (\r\n                                        \r\n                                             \r\n                                        \r\n                                    )}\r\n                                    \r\n                                        { index !== 0 && 
}\r\n                                        \r\n                                            {translate.get('LABEL.RESULT_TIMES', [`${data.rowNo}`])}\r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.PROJECT_TYPE')} :{' '}\r\n                                            \r\n                                                {renderLanguages(data, 'considerNameTH', 'considerNameEN') ?? '-'}\r\n                                            \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.CHANGED_DATE')} : {renderDate(data, 'updatedDate')}\r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.FILE_UPLOAD_BY')} :{' '}\r\n                                            {renderLanguages(data, 'updatedNameTH', 'updatedNameEN') ?? '-'}\r\n                                        \r\n                                    \r\n                                \r\n                            ))}\r\n                        \r\n                    \r\n                \r\n                \r\n                    \r\n                        \r\n                    \r\n                \r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default ConsiderTypeHistory\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const useExpertiseStyles = makeStyles((theme) => ({\r\n    item: {\r\n        width: '100%',\r\n        padding: theme.spacing(3),\r\n        margin: theme.spacing(2, 0),\r\n        // border: '1px solid #bdbdbd',\r\n        '&:hover': {\r\n            border: `1px solid ${theme.palette.primary.main}`,\r\n        },\r\n    },\r\n    icon: {\r\n        marginRight: theme.spacing(1),\r\n        width: 40,\r\n        height: 40,\r\n        backgroundColor: '#ece9e9',\r\n        transition: '0.3s',\r\n        '&:hover': {\r\n            backgroundColor: theme.palette.primary.main,\r\n            color: '#fff',\r\n        },\r\n    },\r\n    recentTime: {\r\n        position: 'absolute',\r\n        top: 2,\r\n        right: 4,\r\n        color: 'grey',\r\n    },\r\n\r\n    header: {\r\n        fontWeight: 'bold',\r\n    },\r\n    btnEdit: {\r\n        boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n        height: '44px',\r\n        marginRight: '1px',\r\n    },\r\n    btnDelete: {\r\n        boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n        height: '45px',\r\n        marginRight: '1px',\r\n        marginBottom: '-2px',\r\n        backgroundColor: theme.palette.secondary.main,\r\n        color: theme.palette.background.default,\r\n        '&:hover': {\r\n            backgroundColor: theme.palette.secondary.main,\r\n        },\r\n    },\r\n    multiLineEllipsis: {\r\n        maxWidth: '100%',\r\n        whiteSpace: 'pre-wrap',\r\n        overflow: 'hidden',\r\n        textOverflow: 'ellipsis',\r\n        display: '-webkit-box',\r\n        '-webkit-line-clamp': 1,\r\n        '-webkit-box-orient': 'vertical',\r\n    },\r\n}))","import {\r\n    addExpertisesLUT,\r\n    deleteLutExpertisesByID,\r\n    getExpertisesDetailByID,\r\n    getExpertisesLUT as getLUT,\r\n    searchExpertisesLUT as searchLUT,\r\n    updateExpertisesLUT,\r\n} from '../../../services/lookup/lookupServiceURL'\r\nimport useCallApi from '../../../utilities/axios'\r\n\r\nconst useExpertises = () => {\r\n    const callApi = useCallApi()\r\n\r\n    const getExpertisesLUT = async () => {\r\n        const response = await callApi.axiosGet({\r\n            url: getLUT,\r\n        })\r\n        return response?.data\r\n    }\r\n\r\n    const searchExpertisesLUT = async (keyword: string | null) => {\r\n        const response = await callApi.axiosPost({\r\n            url: searchLUT,\r\n            params: {\r\n                keyword,\r\n            },\r\n        })\r\n        return response?.data\r\n    }\r\n\r\n    const getExpertiseByID = async (expertiseID: number) => {\r\n        const response = await callApi.axiosGet({\r\n            url: `${getExpertisesDetailByID}/${expertiseID}`,\r\n        })\r\n        return response?.data\r\n    }\r\n\r\n    const deleteExpertiseByID = async (expertiseID: number) => {\r\n        const response = await callApi.axiosDelete({\r\n            url: `${deleteLutExpertisesByID}/${expertiseID}`,\r\n        })\r\n        return response?.data\r\n    }\r\n\r\n    const updateExpertiseLUT = async (expertiseID: number, nameTH: string, nameEN: string) => {\r\n        const response = await callApi.axiosPut({\r\n            url: updateExpertisesLUT,\r\n            params: {\r\n                expertiseID,\r\n                nameTH,\r\n                nameEN,\r\n            },\r\n        })\r\n        return response?.data\r\n    }\r\n\r\n    const addExpertiseLUT = async (nameTH: string, nameEN: string) => {\r\n        const response = await callApi.axiosPost({\r\n            url: addExpertisesLUT,\r\n            params: {\r\n                nameTH,\r\n                nameEN,\r\n            },\r\n        })\r\n        return response?.data\r\n    }\r\n\r\n    return {\r\n        getExpertisesLUT,\r\n        searchExpertisesLUT,\r\n        getExpertiseByID,\r\n        deleteExpertiseByID,\r\n        updateExpertiseLUT,\r\n        addExpertiseLUT,\r\n    }\r\n}\r\n\r\nexport default useExpertises\r\n","import Grid from '@material-ui/core/Grid'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport { FC, useRef } from 'react'\r\nimport { SearchExpertisesLUT } from '../../../services/web/types/responseWebServiceTypes'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { ButtonView } from '../../../control/button/button'\r\nimport AddIcon from '@material-ui/icons/Add'\r\nimport Button from '@material-ui/core/Button'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../router/routesConfig'\r\nimport { useExpertiseStyles } from './expertiseShareStyle'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport useLoading from '../../../control/loading/useLoading'\r\nimport useExpertises from '../shareLogic/useExpertises'\r\nimport { useForm } from 'react-final-form'\r\n\r\nconst SearchExpertisesResults: FC<{ searchResult: SearchExpertisesLUT[] }> = ({ searchResult }) => {\r\n    const classes = useExpertiseStyles()\r\n    const translate = useTranslate()\r\n    const history = useHistory()\r\n    const dialogDeleteRef = useRef>()\r\n    const successRef = useRef>()\r\n    const inUsedRef = useRef>()\r\n    const idRef = useRef()\r\n    const loadingHook = useLoading()\r\n    const expertiseHook = useExpertises()\r\n    const form = useForm()\r\n\r\n    const handleEdit = (id: number) => {\r\n        /** EDIT */\r\n        history.push(RoutePath.expertisesEdit.replace(':id', `${id}`))\r\n    }\r\n\r\n    const handleDelete = async () => {\r\n        /** DELETE */\r\n        dialogDeleteRef.current?.closeDialog()\r\n        loadingHook.loadingOpen()\r\n        if (idRef.current) {\r\n            await expertiseHook.deleteExpertiseByID(idRef.current).then((data) => {\r\n                if (data.status === 1) {\r\n                    successRef.current?.openDialog()\r\n                } else {\r\n                    inUsedRef.current?.openDialog()\r\n                }\r\n            })\r\n        }\r\n        loadingHook.loadingClose()\r\n    }\r\n\r\n    const openConfirmDelete = (id: number) => {\r\n        idRef.current = id\r\n        dialogDeleteRef.current?.openDialog()\r\n    }\r\n\r\n    const handleAdd = () => {\r\n        /** ADD */\r\n        history.push(RoutePath.expertisesAdd)\r\n    }\r\n\r\n    const bindDeleteRef = (func: Record) => {\r\n        dialogDeleteRef.current = { ...func }\r\n    }\r\n\r\n    const bindSuccessRef = (func: Record) => {\r\n        successRef.current = { ...func }\r\n    }\r\n\r\n    const bindInUsedRef = (func: Record) => {\r\n        inUsedRef.current = { ...func }\r\n    }\r\n\r\n    return (\r\n        <>\r\n            \r\n                \r\n                    \r\n                        {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${searchResult.length}`])}\r\n                    \r\n                \r\n                \r\n                    \r\n                \r\n            \r\n            {searchResult.map((data: SearchExpertisesLUT) => (\r\n                \r\n                    \r\n                        \r\n                             handleEdit(data.expertiseID)}>\r\n                                {translate.get('BUTTON.EDIT')}\r\n                            \r\n                        \r\n                        \r\n                             openConfirmDelete(data.expertiseID)}>\r\n                                {translate.get('BUTTON.DELETE')}\r\n                            \r\n                        \r\n\r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                        {translate.get('LABEL.EXPERTISE')}\r\n                                    \r\n                                \r\n                                \r\n                                    \r\n                                        {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                            ? data.expertiseNameTH\r\n                                            : data.expertiseNameEN}\r\n                                    \r\n                                \r\n                            \r\n                        \r\n                    \r\n                \r\n            ))}\r\n            \r\n            \r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default SearchExpertisesResults\r\n","import Button from '@material-ui/core/Button'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { styled } from '@material-ui/styles'\r\nimport { FC } from 'react'\r\nimport { useForm } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nconst CustomBtn = styled(Button)(() => ({\r\n    minWidth: '0px',\r\n    boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)',  \r\n}))\r\n\r\nconst SearchExpertises: FC<{}> = () => {\r\n    const translate = useTranslate()\r\n    const form = useForm()\r\n    return (\r\n        \r\n            \r\n                \r\n            \r\n            \r\n                \r\n                    \r\n                         {\r\n                                form.reset()\r\n                                form.submit()\r\n                            }}\r\n                            color=\"default\"\r\n                        >\r\n                            {translate.get('BUTTON.RESET')}\r\n                        \r\n                    \r\n                    \r\n                        \r\n                            {translate.get('BUTTON.SEARCH')}\r\n                        \r\n                    \r\n                \r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default SearchExpertises\r\n","import Container from '@material-ui/core/Container'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { FC, useEffect, useState } from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport SearchExpertisesResults from '../component/web/expertises/SearchExpertisesResults'\r\nimport SearchExpertises from '../component/web/expertises/SearchExpertises'\r\nimport SearchAccordion from '../control/accordion/SearchAccordion'\r\nimport useTranslate from '../i18n/useTranslate'\r\nimport useExpertises from '../component/web/shareLogic/useExpertises'\r\nimport useLoading from '../control/loading/useLoading'\r\nimport { SearchExpertisesLUT } from '../services/web/types/responseWebServiceTypes'\r\n\r\nconst ManageExpertises: FC<{}> = () => {\r\n    const initialFormValues = {\r\n        keyword: '',\r\n    }\r\n    const [searchResult, setSearchResult] = useState([])\r\n    const translate = useTranslate()\r\n    const expertisesHook = useExpertises()\r\n    const loadingHook = useLoading()\r\n\r\n    const submitSearch = async (values: Record) => {\r\n        loadingHook.loadingOpen()\r\n        const result: SearchExpertisesLUT[] = await handleSearch(values.keyword)\r\n        loadingHook.loadingClose()\r\n        setSearchResult(result ?? [])\r\n    }\r\n\r\n    const handleSearch = (keyword: string | null) => {\r\n        return expertisesHook.searchExpertisesLUT(keyword)\r\n    }\r\n\r\n    useEffect(() => {\r\n        loadingHook.loadingOpen()\r\n        handleSearch(null)\r\n            .then((data) => {\r\n                setSearchResult(data)\r\n            })\r\n            .finally(() => {\r\n                loadingHook.loadingClose()\r\n            })\r\n    }, [])\r\n\r\n    return (\r\n        \r\n            \r\n                {() => {\r\n                    return (\r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                \r\n                            \r\n                            \r\n                                \r\n                            \r\n                        \r\n                    )\r\n                }}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default ManageExpertises\r\n","import Card from '@material-ui/core/Card'\r\nimport CardHeader from '@material-ui/core/CardHeader'\r\nimport CardContent from '@material-ui/core/CardContent'\r\nimport Container from '@material-ui/core/Container'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { FC, useEffect, useRef, useState } from 'react'\r\nimport { useHistory, useParams } from 'react-router-dom'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { RoutePath } from '../../../router/routesConfig'\r\nimport { useExpertiseStyles } from './expertiseShareStyle'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport Button from '@material-ui/core/Button'\r\nimport { validateEN } from '../../../utilities/validate'\r\nimport useExpertises from '../shareLogic/useExpertises'\r\nimport useLoading from '../../../control/loading/useLoading'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport { styled } from '@material-ui/core/styles'\r\n\r\nconst CustomHeader = styled(CardHeader)({\r\n    borderBottom: '1px solid #DCDCDC',\r\n})\r\n\r\nconst ExpertiseForm: FC<{}> = () => {\r\n    const classes = useExpertiseStyles()\r\n    const translate = useTranslate()\r\n    const params = useParams<{ id: string }>()\r\n    const isEdit = params.id ? true : false\r\n    const history = useHistory()\r\n    const [initialValues, setInitialValues] = useState({\r\n        expertiseID: null,\r\n        expertiseNameTH: null,\r\n        expertiseNameEN: null,\r\n    })\r\n    const expertiseHook = useExpertises()\r\n    const loadingHook = useLoading()\r\n    const saveRef = useRef>()\r\n    const successRef = useRef>()\r\n    const addSuccessIdRef = useRef()\r\n    const duplicateRef = useRef>()\r\n    const [duplicateMsg, setDuplicateMsg] = useState('M028')\r\n    const dirtyRef = useRef>()\r\n\r\n    useEffect(() => {\r\n        if (isEdit) {\r\n            getExpertiseByID()\r\n        }\r\n    }, [])\r\n\r\n    const handleClose = () => {\r\n        dirtyRef.current?.closeDialog()\r\n        history.push(RoutePath.manageExpertises)\r\n    }\r\n\r\n    const submitExpertiseForm = async (values: Record) => {\r\n        saveRef.current?.closeDialog()\r\n        loadingHook.loadingOpen()\r\n        if (isEdit) {\r\n            expertiseHook\r\n                .updateExpertiseLUT(Number(params.id), values.expertiseNameTH, values.expertiseNameEN)\r\n                .then((data) => {\r\n                    if (data.expertiseID) {\r\n                        successRef.current?.openDialog()\r\n                    } else {\r\n                        setDuplicateMsg(data.Status)\r\n                        duplicateRef.current?.openDialog()\r\n                    }\r\n                })\r\n                .finally(() => loadingHook.loadingClose())\r\n        } else {\r\n            expertiseHook\r\n                .addExpertiseLUT(values.expertiseNameTH, values.expertiseNameEN)\r\n                .then((data) => {\r\n                    addSuccessIdRef.current = data.expertiseID\r\n                    if (data.expertiseID) {\r\n                        successRef.current?.openDialog()\r\n                    } else {\r\n                        setDuplicateMsg(data.Status)\r\n                        duplicateRef.current?.openDialog()\r\n                    }\r\n                })\r\n                .finally(() => loadingHook.loadingClose())\r\n        }\r\n    }\r\n\r\n    const getExpertiseByID = async () => {\r\n        loadingHook.loadingOpen()\r\n        const response = await expertiseHook.getExpertiseByID(Number(params.id))\r\n        if (response && response.result) {\r\n            setInitialValues(response.result)\r\n            // duplicateRef.current?.openDialog()\r\n        }\r\n        loadingHook.loadingClose()\r\n    }\r\n\r\n    const bindSaveRef = (func: Record) => {\r\n        saveRef.current = { ...func }\r\n    }\r\n\r\n    const bindSuccessRef = (func: Record) => {\r\n        successRef.current = { ...func }\r\n    }\r\n\r\n    const bindDuplicateRef = (func: Record) => {\r\n        duplicateRef.current = { ...func }\r\n    }\r\n\r\n    const bindDirtyRef = (func: Record) => {\r\n        dirtyRef.current = { ...func }\r\n    }\r\n\r\n    const openConfirm = () => {\r\n        saveRef.current?.openDialog()\r\n    }\r\n\r\n    const afterCloseSuccess = () => {\r\n        if (isEdit) {\r\n            handleClose()\r\n        } else {\r\n            if (addSuccessIdRef.current) {\r\n                // history.push(RoutePath.expertisesEdit.replace(':id', `${addSuccessIdRef.current}`))\r\n                handleClose()\r\n            }\r\n        }\r\n    }\r\n\r\n    const checkDirty = (isDirty: boolean) => {\r\n        if (isDirty) {\r\n            dirtyRef.current?.openDialog()\r\n        } else {\r\n            handleClose()\r\n        }\r\n    }\r\n\r\n    return (\r\n        \r\n            \r\n                {({ handleSubmit, dirty, hasValidationErrors }) => (\r\n                    <>\r\n                        
\r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                                {translate.get(\r\n                                                    isEdit ? 'LABEL.EDIT_EXPERTISE_DETAIL' : 'BUTTON.ADD_EXPERTISE',\r\n                                                )}\r\n                                            \r\n                                        }\r\n                                    />\r\n                                    \r\n                                        \r\n                                            \r\n                                                \r\n                                            \r\n                                            \r\n                                                \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            \r\n                            \r\n                                \r\n                                    \r\n                                         checkDirty(dirty)}\r\n                                            color=\"primary\"\r\n                                        >\r\n                                            {translate.get('BUTTON.CANCEL')}\r\n                                        \r\n                                    \r\n                                    \r\n                                         {\r\n                                                if (!hasValidationErrors) {\r\n                                                    openConfirm()\r\n                                                } else {\r\n                                                    handleSubmit()\r\n                                                }\r\n                                            }}\r\n                                            color=\"primary\"\r\n                                        >\r\n                                            {translate.get('BUTTON.SAVE')}\r\n                                        \r\n                                    \r\n                                \r\n                            \r\n                        \r\n                        \r\n                        \r\n                        \r\n                        \r\n                    \r\n                )}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default ExpertiseForm\r\n","import Button from '@material-ui/core/Button'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { styled } from '@material-ui/styles'\r\nimport { FC, useEffect, useMemo, useState } from 'react'\r\nimport { useForm } from 'react-final-form'\r\nimport Autocomplete from '../../../control/autocomplete/autocomplete'\r\nimport DateRangePicker from '../../../control/datepicker/DateRangePicker'\r\nimport useLoading from '../../../control/loading/useLoading'\r\nimport Select from '../../../control/select/select'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { ExpertiseFaculty } from '../../../services/lookup/types/responseLookupServiceTypes'\r\nimport useLookupService from '../../../services/lookup/useLookupService'\r\nimport useIRB from '../../../services/um/lookups/useIRB'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport useExpertises from '../shareLogic/useExpertises'\r\n\r\nconst CustomBtn = styled(Button)(() => ({\r\n    minWidth: '0px',\r\n    boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)',\r\n}))\r\n\r\nconst SearchCommittees: FC<{}> = () => {\r\n    const translate = useTranslate()\r\n    const form = useForm()\r\n    const { irb } = useIRB()\r\n    const authenStore = useAuthenStore()\r\n    const defaultREC = authenStore.profile.irb ? [authenStore.profile.irb.toString()] : []\r\n    const lutHook = useLookupService()\r\n    const expertiseHook = useExpertises()\r\n    const [initFaculty, setInitFaculty] = useState()\r\n    const [initExpertise, setInitExpertise] = useState()\r\n    const loadingHook = useLoading()\r\n\r\n    const getLut = (rawData: any, languageKey: string) => {\r\n        const result = rawData?.result\r\n        return result?.map((data: any) => ({\r\n            label: languageKey === translate.languageKey.en ? data.nameEN : data.nameTH,\r\n            value: `${data.id}`,\r\n        }))\r\n    }\r\n    const expertiseFaculty = useMemo(\r\n        () => getLut(initFaculty, translate.languageStore.currentLanguage),\r\n        [initFaculty, translate.languageStore.currentLanguage],\r\n    )\r\n    const expertise = useMemo(\r\n        () => getLut(initExpertise, translate.languageStore.currentLanguage),\r\n        [initExpertise, translate.languageStore.currentLanguage],\r\n    )\r\n\r\n    useEffect(() => {\r\n        initLut()\r\n    }, [])\r\n\r\n    const initLut = async () => {\r\n        loadingHook.loadingOpen()\r\n        await Promise.all([\r\n            expertiseHook.getExpertisesLUT(),\r\n            lutHook.getExpertiseFaculty()\r\n        ]).then((response) => {\r\n            setInitExpertise(response[0])\r\n            setInitFaculty(response[1])\r\n        })\r\n        loadingHook.loadingClose()\r\n    }\r\n\r\n    return (\r\n        \r\n            \r\n                \r\n            \r\n            \r\n                \r\n            \r\n            \r\n                \r\n            \r\n            \r\n                \r\n            \r\n            \r\n                \r\n            \r\n            \r\n                \r\n                    \r\n                         {\r\n                                form.reset()\r\n                                form.submit()\r\n                            }}\r\n                            color=\"default\"\r\n                        >\r\n                            {translate.get('BUTTON.RESET')}\r\n                        \r\n                    \r\n                    \r\n                        \r\n                            {translate.get('BUTTON.SEARCH')}\r\n                        \r\n                    \r\n                \r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default SearchCommittees\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const useCommitteeStyles = makeStyles((theme) => ({\r\n    item: {\r\n        width: '100%',\r\n        padding: theme.spacing(3),\r\n        margin: theme.spacing(2, 0),\r\n        '&:hover': {\r\n            border: `1px solid ${theme.palette.primary.main}`,\r\n        },\r\n    },\r\n    icon: {\r\n        marginRight: theme.spacing(1),\r\n        width: 40,\r\n        height: 40,\r\n        backgroundColor: '#ece9e9',\r\n        transition: '0.3s',\r\n        '&:hover': {\r\n            backgroundColor: theme.palette.primary.main,\r\n            color: '#fff',\r\n        },\r\n    },\r\n    recentTime: {\r\n        position: 'absolute',\r\n        top: 2,\r\n        right: 4,\r\n        color: 'grey',\r\n    },\r\n\r\n    header: {\r\n        fontWeight: 'bold',\r\n    },\r\n    btnEdit: {\r\n        boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n        height: '44px',\r\n        marginRight: '1px',\r\n    },\r\n    btnDelete: {\r\n        boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n        height: '44px',\r\n        marginRight: '1px',\r\n        backgroundColor: theme.palette.secondary.main,\r\n        color: theme.palette.background.default,\r\n        '&:hover': {\r\n            backgroundColor: theme.palette.secondary.main,\r\n        },\r\n    },\r\n    multiLineEllipsis: {\r\n        maxWidth: '100%',\r\n        whiteSpace: 'pre-wrap',\r\n        overflow: 'hidden',\r\n        textOverflow: 'ellipsis',\r\n        display: '-webkit-box',\r\n        '-webkit-line-clamp': 1,\r\n        '-webkit-box-orient': 'vertical',\r\n    },\r\n    linkLabel: {\r\n        color: '#0062FF',\r\n        textDecoration: 'underline',\r\n        cursor: 'pointer',\r\n    },\r\n}))","import {\r\n    getUserInfo,\r\n    searchCommittees as search,\r\n    getCommitteeExpertByID,\r\n    updateCommitteeExperiseByID,\r\n    getProjectInfo as projectInfo,\r\n    getCommitteeExpertInfo,\r\n} from '../../../services/um/umServiceURL'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport useCallApi from '../../../utilities/axios'\r\n\r\nconst useCommittees = () => {\r\n    const callApi = useCallApi()\r\n    const authenStore = useAuthenStore()\r\n\r\n    const getCommitteeByID = async (userID: number | string) => {\r\n        const response = await callApi.axiosGet({\r\n            url: `${getUserInfo}/${userID}`,\r\n        })\r\n        return response?.data\r\n    }\r\n\r\n    const searchCommittees = async (\r\n        keyword: string | null,\r\n        facultyID: number | null,\r\n        expertiseID: number | null,\r\n        startDate: string,\r\n        endDate: string,\r\n    ) => {\r\n        const response = await callApi.axiosPost({\r\n            url: search,\r\n            params: {\r\n                keyword,\r\n                irb: Number(authenStore.profile.irb),\r\n                facultyID,\r\n                expertiseID,\r\n                startDate,\r\n                endDate,\r\n            },\r\n        })\r\n        return response?.data\r\n    }\r\n\r\n    const getExpertiseInfo = async (committeeID: number) => {\r\n        const response = await callApi.axiosGet({\r\n            url: `${getCommitteeExpertByID}/${committeeID}`,\r\n        })\r\n        return response.data\r\n    }\r\n\r\n    const updateCommitteeExperise = async (\r\n        committeeID: number | null,\r\n        body: {\r\n            faculty: { label: string; value: string }\r\n            expertList: [{ label: string; value: string }]\r\n            updatedUserID: number\r\n        },\r\n    ) => {\r\n        const response = await callApi.axiosPut({\r\n            url: `${updateCommitteeExperiseByID}/${committeeID}`,\r\n            params: body,\r\n        })\r\n        return response.data\r\n    }\r\n\r\n    const getProjectInfo = async (committeeID: number, isInProgress: boolean, startDate: string, endDate: string) => {\r\n        const response = await callApi.axiosPost({\r\n            url: projectInfo,\r\n            params: {\r\n                committeeID,\r\n                isInProgress: isInProgress ? true : null,\r\n                isFinish: !isInProgress ? true : null,\r\n                startDate,\r\n                endDate,\r\n            },\r\n        })\r\n        return response.data\r\n    }\r\n\r\n    const getExpertInfo = async (committeeID: number) => {\r\n        const response = await callApi.axiosGet({\r\n            url: `${getCommitteeExpertInfo}/${committeeID}`,\r\n        })\r\n        return response.data\r\n    }\r\n\r\n    return {\r\n        getCommitteeByID,\r\n        searchCommittees,\r\n        getExpertiseInfo,\r\n        updateCommitteeExperise,\r\n        getProjectInfo,\r\n        getExpertInfo,\r\n    }\r\n}\r\n\r\nexport default useCommittees\r\n","import { Button, Grid } from '@material-ui/core'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { FC, useRef, useState } from 'react'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport useLoading from '../../../control/loading/useLoading'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useCommittees from '../shareLogic/useCommittees'\r\nimport { useCommitteeStyles } from './committeeStyles'\r\n\r\nconst ExpertInfo: FC<{ committeeID: number }> = ({ committeeID }) => {\r\n    const classes = useCommitteeStyles()\r\n    const expertInfoRef = useRef>()\r\n    const translate = useTranslate()\r\n    const committeeHook = useCommittees()\r\n    const loadingHook = useLoading()\r\n    const [expertInfoList, setExpertInfoList] = useState<\r\n        {\r\n            nameTH: string\r\n            nameEN: string\r\n        }[]\r\n    >([])\r\n\r\n    const bindExpertInfoRef = (func: Record) => {\r\n        expertInfoRef.current = { ...func }\r\n    }\r\n\r\n    const openExpertInfo = async () => {\r\n        loadingHook.loadingOpen()\r\n        const expertInfo = await committeeHook.getExpertInfo(committeeID)\r\n        if (expertInfo.result) {\r\n            setExpertInfoList(expertInfo.result)\r\n        }\r\n        loadingHook.loadingClose()\r\n        expertInfoRef.current?.openDialog()\r\n    }\r\n\r\n    const closeExpertInfo = () => {\r\n        expertInfoRef.current?.closeDialog()\r\n    }\r\n\r\n    return (\r\n        <>\r\n             openExpertInfo()}>\r\n                {translate.get('LABEL.VIEW_EXPERTISE_INFO')}\r\n            \r\n            \r\n                        {expertInfoList?.length > 0 ? (\r\n                            expertInfoList?.map((data, index) => (\r\n                                \r\n                                    \r\n                                        {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                            ? data.nameTH\r\n                                            : data.nameEN}\r\n                                    \r\n                                \r\n                            ))\r\n                        ) : (\r\n                            \r\n                                {translate.get('LABEL.NO_DATA_FOUND')}\r\n                            \r\n                        )}\r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                \r\n                            \r\n                        \r\n                    \r\n                }\r\n            />\r\n        \r\n    )\r\n}\r\n\r\nexport default ExpertInfo\r\n","import { Button, Grid } from '@material-ui/core'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { FC, useRef, useState } from 'react'\r\nimport { useForm } from 'react-final-form'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport useLoading from '../../../control/loading/useLoading'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useCommittees from '../shareLogic/useCommittees'\r\nimport { useCommitteeStyles } from './committeeStyles'\r\n\r\nconst ProjectInfo: FC<{ inProgress: number; success: number; committeeID: number; isInProgress: boolean }> = ({\r\n    inProgress,\r\n    success,\r\n    committeeID,\r\n    isInProgress,\r\n}) => {\r\n    const classes = useCommitteeStyles()\r\n    const projectInfoRef = useRef>()\r\n    const translate = useTranslate()\r\n    const committeeHook = useCommittees()\r\n    const loadingHook = useLoading()\r\n    const [projectInfoList, setProjectInfoList] = useState<\r\n        {\r\n            projectNumber: string\r\n            nameTH: string\r\n            nameEN: string\r\n        }[]\r\n    >([])\r\n    const form = useForm()\r\n\r\n    const bindProjectInfoRef = (func: Record) => {\r\n        projectInfoRef.current = { ...func }\r\n    }\r\n\r\n    const openProjectInfo = async () => {\r\n        const formValues = form.getState().values\r\n        loadingHook.loadingOpen()\r\n        const projectInfo = await committeeHook.getProjectInfo(\r\n            committeeID,\r\n            isInProgress,\r\n            formValues.currentStartDate,\r\n            formValues.currentEndDate,\r\n        )\r\n        if (projectInfo.result) {\r\n            setProjectInfoList(projectInfo.result)\r\n        }\r\n        loadingHook.loadingClose()\r\n        projectInfoRef.current?.openDialog()\r\n    }\r\n\r\n    const closeProjectInfo = () => {\r\n        projectInfoRef.current?.closeDialog()\r\n    }\r\n\r\n    return (\r\n        <>\r\n             openProjectInfo()}>\r\n                {translate.get('LABEL.COMMITTEE_PROJECT', [isInProgress ? `${inProgress}` : `${success}`])}\r\n            \r\n            \r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                        {translate.get('LABEL.PROJECT_NUMBER')}\r\n                                    \r\n                                \r\n                                \r\n                                    \r\n                                        {translate.get('LABEL.PROJECT_NAME')}\r\n                                    \r\n                                \r\n                            \r\n                        \r\n                        {projectInfoList.length > 0 ? (\r\n                            projectInfoList?.map((data, index) => (\r\n                                \r\n                                    \r\n                                        \r\n                                            {data.projectNumber}\r\n                                        \r\n                                        \r\n                                            \r\n                                                {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                                    ? data.nameTH\r\n                                                    : data.nameEN}\r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            ))\r\n                        ) : (\r\n                            \r\n                                {translate.get('LABEL.NO_DATA_FOUND')}\r\n                            \r\n                        )}\r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                \r\n                            \r\n                        \r\n                    \r\n                }\r\n            />\r\n        \r\n    )\r\n}\r\n\r\nexport default ProjectInfo\r\n","import Grid from '@material-ui/core/Grid'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport { FC, useRef } from 'react'\r\nimport { SearchExpertisesLUT } from '../../../services/web/types/responseWebServiceTypes'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { ButtonView } from '../../../control/button/button'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { RoutePath } from '../../../router/routesConfig'\r\nimport { useCommitteeStyles } from './committeeStyles'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport { useForm } from 'react-final-form'\r\nimport { styled } from '@material-ui/styles'\r\nimport ExpertInfo from './ExpertInfo'\r\nimport ProjectInfo from './ProjectInfo'\r\n\r\nconst GreyCard = styled(Typography)({\r\n    height: '32px',\r\n    // width: '168px',\r\n    minWidth: '168px',\r\n    left: '0.0263671875px',\r\n    top: '0px',\r\n    borderRadius: '8px',\r\n    background: '#757575',\r\n    border: '1px solid #DCDCDC',\r\n    display: 'flex',\r\n    alignItems: 'center',\r\n    justifyContent: 'center',\r\n    padding: '12px',\r\n    color: '#fff',\r\n})\r\n\r\nconst PinkCard = styled(GreyCard)({\r\n    background: '#db5f8e',\r\n})\r\n\r\nconst DashText = styled(Typography)({\r\n    marginLeft: '45px',\r\n})\r\n\r\nconst SearchCommitteesResults: FC<{ searchResult: SearchExpertisesLUT[] }> = ({ searchResult }) => {\r\n    const classes = useCommitteeStyles()\r\n    const translate = useTranslate()\r\n    const history = useHistory()\r\n    const successRef = useRef>()\r\n    const form = useForm()\r\n\r\n    const handleEdit = (id: number) => {\r\n        /** EDIT */\r\n        history.push(RoutePath.committeeEdit.replace(':id', `${id}`))\r\n    }\r\n\r\n    const bindSuccessRef = (func: Record) => {\r\n        successRef.current = { ...func }\r\n    }\r\n\r\n    return (\r\n        <>\r\n            \r\n                \r\n                    \r\n                        {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${searchResult.length}`])}\r\n                    \r\n                \r\n            \r\n            {searchResult.map((data: any) => (\r\n                \r\n                    \r\n                        \r\n                            \r\n                                \r\n                                     handleEdit(data.info.committeeID)}\r\n                                    >\r\n                                        {translate.get('BUTTON.EDIT')}\r\n                                    \r\n                                \r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                {translate.get('LABEL.COMMITTEE_FULL_NAME')}\r\n                                            \r\n                                        \r\n                                        \r\n                                            \r\n                                                {translate.languageStore.currentLanguage === translate.languageKey.th\r\n                                                    ? data.info.nameTH\r\n                                                    : data.info.nameEN}\r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                {translate.get('LABEL.EXPERTISE')}\r\n                                            \r\n                                        \r\n                                        \r\n                                            {data.cntExpertise > 0 ? (\r\n                                                \r\n                                            ) : (\r\n                                                -\r\n                                            )}\r\n                                        \r\n                                    \r\n                                \r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                {translate.get('LABEL.IN_PROGRESS_PROJECT')}\r\n                                            \r\n                                        \r\n                                        \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                {translate.get('LABEL.FINISH_PROJECT')}\r\n                                            \r\n                                        \r\n                                        \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            \r\n                        \r\n                        \r\n                            \r\n                                 \r\n                            \r\n                        \r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                        {translate.get('LABEL.NUMBER_OF_PROJECTS')}\r\n                                    \r\n                                \r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                {translate.get('LABEL.DID_NOT_COMMENT', [`${data.noComment}`])}\r\n                                            \r\n                                        \r\n                                        \r\n                                            \r\n                                                {translate.get('LABEL.DONE_COMMENT', [`${data.comment}`])}\r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                            \r\n                        \r\n                    \r\n                \r\n            ))}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default SearchCommitteesResults\r\n","import Container from '@material-ui/core/Container'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport moment from 'moment'\r\nimport { FC, useEffect, useRef, useState } from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport SearchCommittees from '../../component/web/committees/SearchCommittees'\r\nimport SearchCommitteesResults from '../../component/web/committees/SearchCommitteesResult'\r\nimport useCommittees from '../../component/web/shareLogic/useCommittees'\r\nimport SearchAccordion from '../../control/accordion/SearchAccordion'\r\nimport useLoading from '../../control/loading/useLoading'\r\nimport useTranslate from '../../i18n/useTranslate'\r\n\r\nconst ManageCommittees: FC<{}> = () => {\r\n    const initialFormValues = {\r\n        keyword: '',\r\n        startDate: moment().subtract('years', 1).format('yyyy-MM-DD'),\r\n        endDate: moment().format('yyyy-MM-DD'),\r\n        rec: null,\r\n        faculty: null,\r\n        expertise: null,\r\n        currentStartDate: moment().subtract('years', 1).format('yyyy-MM-DD'),\r\n        currentEndDate: moment().format('yyyy-MM-DD'),\r\n    }\r\n    const [searchResult, setSearchResult] = useState([])\r\n    const translate = useTranslate()\r\n    const committeesHook = useCommittees()\r\n    const loadingHook = useLoading()\r\n    const formRef = useRef()\r\n\r\n    const submitSearch = async (values: Record) => {\r\n        loadingHook.loadingOpen()\r\n        const response = await handleSearch(values)\r\n        loadingHook.loadingClose()\r\n        setSearchResult(response.result ?? [])\r\n    }\r\n\r\n    const handleSearch = (values: Record) => {\r\n        formRef.current.change('currentStartDate', values.startDate)\r\n        formRef.current.change('currentEndDate', values.endDate)\r\n        return committeesHook.searchCommittees(\r\n            values.keyword && values.keyword !== '' ? values.keyword : null,\r\n            values.faculty ? Number(values.faculty.value) : null,\r\n            values.expertise ? Number(values.expertise.value) : null,\r\n            values.startDate,\r\n            values.endDate,\r\n        )\r\n    }\r\n\r\n    useEffect(() => {\r\n        loadingHook.loadingOpen()\r\n        committeesHook\r\n            .searchCommittees(\r\n                null,\r\n                null,\r\n                null,\r\n                moment().subtract('years', 1).format('yyyy-MM-DD'),\r\n                moment().format('yyyy-MM-DD').toString(),\r\n            )\r\n            .then((data) => {\r\n                setSearchResult(data.result)\r\n            })\r\n            .finally(() => {\r\n                loadingHook.loadingClose()\r\n            })\r\n    }, [])\r\n\r\n    return (\r\n        \r\n            \r\n                {({ form }) => {\r\n                    formRef.current = form\r\n                    return (\r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                \r\n                            \r\n                            \r\n                                \r\n                            \r\n                        \r\n                    )\r\n                }}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default ManageCommittees\r\n","import { FC, useEffect, useMemo, useRef, useState } from 'react'\r\nimport { Form as FinalForm, FormSpy } from 'react-final-form'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport MyCheckbox from '../../../control/checkbox/checkbox'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\nimport Radio from '../../../control/radio/radio'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport Card from '@material-ui/core/Card'\r\nimport CardContent from '@material-ui/core/CardContent'\r\nimport Button from '@material-ui/core/Button'\r\nimport { useHistory, useParams } from 'react-router-dom'\r\nimport { RoutePath } from '../../../router/routesConfig'\r\nimport { styled } from '@material-ui/styles'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport Autocomplete from '../../../control/autocomplete/autocomplete'\r\nimport useLookupService from '../../../services/lookup/useLookupService'\r\nimport useExpertises from '../shareLogic/useExpertises'\r\nimport { ExpertiseFaculty } from '../../../services/lookup/types/responseLookupServiceTypes'\r\nimport useLoading from '../../../control/loading/useLoading'\r\nimport { FormApi } from 'final-form'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport { useCommitteeStyles } from './committeeStyles'\r\nimport { TOptions } from '../../../control/autocomplete/autocompleteType'\r\nimport useCommittees from '../shareLogic/useCommittees'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport { ServiceResult } from '../../../services/web/types/responseWebServiceTypes'\r\n\r\nconst CustomHeader = styled(Typography)(() => ({\r\n    fontWeight: 'bold',\r\n}))\r\n\r\nconst CommitteeForm: FC<{}> = () => {\r\n    const [initialEditAble, setInitialEditAble] = useState>({\r\n        faculty: null,\r\n        expertList: [],\r\n    })\r\n    const translate = useTranslate()\r\n    const authenStore = useAuthenStore()\r\n    const updatedUserId = authenStore.profile.userId\r\n    const params = useParams<{ id: string }>()\r\n    const history = useHistory()\r\n    const lutHook = useLookupService()\r\n    const expertiseHook = useExpertises()\r\n    const [initFaculty, setInitFaculty] = useState()\r\n    const [initExpertise, setInitExpertise] = useState>()\r\n    const loadingHook = useLoading()\r\n    const [disabledAdd, setDisabledAdd] = useState(true)\r\n    const classes = useCommitteeStyles()\r\n    const committeeHook = useCommittees()\r\n    const [committeeInfo, setCommitteeInfo] = useState()\r\n    const cancelRef = useRef>()\r\n    const saveRef = useRef>()\r\n    const successRef = useRef>()\r\n    const formStateRef = useRef>>()\r\n\r\n    useEffect(() => {\r\n        initLut()\r\n        initialForm()\r\n    }, [])\r\n\r\n    const getLut = (rawData: any, languageKey: string, enKey: string, thKey: string, idKey: string) => {\r\n        const result = rawData\r\n        return result?.map((data: any) => ({\r\n            label: languageKey === translate.languageKey.en ? data[enKey] : data[thKey],\r\n            value: `${data[idKey]}`,\r\n        }))\r\n    }\r\n    const expertiseFaculty = useMemo(\r\n        () => getLut(initFaculty?.result, translate.languageStore.currentLanguage, 'nameEN', 'nameTH', 'id'),\r\n        [initFaculty, translate.languageStore.currentLanguage],\r\n    )\r\n    const expertise = useMemo(\r\n        () => getLut(initExpertise?.result, translate.languageStore.currentLanguage, 'nameEN', 'nameTH', 'id'),\r\n        [initExpertise, translate.languageStore.currentLanguage],\r\n    )\r\n    const initialValues = useMemo(() => {\r\n        const isEN = translate.languageStore.currentLanguage === translate.languageKey.en\r\n\r\n        return {\r\n            usergroup: isEN ? committeeInfo?.['usergroupNameEN'] : committeeInfo?.['usergroupNameTH'],\r\n            irb: isEN ? committeeInfo?.['irbNameEN'] : committeeInfo?.['irbNameTH'],\r\n            isBothIrb: committeeInfo?.['isBothIrb'],\r\n            cunet: committeeInfo?.['cunet'] ? '1' : '2',\r\n            username: committeeInfo?.['username'],\r\n            email: committeeInfo?.['email'],\r\n            position: isEN ? committeeInfo?.['positionNameEN'] : committeeInfo?.['positionNameTH'],\r\n            positionOtherTH: committeeInfo?.['position']['name']['th'],\r\n            positionOtherEN: committeeInfo?.['position']['name']['en'],\r\n            isPhD: committeeInfo?.['isPhD'],\r\n            title: isEN ? committeeInfo?.['titleNameEN'] : committeeInfo?.['titleNameTH'],\r\n            titleOtherTH: committeeInfo?.['title']['name']['en'],\r\n            titleOtherEN: committeeInfo?.['title']['name']['en'],\r\n            nameTH: committeeInfo?.['nameTH'],\r\n            nameEN: committeeInfo?.['nameEN'],\r\n            homeTelephone: committeeInfo?.['homeTelephone'],\r\n            mobilePhone: committeeInfo?.['mobilePhone'],\r\n        }\r\n    }, [committeeInfo, translate.languageStore.currentLanguage])\r\n\r\n    const initialEditableForm = useMemo(() => {\r\n        const facultyVal = formStateRef.current?.getFieldState('faculty')?.value ?? null\r\n        const expertVal = formStateRef.current?.getFieldState('expertList')?.value ?? []\r\n        const isEN = translate.languageStore.currentLanguage === translate.languageKey.en\r\n        let returnRes: { faculty: TOptions | null; expertList: TOptions[] } = {\r\n            faculty: null,\r\n            expertList: [],\r\n        }\r\n        if (facultyVal) {\r\n            returnRes.faculty =\r\n                expertiseFaculty.find((data: TOptions) => `${data.value}` === `${facultyVal.value}`) ?? null\r\n        } else if (initialEditAble.faculty) {\r\n            returnRes.faculty = {\r\n                value: initialEditAble.faculty.id,\r\n                label: isEN ? initialEditAble.faculty.nameEN : initialEditAble.faculty.nameTH,\r\n            }\r\n        }\r\n        if (expertVal.length > 0) {\r\n            returnRes.expertList = expertVal.map(\r\n                (data: TOptions) =>\r\n                    expertise.find((expertData: TOptions) => `${expertData.value}` === `${data.value}`) ?? null,\r\n            )\r\n        } else if (initialEditAble.expertList.length > 0) {\r\n            returnRes.expertList = initialEditAble.expertList.map(\r\n                (data: { id: string; nameTH: string; nameEN: string }) => ({\r\n                    value: data.id,\r\n                    label: isEN ? data.nameEN : data.nameTH,\r\n                }),\r\n            )\r\n        }\r\n        return returnRes\r\n    }, [initialEditAble, translate.languageStore.currentLanguage])\r\n\r\n    const initialForm = async () => {\r\n        const responseInfo = await Promise.all([\r\n            committeeHook.getCommitteeByID(Number(params.id)),\r\n            committeeHook.getExpertiseInfo(Number(params.id)),\r\n        ])\r\n        if (responseInfo[0]) {\r\n            setCommitteeInfo(responseInfo[0])\r\n        }\r\n        if (responseInfo[1] && responseInfo[1]?.result) {\r\n            setInitialEditAble({ ...responseInfo[1].result })\r\n        }\r\n    }\r\n\r\n    const initLut = async () => {\r\n        loadingHook.loadingOpen()\r\n        await Promise.all([expertiseHook.getExpertisesLUT(), lutHook.getExpertiseFaculty()]).then((response) => {\r\n            setInitExpertise(response[0])\r\n            setInitFaculty(response[1])\r\n        })\r\n        loadingHook.loadingClose()\r\n    }\r\n\r\n    const handleSubmitForm = () => {\r\n        saveRef.current?.openDialog()\r\n    }\r\n\r\n    const handleConfirmSubmit = async (formRef: FormApi>) => {\r\n        /** CALL SERVICE UPDATE */\r\n        saveRef.current?.closeDialog()\r\n        const formValues = formRef.getState().values\r\n        const committeeID = committeeInfo?.['userID'] ? Number(committeeInfo?.['userID']) : null\r\n        const params = {\r\n            faculty: formValues.faculty ?? null,\r\n            updatedUserID: Number(updatedUserId),\r\n            expertList: formValues.expertList.map((data: TOptions) => ({ ...data, label: data.label ?? null })),\r\n        }\r\n        await committeeHook.updateCommitteeExperise(committeeID, params).then((data: ServiceResult) => {\r\n            data.status === 1 && successRef.current?.openDialog()\r\n        })\r\n    }\r\n\r\n    const handleBack = (formRef: FormApi>) => {\r\n        if (formRef.getState().dirty) {\r\n            cancelRef.current?.openDialog()\r\n        } else {\r\n            confirmCancel()\r\n        }\r\n    }\r\n\r\n    const bindCancelRef = (func: Record) => {\r\n        cancelRef.current = { ...func }\r\n    }\r\n\r\n    const bindSaveRef = (func: Record) => {\r\n        saveRef.current = { ...func }\r\n    }\r\n\r\n    const bindSuccessRef = (func: Record) => {\r\n        successRef.current = { ...func }\r\n    }\r\n\r\n    const confirmCancel = () => {\r\n        cancelRef.current?.closeDialog()\r\n        history.push(RoutePath.manageCommittees)\r\n    }\r\n\r\n    const handleAddExpertise = (formRef: FormApi>) => {\r\n        const expertiseState = formRef.getFieldState('expertise')\r\n        if (expertiseState?.value) {\r\n            formRef.mutators.push('expertList', expertiseState?.value)\r\n            expertiseState?.change(null)\r\n            setDisabledAdd(true)\r\n        }\r\n    }\r\n\r\n    const handleChangeDisabledAdd = (formState: any) => {\r\n        const currentValues = formState.values\r\n        if (currentValues.expertise) {\r\n            setDisabledAdd(false)\r\n        } else {\r\n            setDisabledAdd(true)\r\n        }\r\n    }\r\n\r\n    const handleRemoveExpertise = (keyIndex: number, formRef: FormApi>) => {\r\n        formRef.mutators.remove('expertList', keyIndex)\r\n    }\r\n\r\n    const renderExpertiseObj = (id: string | number) => {\r\n        return expertise?.find((data: TOptions) => `${data.value}` === `${id}`)?.label ?? '-'\r\n    }\r\n\r\n    return (\r\n        \r\n            {({ handleSubmit, form, values }) => {\r\n                formStateRef.current = form\r\n                return (\r\n                    <>\r\n                        \r\n                            \r\n                                \r\n                                    \r\n                                        {translate.get('UM.USERGROUP.HEADER')}\r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                            {translate.get('UM.USERGROUP-ADD.PROFILE')}\r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n\r\n                                    \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n\r\n                                    \r\n                                        \r\n                                    \r\n\r\n                                    \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n\r\n                                    \r\n                                        \r\n                                    \r\n\r\n                                    \r\n                                        \r\n                                    \r\n\r\n                                    \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n\r\n                                    \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n                                    \r\n                                        \r\n                                    \r\n                                \r\n\r\n                                
\r\n                                \r\n                                    \r\n                                        {translate.get('LABEL.COMMITTEE_BELONGS_FACULTY')}\r\n                                    \r\n                                \r\n                                
\r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                                
\r\n                                \r\n                                    {translate.get('LABEL.DEFINE_EXPERTISE')}\r\n                                \r\n                                
\r\n                                \r\n                                    \r\n                                        \r\n                                            \r\n                                                        values.expertList.find(\r\n                                                            (exData: TOptions) => `${exData.value}` === `${data.value}`,\r\n                                                        )\r\n                                                            ? false\r\n                                                            : true,\r\n                                                    ) ?? []\r\n                                                }\r\n                                            />\r\n                                        \r\n                                        \r\n                                             handleAddExpertise(form)}\r\n                                                disabled={disabledAdd}\r\n                                            >\r\n                                                {translate.get('BUTTON.ADD')}\r\n                                            \r\n                                        \r\n                                    \r\n                                \r\n                                \r\n                                    {({ fields }) => {\r\n                                        return fields?.map((name, index) => (\r\n                                            \r\n                                                \r\n                                                    \r\n                                                        \r\n                                                            {renderExpertiseObj(values.expertList[index].value)}\r\n                                                        \r\n                                                    \r\n                                                    \r\n                                                         handleRemoveExpertise(index, form)}\r\n                                                            color=\"secondary\"\r\n                                                        >\r\n                                                            {translate.get('BUTTON.DELETE')}\r\n                                                        \r\n                                                    \r\n                                                \r\n                                            \r\n                                        ))\r\n                                    }}\r\n                                \r\n                            \r\n                        \r\n                        
\r\n                        \r\n                            \r\n                                 handleBack(form)}\r\n                                    color=\"primary\"\r\n                                >\r\n                                    {translate.get('BUTTON.CANCEL')}\r\n                                \r\n                            \r\n                            \r\n                                \r\n                            \r\n                        \r\n                        \r\n                        \r\n                         handleConfirmSubmit(form)}\r\n                        />\r\n                        \r\n                    \r\n                )\r\n            }}\r\n        \r\n    )\r\n}\r\n\r\nexport default CommitteeForm\r\n","import Container from '@material-ui/core/Container'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { FC } from 'react'\r\nimport CommitteeForm from '../../component/web/committees/CommitteeForm'\r\nimport useTranslate from '../../i18n/useTranslate'\r\n\r\nconst CommitteeEdit: FC<{}> = () => {\r\n    const translate = useTranslate()\r\n    return (\r\n        \r\n            \r\n                {translate.get('LABEL.ADD_EXPERTISE_INFO')}\r\n            \r\n            
\r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default CommitteeEdit\r\n","import { Grid, Typography, Container, makeStyles, Paper, Button } from '@material-ui/core'\r\nimport { FC, useEffect, useMemo, useState } from 'react'\r\nimport { generatePath, useHistory } from 'react-router-dom'\r\nimport useChecklist from '../../component/web/shareLogic/useChecklist'\r\nimport useLoading from '../../control/loading/useLoading'\r\nimport useTranslate from '../../i18n/useTranslate'\r\nimport { RoutePath } from '../../router/routesConfig'\r\nimport useAuthenStore from '../../stores/authen/authenStore'\r\nimport { encryptionAES } from '../../utilities/encryption'\r\n\r\ntype CommentTopicType = {\r\n    id: number\r\n    no: number\r\n    name_th: string\r\n    name_en: string\r\n    irb: number\r\n}\r\n\r\nconst ManageCheckList: FC<{}> = () => {\r\n    const [commentatyTopic, setCommentaryTopic] = useState([])\r\n\r\n    const translate = useTranslate()\r\n    const classes = useStyles()\r\n    const loadingHook = useLoading()\r\n    const history = useHistory()\r\n    const { getAllTopic } = useChecklist()\r\n    const authenStore = useAuthenStore()\r\n\r\n    const handleClickToEditForm = (topicID: number) => {\r\n        const encryptedtopicID = encryptionAES(topicID.toString())\r\n\r\n        const path = generatePath(RoutePath.addEditCheckList, {\r\n            topicID: encryptedtopicID,\r\n        })\r\n\r\n        history.push({\r\n            pathname: path,\r\n            state: {\r\n                topicID: topicID,\r\n            },\r\n        })\r\n    }\r\n\r\n    const getLut = (data: any, languageKey: string, enKey: string, thKey: string) => {\r\n        return data?.map((data: any) => ({\r\n            id: data.id,\r\n            name: languageKey === translate.languageKey.en ? data[enKey] : data[thKey],\r\n        }))\r\n    }\r\n    const commentatyLutTopic = useMemo(\r\n        () => getLut(commentatyTopic, translate.languageStore.currentLanguage, 'name_en', 'name_th'),\r\n        [commentatyTopic, translate.languageStore.currentLanguage],\r\n    )\r\n\r\n    useEffect(() => {\r\n        const allTopic = async () => {\r\n            loadingHook.loadingOpen()\r\n            const topic = await getAllTopic(Number(authenStore.profile.irb))\r\n            setCommentaryTopic(topic.result)\r\n            loadingHook.loadingClose()\r\n        }\r\n\r\n        allTopic()\r\n    }, [])\r\n    return (\r\n        \r\n            \r\n                \r\n                    \r\n                        {translate.get('LABEL.MANAGE_CHECKLIST')}\r\n                    \r\n                \r\n            \r\n\r\n            {commentatyLutTopic.map((topic: { id: number; name: string }) => {\r\n                return (\r\n                    \r\n                        \r\n                            \r\n                                 handleClickToEditForm(topic.id)}\r\n                                >\r\n                                    {translate.get('BUTTON.EDIT')}\r\n                                \r\n\r\n                                \r\n                                    \r\n                                        \r\n                                            {translate.get('LABEL.CONSIDER_TYPE')}\r\n                                        \r\n                                    \r\n\r\n                                    \r\n                                        \r\n                                            {topic.name}\r\n                                        \r\n                                    \r\n                                \r\n                            \r\n                        \r\n                    \r\n                )\r\n            })}\r\n        \r\n    )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    titleContainer: {\r\n        fontWeight: 'bold',\r\n        marginLeft: '-22px',\r\n    },\r\n    paper: {\r\n        padding: '24px',\r\n        marginBottom: '10px',\r\n        marginRight: '0px',\r\n        marginTop: '40px',\r\n        transition: '0.3s',\r\n        borderRadius: '4px',\r\n        position: 'relative',\r\n        '&:hover': {\r\n            border: `1px solid ${theme.palette.primary.main}`,\r\n        },\r\n    },\r\n    btnEdit: {\r\n        height: '44px',\r\n        minWidth: '0px',\r\n        borderRadius: '4px',\r\n        boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n        textAlign: 'center',\r\n        marginRight: '50px',\r\n        fontSize: '16px',\r\n    },\r\n    header: {\r\n        border: 'unset',\r\n        fontWeight: 'bolder',\r\n        fontSize: '16px',\r\n    },\r\n    description: {\r\n        fontWeight: 'lighter',\r\n        fontSize: '20px',\r\n        width: '100%',\r\n    },\r\n}))\r\n\r\nexport default ManageCheckList\r\n","import { Grid, Typography, Button, Paper } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { DeleteOutlineOutlined, AddOutlined, EditOutlined, CheckOutlined, CloseOutlined } from '@material-ui/icons'\r\nimport { FieldState } from 'final-form'\r\nimport _ from 'lodash'\r\nimport { MutableRefObject } from 'react'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\ninterface CheckListMainTopicProps {\r\n    name: string\r\n    editCheckList: boolean\r\n    index: number\r\n    topicChecklistID: MutableRefObject\r\n    isMobileView: boolean\r\n    fields: FieldState\r\n    addChecklistID: number[]\r\n    isDragDisabled: boolean\r\n    editMode: boolean\r\n    handleEditCheckList: (checklistID: number, nameTH: string, nameEN: string, parentID?: number) => void\r\n    setEditCheckList: (value: boolean) => void\r\n    handleDeleteCheckList: (checklistID: number, parentID?: number) => void\r\n    setAddNewSubCheckList: (value: boolean) => void\r\n    setAddChecklistID: (value: number[]) => void\r\n    pushForm: (values: any) => void\r\n}\r\n\r\nconst CheckListMainTopicComponent = ({\r\n    name,\r\n    editCheckList,\r\n    index,\r\n    topicChecklistID,\r\n    isMobileView,\r\n    fields,\r\n    addChecklistID,\r\n    isDragDisabled,\r\n    editMode,\r\n    handleEditCheckList,\r\n    setEditCheckList,\r\n    handleDeleteCheckList,\r\n    setAddNewSubCheckList,\r\n    setAddChecklistID,\r\n    pushForm,\r\n}: CheckListMainTopicProps) => {\r\n    const translate = useTranslate()\r\n    const classes = useStyles()\r\n\r\n    return (\r\n        \r\n            \r\n                \r\n                    \r\n                        {translate.get('LABEL.MAIN_TOPIC')}\r\n                    \r\n                \r\n\r\n                {editCheckList && fields.value[index].checklistID === topicChecklistID.current ? (\r\n                    \r\n                        \r\n                            \r\n                                \r\n                            \r\n                            \r\n                                \r\n                            \r\n                        \r\n\r\n                        \r\n                            }\r\n                                size={'large'}\r\n                                onClick={() =>\r\n                                    handleEditCheckList(\r\n                                        fields.value[index]?.checklistID,\r\n                                        fields.value[index].nameCheckListTH,\r\n                                        fields.value[index].nameCheckListEN,\r\n                                    )\r\n                                }\r\n                            />\r\n                            }\r\n                                size={'large'}\r\n                                onClick={() => setEditCheckList(false)}\r\n                            />\r\n                        \r\n                    \r\n                ) : (\r\n                    \r\n                        \r\n                            \r\n                                {translate.languageStore.currentLanguage === 'th'\r\n                                    ? fields.value[index].nameCheckListTH\r\n                                    : fields.value[index].nameCheckListEN}\r\n                            \r\n                        \r\n\r\n                        \r\n                            }\r\n                                size={'large'}\r\n                                onClick={() => {\r\n                                    const num = fields.value[index]?.children.length + 9999\r\n                                    let value = _.cloneDeep(fields.value)\r\n                                    value[index].children = [\r\n                                        ...value[index].children,\r\n                                        {\r\n                                            checklistID: num,\r\n                                            name: '',\r\n                                            nameTH: '',\r\n                                            nameEN: '',\r\n                                        },\r\n                                    ]\r\n\r\n                                    pushForm(value)\r\n                                    setAddNewSubCheckList(true)\r\n                                    setAddChecklistID([...addChecklistID, num])\r\n                                }}\r\n                            />\r\n                            }\r\n                                size={'large'}\r\n                                onClick={() => {\r\n                                    setEditCheckList(true)\r\n                                    topicChecklistID.current = fields.value[index]?.checklistID\r\n                                }}\r\n                            />\r\n                            }\r\n                                size={'large'}\r\n                                onClick={() => handleDeleteCheckList(fields.value[index]?.checklistID)}\r\n                            />\r\n                        \r\n                    \r\n                )}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    root: {\r\n        width: '100% !important',\r\n        '&:hover': { border: '1px solid #db5f8e !important' },\r\n    },\r\n    btnAddData: {\r\n        boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n        marginTop: '45px',\r\n        height: '42px',\r\n    },\r\n    paper: {\r\n        padding: '24px',\r\n        marginBottom: '10px',\r\n        marginRight: '0px',\r\n        // marginTop: '40px',\r\n        transition: '0.3s',\r\n        borderRadius: '4px',\r\n        position: 'relative',\r\n        '&:hover': {\r\n            border: `1px solid ${theme.palette.primary.main}`,\r\n        },\r\n    },\r\n    header: {\r\n        border: 'unset',\r\n        fontWeight: 'bolder',\r\n        fontSize: '16px',\r\n        color: theme.palette.grey[50],\r\n        padding: '5px',\r\n    },\r\n    description: {\r\n        fontWeight: 'lighter',\r\n        fontSize: '20px',\r\n        padding: '5px',\r\n    },\r\n    inputText: {\r\n        paddingLeft: '15px',\r\n    },\r\n}))\r\n\r\nexport default CheckListMainTopicComponent\r\n","import { Grid, Typography, Button, Paper } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { DeleteOutlineOutlined, EditOutlined, CheckOutlined, CloseOutlined } from '@material-ui/icons'\r\nimport { FieldState } from 'final-form'\r\nimport { Dispatch, SetStateAction, useRef } from 'react'\r\nimport { DroppableProvided, Draggable } from 'react-beautiful-dnd'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\ninterface CheckListSubTopicProps {\r\n    name: string\r\n    isMobileView: boolean\r\n    addNewSubCheckList: boolean\r\n    index: number\r\n    editSubCheckList: boolean\r\n    parentFields: FieldState\r\n    dropProvided: DroppableProvided\r\n    idDiv: string\r\n    isDragDisabled: boolean\r\n    editMode: boolean\r\n    editCheckListID: number\r\n    addChecklistID: number[]\r\n    handleAddSubCheckList: (checklistID: number, nameTH: string, nameEN: string) => void\r\n    handleEditCheckList: (checklistID: number, nameTH: string, nameEN: string, parentID: number) => void\r\n    handleDeleteCheckList: (checklistID: number, parentID: number) => void\r\n    setAddNewSubCheckList: Dispatch>\r\n    setEditSubCheckList: Dispatch>\r\n    setEditCheckListID: Dispatch>\r\n    setAddChecklistID: Dispatch>\r\n}\r\n\r\nconst CheckListSubTopic = ({\r\n    name,\r\n    isMobileView,\r\n    addNewSubCheckList,\r\n    index,\r\n    parentFields,\r\n    dropProvided,\r\n    isDragDisabled,\r\n    editCheckListID,\r\n    addChecklistID,\r\n    editMode,\r\n    handleAddSubCheckList,\r\n    handleEditCheckList,\r\n    handleDeleteCheckList,\r\n    setAddNewSubCheckList,\r\n    setEditSubCheckList,\r\n    setEditCheckListID,\r\n    setAddChecklistID,\r\n}: CheckListSubTopicProps) => {\r\n    const translate = useTranslate()\r\n    const classes = useStyles()\r\n\r\n    const isAdd = (checklistID: number) => {\r\n        return addChecklistID && addChecklistID.indexOf(checklistID) > -1\r\n    }\r\n\r\n    const isEdit = (checklistID: number) => {\r\n        return editCheckListID === checklistID\r\n    }\r\n    return (\r\n        \r\n            \r\n                \r\n                    {({ fields }) => {\r\n                        return fields.map((nameChildren, indexChildren) => (\r\n                            \r\n                                \r\n                                    {(sdragProvided) => (\r\n                                        \r\n                                            \r\n                                                \r\n                                                    \r\n                                                        {translate.get('LABEL.SUB_TOPIC')}\r\n                                                    \r\n                                                \r\n                                                {isEdit(fields.value[indexChildren]?.checklistID) ||\r\n                                                isAdd(fields.value[indexChildren]?.checklistID) ? (\r\n                                                    \r\n                                                        \r\n                                                            \r\n                                                                \r\n                                                            \r\n                                                            \r\n                                                                \r\n                                                            \r\n                                                        \r\n\r\n                                                        \r\n                                                            }\r\n                                                                size={'large'}\r\n                                                                onClick={() => {\r\n                                                                    if (addNewSubCheckList) {\r\n                                                                        handleAddSubCheckList(\r\n                                                                            parentFields.value[index]?.checklistID,\r\n                                                                            fields.value[indexChildren]?.nameTH,\r\n                                                                            fields.value[indexChildren]?.nameEN,\r\n                                                                        )\r\n                                                                    } else {\r\n                                                                        handleEditCheckList(\r\n                                                                            fields.value[indexChildren]?.checklistID,\r\n                                                                            fields.value[indexChildren]?.nameTH,\r\n                                                                            fields.value[indexChildren]?.nameEN,\r\n                                                                            parentFields.value[index]?.checklistID,\r\n                                                                        )\r\n                                                                    }\r\n                                                                }}\r\n                                                            />\r\n                                                            }\r\n                                                                size={'large'}\r\n                                                                onClick={() => {\r\n                                                                    setEditSubCheckList(false)\r\n                                                                    setEditCheckListID(0)\r\n                                                                    if (addNewSubCheckList) {\r\n                                                                        const filter = addChecklistID.filter(\r\n                                                                            (item) =>\r\n                                                                                item !==\r\n                                                                                fields.value[indexChildren]\r\n                                                                                    ?.checklistID,\r\n                                                                        )\r\n\r\n                                                                        setAddChecklistID(filter)\r\n                                                                        setAddNewSubCheckList(false)\r\n                                                                        fields.remove(indexChildren)\r\n                                                                    }\r\n                                                                }}\r\n                                                            />\r\n                                                        \r\n                                                    \r\n                                                ) : (\r\n                                                    <>\r\n                                                        \r\n                                                            \r\n                                                                \r\n                                                                    {\r\n                                                                        parentFields?.value[index]?.children[\r\n                                                                            indexChildren\r\n                                                                        ]?.name\r\n                                                                    }\r\n                                                                \r\n                                                            \r\n                                                        \r\n\r\n                                                        \r\n                                                            }\r\n                                                                size={'large'}\r\n                                                                onClick={() => {\r\n                                                                    setEditCheckListID(\r\n                                                                        fields.value[indexChildren]?.checklistID,\r\n                                                                    )\r\n                                                                    setEditSubCheckList(true)\r\n                                                                }}\r\n                                                            />\r\n                                                            }\r\n                                                                size={'large'}\r\n                                                                onClick={() =>\r\n                                                                    handleDeleteCheckList(\r\n                                                                        fields.value[indexChildren]?.checklistID,\r\n                                                                        parentFields.value[index]?.checklistID,\r\n                                                                    )\r\n                                                                }\r\n                                                            />\r\n                                                        \r\n                                                    \r\n                                                )}\r\n                                            \r\n                                        \r\n                                    )}\r\n                                \r\n                            \r\n                        ))\r\n                    }}\r\n                \r\n                {dropProvided.placeholder}\r\n            \r\n        \r\n    )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    btnAddData: {\r\n        boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n        marginTop: '45px',\r\n        height: '42px',\r\n    },\r\n    container: {\r\n        marginTop: '30px',\r\n    },\r\n    btnOrder: {\r\n        marginTop: '25px',\r\n    },\r\n    paper: {\r\n        padding: '24px',\r\n        marginBottom: '10px',\r\n        marginRight: '0px',\r\n        // marginTop: '40px',\r\n        transition: '0.3s',\r\n        borderRadius: '4px',\r\n        position: 'relative',\r\n        '&:hover': {\r\n            border: `1px solid ${theme.palette.primary.main}`,\r\n        },\r\n    },\r\n    subPaper: {\r\n        padding: '24px',\r\n        // margin: '40px 0px 10px 45px',\r\n        // margin: '0px 0px 10px 45px',\r\n        transition: '0.3s',\r\n        borderRadius: '4px',\r\n        width: '100%',\r\n        position: 'relative',\r\n        '&:hover': {\r\n            border: `1px solid ${theme.palette.primary.main}`,\r\n        },\r\n    },\r\n    header: {\r\n        border: 'unset',\r\n        fontWeight: 'bolder',\r\n        fontSize: '16px',\r\n        color: theme.palette.grey[50],\r\n        padding: '5px',\r\n    },\r\n    description: {\r\n        fontWeight: 'lighter',\r\n        fontSize: '20px',\r\n        padding: '5px',\r\n    },\r\n    inputText: {\r\n        paddingLeft: '15px',\r\n    },\r\n}))\r\n\r\nexport default CheckListSubTopic\r\n","import { Grid } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { MutableRefObject, useEffect, useRef, useState } from 'react'\r\nimport { Draggable, DraggingStyle, Droppable, NotDraggingStyle } from 'react-beautiful-dnd'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport Dialog, { DialogType } from '../../../control/dialog/dialog'\r\nimport useLoading from '../../../control/loading/useLoading'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useChecklist from '../shareLogic/useChecklist'\r\nimport CheckListMainTopicComponent from './CheckListMainTopicComponent'\r\nimport CheckListSubTopic from './CheckListSubTopic'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\n\r\nexport type AllCheckListType = {\r\n    checklistID: number\r\n    nameCheckListTH: string\r\n    nameCheckListEN: string\r\n    nameCheckList: string\r\n    children: {\r\n        checklistID: number\r\n        name: string\r\n        nameTH: string\r\n        nameEN: string\r\n    }[]\r\n}\r\n\r\ninterface CheckListMainTopicProps {\r\n    topicID: number\r\n    newID: MutableRefObject\r\n    isMobileView: boolean\r\n    checkListByID: AllCheckListType[]\r\n    isDragDisabled: boolean\r\n    getItemStyle: (\r\n        isDragging: boolean,\r\n        draggableStyle: DraggingStyle | NotDraggingStyle | undefined,\r\n    ) => React.CSSProperties\r\n    pushForm: (values: any) => void\r\n    getChecklist: () => void\r\n}\r\n\r\nconst CheckListMainTopic = ({\r\n    topicID,\r\n    newID,\r\n    isMobileView,\r\n    isDragDisabled,\r\n    getItemStyle,\r\n    pushForm,\r\n    getChecklist,\r\n}: CheckListMainTopicProps) => {\r\n    const [editCheckList, setEditCheckList] = useState(false)\r\n    const [editSubCheckList, setEditSubCheckList] = useState(false)\r\n    const [addNewSubCheckList, setAddNewSubCheckList] = useState(false)\r\n    const [editCheckListID, setEditCheckListID] = useState(0)\r\n    const [addChecklistID, setAddChecklistID] = useState([])\r\n    const [configDialog, setConfigDialog] =\r\n        useState>()\r\n    const topicChecklistID = useRef()\r\n    const translate = useTranslate()\r\n    const classes = useStyles()\r\n    const loadingHook = useLoading()\r\n    const dialogTwoRef = useRef>()\r\n    const { addNewCheckList, deleteCheckList, editAllCheckList } = useChecklist()\r\n    const { profile } = useAuthenStore()\r\n\r\n    const [editMode, setEditMode] = useState(false)\r\n\r\n    useEffect(() => {\r\n        if (editCheckList || editSubCheckList || addNewSubCheckList) {\r\n            setEditMode(true)\r\n        }\r\n\r\n        if (!editCheckList && !editSubCheckList && !addNewSubCheckList) {\r\n            setEditMode(false)\r\n        }\r\n    }, [editCheckList, editSubCheckList, addNewSubCheckList])\r\n\r\n    const onRefDialogTwo = (func: Record) => {\r\n        dialogTwoRef.current = func\r\n    }\r\n\r\n    const handleConfirmAddSubCheckList = async (newCheckList: {\r\n        topicID: number\r\n        parentID: number\r\n        nameTH: string\r\n        nameEN: string\r\n        irb: number\r\n    }) => {\r\n        dialogTwoRef.current?.closeDialog()\r\n        loadingHook.loadingOpen()\r\n\r\n        const { status, result } = await addNewCheckList(newCheckList)\r\n        if (status === 1) {\r\n            loadingHook.loadingClose()\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n                type: 'alert-message',\r\n            })\r\n            setAddNewSubCheckList(false)\r\n            newID.current = result\r\n        } else if (status === -1) {\r\n            loadingHook.loadingClose()\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('MESSAGE.M022'),\r\n                type: 'alert-message',\r\n                onAfterClose() {\r\n                    setEditMode(false)\r\n                    setAddNewSubCheckList(false)\r\n                },\r\n            })\r\n        }\r\n        dialogTwoRef.current?.openDialog()\r\n    }\r\n\r\n    const handleAddSubCheckList = async (parentID: number, nameTH: string, nameEN: string) => {\r\n        if (!nameTH || !nameEN) {\r\n            setConfigDialog({\r\n                title: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.HEADER')}`,\r\n                content: `${translate.get('MESSAGE.M015')}`,\r\n                type: 'alert-message',\r\n            })\r\n        } else {\r\n            const newCheckList = {\r\n                topicID,\r\n                parentID,\r\n                nameTH,\r\n                nameEN,\r\n                irb: Number(profile.irb),\r\n            }\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n                type: 'alert-confirm',\r\n                onClickConfirm: () => {\r\n                    handleConfirmAddSubCheckList(newCheckList)\r\n                },\r\n            })\r\n        }\r\n\r\n        dialogTwoRef.current?.openDialog()\r\n    }\r\n\r\n    const handleConfirmDelete = async (checklistID: number, parentID: number | null) => {\r\n        loadingHook.loadingOpen()\r\n\r\n        const { status, result } = await deleteCheckList(topicID, checklistID, parentID)\r\n        loadingHook.loadingClose()\r\n        if (status === 1) {\r\n            if (parentID) {\r\n                newID.current = null\r\n            } else {\r\n                newID.current = result\r\n            }\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('ALERT.CONTENT.DELETE_SUCCESS'),\r\n                type: 'alert-message',\r\n                onAfterClose: () => getChecklist(),\r\n            })\r\n        } else {\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('ALERT.CONTENT.DELETE_UNSUCCESS'),\r\n                type: 'alert-message',\r\n            })\r\n        }\r\n        dialogTwoRef.current?.openDialog()\r\n    }\r\n\r\n    const handleDeleteCheckList = (checklistID: number, parentID: number | null = null) => {\r\n        dialogTwoRef.current?.openDialog()\r\n        setConfigDialog({\r\n            title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n            content: translate.get('ALERT.CONTENT.NEED_TO_DELETE'),\r\n            type: 'alert-confirm',\r\n            onClickConfirm: () => {\r\n                handleConfirmDelete(checklistID, parentID)\r\n            },\r\n        })\r\n    }\r\n\r\n    const handleConfirmEdit = async (\r\n        checklistID: number,\r\n        parentID: number | null = null,\r\n        nameTH: string,\r\n        nameEN: string,\r\n    ) => {\r\n        loadingHook.loadingOpen()\r\n        dialogTwoRef.current?.openDialog()\r\n        const { status, result } = await editAllCheckList(topicID, checklistID, parentID, nameTH, nameEN)\r\n        if (status === 1) {\r\n            loadingHook.loadingClose()\r\n            newID.current = result ?? null\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n                type: 'alert-message',\r\n                onAfterClose: () => getChecklist(),\r\n            })\r\n        } else {\r\n            loadingHook.loadingClose()\r\n            setConfigDialog({\r\n                title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n                content: translate.get('ALERT.CONTENT.SAVE_NOT_SUCCESS'),\r\n                type: 'alert-message',\r\n            })\r\n        }\r\n\r\n        if (parentID) {\r\n            setEditSubCheckList(false)\r\n            setEditCheckListID(0)\r\n        } else {\r\n            setEditCheckList(false)\r\n        }\r\n    }\r\n\r\n    const handleEditCheckList = (\r\n        checklistID: number,\r\n        nameTH: string,\r\n        nameEN: string,\r\n        parentID: number | null = null,\r\n    ) => {\r\n        dialogTwoRef.current?.openDialog()\r\n\r\n        setConfigDialog({\r\n            title: translate.get('ALERT.TITLE.NOTIFICATION'),\r\n            content: translate.get('ALERT.CONTENT.NEED_TO_SAVE'),\r\n            type: 'alert-confirm',\r\n            onClickConfirm: () => handleConfirmEdit(checklistID, parentID, nameTH, nameEN),\r\n        })\r\n    }\r\n\r\n    return (\r\n        \r\n            \r\n                {({ fields }) => {\r\n                    return fields.map((name, index) => (\r\n                        \r\n                            \r\n                                {(provided, snapshot): JSX.Element => (\r\n                                    \r\n                                        \r\n                                            \r\n                                        \r\n\r\n                                        \r\n                                            \r\n                                                {(dropProvided, dropSnapshot) => (\r\n                                                    \r\n                                                        \r\n                                                    \r\n                                                )}\r\n                                            \r\n                                        \r\n                                    \r\n                                )}\r\n                            \r\n                        \r\n                    ))\r\n                }}\r\n            \r\n            \r\n        \r\n    )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    root: {\r\n        width: '100% !important',\r\n        '&:hover': { border: '1px solid #db5f8e !important' },\r\n    },\r\n    btnAddData: {\r\n        boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n        marginTop: '45px',\r\n        height: '42px',\r\n    },\r\n    paper: {\r\n        padding: '24px',\r\n        marginBottom: '10px',\r\n        marginRight: '0px',\r\n        // marginTop: '40px',\r\n        transition: '0.3s',\r\n        borderRadius: '4px',\r\n        position: 'relative',\r\n        '&:hover': {\r\n            border: `1px solid ${theme.palette.primary.main}`,\r\n        },\r\n    },\r\n    header: {\r\n        border: 'unset',\r\n        fontWeight: 'bolder',\r\n        fontSize: '16px',\r\n        color: theme.palette.grey[50],\r\n        padding: '5px',\r\n    },\r\n    description: {\r\n        fontWeight: 'lighter',\r\n        fontSize: '20px',\r\n        padding: '5px',\r\n    },\r\n    inputText: {\r\n        paddingLeft: '15px',\r\n    },\r\n}))\r\n\r\nexport default CheckListMainTopic\r\n","import { Grid, useTheme } from '@material-ui/core'\r\nimport { DraggingStyle, NotDraggingStyle } from 'react-beautiful-dnd'\r\nimport { ResultReorderType } from './Draggables'\r\nimport CheckListMainTopic, { AllCheckListType } from './CheckListMainTopic'\r\nimport { MutableRefObject } from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery/useMediaQuery'\r\n\r\nconst getItemStyle = (\r\n    isDragging: boolean,\r\n    draggableStyle: DraggingStyle | NotDraggingStyle | undefined,\r\n): React.CSSProperties => ({\r\n    userSelect: 'none',\r\n    padding: '24px',\r\n    margin: '0 0 16px 0',\r\n\r\n    // dragging\r\n    backgroundColor: '#fff',\r\n    border: isDragging ? '1px solid #db5f8e' : '1px solid #bdbdbd',\r\n    borderRadius: '4px',\r\n    width: '100%',\r\n    ...draggableStyle,\r\n})\r\n\r\ntype FiledDraggableProps = {\r\n    dataList: ResultReorderType[]\r\n    isDragDisabled: boolean\r\n    reloadData?: (param: any) => void\r\n    newID: MutableRefObject\r\n    checklistByID: AllCheckListType[]\r\n    pushForm: (values: any) => void\r\n    getChecklist: () => void\r\n}\r\n\r\nconst FiledDraggable = ({\r\n    dataList,\r\n    isDragDisabled,\r\n    newID,\r\n    checklistByID,\r\n    pushForm,\r\n    getChecklist,\r\n}: FiledDraggableProps) => {\r\n    const { state } = useLocation<{ topicID: number }>()\r\n    const theme = useTheme()\r\n    const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n\r\n    return (\r\n        \r\n            \r\n        \r\n    )\r\n}\r\n\r\nexport default FiledDraggable\r\n","import React, { MutableRefObject } from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport { DragDropContext, Droppable, DropResult } from 'react-beautiful-dnd'\r\nimport { Button, Grid, makeStyles, Typography } from '@material-ui/core'\r\nimport { FieldArray } from 'react-final-form-arrays'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport FiledDraggable from './FiledDraggable'\r\nimport { AllCheckListType } from './CheckListMainTopic'\r\n\r\nconst getListStyle = (isDraggingOver: boolean): React.CSSProperties => ({\r\n    margin: '16px 0px',\r\n    width: '100%',\r\n})\r\n\r\ntype DraggablesProps = {\r\n    handleOrder: (value: any) => void\r\n    isDragDisabled: boolean\r\n    handleOrderNumberMode: () => void\r\n    dataList?: AllCheckListType[]\r\n    isExpanded?: boolean\r\n    reLoadData?: (param: any) => void\r\n    newID: MutableRefObject\r\n    getChecklist: () => void\r\n}\r\n\r\nexport type ResultReorderType = {\r\n    checklistID: number\r\n    subCheckListID: number\r\n    nameCheckListTH: string\r\n    nameCheckListEN: string\r\n}\r\n\r\nconst Draggables = ({\r\n    handleOrder,\r\n    isDragDisabled,\r\n    handleOrderNumberMode,\r\n    dataList = [],\r\n    isExpanded,\r\n    reLoadData,\r\n    newID,\r\n    getChecklist,\r\n}: DraggablesProps): JSX.Element => {\r\n    const classes = useStyles()\r\n    const translate = useTranslate()\r\n\r\n    const onDragEnd = (fields: any, form: any) => (result: DropResult) => {\r\n        if (!result.destination) {\r\n            return\r\n        }\r\n\r\n        const isChildren = result.draggableId.indexOf('children') > -1\r\n\r\n        if (isChildren) {\r\n            if (result.source.droppableId !== result.destination.droppableId) {\r\n                return\r\n            }\r\n            const parentIndexString = result.source.droppableId.split('-')\r\n            const parentIndex = Number(parentIndexString[parentIndexString.length - 1])\r\n            const newC = reorder(fields.value[parentIndex].children, result.source.index, result.destination.index)\r\n            let newData = [...fields.value]\r\n            newData[parentIndex].children = newC\r\n            form.change('checkList', newData)\r\n        } else {\r\n            const items: any[] = reorder(fields.value, result.source.index, result.destination.index)\r\n            form.change('checkList', items)\r\n        }\r\n    }\r\n\r\n    const reorder = (list: ResultReorderType[], startIndex: number, endIndex: number): ResultReorderType[] => {\r\n        const result = Array.from(list)\r\n        const [removed] = result.splice(startIndex, 1)\r\n        result.splice(endIndex, 0, removed)\r\n\r\n        return result\r\n    }\r\n\r\n    const pushForm = (values: any, form: any) => {\r\n        form.change('checkList', values)\r\n    }\r\n\r\n    return (\r\n         (\r\n                
\r\n \r\n \r\n \r\n {!isDragDisabled && (\r\n \r\n \r\n \r\n * {translate.get('LABEL.DRAGABLE_LABEL')}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {isDragDisabled ? (\r\n \r\n handleOrderNumberMode()}\r\n >\r\n \r\n {translate.get('BUTTON.ORDER')}\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n \r\n {\r\n handleOrderNumberMode()\r\n form.reset() //** TODO ใช้ไม่ได้\r\n }}\r\n >\r\n {translate.get('BUTTON.CANCEL')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SAVE')}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {({ fields }) => (\r\n \r\n \r\n {(provided, snapshot): JSX.Element => (\r\n \r\n pushForm(values, form)}\r\n getChecklist={getChecklist}\r\n />\r\n {provided.placeholder}\r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n controlFieldArray: {\r\n width: '100%',\r\n // overflow: 'auto',\r\n [theme.breakpoints.down('md')]: {\r\n height: 'auto',\r\n },\r\n marginTop: '-15px',\r\n },\r\n\r\n cancelButton: {\r\n backgroundColor: '#FFFFFF',\r\n border: 'solid 1px #db5f8e',\r\n },\r\n}))\r\n\r\nexport default Draggables\r\n","import { Grid, Button, useMediaQuery, useTheme } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport { useEffect, useMemo, useRef, useState } from 'react'\r\nimport { Form } from 'react-final-form'\r\nimport { useLocation } from 'react-router-dom'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport useChecklist, { CheckListType, SubCheckListType } from '../shareLogic/useChecklist'\r\nimport arrayMutators from 'final-form-arrays'\r\nimport useLoading from '../../../control/loading/useLoading'\r\nimport useSnackbarAction from '../../../stores/snackbar/snackbarAction'\r\nimport { FormApi } from 'final-form'\r\nimport Dialog, { DialogType } from '../../../control/dialog/dialog'\r\nimport Draggables from './Draggables'\r\nimport useAuthenStore from '../../../stores/authen/authenStore'\r\n\r\nconst ChecklistTopicForm = () => {\r\n const [checkList, setCheckList] = useState([])\r\n const [configDialog, setConfigDialog] =\r\n useState>()\r\n const [isDragDisabled, setIsDragDisabled] = useState(true)\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const { state } = useLocation<{ topicID: number }>()\r\n const topicID = state?.topicID\r\n const { getCheckListByTopicID, addNewCheckList, reOrderChecklist } = useChecklist()\r\n const loadingHook = useLoading()\r\n const snackbarAction = useSnackbarAction()\r\n const newID = useRef()\r\n const dialogTwoRef = useRef>()\r\n const theme = useTheme()\r\n const isMobileView = useMediaQuery(theme.breakpoints.down('xs'))\r\n const { profile } = useAuthenStore()\r\n\r\n const onRefDialogTwo = (func: Record) => {\r\n dialogTwoRef.current = func\r\n }\r\n\r\n const getAllChecklist = (result: CheckListType[], languageKey: string) => {\r\n return result?.map((data: CheckListType) => {\r\n const subChecklistTopic = [...data.children].map((subData: SubCheckListType) => {\r\n return {\r\n checklistID: subData.checklistID,\r\n name: languageKey === translate.languageKey.th ? subData.nameTH : subData.nameEN,\r\n nameTH: subData.nameTH,\r\n nameEN: subData.nameEN,\r\n }\r\n })\r\n\r\n return {\r\n checklistID: data.checklistID,\r\n nameCheckListTH: data.nameTH,\r\n nameCheckListEN: data.nameEN,\r\n nameCheckList: languageKey === translate.languageKey.th ? data.nameTH : data.nameEN,\r\n children: subChecklistTopic,\r\n }\r\n })\r\n }\r\n\r\n const handleClickAddCheckList = async (form: FormApi>, parentID: number | null = null) => {\r\n const value = form.getState().values\r\n if (!value.newCheckListEN || !value.newCheckListTH) {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.HEADER')}`,\r\n content: `${translate.get('MESSAGE.M023')}`,\r\n type: 'alert-message',\r\n })\r\n } else {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.CONFIRM')}`,\r\n type: 'alert-confirm',\r\n onClickConfirm: () => addChecklist(form, parentID),\r\n })\r\n }\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const addChecklist = async (form: FormApi>, parentID: number | null = null) => {\r\n dialogTwoRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const value = form.getState().values\r\n if (value.newCheckList !== '') {\r\n const newCheckList = {\r\n topicID: topicID,\r\n parentID,\r\n nameTH: value.newCheckListTH,\r\n nameEN: value.newCheckListEN,\r\n irb: Number(profile?.irb),\r\n }\r\n const { status, result } = await addNewCheckList(newCheckList)\r\n if (status === 1) {\r\n loadingHook.loadingOpen()\r\n snackbarAction.openSnackbar({\r\n message: translate.get('ALERT.CONTENT.SAVE_SUCCESS'),\r\n type: 'success',\r\n })\r\n newID.current = result\r\n form.reset()\r\n loadingHook.loadingClose()\r\n } else if (status === -1) {\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M022'),\r\n type: 'error',\r\n })\r\n }\r\n } else {\r\n snackbarAction.openSnackbar({\r\n message: translate.get('MESSAGE.M015'),\r\n type: 'error',\r\n })\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const handleOrderNumberMode = () => {\r\n if (!isDragDisabled) {\r\n // * TODO รอ confirm เรื่อง form เรียกใหม่ไปก่อนเลย\r\n getCheckListByTopicID(topicID, Number(profile.irb)).then((response) => setCheckList(response))\r\n }\r\n setIsDragDisabled(!isDragDisabled)\r\n }\r\n\r\n const handleOrder = (value: any) => {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.CONFIRM')}`,\r\n type: 'alert-confirm',\r\n onClickConfirm: () => onSave(value),\r\n })\r\n\r\n dialogTwoRef.current?.openDialog()\r\n }\r\n\r\n const onSave = async (value: any[]) => {\r\n dialogTwoRef.current?.closeDialog()\r\n loadingHook.loadingOpen()\r\n const result = await reOrderChecklist(topicID, value)\r\n if (result.message.toLowerCase() === 'success') {\r\n setConfigDialog({\r\n title: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.HEADER')}`,\r\n content: `${translate.get('UM.SETTING_CONSIDERATION.MESSAGE.SUCCESS')}`,\r\n type: 'alert-message',\r\n })\r\n dialogTwoRef.current?.openDialog()\r\n handleOrderNumberMode()\r\n }\r\n loadingHook.loadingClose()\r\n }\r\n\r\n const checkListByID = useMemo(\r\n () => getAllChecklist(checkList, translate.languageStore.currentLanguage),\r\n [checkList, translate.languageStore.currentLanguage],\r\n )\r\n\r\n const getChecklist = () => {\r\n getCheckListByTopicID(topicID, Number(profile.irb)).then((response) => setCheckList(response))\r\n }\r\n\r\n useEffect(() => {\r\n getCheckListByTopicID(topicID, Number(profile.irb)).then((response) => setCheckList(response))\r\n }, [topicID, newID.current])\r\n\r\n return (\r\n <>\r\n {}}\r\n initialValues={{ newCheckListTH: '', newCheckListEN: '' }}\r\n mutators={{ ...arrayMutators }}\r\n >\r\n {({ form }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n handleClickAddCheckList(form)}\r\n >\r\n {translate.get('UM.USERGROUP-ADD.TITLE')}\r\n \r\n \r\n\r\n {checkList.length > 0 && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n btnAddData: {\r\n boxShadow: `0px 4px 4px ${theme.palette.grey['50']}`,\r\n marginTop: '45px',\r\n height: '42px',\r\n },\r\n container: {\r\n marginTop: '30px',\r\n },\r\n btnOrder: {\r\n marginTop: '25px',\r\n },\r\n paper: {\r\n padding: '24px',\r\n marginBottom: '10px',\r\n marginRight: '0px',\r\n marginTop: '40px',\r\n transition: '0.3s',\r\n borderRadius: '4px',\r\n position: 'relative',\r\n '&:hover': {\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n },\r\n subPaper: {\r\n padding: '24px',\r\n margin: '40px 0px 10px 45px',\r\n transition: '0.3s',\r\n borderRadius: '4px',\r\n position: 'relative',\r\n '&:hover': {\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n },\r\n header: {\r\n border: 'unset',\r\n fontWeight: 'bolder',\r\n fontSize: '16px',\r\n color: theme.palette.grey[50],\r\n padding: '5px',\r\n },\r\n description: {\r\n fontWeight: 'lighter',\r\n fontSize: '20px',\r\n padding: '5px',\r\n },\r\n inputText: {\r\n paddingLeft: '15px',\r\n },\r\n}))\r\n\r\nexport default ChecklistTopicForm\r\n","import { Grid, Typography, Container } from '@material-ui/core'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport ChecklistTopicForm from '../../component/web/checklist/ChecklistTopicForm'\r\nimport useTranslate from '../../i18n/useTranslate'\r\n\r\nfunction AddEditCheckList() {\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {translate.get('UM.USERGROUP-ADD.TITLE')}\r\n \r\n \r\n \r\n\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n titleContainer: {\r\n fontWeight: 'bold',\r\n marginLeft: '-22px',\r\n },\r\n}))\r\n\r\nexport default AddEditCheckList\r\n","import Button from '@material-ui/core/Button'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { styled } from '@material-ui/core/styles'\r\nimport { FC } from 'react'\r\nimport { useForm } from 'react-final-form'\r\nimport MyTextfield from '../../../control/textfield/textfield'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\n\r\nconst CustomBtn = styled(Button)(() => ({\r\n minWidth: '0px',\r\n boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)',\r\n}))\r\n\r\nconst SearchResearcher: FC<{}> = () => {\r\n const translate = useTranslate()\r\n const form = useForm()\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n form.reset()\r\n form.submit()\r\n }}\r\n color=\"default\"\r\n >\r\n {translate.get('BUTTON.RESET')}\r\n \r\n \r\n \r\n \r\n {translate.get('BUTTON.SEARCH')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default SearchResearcher\r\n","import { deleteResearcher, postSearchResearcher } from \"../../../services/um/umServiceURL\"\r\nimport useCallApi from \"../../../utilities/axios\"\r\n\r\n\r\nconst useResearcherHook = () => {\r\n const callApi = useCallApi()\r\n\r\n const searchResearcher = async (keyword?: string, rowPerPage = 10) => {\r\n const response = await callApi.axiosPost({\r\n url: postSearchResearcher,\r\n params: {\r\n keyword: keyword ?? null,\r\n pageNo: 1,\r\n rowPerPage\r\n }\r\n })\r\n return response?.data\r\n }\r\n\r\n const deleteResearcherByID = async (userID?: number) => {\r\n const response = await callApi.axiosDelete({\r\n url: `${deleteResearcher}/${userID}`\r\n })\r\n return response?.data\r\n }\r\n\r\n return {\r\n searchResearcher,\r\n deleteResearcherByID\r\n }\r\n}\r\n\r\nexport default useResearcherHook","import Grid from '@material-ui/core/Grid'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { styled } from '@material-ui/styles'\r\nimport { FC, useRef } from 'react'\r\nimport { useForm } from 'react-final-form'\r\nimport { ButtonView } from '../../../control/button/button'\r\nimport Dialog from '../../../control/dialog/dialog'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { researcherInfo, SearchResearcherResponse } from '../../../services/um/types/researcherType'\r\nimport useResearcherHook from '../../web/shareLogic/useResearcherHook'\r\n\r\nconst CustomPaper = styled(Paper)({\r\n width: '100%',\r\n padding: 24,\r\n margin: '16px 0px',\r\n '&:hover': {\r\n border: `1px solid #db5f8e`,\r\n },\r\n})\r\n\r\nconst HeaderTypo = styled(Typography)({\r\n fontWeight: 'bold',\r\n})\r\n\r\nconst SearchResearcherResult: FC<{\r\n submitSearch: (values: Record, resetPage: boolean, lazy?: boolean) => Promise\r\n searchResult?: SearchResearcherResponse\r\n}> = ({ submitSearch, searchResult }) => {\r\n const translate = useTranslate()\r\n const dialogSuccessRef = useRef>()\r\n const dialogDeleteRef = useRef>()\r\n const deleteUserRef = useRef()\r\n const form = useForm()\r\n const researcherHook = useResearcherHook()\r\n\r\n const bindSuccessRef = (func: Record) => {\r\n dialogSuccessRef.current = { ...func }\r\n }\r\n\r\n const bindDeleteRef = (func: Record) => {\r\n dialogDeleteRef.current = { ...func }\r\n }\r\n\r\n const openConfirmDelete = (data: researcherInfo) => {\r\n deleteUserRef.current = data\r\n dialogDeleteRef.current?.openDialog()\r\n }\r\n\r\n const handleDelete = () => {\r\n researcherHook.deleteResearcherByID(deleteUserRef.current?.userID).then(() => {\r\n dialogDeleteRef.current?.closeDialog()\r\n dialogSuccessRef.current?.openDialog()\r\n }).catch(() => {\r\n dialogDeleteRef.current?.closeDialog()\r\n })\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {translate.get('LABEL.SEARCH_TOTAL_RESULT', [`${searchResult?.total}`])}\r\n \r\n \r\n \r\n {searchResult?.result?.map((data: researcherInfo, index) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n openConfirmDelete(data)}>\r\n {translate.get('BUTTON.DELETE')}\r\n \r\n \r\n \r\n \r\n      \r\n \r\n \r\n \r\n \r\n {translate.get('UM.USERGROUP.FULLNAME')}\r\n \r\n \r\n \r\n \r\n {translate.languageStore.currentLanguage === translate.languageKey.th\r\n ? data.fullnameTH\r\n : data.fullnameEN}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.USERGROUP.USERNAME')}\r\n \r\n \r\n \r\n {data.username}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.PROFILE.CONTACT_NUMBER')}\r\n \r\n \r\n \r\n {data.mobilePhone ?? '-'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n submitSearch(form.getState().values, false)}\r\n />\r\n \r\n \r\n )\r\n}\r\n\r\nexport default SearchResearcherResult\r\n","import Container from '@material-ui/core/Container'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { FC, useEffect, useRef, useState } from 'react'\r\nimport { Form as FinalForm } from 'react-final-form'\r\nimport SearchResearcher from '../../component/um/researcher/SearchResearcher'\r\nimport SearchResearcherResult from '../../component/um/researcher/SearchResearcherResult'\r\nimport useResearcherHook from '../../component/web/shareLogic/useResearcherHook'\r\nimport SearchAccordion from '../../control/accordion/SearchAccordion'\r\nimport useLoading from '../../control/loading/useLoading'\r\nimport useTranslate from '../../i18n/useTranslate'\r\nimport { SearchResearcherResponse } from '../../services/um/types/researcherType'\r\n\r\nconst ManageResearcher: FC<{}> = () => {\r\n const initialFormValues = {\r\n keyword: '',\r\n researcherType: null,\r\n }\r\n const [searchResult, setSearchResult] = useState()\r\n const translate = useTranslate()\r\n const loadingHook = useLoading()\r\n const researcherHook = useResearcherHook()\r\n const currentPageNoRef = useRef(1)\r\n const formRef = useRef>()\r\n const elRef = useRef(null)\r\n\r\n const submitSearch = async (values: Record, resetPage: boolean, lazy = false) => {\r\n if (resetPage) {\r\n currentPageNoRef.current = 1\r\n }\r\n loadingHook.loadingOpen()\r\n const response = await handleSearch(values)\r\n loadingHook.loadingClose()\r\n if (lazy) {\r\n setTimeout(() => {\r\n setSearchResult(response ?? [])\r\n }, 400)\r\n } else {\r\n setSearchResult(response ?? [])\r\n }\r\n }\r\n\r\n const handleSearch = (values: Record) => {\r\n return researcherHook.searchResearcher(values.keyword, currentPageNoRef.current * 10)\r\n }\r\n\r\n const handleScroll = async () => {\r\n if (elRef.current && isBottom(elRef.current)) {\r\n window.removeEventListener('scroll', handleScroll)\r\n await handleScrollEnd()\r\n setTimeout(() => {\r\n window.addEventListener('scroll', handleScroll, { passive: true })\r\n }, 1000)\r\n }\r\n }\r\n\r\n const isBottom = (el: any) => {\r\n return el.getBoundingClientRect().bottom - window.innerHeight * 0.01 <= window.innerHeight\r\n }\r\n\r\n const handleScrollEnd = () => {\r\n currentPageNoRef.current = currentPageNoRef.current + 1\r\n return submitSearch(formRef?.current?.getState()?.values, false, true)\r\n }\r\n\r\n useEffect(() => {\r\n submitSearch(\r\n {\r\n keyword: null,\r\n },\r\n true,\r\n )\r\n window.addEventListener('scroll', handleScroll, { passive: true })\r\n return () => {\r\n window.removeEventListener('scroll', handleScroll)\r\n }\r\n }, [])\r\n\r\n return (\r\n \r\n submitSearch(val, true)} initialValues={initialFormValues}>\r\n {({ form }) => {\r\n formRef.current = form\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default ManageResearcher\r\n","import { Container, Grid, Typography, Card, CardContent, CardHeader, styled, makeStyles } from '@material-ui/core'\r\nimport useTranslate from '../../../i18n/useTranslate'\r\nimport { useEffect, useState } from 'react'\r\nimport useWebService from '../../../services/web/useWebService'\r\nimport { ButtonClose } from '../../web/project/page/pageAction'\r\nimport { HistoryFileInfo } from '../../../services/web/types/responseWebServiceTypes'\r\nimport { formatDateToString } from '../../../utilities/date'\r\nimport { useHistory, useParams } from 'react-router-dom'\r\nimport useEditUsergroup from '../../../services/um/useEditUsergroup'\r\n\r\nconst CustomHeader = styled(CardHeader)({\r\n borderBottom: '1px solid #DCDCDC',\r\n})\r\n\r\nconst CustomUnderlineGrid = styled(Grid)({\r\n borderBottom: '1px solid #DCDCDC',\r\n})\r\n\r\nfunction UserHistoryUpload() {\r\n const [historyInfo, setHistoryInfo] = useState([])\r\n const translate = useTranslate()\r\n const classes = useStyles()\r\n const iconPath = '/img/icons/pdf.png'\r\n const { getUserHistoryUpload } = useWebService()\r\n const history = useHistory()\r\n const params = useParams<{ userID: string }>()\r\n const { officerInfo } = useEditUsergroup(params.userID)\r\n const handleClose = () => {\r\n history.push('/officer')\r\n setHistoryInfo([])\r\n }\r\n\r\n useEffect(() => {\r\n const getHistoryUpload = () => {\r\n const listFile = officerInfo?.documentInfo[0].uploadFileObj.fileList.filter(\r\n (item) => item.replaceFileID !== null,\r\n )\r\n listFile?.forEach(async (item) => {\r\n const { result } = await getUserHistoryUpload(item.replaceFileID, Number(params.userID))\r\n setHistoryInfo((prev) => [...prev, ...result])\r\n })\r\n }\r\n getHistoryUpload()\r\n }, [officerInfo?.documentInfo])\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {translate.get('UM.USERGROUP.OFFICER.UPLOAD-HISTORY')}\r\n \r\n }\r\n />\r\n \r\n {historyInfo\r\n .sort((a, b) => new Date(b.updatedDate).valueOf() - new Date(a.updatedDate).valueOf())\r\n .map((data, index) => (\r\n \r\n {!!index && (\r\n \r\n  \r\n \r\n )}\r\n \r\n \r\n {translate.get('LABEL.FILE_NAME')} :\r\n \r\n {` ${data.fileName}`}\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.FILE_UPLOAD_BY')} :{` ${data.updatedBy}`}\r\n \r\n \r\n \r\n \r\n {translate.get('LABEL.FILE_UPLOAD_DATE')} :\r\n {` ${formatDateToString([data.updatedDate])}`}\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n imgPDF: {\r\n width: 20,\r\n height: 20,\r\n margin: '0px 0px -5px 10px',\r\n },\r\n}))\r\n\r\nexport default UserHistoryUpload\r\n","// import Login from '../component/authen/login2/login'\r\nimport Playground from '../component/web/playground/playground'\r\n// import ResearchPaperManage from '../component/web/researchPaperManage/researchPaperManage'\r\nimport ManageProjectManager from '../component/web/manageProject/manageProject'\r\n\r\nimport DescriptionIcon from '@material-ui/icons/Description'\r\nimport SportsEsportsIcon from '@material-ui/icons/SportsEsports'\r\n// import EditManager from '../component/web/manageProject/edit/editManager'\r\n// import CreateManager from '../component/web/manageProject/create/createManager'\r\nimport RichTextBox from '../component/web/playground/RichText/showRichTextbox'\r\nimport Report from '../component/um/dashboard/report/Report'\r\nimport Reviewer from '../pages/Reviewer'\r\nimport Expired from '../pages/Expired'\r\nimport Closed from '../pages/Closed'\r\nimport Login from '../pages/Login'\r\n\r\nimport RegisterExternal from '../pages/RegisterExternal'\r\nimport ExternalResearcher from '../pages/ExternalResearcher'\r\nimport ApproveExResearcher from '../pages/ApproveExResearcher'\r\n\r\nimport ForgotPassword from '../pages/ForgotPassword'\r\nimport Officer from '../pages/Officer'\r\nimport UsergroupAdd from './../pages/UsergroupAdd'\r\nimport UsergroupEdit from './../pages/UsergroupEdit'\r\n\r\nimport PreferenceProfile from '../pages/Preference'\r\nimport Activate from '../pages/Activate'\r\nimport ActivateForgot from '../pages/ActivateForgotPassword'\r\nimport Dashboard from '../pages/Dashboard'\r\nimport AllExport from '../pages/TestExport'\r\n\r\nimport FirstTime from '../pages/FirstTime'\r\nimport Hold from '../pages/Hold'\r\nimport ConnectLine from '../pages/ConnectLine'\r\n\r\nimport SettingCertificate from '../pages/SettingCertificate'\r\nimport SettingFaculty from '../pages/SettingFaculty'\r\nimport SettingFacultyAdd from './../pages/SettingFacultyAdd'\r\nimport SettingRECAdd from '../pages/SettingRECAdd'\r\nimport SettingRECEdit from '../pages/settingRECEdit'\r\nimport SettingDocument from '../pages/SettingDocument'\r\nimport SettingREC from '../pages/SettingREC'\r\nimport SettingDocumentAdd from '../pages/SettingDocumentAdd'\r\nimport SettingDocumentEdit from '../pages/SettingDocumentEdit'\r\nimport SettingFacultyEdit from '../pages/SettingFacultyEdit'\r\nimport SettingConsideration from '../pages/SettingConsideration'\r\nimport SettingConsiderationEdit from '../pages/SettingConsiderationEdit'\r\nimport Landing from '../pages/Landing'\r\nimport ProjectManager from '../component/web/project/projectManager'\r\nimport constWebFunction from '../constants/webFunction'\r\nimport ExternalProject from '../pages/ExternalProject'\r\nimport DocumentVerifyHistory from '../pages/DocumentVerifyHistory'\r\nimport AddExternalProject from '../pages/AddExternalProject'\r\nimport PendingHistory from '../component/web/manageProject/search/PendingHistory'\r\nimport ConsiderTypeHistory from '../component/web/shareUI/defineType/ConsiderTypeHistory'\r\nimport ManageExpertises from '../pages/ManageExpertises'\r\nimport ExpertiseForm from '../component/web/expertises/ExpertiseForm'\r\nimport ManageCommittees from '../pages/committees/ManageCommittees'\r\nimport CommitteeEdit from '../pages/committees/CommitteeEdit'\r\nimport ManageCheckList from '../pages/checklist/ManageCheckList'\r\nimport AddEditCheckList from '../pages/checklist/AddEditCheckList'\r\nimport ManageResearcher from '../pages/researcher/ManageResearcher'\r\nimport UserHistoryUpload from '../component/um/officer/UserHistoryUpload'\r\n\r\nexport enum RoutePath {\r\n root = '/',\r\n login = '/login',\r\n playground = '/playground',\r\n researchManage = '/research-manage',\r\n manageProject = '/manage-project',\r\n // manageProjectEdit = '/manage-project/:id/edit', //'/manage-project/:id/edit',\r\n manageProjectEdit = '/manage-project/:projectID/:submittedID/edit',\r\n documentVerifyHistory = '/document-verify-history/:projectData',\r\n manageProjectCreateRequest = '/manage-project/create',\r\n // manageProjectView = '/manage-project/:id', //'/manage-project/:id/view',\r\n activate = '/authen/activate',\r\n activateForgotPassword = '/forgot-password/activate',\r\n manageExternalProject = '/manage-external-project',\r\n manageExternalProjectFormAdd = '/manage-external-project/add',\r\n manageExternalProjectFormEdit = `/manage-external-project/:projectID/edit`,\r\n projectPendingHistory = '/project-pending-history/:projectData',\r\n considerTypeHistory = '/consider-type-history/:projectData',\r\n\r\n register = '/external/register',\r\n externalResearcher = '/external-researcher/register',\r\n approveExResearcher = '/external-researcher/:id/approve',\r\n forgotPassword = '/forgot-password',\r\n profileForm = '/profile-form',\r\n\r\n officer = '/officer',\r\n preference = '/preference',\r\n userGroupAdd = '/officer/add',\r\n userGroupEdit = '/officer/:id/edit',\r\n userGroupHistoryUpload = '/officer/fileHistory/:userID',\r\n\r\n reviewer = '/reviewer/',\r\n firstTime = '/firsttime/',\r\n hold = '/hold/',\r\n expired = '/expired/',\r\n\r\n closed = '/closed',\r\n Report = '/report',\r\n\r\n dashboard = '/dashboard',\r\n testExport = '/test-export',\r\n\r\n settingCertificate = '/settingCertificate',\r\n settingREC = '/SettingREC',\r\n settingFaculty = '/setting-faculty',\r\n settingFacultyAdd = '/setting-faculty/add',\r\n settingFacultyEdit = '/setting-faculty/:id/edit',\r\n settingConsideration = '/setting-consideration',\r\n settingConsiderationEdit = '/setting-consideration/:id/edit',\r\n settingRECAdd = '/settingREC/Add',\r\n settingRECEdit = '/settingREC/:id/edit',\r\n settingDocument = '/settingDocument',\r\n settingDocumentAdd = '/settingDocument/add',\r\n settingDocumentEdit = '/settingDocument/:id/edit',\r\n\r\n manageExpertises = '/manage-expertises',\r\n expertisesAdd = '/expertises/add',\r\n expertisesEdit = '/expertises/:id/edit',\r\n\r\n manageCommittees = '/manage-committees',\r\n committeeEdit = '/manage-committees/:id/edit',\r\n\r\n manageCheckList = '/manage-checklist',\r\n addEditCheckList = '/manage-checklist/:topicID',\r\n\r\n manageResearcher = '/manage-researcher',\r\n\r\n landing = '/landing',\r\n}\r\n\r\nexport type RoutesType = {\r\n functionID?: number //id matching with database\r\n path: string\r\n component: any\r\n exact: boolean\r\n isDisplayMenu: boolean\r\n menuName: string\r\n menuLabelKey: string\r\n menuID: string\r\n menuIcon: JSX.Element\r\n subRoute?: Array\r\n allowAccessGroupID?: number[]\r\n}\r\nexport const lstPublicRoutes: Array = [\r\n {\r\n path: RoutePath.root,\r\n component: Login,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'root',\r\n menuLabelKey: '',\r\n menuID: 'public_root',\r\n menuIcon: <>,\r\n },\r\n {\r\n path: RoutePath.activate,\r\n component: Activate,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'activate',\r\n menuLabelKey: '',\r\n menuID: 'public_root',\r\n menuIcon: <>,\r\n },\r\n {\r\n path: RoutePath.activateForgotPassword,\r\n component: ActivateForgot,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'activate',\r\n menuLabelKey: '',\r\n menuID: 'public_root',\r\n menuIcon: <>,\r\n },\r\n {\r\n path: RoutePath.login,\r\n component: Login,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'Login',\r\n menuLabelKey: '',\r\n menuID: 'public_login',\r\n menuIcon: <>,\r\n },\r\n {\r\n path: RoutePath.forgotPassword,\r\n component: ForgotPassword,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'Forgot Password',\r\n menuLabelKey: '',\r\n menuID: 'public_login',\r\n menuIcon: <>,\r\n },\r\n {\r\n path: RoutePath.register,\r\n component: RegisterExternal,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon:
,\r\n menuID: 'rich-text',\r\n subRoute: [],\r\n },\r\n // {\r\n // path: RoutePath.userGroupAdd,\r\n // component: UsergroupAdd,\r\n // exact: true,\r\n // isDisplayMenu: false,\r\n // menuName: '-',\r\n // menuLabelKey: '-',\r\n // menuIcon:
,\r\n // menuID: 'rich-text',\r\n // subRoute: [],\r\n // },\r\n // {\r\n // path: RoutePath.userGroupEdit,\r\n // component: UsergroupEdit,\r\n // exact: true,\r\n // isDisplayMenu: false,\r\n // menuName: '-',\r\n // menuLabelKey: '-',\r\n // menuIcon:
,\r\n // menuID: 'rich-text',\r\n // subRoute: [],\r\n // },\r\n {\r\n path: RoutePath.register,\r\n component: RegisterExternal,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'register',\r\n menuLabelKey: '',\r\n menuID: 'public_login',\r\n menuIcon: <>,\r\n },\r\n {\r\n path: '/connect/line',\r\n component: ConnectLine,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'connectLine',\r\n menuLabelKey: '',\r\n menuID: 'connect_line',\r\n menuIcon: <>,\r\n },\r\n {\r\n path: RoutePath.landing,\r\n component: Landing,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'landingPage',\r\n menuLabelKey: '',\r\n menuID: 'landing_page',\r\n menuIcon: <>,\r\n },\r\n //\r\n]\r\n\r\nexport const lstPrivateRoutes: Array = [\r\n {\r\n path: RoutePath.playground,\r\n component: Playground,\r\n exact: false,\r\n isDisplayMenu: false,\r\n menuName: 'Play Ground',\r\n menuLabelKey: 'playground',\r\n menuID: 'private_playground',\r\n menuIcon: ,\r\n },\r\n {\r\n functionID: constWebFunction.dashboard,\r\n path: RoutePath.dashboard,\r\n component: Dashboard,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: 'แดชบอร์ด',\r\n menuLabelKey: 'LABEL.DASHBOARD',\r\n menuIcon: ,\r\n menuID: 'dashboard',\r\n subRoute: [],\r\n allowAccessGroupID: [1, 2, 3, 4, 5, 6, 7],\r\n },\r\n {\r\n functionID: constWebFunction.dashboard,\r\n path: RoutePath.firstTime,\r\n component: FirstTime,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '',\r\n menuLabelKey: '',\r\n menuID: 'firsttime',\r\n menuIcon: <>,\r\n },\r\n {\r\n functionID: constWebFunction.dashboard,\r\n path: RoutePath.reviewer,\r\n component: Reviewer,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '',\r\n menuLabelKey: '',\r\n menuIcon: ,\r\n menuID: 'reviewer',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.dashboard,\r\n path: RoutePath.hold,\r\n component: Hold,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '',\r\n menuLabelKey: '',\r\n menuID: 'hold',\r\n menuIcon: <>,\r\n },\r\n {\r\n functionID: constWebFunction.dashboard,\r\n path: RoutePath.expired,\r\n component: Expired,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '',\r\n menuLabelKey: '',\r\n menuIcon: ,\r\n menuID: 'expired',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.dashboard,\r\n path: RoutePath.closed,\r\n component: Closed,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '',\r\n menuLabelKey: '',\r\n menuIcon: ,\r\n menuID: 'closed',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.dashboard,\r\n path: RoutePath.Report,\r\n component: Report,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '',\r\n menuLabelKey: '',\r\n menuIcon: ,\r\n menuID: 'report',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageProject,\r\n path: RoutePath.manageProject,\r\n component: ManageProjectManager,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: 'จัดการโครงการ',\r\n menuLabelKey: 'LABEL.PROJECT_MANAGEMENT',\r\n menuIcon: ,\r\n menuID: 'private_ResearchPaperManage',\r\n subRoute: [],\r\n allowAccessGroupID: [1, 2, 3, 4, 5, 6, 7],\r\n },\r\n {\r\n functionID: constWebFunction.manageProject,\r\n path: RoutePath.manageProjectEdit,\r\n component: ProjectManager,\r\n // component: EditManager,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon:
,\r\n menuID: 'private_manage_project_edit',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageProject,\r\n path: RoutePath.manageProjectCreateRequest,\r\n component: ProjectManager,\r\n // component: CreateManager,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon:
,\r\n menuID: 'private_manage_project_create',\r\n subRoute: [],\r\n },\r\n /** Start History */\r\n {\r\n functionID: constWebFunction.manageProject,\r\n path: RoutePath.documentVerifyHistory,\r\n component: DocumentVerifyHistory,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon:
,\r\n menuID: 'private_document_verify_history',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageProject,\r\n path: RoutePath.projectPendingHistory,\r\n component: PendingHistory,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon:
,\r\n menuID: 'private_project_pending_history',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageProject,\r\n path: RoutePath.considerTypeHistory,\r\n component: ConsiderTypeHistory,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon:
,\r\n menuID: 'private_consider_type_history',\r\n subRoute: [],\r\n },\r\n /** End History */\r\n /** Start Manage External Projects */\r\n {\r\n functionID: constWebFunction.manageExternalProject,\r\n path: RoutePath.manageExternalProject,\r\n component: ExternalProject,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: 'จัดการโครงการนอกระบบก่อนปี 2565',\r\n menuLabelKey: 'LABEL.EXTERNAL_PROJECT_MANAGEMENT',\r\n menuIcon: ,\r\n menuID: 'private_ExternalProjectManage',\r\n subRoute: [],\r\n allowAccessGroupID: [2, 3, 6, 7],\r\n },\r\n {\r\n functionID: constWebFunction.manageExternalProject,\r\n path: RoutePath.manageExternalProjectFormAdd,\r\n component: AddExternalProject,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon: <>,\r\n menuID: 'form_add_ExternalProjectManage',\r\n },\r\n {\r\n functionID: constWebFunction.manageExternalProject,\r\n path: RoutePath.manageExternalProjectFormEdit,\r\n component: AddExternalProject,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon: <>,\r\n menuID: 'form_edit_ExternalProjectManage',\r\n },\r\n /** End Manage External Projects */\r\n /** Start Expertises LUT */\r\n {\r\n functionID: constWebFunction.manageExpertises,\r\n path: RoutePath.manageExpertises,\r\n component: ManageExpertises,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon: ,\r\n menuID: 'private_manage_expertises',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageExpertises,\r\n path: RoutePath.expertisesAdd,\r\n component: ExpertiseForm,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon: ,\r\n menuID: 'private_expertises_add',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageExpertises,\r\n path: RoutePath.expertisesEdit,\r\n component: ExpertiseForm,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon: ,\r\n menuID: 'private_expertises_edit',\r\n subRoute: [],\r\n },\r\n /** End Expertises LUT */\r\n /** Start Manage Researcher */\r\n {\r\n functionID: constWebFunction.manageResearcher,\r\n path: RoutePath.manageResearcher,\r\n component: ManageResearcher,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon: ,\r\n menuID: 'private_manage_researcher',\r\n subRoute: [],\r\n },\r\n /** End Manage Researcher */\r\n {\r\n functionID: constWebFunction.manageExternalResearcher,\r\n path: RoutePath.externalResearcher,\r\n component: ExternalResearcher,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: 'จัดการข้อมูลผู้วิจัยภายนอก',\r\n menuLabelKey: 'UM.EXTERNAL-RESEARCHER.MENU',\r\n menuIcon: ,\r\n menuID: 'external-researcher',\r\n subRoute: [],\r\n allowAccessGroupID: [2],\r\n },\r\n {\r\n functionID: constWebFunction.manageExternalResearcher,\r\n path: RoutePath.approveExResearcher,\r\n component: ApproveExResearcher,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'พิจารณาข้อมูลนักวิจัยภายนอก',\r\n menuLabelKey: 'พิจารณาข้อมูลนักวิจัยภายนอก',\r\n menuIcon: ,\r\n menuID: 'external-researcher-approve',\r\n subRoute: [],\r\n },\r\n /** Start Manage Committees */\r\n {\r\n functionID: constWebFunction.manageCommittees,\r\n path: RoutePath.manageCommittees,\r\n component: ManageCommittees,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon: ,\r\n menuID: 'private_manage_committees',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageCommittees,\r\n path: RoutePath.committeeEdit,\r\n component: CommitteeEdit,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon: ,\r\n menuID: 'private_committee_edit',\r\n subRoute: [],\r\n },\r\n /** End Manage Committees */\r\n {\r\n functionID: constWebFunction.manageUser,\r\n path: RoutePath.officer,\r\n component: Officer,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: 'รายชื่อผู้ใช้งานระบบ',\r\n menuLabelKey: 'รายชื่อผู้ใช้งานระบบ',\r\n menuIcon: ,\r\n menuID: 'officer',\r\n subRoute: [],\r\n allowAccessGroupID: [1, 2, 3, 4, 5, 6, 7],\r\n },\r\n {\r\n functionID: constWebFunction.manageUser,\r\n path: RoutePath.userGroupEdit,\r\n component: UsergroupEdit,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'แก้ไขข้อมูล user',\r\n menuLabelKey: 'แก้ไขข้อมูล user',\r\n menuIcon: ,\r\n menuID: 'officer-edit',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageUser,\r\n path: RoutePath.userGroupAdd,\r\n component: UsergroupAdd,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'เพิ่มข้อมูล user',\r\n menuLabelKey: 'เพิ่มข้อมูล user',\r\n menuIcon: ,\r\n menuID: 'officer-add',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageUser,\r\n path: RoutePath.userGroupHistoryUpload,\r\n component: UserHistoryUpload,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'ประวัติการ Upload',\r\n menuLabelKey: 'ประวัติการ Upload',\r\n menuIcon: ,\r\n menuID: 'officer-fileHistory',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageFaculty,\r\n path: RoutePath.settingFaculty,\r\n component: SettingFaculty,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: 'จัดการคณะ / สำนักงาน / วิทยาลัยที่เกี่ยวข้องกับโครงการ',\r\n menuLabelKey: 'จัดการคณะ / สำนักงาน / วิทยาลัยที่เกี่ยวข้องกับโครงการ',\r\n menuIcon: ,\r\n menuID: 'settingFaculty',\r\n subRoute: [],\r\n allowAccessGroupID: [1, 2, 3, 4, 5, 6, 7],\r\n },\r\n {\r\n functionID: constWebFunction.manageFaculty,\r\n path: RoutePath.settingFacultyAdd,\r\n component: SettingFacultyAdd,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'เพิ่มข้อมูลคณะ / สำนักงาน / วิทยาลัยที่เกี่ยวข้องกับโครงการ',\r\n menuLabelKey: 'เพิ่มข้อมูล Setting คณะ / สำนักงาน / วิทยาลัยที่เกี่ยวข้องกับโครงการ',\r\n menuIcon: ,\r\n menuID: 'SettingFacultyAdd',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageFaculty,\r\n path: RoutePath.settingFacultyEdit,\r\n component: SettingFacultyEdit,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'แก้ไขข้อมูล Setting คณะ / สำนักงาน / วิทยาลัยที่เกี่ยวข้องกับโครงการ',\r\n menuLabelKey: 'แก้ไขข้อมูล Setting คณะ / สำนักงาน / วิทยาลัยที่เกี่ยวข้องกับโครงการ',\r\n menuIcon: ,\r\n menuID: 'SettingFacultyEdit',\r\n subRoute: [],\r\n },\r\n {\r\n functionID: constWebFunction.manageREC,\r\n path: RoutePath.settingREC,\r\n component: SettingREC,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: 'รายชื่อกลุ่มสหสถาบัน',\r\n menuLabelKey: 'LABEL.SETTINGREC',\r\n menuIcon: ,\r\n menuID: 'settingREC',\r\n subRoute: [],\r\n allowAccessGroupID: [1, 2, 3, 4, 5, 6, 7],\r\n },\r\n {\r\n functionID: constWebFunction.manageREC,\r\n path: RoutePath.settingRECAdd,\r\n component: SettingRECAdd,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '',\r\n menuLabelKey: '',\r\n menuID: 'settingRECAdd',\r\n menuIcon: <>,\r\n },\r\n {\r\n functionID: constWebFunction.manageREC,\r\n path: RoutePath.settingRECEdit,\r\n component: SettingRECEdit,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '',\r\n menuLabelKey: '',\r\n menuID: 'settingRECEdit',\r\n menuIcon: <>,\r\n },\r\n {\r\n functionID: constWebFunction.manageProjectSubmittedType,\r\n path: RoutePath.settingDocument,\r\n component: SettingDocument,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: 'SettingDocument',\r\n menuLabelKey: 'LABEL.SETTINGDOCUMENT',\r\n menuIcon: ,\r\n menuID: 'SettingDocument',\r\n subRoute: [],\r\n allowAccessGroupID: [1, 2, 3, 4, 5, 6, 7],\r\n },\r\n {\r\n functionID: constWebFunction.manageProjectSubmittedType,\r\n path: RoutePath.settingDocumentAdd,\r\n component: SettingDocumentAdd,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '',\r\n menuLabelKey: '',\r\n menuID: 'settingDocumentAdd',\r\n menuIcon: <>,\r\n },\r\n {\r\n functionID: constWebFunction.manageProjectSubmittedType,\r\n path: RoutePath.settingDocumentEdit,\r\n component: SettingDocumentEdit,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '',\r\n menuLabelKey: '',\r\n menuID: 'settingDocumentEdit',\r\n menuIcon: <>,\r\n },\r\n {\r\n functionID: constWebFunction.manageEditResultOfConsideration,\r\n path: RoutePath.settingConsideration,\r\n component: SettingConsideration,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: 'จัดการแก้ไขชื่อผลการพิจารณา ',\r\n menuLabelKey: 'จัดการแก้ไขชื่อผลการพิจารณา ',\r\n menuIcon: ,\r\n menuID: 'setting',\r\n subRoute: [],\r\n allowAccessGroupID: [1, 2, 3, 4, 5, 6, 7],\r\n },\r\n {\r\n functionID: constWebFunction.manageEditResultOfConsideration,\r\n path: RoutePath.settingConsiderationEdit,\r\n component: SettingConsiderationEdit,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'แก้ไขข้อมูล Setting แก้ไขชื่อผลการพิจารณา ',\r\n menuLabelKey: 'แก้ไขข้อมูล Setting แก้ไขชื่อผลการพิจารณา ',\r\n menuIcon: ,\r\n menuID: 'SettingConsiderationEdit',\r\n subRoute: [],\r\n },\r\n /** Start Manage Checklist */\r\n {\r\n functionID: constWebFunction.manageCheckList,\r\n path: RoutePath.manageCheckList,\r\n component: ManageCheckList,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: 'จัดการรายการแบบฟอร์มความเห็นพิจารณาโครงการ',\r\n menuLabelKey: 'LABEL.MANAGE_CHECKLIST',\r\n menuIcon: ,\r\n menuID: 'private_manage_checklist',\r\n subRoute: [],\r\n allowAccessGroupID: [2],\r\n },\r\n {\r\n functionID: constWebFunction.manageCheckList,\r\n path: RoutePath.addEditCheckList,\r\n component: AddEditCheckList,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuIcon: <>,\r\n menuID: 'private_manage_checklist_form',\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n },\r\n /** End Manage Checklist */\r\n {\r\n functionID: constWebFunction.manageCertificateAndStamp,\r\n path: RoutePath.settingCertificate,\r\n component: SettingCertificate,\r\n exact: true,\r\n isDisplayMenu: true,\r\n menuName: 'เปลี่ยนข้อความในใบรับรองและตราสำนักงาน',\r\n menuLabelKey: 'LABEL.SETTINGCERTIFICATE',\r\n menuIcon: ,\r\n menuID: 'settingCertificate',\r\n subRoute: [],\r\n allowAccessGroupID: [1, 2, 3, 4, 5, 6, 7],\r\n },\r\n {\r\n path: '/richtext',\r\n component: RichTextBox,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: '-',\r\n menuLabelKey: '-',\r\n menuIcon:
,\r\n menuID: 'rich-text',\r\n subRoute: [],\r\n },\r\n {\r\n path: RoutePath.testExport,\r\n component: AllExport,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'test',\r\n menuLabelKey: 'test',\r\n menuIcon: ,\r\n menuID: 'test',\r\n subRoute: [],\r\n },\r\n // {\r\n // path: RoutePath.manageProjectView,\r\n // component: EditManager,\r\n // exact: true,\r\n // isDisplayMenu: false,\r\n // menuName: '-',\r\n // menuLabelKey: '-',\r\n // menuIcon:
,\r\n // menuID: 'private_manage_project_view',\r\n // subRoute: [],\r\n // },\r\n {\r\n functionID: constWebFunction.preference,\r\n path: RoutePath.preference,\r\n component: PreferenceProfile,\r\n exact: true,\r\n isDisplayMenu: false,\r\n menuName: 'Preference Profile',\r\n menuLabelKey: '',\r\n menuID: 'public_login',\r\n menuIcon: <>,\r\n },\r\n]\r\n"],"sourceRoot":""}