{"version":3,"sources":["components/common/helpers/roles.ts","components/common/helpers/rules.ts","components/common/helpers/status.ts","components/common/helpers/recaptcha-res.ts","components/common/helpers/messages.ts","components/common/services/http-requester.ts","components/common/services/projects-svc.ts","components/common/services/patients-svc.ts","components/common/services/utils-svc.ts","components/common/services/users-svc.ts","components/common/services/payment-svc.ts","components/common/services/data-svc.ts","components/modules/new-project/constants.ts","components/modules/new-project/actionTypes.js","components/modules/new-project/actions.ts","components/modules/new-project/model.ts","components/common/static/loading-animation/loader.tsx","components/common/static/textbox.tsx","components/common/static/numberbox.tsx","components/common/static/dropdown.tsx","components/common/static/textarea.tsx","components/common/static/toggle-btn.tsx","components/common/static/date-menu.tsx","components/modules/new-project/components/project-info/general.tsx","components/common/static/toggle-btn-nonCMS.tsx","components/modules/new-project/components/project-info/patients.tsx","components/modules/new-project/components/project-info/index.tsx","components/common/static/emailbox.tsx","components/modules/new-project/components/researcher-info/personal.tsx","components/modules/new-project/components/researcher-info/company.tsx","components/modules/new-project/components/researcher-info/index.tsx","components/common/static/multiselect.tsx","components/common/static/GDPR-toggle.tsx","components/modules/new-project/components/patient-info/additional.tsx","components/common/static/select-menu.tsx","components/common/static/async-select-menu.tsx","components/common/static/checkbox-toggle.tsx","components/modules/new-project/components/patient-info/disease.tsx","components/modules/new-project/components/patient-info/index.tsx","components/common/static/confirm-page.tsx","components/modules/new-project/components/component-root.tsx","components/modules/new-project/containers/component-root.tsx","components/modules/new-project/reducer.ts","components/modules/new-project/index.ts","components/modules/patient-profile/constants.ts","components/modules/patient-profile/actionTypes.js","components/modules/patient-profile/model.ts","components/modules/patient-profile/actions.ts","components/modules/patient-profile/components/personal-info/generic.tsx","components/modules/patient-profile/components/personal-info/specific.tsx","components/modules/patient-profile/components/personal-info/index.tsx","components/modules/patient-profile/components/experience-info/disease-exp.tsx","components/modules/patient-profile/components/experience-info/proj-exp.tsx","components/modules/patient-profile/components/experience-info/index.tsx","components/modules/patient-profile/components/preference-info/comp-req.tsx","components/modules/patient-profile/components/preference-info/proj-req.tsx","components/modules/patient-profile/components/preference-info/index.tsx","components/modules/patient-profile/components/component-root.tsx","components/modules/patient-profile/containers/component-root.tsx","components/modules/patient-profile/reducer.ts","components/modules/patient-profile/index.ts","components/modules/home/constants.ts","components/modules/home/actionType.js","components/modules/home/actions.ts","images/net_ball_half.png","images/net_ball_light.png","components/modules/home/components/testimonials.tsx","images/why-eupati/why1.png","images/why-eupati/why2.png","images/why-eupati/why4.png","images/why-eupati/why5.png","images/why-eupati/why6.png","images/why-eupati/why9.png","components/api-authorization/ApiAuthorizationConstants.js","components/api-authorization/AuthorizeService.js","components/common/static/auth-context.tsx","components/modules/home/components/component-root.tsx","images/researcher.png","images/patient.png","images/why-eupati/why3.png","images/why-eupati/why7.png","images/why-eupati/why8.png","images/net_ball_partial.png","images/patient-engagement-tools/engagement_separator.png","images/patient-engagement-tools/roadmap.png","images/patient-engagement-tools/guidances.png","images/faq/faq_separator.png","images/faq/how_does_work.png","components/modules/home/containers/component-root.tsx","components/modules/home/reducer.ts","components/modules/home/index.ts","components/modules/admin/all-projects/constants.ts","components/modules/admin/all-projects/actionTypes.js","components/modules/admin/all-projects/model.ts","components/modules/admin/all-projects/actions.ts","components/common/static/arrows-menu.tsx","components/common/static/patient-details.tsx","components/common/static/popup-modal.tsx","components/common/static/react-table-checkbox.tsx","components/common/static/matched-patients-grid.tsx","components/common/static/manual-search/index.tsx","components/common/static/project-details.tsx","components/common/static/global-filter.tsx","components/common/static/projects-grid.tsx","components/modules/admin/all-projects/components/component-root.tsx","components/modules/admin/all-projects/containers/component-root.tsx","components/common/static/csv-import/csv-mapping-helper.ts","components/modules/admin/all-projects/reducer.ts","components/modules/admin/all-projects/index.ts","components/modules/admin/import-patients/constants.ts","components/modules/admin/import-patients/actionTypes.js","components/modules/admin/import-patients/actions.ts","components/common/static/csv-import/csv-mapping.tsx","components/modules/admin/import-patients/model.ts","components/common/static/import-preview-grid.tsx","components/modules/admin/import-patients/components/component-root.tsx","components/modules/admin/import-patients/containers/component-root.tsx","components/modules/admin/import-patients/reducer.ts","components/modules/admin/import-patients/index.ts","components/modules/admin/all-patients/constants.ts","components/modules/admin/all-patients/actionTypes.js","components/modules/admin/all-patients/actions.ts","components/common/static/confirm-deny-modal.tsx","components/common/static/patients-grid.tsx","components/modules/admin/all-patients/components/component-root.tsx","components/modules/admin/all-patients/containers/component-root.tsx","components/modules/admin/all-patients/reducer.ts","components/modules/admin/all-patients/index.ts","components/modules/admin/admins-ls/constants.ts","components/modules/admin/admins-ls/actionTypes.js","components/modules/admin/admins-ls/actions.ts","components/common/static/admins-grid.tsx","components/modules/admin/admins-ls/components/component-root.tsx","components/modules/admin/admins-ls/containers/component-root.tsx","components/modules/admin/admins-ls/reducer.ts","components/modules/admin/admins-ls/index.ts","components/modules/admin/content-editor/constants.ts","components/modules/admin/content-editor/actionTypes.js","components/modules/admin/content-editor/actions.ts","components/common/static/tinymce-editor.tsx","components/modules/admin/content-editor/components/component-root.tsx","components/modules/admin/content-editor/containers/component-root.tsx","components/modules/admin/content-editor/reducer.ts","components/modules/admin/content-editor/models.ts","components/modules/admin/content-editor/index.ts","components/modules/admin/price-catalog/constants.ts","components/modules/admin/price-catalog/actionTypes.js","components/modules/admin/price-catalog/actions.ts","components/common/helpers/pricing-list.ts","components/common/static/prices-grid.tsx","components/modules/admin/price-catalog/components/component-root.tsx","components/modules/admin/price-catalog/containers/component-root.tsx","components/modules/admin/price-catalog/reducer.ts","components/modules/admin/price-catalog/index.ts","components/modules/pricing/constants.ts","components/modules/pricing/actionType.js","components/modules/pricing/actions.ts","images/pricing/asterics.png","components/modules/pricing/components/basic-plan.tsx","components/modules/pricing/components/tailor-made-plan.tsx","components/modules/pricing/components/custom-plan.tsx","components/modules/pricing/components/component-root.tsx","components/modules/pricing/containers/component-root.tsx","components/modules/pricing/reducer.ts","components/modules/pricing/index.ts","components/modules/admin/content-management/constants.ts","components/modules/admin/content-management/actionTypes.js","components/modules/admin/content-management/actions.ts","components/modules/admin/content-management/components/content.tsx","components/modules/admin/content-management/components/component-root.tsx","components/modules/admin/content-management/containers/component-root.tsx","components/modules/admin/content-management/reducer.ts","components/modules/admin/content-management/model.ts","components/modules/admin/content-management/index.ts","components/modules/admin/email-templates/constants.ts","components/modules/admin/email-templates/actionTypes.js","components/modules/admin/email-templates/models.ts","components/modules/admin/email-templates/actions.ts","components/common/static/template-editor.tsx","components/common/static/actions-template-menu.tsx","components/modules/admin/email-templates/components/component-root.tsx","components/modules/admin/email-templates/containers/component-root.tsx","components/modules/admin/email-templates/reducer.ts","components/modules/admin/email-templates/index.ts","components/modules/confirm/constants.ts","components/modules/confirm/actionTypes.js","components/modules/confirm/actions.ts","components/modules/confirm/components/component-root.tsx","components/modules/confirm/containers/component-root.tsx","components/modules/confirm/reducer.ts","components/modules/confirm/index.ts","components/modules/payment/constants.ts","components/modules/payment/actionType.js","components/modules/payment/actions.ts","components/common/static/checkout-outcome.tsx","components/common/static/stripe-card.tsx","components/modules/payment/components/component-root.tsx","components/modules/payment/containers/component-root.tsx","components/modules/payment/reducer.ts","components/modules/payment/index.ts","store/index.ts","components/common/static/routes/admin-routes.js","components/common/static/routes/protected-route.js","images/logo.jpg","components/api-authorization/Login.js","components/api-authorization/LoginMenu.js","components/common/static/navbar.tsx","components/common/static/footer.tsx","components/common/static/Layout.tsx","components/api-authorization/Logout.js","components/api-authorization/ApiAuthorizationRoutes.js","App.tsx","registerServiceWorker.ts","index.tsx","store/configureStore.ts"],"names":["roles","requiredMessage","required","selectOptionMessage","notRequired","projectStatus","patientStatus","response","FAIL_AUTH_MSG","ADMIN_ACCESS_DENIED_MSG","SUCC_UPDATED_CATALOGS","INVALID_PRICING_DATA","INVALID_PAYMENT_METHOD","EMAILS_COPIED_MSG","SELECTED_ALL_MSG","REMOVE_ADMIN_SUCC_MSG","APPROVE_ADMIN_SUCC_MSG","REMOVE_PT_SUCC_MSG","ADD_PT_TO_PROJ_MSG","CONFIRM_PATIENT_MSG","DEL_PT_FROM_PROJ_MSG","ARCHIVE_PROJ_SUCC_MSG","SAVED_NEW_PRICES_MSG","SEND_EMAILS_SUCC_MSG","INVALID_NUMERIC_INPUT","CANCEL_PRICES_UPDATE","EMAIL_TEMPLATE_CREATED","EMAIL_TEMPLATE_UPDATED","FILL_ALL_FIELD_ERR_MSG","ANSWER_SUBMIT_SUCC","SUCC_ASSIGN_ACTIONS_TO_TEMPLATE","axios","require","HttpRequester","rootUrl","url","this","error","console","JSON","stringify","msg","message","data","status","path","that","Promise","resolve","reject","fullPath","get","then","result","handleError","content","post","headers","baseUrl","ProjectsSvc","httpRequester","httpGet","project","httpPost","id","inputModel","PatientSvc","patient","patientData","patientsData","UtilsSvc","condition","uid","tokenObj","name","contentData","UsersSvc","admin","PaymentSvc","DataSvc","projectsSvc","patientSvc","utilsSvc","usersSvc","paymentSvc","NAME","SET_PROJECTS_LOADING","SET_PROJECT","SET_LOOKUP_DATA","SET_IS_USER_REAL","setProjectLoading","isLoading","type","t","payload","setProject","setLookUpData","setIsUserReal","isUserReal","getLookUpDataAsync","dispatch","getState","getLookUpData","saveNewProjectAsync","newProject","saveNewProject","verifyUserTokenAsync","token","verifyUserByRecaptchaToken","recaptchaToken","Res","emptyProject","overview","projectTypeId","projectActivityId","projectNumberOfPatientsNeeded","interactionTypeId","roleAndExpectations","startDate","undefined","endDate","timeRequired","isCompensationProvided","compensation","isThereTravelReimbursement","equipmentRequirements","responseDeadline","diseases","noDiseaseExpertiseRequired","searchDiseaseTherapeuticArea","price","plan","package","paymentMethod","patientExpertises","patientExpertisesDescription","countries","languages","otherInformation","pocFirstName","projectTypeDescription","pocLastName","pocOrganisation","pocOrganisationTypeId","pocOrganisationTypeDescription","pocJobTitle","pocCountryId","pocPhoneNumber","pocEmail","isGDPRConsentGiven","matchedPatients","confirmedPatients","EupatiLoader","className","props","text","React","EupatiTextbox","Form","Group","Control","fieldType","value","placeholder","onChange","e","errorMsg","EupatiNumberbox","EupatiDropdown","state","vals","compare","bind","values","fieldName","toLowerCase","includes","setState","sort","a","b","optionsComponent","dropdownComponent","length","map","x","i","key","defaultOptionText","disabled","as","style","width","EupatiTextarea","element","height","current","scrollHeight","rows","rowsCount","placeholderMsg","isDisabled","ref","EupatiToggleBtn","returnProperIconType","icon","valuesComponent","btnComponent","ToggleButton","faDotCircle","clear","display","overflow","whiteSpace","trim","ToggleButtonGroup","EupatiDateMenu","toString","ProjectGeneralInfo","history","useHistory","useForm","handleSubmit","control","watch","errors","reset","formState","fieldsData","adjustFieldsValues","onSubmit","toast","Messages","push","updatedProject","Object","assign","showPatientsInfoSection","Label","defaultValue","returnProperDefaultValue","rules","Rules","render","field","returnProperLookUpData","projectId","projectTypes","find","toggleField","Button","variant","onClick","prevPage","EupatiNonCMSToggleBtn","isMoreThanTwoOptions","pop","ProjectPatientsInfo","nextPage","val","fieldToggle","hidePatientsInfoSection","ProjectInfo","useState","showSecondSubComponent","nextBtnClicked","setNextBtnClicked","toggleSectionVisibility","margin","EupatiEmailbox","PersonalInfo","showCompanyInfoSection","visibility","CompanyInfo","faInfoCircle","findLookUpData","orgTypeId","organisationTypes","hideCompanyInfoSection","ResearcherInfo","ALL_ELEMENTS_OPTION","EupatiMultiselect","handleOnChange","ids","forEach","multiSelectComponent","border","faCheckSquare","EupatiGDPRBtn","gdprComponent","href","target","PatientsAdditionalInfo","submitProject","ptExpertises","otherType","ot","some","hidePatientsAdditionalInfoSection","EupatiSelect","mapOptionsToValues","options","item","option","label","langCompare","mapArrayToValues","arr","newElement","returnComponentStyles","continentsBoldStyles","multiValueLabel","base","backgroundColor","color","padding","paddingLeft","multiValueRemove","cursor","dropdownIndicator","indicatorsContainer","fontWeight","menu","position","menuList","regularStyles","event","isMulti","styles","EupatiDiseaseAsyncSelect","mapDiseaseOptionsToValues","treeNumbers","loadAutocompleteOptions","inputValue","applyFiltersTimeoutId","clearTimeout","setTimeout","getMeshRecommendations","diseaseOptions","m","join","originalTerm","loadOptions","EupatiCheckbox","checked","CUSTOM_SPAN_STYLES","PatientsDiseaseInfo","showPatientsAdditionalInfoSection","multiline","isAutocomplete","flexDirection","fontSize","noDiseaseExpertise","PatientInfo","EupatiConfirmPage","marginTop","to","ComponentRoot","showComponentByIndex","nextPageHandler","previousPageHandler","historyState","location","window","initialProjectData","submitNewProject","prevState","lookUpDataType","lookUpData","filter","dataType","mainComponent","loadingComponent","spanStyles","borderRadius","action","onVerify","connect","globalState","Constants","Actions","RootComponent","initialState","setProjectsLoading","actions","components","Components","containers","Containers","constants","reducer","Root","SET_PATIENTS_LOADING","SET_PATIENT_INFO","SET_PATIENT_DATA_LOADING","defaultPatientInfo","firstName","lastName","phoneNumber","email","birthYear","genderTypeId","countryId","countriesWithExperience","isPOAffiliated","patientOrganisation","patientExperienceId","projectTypeExperiences","projectTypeExperiencesDescription","patientExpertiseDescription","genderTypeDescription","organisationPreferenceDescription","projectPreferenceDescription","isEligibleForCompensation","isAvailableForNoCompensation","projectPreferences","organisationPreferences","activityPreferenceId","matchedProjects","confirmedProjects","isBannedFromSearch","setPatientLoading","setPatientInfo","setPatientDataLoading","isPatientDataLoaded","updatePatientAsync","updatePatient","getRidOfIncorrectNullValues","saveNewPatientAsync","savePatient","getPatientInfoByIdAsync","patientId","getPatientById","getPatientInfoByUserIdAsync","userId","getPatientByUserId","object","updatedPatientObject","PatientGenericInfo","editedPatientInfo","showPatientSpecificInfoSection","PatientSpecificInfo","otherGenderType","gt","fieldGenderTypeToggle","fieldIsPOAffiliatedToggle","hidePatientSpecificInfoSection","PatientGeneralInfo","PatientsDiseaseExpInfo","hidePatientsDiseaseExpInfo","PatientsProjectExpInfo","showPatientsDiseaseExpInfo","togglePtExpertiseField","projTypeExp","toggleProjTypeExpField","PatientExpcInfo","PatientProjectReqInfo","orderLookUpOptionsByNameLength","showPatientCompensationReqInfo","projPrefs","toggleProjPrefField","orgTypes","toggleOrgPrefField","PatientCompensationReqInfo","isNewPatient","submitNewPatient","hidePatientCompensationReqInfo","RequirementsInfo","showLoadingComponent","locationState","setPatientData","isUserPatient","setUserPatientData","SET_HOME_LOADING","SET_HOME_LOGGED_IN","setHomeLoading","setHomeLoggedInStatus","isLoggedIn","setUserStatusAsync","isUserAdmin","Testimonials","carouselProps","autoPlay","interval","centerMode","centerSlidePercentage","infiniteLoop","showStatus","showThumbs","ApplicationName","QueryParameterNames","LogoutActions","LoginActions","prefix","ApplicationPaths","DefaultLoginRedirectPath","ApiAuthorizationClientConfigurationUrl","ApiAuthorizationPrefix","Login","LoginFailed","LoginCallback","Register","Profile","LogOut","LoggedOut","LogOutCallback","IdentityRegisterPath","IdentityManagePath","AuthorizeService","_callbacks","_nextSubscriptionId","_user","_isAuthenticated","_timesCalled","_popUpDisabled","getUser","user","profile","ensureUserManagerInitialized","userManager","promise","res","access_token","signinSilent","createArguments","silentUser","updateState","log","success","Error","signinPopup","popUpUser","signinRedirect","redirect","signinCallback","signoutPopup","signoutRedirect","signoutCallback","notifySubscribers","callback","subscription","subscriptionId","subscriptionIndex","index","found","splice","useReplaceToNavigate","AuthenticationResultStatus","Fail","Success","Redirect","fetch","ok","json","settings","automaticSilentRenew","includeIdTokenInSilentRenew","userStore","WebStorageStateStore","UserManager","events","addUserSignedOut","removeUser","authService","defaultState","userIdentity","AuthenticationContext","createContext","AuthenticationProvider","children","setIsUserAdmin","setUserIdentity","Provider","authenticateUser","role","toUpperCase","Roles","sub","context","setUserStatus","whyComponent","noteComponent","statsComponent","patientEngagementComponent","testimonialComponent","faqComponent","PatientBtn","withRouter","pathname","ResearcherBtn","Card","boxShadow","Img","src","Body","Title","textAlign","Text","imgWhy1","imgWhy2","imgWhy4","imgWhy5","imgWhy6","imgWhy9","imgNetBallHalf","faCheck","imgNetBallLight","contextType","isAdmin","SET_LOADING","SET_PROJECTS","SET_PROJECTS_FILTER","SET_MATCHED_PATIENTS","SET_MATCHED_PATIENTS_LOADING","SET_PROJECT_DATA","SET_PROJECT_LOADING","SET_TEMPLATES_LOADING","SET_EMAIL_TEMPLATES","SET_SINGLE_EMAIL_TEMPLATE","defaultEmailTemplate","subject","htmlContent","setLoading","setProjects","projects","setIsProjectsLoading","isProjectsLoading","setProjectsFilter","setMatchedPatients","setMatchedPatientsLoading","isMatchedPatientsLoading","setProjectData","setEmailTemplates","emailTemplates","setSingleEmailTemplate","singleEmailTemplate","setEmailTemplateLoading","emailTemplateLoading","getAllFilteredProjectsAsync","getAllProjects","projectStatusId","updateSearchPatients","searchData","projectName","searchPatients","pt","getProjectDataByIdAsync","getProjectById","removePatientFromProjectAsync","removePatientFromProject","addPatientToProjectAsync","assignPatientToProject","changePatientStatusToConfirmAsync","changePatientStatusToConfirm","changeProjectStatusAsync","statusId","changeProjectStatus","submitEmailDataAsync","sendEmail","catch","getAllEmailTemplatesAsync","getAllEmailTemplates","getEmailTemplateByNameAsync","getEmailTemplateByName","EupatiArrowsMenu","isBtnDisabled","setIsBtnDisabled","btnCursorProps","setBtnCursorProps","displayStylesProp","backBtnHandler","faArrowLeft","leftArrowText","isForwardArrowAvail","forwardBtnHandler","rightArrowText","assignPatientFromProject","EupatiPatientDetails","backBtnClicked","returnValueById","returnJoinedArrayValues","propName","projectPropId","propType","propValue","fieldProps","patientInfo","d","Table","striped","bordered","hover","escape_quotes","EmailModalPopup","isMaxSize","setIsMaxSize","singleTemplateData","setSingleTemplateData","targetedPeople","recipients","split","submitRequest","returnHtmlContent","patients","tp","handleTemplateOnChange","parseInt","selectTemplateByIndex","handleEditorChange","updatedHtmlContent","trigger","btnText","modal","close","onFocus","stopPropagation","faWindowClose","faWindowMaximize","faWindowMinimize","templates","dropdownValues","apiKey","init","menubar","convert_urls","relative_urls","remove_script_host","plugins","toolbar","content_style","onEditorChange","Check","forwardRef","indeterminate","rest","defaultRef","useRef","resolvedRef","useEffect","EupatiPatientsGrid","allTemplates","setAllTemplates","setDropdownValue","localeCompare","templatesToLookUpOptions","returnLookUpValueByTypeAndId","rightBtnHandler","rightBtnText","removePatient","deleteProjectPatient","addPatient","patientSearchData","addProjectPatient","useMemo","concat","country","expertises","pe","columns","Header","accessor","useTable","useRowSelect","hooks","isManualSearchBtnClicked","visibleColumns","cols","getToggleAllRowsSelectedProps","Cell","row","getToggleRowSelectedProps","getTableProps","getTableBodyProps","headerGroups","prepareRow","selectedFlatRows","toggleAllRowsSelected","headerGroup","getHeaderGroupProps","col","getHeaderProps","getRowProps","cells","cell","getCellProps","original","patientProfileBtnHandler","toggleComponents","leftBtnText","isConfirmed","changePatientStatus","isPatientProfileClicked","backToProjectProfile","alignItems","justifyContent","marginBottom","resetValues","selectedTemplate","EupatiManualMatch","isSubmitBtnClicked","setIsSubmitBtnClicked","setIsPatientProfileClicked","ptSearchData","setPtSearchData","loadingComp","patientsGridComp","EupatiProjectDetails","manualSearchBtnHandler","convertDate","setProjectById","date","pad","Date","getDate","getMonth","getFullYear","s","page","document","getElementById","html2canvas","canvas","imgData","toDataURL","pdf","jsPDF","addImage","open","output","backToAllProjects","textDecoration","downloadPDF","GlobalFilter","setFilter","OUTLINE_PADDING_STYLE","paddingRight","PRIMARY_PADDING_STYLE","EupatiAllProjectsGrid","isDetailsBtnClicked","setIsDetailsBtnClicked","clickedProjectId","setClickedProjectId","changeProjectStatusHandler","findIndex","unshift","projectsDetailsComp","projectStatusHandler","isProjectLoading","statuses","createdOn","org","statusText","useGlobalFilter","useSortBy","usePagination","previousPage","canNextPage","canPreviousPage","pageOptions","gotoPage","pageCount","setPageSize","setGlobalFilter","globalFilter","pageSize","pageIndex","getSortByToggleProps","isSorted","isSortedDesc","faSortAlphaDown","faSortAlphaUp","colSpan","min","preventDefault","pageNum","Number","projectsFilter","isNaN","ProjectStatus","filename","uniqid","faFileExcel","newMappedObj","SET_IS_DATA_SUBMITTED","SET_LOOK_UP_DATA","setIsDataSubmitted","isDataSubmitted","submitMatchedDataAsync","importPatients","CSVMappingComponent","mapping","selectMatchingCsvColumn","finishMapping","mapItem","objectProperty","csvColumnName","isOptionSelected","objPropsOptions","keys","csvObject","k","mappingComponent","objectProperties","p","FormGroup","ImportProperties","csvDataToJson","mappedData","j","ImportPreviewGrid","lookUpOptions","errorMessage","lookUpValue","expertise","isMappingMode","isPreviewMode","csvImportTypeHandler","readCSVData","handleReadingError","activateMapping","submitData","fileInfo","debug","err","patientExpertise","l","md","submitPatientsData","uploadCSVComponent","csvMappingComponent","previewComponent","confirmPage","cssClass","onFileLoaded","parserOptions","header","dynamicTyping","skipEmptyLines","encoding","transformHeader","replace","onError","inputId","inputName","inputStyle","csvMappingProps","previewData","slice","mappedPreviewData","FormLabel","getLookUpDate","SET_PATIENTS","SET_PATIENT_INFO_LOADING","setPatients","setIsPatientsLoading","isPatientsLoading","setPatientInfoLoading","isPatientInfoLoading","getAllPatientsAsync","getAllPatients","getPatientByIdAsync","removePatientByIdAsync","ConfirmDenyModal","toLocaleUpperCase","params","handleRemove","targetId","EupatiAllPatients","patientsDetailsComp","handleRemovePatient","removePatientById","phone","gender","patientExperience","activityPreference","pp","pte","op","c","loadComp","patientDetails","showPatientDetails","handlePatientDetails","setPatientsLoading","SET_ADMINS_LOADING","SET_ADMINS","setIsAdminsLoading","isAdminsLoading","setAdmins","admins","getAllAdminsAsync","getAllAdmins","removeAdminAsync","ownerId","getEupatiUserById","removeAdmin","approveAdminAsync","getAdminById","approveAdmin","EupatiAllAdminsGrid","contextData","useContext","handleOnRemove","Parser","setAdminsData","mainComp","removeAdminData","Component","setAdminsLoading","SET_CONTENT_LOADING","SET_CONTENT_RESPONSE","setContentLoading","isContentLoading","setContentResponse","contentResponse","getContentByNameAsync","getContent","updateContentAsync","updateContent","TinyMCEditor","editorRef","onInit","evt","editor","initialValue","setup","ui","registry","addButton","onAction","_","insertContent","pageName","rawDraftContent","SET_IS_CATALOGS_LOADING","SET_CATALOGS_DATA","setIsCatalogsLoading","isCatalogsLoading","setCatalogsData","catalogsData","getCatalogsPricesAsync","getPriceCatalogs","updateCatalogsPricesAsync","updatePriceCatalogs","CATALOG_TYPES","Basic","TailorMade","CATEGORY_NAMES","Researcher","Industry","Academia","OPTION_NAMES","CONVERTED_NAMES","EupatiPricesGrid","isEditBtnClicked","setIsEditBtnClicked","tempData","setTempData","formatNumber","num","Math","round","toFixed","convertCategoriesNames","convertOptionsNames","category","info","setCatalogsPrices","updateCatalogsPrices","catalogIndex","convertCatalogTypesNames","categoryOptionsData","categoryIndex","basePrice","updatedData","onChangeBasePriceHandler","parseFloat","additionalOptionsData","optionIndex","onChangeOptionsPriceHandler","totalPrice","SET_PRICING_LOADING","SET_PRICING_LOGGED_IN","SET_IS_USER_ADMIN","setPricingLoading","setPricingLoggedInStatus","getCatalogsPricesDataAsync","BasicPlanComponent","bgColor","selectedOption","setSelectedOption","faChevronDown","setIcon","faChevronUp","paymentIcon","setPaymentIcon","selectedPaymentMethod","setSelectedPaymentMethod","defaultPaymentMethod","setDefaultPaymentMethod","updatePaymentMethodOnClick","method","paymentMethods","pm","selectedOptionStyle","submitBtn","pricingCard","Accordion","Toggle","eventKey","returnIcon","Collapse","basicPlanCategories","categoryName","updatedState","priceChanged","paymentOptions","top","left","methodIndex","paymentsCard","submitBasic","defaultActiveKey","astericsImg","paddingTop","minHeight","DEFAULT_COLOR_SELECTED","DEFAULT_OPTIONS_MENU","TailorMadeComponent","additionals","updateAdditionalOptionsOnClick","updatedAdditionals","updatedText","removeItemFromAdditionals","addItemToAdditionals","displayCategoryNameWithOptions","optionNames","o","categoriesCard","tailorMadePlanCategories","optionsBlock","Fragment","optionName","faSquare","submitTailorMade","CustomPlanComponent","contactUsBtn","paddingBottom","lineHeight","returnCategoriesArrayByCatalogType","catalogType","priceCatalog","catalogData","tabs","Nav","Item","Link","tabContents","Tab","Pane","Container","Content","HtmlToReactParser","EupatiPrivacyPage","reactElement","parse","reactHtml","ReactDOMServer","renderToStaticMarkup","contentName","dangerouslySetInnerHTML","__html","CURRENT_PATH","substring","SET_EMAIL_TEMPLATES_LOADING","SET_EMAIL_TEMPLATE_DATA","SET_SINGLE_EMAIL_TEMPLATE_LOADING","SET_SINGLE_EMAIL_TEMPLATE_DATA","SET_PROJECT_MODEL_PROPS_NAMES","SET_PATIENT_MODEL_PROPS_NAMES","SET_TRIGGERS_MENU_OPTIONS","SET_TRIGGERS_MENU_OPTIONS_LOADING","SET_RECEIVERS_MENU_OPTIONS","SET_CHOOSEN_RECEIVERS","emptyTemplate","setIsEmailTemplatesLoading","isEmailTemplatesLoading","setEmailTemplatesData","emailTemplatesData","setIsSingleEmailTemplateLoading","isSingleEmailTemplateLoading","setSingleEmailTemplateData","emailTemplateData","setProjectModelPropsNames","projectModelPropsNames","setPatientModelPropsNames","patientModelPropsNames","setTriggersMenuOptions","emailAutomationTriggers","setTriggersMenuOptionsLoading","isTriggersMenuOptionsLoading","setReceiversMenuOptions","receiversMenuOptions","setChoosenReceivers","choosenReceivers","setAllEmailTemplatesAsync","setEmailTemplateByIdAsync","getEmailTemplate","createNewEmailTemplateAsync","addEmailTemplate","updateEmailTemplateDataAsync","alterEmailTemplateData","removeEmailTemplateDataAsync","removeEmailTemplate","setModelsPropsNamesAsync","getClassPropertiesNames","projectProps","items","patientsProps","setTriggersMenuOptionsAsync","getEmailAutomationTriggers","assignActionsToEmailTemplateAsync","assignActionsToEmailTemplate","misallocateActionsFromEmailTemplateAsync","misallocateActionsFromEmailTemplate","emailTemplateId","setReceiversMenuOptionsAsync","setEmailTriggerTemplateBeneficiariesAsync","getEmailTriggerTemplateBeneficiaries","randomstring","EmailTemplateEditor","eupatiURL","emailTemplateName","setEmailTemplateName","emailTemplateSubject","setEmailTemplateSubject","updatedEmailTemplateData","onSaveTemplateChangesHandler","onBackToAllHandler","properties","title","generate","addNestedMenuItem","getSubmenuItems","projectPropsNames","patientPropsNames","ActionsTemplateMenu","emailTemplate","eta","templateTriggers","setTemplateTriggers","assignActionsToTemplate","receivers","triggersMenuOptions","tt","EmailTemplates","isCreateTemplateClicked","setIsCreateTemplateClicked","isEditTemplateClicked","setIsEditTemplateClicked","isActionsBtnClicked","setIsActionsBtnClicked","getAllTemplates","getTriggersMenuOptions","getReceiversMenuOptions","getModelsPropsName","getSingleTemplate","onRemoveTemplateHandler","emailTemplatesComp","etd","emailTemplateEditor","singleEmailTemplateData","updateEmailTemplate","createEmailTemplate","emailTemplatesActionsComp","filteredTriggersMenuOptions","tmo","etda","setEmailTemplatesLoading","setSingleEmailTemplateLoading","changePatientStatusAsync","addSurveyAnswerAsync","addSurveyAnswer","addProjectFeedbackAsync","addFeedback","CONFRIM_PATH","REJECT_PATH","regex","DEFAULT_HTML","EmailResponsePage","html","setHtml","setText","setUID","pid","setPID","matches","setMatches","match","matchAll","sid","txt","addProjectFeedback","feedback","SET_PAYMENT_LOADING","SET_LOOKUP_DATA_LOADING","SET_PAYMENT_RESPONSE","SET_ALL_COUNTRIES_DATA","SET_ALL_COUNTRIES_LOADING","setPaymentLoading","setLookUpDataLoading","setPaymentResponse","model","setAllCountriesData","setAllCountriesLoading","getAllCountriesAsync","getAllCountries","createPaymentIntentAsync","createPaymentIntent","CheckoutResult","isFail","startLoading","swapComponents","clientSecret","StripeCard","elements","useElements","stripe","useStripe","setIsLoading","setMessage","shouldRenderSubComp","setShouldRenderSubComp","isPaymentFailed","setIsPaymentFailed","city","line1","line2","zip","cardElement","getElement","CardElement","confirmCardPayment","payment_method","card","billing_details","address","returnCountryCode","postal_code","stripeError","paymentIntent","code","shouldSwap","subComp","htmlFor","hidePostalCode","isLookUpDataLoading","isPaymentLoading","isCountriesLoading","paymentResponse","reducers","contentManagement","homePage","paymentPage","payment","patientProfile","emailResponse","allAdmins","adminsLs","allPatients","allProjects","contentEditor","pricingPage","pricing","AdminRoute","component","restOfProps","ProtectedRoute","loginHelper","fromQuery","URLSearchParams","search","startsWith","origin","returnUrl","login","getReturnUrl","processLoginCallback","redirectToProfile","redirectToRegister","signIn","navigateToReturnUrl","completeSignIn","redirectToApiAuthorizationPath","encodeURI","apiAuthorizationPath","redirectUrl","LoginMenu","isAuthenticated","userName","_subscription","subscribe","populateState","signInSilent","unsubscribe","all","profilePath","logoutPath","local","authenticatedView","registerPath","loginPath","anonymousView","NavItem","NavLink","tag","NavBar","forceUpdate","prevProps","ImgCard","Image","logo","rounded","Navbar","Brand","faHome","marginLeft","expand","collapseOnSelect","Footer","currentYear","PureComponent","Layout","Logout","isReady","authenticated","logout","processLogoutCallback","populateAuthenticationState","signOut","completeSignOut","ApiAuthorizationRoutes","loginAction","logoutAction","App","handler","closest","stopImmediatePropagation","addEventListener","removeEventListener","autoClose","transition","Slide","hideProgressBar","background","buttonStyle","buttonClasses","expires","exact","HomePage","PricingPage","NewProjectPage","ContentManagement","PatientInfoPage","AdminProjectsPage","AdminImportPatients","AdminPatientsPage","AdminLsPage","ContentEditor","PriceCatalog","isLocalhost","Boolean","hostname","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","getElementsByTagName","getAttribute","createBrowserHistory","basename","store","middleware","thunk","routerMiddleware","rootReducer","combineReducers","router","connectRouter","enhancers","windowIfDefined","__REDUX_DEVTOOLS_EXTENSION__","createStore","compose","applyMiddleware","configureStore","ReactDOM","reCaptchaKey","URL","process","contentType","indexOf","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.4203772c.chunk.js","sourcesContent":["export const roles = ({\r\n Admin: 'EUPATIADMIN',\r\n Patient: 'EUPATIPATIENT',\r\n Member: 'EUPATIMEMBER'\r\n});","export const requiredMessage = ({\r\n required: \"This field is required\"\r\n});\r\n\r\nexport const selectOptionMessage = ({\r\n required: \"It is required to select an option\"\r\n});\r\n\r\nexport const notRequired = ({\r\n required: false\r\n});","//based on Models.Enums.Status\r\nexport const projectStatus = ({\r\n inProgressStatusID: 1,\r\n archivedStatusID: 2,\r\n pendingAcceptanceStatusID: 3,\r\n declinedStatusID: 4\r\n});\r\n\r\n//based on Models.Enums.StatusType\r\nexport const patientStatus = ({\r\n matchedStatusID: 1,\r\n confirmedStatusID: 2,\r\n notInterestedStatusID: 3\r\n});","export const response = ({\r\n success: 'Server-side Google reCaptcha validation successfull',\r\n failure: 'invalid-input-response'\r\n});","export const FAIL_AUTH_MSG = 'We cannot validate, that you are not a robot. Please, refresh the page and try again.';\r\n\r\nexport const ADMIN_ACCESS_DENIED_MSG = 'You are not a patient.';\r\n\r\nexport const SUCC_UPDATED_CATALOGS = 'You have successfully updated the catalogues prices.';\r\n\r\nexport const INVALID_PRICING_DATA = 'You have to select Pricing option, even if a free service applies to you.';\r\n\r\nexport const INVALID_PAYMENT_METHOD = 'You have to select Payment option, even if a free service applies to you.';\r\n\r\nexport const EMAILS_COPIED_MSG = 'Emails were copied to the clipboard.';\r\n\r\nexport const SELECTED_ALL_MSG = 'You have successfully selected all emails.'\r\n\r\nexport const REMOVE_ADMIN_SUCC_MSG = 'You have successfully removed the admin.';\r\n\r\nexport const APPROVE_ADMIN_SUCC_MSG = 'You have successfully approved the admin.'\r\n\r\nexport const REMOVE_PT_SUCC_MSG = 'You have successfully removed the patient.';\r\n\r\nexport const ADD_PT_TO_PROJ_MSG = 'You have successfully assigned patient to project.';\r\n\r\nexport const CONFIRM_PATIENT_MSG = 'You have successfully changed patient status to confirmed.';\r\n\r\nexport const DEL_PT_FROM_PROJ_MSG = 'You have successfully removed patient from project.';\r\n\r\nexport const ARCHIVE_PROJ_SUCC_MSG = 'You have changed the status of the project.';\r\n\r\nexport const SAVED_NEW_PRICES_MSG = 'You have successfully updated the prices.';\r\n\r\nexport const SEND_EMAILS_SUCC_MSG = 'You have successfully sent an email.';\r\n\r\nexport const INVALID_NUMERIC_INPUT = 'Price field expect a numeric value.';\r\n\r\nexport const CANCEL_PRICES_UPDATE = 'You have cancelled the prices update.';\r\n\r\nexport const EMAIL_TEMPLATE_CREATED = 'You have successfully created a new template.';\r\n\r\nexport const EMAIL_TEMPLATE_UPDATED = 'You have successfully updated the template.';\r\n\r\nexport const FILL_ALL_FIELD_ERR_MSG = 'Please fill in all the fields.';\r\n\r\nexport const ANSWER_SUBMIT_SUCC = 'You have successfully submitted your application.';\r\n\r\nexport const SUCC_ASSIGN_ACTIONS_TO_TEMPLATE = 'You have successfully assigned actions to email template.'","// request docs here: https://www.npmjs.com/package/request-promise\r\n//import * as request from \"request-promise-native\";\r\nconst axios = require('axios');\r\n\r\nexport default class HttpRequester {\r\n\turl: string;\r\n\r\n\tconstructor(rootUrl = '/') {\r\n\t\tthis.url = rootUrl;\r\n\t}\r\n\r\n\thandleError(error: any) {\r\n\t\tconsole.error(JSON.stringify(error)); //this does not output the complete error?!?!?\r\n\t\tlet msg = error.message;\t\t\r\n\t\r\n\t\t//see if the back end dev has put in some nice description\r\n\t\tif (typeof (error.response) != 'undefined' && typeof (error.response.data) != 'undefined') {\t\t\t\r\n\t\t\tmsg = error.response.data;\r\n\t\t}\r\n\t\t\r\n\t\tif (error.status === 403 && msg === '') {\r\n\t\t\tmsg = \"You don't have sufficient rights to perform this action. Contact us through the live chat.\";\r\n\t\t}\r\n\r\n\t\treturn msg;\r\n\t}\r\n\r\n\thttpGet(path: string) {\r\n\t\tvar that = this;\r\n\t\tvar promise = new Promise(function(resolve, reject) {\r\n\t\t\tlet fullPath = that.url + path;\r\n\r\n\t\t\taxios.get(fullPath).then(\r\n\t\t\t\tfunction(result: any) {\r\n\t\t\t\t\tresolve(result.data);\r\n\t\t\t\t},\r\n\t\t\t\tfunction(error: any) {\r\n\t\t\t\t\tlet msg = that.handleError(error);\r\n\t\t\t\t\treject(msg);\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t});\r\n\r\n\t\treturn promise;\r\n\t}\r\n\r\n\thttpPost(path: string, content: any) {\r\n\t\tvar that = this;\r\n\t\t\r\n\t\tvar promise = new Promise(function (resolve, reject) {\r\n\t\t\tlet fullPath = that.url + path;\r\n\t\t\t\r\n\t\t\taxios.post(fullPath, content, { headers: { 'Content-Type': 'application/json' } }).then(\r\n\t\t\t\tfunction (result: any) {\r\n\t\t\t\t\tresolve(result.data);\r\n\t\t\t\t},\r\n\t\t\t\tfunction (error: any) {\r\n\t\t\t\t\tlet msg = that.handleError(error);\r\n\t\t\t\t\treject(msg);\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t});\r\n\r\n\t\treturn promise;\r\n\t}\r\n}\r\n","import { ProjectFeedbackData, ProjectPatientData, ProjectStatusData } from '../models/input-models';\r\nimport { Project } from '../models/main-models';\r\nimport HttpRequester from './http-requester';\r\n\r\n//declare var baseUrl: string;\r\nvar baseUrl = \"/projects\";\r\n\r\nexport default class ProjectsSvc {\r\n\thttpRequester: HttpRequester;\r\n\r\n\tconstructor() {\r\n\t\tthis.httpRequester = new HttpRequester('/api');\r\n\t}\r\n\r\n\tgetAllProjects() {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/all`\r\n\t\t);\r\n\t}\r\n\r\n\tsaveNewProject(project: Project) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/savenewproject`,\r\n\t\t\tproject\r\n\t\t);\r\n\t}\r\n\r\n\tgetProjectById(id: string) {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getproject?id=${id}`\r\n\t\t);\r\n\t}\r\n\r\n\tchangeProjectStatus(inputModel: ProjectStatusData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/changestatus`,\r\n\t\t\tinputModel\r\n\t\t);\r\n\t}\r\n\r\n\tassignPatientToProject(inputModel: ProjectPatientData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/assignpatient`,\r\n\t\t\tinputModel\r\n\t\t);\r\n\t}\r\n\r\n\tremovePatientFromProject(inputModel: ProjectPatientData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/removepatient`,\r\n\t\t\tinputModel\r\n\t\t);\r\n\t}\r\n\r\n\tchangePatientStatusToConfirm(inputModel: ProjectPatientData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/confirmpatient`,\r\n\t\t\tinputModel\r\n\t\t)\r\n\t}\r\n\r\n\taddFeedback(inputModel: ProjectFeedbackData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/addfeedback`,\r\n\t\t\tinputModel\r\n\t\t)\r\n\t}\r\n}\r\n","import { ChangePatientStatusData, PatientSearchData, PatientsImportData, SurveyAnswerData } from '../models/input-models';\r\nimport { Patient } from '../models/main-models';\r\nimport HttpRequester from './http-requester';\r\n\r\n//declare var baseUrl: string;\r\nvar baseUrl = '/patients';\r\n\r\nexport default class PatientSvc {\r\n\thttpRequester: HttpRequester;\r\n\r\n\tconstructor() {\r\n\t\tthis.httpRequester = new HttpRequester('/api');\r\n\t}\r\n\r\n\tsavePatient(patient: Patient) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/savepatient`,\r\n\t\t\tpatient\r\n\t\t);\r\n\t}\r\n\r\n\tgetPatientByUserId(id: string) {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getpatientbyuserid?userId=${id}`\r\n\t\t);\r\n\t}\r\n\r\n\tgetPatientById(id: string) {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getpatientbyid?patientId=${id}`\r\n\t\t)\r\n\t}\r\n\r\n\tsearchPatients(patientData?: PatientSearchData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/searchpatients`,\r\n\t\t\tpatientData\r\n\t\t);\r\n\t}\r\n\r\n\timportPatients(patientsData: PatientsImportData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/importpatients`,\r\n\t\t\tpatientsData\r\n\t\t)\r\n\t}\r\n\r\n\tgetAllPatients() {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/all`\r\n\t\t)\r\n\t}\r\n\r\n\tupdatePatient(patient: Patient) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/updatepatient`,\r\n\t\t\tpatient\r\n\t\t)\r\n\t}\r\n\r\n\tremovePatient(patient: Patient) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/removepatient`,\r\n\t\t\tpatient\r\n\t\t)\r\n\t}\r\n\r\n\tchangePatientStatus(data: ChangePatientStatusData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/changepatientstatus`,\r\n\t\t\tdata\r\n\t\t)\r\n\t}\r\n\r\n\taddSurveyAnswer(data: SurveyAnswerData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/addsurveyanswer`,\r\n\t\t\tdata\r\n\t\t)\r\n\t}\r\n}","import { AdminVerifyModel, ActionsTemplateData, CatalogData, ChangePatientStatusData, ContentData, EmailTemplateData, RequestData, SurveyAnswerData } from '../models/input-models';\r\nimport HttpRequester from './http-requester';\r\n\r\n//declare var baseUrl: string;\r\nvar baseUrl = '/utils';\r\n\r\nexport default class UtilsSvc {\r\n\thttpRequester: HttpRequester;\r\n\r\n\tconstructor() {\r\n\t\tthis.httpRequester = new HttpRequester('/api');\r\n\t}\r\n\r\n\tgetLookUpData() {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getlookupdata`\r\n\t\t);\r\n\t}\r\n\r\n\tgetMeshRecommendations(condition: string) {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getmeshrecommendations?condition=${condition}`\r\n\t\t)\r\n\t}\r\n\r\n\tgetMeshRecordParents(uid: string) {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getmeshrecordparents?uid=${uid}`\r\n\t\t)\r\n\t}\r\n\r\n\tverifyUserByRecaptchaToken(tokenObj: any) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/verifyuserbyrecaptchatoken`,\r\n\t\t\ttokenObj\r\n\t\t)\r\n\t}\r\n\r\n\tgetContent(name: string) {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getcontent?name=${name}`\r\n\t\t)\r\n\t}\r\n\r\n\tupdateContent(contentData: ContentData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/updatecontent`,\r\n\t\t\tcontentData\r\n\t\t)\r\n\t}\r\n\r\n\tgetPriceCatalogs() {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getpricecatalogs`\r\n\t\t)\r\n\t}\r\n\r\n\tupdatePriceCatalogs(data: CatalogData[]) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/updatepricecatalogs`,\r\n\t\t\tdata\r\n\t\t)\r\n\t}\r\n\r\n\tsendEmail(data: RequestData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/sendemail`,\r\n\t\t\tdata\r\n\t\t)\r\n\t}\r\n\r\n\tgetAllEmailTemplates() {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getallemailtemplates`\r\n\t\t)\r\n\t}\r\n\r\n\tgetEmailTemplateByName(name: string) {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getemailtemplatebyname?name=${name}`\r\n\t\t)\r\n\t}\r\n\r\n\tgetEmailTemplate(id: string) {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getemailtemplate?id=${id}`\r\n\t\t)\r\n\t}\r\n\r\n\taddEmailTemplate(data: EmailTemplateData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/addemailtemplate`,\r\n\t\t\tdata\r\n\t\t)\r\n\t}\r\n\r\n\talterEmailTemplateData(data: EmailTemplateData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/alteremailtemplatedata`,\r\n\t\t\tdata\r\n\t\t)\r\n\t}\r\n\r\n\tremoveEmailTemplate(data: EmailTemplateData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/removeemailtemplate`,\r\n\t\t\tdata\r\n\t\t)\r\n\t}\r\n\r\n\tgetClassPropertiesNames(id: AdminVerifyModel) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/getclasspropertiesnames`,\r\n\t\t\tid\r\n\t\t)\r\n\t}\r\n\r\n\tgetEmailAutomationTriggers() {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getemailautomationtriggers`\r\n\t\t)\r\n\t}\r\n\r\n\tassignActionsToEmailTemplate(data: ActionsTemplateData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/assignactionstoemailtemplate`,\r\n\t\t\tdata\r\n\t\t)\r\n\t}\r\n\r\n\tmisallocateActionsFromEmailTemplate(data: ActionsTemplateData) {\r\n\t\treturn this.httpRequester.httpPost(\r\n\t\t\t`${baseUrl}/misallocateactionsfromemailtemplate`,\r\n\t\t\tdata\r\n\t\t)\r\n\t}\r\n\r\n\tgetEmailTriggerTemplateBeneficiaries(id: string) {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getemailtriggertemplatebeneficiaries?id=${id}`\r\n\t\t)\r\n\t}\r\n\r\n\tgetAllCountries() {\r\n\t\treturn this.httpRequester.httpGet(\r\n\t\t\t`${baseUrl}/getallcountries`\r\n\t\t)\r\n\t}\r\n}\r\n","import { User } from '../models/main-models';\r\nimport HttpRequester from './http-requester';\r\n\r\n//declare var baseUrl: string;\r\nvar baseUrl = '/users';\r\n\r\nexport default class UsersSvc {\r\n httpRequester: HttpRequester;\r\n\r\n constructor() {\r\n this.httpRequester = new HttpRequester('/api');\r\n }\r\n\r\n getAllAdmins() {\r\n return this.httpRequester.httpGet(`${baseUrl}/getalladmins`);\r\n }\r\n\r\n removeAdmin(admin: User) {\r\n return this.httpRequester.httpPost(`${baseUrl}/removeadmin`, admin);\r\n }\r\n\r\n approveAdmin(admin: User) {\r\n return this.httpRequester.httpPost(`${baseUrl}/approveadmin`, admin);\r\n }\r\n\r\n getAdminById(id: string) {\r\n return this.httpRequester.httpGet(`${baseUrl}/getadminbyid/?id=${id}`);\r\n }\r\n\r\n getEupatiUserById(id: string) {\r\n return this.httpRequester.httpGet(`${baseUrl}/geteupatiuserbyid/?id=${id}`);\r\n }\r\n}\r\n","import { PaymentIntentCreateModel } from \"../models/input-models\";\r\nimport HttpRequester from \"./http-requester\";\r\n\r\n//declare var baseUrl: string;\r\nvar baseUrl = '/payments';\r\n\r\nexport default class PaymentSvc {\r\n httpRequester: HttpRequester;\r\n\r\n constructor() {\r\n this.httpRequester = new HttpRequester('/api');\r\n }\r\n\r\n getStripeConfig() {\r\n return this.httpRequester.httpGet(\r\n `${baseUrl}/getstripeconfig`\r\n );\r\n }\r\n\r\n createPaymentIntent(data: PaymentIntentCreateModel) {\r\n return this.httpRequester.httpPost(\r\n `${baseUrl}/createpaymentintent`,\r\n data\r\n );\r\n }\r\n}","import ProjectsSvc from './projects-svc';\r\nimport PatientSvc from './patients-svc';\r\nimport UtilsSvc from './utils-svc';\r\nimport UsersSvc from './users-svc';\r\nimport PaymentSvc from './payment-svc';\r\n\r\nexport default class DataSvc {\r\n\tpublic static projectsSvc: ProjectsSvc = new ProjectsSvc();\r\n\tpublic static patientSvc: PatientSvc = new PatientSvc();\r\n\tpublic static utilsSvc: UtilsSvc = new UtilsSvc();\r\n\tpublic static usersSvc: UsersSvc = new UsersSvc();\r\n\tpublic static paymentSvc: PaymentSvc = new PaymentSvc();\r\n}","// constants.ts\r\n\r\nexport const NAME = 'newProject';","import { NAME } from \"./constants\";\r\n\r\nexport const SET_PROJECTS_LOADING = `${NAME}/SET_PROJECTS_LOADING`;\r\n\r\nexport const SET_PROJECT = `${NAME}/SET_PROJECT`;\r\n\r\nexport const SET_LOOKUP_DATA = `${NAME}/SET_LOOKUP_DATA`;\r\n\r\nexport const SUBMIT_NEW_PROJECT = `${NAME}/SUBMIT_NEW_PROJECT`;\r\n\r\nexport const SET_IS_USER_REAL = `${NAME}/SET_IS_USER_REAL`;","// matching/actions.js\r\nimport { Res } from '../../common/helpers';\r\nimport { LookUpData } from '../../common/models/input-models';\r\nimport { Project } from '../../common/models/main-models';\r\nimport DataSvc from '../../common/services/data-svc';\r\nimport * as t from './actionTypes';\r\n\r\nexport const setProjectLoading = (isLoading: boolean) => ({\r\n type: t.SET_PROJECTS_LOADING,\r\n payload: isLoading,\r\n});\r\n\r\nexport const setProject = (project: Project) => ({\r\n type: t.SET_PROJECT,\r\n payload: project\r\n});\r\n\r\nexport const setLookUpData = (data: LookUpData[]) => ({\r\n type: t.SET_LOOKUP_DATA,\r\n payload: data\r\n});\r\n\r\nexport const setIsUserReal = (isUserReal: boolean) => ({\r\n type: t.SET_IS_USER_REAL,\r\n payload: isUserReal\r\n});\r\n\r\nexport const getLookUpDataAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setProjectLoading(true));\r\n DataSvc.utilsSvc.getLookUpData().then(\r\n (result: any) => {\r\n dispatch(setLookUpData(result));\r\n dispatch(setProjectLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n };\r\n};\r\n\r\nexport const saveNewProjectAsync = (newProject: Project) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setProjectLoading(true));\r\n DataSvc.projectsSvc.saveNewProject(newProject);\r\n dispatch(setProjectLoading(false));\r\n };\r\n};\r\n\r\nexport const verifyUserTokenAsync = (token: string) => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.utilsSvc.verifyUserByRecaptchaToken({ recaptchaToken: token }).then(\r\n (result: any) => {\r\n if (result !== Res.success) {\r\n dispatch(setIsUserReal(false));\r\n }\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n }\r\n}","// model.js\r\n// This is the model of our module state (e.g. return type of the reducer)\r\n\r\nimport { LookUpData, MeshData } from \"../../common/models/input-models\";\r\nimport { Project } from \"../../common/models/main-models\";\r\n\r\nexport type State = {\r\n project: Project;\r\n isLoading: boolean;\r\n lookUpData: LookUpData[];\r\n isUserReal: boolean;\r\n};\r\n\r\nexport const emptyProject = {\r\n id: '',\r\n name: '',\r\n overview: '',\r\n projectTypeId: 0,\r\n projectActivityId: 0,\r\n projectNumberOfPatientsNeeded: 0,\r\n interactionTypeId: 0,\r\n roleAndExpectations: '',\r\n startDate: undefined,\r\n endDate: undefined,\r\n timeRequired: '',\r\n isCompensationProvided: null as any,\r\n compensation: '',\r\n isThereTravelReimbursement: null as any,\r\n equipmentRequirements: '',\r\n responseDeadline: undefined,\r\n diseases: [],\r\n noDiseaseExpertiseRequired: false,\r\n searchDiseaseTherapeuticArea: false,\r\n price: -1,\r\n plan: '',\r\n package: '',\r\n paymentMethod: '',\r\n // diseaseNames: [],\r\n // diseasesTreeIds: [],\r\n // diseaseMeshId: '',\r\n // diseaseTANames: '',\r\n //diseaseTAMeshId: '',\r\n patientExpertises: [],\r\n patientExpertisesDescription: '',\r\n countries: [],\r\n languages: [],\r\n otherInformation: '',\r\n pocFirstName: '',\r\n projectTypeDescription: '',\r\n pocLastName: '',\r\n pocOrganisation: '',\r\n pocOrganisationTypeId: 0,\r\n pocOrganisationTypeDescription: '',\r\n pocJobTitle: '',\r\n pocCountryId: 0,\r\n pocPhoneNumber: '',\r\n pocEmail: '',\r\n isGDPRConsentGiven: false,\r\n matchedPatients: [],\r\n confirmedPatients: []\r\n} as Project;","import * as React from 'react';\r\nimport './loader.scss';\r\n\r\ntype OwnProps = { \r\n text?: string;\r\n };\r\n\r\ntype OwnState = {};\r\n\r\ntype DispatchProps = {};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nlet defaultLoadingText = 'Loading...';\r\n\r\nclass EupatiLoader extends React.Component<Props, OwnState> {\r\n render() {\r\n return (\r\n <div className='eupati-loader'>\r\n <div className='eupati-loader-circle'></div>\r\n <span className='eupati-loader-text'>{this.props.text ? this.props.text : defaultLoadingText}</span>\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nexport default EupatiLoader;","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\n\r\ntype OwnProps = {\r\n value: string;\r\n errorMsg: string;\r\n fieldType?: string;\r\n placeholder?: string;\r\n};\r\n\r\nexport type DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype OwnState = {};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nexport default class EupatiTextbox extends React.Component<Props, OwnState> {\r\n\r\n render() {\r\n return (\r\n <>\r\n <Form.Group>\r\n <Form.Control\r\n type={typeof this.props.fieldType === 'undefined' ? 'text' : this.props.fieldType}\r\n value={this.props.value}\r\n className=\"eupati-textbox\"\r\n placeholder={this.props.placeholder}\r\n onChange={(e) => this.props.onChange(e)}\r\n />\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </Form.Group>\r\n </>\r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\n\r\ntype OwnProps = {\r\n value: number;\r\n errorMsg: string;\r\n fieldType?: string;\r\n placeholder?: string;\r\n};\r\n\r\nexport type DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype OwnState = {};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nexport default class EupatiNumberbox extends React.Component<Props, OwnState> {\r\n\r\n render() {\r\n return (\r\n <>\r\n <Form.Group>\r\n <Form.Control\r\n type={typeof this.props.fieldType === 'undefined' ? 'number' : this.props.fieldType}\r\n value={this.props.value}\r\n className=\"eupati-numberbox\"\r\n placeholder={this.props.placeholder}\r\n onChange={(e) => this.props.onChange(e)}\r\n />\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </Form.Group>\r\n </>\r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\nimport { LookUpOptions } from '../models/input-models';\r\n\r\ntype OwnProps = {\r\n fieldName: string;\r\n values: LookUpOptions[] | null;\r\n errorMsg: string;\r\n value?: number;\r\n defaultOptionText?: string;\r\n width?: string;\r\n};\r\n\r\nexport type DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype OwnState = {\r\n vals: LookUpOptions[] | null;\r\n}\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nclass EupatiDropdown extends React.Component<Props, OwnState> {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n vals: [],\r\n };\r\n\r\n this.compare = this.compare.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n if (this.props.values !== null) {\r\n if (this.props.fieldName.toLowerCase().includes('country')) {\r\n this.setState({ vals: [...this.props.values].sort(this.compare) });\r\n }\r\n else {\r\n this.setState({ vals: [...this.props.values] });\r\n }\r\n }\r\n }\r\n\r\n compare(a: any, b: any) {\r\n if (a.name < b.name) {\r\n return -1;\r\n }\r\n if (a.name > b.name) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n\r\n render() {\r\n\r\n let optionsComponent: any;\r\n\r\n let dropdownComponent: any;\r\n\r\n if (this.props.values &&\r\n this.props.values.length > 0) {\r\n\r\n optionsComponent = this.state.vals?.map((x, i) => {\r\n if (i === 0) {\r\n return (\r\n <React.Fragment key={i + 'a'} >\r\n {typeof this.props.defaultOptionText !== 'undefined' &&\r\n <option\r\n key={'default-option'}\r\n className='option-item'\r\n value=''\r\n >\r\n {this.props.defaultOptionText ? this.props.defaultOptionText : \"Please select...\"}\r\n </option>\r\n }\r\n\r\n <option\r\n key={i}\r\n className='option-item'\r\n value={x.id}\r\n >\r\n {x.name}\r\n </option>\r\n </React.Fragment>\r\n );\r\n } else {\r\n return (\r\n <option\r\n key={i}\r\n className='option-item'\r\n value={x.id}\r\n >\r\n {x.name}\r\n </option>\r\n );\r\n }\r\n });\r\n }\r\n else {\r\n optionsComponent = (\r\n <option\r\n key='option-disabled'\r\n className='option-item'\r\n disabled={true}\r\n >\r\n No options available...\r\n </option>\r\n );\r\n }\r\n\r\n dropdownComponent = (\r\n <Form.Control\r\n as='select'\r\n className=\"eupati-dropdown\"\r\n value={this.props.value}\r\n onChange={(e) => this.props.onChange(e)}\r\n style={{ width: this.props.width ? this.props.width : '100%' }}\r\n >\r\n {optionsComponent}\r\n </Form.Control>\r\n );\r\n\r\n return (\r\n <>\r\n {dropdownComponent}\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default EupatiDropdown;\r\n","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\n\r\ntype OwnProps = {\r\n value: string;\r\n errorMsg: string;\r\n rowsCount?: number;\r\n placeholderMsg?: string;\r\n isDisabled?: boolean;\r\n};\r\n\r\nexport type DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype OwnState = {};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\n//const DEFAULT_ELEMENT_HEIGHT = 41; // rowsCount: 1\r\nexport default class EupatiTextarea extends React.Component<Props, OwnState> {\r\n element: any;\r\n\r\n constructor(props: any) {\r\n super(props);\r\n this.element = React.createRef();\r\n }\r\n\r\n componentDidMount() {\r\n const height = this.element.current.scrollHeight;\r\n this.element.current.style.height = `${height}px`;\r\n }\r\n\r\n // handleKeyDown(e: any) {\r\n // e.target.style.height = 'inherit';\r\n // e.target.style.height = `${e.target.scrollHeight}px`;\r\n // if (e.target.scrollHeight === DEFAULT_ELEMENT_HEIGHT) {\r\n // e.target.style.height = 'inherit';\r\n // }\r\n // }\r\n\r\n render() {\r\n return (\r\n <>\r\n <Form.Group>\r\n <Form.Control\r\n as='textarea'\r\n value={this.props.value}\r\n className=\"eupati-textbox\"\r\n rows={this.props.rowsCount ? this.props.rowsCount : 3}\r\n placeholder={this.props.placeholderMsg ? this.props.placeholderMsg : 'Please type in your information...'}\r\n disabled={this.props.isDisabled === undefined ? false : this.props.isDisabled}\r\n onChange={(e) => this.props.onChange(e)}\r\n //onKeyDown={this.handleKeyDown.bind(this)}\r\n ref={this.element}\r\n />\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </Form.Group>\r\n </>\r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { ToggleButton, ToggleButtonGroup, ToggleButtonProps } from 'react-bootstrap';\r\nimport { LookUpOptions } from '../models/input-models';\r\n\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faDotCircle } from '@fortawesome/fontawesome-free-regular';\r\n\r\ntype OwnProps = {\r\n fieldName: string;\r\n values: LookUpOptions[] | null;\r\n value: number;\r\n errorMsg: string;\r\n};\r\n\r\ntype OwnState = {};\r\n\r\ntype DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nclass EupatiToggleBtn extends React.Component<Props, OwnState> {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.returnProperIconType = this.returnProperIconType.bind(this);\r\n }\r\n\r\n returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n render() {\r\n\r\n let valuesComponent: any;\r\n\r\n let btnComponent: any;\r\n\r\n valuesComponent = this.props.values?.map((x, i) => {\r\n return (\r\n <ToggleButton\r\n key={i}\r\n type='radio'\r\n value={x.id}\r\n name={this.props.fieldName}\r\n >\r\n <div className='toggle-btn'>\r\n <FontAwesomeIcon \r\n icon={this.returnProperIconType(faDotCircle)}\r\n className='toggle-btn-circle'\r\n />\r\n </div>\r\n <div className='check-btn-text'><span style={{ clear: 'both', display: 'inline-block', overflow: 'hidden', whiteSpace: 'nowrap' }}>{x.name.trim()}</span></div>\r\n </ToggleButton>\r\n )\r\n });\r\n\r\n btnComponent = (\r\n <ToggleButtonGroup\r\n id={this.props.fieldName}\r\n className={this.props.fieldName}\r\n value={this.props.value}\r\n name={this.props.fieldName}\r\n onChange={(e: any) => this.props.onChange(e)}\r\n >\r\n {valuesComponent}\r\n </ToggleButtonGroup>\r\n );\r\n\r\n return (\r\n <>\r\n {btnComponent}\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default EupatiToggleBtn;","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\n\r\ntype OwnProps = {\r\n value: Date;\r\n errorMsg: string;\r\n};\r\n\r\nexport type DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nexport default class EupatiDateMenu extends React.Component<Props> {\r\n\r\n render() {\r\n return (\r\n <>\r\n <Form.Group>\r\n <Form.Control\r\n type='date'\r\n className=\"eupati-datemenu\"\r\n value={this.props.value.toString()}\r\n onChange={(e) => this.props.onChange(e)}\r\n />\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </Form.Group>\r\n </>\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { Button, Form } from \"react-bootstrap\";\r\nimport { useForm, Controller } from \"react-hook-form\";\r\nimport EupatiTextbox from \"../../../../common/static/textbox\";\r\nimport EupatiNumberbox from \"../../../../common/static/numberbox\";\r\nimport EupatiDropdown from \"../../../../common/static/dropdown\";\r\nimport EupatiTextarea from \"../../../../common/static/textarea\";\r\nimport { Rules } from \"../../../../common/helpers\";\r\nimport { Messages } from \"../../../../common/helpers\";\r\nimport { useHistory } from \"react-router\";\r\nimport EupatiToggleBtn from \"../../../../common/static/toggle-btn\";\r\nimport EupatiDateMenu from \"../../../../common/static/date-menu\";\r\nimport { Project } from \"../../../../common/models/main-models\";\r\nimport { LookUpData, LookUpOptions } from \"../../../../common/models/input-models\";\r\nimport { toast } from 'react-toastify';\r\n\r\ntype OwnProps = {\r\n project: Project,\r\n isUserReal: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n prevPage: () => void;\r\n setProject: (project: Project) => void;\r\n showPatientsInfoSection: () => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n returnProperLookUpData: (dataType: any) => LookUpOptions[] | null;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\ntype FieldProps = {\r\n name: string,\r\n projectTypeId: number,\r\n projectTypeDescription: string,\r\n roleAndExpectations: string,\r\n projectActivityId: number,\r\n projectNumberOfPatientsNeeded: number,\r\n interactionTypeId: number,\r\n startDate?: Date,\r\n endDate?: Date,\r\n responseDeadline?: Date\r\n};\r\n\r\nexport default function ProjectGeneralInfo(props: Props) {\r\n\r\n const history = useHistory();\r\n\r\n const { handleSubmit, control, watch, reset, formState: { errors } } = useForm();\r\n\r\n const fieldsData = {\r\n name: watch(\"name\") as string,\r\n projectTypeId: watch(\"projectTypeId\") as number,\r\n projectTypeDescription: watch(\"projectTypeDescription\") as string,\r\n roleAndExpectations: watch(\"roleAndExpectations\") as string,\r\n projectActivityId: watch(\"projectActivityId\") as number,\r\n projectNumberOfPatientsNeeded: watch(\"projectActivityId\") as number,\r\n interactionTypeId: watch(\"interactionTypeId\") as number,\r\n startDate: watch(\"startDate\") as Date | undefined,\r\n endDate: watch(\"endDate\") as Date | undefined,\r\n responseDeadline: watch(\"responseDeadline\") as Date | undefined\r\n } as FieldProps;\r\n\r\n const onSubmit = (data: any) => {\r\n if (!props.isUserReal) {\r\n toast.error(Messages.FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n const updatedProject = Object.assign(props.project, data);\r\n props.setProject(updatedProject);\r\n props.showPatientsInfoSection();\r\n }\r\n\r\n const onBackHandler = () => {\r\n if (!props.isUserReal) {\r\n toast.error(Messages.FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n if (adjustFieldsValues() === 0) {\r\n const updatedProject = Object.assign(props.project, fieldsData);\r\n props.setProject(updatedProject);\r\n }\r\n props.prevPage();\r\n }\r\n\r\n const toggleField = () => {\r\n let projectId = 0;\r\n if (fieldsData.projectTypeId !== undefined && fieldsData.projectTypeId !== null) {\r\n projectId = fieldsData.projectTypeId;\r\n }\r\n else if (props.project.projectTypeId !== undefined && props.project.projectTypeId !== null) {\r\n projectId = props.project.projectTypeId;\r\n }\r\n\r\n const projectTypes = props.returnProperLookUpData('projectType');\r\n return projectTypes?.find(x => x.id.toString() === projectId.toString())?.name.toLowerCase().includes('other');\r\n }\r\n\r\n const adjustFieldsValues = () => {\r\n if (fieldsData.name === undefined &&\r\n fieldsData.projectTypeId === undefined &&\r\n fieldsData.projectTypeDescription === undefined &&\r\n fieldsData.roleAndExpectations === undefined &&\r\n fieldsData.projectActivityId === undefined &&\r\n fieldsData.interactionTypeId === undefined &&\r\n fieldsData.startDate === undefined &&\r\n fieldsData.endDate === undefined &&\r\n fieldsData.responseDeadline === undefined) {\r\n return 1;\r\n }\r\n\r\n if (fieldsData.name === undefined &&\r\n props.project.name !== undefined) {\r\n fieldsData.name = props.project.name;\r\n }\r\n\r\n if (fieldsData.projectTypeId === undefined &&\r\n props.project.projectTypeId !== undefined) {\r\n fieldsData.projectTypeId = props.project.projectTypeId;\r\n }\r\n\r\n if (fieldsData.projectTypeDescription === undefined &&\r\n props.project.projectTypeDescription !== undefined) {\r\n fieldsData.projectTypeDescription = props.project.projectTypeDescription;\r\n }\r\n\r\n if (fieldsData.roleAndExpectations === undefined &&\r\n props.project.roleAndExpectations !== undefined) {\r\n fieldsData.roleAndExpectations = props.project.roleAndExpectations;\r\n }\r\n\r\n if (fieldsData.projectActivityId === undefined &&\r\n props.project.projectActivityId !== undefined) {\r\n fieldsData.projectActivityId = props.project.projectActivityId;\r\n }\r\n\r\n if (fieldsData.projectNumberOfPatientsNeeded === undefined &&\r\n props.project.projectNumberOfPatientsNeeded !== undefined) {\r\n fieldsData.projectNumberOfPatientsNeeded = props.project.projectNumberOfPatientsNeeded;\r\n }\r\n\r\n if (fieldsData.interactionTypeId === undefined &&\r\n props.project.interactionTypeId !== undefined) {\r\n fieldsData.interactionTypeId = props.project.interactionTypeId;\r\n }\r\n\r\n if (fieldsData.startDate === undefined &&\r\n props.project.startDate !== undefined) {\r\n fieldsData.startDate = props.project.startDate;\r\n }\r\n\r\n if (fieldsData.endDate === undefined &&\r\n props.project.endDate !== undefined) {\r\n fieldsData.endDate = props.project.endDate;\r\n }\r\n\r\n if (fieldsData.responseDeadline === undefined &&\r\n props.project.responseDeadline !== undefined) {\r\n fieldsData.responseDeadline = props.project.responseDeadline;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n return (\r\n <Form className='project' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='project-info'>\r\n <Form.Group className='lcolumn'>\r\n\r\n <Form.Group id='p-name' className='project-info-field mb-3'>\r\n <Form.Label>Project name</Form.Label>\r\n <Controller\r\n name='name'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.name)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.name?.message,\r\n placeholder: 'Please type project name'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-projTp' className='project-info-field mb-3'>\r\n <Form.Label>Project type</Form.Label>\r\n <Controller\r\n name='projectTypeId'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.projectTypeId)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiDropdown\r\n {...{\r\n ...field,\r\n errorMsg: errors?.projectTypeId?.message,\r\n fieldName: 'projectTypeId',\r\n values: props.returnProperLookUpData('projectType'),\r\n defaultOptionText: ''\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n {toggleField() &&\r\n <Form.Group id='p-projTpDescr' className='project-info-field mb-3'>\r\n <Form.Label>Other project type description</Form.Label>\r\n <Controller\r\n name='projectTypeDescription'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.projectTypeDescription)}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.projectTypeDescription?.message,\r\n placeholder: 'Please type project type'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n }\r\n\r\n <Form.Group id='p-roleAndExpctons' className='project-info-field mb-3'>\r\n <Form.Label>Patients role and expectations</Form.Label>\r\n <Controller\r\n name='roleAndExpectations'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.roleAndExpectations)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextarea\r\n {...{\r\n ...field,\r\n errorMsg: errors?.roleAndExpectations?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-projAct' className='project-info-field mb-4'>\r\n <Form.Label>Activity</Form.Label>\r\n <Controller\r\n name='projectActivityId'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.projectActivityId)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiToggleBtn\r\n {...{\r\n ...field,\r\n fieldName: 'projectActivityId',\r\n values: props.returnProperLookUpData('activityType'),\r\n errorMsg: errors?.projectActivityId?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-intractnTp' className='project-info-field mb-4'>\r\n <Form.Label>Interaction type</Form.Label>\r\n <Controller\r\n name='interactionTypeId'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.interactionTypeId)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiToggleBtn\r\n {...{\r\n ...field,\r\n fieldName: 'interactionTypeId',\r\n values: props.returnProperLookUpData('interactionType'),\r\n errorMsg: errors?.interactionTypeId?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-projHowManyPatients' className='project-info-field mb-12'>\r\n <Form.Label>How many patients are you looking for?</Form.Label>\r\n <Controller\r\n name='projectNumberOfPatientsNeeded'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.projectNumberOfPatientsNeeded)}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiNumberbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.projectTypeDescription?.message,\r\n placeholder: 'Please enter how many patients you are looking for'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-startDate' className='project-info-field mb-3'>\r\n <Form.Label>Start date</Form.Label>\r\n <Controller\r\n name='startDate'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.startDate)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiDateMenu\r\n {...{\r\n ...field,\r\n errorMsg: errors?.startDate?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-endDate' className='project-info-field mb-3'>\r\n <Form.Label>End date</Form.Label>\r\n <Controller\r\n name='endDate'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.endDate)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiDateMenu\r\n {...{\r\n ...field,\r\n errorMsg: errors?.endDate?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-resDedln' className='project-info-field mb-3'>\r\n <Form.Label>Response deadline</Form.Label>\r\n <Controller\r\n name='responseDeadline'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.responseDeadline)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiDateMenu\r\n {...{\r\n ...field,\r\n errorMsg: errors?.responseDeadline?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-btns' className='project-info-field'>\r\n <Button className='bck' variant='secondary' onClick={onBackHandler}>Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Next</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form>\r\n )\r\n}","import * as React from 'react';\r\nimport { ToggleButton, ToggleButtonGroup, ToggleButtonProps } from 'react-bootstrap';\r\n\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faDotCircle } from '@fortawesome/fontawesome-free-regular';\r\n\r\ntype OwnProps = {\r\n fieldName: string;\r\n value: number;\r\n errorMsg: string;\r\n isMoreThanTwoOptions: boolean;\r\n};\r\n\r\ntype OwnState = {};\r\n\r\ntype DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nclass EupatiNonCMSToggleBtn extends React.Component<Props, OwnState> {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.returnProperIconType = this.returnProperIconType.bind(this);\r\n }\r\n\r\n returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n render() {\r\n\r\n let values = [\r\n {\r\n id: true,\r\n name: 'Yes'\r\n },\r\n {\r\n id: false,\r\n name: 'No'\r\n },\r\n {\r\n id: null,\r\n name: 'Maybe'\r\n }\r\n ];\r\n\r\n let valuesComponent: any;\r\n\r\n let btnComponent: any;\r\n\r\n if (!this.props.isMoreThanTwoOptions) {\r\n if (values.length > 2) {\r\n values.pop();\r\n }\r\n }\r\n\r\n valuesComponent = values?.map((x, i) => {\r\n return (\r\n <ToggleButton\r\n key={i}\r\n name={this.props.fieldName}\r\n className='radio-item'\r\n value={`${x.id}`}\r\n type='radio'\r\n >\r\n <div className='toggle-btn'>\r\n <FontAwesomeIcon\r\n icon={this.returnProperIconType(faDotCircle)}\r\n className='toggle-btn-circle'\r\n />\r\n </div>\r\n <div className='check-btn-text'>{x.name}</div>\r\n </ToggleButton>\r\n )\r\n });\r\n\r\n btnComponent = (\r\n <React.Fragment key={'abcde'}>\r\n <ToggleButtonGroup\r\n id={this.props.fieldName}\r\n className='radio-items'\r\n onChange={(e: any) => this.props.onChange(e)}\r\n value={`${this.props.value}`}\r\n name={this.props.fieldName}\r\n type='radio'\r\n >\r\n {valuesComponent}\r\n </ToggleButtonGroup>\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </React.Fragment>\r\n );\r\n\r\n return (\r\n <>\r\n {btnComponent}\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default EupatiNonCMSToggleBtn;","import React from \"react\";\r\nimport { Form, Button } from \"react-bootstrap\";\r\nimport { Controller, useForm } from 'react-hook-form';\r\nimport EupatiNonCMSToggleBtn from \"../../../../common/static/toggle-btn-nonCMS\";\r\nimport EupatiTextbox from \"../../../../common/static/textbox\";\r\nimport { Rules, Messages } from \"../../../../common/helpers\";\r\nimport { useHistory } from \"react-router\";\r\nimport EupatiTextarea from \"../../../../common/static/textarea\";\r\nimport { Project } from \"../../../../common/models/main-models\";\r\nimport { LookUpOptions } from \"../../../../common/models/input-models\";\r\nimport { toast } from 'react-toastify';\r\n\r\ntype OwnProps = {\r\n project: Project,\r\n isUserReal: boolean\r\n}\r\n\r\ntype DispatchProps = {\r\n setProject: (project: Project) => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n returnProperLookUpData: (dataType: any) => LookUpOptions[] | null;\r\n hidePatientsInfoSection: () => void;\r\n nextPage: () => void;\r\n}\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\ntype FieldProps = {\r\n equipmentRequirements: string,\r\n timeRequired: string,\r\n overview: string,\r\n isThereTravelReimbursement?: number,\r\n isCompensationProvided?: number,\r\n compensation: string;\r\n};\r\n\r\nexport default function ProjectPatientsInfo(props: Props) {\r\n\r\n const history = useHistory();\r\n\r\n const { handleSubmit, control, watch, formState: { errors } } = useForm();\r\n\r\n const fieldsData = {\r\n equipmentRequirements: watch(\"equipmentRequirements\") as string,\r\n timeRequired: watch(\"timeRequired\") as string,\r\n overview: watch(\"overview\") as string,\r\n isThereTravelReimbursement: watch(\"isThereTravelReimbursement\") as number | undefined,\r\n isCompensationProvided: watch(\"isCompensationProvided\") as number | undefined,\r\n compensation: watch(\"compensation\") as string\r\n } as FieldProps;\r\n\r\n const onSubmit = (data: any) => {\r\n if (!props.isUserReal) {\r\n toast.error(Messages.FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n const updatedProject = Object.assign(props.project, data);\r\n props.setProject(updatedProject);\r\n props.nextPage();\r\n }\r\n\r\n const onBackHandler = () => {\r\n if (!props.isUserReal) {\r\n toast.error(Messages.FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n if (adjustFieldsValues() === 0) {\r\n const updatedProject = Object.assign(props.project, fieldsData);\r\n props.setProject(updatedProject);\r\n }\r\n props.hidePatientsInfoSection();\r\n }\r\n\r\n const fieldToggle = () => {\r\n let val = '';\r\n if (fieldsData.isCompensationProvided !== undefined && fieldsData.isCompensationProvided !== null) {\r\n val = fieldsData.isCompensationProvided.toString();\r\n }\r\n else if (props.project.isCompensationProvided !== undefined && props.project.isCompensationProvided !== null) {\r\n val = props.project.isCompensationProvided.toString();\r\n }\r\n\r\n return val === 'true' ? true : false;\r\n }\r\n\r\n const adjustFieldsValues = () => {\r\n if (fieldsData.equipmentRequirements === undefined &&\r\n fieldsData.timeRequired === undefined &&\r\n fieldsData.overview === undefined &&\r\n fieldsData.isThereTravelReimbursement === undefined &&\r\n fieldsData.isCompensationProvided === undefined &&\r\n fieldsData.compensation === undefined) {\r\n return 1;\r\n }\r\n\r\n if (fieldsData.equipmentRequirements === undefined &&\r\n props.project.equipmentRequirements !== undefined) {\r\n fieldsData.equipmentRequirements = props.project.equipmentRequirements;\r\n }\r\n\r\n if (fieldsData.timeRequired === undefined &&\r\n props.project.timeRequired !== undefined) {\r\n fieldsData.timeRequired = props.project.timeRequired;\r\n }\r\n\r\n if (fieldsData.overview === undefined &&\r\n props.project.overview !== undefined) {\r\n fieldsData.overview = props.project.overview;\r\n }\r\n\r\n if (fieldsData.isThereTravelReimbursement === undefined &&\r\n props.project.isThereTravelReimbursement !== undefined) {\r\n fieldsData.isThereTravelReimbursement = props.project.isThereTravelReimbursement;\r\n }\r\n\r\n if (fieldsData.isCompensationProvided === undefined &&\r\n props.project.isCompensationProvided !== undefined) {\r\n fieldsData.isCompensationProvided = props.project.isCompensationProvided;\r\n }\r\n\r\n if (fieldsData.compensation === undefined &&\r\n props.project.compensation !== undefined) {\r\n fieldsData.compensation = props.project.compensation;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n return (\r\n <Form className='project' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='project-info'>\r\n <Form.Group className='rcolumn'>\r\n\r\n <Form.Group id='p-equptReq' className='project-info-field mb-3'>\r\n <Form.Label>Equipment requirements</Form.Label>\r\n <Controller\r\n name='equipmentRequirements'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.equipmentRequirements)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextarea\r\n {...{\r\n ...field,\r\n errorMsg: errors?.equipmentRequirements?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-timeReq' className='project-info-field mb-3'>\r\n <Form.Label>Time required</Form.Label>\r\n <Controller\r\n name='timeRequired'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.timeRequired)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextarea\r\n {...{\r\n ...field,\r\n errorMsg: errors?.timeRequired?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-overview' className='project-info-field mb-3'>\r\n <Form.Label>Project overview</Form.Label>\r\n <Controller\r\n name='overview'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.overview)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextarea\r\n {...{\r\n ...field,\r\n errorMsg: errors?.overview?.message,\r\n rowsCount: 8\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-trvlReimb' className='project-info-field mb-5'>\r\n <Form.Label>Travel reimbursement</Form.Label>\r\n <Controller\r\n name='isThereTravelReimbursement'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.isThereTravelReimbursement)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiNonCMSToggleBtn\r\n {...{\r\n ...field,\r\n fieldName: 'isThereTravelReimbursement',\r\n errorMsg: errors?.isThereTravelReimbursement?.message,\r\n isMoreThanTwoOptions: false\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='p-compProv' className='project-info-field mb-5'>\r\n <Form.Label>Compensation provided</Form.Label>\r\n <Controller\r\n name='isCompensationProvided'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.isCompensationProvided)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiNonCMSToggleBtn\r\n {...{\r\n ...field,\r\n fieldName: 'isCompensationProvided',\r\n errorMsg: errors?.isCompensationProvided?.message,\r\n isMoreThanTwoOptions: false\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n {fieldToggle() &&\r\n <Form.Group id='p-comp' className='project-info-field mb-5'>\r\n <Form.Label>Amount</Form.Label>\r\n <Controller\r\n name='compensation'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.compensation)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.compensation?.message,\r\n placeholder: 'Please type compensation amount'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n }\r\n\r\n <Form.Group id='p-btns' className='project-info-field'>\r\n <Button className='bck' variant='secondary' onClick={onBackHandler}>Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Next</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form>\r\n )\r\n}","import React, { useState } from 'react';\r\nimport { LookUpOptions } from '../../../../common/models/input-models';\r\nimport { Project } from '../../../../common/models/main-models';\r\nimport ProjectGeneralInfo from './general';\r\nimport ProjectPatientsInfo from './patients';\r\n\r\ntype OwnProps = {\r\n project: Project,\r\n isUserReal: boolean,\r\n showSecondSubComponent: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n setProject: (project: Project) => void;\r\n nextPage: () => void;\r\n prevPage: () => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n setIsUserReal: (token: string) => void;\r\n returnProperLookUpData: (dataType: any) => LookUpOptions[] | null;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function ProjectInfo(props: Props) {\r\n const [nextBtnClicked, setNextBtnClicked] = useState<boolean>(props.showSecondSubComponent);\r\n\r\n const toggleSectionVisibility = () => {\r\n setNextBtnClicked(!nextBtnClicked);\r\n //window.scrollTo(0, 0);\r\n }\r\n\r\n return (\r\n <div style={{ margin: '0 0 7.5rem 0' }}>\r\n\r\n {nextBtnClicked &&\r\n <ProjectGeneralInfo\r\n {...{\r\n project: props.project,\r\n setProject: props.setProject,\r\n returnProperDefaultValue: props.returnProperDefaultValue,\r\n returnProperLookUpData: props.returnProperLookUpData,\r\n showPatientsInfoSection: toggleSectionVisibility,\r\n isUserReal: props.isUserReal,\r\n prevPage: props.prevPage\r\n }}\r\n />\r\n }\r\n\r\n {!nextBtnClicked &&\r\n <ProjectPatientsInfo\r\n {...{\r\n project: props.project,\r\n setProject: props.setProject,\r\n returnProperDefaultValue: props.returnProperDefaultValue,\r\n returnProperLookUpData: props.returnProperLookUpData,\r\n hidePatientsInfoSection: toggleSectionVisibility,\r\n isUserReal: props.isUserReal,\r\n nextPage: props.nextPage\r\n }}\r\n />\r\n }\r\n\r\n </div>\r\n )\r\n}","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\n\r\ntype OwnProps = {\r\n value: string;\r\n errorMsg: string;\r\n};\r\n\r\nexport type DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype OwnState = {};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nexport default class EupatiEmailbox extends React.Component<Props, OwnState> {\r\n\r\n render() {\r\n return (\r\n <>\r\n <Form.Group>\r\n <Form.Control\r\n type='email'\r\n value={this.props.value}\r\n className=\"eupati-textbox\"\r\n placeholder=\"Please type email\"\r\n onChange={(e) => this.props.onChange(e)}\r\n />\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </Form.Group>\r\n </>\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { Button, Form } from \"react-bootstrap\";\r\nimport { useForm, Controller } from \"react-hook-form\";\r\nimport { Rules } from \"../../../../common/helpers\";\r\nimport EupatiTextbox from \"../../../../common/static/textbox\";\r\nimport EupatiEmailbox from \"../../../../common/static/emailbox\";\r\nimport { useHistory } from \"react-router\";\r\nimport { Messages } from \"../../../../common/helpers\";\r\nimport { Project } from \"../../../../common/models/main-models\";\r\nimport { LookUpOptions } from '../../../../common/models/input-models';\r\nimport { toast } from 'react-toastify';\r\n\r\ntype OwnProps = {\r\n project: Project,\r\n isUserReal: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n showCompanyInfoSection: () => void;\r\n setProject: (project: Project) => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n}\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function PersonalInfo(props: Props) {\r\n\r\n const history = useHistory();\r\n\r\n const { handleSubmit, control, reset, formState: { errors } } = useForm();\r\n\r\n const onSubmit = (data: any) => {\r\n if (!props.isUserReal) {\r\n toast.error(Messages.FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n const updatedProject = Object.assign(props.project, data);\r\n props.setProject(updatedProject);\r\n props.showCompanyInfoSection();\r\n }\r\n\r\n return (\r\n <Form className='researcher' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='researcher-info'>\r\n <Form.Group className=\"lcolumn\">\r\n\r\n <Form.Group id='r-fname' className='researcher-info-field mb-3'>\r\n <Form.Label>First name</Form.Label>\r\n <Controller\r\n name='pocFirstName'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.pocFirstName)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.pocFirstName?.message,\r\n placeholder: 'Please type first name'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='r-lname' className='researcher-info-field mb-3'>\r\n <Form.Label>Surname</Form.Label>\r\n <Controller\r\n name='pocLastName'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.pocLastName)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.pocLastName?.message,\r\n placeholder: 'Please type last name'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='r-tel' className='researcher-info-field mb-3'>\r\n <Form.Label>Phone</Form.Label>\r\n <Controller\r\n name='pocPhoneNumber'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.pocPhoneNumber)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.pocPhoneNumber?.message,\r\n placeholder: 'Please type phone number'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='r-email' className='researcher-info-field mb-3'>\r\n <Form.Label>Email</Form.Label>\r\n <Controller\r\n name='pocEmail'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.pocEmail)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiEmailbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.pocEmail?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='r-btns' className='researcher-info-field'>\r\n <Button className='bck' style={{ visibility: 'hidden' }} variant='secondary' disabled>Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Next</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form>\r\n )\r\n}","import React from \"react\";\r\nimport { Button, Form } from \"react-bootstrap\";\r\nimport { useForm, Controller } from \"react-hook-form\";\r\nimport { Rules } from \"../../../../common/helpers\";\r\nimport EupatiTextbox from \"../../../../common/static/textbox\";\r\nimport EupatiDropdown from \"../../../../common/static/dropdown\";\r\nimport EupatiToggleBtn from \"../../../../common/static/toggle-btn\";\r\nimport { useHistory } from \"react-router\";\r\nimport { Messages } from \"../../../../common/helpers\";\r\nimport { Project } from \"../../../../common/models/main-models\";\r\nimport { LookUpOptions } from \"../../../../common/models/input-models\";\r\nimport { toast } from 'react-toastify';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faInfoCircle } from '@fortawesome/fontawesome-free-solid';\r\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\r\nimport ReactTooltip from 'react-tooltip';\r\n\r\ntype OwnProps = {\r\n project: Project,\r\n isUserReal: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n nextPage: () => void;\r\n hideCompanyInfoSection: () => void;\r\n setProject: (project: Project) => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\ntype FieldProps = {\r\n pocOrganisation: string,\r\n pocJobTitle: string,\r\n pocCountryId: number,\r\n pocOrganisationTypeId: number,\r\n pocOrganisationTypeDescription: string\r\n};\r\n\r\nexport default function CompanyInfo(props: Props) {\r\n\r\n const history = useHistory();\r\n\r\n const { handleSubmit, control, watch, reset, formState: { errors } } = useForm();\r\n\r\n const fieldsData = {\r\n pocOrganisation: watch(\"pocOrganisation\") as string,\r\n pocJobTitle: watch(\"pocJobTitle\") as string,\r\n pocCountryId: watch(\"pocCountryId\") as number,\r\n pocOrganisationTypeId: watch(\"pocOrganisationTypeId\") as number,\r\n pocOrganisationTypeDescription: watch(\"pocOrganisationTypeDescription\") as string\r\n } as FieldProps;\r\n\r\n const onSubmit = (data: any) => {\r\n if (!props.isUserReal) {\r\n toast.error(Messages.FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n const updatedProject = Object.assign(props.project, data);\r\n props.setProject(updatedProject);\r\n props.nextPage();\r\n }\r\n\r\n const onBackHandler = () => {\r\n if (!props.isUserReal) {\r\n toast.error(Messages.FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n if (adjustFieldsValues() === 0) {\r\n const updatedProject = Object.assign(props.project, fieldsData);\r\n props.setProject(updatedProject);\r\n }\r\n props.hideCompanyInfoSection();\r\n }\r\n\r\n const returnProperIconType = (icon: any) => {\r\n return icon as IconProp;\r\n }\r\n\r\n const toggleField = () => {\r\n let orgTypeId = 0;\r\n if (fieldsData.pocOrganisationTypeId !== undefined && fieldsData.pocOrganisationTypeId !== null) {\r\n orgTypeId = fieldsData.pocOrganisationTypeId;\r\n }\r\n else if (props.project.pocOrganisationTypeId !== undefined && props.project.pocOrganisationTypeId !== null) {\r\n orgTypeId = props.project.pocOrganisationTypeId;\r\n }\r\n\r\n const organisationTypes = props.findLookUpData('organisationType');\r\n return organisationTypes?.find(x => x.id.toString() === orgTypeId.toString())?.name.toLowerCase().includes('other');\r\n }\r\n\r\n const adjustFieldsValues = () => {\r\n if (fieldsData.pocOrganisation === undefined &&\r\n fieldsData.pocJobTitle === undefined &&\r\n fieldsData.pocCountryId === undefined &&\r\n fieldsData.pocOrganisationTypeId === undefined &&\r\n fieldsData.pocOrganisationTypeDescription === undefined) {\r\n return 1;\r\n }\r\n\r\n if (fieldsData.pocOrganisation === undefined &&\r\n props.project.pocOrganisation !== undefined) {\r\n fieldsData.pocOrganisation = props.project.pocOrganisation;\r\n }\r\n\r\n if (fieldsData.pocJobTitle === undefined &&\r\n props.project.pocJobTitle !== undefined) {\r\n fieldsData.pocJobTitle = props.project.pocJobTitle;\r\n }\r\n\r\n if (fieldsData.pocCountryId === undefined &&\r\n props.project.pocCountryId !== undefined) {\r\n fieldsData.pocCountryId = props.project.pocCountryId;\r\n }\r\n\r\n if (fieldsData.pocOrganisationTypeId === undefined &&\r\n props.project.pocOrganisationTypeId !== undefined) {\r\n fieldsData.pocOrganisationTypeId = props.project.pocOrganisationTypeId;\r\n }\r\n\r\n if (fieldsData.pocOrganisationTypeDescription === undefined &&\r\n props.project.pocOrganisationTypeDescription !== undefined) {\r\n fieldsData.pocOrganisationTypeDescription = props.project.pocOrganisationTypeDescription;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n return (\r\n <Form className='researcher' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='researcher-info'>\r\n <Form.Group className='rcolumn'>\r\n\r\n <Form.Group id='r-org' className='researcher-info-field mb-3'>\r\n <Form.Label>Company</Form.Label>\r\n <Controller\r\n name='pocOrganisation'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.pocOrganisation)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.pocOrganisation?.message,\r\n placeholder: 'Please type company name'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='r-jobTitle' className='researcher-info-field mb-3'>\r\n <Form.Label>Job title</Form.Label>\r\n <Controller\r\n name='pocJobTitle'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.pocJobTitle)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.pocJobTitle?.message,\r\n placeholder: 'Please type job title'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='r-country' className='researcher-info-field'>\r\n <Form.Label>Country <FontAwesomeIcon data-tip data-for='ctryInfo' icon={returnProperIconType(faInfoCircle)} /> <ReactTooltip id='ctryInfo'><span>Country, where your organisation is based.</span></ReactTooltip> </Form.Label>\r\n <Controller\r\n name='pocCountryId'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.pocCountryId)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiDropdown\r\n {...{\r\n ...field,\r\n errorMsg: errors?.pocCountryId?.message,\r\n fieldName: 'pocCountryId',\r\n values: props.findLookUpData('country'),\r\n defaultOptionText: 'Select country...'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='r-orgType' className='researcher-info-field'>\r\n <Form.Label>Organization type</Form.Label>\r\n <Controller\r\n name='pocOrganisationTypeId'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.pocOrganisationTypeId)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiToggleBtn\r\n {...{\r\n ...field,\r\n fieldName: 'pocOrganisationTypeId',\r\n values: props.findLookUpData('organisationType'),\r\n errorMsg: errors?.pocOrganisationTypeId?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n {toggleField() &&\r\n <Form.Group id='r-orgTypeDescr' className='researcher-info-field'>\r\n <Form.Label>Organization type description</Form.Label>\r\n <Controller\r\n name='pocOrganisationTypeDescription'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.pocOrganisationTypeDescription)}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.pocOrganisationTypeDescription?.message,\r\n placeholder: 'Please type organization type'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n }\r\n\r\n <Form.Group id='r-btns' className='researcher-info-field'>\r\n <Button className='bck' variant='secondary' onClick={onBackHandler}>Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Next</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form>\r\n )\r\n}","import React, { useState } from \"react\";\r\nimport PersonalInfo from \"./personal\";\r\nimport CompanyInfo from \"./company\";\r\nimport { Project } from \"../../../../common/models/main-models\";\r\nimport { LookUpData, LookUpOptions } from \"../../../../common/models/input-models\";\r\n\r\ntype OwnProps = {\r\n project: Project,\r\n lookUpData: LookUpData[],\r\n isUserReal: boolean,\r\n showSecondSubComponent: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n nextPage: () => void;\r\n setIsUserReal: (token: string) => void;\r\n setProject: (project: Project) => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function ResearcherInfo(props: Props) {\r\n const [nextBtnClicked, setNextBtnClicked] = useState<boolean>(props.showSecondSubComponent);\r\n\r\n const toggleSectionVisibility = () => {\r\n setNextBtnClicked(!nextBtnClicked);\r\n //window.scrollTo(0, 0);\r\n }\r\n\r\n return (\r\n <div style={{ margin: '0 0 7.5rem 0' }}>\r\n\r\n {nextBtnClicked &&\r\n <PersonalInfo\r\n {...{\r\n project: props.project,\r\n setProject: props.setProject,\r\n returnProperDefaultValue: props.returnProperDefaultValue,\r\n findLookUpData: props.findLookUpData,\r\n isUserReal: props.isUserReal,\r\n showCompanyInfoSection: toggleSectionVisibility\r\n }}\r\n />\r\n }\r\n\r\n {!nextBtnClicked &&\r\n <CompanyInfo\r\n {...{\r\n project: props.project,\r\n setProject: props.setProject,\r\n returnProperDefaultValue: props.returnProperDefaultValue,\r\n findLookUpData: props.findLookUpData,\r\n hideCompanyInfoSection: toggleSectionVisibility,\r\n isUserReal: props.isUserReal,\r\n nextPage: props.nextPage\r\n }}\r\n />\r\n }\r\n </div>\r\n );\r\n}","import * as React from 'react';\r\nimport { ToggleButtonGroup, ToggleButton } from 'react-bootstrap';\r\nimport { LookUpOptions } from '../models/input-models';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faCheckSquare } from '@fortawesome/fontawesome-free-regular';\r\n\r\ntype OwnProps = {\r\n fieldName: string;\r\n values: LookUpOptions[] | null;\r\n value: any[];\r\n errorMsg: string;\r\n};\r\n\r\ntype DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype OwnState = {\r\n vals: any[];\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nconst ALL_ELEMENTS_OPTION = { id: 1312, name: \"All\" };\r\nexport default class EupatiMultiselect extends React.Component<Props, OwnState> {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n vals: []\r\n };\r\n\r\n this.returnProperIconType = this.returnProperIconType.bind(this);\r\n this.handleOnChange = this.handleOnChange.bind(this);\r\n this.compare = this.compare.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n if (this.props.values !== null) {\r\n this.setState({ vals: [...this.props.values, ALL_ELEMENTS_OPTION] });\r\n }\r\n }\r\n\r\n returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n compare(a: any, b: any) {\r\n if (a.name < b.name) {\r\n return -1;\r\n }\r\n if (a.name > b.name) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n\r\n handleOnChange(e: any) {\r\n if (e.includes(ALL_ELEMENTS_OPTION.id)) {\r\n const ids: any[] = [];\r\n this.state.vals.forEach(x => { if (x.id !== ALL_ELEMENTS_OPTION.id) { ids.push(x.id) } });\r\n this.props.onChange(ids);\r\n }\r\n else {\r\n this.props.onChange(e);\r\n }\r\n }\r\n\r\n render() {\r\n let valuesComponent: any;\r\n\r\n let multiSelectComponent: any;\r\n\r\n if (this.props.values) {\r\n\r\n if (this.props.values.length > 3) {\r\n valuesComponent = this.state.vals.sort(this.compare).map((x, i) => {\r\n return (\r\n <ToggleButton\r\n key={i}\r\n value={x.id}\r\n type='checkbox'\r\n className={this.props?.value?.length === this.props?.values?.length ? 'active' : ''}\r\n name={this.props.fieldName}\r\n style={{ border: '0' }}\r\n >\r\n <div className='toggle-btn'>\r\n <FontAwesomeIcon\r\n icon={this.returnProperIconType(faCheckSquare)}\r\n className='toggle-btn-circle'\r\n />\r\n </div>\r\n <div className='check-btn-text'>{x.name}</div>\r\n </ToggleButton>\r\n )\r\n });\r\n } else {\r\n valuesComponent = this.state.vals.map((x, i) => {\r\n if (x.id !== 1312) {\r\n return (\r\n <ToggleButton\r\n key={i}\r\n value={x.id}\r\n type='checkbox'\r\n name={this.props.fieldName}\r\n >\r\n <div className='toggle-btn'>\r\n <FontAwesomeIcon\r\n icon={this.returnProperIconType(faCheckSquare)}\r\n className='toggle-btn-circle'\r\n />\r\n </div>\r\n <div className='check-btn-text'>{x.name}</div>\r\n </ToggleButton>\r\n )\r\n }\r\n });\r\n }\r\n }\r\n\r\n multiSelectComponent = (\r\n <ToggleButtonGroup\r\n id={this.props.fieldName}\r\n className={this.props.fieldName}\r\n value={this.props.value}\r\n type='checkbox'\r\n onChange={(e) => this.handleOnChange(e)}\r\n >\r\n {valuesComponent}\r\n </ToggleButtonGroup>\r\n )\r\n\r\n return (\r\n <>\r\n {multiSelectComponent}\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </>\r\n )\r\n }\r\n}","import * as React from 'react';\r\nimport { ToggleButtonGroup, ToggleButton } from 'react-bootstrap';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faCheckSquare } from '@fortawesome/fontawesome-free-solid';\r\nimport { Link, NavLink } from 'react-router-dom';\r\n\r\ntype OwnProps = {\r\n fieldName: string;\r\n value: any;\r\n errorMsg: string;\r\n};\r\n\r\ntype DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype OwnState = {};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default class EupatiGDPRBtn extends React.Component<Props, OwnState> {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.returnProperIconType = this.returnProperIconType.bind(this);\r\n }\r\n\r\n returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n render() {\r\n let valuesComponent: any;\r\n\r\n let gdprComponent: any;\r\n\r\n let values = [\r\n {\r\n id: true,\r\n name: 'I agree to '\r\n }\r\n ];\r\n\r\n valuesComponent = values.map((x, i) => {\r\n return (\r\n <ToggleButton\r\n key={i}\r\n value={x.id.toString()}\r\n type='radio'\r\n name={this.props.fieldName}\r\n >\r\n <div className='toggle-btn'>\r\n <FontAwesomeIcon\r\n icon={this.returnProperIconType(faCheckSquare)}\r\n className='toggle-btn-circle'\r\n />\r\n </div>\r\n <div className='check-btn-text'>{x.name}<a href='https://toolbox.eupati.eu/glossary/gdpr/' target=\"_blank\" >terms and conditions</a></div>\r\n </ToggleButton>\r\n )\r\n });\r\n\r\n gdprComponent = (\r\n <ToggleButtonGroup\r\n id={this.props.fieldName}\r\n className={this.props.fieldName}\r\n value={this.props.value.toString()}\r\n name={this.props.fieldName}\r\n type='radio'\r\n onChange={(e) => this.props.onChange(e)}\r\n >\r\n {valuesComponent}\r\n </ToggleButtonGroup>\r\n )\r\n\r\n return (\r\n <>\r\n {gdprComponent}\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </>\r\n )\r\n }\r\n}","import React from 'react';\r\nimport { Controller, useForm } from 'react-hook-form';\r\nimport { Button, Form } from 'react-bootstrap';\r\nimport { Rules, Messages } from '../../../../common/helpers';\r\nimport EupatiMultiselect from '../../../../common/static/multiselect';\r\nimport EupatiGDPRBtn from '../../../../common/static/GDPR-toggle';\r\nimport { useHistory } from 'react-router';\r\nimport EupatiTextarea from '../../../../common/static/textarea';\r\nimport { Project } from '../../../../common/models/main-models';\r\nimport { LookUpOptions } from '../../../../common/models/input-models';\r\nimport EupatiTextbox from '../../../../common/static/textbox';\r\nimport { toast } from 'react-toastify';\r\n\r\ntype OwnProps = {\r\n project: Project,\r\n isUserReal: boolean,\r\n};\r\n\r\ntype DispatchProps = {\r\n setProject: (project: Project) => void;\r\n submitProject: (project: Project) => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n hidePatientsAdditionalInfoSection: () => void;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n nextPage: () => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\ntype FieldsProps = {\r\n patientExpertises: number[],\r\n patientExpertisesDescription: string,\r\n otherInformation: string,\r\n isGDPRConsentGiven: boolean\r\n};\r\n\r\nexport default function PatientsAdditionalInfo(props: Props) {\r\n\r\n const history = useHistory();\r\n\r\n const { handleSubmit, control, watch, formState: { errors } } = useForm();\r\n\r\n const fieldsData = {\r\n patientExpertises: watch(\"patientExpertises\") as number[],\r\n patientExpertisesDescription: watch(\"patientExpertisesDescription\") as string,\r\n otherInformation: watch(\"otherInformation\") as string,\r\n isGDPRConsentGiven: watch(\"isGDPRConsentGiven\") as boolean\r\n } as FieldsProps;\r\n\r\n const onSubmit = (data: any) => {\r\n if (!props.isUserReal) {\r\n toast.error(Messages.FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n const updatedProject = Object.assign(props.project, Object.assign(data));\r\n props.submitProject(updatedProject);\r\n props.nextPage();\r\n }\r\n\r\n const onBackHandler = () => {\r\n if (!props.isUserReal) {\r\n toast.error(Messages.FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n if (adjustFieldsValues() === 0) {\r\n const updatedProject = Object.assign(props.project, Object.assign(fieldsData));\r\n props.setProject(updatedProject);\r\n }\r\n props.hidePatientsAdditionalInfoSection();\r\n }\r\n\r\n const adjustFieldsValues = () => {\r\n if (fieldsData.patientExpertises === undefined &&\r\n fieldsData.patientExpertisesDescription === undefined &&\r\n fieldsData.otherInformation === undefined &&\r\n fieldsData.isGDPRConsentGiven === undefined) {\r\n return 1; // if user hasn't changed anything\r\n }\r\n\r\n if (fieldsData.patientExpertises === undefined &&\r\n props.project.patientExpertises !== undefined) {\r\n fieldsData.patientExpertises = [...props.project.patientExpertises];\r\n }\r\n\r\n if (fieldsData.patientExpertisesDescription === undefined &&\r\n props.project.patientExpertisesDescription !== undefined) {\r\n fieldsData.patientExpertisesDescription = props.project.patientExpertisesDescription;\r\n }\r\n\r\n if (fieldsData.otherInformation === undefined &&\r\n props.project.otherInformation !== undefined) {\r\n fieldsData.otherInformation = props.project.otherInformation;\r\n }\r\n\r\n if (fieldsData.isGDPRConsentGiven === undefined &&\r\n props.project.isGDPRConsentGiven !== undefined) {\r\n fieldsData.isGDPRConsentGiven = props.project.isGDPRConsentGiven;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n const toggleField = () => {\r\n let ptExpertises: number[] = [];\r\n if (fieldsData.patientExpertises !== undefined && fieldsData.patientExpertises !== null) {\r\n ptExpertises = [...fieldsData.patientExpertises];\r\n }\r\n else if (props.project.patientExpertises !== undefined && props.project.patientExpertises !== null) {\r\n ptExpertises = [...props.project.patientExpertises];\r\n }\r\n\r\n let otherType = props.findLookUpData('expertise')?.find(ot => ot.name.toLowerCase().includes('other'));\r\n return ptExpertises?.some((x) => x === otherType?.id) ? true : false;\r\n }\r\n\r\n return (\r\n <Form className='pt' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='pt-info'>\r\n <Form.Group className='rcolumn'>\r\n\r\n <Form.Group id='pt-lvlExprt' className='pt-info-field mb-4'>\r\n <Form.Label>Level of expertise (multiple answers possible)</Form.Label>\r\n <Controller\r\n name='patientExpertises'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.patientExpertises)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiMultiselect\r\n {...{\r\n ...field,\r\n fieldName: 'patientExpertises',\r\n values: props.findLookUpData('expertise'),\r\n errorMsg: errors?.patientExpertises?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n {toggleField() &&\r\n <Form.Group id='pt-lvlExprtDescr' className='pt-info-field mb-4'>\r\n <Form.Label>Please specify your level of expertise</Form.Label>\r\n <Controller\r\n name='patientExpertisesDescription'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.patientExpertisesDescription)}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.patientExpertisesDescription?.message,\r\n placeholder: 'Please type level of expertise'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n }\r\n\r\n <Form.Group id='pt-otherInfo' className='pt-info-field mb-3'>\r\n <Form.Label>Additional patient information</Form.Label>\r\n <Controller\r\n name='otherInformation'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.otherInformation)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextarea\r\n {...{\r\n ...field,\r\n errorMsg: errors?.otherInformation?.message,\r\n rowsCount: 8\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-gdpr' className='pt-info-field mb-4'>\r\n <Controller\r\n name='isGDPRConsentGiven'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.isGDPRConsentGiven)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiGDPRBtn\r\n {...{\r\n ...field,\r\n fieldName: 'isGDPRConsentGiven',\r\n errorMsg: errors?.isGDPRConsentGiven?.message\r\n }}\r\n />\r\n }\r\n />\r\n <small className='google-message'>\r\n This site is protected by reCAPTCHA and the Google\r\n <a className='google-message-privacy' href=\"https://policies.google.com/privacy\" target=\"_blank\"> Privacy Policy</a> and\r\n <a className='google-message-tos' href=\"https://policies.google.com/terms\" target=\"_blank\"> Terms of Service</a> apply.\r\n </small>\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-btns' className='pt-info-field'>\r\n <Button className='bck' variant='secondary' onClick={onBackHandler} >Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Submit</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form>\r\n )\r\n}","//R.S docs: https://www.npmjs.com/package/react-select\r\nimport * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\nimport Select from 'react-select';\r\nimport { LookUpOptions } from '../models/input-models';\r\nimport './static.scss';\r\n\r\ntype OwnProps = {\r\n value: any[];\r\n errorMsg: string;\r\n values: LookUpOptions[] | null;\r\n placeholder?: string;\r\n};\r\n\r\nexport type DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype OwnState = {};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nconst CONTINENTS_LIST = ['Worldwide', 'Asia', 'Africa', 'North America', 'South America', 'Antarctica', 'Europe'];\r\nexport default class EupatiSelect extends React.Component<Props, OwnState> {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.handleOnChange = this.handleOnChange.bind(this);\r\n this.mapOptionsToValues = this.mapOptionsToValues.bind(this);\r\n this.mapArrayToValues = this.mapArrayToValues.bind(this);\r\n this.returnComponentStyles = this.returnComponentStyles.bind(this);\r\n this.langCompare = this.langCompare.bind(this);\r\n }\r\n\r\n handleOnChange(event: any) {\r\n this.props.onChange(Object.values(event).map((key: any) => key.value));\r\n }\r\n\r\n mapOptionsToValues = (options: any) => {\r\n const isCountry = (item: any) => item.name.toLowerCase() === 'worldwide';\r\n if (options.length) {\r\n if (options.some(isCountry)) {\r\n return options.map((option: any) => ({\r\n value: option.id,\r\n label: option.name\r\n }));\r\n }\r\n\r\n return options.sort(this.langCompare).map((option: any) => ({\r\n value: option.id,\r\n label: option.name\r\n }));\r\n }\r\n }\r\n\r\n mapArrayToValues = (arr: any) => {\r\n if (arr.length) {\r\n return arr.map((element: any) => {\r\n let newElement = this.props?.values?.find((x) => x.id === element);\r\n return { value: newElement?.id, label: newElement?.name };\r\n });\r\n }\r\n }\r\n\r\n langCompare = (a: any, b: any) => {\r\n if (a.name < b.name) {\r\n return -1;\r\n }\r\n if (a.name > b.name) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n\r\n returnComponentStyles = () => {\r\n\r\n const continentsBoldStyles = {\r\n multiValueLabel: (base: any) => ({ ...base, backgroundColor: '#DAEEF2', color: '#000', padding: '4px 8px', paddingLeft: '8px' }),\r\n multiValueRemove: (base: any) => ({ ...base, backgroundColor: '#DAEEF2', color: '#808080', cursor: 'pointer', \"&:hover\": { backgroundColor: '#00A4B6', color: '#fff' } }),\r\n dropdownIndicator: (base: any) => ({ ...base, cursor: 'pointer' }),\r\n indicatorsContainer: (base: any) => ({ ...base, cursor: 'pointer', backgroundColor: '#DAEEF2', color: '#808080', \"&:hover\": { backgroundColor: '#00A4B6', color: '#fff' } }),\r\n option: (base: any) => (\r\n {\r\n ...base,\r\n \"&:nth-of-type(1)\": { fontWeight: 'bold' },\r\n \"&:nth-of-type(2)\": { fontWeight: 'bold' },\r\n \"&:nth-of-type(3)\": { fontWeight: 'bold' },\r\n \"&:nth-of-type(4)\": { fontWeight: 'bold' },\r\n \"&:nth-of-type(5)\": { fontWeight: 'bold' },\r\n \"&:nth-of-type(6)\": { fontWeight: 'bold' },\r\n \"&:nth-of-type(7)\": { fontWeight: 'bold' },\r\n \"&:nth-of-type(8)\": { fontWeight: 'bold' }\r\n }\r\n ),\r\n menu: (base: any) => ({ ...base, position: 'relative', backgroundColor: '#fff' }),\r\n menuList: (base: any) => ({ ...base, position: 'relative', backgroundColor: '#fff' })\r\n }\r\n\r\n const regularStyles = {\r\n multiValueLabel: (base: any) => ({ ...base, backgroundColor: '#DAEEF2', color: '#000', padding: '4px 8px', paddingLeft: '8px' }),\r\n multiValueRemove: (base: any) => ({ ...base, backgroundColor: '#DAEEF2', color: '#808080', cursor: 'pointer', \"&:hover\": { backgroundColor: '#00A4B6', color: '#fff' } }),\r\n dropdownIndicator: (base: any) => ({ ...base, cursor: 'pointer' }),\r\n indicatorsContainer: (base: any) => ({ ...base, cursor: 'pointer', backgroundColor: '#DAEEF2', color: '#808080', \"&:hover\": { backgroundColor: '#00A4B6', color: '#fff' } }),\r\n menu: (base: any) => ({ ...base, position: 'relative', backgroundColor: '#fff' }),\r\n menuList: (base: any) => ({ ...base, position: 'relative', backgroundColor: '#fff' })\r\n }\r\n\r\n\r\n if (this.props?.values !== null) {\r\n return this.props?.values[0]?.name?.toLowerCase() === 'worldwide' ? continentsBoldStyles : regularStyles;\r\n }\r\n\r\n return regularStyles;\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n <Form.Group>\r\n <Select\r\n isMulti={true}\r\n placeholder={this.props.placeholder ? this.props.placeholder : 'Please select an option...'}\r\n options={this.mapOptionsToValues(this.props.values)}\r\n defaultValue={this.mapArrayToValues(this.props.value)}\r\n onChange={e => this.handleOnChange(e)}\r\n className='select-dropdown'\r\n styles={this.returnComponentStyles()}\r\n />\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </Form.Group>\r\n </>\r\n );\r\n }\r\n}\r\n","//R.S docs: https://www.npmjs.com/package/react-select\r\nimport * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\nimport Async from 'react-select/async';\r\nimport { LookUpOptions } from '../models/input-models';\r\nimport { DiseaseInfo } from '../models/main-models';\r\nimport DataSvc from '../services/data-svc';\r\nimport './static.scss';\r\n\r\ntype OwnProps = {\r\n value: any[];\r\n errorMsg: string;\r\n placeholder?: string;\r\n};\r\n\r\nexport type DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype OwnState = { applyFiltersTimeoutId: any; };\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nexport default class EupatiDiseaseAsyncSelect extends React.Component<Props, OwnState> {\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.handleOnChange = this.handleOnChange.bind(this);\r\n this.mapOptionsToValues = this.mapOptionsToValues.bind(this);\r\n this.returnComponentStyles = this.returnComponentStyles.bind(this);\r\n\r\n this.state = {\r\n applyFiltersTimeoutId: undefined\r\n };\r\n }\r\n\r\n handleOnChange(event: any) {\r\n this.props?.onChange(Object.values(event).map((key: any) => ({ name: key.label, treeNumbers: key.value } as DiseaseInfo)));\r\n }\r\n\r\n mapOptionsToValues = (options: any) => {\r\n return options?.map((option: any) => ({\r\n value: option.id,\r\n label: option.name\r\n }));\r\n }\r\n\r\n mapDiseaseOptionsToValues = (options: any) => {\r\n return options?.map((option: any) => ({\r\n value: option.treeNumbers,\r\n label: option.name\r\n }));\r\n }\r\n\r\n returnComponentStyles = () => {\r\n\r\n const regularStyles = {\r\n multiValueLabel: (base: any) => ({ ...base, backgroundColor: '#DAEEF2', color: '#000', padding: '4px 8px', paddingLeft: '8px' }),\r\n multiValueRemove: (base: any) => ({ ...base, backgroundColor: '#DAEEF2', color: '#808080', cursor: 'pointer', \"&:hover\": { backgroundColor: '#00A4B6', color: '#fff' } }),\r\n dropdownIndicator: (base: any) => ({ ...base, cursor: 'pointer' }),\r\n indicatorsContainer: (base: any) => ({ ...base, cursor: 'pointer', backgroundColor: '#DAEEF2', color: '#808080', \"&:hover\": { backgroundColor: '#00A4B6', color: '#fff' } }),\r\n menu: (base: any) => ({ ...base, position: 'relative', backgroundColor: '#fff' }),\r\n menuList: (base: any) => ({ ...base, position: 'relative', backgroundColor: '#fff' })\r\n }\r\n\r\n\r\n return regularStyles;\r\n }\r\n\r\n loadAutocompleteOptions = async (inputValue: string) => {\r\n return new Promise<LookUpOptions[]>((resolve) => {\r\n if (inputValue && inputValue.length > 2) {\r\n if (this.state.applyFiltersTimeoutId) {\r\n clearTimeout(this.state.applyFiltersTimeoutId);\r\n }\r\n\r\n var that = this;\r\n this.setState({\r\n applyFiltersTimeoutId: setTimeout(function () {\r\n that.setState({ applyFiltersTimeoutId: undefined });\r\n DataSvc.utilsSvc.getMeshRecommendations(inputValue).then((result: any) => {\r\n const diseaseOptions = result.map((m: any, i: any) => {\r\n return { id: m.treeNumbers.join(\";\"), name: m.originalTerm } as LookUpOptions;\r\n });\r\n\r\n resolve(that.mapOptionsToValues(diseaseOptions));\r\n },\r\n (error) => { console.error(error); })\r\n }, 800),\r\n });\r\n } else {\r\n resolve([]);\r\n }\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n <Form.Group>\r\n <Async\r\n isMulti={true}\r\n placeholder={this.props.placeholder ? this.props.placeholder : 'Enter a disease to get suggestions'}\r\n defaultValue={this.mapDiseaseOptionsToValues(this.props.value)}\r\n onChange={e => this.handleOnChange(e)}\r\n className='select-dropdown'\r\n styles={this.returnComponentStyles()}\r\n loadOptions={this.loadAutocompleteOptions}\r\n />\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </Form.Group>\r\n </>\r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\n\r\ntype OwnProps = {\r\n fieldName: string;\r\n text: string;\r\n value: boolean;\r\n errorMsg: string;\r\n};\r\n\r\ntype OwnState = {};\r\n\r\ntype DispatchProps = {\r\n onChange: (e: any) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nclass EupatiCheckbox extends React.Component<Props, OwnState> {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.returnProperIconType = this.returnProperIconType.bind(this);\r\n }\r\n\r\n returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n render() {\r\n\r\n let btnComponent: any;\r\n\r\n btnComponent = (\r\n <Form.Group>\r\n <label className=\"form-check-container\">{this.props.text}\r\n <input\r\n id={this.props.fieldName}\r\n className='form-check-input'\r\n type=\"checkbox\"\r\n checked={this.props.value}\r\n onChange={(e: any) => this.props.onChange(e)}\r\n />\r\n <span className=\"form-check-checkmark\"></span>\r\n </label>\r\n\r\n </Form.Group>\r\n );\r\n\r\n return (\r\n <>\r\n {btnComponent}\r\n {!!this.props.errorMsg &&\r\n <span className='text-danger'>{this.props.errorMsg}</span>\r\n }\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default EupatiCheckbox;","\r\nimport React from \"react\";\r\nimport { Button, Form } from \"react-bootstrap\";\r\nimport { Controller, useForm } from 'react-hook-form';\r\nimport { Rules, Messages } from \"../../../../common/helpers\";\r\nimport { useHistory } from \"react-router\";\r\nimport EupatiSelect from \"../../../../common/static/select-menu\";\r\nimport EupatiDiseaseAsyncSelect from \"../../../../common/static/async-select-menu\";\r\nimport EupatiCheckbox from \"../../../../common/static/checkbox-toggle\";\r\nimport { DiseaseInfo, Project } from \"../../../../common/models/main-models\";\r\nimport { LookUpOptions } from \"../../../../common/models/input-models\";\r\nimport { toast } from 'react-toastify';\r\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faInfoCircle } from '@fortawesome/fontawesome-free-solid';\r\nimport ReactTooltip from 'react-tooltip';\r\n\r\ntype OwnProps = {\r\n project: Project,\r\n isUserReal: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n setProject: (project: Project) => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n showPatientsAdditionalInfoSection: () => void;\r\n returnProperIconType: (icon: any) => IconProp;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n prevPage: () => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\ntype FieldsProps = {\r\n countries: string[],\r\n languages: string[],\r\n diseases: DiseaseInfo[],\r\n noDiseaseExpertiseRequired: boolean;\r\n searchDiseaseTherapeuticArea: boolean;\r\n};\r\n\r\nconst CUSTOM_SPAN_STYLES = ({\r\n boldFont: {\r\n fontWeight: 600\r\n }\r\n});\r\nexport default function PatientsDiseaseInfo(props: Props) {\r\n\r\n const history = useHistory();\r\n\r\n const { handleSubmit, control, watch, formState: { errors } } = useForm();\r\n\r\n const fieldsData = {\r\n countries: watch(\"countries\") as string[],\r\n languages: watch(\"languages\") as string[],\r\n diseases: watch(\"diseases\") as DiseaseInfo[],\r\n noDiseaseExpertiseRequired: watch(\"noDiseaseExpertiseRequired\") as boolean,\r\n searchDiseaseTherapeuticArea: watch(\"searchDiseaseTherapeuticArea\") as boolean\r\n } as FieldsProps;\r\n\r\n const onSubmit = (data: any) => {\r\n if (!props.isUserReal) {\r\n toast.error(Messages.FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n const updatedProject = Object.assign(props.project, data);\r\n props.setProject(updatedProject);\r\n props.showPatientsAdditionalInfoSection();\r\n }\r\n\r\n const onBackHandler = () => {\r\n if (!props.isUserReal) {\r\n toast.error(Messages.FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n if (adjustFieldsValues() === 0) {\r\n const updatedProject = Object.assign(props.project, fieldsData);\r\n props.setProject(updatedProject);\r\n }\r\n props.prevPage();\r\n }\r\n\r\n const adjustFieldsValues = () => {\r\n if (fieldsData.countries === undefined &&\r\n fieldsData.languages === undefined &&\r\n fieldsData.diseases === undefined &&\r\n fieldsData.noDiseaseExpertiseRequired === undefined &&\r\n fieldsData.searchDiseaseTherapeuticArea === undefined) {\r\n return 1;\r\n }\r\n\r\n if (fieldsData.countries === undefined &&\r\n props.project.countries !== undefined) {\r\n fieldsData.countries = [...props.project.countries];\r\n }\r\n\r\n if (fieldsData.languages === undefined &&\r\n props.project.languages !== undefined) {\r\n fieldsData.languages = [...props.project.languages];\r\n }\r\n\r\n if (fieldsData.diseases === undefined &&\r\n props.project.diseases !== undefined) {\r\n fieldsData.diseases = [...props.project.diseases];\r\n }\r\n\r\n if (fieldsData.noDiseaseExpertiseRequired === undefined &&\r\n props.project.noDiseaseExpertiseRequired !== undefined) {\r\n fieldsData.noDiseaseExpertiseRequired = props.project.noDiseaseExpertiseRequired;\r\n }\r\n\r\n if (fieldsData.searchDiseaseTherapeuticArea === undefined &&\r\n props.project.searchDiseaseTherapeuticArea !== undefined) {\r\n fieldsData.searchDiseaseTherapeuticArea = props.project.searchDiseaseTherapeuticArea;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n const returnProperIconType = (icon: any) => {\r\n return icon as IconProp;\r\n }\r\n\r\n const toggleDiseaseClarificationField = () => {\r\n if (fieldsData.diseases === undefined || fieldsData.diseases === null) {\r\n return false;\r\n }\r\n else if (fieldsData.diseases.length === 0) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return (\r\n <Form className='pt' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='pt-info'>\r\n <Form.Group className='lcolumn'>\r\n\r\n <Form.Group id='pt-ctrys' className='pt-info-field mb-5'>\r\n <Form.Label>Countries</Form.Label>\r\n <FontAwesomeIcon data-tip data-for='countriesInfo' icon={returnProperIconType(faInfoCircle)} />\r\n <ReactTooltip id='countriesInfo'>\r\n <span>Country(ies) where relevant patient engagement experience.</span>\r\n </ReactTooltip>\r\n <FontAwesomeIcon data-tip data-for='countriesControlInfo' icon={returnProperIconType(faInfoCircle)} />\r\n <ReactTooltip\r\n id='countriesControlInfo'\r\n multiline={true}>\r\n <span>\r\n It is possible to select multiple countries or continents.\r\n <br />\r\n You can achive that by typing their names in the input field.\r\n <br />\r\n Moreover, you can also pick them from the dropdown menu.\r\n <br />\r\n </span>\r\n </ReactTooltip>\r\n <Controller\r\n name='countries'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.countries)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiSelect\r\n {...{\r\n ...field,\r\n values: props.findLookUpData('countryWithContinents'),\r\n errorMsg: errors?.countries?.message,\r\n isAutocomplete: false\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-langs' className='pt-info-field mb-5'>\r\n <Form.Label>Languages</Form.Label>\r\n <FontAwesomeIcon data-tip data-for='languagesControlInfo' icon={returnProperIconType(faInfoCircle)} />\r\n <ReactTooltip\r\n id='languagesControlInfo'\r\n multiline={true}>\r\n <span>\r\n It is possible to select multiple languages.\r\n <br />\r\n You can achive that by typing their names in the input field.\r\n <br />\r\n Moreover, you can also pick them from the dropdown menu.\r\n <br />\r\n </span>\r\n </ReactTooltip>\r\n <Controller\r\n name='languages'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.project.languages)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiSelect\r\n {...{\r\n ...field,\r\n values: props.findLookUpData('language'),\r\n errorMsg: errors?.languages?.message,\r\n isAutocomplete: false\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-diseaseName' className='pt-info-field mb-5'>\r\n <Form.Label style={{ display: 'flex', flexDirection: 'column' }}>\r\n <span style={{ ...CUSTOM_SPAN_STYLES.boldFont }}>\r\n Therapeutic Areas or Diseases\r\n <FontAwesomeIcon data-tip data-for='diseasesControlInfo' icon={returnProperIconType(faInfoCircle)} />\r\n <ReactTooltip\r\n id='diseasesControlInfo'\r\n multiline={true}>\r\n <span>\r\n It is possible to select multiple diseases.\r\n <br />\r\n You can achive that by typing their names in the input field.\r\n <br />\r\n Moreover, you can also pick them from the dropdown menu.\r\n <br />\r\n </span>\r\n </ReactTooltip>\r\n </span>\r\n <span>\r\n <small style={{ fontSize: '11px' }}>\r\n Diseases are listed according to the US National Library of Medicine.\r\n You can find the controlled vocabulary, Medical Subject Headings (MEsH), <a href='https://meshb.nlm.nih.gov/search' target='_blank' >here.*</a>\r\n </small>\r\n </span>\r\n </Form.Label>\r\n\r\n <Controller\r\n name='diseases'\r\n control={control}\r\n defaultValue={props.project.diseases}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiDiseaseAsyncSelect\r\n {...{\r\n ...field,\r\n errorMsg: errors?.diseases?.message\r\n }}\r\n />\r\n }\r\n />\r\n {toggleDiseaseClarificationField() === false ? (\r\n <Controller\r\n name='noDiseaseExpertiseRequired'\r\n control={control}\r\n defaultValue={props.project.noDiseaseExpertiseRequired}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiCheckbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.noDiseaseExpertise?.message,\r\n fieldName: 'noDiseaseExpertiseRequired',\r\n text: 'No specific disease experience is required'\r\n }}\r\n />\r\n }\r\n />\r\n ) : (\r\n <Controller\r\n name='searchDiseaseTherapeuticArea'\r\n control={control}\r\n defaultValue={props.project.searchDiseaseTherapeuticArea}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiCheckbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.searchDiseaseTherapeuticArea?.message,\r\n fieldName: 'searchDiseaseTherapeuticArea',\r\n text: 'Match patients in the therapeutic area(s) as well(i.e. If Breast Cancer is selected, it would broaden the match to all Oncology experts).'\r\n }}\r\n />\r\n }\r\n />\r\n )}\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-btns' className='pt-info-field'>\r\n <Button className='bck' variant='secondary' onClick={onBackHandler} >Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Next</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form >\r\n )\r\n}","import { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport React, { useState } from 'react';\r\nimport { LookUpOptions } from '../../../../common/models/input-models';\r\nimport { Project } from '../../../../common/models/main-models';\r\nimport PatientsAdditionalInfo from './additional';\r\nimport PatientsDiseaseInfo from './disease';\r\n\r\ntype OwnProps = {\r\n project: Project,\r\n isUserReal: boolean,\r\n showSecondSubComponent: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n prevPage: () => void;\r\n nextPage: () => void;\r\n setProject: (project: Project) => void;\r\n setIsUserReal: (token: string) => void;\r\n submitProject: (project: Project) => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function PatientInfo(props: Props) {\r\n const [nextBtnClicked, setNextBtnClicked] = useState<boolean>(props.showSecondSubComponent);\r\n\r\n const toggleSectionVisibility = () => {\r\n setNextBtnClicked(!nextBtnClicked);\r\n //window.scrollTo(0, 0);\r\n }\r\n\r\n function returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n return (\r\n <div style={{ margin: '0 0 7.5rem 0' }}>\r\n\r\n {nextBtnClicked &&\r\n <PatientsDiseaseInfo\r\n {...{\r\n project: props.project,\r\n setProject: props.setProject,\r\n returnProperDefaultValue: props.returnProperDefaultValue,\r\n showPatientsAdditionalInfoSection: toggleSectionVisibility,\r\n isUserReal: props.isUserReal,\r\n returnProperIconType: returnProperIconType,\r\n findLookUpData: props.findLookUpData,\r\n prevPage: props.prevPage\r\n }}\r\n />\r\n }\r\n\r\n {!nextBtnClicked &&\r\n <PatientsAdditionalInfo\r\n {...{\r\n project: props.project,\r\n submitProject: props.submitProject,\r\n nextPage: props.nextPage,\r\n setProject: props.setProject,\r\n hidePatientsAdditionalInfoSection: toggleSectionVisibility,\r\n returnProperDefaultValue: props.returnProperDefaultValue,\r\n isUserReal: props.isUserReal,\r\n findLookUpData: props.findLookUpData\r\n }}\r\n />\r\n }\r\n </div>\r\n )\r\n}","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\nimport { NavLink } from 'react-router-dom';\r\n\r\ntype OwnProps = {};\r\n\r\nexport type DispatchProps = {};\r\n\r\ntype Props = {} & DispatchProps & OwnProps;\r\n\r\ntype OwnState = {};\r\n\r\nexport default class EupatiConfirmPage extends React.Component<Props, OwnState> {\r\n render() {\r\n return (\r\n <div style={{ marginTop: '5rem' }}>\r\n <Form.Group className='confirm-page-wrapper'>\r\n <h2>Thanks for your submission!</h2>\r\n <h4>We will contact you soon.</h4>\r\n <li className='nav-item'>\r\n <NavLink className='confirm-page-btn nav-link' to='/' style={{ color: '#fff' }}>Back To EUPATI</NavLink>\r\n </li>\r\n </Form.Group>\r\n </div>\r\n );\r\n }\r\n}","import * as React from 'react';\r\nimport { emptyProject, State } from '../model';\r\nimport '../style.scss';\r\nimport { Project } from '../../../common/models/main-models';\r\nimport EupatiLoader from '../../../common/static/loading-animation/loader';\r\nimport ProjectInfo from './project-info';\r\nimport ResearcherInfo from './researcher-info';\r\nimport PatientInfo from './patient-info';\r\nimport EupatiConfirmPage from '../../../common/static/confirm-page';\r\nimport { GoogleReCaptcha } from 'react-google-recaptcha-v3';\r\nimport { Form } from 'react-bootstrap';\r\nimport { RouteComponentProps } from '@reach/router';\r\nimport { INVALID_PRICING_DATA } from '../../../common/helpers/messages';\r\nimport { toast } from 'react-toastify';\r\n\r\ntype OwnProps = {};\r\n\r\nexport type DispatchProps = {\r\n\tsetProject: (project: Project) => void;\r\n\tsetLookUpData: () => void;\r\n\tsubmitNewProject: (project: Project) => void;\r\n\tsetIsUserReal: (token: string) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps & RouteComponentProps<{ location: { state: { price: number, plan: string, package: string, paymentMethod: string } } }>;\r\n\r\ntype OwnState = {\r\n\tshowComponentByIndex: number;\r\n\tshowSecondSubComponent: boolean;\r\n};\r\n\r\nclass ComponentRoot extends React.Component<Props, OwnState> {\r\n\r\n\tconstructor(props: any) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.state = {\r\n\t\t\tshowComponentByIndex: 0,\r\n\t\t\tshowSecondSubComponent: true\t// when this is \"true\" on render it will show the first subcomponent (ResearcherInfo --> PersonalInfo).\r\n\t\t}\r\n\r\n\t\tthis.submitProject = this.submitProject.bind(this);\r\n\t\tthis.nextPageHandler = this.nextPageHandler.bind(this);\r\n\t\tthis.previousPageHandler = this.previousPageHandler.bind(this);\r\n\t\tthis.findLookUpData = this.findLookUpData.bind(this);\r\n\t\tthis.returnProperDefaultValue = this.returnProperDefaultValue.bind(this);\r\n\t\tthis.returnProperLookUpData = this.returnProperLookUpData.bind(this);\r\n\t}\r\n\r\n\tcomponentDidMount() {\r\n\t\tconst historyState = this.props.location?.state;\r\n\t\tif (historyState === undefined || historyState.price < 0 ||\r\n\t\t\thistoryState.package === '' || historyState.paymentMethod === '') {\r\n\t\t\ttoast.error(INVALID_PRICING_DATA);\r\n\t\t\twindow.location.href = '/pricing';\r\n\t\t}\r\n\t\tconst initialProjectData = Object.assign(emptyProject, { ...historyState });\r\n\t\tthis.props.setLookUpData();\r\n\t\tthis.props.setProject(initialProjectData);\r\n\t}\r\n\r\n\tsubmitProject() {\r\n\t\tthis.props.submitNewProject(this.props.project);\r\n\t}\r\n\r\n\tnextPageHandler() {\r\n\t\tif (this.state.showComponentByIndex !== 3) {\r\n\t\t\tthis.setState(prevState => ({\r\n\t\t\t\tshowComponentByIndex: prevState.showComponentByIndex + 1,\r\n\t\t\t\tshowSecondSubComponent: true\r\n\t\t\t}));\r\n\t\t}\r\n\t\t//window.scrollTo(0, 0);\r\n\t}\r\n\r\n\tpreviousPageHandler() {\r\n\t\tif (this.state.showComponentByIndex !== 0) {\r\n\t\t\tthis.setState(prevState => ({\r\n\t\t\t\tshowComponentByIndex: prevState.showComponentByIndex - 1,\r\n\t\t\t\tshowSecondSubComponent: false\r\n\t\t\t}));\r\n\t\t}\r\n\t\t//window.scrollTo(0, 0);\r\n\t}\r\n\r\n\tfindLookUpData(lookUpDataType?: string) {\r\n\t\tif (this.props.lookUpData &&\r\n\t\t\tthis.props.lookUpData.length > 0) {\r\n\t\t\treturn this.props.lookUpData?.filter((x: any) => x.name == lookUpDataType)[0]?.data;\r\n\t\t}\r\n\r\n\t\treturn [];\r\n\t}\r\n\r\n\treturnProperDefaultValue(val: any) {\r\n\t\treturn val ? val : '';\r\n\t}\r\n\r\n\treturnProperLookUpData(dataType: any) {\r\n\t\treturn typeof dataType !== 'undefined' ? this.findLookUpData(dataType) : null\r\n\t}\r\n\r\n\trender() {\r\n\r\n\t\tlet mainComponent: any;\r\n\r\n\t\tlet loadingComponent = (\r\n\t\t\t<div className='loader-wrapper'>\r\n\t\t\t\t<EupatiLoader />\r\n\t\t\t</div>\r\n\t\t);\r\n\r\n\t\tconst props = {\r\n\t\t\tproject: this.props.project,\r\n\t\t\tlookUpData: this.props.lookUpData,\r\n\t\t\tisUserReal: this.props.isUserReal,\r\n\t\t\tshowSecondSubComponent: this.state.showSecondSubComponent,\r\n\t\t\tsetProject: this.props.setProject,\r\n\t\t\tnextPage: this.nextPageHandler,\r\n\t\t\tprevPage: this.previousPageHandler,\r\n\t\t\tsubmitProject: this.props.submitNewProject,\r\n\t\t\tfindLookUpData: this.findLookUpData,\r\n\t\t\treturnProperDefaultValue: this.returnProperDefaultValue,\r\n\t\t\tsetIsUserReal: this.props.setIsUserReal,\r\n\t\t\treturnProperLookUpData: this.returnProperLookUpData\r\n\t\t};\r\n\r\n\t\tconst spanStyles = {\r\n\t\t\tfontWeight: 'bolder',\r\n\t\t\t//textDecoration: 'underline',\r\n\t\t\tbackgroundColor: '#00749F',\r\n\t\t\tborderRadius: '30px',\r\n\t\t\tcolor: '#fff'\r\n\t\t} as any;\r\n\r\n\t\tif (this.props.isLoading) {\r\n\t\t\tmainComponent = loadingComponent;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tmainComponent = (\r\n\t\t\t\t<>\r\n\t\t\t\t\t<GoogleReCaptcha action='newProjectPage' onVerify={token => this.props.setIsUserReal(token)} />\r\n\t\t\t\t\t<h2 className='heading' style={this.state.showComponentByIndex === 3 ? { display: 'none' } : {}}>Project Request</h2>\r\n\t\t\t\t\t{this.state.showComponentByIndex !== 3 &&\r\n\t\t\t\t\t\t<Form.Group className='titles-wrapper'>\r\n\t\t\t\t\t\t\t<div className='titles'>\r\n\t\t\t\t\t\t\t\t<div className='titles-title' style={this.state.showComponentByIndex === 0 ? { ...spanStyles } : {}}>\r\n\t\t\t\t\t\t\t\t\t<span >1. Personal info</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<div className='titles-title' style={this.state.showComponentByIndex === 1 ? { ...spanStyles } : {}}>\r\n\t\t\t\t\t\t\t\t\t<span >2. Project data</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<div className='titles-title' style={this.state.showComponentByIndex === 2 ? { ...spanStyles } : {}}>\r\n\t\t\t\t\t\t\t\t\t<span >3. EUPATI Experts</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</Form.Group>\r\n\t\t\t\t\t}\r\n\t\t\t\t\t{this.state.showComponentByIndex === 0 && <ResearcherInfo {...props} />}\r\n\t\t\t\t\t{this.state.showComponentByIndex === 1 && <ProjectInfo {...props} />}\r\n\t\t\t\t\t{this.state.showComponentByIndex === 2 && <PatientInfo {...props} />}\r\n\t\t\t\t\t{this.state.showComponentByIndex === 3 && <EupatiConfirmPage />}\r\n\t\t\t\t</>\r\n\t\t\t)\r\n\t\t}\r\n\r\n\t\treturn (\r\n\t\t\t<>\r\n\t\t\t\t{mainComponent}\r\n\t\t\t</>\r\n\t\t);\r\n\t}\r\n}\r\n\r\nexport default ComponentRoot;","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Actions from '../actions';\r\nimport * as Constants from '../constants';\r\nimport { State } from '../model';\r\nimport { connect } from 'react-redux';\r\nimport { Project } from '../../../common/models/main-models';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n setProject: (project: Project) => dispatch(Actions.setProject(project)),\r\n setLookUpData: () => dispatch(Actions.getLookUpDataAsync()),\r\n submitNewProject: (project: Project) => dispatch(Actions.saveNewProjectAsync(project)),\r\n setIsUserReal: (token: string) => dispatch(Actions.verifyUserTokenAsync(token))\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { LookUpData, MeshData } from '../../common/models/input-models';\r\nimport { Project } from '../../common/models/main-models';\r\nimport * as t from './actionTypes';\r\nimport { emptyProject, State } from './model';\r\n\r\nconst initialState: State = {\r\n project: emptyProject,\r\n isLoading: false,\r\n lookUpData: [],\r\n isUserReal: true\r\n};\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_PROJECTS_LOADING:\r\n return setProjectsLoading(state, action.payload);\r\n case t.SET_PROJECT:\r\n return setProject(state, action.payload);\r\n case t.SET_LOOKUP_DATA:\r\n return setLookUpData(state, action.payload);\r\n case t.SET_IS_USER_REAL:\r\n return setIsUserReal(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst setIsUserReal = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n setIsUserReal: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setProjectsLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setProject = (state: State, val: Project): State => {\r\n let newState = {\r\n ...state,\r\n project: { ...val }\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setLookUpData = (state: State, val: LookUpData[]): State => {\r\n let newState = {\r\n ...state,\r\n lookUpData: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}\r\n","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","// constants.ts\r\nexport const NAME = 'patientProfile';","// actionTypes.js\r\nimport { NAME } from './constants';\r\n\r\nexport const SET_PATIENTS_LOADING = `${NAME}/SET_PATIENTS_LOADING`;\r\n\r\nexport const SET_LOOKUP_DATA = `${NAME}/SET_LOOKUP_DATA`;\r\n\r\nexport const SET_PATIENT_INFO = `${NAME}/SET_PATIENT_INFO`;\r\n\r\nexport const SET_PATIENT_DATA_LOADING = `${NAME}/SET_PATIENT_DATA_LOADING`;","// model.js\r\n// This is the model of our module state (e.g. return type of the reducer)\r\n\r\nimport { LookUpData, MeshData } from \"../../common/models/input-models\";\r\nimport { Patient } from \"../../common/models/main-models\";\r\n\r\nexport type State = {\r\n patient: Patient;\r\n isLoading: boolean;\r\n lookUpData: LookUpData[];\r\n isPatientDataLoaded: boolean;\r\n};\r\n\r\nexport const defaultPatientInfo = {\r\n id: '',\r\n firstName: '',\r\n lastName: '',\r\n phoneNumber: '',\r\n email: '',\r\n birthYear: undefined,\r\n genderTypeId: 0,\r\n countryId: 0,\r\n languages: [],\r\n countriesWithExperience: [],\r\n isPOAffiliated: false,\r\n patientOrganisation: '',\r\n\r\n diseases: [],\r\n noDiseaseExpertise: false,\r\n // diseaseName: '',\r\n // diseaseMeshId: '',\r\n // diseaseTAName: '',\r\n // diseaseTAMeshId: '',\r\n patientExperienceId: 0,\r\n patientExpertises: [],\r\n projectTypeExperiences: [],\r\n projectTypeExperiencesDescription: '',\r\n otherInformation: '',\r\n patientExpertiseDescription: '',\r\n genderTypeDescription: '',\r\n organisationPreferenceDescription: '',\r\n projectPreferenceDescription: '',\r\n\r\n isEligibleForCompensation: false,\r\n isAvailableForNoCompensation: false,\r\n projectPreferences: [],\r\n organisationPreferences: [],\r\n activityPreferenceId: 0,\r\n\r\n matchedProjects: [],\r\n confirmedProjects: [],\r\n isBannedFromSearch: false,\r\n isGDPRConsentGiven: false,\r\n} as Patient;","// matching/actions.js\r\nimport { LookUpData } from '../../common/models/input-models';\r\nimport { Patient } from '../../common/models/main-models';\r\nimport DataSvc from '../../common/services/data-svc';\r\nimport * as t from './actionTypes';\r\nimport { defaultPatientInfo } from './model';\r\n\r\nexport const setPatientLoading = (isLoading: boolean) => ({\r\n type: t.SET_PATIENTS_LOADING,\r\n payload: isLoading,\r\n});\r\n\r\nexport const setLookUpData = (data: LookUpData[]) => ({\r\n type: t.SET_LOOKUP_DATA,\r\n payload: data\r\n});\r\n\r\nexport const setPatientInfo = (patient: Patient) => ({\r\n type: t.SET_PATIENT_INFO,\r\n payload: patient\r\n});\r\n\r\nexport const setPatientDataLoading = (isPatientDataLoaded: boolean) => ({\r\n type: t.SET_PATIENT_DATA_LOADING,\r\n payload: isPatientDataLoaded\r\n});\r\n\r\nexport const getLookUpDataAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setPatientLoading(true));\r\n DataSvc.utilsSvc.getLookUpData().then(\r\n (result: any) => {\r\n dispatch(setLookUpData(result));\r\n dispatch(setPatientLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n };\r\n};\r\n\r\nexport const updatePatientAsync = (patient: Patient) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setPatientLoading(true));\r\n DataSvc.patientSvc.updatePatient(getRidOfIncorrectNullValues(patient)).then(\r\n (result: any) => {\r\n dispatch(setPatientInfo(result));\r\n dispatch(setPatientLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const saveNewPatientAsync = (patient: Patient) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setPatientLoading(true));\r\n DataSvc.patientSvc.savePatient(getRidOfIncorrectNullValues(patient)).then(\r\n () => {\r\n dispatch(setPatientInfo(defaultPatientInfo)); // return to default state on submit\r\n dispatch(setPatientLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const getPatientInfoByIdAsync = (patientId?: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setPatientDataLoading(true));\r\n if (patientId) {\r\n DataSvc.patientSvc.getPatientById(patientId).then(\r\n (result: any) => {\r\n dispatch(setPatientInfo(result));\r\n dispatch(setPatientDataLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n else {\r\n dispatch(setPatientInfo(defaultPatientInfo));\r\n dispatch(setPatientDataLoading(false));\r\n }\r\n };\r\n};\r\n\r\nexport const getPatientInfoByUserIdAsync = (userId?: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setPatientDataLoading(true));\r\n if (userId) {\r\n DataSvc.patientSvc.getPatientByUserId(userId).then(\r\n (result: any) => {\r\n dispatch(setPatientInfo(result));\r\n dispatch(setPatientDataLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n }\r\n}\r\n\r\nfunction getRidOfIncorrectNullValues(object: any) {\r\n var updatedPatientObject = { ...object };\r\n if (updatedPatientObject.isAvailableForNoCompensation === 'null') {\r\n updatedPatientObject.isAvailableForNoCompensation = null;\r\n }\r\n if (updatedPatientObject.isEligibleForCompensation === 'null') {\r\n updatedPatientObject.isEligibleForCompensation = null;\r\n }\r\n return updatedPatientObject;\r\n}","import React from \"react\";\r\nimport { Button, Form } from \"react-bootstrap\";\r\nimport { useForm, Controller } from \"react-hook-form\";\r\nimport { Rules } from \"../../../../common/helpers\";\r\nimport EupatiTextbox from \"../../../../common/static/textbox\";\r\nimport EupatiEmailbox from \"../../../../common/static/emailbox\";\r\nimport { Patient } from \"../../../../common/models/main-models\";\r\n\r\ntype OwnProps = {\r\n patient: Patient\r\n};\r\n\r\ntype DispatchProps = {\r\n setPatientInfo: (patient: Patient) => void;\r\n showPatientSpecificInfoSection: () => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function PatientGenericInfo(props: Props) {\r\n\r\n const { handleSubmit, control, watch, formState: { errors } } = useForm();\r\n\r\n const onSubmit = (data: any) => {\r\n const editedPatientInfo = Object.assign(props.patient, data);\r\n props.setPatientInfo(editedPatientInfo);\r\n props.showPatientSpecificInfoSection();\r\n }\r\n\r\n return (\r\n <Form className='profile' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='profile-info'>\r\n <Form.Group className='lcolumn'>\r\n\r\n <Form.Group id='pt-fname' className='profile-info-field mb-3'>\r\n <Form.Label>First name</Form.Label>\r\n <Controller\r\n name='firstName'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.firstName)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.firstName?.message,\r\n placeholder: 'Please type first name'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-lname' className='profile-info-field mb-3'>\r\n <Form.Label>Surname</Form.Label>\r\n <Controller\r\n name='lastName'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.lastName)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.lastName?.message,\r\n placeholder: 'Please type last name'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-tel' className='profile-info-field mb-3'>\r\n <Form.Label>Phone</Form.Label>\r\n <Controller\r\n name='phoneNumber'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.phoneNumber)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.phoneNumber?.message,\r\n placeholder: 'Please type phone number'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-year' className='profile-info-field mb-3'>\r\n <Form.Label>Year of birth</Form.Label>\r\n <Controller\r\n name='birthYear'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.birthYear)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.birthYear?.message,\r\n fieldType: 'number',\r\n placeholder: 'Please type year of birth'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-email' className='profile-info-field mb-3'>\r\n <Form.Label>Email</Form.Label>\r\n <Controller\r\n name='email'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.email)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiEmailbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.email?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n\r\n <Form.Group id='pt-btns'>\r\n <Button className='bck' variant='secondary' type='submit' style={{ visibility: 'hidden' }}>Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Next</Button>\r\n </Form.Group>\r\n\r\n </Form.Group>\r\n </Form.Group>\r\n </Form>\r\n )\r\n}","import React from \"react\";\r\nimport { Button, Form } from \"react-bootstrap\";\r\nimport { useForm, Controller } from \"react-hook-form\";\r\nimport { Rules } from \"../../../../common/helpers\";\r\nimport EupatiDropdown from \"../../../../common/static/dropdown\";\r\nimport EupatiSelect from \"../../../../common/static/select-menu\";\r\nimport EupatiTextbox from \"../../../../common/static/textbox\";\r\nimport EupatiNonCMSToggleBtn from \"../../../../common/static/toggle-btn-nonCMS\";\r\nimport EupatiToggleBtn from \"../../../../common/static/toggle-btn\";\r\nimport { Patient } from \"../../../../common/models/main-models\";\r\nimport { LookUpOptions } from \"../../../../common/models/input-models\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faInfoCircle } from '@fortawesome/fontawesome-free-solid';\r\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\r\nimport ReactTooltip from 'react-tooltip';\r\n\r\ntype OwnProps = {\r\n patient: Patient\r\n};\r\n\r\ntype DispatchProps = {\r\n nextPage: () => void;\r\n setPatientInfo: (patient: Patient) => void;\r\n hidePatientSpecificInfoSection: () => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\ntype FieldProps = {\r\n countryId?: number,\r\n languages: string[],\r\n countriesWithExperience: string[],\r\n genderTypeId?: number,\r\n genderTypeDescription: string,\r\n isPOAffiliated?: boolean,\r\n patientOrganisation: string\r\n};\r\n\r\nexport default function PatientSpecificInfo(props: Props) {\r\n\r\n const { handleSubmit, control, watch, formState: { errors } } = useForm();\r\n\r\n const fieldsData = {\r\n countryId: watch(\"countryId\") as number | undefined,\r\n languages: watch(\"languages\") as string[],\r\n countriesWithExperience: watch(\"countriesWithExperience\") as string[],\r\n genderTypeId: watch(\"genderTypeId\") as number | undefined,\r\n genderTypeDescription: watch(\"genderTypeDescription\") as string,\r\n isPOAffiliated: watch(\"isPOAffiliated\") as boolean | undefined,\r\n patientOrganisation: watch(\"patientOrganisation\") as string\r\n } as FieldProps;\r\n\r\n const onSubmit = (data: any) => {\r\n const editedPatientInfo = Object.assign(props.patient, data);\r\n props.setPatientInfo(editedPatientInfo);\r\n props.nextPage();\r\n }\r\n\r\n const onBackHandler = () => {\r\n if (adjustFieldsValues() === 0) {\r\n const editedPatientInfo = Object.assign(props.patient, fieldsData);\r\n props.setPatientInfo(editedPatientInfo);\r\n }\r\n props.hidePatientSpecificInfoSection();\r\n }\r\n\r\n const returnProperIconType = (icon: any) => {\r\n return icon as IconProp;\r\n }\r\n\r\n const fieldIsPOAffiliatedToggle = () => {\r\n if (fieldsData?.isPOAffiliated?.toString() === \"true\") {\r\n return true;\r\n }\r\n else if (fieldsData?.isPOAffiliated?.toString() === \"false\") {\r\n return false;\r\n }\r\n\r\n if (props.patient.isPOAffiliated !== undefined &&\r\n props.patient.isPOAffiliated !== null) {\r\n if (props?.patient?.isPOAffiliated.toString() === \"true\") {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n const fieldGenderTypeToggle = () => {\r\n const otherGenderType = props.findLookUpData(\"genderType\")?.find(gt => gt.name.toLowerCase().includes('other'));\r\n if (fieldsData.genderTypeId !== undefined && fieldsData.genderTypeId !== null) {\r\n return otherGenderType?.id === fieldsData.genderTypeId ? true : false;\r\n }\r\n if (props.patient.genderTypeId !== undefined && props.patient.genderTypeId !== null) {\r\n return otherGenderType?.id.toString() === props.patient.genderTypeId.toString() ? true : false;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n const checkNullOrUndefined = (val: any) => {\r\n return typeof val === undefined || val === null || val === 0 ? true : false;\r\n }\r\n\r\n const adjustFieldsValues = () => {\r\n if (fieldsData.countryId === undefined &&\r\n fieldsData.languages === undefined &&\r\n fieldsData.countriesWithExperience === undefined &&\r\n fieldsData.genderTypeId === undefined &&\r\n fieldsData.genderTypeDescription === undefined &&\r\n fieldsData.isPOAffiliated === undefined &&\r\n fieldsData.patientOrganisation === undefined) {\r\n return 1;\r\n }\r\n\r\n if (fieldsData.countryId === undefined &&\r\n props.patient.countryId !== undefined) {\r\n fieldsData.countryId = props.patient.countryId;\r\n }\r\n\r\n if (fieldsData.languages === undefined &&\r\n props.patient.languages !== undefined) {\r\n fieldsData.languages = [...props.patient.languages];\r\n }\r\n\r\n if (fieldsData.countriesWithExperience === undefined &&\r\n props.patient.countriesWithExperience !== undefined) {\r\n fieldsData.countriesWithExperience = [...props.patient.countriesWithExperience];\r\n }\r\n\r\n if (fieldsData.genderTypeId === undefined &&\r\n props.patient.genderTypeId !== undefined) {\r\n fieldsData.genderTypeId = props.patient.genderTypeId;\r\n }\r\n\r\n if (fieldsData.genderTypeDescription === undefined &&\r\n props.patient.genderTypeDescription !== undefined) {\r\n fieldsData.genderTypeDescription = props.patient.genderTypeDescription;\r\n }\r\n\r\n if (fieldsData.isPOAffiliated === undefined &&\r\n props.patient.isPOAffiliated !== undefined) {\r\n fieldsData.isPOAffiliated = props.patient.isPOAffiliated;\r\n }\r\n\r\n if (fieldsData.patientOrganisation === undefined &&\r\n props.patient.patientOrganisation !== undefined) {\r\n fieldsData.patientOrganisation = props.patient.patientOrganisation;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n return (\r\n <Form className='profile' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='profile-info'>\r\n <Form.Group className='rcolumn'>\r\n\r\n <Form.Group id='pt-ctry' className='profile-info-field mb-4'>\r\n <Form.Label>Country of residence</Form.Label>\r\n <Controller\r\n name='countryId'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.countryId)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiDropdown\r\n {...{\r\n ...field,\r\n errorMsg: errors?.countryId?.message,\r\n values: props.findLookUpData('country'),\r\n fieldName: 'countryId',\r\n defaultOptionText: checkNullOrUndefined(props.patient.countryId) ? 'Please select country...' : undefined\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-lang' className='profile-info-field mb-4'>\r\n <Form.Label>Languages</Form.Label>\r\n <FontAwesomeIcon data-tip data-for='languagesControlInfo' icon={returnProperIconType(faInfoCircle)} />\r\n <ReactTooltip\r\n id='languagesControlInfo'\r\n multiline={true}>\r\n <span>\r\n It is possible to select multiple languages.\r\n <br />\r\n You can achive that by typing their names in the input field.\r\n <br />\r\n Moreover, you can also pick them from the dropdown menu.\r\n <br />\r\n </span>\r\n </ReactTooltip>\r\n <Controller\r\n name='languages'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.languages)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiSelect\r\n {...{\r\n ...field,\r\n errorMsg: errors?.languages?.message,\r\n values: props.findLookUpData('language'),\r\n placeholder: 'Select languages...',\r\n isAutocomplete: false\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-otherCtry' className='profile-info-field mb-4'>\r\n <Form.Label >Other country(ies) experience</Form.Label>\r\n <FontAwesomeIcon data-tip data-for='otherCtryInfo' icon={returnProperIconType(faInfoCircle)} />\r\n <ReactTooltip id='otherCtryInfo'>\r\n <span>Country(ies) in which you have experience relevant to patient engagement</span>\r\n </ReactTooltip>\r\n <FontAwesomeIcon data-tip data-for='otherCtryControlInfo' icon={returnProperIconType(faInfoCircle)} />\r\n <ReactTooltip\r\n id='otherCtryControlInfo'\r\n multiline={true}>\r\n <span>\r\n It is possible to select multiple countries or continents.\r\n <br />\r\n You can achive that by typing their names in the input field.\r\n <br />\r\n Moreover, you can also pick them from the dropdown menu.\r\n <br />\r\n </span>\r\n </ReactTooltip>\r\n <Controller\r\n name='countriesWithExperience'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.countriesWithExperience)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiSelect\r\n {...{\r\n ...field,\r\n errorMsg: errors?.countriesWithExperience?.message,\r\n values: props.findLookUpData('countryWithContinents'),\r\n isAutocomplete: false\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-gender' className='profile-info-field mb-4'>\r\n <Form.Label>Gender</Form.Label>\r\n <Controller\r\n name='genderTypeId'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.genderTypeId)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiToggleBtn\r\n {...{\r\n ...field,\r\n errorMsg: errors?.genderTypeId?.message,\r\n fieldName: 'genderTypeId',\r\n values: props.findLookUpData('genderType')\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n {fieldGenderTypeToggle() &&\r\n <Form.Group id='pt-genderDescr' className='profile-info-field mb-4'>\r\n <Form.Label>Please specify the gender type</Form.Label>\r\n <Controller\r\n name='genderTypeDescription'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.genderTypeDescription)}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.genderTypeDescription?.message,\r\n placeholder: 'Please specify gender type'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n }\r\n\r\n <div>\r\n <Form.Group id='pt-poa' className='profile-info-field mb-3'>\r\n <Form.Label>Affiliation to a patient organisation</Form.Label>\r\n <Controller\r\n name='isPOAffiliated'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.isPOAffiliated)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiNonCMSToggleBtn\r\n {...{\r\n ...field,\r\n errorMsg: errors?.isPOAffiliated?.message,\r\n fieldName: 'isPOAffiliated',\r\n isMoreThanTwoOptions: false\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n {fieldIsPOAffiliatedToggle() &&\r\n <Form.Group id='pt-org' className='profile-info-field mb-4'>\r\n <Form.Label>Patient organisation</Form.Label>\r\n <Controller\r\n name='patientOrganisation'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.patientOrganisation)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.patientOrganisation?.message,\r\n placeholder: 'Please type patient organisation'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n }\r\n </div>\r\n\r\n <Form.Group id='pt-btns'>\r\n <Button className='bck' variant='secondary' type='submit' onClick={onBackHandler}>Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Next</Button>\r\n </Form.Group>\r\n\r\n </Form.Group>\r\n </Form.Group>\r\n </Form>\r\n )\r\n}","import React, { useState } from \"react\";\r\nimport { LookUpData, LookUpOptions } from \"../../../../common/models/input-models\";\r\nimport { Patient } from \"../../../../common/models/main-models\";\r\nimport PatientGenericInfo from \"./generic\";\r\nimport PatientSpecificInfo from \"./specific\";\r\n\r\ntype OwnProps = {\r\n patient: Patient,\r\n lookUpData: LookUpData[],\r\n showSecondSubComponent: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n nextPage: () => void;\r\n prevPage: () => void;\r\n savePatient: (project: Patient) => void;\r\n setPatientInfo: (project: Patient) => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function PatientGeneralInfo(props: Props) {\r\n const [nextBtnClicked, setNextBtnClicked] = useState<boolean>(props.showSecondSubComponent);\r\n\r\n const toggleSectionVisibility = () => {\r\n setNextBtnClicked(!nextBtnClicked);\r\n }\r\n\r\n return (\r\n <div style={{ margin: '0 0 7.5rem 0' }}>\r\n\r\n {nextBtnClicked &&\r\n <PatientGenericInfo\r\n {...{\r\n ...props,\r\n showPatientSpecificInfoSection: toggleSectionVisibility\r\n }}\r\n />\r\n }\r\n\r\n {!nextBtnClicked &&\r\n <PatientSpecificInfo\r\n {...{\r\n ...props,\r\n hidePatientSpecificInfoSection: toggleSectionVisibility\r\n }}\r\n />\r\n }\r\n\r\n </div>\r\n );\r\n}","import React, { useState, useEffect } from \"react\";\r\nimport { Button, Form } from \"react-bootstrap\";\r\nimport { useForm, Controller } from \"react-hook-form\";\r\nimport EupatiDiseaseAsyncSelect from \"../../../../common/static/async-select-menu\";\r\nimport { Rules } from \"../../../../common/helpers\";\r\nimport EupatiToggleBtn from \"../../../../common/static/toggle-btn\";\r\nimport EupatiTextarea from \"../../../../common/static/textarea\";\r\nimport { DiseaseInfo, Patient } from \"../../../../common/models/main-models\";\r\nimport { LookUpOptions } from \"../../../../common/models/input-models\";\r\nimport EupatiCheckbox from \"../../../../common/static/checkbox-toggle\";\r\nimport { IconProp } from \"@fortawesome/fontawesome-svg-core\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faInfoCircle } from '@fortawesome/fontawesome-free-solid';\r\nimport ReactTooltip from 'react-tooltip';\r\n\r\ntype OwnProps = {\r\n patient: Patient\r\n};\r\n\r\ntype DispatchProps = {\r\n nextPage: () => void;\r\n setPatientInfo: (patient: Patient) => void;\r\n hidePatientsDiseaseExpInfo: () => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\ntype FieldProps = {\r\n diseases: DiseaseInfo[],\r\n noDiseaseExpertise: boolean,\r\n patientExperienceId: number,\r\n otherInformation: string\r\n};\r\n\r\nconst CUSTOM_SPAN_STYLES = ({\r\n boldFont: {\r\n fontWeight: 600\r\n }\r\n});\r\nexport default function PatientsDiseaseExpInfo(props: Props) {\r\n const { handleSubmit, control, watch, formState: { errors } } = useForm();\r\n\r\n const fieldsData = {\r\n diseases: watch(\"diseases\") as DiseaseInfo[],\r\n noDiseaseExpertise: watch(\"noDiseaseExpertise\") as boolean,\r\n patientExperienceId: watch(\"patientExperienceId\") as number,\r\n otherInformation: watch(\"otherInformation\") as string\r\n } as FieldProps;\r\n\r\n const onSubmit = (data: any) => {\r\n const editedPatientInfo = Object.assign(props.patient, data);\r\n props.setPatientInfo(editedPatientInfo);\r\n props.nextPage();\r\n }\r\n\r\n function onBackHandler() {\r\n if (adjustFieldsValues() === 0) {\r\n const editedPatientInfo = Object.assign(props.patient, fieldsData);\r\n props.setPatientInfo(editedPatientInfo);\r\n }\r\n props.hidePatientsDiseaseExpInfo();\r\n }\r\n\r\n const adjustFieldsValues = () => {\r\n if (fieldsData.diseases === undefined &&\r\n fieldsData.noDiseaseExpertise === undefined &&\r\n fieldsData.patientExperienceId === undefined &&\r\n fieldsData.otherInformation === undefined) {\r\n return 1; // if user hasn't changed anything\r\n }\r\n\r\n if (fieldsData.diseases === undefined &&\r\n props.patient.diseases.length >= 0) {\r\n fieldsData.diseases = [...props.patient.diseases];\r\n }\r\n\r\n if (fieldsData.noDiseaseExpertise === undefined &&\r\n props.patient.noDiseaseExpertise !== undefined) {\r\n fieldsData.noDiseaseExpertise = props.patient.noDiseaseExpertise;\r\n }\r\n\r\n if (fieldsData.otherInformation === undefined &&\r\n props.patient.otherInformation !== undefined) {\r\n fieldsData.otherInformation = props.patient.otherInformation;\r\n }\r\n\r\n if (fieldsData.patientExperienceId === undefined &&\r\n props.patient.patientExperienceId !== undefined) {\r\n fieldsData.patientExperienceId = props.patient.patientExperienceId;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n const returnProperIconType = (icon: any) => {\r\n return icon as IconProp;\r\n }\r\n\r\n return (\r\n <Form className='experience' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='experience-info'>\r\n <Form.Group className='rcolumn'>\r\n <Form.Group id='pt-disease-name' className='experience-info-field mb-3'>\r\n <Form.Label style={{ display: 'flex', flexDirection: 'column' }}>\r\n <span style={{ ...CUSTOM_SPAN_STYLES.boldFont }}>\r\n Disease experience\r\n <FontAwesomeIcon data-tip data-for='expDiseasesControlInfo' icon={returnProperIconType(faInfoCircle)} />\r\n <ReactTooltip\r\n id='expDiseasesControlInfo'\r\n multiline={true}\r\n >\r\n <span>\r\n It is possible to select multiple diseases.\r\n <br />\r\n You can achive that by typing their names in the input field.\r\n <br />\r\n Moreover, you can also pick them from the dropdown menu.\r\n <br />\r\n </span>\r\n </ReactTooltip>\r\n </span>\r\n <span>\r\n <small style={{ fontSize: '11px' }}>\r\n Diseases are listed according to the US National Library of Medicine.\r\n You can find the controlled vocabulary, Medical Subject Headings (MEsH), <a href='https://meshb.nlm.nih.gov/search' target='_blank' >here.*</a>\r\n </small>\r\n </span>\r\n </Form.Label>\r\n <Controller\r\n name='diseases'\r\n control={control}\r\n defaultValue={props?.patient?.diseases}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiDiseaseAsyncSelect\r\n {...{\r\n ...field,\r\n errorMsg: errors?.diseases?.message\r\n }}\r\n />\r\n }\r\n />\r\n <Controller\r\n name='noDiseaseExpertise'\r\n control={control}\r\n defaultValue={props.patient.noDiseaseExpertise}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiCheckbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.noDiseaseExpertise?.message,\r\n fieldName: 'noDiseaseExpertise',\r\n text: 'I have no specific disease experience'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-expc' className='experience-info-field mb-3'>\r\n <Form.Label>Level of experience with disease</Form.Label>\r\n <Controller\r\n name='patientExperienceId'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.patientExperienceId)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiToggleBtn\r\n {...{\r\n ...field,\r\n errorMsg: errors?.patientExperienceId?.message,\r\n fieldName: 'patientExperienceId',\r\n values: props.findLookUpData('patientExperiense')\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-otherInfo' className='experience-info-field mb-3'>\r\n <Form.Label>Other relevant information</Form.Label>\r\n <Controller\r\n name='otherInformation'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.otherInformation)}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextarea\r\n {...{\r\n ...field,\r\n errorMsg: errors?.otherInformation?.message,\r\n rowsCount: 8\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-btns'>\r\n <Button className='bck' variant='secondary' type='submit' onClick={onBackHandler}>Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Next</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form >\r\n )\r\n}","import React from \"react\";\r\nimport { Button, Form } from \"react-bootstrap\";\r\nimport { useForm, Controller } from \"react-hook-form\";\r\nimport EupatiMultiselect from \"../../../../common/static/multiselect\";\r\nimport { Rules } from \"../../../../common/helpers\";\r\nimport { Patient } from \"../../../../common/models/main-models\";\r\nimport { LookUpOptions } from \"../../../../common/models/input-models\";\r\nimport EupatiTextbox from \"../../../../common/static/textbox\";\r\n\r\ntype OwnProps = {\r\n patient: Patient\r\n};\r\n\r\ntype DispatchProps = {\r\n prevPage: () => void;\r\n showPatientsDiseaseExpInfo: () => void;\r\n setPatientInfo: (patient: Patient) => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\ntype FieldProps = {\r\n patientExpertises: number[],\r\n patientExpertiseDescription: string,\r\n projectTypeExperiences: number[],\r\n projectTypeExperiencesDescription: string\r\n};\r\n\r\nexport default function PatientsProjectExpInfo(props: Props) {\r\n const { handleSubmit, control, watch, formState: { errors } } = useForm();\r\n\r\n const fieldsData = {\r\n patientExpertises: watch(\"patientExpertises\") as number[],\r\n projectTypeExperiences: watch(\"projectTypeExperiences\") as number[],\r\n patientExpertiseDescription: watch(\"patientExpertiseDescription\") as string,\r\n projectTypeExperiencesDescription: watch(\"projectTypeExperiencesDescription\") as string\r\n } as FieldProps;\r\n\r\n const onSubmit = (data: any) => {\r\n const editedPatientInfo = Object.assign(props.patient, Object.assign(data));\r\n props.setPatientInfo(editedPatientInfo);\r\n props.showPatientsDiseaseExpInfo();\r\n }\r\n\r\n const onBackHandler = () => {\r\n if (adjustFieldsValues() === 0) {\r\n const editedPatientInfo = Object.assign(props.patient, Object.assign(fieldsData));\r\n props.setPatientInfo(editedPatientInfo);\r\n }\r\n props.prevPage();\r\n }\r\n\r\n const adjustFieldsValues = () => {\r\n if (fieldsData.patientExpertises === undefined &&\r\n fieldsData.projectTypeExperiences === undefined &&\r\n fieldsData.patientExpertiseDescription === undefined &&\r\n fieldsData.projectTypeExperiencesDescription === undefined) {\r\n return 1; // if user hasn't changed anything\r\n }\r\n\r\n if (fieldsData.patientExpertises === undefined &&\r\n props.patient.patientExpertises !== undefined) {\r\n fieldsData.patientExpertises = props.patient.patientExpertises;\r\n }\r\n\r\n if (fieldsData.projectTypeExperiences === undefined &&\r\n props.patient.projectTypeExperiences !== undefined) {\r\n fieldsData.projectTypeExperiences = [...props.patient.projectTypeExperiences];\r\n }\r\n\r\n if (fieldsData.projectTypeExperiencesDescription === undefined &&\r\n props.patient.projectTypeExperiencesDescription !== undefined) {\r\n fieldsData.projectTypeExperiencesDescription = props.patient.projectTypeExperiencesDescription;\r\n }\r\n\r\n if (fieldsData.patientExpertiseDescription === undefined &&\r\n props.patient.patientExpertiseDescription !== undefined) {\r\n fieldsData.patientExpertiseDescription = props.patient.patientExpertiseDescription;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n const toggleProjTypeExpField = () => {\r\n let projTypeExp: number[] = [];\r\n if (fieldsData.projectTypeExperiences !== undefined && fieldsData.projectTypeExperiences !== null) {\r\n projTypeExp = [...fieldsData.projectTypeExperiences];\r\n }\r\n else if (props.patient.projectTypeExperiences !== undefined && props.patient.projectTypeExperiences !== null) {\r\n projTypeExp = [...props.patient.projectTypeExperiences];\r\n }\r\n\r\n //if (orgTypes.length > 1) { return false; }\r\n let otherType = props.findLookUpData('projectType')?.find(ot => ot.name.toLowerCase().includes('other')); // gets { id: 3, name: 'Other' }\r\n return projTypeExp?.some((x) => x === otherType?.id) ? true : false;\r\n }\r\n\r\n const togglePtExpertiseField = () => {\r\n let ptExpertises: number[] = [];\r\n if (fieldsData.patientExpertises !== undefined && fieldsData.patientExpertises !== null) {\r\n ptExpertises = [...fieldsData.patientExpertises];\r\n }\r\n else if (props.patient.patientExpertises !== undefined && props.patient.patientExpertises !== null) {\r\n ptExpertises = [...props.patient.patientExpertises];\r\n }\r\n\r\n //if (orgTypes.length > 1) { return false; }\r\n let otherType = props.findLookUpData('expertise')?.find(ot => ot.name.toLowerCase().includes('other')); // gets { id: 3, name: 'Other' }\r\n return ptExpertises?.some((x) => x === otherType?.id) ? true : false;\r\n }\r\n\r\n return (\r\n <Form className='experience' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='experience-info'>\r\n <Form.Group className='lcolumn'>\r\n\r\n <Form.Group id='pt-expertise' className='experience-info-field mb-4'>\r\n <Form.Label>Level of expertise (multiple answers possible)</Form.Label>\r\n <Controller\r\n name='patientExpertises'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.patientExpertises)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiMultiselect\r\n {...{\r\n ...field,\r\n errorMsg: errors?.message,\r\n fieldName: 'patientExpertises',\r\n values: props.findLookUpData('expertise')\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n {togglePtExpertiseField() &&\r\n <Form.Group id='pt-expertiseDescr' className='experience-info-field mb-4'>\r\n <Form.Label>Please specify level of expertise</Form.Label>\r\n <Controller\r\n name='patientExpertiseDescription'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.patientExpertiseDescription)}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.patientExpertiseDescription?.message,\r\n placeholder: 'Please type level of expertise'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n }\r\n\r\n <Form.Group id='pt-expcProj' className='experience-info-field mb-4'>\r\n <Form.Label>Type of project experience (multiple answers possible)</Form.Label>\r\n <Controller\r\n name='projectTypeExperiences'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.projectTypeExperiences)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiMultiselect\r\n {...{\r\n ...field,\r\n errorMsg: errors?.projectTypeExperiences?.message,\r\n fieldName: 'projectTypeExperiences',\r\n values: props.findLookUpData('projectType')\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n {toggleProjTypeExpField() &&\r\n <Form.Group id='pt-expcProjDescr' className='experience-info-field mb-4' >\r\n <Form.Label>Please specify the type of project</Form.Label>\r\n <Controller\r\n name='projectTypeExperiencesDescription'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.projectTypeExperiencesDescription)}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.projectTypeExperiencesDescription?.message,\r\n placeholder: 'Please specify project type'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n }\r\n\r\n <Form.Group id='pt-btns'>\r\n <Button className='bck' variant='secondary' type='submit' onClick={onBackHandler}>Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Next</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form>\r\n )\r\n}","import React, { useState } from \"react\";\r\nimport { LookUpData, LookUpOptions } from \"../../../../common/models/input-models\";\r\nimport { Patient } from \"../../../../common/models/main-models\";\r\nimport PatientsDiseaseExpInfo from \"./disease-exp\";\r\nimport PatientsProjectExpInfo from \"./proj-exp\";\r\n\r\ntype OwnProps = {\r\n patient: Patient,\r\n lookUpData: LookUpData[],\r\n showSecondSubComponent: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n setPatientInfo: (patient: Patient) => void;\r\n nextPage: () => void;\r\n prevPage: () => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n savePatient: (patient: Patient) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function PatientExpcInfo(props: Props) {\r\n const [nextBtnClicked, setNextBtnClicked] = useState<boolean>(props.showSecondSubComponent);\r\n\r\n const toggleSectionVisibility = () => {\r\n setNextBtnClicked(!nextBtnClicked);\r\n }\r\n\r\n return (\r\n <div style={{ margin: '0 0 7.5rem 0' }}>\r\n\r\n {nextBtnClicked &&\r\n <PatientsProjectExpInfo\r\n {...{\r\n ...props,\r\n showPatientsDiseaseExpInfo: toggleSectionVisibility\r\n }}\r\n />\r\n }\r\n\r\n {!nextBtnClicked &&\r\n <PatientsDiseaseExpInfo\r\n {...{\r\n ...props,\r\n hidePatientsDiseaseExpInfo: toggleSectionVisibility\r\n }}\r\n />\r\n }\r\n </div>\r\n );\r\n}","import React from \"react\";\r\nimport { useForm, Controller } from \"react-hook-form\";\r\nimport { Button, Form } from 'react-bootstrap';\r\nimport { Rules } from \"../../../../common/helpers\";\r\nimport EupatiMultiselect from \"../../../../common/static/multiselect\";\r\nimport { Patient } from \"../../../../common/models/main-models\";\r\nimport { LookUpOptions } from \"../../../../common/models/input-models\";\r\nimport EupatiTextbox from \"../../../../common/static/textbox\";\r\n\r\ntype OwnProps = {\r\n patient: Patient\r\n};\r\n\r\ntype DispatchProps = {\r\n prevPage: () => void;\r\n setPatientInfo: (patient: Patient) => void;\r\n showPatientCompensationReqInfo: () => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\ntype FieldsProps = {\r\n projectPreferences: number[],\r\n projectPreferenceDescription: string,\r\n organisationPreferences: number[],\r\n organisationPreferenceDescription: string\r\n};\r\n\r\nexport default function PatientProjectReqInfo(props: Props) {\r\n\r\n const { handleSubmit, control, watch, formState: { errors } } = useForm();\r\n\r\n const fieldsData = {\r\n projectPreferences: watch(\"projectPreferences\") as number[],\r\n projectPreferenceDescription: watch(\"projectPreferenceDescription\") as string,\r\n organisationPreferences: watch(\"organisationPreferences\") as number[],\r\n organisationPreferenceDescription: watch(\"organisationPreferenceDescription\") as string\r\n } as FieldsProps;\r\n\r\n const onSubmit = (data: any) => {\r\n const editedPatientInfo = Object.assign(props.patient, data);\r\n props.setPatientInfo(editedPatientInfo);\r\n props.showPatientCompensationReqInfo();\r\n }\r\n\r\n function onBackHandler() {\r\n if (adjustFieldsValues() === 0) {\r\n const editedPatientInfo = Object.assign(props.patient, fieldsData);\r\n props.setPatientInfo(editedPatientInfo);\r\n }\r\n props.prevPage();\r\n }\r\n\r\n const orderLookUpOptionsByNameLength = (options: LookUpOptions[] | null) => {\r\n if (options !== null) {\r\n return options.sort((a, b) => a.name.length - b.name.length);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n const toggleOrgPrefField = () => {\r\n let orgTypes: number[] = [];\r\n if (fieldsData.organisationPreferences !== undefined && fieldsData.organisationPreferences !== null) {\r\n orgTypes = [...fieldsData.organisationPreferences];\r\n }\r\n else if (props.patient.organisationPreferences !== undefined && props.patient.organisationPreferences !== null) {\r\n orgTypes = [...props.patient.organisationPreferences];\r\n }\r\n\r\n //if (orgTypes.length > 1) { return false; }\r\n let otherType = props.findLookUpData('organisationType')?.find(ot => ot.name.toLowerCase().includes('other')); // gets { id: 3, name: 'Other' }\r\n return orgTypes?.some((x) => x === otherType?.id) ? true : false;\r\n }\r\n\r\n const toggleProjPrefField = () => {\r\n let projPrefs: number[] = [];\r\n if (fieldsData.projectPreferences !== undefined && fieldsData.projectPreferences !== null) {\r\n projPrefs = [...fieldsData.projectPreferences];\r\n }\r\n else if (props.patient.projectPreferences !== undefined && props.patient.projectPreferences !== null) {\r\n projPrefs = [...props.patient.projectPreferences];\r\n }\r\n\r\n //if (orgTypes.length > 1) { return false; }\r\n let otherType = props.findLookUpData('projectType')?.find(ot => ot.name.toLowerCase().includes('other')); // gets { id: 3, name: 'Other' }\r\n return projPrefs?.some((x) => x === otherType?.id) ? true : false;\r\n }\r\n\r\n const adjustFieldsValues = () => {\r\n if (fieldsData.projectPreferences === undefined &&\r\n fieldsData.organisationPreferences === undefined &&\r\n fieldsData.projectPreferenceDescription === undefined &&\r\n fieldsData.organisationPreferenceDescription === undefined) {\r\n return 1; // if user hasn't changed anything\r\n }\r\n\r\n if (fieldsData.projectPreferences === undefined &&\r\n props.patient.projectPreferences !== undefined) {\r\n fieldsData.projectPreferences = [...props.patient.projectPreferences];\r\n }\r\n\r\n if (fieldsData.organisationPreferences === undefined &&\r\n props.patient.organisationPreferences !== undefined) {\r\n fieldsData.organisationPreferences = [...props.patient.organisationPreferences];\r\n }\r\n\r\n if (fieldsData.projectPreferenceDescription === undefined &&\r\n props.patient.projectPreferenceDescription !== undefined) {\r\n fieldsData.projectPreferenceDescription = props.patient.projectPreferenceDescription;\r\n }\r\n\r\n if (fieldsData.organisationPreferenceDescription === undefined &&\r\n props.patient.organisationPreferenceDescription !== undefined) {\r\n fieldsData.organisationPreferenceDescription = props.patient.organisationPreferenceDescription;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n return (\r\n <Form className='requirements' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='requirements-info'>\r\n <Form.Group className='lcolumn'>\r\n\r\n <Form.Group id='pt-tpProj' className='requirements-info-field mb-3'>\r\n <Form.Label>Preference on types of projects (multiple answers possible)</Form.Label>\r\n <Controller\r\n name='projectPreferences'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.projectPreferences)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiMultiselect\r\n {...{\r\n ...field,\r\n errorMsg: errors?.projectPreferences?.message,\r\n fieldName: 'projectPreferences',\r\n values: props.findLookUpData('projectType')\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n {toggleProjPrefField() &&\r\n <Form.Group id='pt-projPrefDescr' className='requirements-info-field mb-3'>\r\n <Form.Label>Please specify project preference</Form.Label>\r\n <Controller\r\n name='projectPreferenceDescription'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.projectPreferenceDescription)}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.projectPreferenceDescription?.message,\r\n placeholder: 'Please type project preference'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n }\r\n\r\n <Form.Group id='pt-orgTp' className='requirements-info-field mb-3'>\r\n <Form.Label>Preference on types of organisation (multiple answers possible)</Form.Label>\r\n <Controller\r\n name='organisationPreferences'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.organisationPreferences)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiMultiselect\r\n {...{\r\n ...field,\r\n errorMsg: errors?.projectPreferences?.message,\r\n fieldName: 'organisationPreferences',\r\n values: orderLookUpOptionsByNameLength(props.findLookUpData('organisationType'))\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n {toggleOrgPrefField() &&\r\n <Form.Group id='pt-orgTpDescr' className='requirements-info-field mb-3'>\r\n <Form.Label>Please specify organisation preference</Form.Label>\r\n <Controller\r\n name='organisationPreferenceDescription'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.organisationPreferenceDescription)}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.organisationPreferenceDescription?.message,\r\n placeholder: 'Please type organisation preference'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n }\r\n\r\n <Form.Group id='pt-btns'>\r\n <Button className='bck' variant='secondary' type='submit' onClick={onBackHandler}>Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Next</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form>\r\n )\r\n}","import React from \"react\";\r\nimport { useForm, Controller } from \"react-hook-form\";\r\nimport { Button, Form } from 'react-bootstrap';\r\nimport { Rules } from \"../../../../common/helpers\";\r\nimport EupatiNonCMSToggleBtn from \"../../../../common/static/toggle-btn-nonCMS\";\r\nimport EupatiToggleBtn from \"../../../../common/static/toggle-btn\";\r\nimport EupatiGDPRBtn from \"../../../../common/static/GDPR-toggle\";\r\nimport { Patient } from \"../../../../common/models/main-models\";\r\nimport { LookUpOptions } from \"../../../../common/models/input-models\";\r\n\r\ntype OwnProps = {\r\n patient: Patient,\r\n isNewPatient: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n nextPage: () => void;\r\n prevPage: () => void;\r\n savePatient: (patient: Patient) => void;\r\n hidePatientCompensationReqInfo: () => void;\r\n setPatientInfo: (patient: Patient) => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n submitNewPatient: (patient: Patient) => void;\r\n};\r\n\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\ntype FieldProps = {\r\n isEligibleForCompensation?: boolean,\r\n isAvailableForNoCompensation?: boolean,\r\n activityPreferenceId?: number,\r\n isGDPRConsentGiven: boolean\r\n};\r\n\r\nexport default function PatientCompensationReqInfo(props: Props) {\r\n\r\n const { handleSubmit, control, watch, formState: { errors } } = useForm();\r\n\r\n const fieldsData = {\r\n isEligibleForCompensation: watch(\"isEligibleForCompensation\") as boolean | undefined,\r\n isAvailableForNoCompensation: watch(\"isAvailableForNoCompensation\") as boolean | undefined,\r\n activityPreferenceId: watch(\"activityPreferenceId\") as number | undefined,\r\n isGDPRConsentGiven: watch(\"isGDPRConsentGiven\") as boolean,\r\n } as FieldProps;\r\n\r\n const onSubmit = (data: any) => {\r\n const editedPatientInfo = Object.assign(props.patient, data);\r\n switch (props.isNewPatient) {\r\n case true:\r\n props.submitNewPatient(editedPatientInfo);\r\n break;\r\n case false:\r\n props.savePatient(editedPatientInfo);\r\n break;\r\n }\r\n props.nextPage();\r\n }\r\n\r\n function onBackHandler() {\r\n if (adjustFieldsValues() === 0) {\r\n const editedPatientInfo = Object.assign(props.patient, fieldsData);\r\n props.setPatientInfo(editedPatientInfo);\r\n }\r\n props.hidePatientCompensationReqInfo();\r\n }\r\n\r\n const adjustFieldsValues = () => {\r\n if (fieldsData.isEligibleForCompensation === undefined &&\r\n fieldsData.isAvailableForNoCompensation === undefined &&\r\n fieldsData.activityPreferenceId === undefined &&\r\n fieldsData.isGDPRConsentGiven === undefined) {\r\n return 1; // if user hasn't changed anything\r\n }\r\n\r\n if (fieldsData.isEligibleForCompensation === undefined &&\r\n props.patient.isEligibleForCompensation !== undefined) {\r\n fieldsData.isEligibleForCompensation = props.patient.isEligibleForCompensation;\r\n }\r\n\r\n if (fieldsData.isAvailableForNoCompensation === undefined &&\r\n props.patient.isAvailableForNoCompensation !== undefined) {\r\n fieldsData.isAvailableForNoCompensation = props.patient.isAvailableForNoCompensation;\r\n }\r\n\r\n if (fieldsData.activityPreferenceId === undefined &&\r\n props.patient.activityPreferenceId !== undefined) {\r\n fieldsData.activityPreferenceId = props.patient.activityPreferenceId;\r\n }\r\n\r\n if (fieldsData.isGDPRConsentGiven === undefined &&\r\n props.patient.isGDPRConsentGiven !== undefined) {\r\n fieldsData.isGDPRConsentGiven = props.patient.isGDPRConsentGiven;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n return (\r\n <Form className='requirements' onSubmit={handleSubmit(onSubmit)}>\r\n <Form.Group className='requirements-info'>\r\n <Form.Group className='rcolumn'>\r\n <Form.Group id='pt-compEligbl' className='requirements-info-field mb-3'>\r\n <Form.Label>Are you eligible to receive compensation?</Form.Label>\r\n <Controller\r\n name='isEligibleForCompensation'\r\n control={control}\r\n defaultValue={props.patient.isEligibleForCompensation !== undefined ? `${props.patient.isEligibleForCompensation}` : ''}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiNonCMSToggleBtn\r\n {...{\r\n ...field,\r\n errorMsg: errors?.isEligibleForCompensation?.message,\r\n fieldName: 'isEligibleForCompensation',\r\n isMoreThanTwoOptions: true\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-noCompAvlbl' className='requirements-info-field mb-3'>\r\n <Form.Label>Are you available for voluntary work?</Form.Label>\r\n <Controller\r\n name='isAvailableForNoCompensation'\r\n control={control}\r\n defaultValue={props.patient.isAvailableForNoCompensation !== undefined ? `${props.patient.isAvailableForNoCompensation}` : ''}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiNonCMSToggleBtn\r\n {...{\r\n ...field,\r\n errorMsg: errors?.isAvailableForNoCompensation?.message,\r\n fieldName: 'isAvailableForNoCompensation',\r\n isMoreThanTwoOptions: true\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-expcProj' className='requirements-info-field mb-3'>\r\n <Form.Label>Preference for an individual or group projects</Form.Label>\r\n <Controller\r\n name='activityPreferenceId'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.activityPreferenceId)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiToggleBtn\r\n {...{\r\n ...field,\r\n errorMsg: errors?.activityPreferenceId?.message,\r\n fieldName: 'activityPreferenceId',\r\n values: props.findLookUpData('activityType')\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-gdpr' className='requirements-info-field mb-4'>\r\n <Controller\r\n name='isGDPRConsentGiven'\r\n control={control}\r\n defaultValue={props.returnProperDefaultValue(props.patient.isGDPRConsentGiven)}\r\n rules={Rules.selectOptionMessage}\r\n render={({ field }) =>\r\n <EupatiGDPRBtn\r\n {...{\r\n ...field,\r\n fieldName: 'isGDPRConsentGiven',\r\n errorMsg: errors?.isGDPRConsentGiven?.message\r\n }}\r\n />\r\n }\r\n />\r\n <small className='google-message'>\r\n This site is protected by reCAPTCHA and the Google\r\n <a className='google-message-privacy' href=\"https://policies.google.com/privacy\" target=\"_blank\"> Privacy Policy</a> and\r\n <a className='google-message-tos' href=\"https://policies.google.com/terms\" target=\"_blank\"> Terms of Service</a> apply.\r\n </small>\r\n </Form.Group>\r\n\r\n <Form.Group id='pt-btns'>\r\n <Button className='bck' variant='secondary' type='submit' onClick={onBackHandler}>Back</Button>\r\n <Button className='nxt' variant='primary' type='submit'>Submit</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form.Group>\r\n </Form>\r\n )\r\n}","import React, { useState } from \"react\";\r\nimport { LookUpOptions } from \"../../../../common/models/input-models\";\r\nimport { Patient } from \"../../../../common/models/main-models\";\r\nimport PatientProjectReqInfo from \"./comp-req\";\r\nimport PatientCompensationReqInfo from \"./proj-req\";\r\n\r\ntype OwnProps = {\r\n patient: Patient,\r\n isNewPatient: boolean,\r\n showSecondSubComponent: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n nextPage: () => void;\r\n prevPage: () => void;\r\n savePatient: (project: Patient) => void;\r\n setPatientInfo: (project: Patient) => void;\r\n returnProperDefaultValue: (val: any) => any;\r\n findLookUpData: (lookUpDataType?: string) => LookUpOptions[] | null;\r\n submitNewPatient: (patient: Patient) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function RequirementsInfo(props: Props) {\r\n\r\n const [nextBtnClicked, setNextBtnClicked] = useState<boolean>(props.showSecondSubComponent);\r\n\r\n const toggleSectionVisibility = () => {\r\n setNextBtnClicked(!nextBtnClicked);\r\n }\r\n\r\n return (\r\n <div style={{ margin: '0 0 7.5rem 0' }}>\r\n\r\n {nextBtnClicked &&\r\n <PatientProjectReqInfo\r\n {...{\r\n ...props,\r\n showPatientCompensationReqInfo: toggleSectionVisibility\r\n }}\r\n />\r\n }\r\n\r\n {!nextBtnClicked &&\r\n // GDPR here...\r\n <PatientCompensationReqInfo\r\n {...{\r\n ...props,\r\n hidePatientCompensationReqInfo: toggleSectionVisibility\r\n }}\r\n />\r\n }\r\n\r\n\r\n </div>\r\n );\r\n}","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\nimport { Patient } from '../../../common/models/main-models';\r\nimport EupatiLoader from '../../../common/static/loading-animation/loader';\r\nimport { State } from '../model';\r\nimport PatientGeneralInfo from './personal-info';\r\nimport PatientExpcInfo from './experience-info';\r\nimport RequirementsInfo from './preference-info';\r\nimport EupatiConfirmPage from '../../../common/static/confirm-page';\r\nimport { RouteComponentProps } from '@reach/router';\r\nimport '../style.scss';\r\nimport { toast } from 'react-toastify';\r\n\r\ntype OwnProps = {};\r\n\r\nexport type DispatchProps = {\r\n setPatientInfo: (patient: Patient) => void;\r\n setLookUpData: () => void;\r\n savePatient: (patient: Patient) => void;\r\n setPatientData: (id?: string) => void;\r\n setUserPatientData: (userId?: string) => void;\r\n submitNewPatient: (patient: Patient) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps & RouteComponentProps<{ location: { state: { userId: string, patientId: string, isNewPatient: boolean, isUserPatient: boolean } } }>;\r\n\r\ntype OwnState = {\r\n showComponentByIndex: number;\r\n showSecondSubComponent: boolean;\r\n};\r\n\r\nclass ComponentRoot extends React.Component<Props, OwnState> {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n showComponentByIndex: 0,\r\n showSecondSubComponent: true // when this is \"true\" on render it will show the first subcomponent (PatientGeneralInfo --> PatientGenericInfo).\r\n }\r\n\r\n this.nextPageHandler = this.nextPageHandler.bind(this);\r\n this.previousPageHandler = this.previousPageHandler.bind(this);\r\n this.returnProperDefaultValue = this.returnProperDefaultValue.bind(this);\r\n this.findLookUpData = this.findLookUpData.bind(this);\r\n this.showLoadingComponent = this.showLoadingComponent.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n this.props.setLookUpData();\r\n const locationState = this.props.location?.state;\r\n if (locationState === undefined || locationState === null) {\r\n return toast.error(\"Something went wrong! Try again later.\"); // unauthorized access\r\n }\r\n else if (locationState.isNewPatient === false) {\r\n this.props.setPatientData(locationState.patientId); // admin edit patient\r\n }\r\n else if (locationState.isNewPatient === true) {\r\n this.props.setPatientData(); // admin add patient\r\n }\r\n else if (locationState.isUserPatient === true) {\r\n this.props.setUserPatientData(locationState.userId); // user access patient profile\r\n }\r\n }\r\n\r\n nextPageHandler() {\r\n if (this.state.showComponentByIndex !== 3) {\r\n this.setState(prevState => ({\r\n showComponentByIndex: prevState.showComponentByIndex + 1,\r\n showSecondSubComponent: true\r\n }));\r\n }\r\n //window.scrollTo(0, 0);\r\n }\r\n\r\n previousPageHandler() {\r\n if (this.state.showComponentByIndex !== 0) {\r\n this.setState(prevState => ({\r\n showComponentByIndex: prevState.showComponentByIndex - 1,\r\n showSecondSubComponent: false\r\n }));\r\n }\r\n //window.scrollTo(0, 0);\r\n }\r\n\r\n findLookUpData(lookUpDataType?: string) {\r\n if (this.props.lookUpData &&\r\n this.props.lookUpData.length > 0) {\r\n return this.props.lookUpData?.filter((x: any) => x.name == lookUpDataType)[0]?.data;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n returnProperDefaultValue = (val: any) => {\r\n if (typeof val === 'undefined' || val === null) {\r\n return '';\r\n } else if (typeof val === 'boolean') {\r\n return val.toString(); // it doesn't set default val when 'false'\r\n }\r\n\r\n return val;\r\n }\r\n\r\n showLoadingComponent = (isNewPatient?: boolean) => {\r\n if (isNewPatient && !this.props.isLoading) {\r\n return false;\r\n }\r\n else if (this.props.isLoading || this.props.isPatientDataLoaded) {\r\n return true;\r\n }\r\n }\r\n\r\n render() {\r\n\r\n let mainComponent: any;\r\n\r\n let loadingComponent = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n );\r\n\r\n const props = {\r\n patient: this.props.patient,\r\n lookUpData: this.props.lookUpData,\r\n isNewPatient: typeof this.props.location?.state?.isNewPatient === 'undefined' ? false : this.props.location?.state?.isNewPatient,\r\n showSecondSubComponent: this.state.showSecondSubComponent,\r\n setPatientInfo: this.props.setPatientInfo,\r\n nextPage: this.nextPageHandler,\r\n prevPage: this.previousPageHandler,\r\n returnProperDefaultValue: this.returnProperDefaultValue,\r\n findLookUpData: this.findLookUpData,\r\n savePatient: this.props.savePatient,\r\n submitNewPatient: this.props.submitNewPatient\r\n };\r\n\r\n const spanStyles = {\r\n fontWeight: 'bolder',\r\n //textDecoration: 'underline',\r\n backgroundColor: '#00749F',\r\n borderRadius: '30px',\r\n color: '#fff'\r\n } as any;\r\n\r\n if (this.showLoadingComponent(this.props.location?.state?.isNewPatient)) {\r\n mainComponent = loadingComponent;\r\n }\r\n else {\r\n mainComponent = (\r\n <>\r\n <h2 className='heading' style={this.state.showComponentByIndex === 3 ? { display: 'none' } : {}}>Patient Profile</h2>\r\n {this.state.showComponentByIndex !== 3 &&\r\n <Form.Group className='titles-wrapper'>\r\n <div className='titles'>\r\n <div className='titles-title' style={this.state.showComponentByIndex === 0 ? { ...spanStyles } : {}}>\r\n <span>1. General</span>\r\n </div>\r\n <div className='titles-title' style={this.state.showComponentByIndex === 1 ? { ...spanStyles } : {}}>\r\n <span>2. Experience</span>\r\n </div>\r\n <div className='titles-title' style={this.state.showComponentByIndex === 2 ? { ...spanStyles } : {}}>\r\n <span>3. Preferences</span>\r\n </div>\r\n </div>\r\n </Form.Group>\r\n }\r\n {this.state.showComponentByIndex === 0 && <PatientGeneralInfo {...props} />}\r\n {this.state.showComponentByIndex === 1 && <PatientExpcInfo {...props} />}\r\n {this.state.showComponentByIndex === 2 && <RequirementsInfo {...props} />}\r\n {this.state.showComponentByIndex === 3 && <EupatiConfirmPage />}\r\n </>\r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {mainComponent}\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default ComponentRoot;","import { default as RootComponent, DispatchProps } from '../components/component-root'\r\nimport * as Constants from '../constants';\r\nimport * as Actions from '../actions';\r\nimport { State } from '../model';\r\nimport { connect } from 'react-redux';\r\nimport { Patient } from '../../../common/models/main-models';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n setLookUpData: () => dispatch(Actions.getLookUpDataAsync()),\r\n setPatientInfo: (patient: Patient) => dispatch(Actions.setPatientInfo(patient)),\r\n savePatient: (patient: Patient) => dispatch(Actions.updatePatientAsync(patient)),\r\n setPatientData: (patientId?: string) => dispatch(Actions.getPatientInfoByIdAsync(patientId)),\r\n setUserPatientData: (userId?: string) => dispatch(Actions.getPatientInfoByUserIdAsync(userId)),\r\n submitNewPatient: (patient: Patient) => dispatch(Actions.saveNewPatientAsync(patient)),\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { LookUpData, MeshData } from '../../common/models/input-models';\r\nimport { Patient } from '../../common/models/main-models';\r\nimport * as t from './actionTypes';\r\nimport { defaultPatientInfo, State } from './model';\r\n\r\nconst initialState: State = {\r\n patient: defaultPatientInfo,\r\n isLoading: true,\r\n lookUpData: [],\r\n isPatientDataLoaded: true\r\n};\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_LOOKUP_DATA:\r\n return setLookUpData(state, action.payload);\r\n case t.SET_PATIENT_INFO:\r\n return setPatientInfo(state, action.payload);\r\n case t.SET_PATIENTS_LOADING:\r\n return setPatientLoading(state, action.payload);\r\n case t.SET_PATIENT_DATA_LOADING:\r\n return setPatientDataLoading(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst setLookUpData = (state: State, val: LookUpData[]): State => {\r\n let newState = {\r\n ...state,\r\n lookUpData: [...val]\r\n } as State;\r\n\r\n return newState;\r\n};\r\n\r\nconst setPatientInfo = (state: State, val: Patient): State => {\r\n let newState = {\r\n ...state,\r\n patient: {...val}\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setPatientLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n\t\t...state,\r\n isLoading: val\r\n\t} as State;\r\n\r\n\treturn newState;\r\n}\r\n\r\nconst setPatientDataLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isPatientDataLoaded: val\r\n } as State;\r\n\r\n return newState;\r\n}","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","// constants.ts\r\n\r\nexport const NAME = 'homePage';","import { NAME } from \"./constants\";\r\n\r\nexport const SET_HOME_LOADING = `${NAME}/SET_HOME_LOADING`;\r\n\r\nexport const SET_HOME_LOGGED_IN = `${NAME}/SET_HOME_LOGGED_IN`;\r\n\r\nexport const SET_IS_USER_REAL = `${NAME}/SET_IS_USER_REAL`;\r\n\r\nexport const SET_IS_USER_ADMIN = `${NAME}/SET_IS_USER_ADMIN`;","// matching/actions.js\r\n\r\nimport DataSvc from '../../common/services/data-svc';\r\nimport * as t from './actionType';\r\nimport { Res } from '../../common/helpers';\r\n\r\nexport const setHomeLoading = (isLoading: boolean) => ({\r\n type: t.SET_HOME_LOADING,\r\n payload: isLoading,\r\n});\r\n\r\nexport const setHomeLoggedInStatus = (isLoggedIn: boolean) => ({\r\n type: t.SET_HOME_LOGGED_IN,\r\n payload: isLoggedIn\r\n});\r\n\r\nexport const setIsUserReal = (isUserReal: boolean) => ({\r\n type: t.SET_IS_USER_REAL,\r\n payload: isUserReal\r\n});\r\n\r\nexport const verifyUserTokenAsync = (token: string) => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.utilsSvc.verifyUserByRecaptchaToken({ recaptchaToken: token }).then(\r\n (result: any) => {\r\n if (result !== Res.success) {\r\n dispatch(setIsUserReal(false));\r\n }\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n }\r\n}\r\n\r\nexport const setUserStatusAsync = (isUserAdmin: boolean) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setHomeLoading(true));\r\n if (isUserAdmin !== undefined) {\r\n dispatch(setHomeLoggedInStatus(true));\r\n }\r\n else {\r\n dispatch(setHomeLoggedInStatus(false));\r\n }\r\n //isUserAdmin !== undefined ? dispatch(setHomeLoggedInStatus(true)) : dispatch(setHomeLoggedInStatus(false));\r\n dispatch(setHomeLoading(false));\r\n }\r\n}","export default __webpack_public_path__ + \"static/media/net_ball_half.ab9dbdd5.png\";","export default __webpack_public_path__ + \"static/media/net_ball_light.8ca2031d.png\";","import * as React from 'react';\r\nimport { Carousel } from 'react-responsive-carousel';\r\nimport \"../../../../styles/carousel.css\";\r\n\r\ntype OwnProps = {};\r\n\r\nexport type DispatchProps = {};\r\n\r\ntype OwnState = {};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nexport default class Testimonials extends React.Component<Props, OwnState> {\r\n\r\n render() {\r\n const carouselProps = {\r\n autoPlay: true,\r\n interval: 5000,\r\n centerMode: true,\r\n centerSlidePercentage: 100,\r\n infiniteLoop: true,\r\n showStatus: false,\r\n showThumbs: false\r\n }\r\n return (\r\n <>\r\n <section className='testimonials-sec'>\r\n <div className='testimonials-sec-txt'>\r\n <h5 className='testimonials-sec-txt-title mb-4'>What People are Saying</h5>\r\n </div>\r\n <div className='testimonials-sec-content'>\r\n <Carousel {...carouselProps}>\r\n <div className='testimonials-sec-content-card'>\r\n <div className='testimonials-sec-content-card-quotes'></div>\r\n <div className='testimonials-sec-content-card-text'>There's a certain responsibility that comes with being a EUPATI fellow. We need to use what we have learned to make a real difference! EUPATIConnect means that I am working with trusted partners on topics that matter to patients. We learn from each other and make meaningful solutions together.</div>\r\n <div className='testimonials-sec-content-card-profile-image image-joana' />\r\n <div className='testimonials-sec-content-card-profile-name'>Joan Jordan</div>\r\n <div className='testimonials-sec-content-card-profile-title'>EUPATI Patient Expert</div>\r\n </div>\r\n <div className='testimonials-sec-content-card'>\r\n <div className='testimonials-sec-content-card-quotes'></div>\r\n <div className='testimonials-sec-content-card-text'>I had the opportunity to be involved as Patient Advisor in several clinical research projects, especially working on the study protocols and the development of patient relevant material. The involvement of a EUPATI Patient Expert means that any clinical research becomes more focused on the patients’ real needs as well as having the voice of the patient included in all steps.</div>\r\n <div className='testimonials-sec-content-card-profile-image image-paola' />\r\n <div className='testimonials-sec-content-card-profile-name'>Paola Kruger</div>\r\n <div className='testimonials-sec-content-card-profile-title'>EUPATI Patient Expert</div>\r\n </div>\r\n <div className='testimonials-sec-content-card'>\r\n <div className='testimonials-sec-content-card-quotes'></div>\r\n <div className='testimonials-sec-content-card-text'>We received some great insights in interviews with EUPATI fellows. Withing 24 hours of placing a request, we were connected to three patients. All interviews were completed in 2 days and gave us a great understanding of the patient perspective.</div>\r\n <div className='testimonials-sec-content-card-profile-image image-ankita' />\r\n <div className='testimonials-sec-content-card-profile-name'>Dr Ankita Batla</div>\r\n <div className='testimonials-sec-content-card-profile-title'>VMLY&Rx | Chief Medical Office Lead-Health Insights and Patient Partnerships</div>\r\n </div>\r\n <div className='testimonials-sec-content-card'>\r\n <div className='testimonials-sec-content-card-quotes'></div>\r\n <div className='testimonials-sec-content-card-text'>We had a fantastic response following our request for patient review of our informed consent (ICF) template. EUPATI fellows had some hugely valuable feedback which will be used to inform our future ICF template to make it clearer and more user friendly.</div>\r\n <div className='testimonials-sec-content-card-profile-image image-kay' />\r\n <div className='testimonials-sec-content-card-profile-name'>Kay Warner</div>\r\n <div className='testimonials-sec-content-card-profile-title'>GSK</div>\r\n </div>\r\n </Carousel>\r\n </div>\r\n </section>\r\n </>\r\n );\r\n }\r\n}\r\n","export default __webpack_public_path__ + \"static/media/why1.203b1954.png\";","export default __webpack_public_path__ + \"static/media/why2.f9b4b22b.png\";","export default __webpack_public_path__ + \"static/media/why4.de557ce8.png\";","export default __webpack_public_path__ + \"static/media/why5.3a8914dc.png\";","export default __webpack_public_path__ + \"static/media/why6.3431a77d.png\";","export default __webpack_public_path__ + \"static/media/why9.cf5aa1ad.png\";","export const ApplicationName = 'EUPATIConnect';\r\n\r\nexport const QueryParameterNames = {\r\n ReturnUrl: 'returnUrl',\r\n Message: 'message'\r\n};\r\n\r\nexport const LogoutActions = {\r\n LogoutCallback: 'logout-callback',\r\n Logout: 'logout',\r\n LoggedOut: 'logged-out'\r\n};\r\n\r\nexport const LoginActions = {\r\n Login: 'login',\r\n LoginCallback: 'login-callback',\r\n LoginFailed: 'login-failed',\r\n Profile: 'profile',\r\n Register: 'register'\r\n};\r\n\r\nconst prefix = '/authentication';\r\n\r\nexport const ApplicationPaths = {\r\n DefaultLoginRedirectPath: '/',\r\n ApiAuthorizationClientConfigurationUrl: `_configuration/${ApplicationName}`,\r\n ApiAuthorizationPrefix: prefix,\r\n //Login: `${prefix}/${LoginActions.Login}`,\r\n Login: `validate`,\r\n LoginFailed: `${prefix}/${LoginActions.LoginFailed}`,\r\n LoginCallback: `${prefix}/${LoginActions.LoginCallback}`,\r\n Register: `${prefix}/${LoginActions.Register}`,\r\n Profile: `${prefix}/${LoginActions.Profile}`,\r\n LogOut: `${prefix}/${LogoutActions.Logout}`,\r\n LoggedOut: `${prefix}/${LogoutActions.LoggedOut}`,\r\n LogOutCallback: `${prefix}/${LogoutActions.LogoutCallback}`,\r\n IdentityRegisterPath: 'Identity/Account/Register',\r\n IdentityManagePath: 'Identity/Account/Manage/Email'\r\n};\r\n","import { UserManager, WebStorageStateStore } from 'oidc-client';\r\nimport { ApplicationPaths, ApplicationName } from './ApiAuthorizationConstants';\r\n\r\nexport class AuthorizeService {\r\n _callbacks = [];\r\n _nextSubscriptionId = 0;\r\n _user = null;\r\n _isAuthenticated = false;\r\n _timesCalled = 0;\r\n\r\n // By default pop ups are disabled because they don't work properly on Edge.\r\n // If you want to enable pop up authentication simply set this flag to false.\r\n _popUpDisabled = true;\r\n\r\n async isAuthenticated() {\r\n const user = await this.getUser();\r\n return !!user;\r\n }\r\n\r\n async getUser() {\r\n if (this._user && this._user.profile) {\r\n return this._user.profile;\r\n }\r\n\r\n await this.ensureUserManagerInitialized();\r\n let user = await this.userManager.getUser();\r\n\r\n if (!user) {\r\n const that = this;\r\n const promise = new Promise((resolve, reject) => {\r\n setTimeout(function () {\r\n that.userManager.getUser().then(res => {\r\n resolve(res);\r\n });\r\n }, 1312);\r\n });\r\n user = await promise;\r\n }\r\n\r\n return user && user.profile;\r\n }\r\n\r\n async getAccessToken() {\r\n await this.ensureUserManagerInitialized();\r\n const user = await this.userManager.getUser();\r\n return user && user.access_token;\r\n }\r\n\r\n async signInSilent() {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n const silentUser = await this.userManager.signinSilent(this.createArguments());\r\n this.updateState(silentUser);\r\n } catch (silentError) {\r\n console.log(\"Silent authentication error: \", silentError);\r\n }\r\n }\r\n\r\n // We try to authenticate the user in three different ways:\r\n // 1) We try to see if we can authenticate the user silently. This happens\r\n // when the user is already logged in on the IdP and is done using a hidden iframe\r\n // on the client.\r\n // 2) We try to authenticate the user using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 3) If the two methods above fail, we redirect the browser to the IdP to perform a traditional\r\n // redirect flow.\r\n async signIn(state) {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n const silentUser = await this.userManager.signinSilent(this.createArguments());\r\n this.updateState(silentUser);\r\n return this.success(state);\r\n } catch (silentError) {\r\n // User might not be authenticated, fallback to popup authentication\r\n console.log(\"Silent authentication error: \", silentError);\r\n\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error('Popup disabled. Change \\'AuthorizeService.js:AuthorizeService._popupDisabled\\' to false to enable it.')\r\n }\r\n\r\n const popUpUser = await this.userManager.signinPopup(this.createArguments());\r\n this.updateState(popUpUser);\r\n return this.success(state);\r\n } catch (popUpError) {\r\n if (popUpError.message === \"Popup window closed\") {\r\n // The user explicitly cancelled the login action by closing an opened popup.\r\n return this.error(\"The user closed the window.\");\r\n } else if (!this._popUpDisabled) {\r\n console.log(\"Popup authentication error: \", popUpError);\r\n }\r\n\r\n // PopUps might be blocked by the user, fallback to redirect\r\n try {\r\n await this.userManager.signinRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectError) {\r\n console.log(\"Redirect authentication error: \", redirectError);\r\n return this.error(redirectError);\r\n }\r\n }\r\n }\r\n }\r\n\r\n async completeSignIn(url) {\r\n try {\r\n await this.ensureUserManagerInitialized();\r\n const user = await this.userManager.signinCallback(url);\r\n this.updateState(user);\r\n return this.success(user && user.state);\r\n } catch (error) {\r\n console.log('There was an error signing in: ', error);\r\n return this.error('There was an error signing in.');\r\n }\r\n }\r\n\r\n // We try to sign out the user in two different ways:\r\n // 1) We try to do a sign-out using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 2) If the method above fails, we redirect the browser to the IdP to perform a traditional\r\n // post logout redirect flow.\r\n async signOut(state) {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error('Popup disabled. Change \\'AuthorizeService.js:AuthorizeService._popupDisabled\\' to false to enable it.')\r\n }\r\n\r\n await this.userManager.signoutPopup(this.createArguments());\r\n this.updateState(undefined);\r\n return this.success(state);\r\n } catch (popupSignOutError) {\r\n console.log(\"Popup signout error: \", popupSignOutError);\r\n try {\r\n await this.userManager.signoutRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectSignOutError) {\r\n console.log(\"Redirect signout error: \", redirectSignOutError);\r\n return this.error(redirectSignOutError);\r\n }\r\n }\r\n }\r\n\r\n async completeSignOut(url) {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n const response = await this.userManager.signoutCallback(url);\r\n this.updateState(null);\r\n return this.success(response && response.data);\r\n } catch (error) {\r\n console.log(`There was an error trying to log out '${error}'.`);\r\n return this.error(error);\r\n }\r\n }\r\n\r\n updateState(user) {\r\n this._user = user;\r\n this._isAuthenticated = !!this._user;\r\n this.notifySubscribers();\r\n }\r\n\r\n subscribe(callback) {\r\n this._callbacks.push({ callback, subscription: this._nextSubscriptionId++ });\r\n return this._nextSubscriptionId - 1;\r\n }\r\n\r\n unsubscribe(subscriptionId) {\r\n const subscriptionIndex = this._callbacks\r\n .map((element, index) => element.subscription === subscriptionId ? { found: true, index } : { found: false })\r\n .filter(element => element.found === true);\r\n if (subscriptionIndex.length !== 1) {\r\n throw new Error(`Found an invalid number of subscriptions ${subscriptionIndex.length}`);\r\n }\r\n\r\n this._callbacks.splice(subscriptionIndex[0].index, 1);\r\n }\r\n\r\n notifySubscribers() {\r\n for (let i = 0; i < this._callbacks.length; i++) {\r\n const callback = this._callbacks[i].callback;\r\n callback();\r\n }\r\n }\r\n\r\n createArguments(state) {\r\n return { useReplaceToNavigate: true, data: state };\r\n }\r\n\r\n error(message) {\r\n return { status: AuthenticationResultStatus.Fail, message };\r\n }\r\n\r\n success(state) {\r\n return { status: AuthenticationResultStatus.Success, state };\r\n }\r\n\r\n redirect() {\r\n return { status: AuthenticationResultStatus.Redirect };\r\n }\r\n\r\n async ensureUserManagerInitialized() {\r\n if (this.userManager !== undefined) {\r\n return;\r\n }\r\n\r\n let response = await fetch(ApplicationPaths.ApiAuthorizationClientConfigurationUrl);\r\n if (!response.ok) {\r\n throw new Error(`Could not load settings for '${ApplicationName}'`);\r\n }\r\n\r\n let settings = await response.json();\r\n settings.automaticSilentRenew = true;\r\n settings.includeIdTokenInSilentRenew = true;\r\n settings.userStore = new WebStorageStateStore({\r\n prefix: ApplicationName\r\n });\r\n\r\n this.userManager = new UserManager(settings);\r\n\r\n this.userManager.events.addUserSignedOut(async () => {\r\n await this.userManager.removeUser();\r\n this.updateState(undefined);\r\n });\r\n }\r\n\r\n static get instance() { return authService }\r\n}\r\n\r\nconst authService = new AuthorizeService();\r\n\r\nexport default authService;\r\n\r\nexport const AuthenticationResultStatus = {\r\n Redirect: 'redirect',\r\n Success: 'success',\r\n Fail: 'fail'\r\n};\r\n","import React, { useState, FC, useContext } from 'react';\r\nimport authService from '../../api-authorization/AuthorizeService';\r\nimport { Roles } from '../helpers';\r\n\r\ninterface IAuthenticationContext {\r\n isUserAdmin: boolean;\r\n userIdentity: string;\r\n authenticateUser?: () => void;\r\n}\r\n\r\nconst defaultState = {\r\n isUserAdmin: false,\r\n userIdentity: ''\r\n};\r\n\r\nconst AuthenticationContext = React.createContext<IAuthenticationContext>(defaultState);\r\n\r\nexport default AuthenticationContext;\r\n\r\nexport const AuthenticationProvider: FC = ({ children }) => {\r\n const [isUserAdmin, setIsUserAdmin] = useState<any>(undefined);\r\n const [userIdentity, setUserIdentity] = useState<string>('');\r\n\r\n const authenticateUser = () => {\r\n // res.sub ==> current user id\r\n authService.getUser().then(res => {\r\n if (res === undefined || res === null) { return setIsUserAdmin(null); }\r\n switch (res.role.toUpperCase() === Roles.Admin) {\r\n case true:\r\n setIsUserAdmin(true);\r\n setUserIdentity(res.sub);\r\n break;\r\n case false:\r\n setIsUserAdmin(false);\r\n setUserIdentity(res.sub);\r\n break;\r\n }\r\n })\r\n };\r\n\r\n return (\r\n <AuthenticationContext.Provider\r\n value={{\r\n isUserAdmin: isUserAdmin,\r\n userIdentity: userIdentity,\r\n authenticateUser: authenticateUser\r\n }}\r\n >\r\n {children}\r\n </AuthenticationContext.Provider>\r\n );\r\n};\r\n\r\nexport const useAuthenticationContext = () => useContext(AuthenticationContext);","import * as React from 'react';\r\nimport { Button, Card, Form } from 'react-bootstrap';\r\nimport { withRouter } from 'react-router';\r\nimport EupatiLoader from '../../../common/static/loading-animation/loader';\r\nimport { State } from '../model';\r\nimport '../style.scss';\r\nimport researcher from '../../../../images/researcher.png';\r\nimport patient from '../../../../images/patient.png';\r\nimport { GoogleReCaptcha } from 'react-google-recaptcha-v3';\r\nimport { FAIL_AUTH_MSG, ADMIN_ACCESS_DENIED_MSG } from '../../../common/helpers/messages';\r\nimport imgRoadmap from '../../../../images/patient-engagement-tools/roadmap.png';\r\nimport imgGuidances from '../../../../images/patient-engagement-tools/guidances.png';\r\nimport imgParadigmTools from '../../../../images/patient-engagement-tools/paradigm_tools.png';\r\nimport imgEngagementSeparator from '../../../../images/patient-engagement-tools/engagement_separator.png';\r\nimport imgFaqSeparator from '../../../../images/faq/faq_separator.png';\r\nimport imgFaqHowDoesWork from '../../../../images/faq/how_does_work.png';\r\nimport imgFaqWhatIsEupati from '../../../../images/faq/what_is_eupati.png';\r\nimport imgNetBall from '../../../../images/net_ball.png';\r\nimport imgNetBallHalf from '../../../../images/net_ball_half.png';\r\nimport imgNetBallLight from '../../../../images/net_ball_light.png';\r\nimport imgNetBallPartial from '../../../../images/net_ball_partial.png';\r\nimport Testimonials from './testimonials';\r\nimport imgWhy1 from '../../../../images/why-eupati/why1.png';\r\nimport imgWhy2 from '../../../../images/why-eupati/why2.png';\r\nimport imgWhy3 from '../../../../images/why-eupati/why3.png';\r\nimport imgWhy4 from '../../../../images/why-eupati/why4.png';\r\nimport imgWhy5 from '../../../../images/why-eupati/why5.png';\r\nimport imgWhy6 from '../../../../images/why-eupati/why6.png';\r\nimport imgWhy7 from '../../../../images/why-eupati/why7.png';\r\nimport imgWhy8 from '../../../../images/why-eupati/why8.png';\r\nimport imgWhy9 from '../../../../images/why-eupati/why9.png';\r\nimport { toast } from 'react-toastify';\r\nimport AuthenticationContext from '../../../common/static/auth-context';\r\nimport { faCheck } from '@fortawesome/fontawesome-free-solid';\r\nimport TinyMCEditor from '../../../common/static/tinymce-editor';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\n\r\ntype OwnProps = {};\r\n\r\nexport type DispatchProps = {\r\n setIsUserReal: (token: string) => void;\r\n setUserStatus: (isAdmin: boolean) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps;\r\n\r\ntype OwnState = {};\r\n\r\nexport default class ComponentRoot extends React.Component<Props, OwnState> {\r\n static contextType = AuthenticationContext;\r\n componentDidMount() {\r\n if (this.context.isUserAdmin === null || this.context.isUserAdmin === undefined) {\r\n this.context.authenticateUser();\r\n }\r\n this.props.setUserStatus(this.context.isUserAdmin);\r\n }\r\n\r\n returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n render() {\r\n\r\n let mainComponent: any;\r\n let whyComponent: any;\r\n let noteComponent: any;\r\n let statsComponent: any;\r\n let patientEngagementComponent: any;\r\n let testimonialComponent: any;\r\n let faqComponent: any;\r\n\r\n let loadingComponent = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n );\r\n\r\n let PatientBtn = withRouter(({ history }) => (\r\n <Button\r\n variant='primary'\r\n type='submit'\r\n className='card-p-btn'\r\n id='pt-home-btn'\r\n onClick={() => {\r\n if (!this.props.isUserReal) {\r\n toast.error(FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n switch (this.context.isUserAdmin) {\r\n case true:\r\n toast.error(ADMIN_ACCESS_DENIED_MSG);\r\n return history.push('/');\r\n case false:\r\n return history.push({ pathname: '/patient', state: { isUserPatient: (this.context.isUserAdmin !== undefined && this.context.isUserAdmin !== null), userId: this.context.userIdentity } });\r\n default:\r\n window.location.href = \"/validate\";\r\n break;\r\n }\r\n }}\r\n >\r\n View Your Profile\r\n </Button>\r\n ));\r\n\r\n let ResearcherBtn = withRouter(({ history }) => (\r\n <Button\r\n variant='primary'\r\n type='submit'\r\n className='card-r-btn'\r\n id='res-home-btn'\r\n onClick={() => {\r\n if (!this.props.isUserReal) {\r\n toast.error(FAIL_AUTH_MSG);\r\n return history.push('/');\r\n }\r\n\r\n history.push('/pricing');\r\n }}\r\n >\r\n Connect Now\r\n </Button>\r\n ));\r\n\r\n if (this.props.isLoading) {\r\n mainComponent = loadingComponent;\r\n whyComponent = null;\r\n noteComponent = null;\r\n statsComponent = null;\r\n patientEngagementComponent = null;\r\n testimonialComponent = null;\r\n }\r\n else {\r\n mainComponent = (\r\n <>\r\n <GoogleReCaptcha action='homePage' onVerify={token => this.props.setIsUserReal(token)} />\r\n\r\n <section className='upper-sec'>\r\n {/* <img className='upper-sec-img' src={upperSectionBg} /> */}\r\n <div className='upper-sec-txt'>\r\n <h5 className='upper-sec-txt-title mb-4'>EUPATIConnect</h5>\r\n <p className='upper-sec-txt-para'>\r\n Bringing EUPATI Patient Experts and researchers together\r\n </p>\r\n </div>\r\n\r\n </section>\r\n <section className='mid-sec'></section>\r\n <section className='lower-sec'>\r\n <div id='home-cards-container' className='row g-3 justify-content-center'>\r\n <Form.Group className='col-xs-auto mb-3'>\r\n <Card style={{ width: '20rem', boxShadow: 'rgb(0 0 0 / 20%) -4px 4px 8px 0px' }} className='left'>\r\n <div className='card-img'>\r\n <Card.Img variant=\"top\" src={researcher} />\r\n </div>\r\n <Card.Body>\r\n <Card.Title style={{ textAlign: 'center' }}>Researcher</Card.Title>\r\n <Card.Text className='mb-4'>\r\n Would you like to involve a EUPATI Patient Expert in your patient engagement initiative or opportunity?\r\n </Card.Text>\r\n <Form.Group style={{ textAlign: 'center', margin: '0' }}>\r\n <ResearcherBtn />\r\n </Form.Group>\r\n </Card.Body>\r\n </Card>\r\n </Form.Group>\r\n\r\n <Form.Group className='col-xs-auto mb-3'>\r\n <Card style={{ width: '20rem', boxShadow: 'rgb(0 0 0 / 20%) -4px 4px 8px 0px' }}>\r\n <div className='card-img'>\r\n <Card.Img variant=\"top\" src={patient} />\r\n </div>\r\n <Card.Body>\r\n <Card.Title style={{ textAlign: 'center' }}>EUPATI Patient Expert</Card.Title>\r\n <Card.Text className='mb-4'>\r\n Update your profile to share your knowledge and participate in patient engagement opportunities today.\r\n </Card.Text>\r\n <Form.Group style={{ textAlign: 'center', margin: '0 0 2px 0' }}>\r\n <PatientBtn />\r\n </Form.Group>\r\n </Card.Body>\r\n </Card>\r\n </Form.Group>\r\n </div>\r\n </section>\r\n\r\n </>\r\n )\r\n }\r\n\r\n if (!this.props.isLoading) {\r\n whyComponent = (\r\n <>\r\n <section className='why-title-sec'>\r\n <div className='why-title-sec-txt'>\r\n <h5 className='why-title-sec-txt-title mb-4'>Why EUPATIConnect?</h5>\r\n <p className='why-title-sec-txt-para'>\r\n EUPATIConnect is a place where both EUPATI Patient Experts and researchers can connect, to create mutually beneficial opportunities and to enhance the future of patient engagement.\r\n </p>\r\n </div>\r\n </section>\r\n <section className='why-content-sec'>\r\n <div className='why-content-sec-panel panel-right'>\r\n <div className='why-content-sec-panel-image'>\r\n <img className='why-image' src={imgWhy1} />\r\n </div>\r\n <div className='why-content-sec-panel-content'>\r\n <div className='why-content-sec-panel-content-title'>\r\n Large database of EUPATI Fellows\r\n </div>\r\n <div className='why-content-sec-panel-content-description'>\r\n We can connect you with 200+ EUPATI Patient Experts from over 100+ disease areas. We also have over 300+ EUPATI Open Classroom learners who have expertise in 1 or more EUPATI learning modules.\r\n </div>\r\n </div>\r\n </div>\r\n <div id='small-panel' className='why-content-sec-panel panel-left'>\r\n <div className='why-content-sec-panel-content'>\r\n <div className='why-content-sec-panel-content-title'>\r\n International Network <br />of EUPATI Fellows\r\n </div>\r\n <div className='why-content-sec-panel-content-description'>\r\n Our Patient Experts come from over <br />39 number of countries.\r\n </div>\r\n </div>\r\n <div className='why-content-sec-panel-image'>\r\n <img className='why-image' src={imgWhy2} />\r\n </div>\r\n </div>\r\n <div className='why-content-sec-panel panel-right'>\r\n <div className='why-content-sec-panel-image'>\r\n <img className='why-image' src={imgWhy3} />\r\n </div>\r\n <div className='why-content-sec-panel-content'>\r\n <div className='why-content-sec-panel-content-title'>\r\n Proficiency of Language\r\n </div>\r\n <div className='why-content-sec-panel-content-description'>\r\n Fluency in English is a requirement of the EUPATI training programme therefore our patients have a high degree of fluency in English. However, as our Patient Experts hail from all over the world many also have proficiency in a second or third language.\r\n </div>\r\n </div>\r\n </div>\r\n <div className='why-content-sec-panel panel-left'>\r\n <div className='why-content-sec-panel-content'>\r\n <div className='why-content-sec-panel-content-title'>\r\n Scientific and Health Literacy\r\n </div>\r\n <div className='why-content-sec-panel-content-description'>\r\n High level of knowledge of the medicines R&D process coupled with a high level of literacy in health and scientific terms. Our modules include Non-Clinical and Clinical Development, Health Technology Assessment, Regulatory Affairs.\r\n </div>\r\n </div>\r\n <div className='why-content-sec-panel-image'>\r\n <img className='why-image' src={imgWhy4} />\r\n </div>\r\n </div>\r\n <div className='why-content-sec-panel panel-right'>\r\n <div className='why-content-sec-panel-image'>\r\n <img className='why-image' src={imgWhy5} />\r\n </div>\r\n <div className='why-content-sec-panel-content'>\r\n <div className='why-content-sec-panel-content-title'>\r\n Strongly Motivated\r\n </div>\r\n <div className='why-content-sec-panel-content-description'>\r\n Patients Experts come to EUPATI driven internally by their desire to learn and change the future of patient engagement. As a result, they are strongly motivated to partner with researchers and to provide input, advice and feedback on all aspects of the medicines R&D process.\r\n </div>\r\n </div>\r\n </div>\r\n <div className='why-content-sec-panel panel-left'>\r\n <div className='why-content-sec-panel-content'>\r\n <div className='why-content-sec-panel-content-title'>\r\n Changing The Future Landscape of Patient Engagement\r\n </div>\r\n <div className='why-content-sec-panel-content-description'>\r\n Our partners and Patient Experts regularly share their experience of working together on research projects. In turn, these experiences often become case studies within our Patient Expert toolbox, thereby enhancing learning for future generations of Patient Experts to come.\r\n </div>\r\n </div>\r\n <div className='why-content-sec-panel-image'>\r\n <img className='why-image' src={imgWhy6} />\r\n </div>\r\n </div>\r\n <div className='why-content-sec-panel panel-right'>\r\n <div className='why-content-sec-panel-image'>\r\n <img className='why-image' src={imgWhy7} />\r\n </div>\r\n <div className='why-content-sec-panel-content'>\r\n <div className='why-content-sec-panel-content-title'>\r\n Quality of Training\r\n </div>\r\n <div className='why-content-sec-panel-content-description'>\r\n We pride ourselves on the thorough and rigorous training of the EUPATI Programme. All content has been created via a rigorous multistakeholder (patient, academic and industry) process to ensure the highest standard of patient engagement education.\r\n </div>\r\n </div>\r\n </div>\r\n <div className='why-content-sec-panel panel-left'>\r\n <div className='why-content-sec-panel-content'>\r\n <div className='why-content-sec-panel-content-title'>\r\n Opportunity to Share Knowledge\r\n </div>\r\n <div className='why-content-sec-panel-content-description'>\r\n EUPATIConnect provides a unique opportunity for EUPATI Fellows to share their knowledge, advance the patient engagement agenda and demonstrate their availability to be involved in future research opportunities and projects.\r\n </div>\r\n </div>\r\n <div className='why-content-sec-panel-image'>\r\n <img className='why-image' src={imgWhy8} />\r\n </div>\r\n </div>\r\n <div className='why-content-sec-panel panel-right'>\r\n <div className='why-content-sec-panel-image'>\r\n <img className='why-image' src={imgWhy9} />\r\n </div>\r\n <div className='why-content-sec-panel-content'>\r\n <div className='why-content-sec-panel-content-title'>\r\n Building New Connections\r\n </div>\r\n <div className='why-content-sec-panel-content-description'>\r\n EUPATIConnect provides EUPATI Fellows and Open Classroom learners the opportunity to build new connections as part of the large EUPATI Network.\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </>\r\n );\r\n\r\n noteComponent = (\r\n <>\r\n <section className='note-sec'>\r\n <div className='note-sec-txt'>\r\n <h5 className='note-sec-txt-title mb-4'>EUPATI National Platforms with Local Connections</h5>\r\n <p className='note-sec-txt-para'>\r\n EUPATI has National Platforms in over 23 countries a number of which are currently running their own local versions of the course (Ireland, Italy & The Netherlands). Therefore, if you require specific local expertise, we can also connect you with our local ENPs.\r\n </p>\r\n </div>\r\n <img src={imgNetBallPartial} className='net-ball-partial' />\r\n </section>\r\n </>\r\n );\r\n\r\n statsComponent = (\r\n <>\r\n <section className='stats-sec'>\r\n <div className='stats-sec-txt'>\r\n <h5 className='stats-sec-txt-title mb-5'>Statistics</h5>\r\n </div>\r\n <div className='stats-sec-content'>\r\n <div className='stats-sec-content-stat'>\r\n <div className='stats-sec-content-stat-title'>300</div>\r\n <div className='stats-sec-content-stat-content'>hours of online training</div>\r\n </div>\r\n <div className='stats-sec-content-stat'>\r\n <div className='stats-sec-content-stat-title'>8 days</div>\r\n <div className='stats-sec-content-stat-content'>of intensive classroom training</div>\r\n </div>\r\n <div className='stats-sec-content-stat'>\r\n <div className='stats-sec-content-stat-title'>200+</div>\r\n <div className='stats-sec-content-stat-content'>EUPATI Fellows</div>\r\n </div>\r\n <div className='stats-sec-content-stat'>\r\n <div className='stats-sec-content-stat-title'>300+</div>\r\n <div className='stats-sec-content-stat-content'>EUPATI Open Classroom Learners</div>\r\n </div>\r\n <div className='stats-sec-content-stat'>\r\n <div className='stats-sec-content-stat-title'>100+</div>\r\n <div className='stats-sec-content-stat-content'>disease areas</div>\r\n </div>\r\n <div className='stats-sec-content-stat'>\r\n <div className='stats-sec-content-stat-title'>39</div>\r\n <div className='stats-sec-content-stat-content'>number of countries</div>\r\n </div>\r\n <div className='stats-sec-content-stat'>\r\n <div className='stats-sec-content-stat-title'>35</div>\r\n <div className='stats-sec-content-stat-content'>of languages spoken</div>\r\n </div>\r\n </div>\r\n <img src={imgNetBallHalf} className='net-ball-stats-right' />\r\n </section>\r\n </>\r\n );\r\n\r\n patientEngagementComponent = (\r\n <>\r\n <section className='engagement-sec'>\r\n <div className='engagement-sec-separator'>\r\n <img src={imgEngagementSeparator} />\r\n </div>\r\n <div className='engagement-sec-txt'>\r\n <h5 className='engagement-sec-txt-title mb-4'>Patient Engagement Tools</h5>\r\n <p className='engagement-sec-txt-para'>\r\n Looking for further information on how to engage patients in your project? Check out our patient engagement tools below\r\n </p>\r\n </div>\r\n <div className='engagement-sec-content'>\r\n <a href='https://toolbox.eupati.eu/resources-guidance/patient-engagement-roadmap/' target='_blank'>\r\n <div className='engagement-sec-content-card'>\r\n <img src={imgRoadmap} />\r\n <div className='engagement-sec-content-card-name'>Patient Engagement Roadmap</div>\r\n </div>\r\n </a>\r\n {/* <a href='https://toolbox.eupati.eu/guidance/' target='_blank'> */}\r\n <div className='engagement-sec-content-double-card'>\r\n <div className='engagement-sec-content-double-card-title'><img src={imgGuidances} /> Guidances</div>\r\n <ul>\r\n <li><FontAwesomeIcon icon={this.returnProperIconType(faCheck)} /><div className='engagement-sec-content-double-card-item'><a href='https://toolbox.eupati.eu/guidance/' target='_blank'>EUPATI Patient Engagement Guidances</a></div></li>\r\n <li><FontAwesomeIcon icon={this.returnProperIconType(faCheck)} /><div className='engagement-sec-content-double-card-item'><a href='https://imi-paradigm.eu/petoolbox/' target='_blank'>PARADIGM Tools</a></div></li>\r\n <li><FontAwesomeIcon icon={this.returnProperIconType(faCheck)} /><div className='engagement-sec-content-double-card-item'><a href='https://pemsuite.org/legal-and-contractual-tools/' target='_blank'>PFMD Legal and Contracting Tools</a></div></li>\r\n <li><FontAwesomeIcon icon={this.returnProperIconType(faCheck)} /><div className='engagement-sec-content-double-card-item'><a href='https://pemsuite.org/fmv/' target='_blank'>PFMD Remuneration and Fair Market Value tools</a></div></li>\r\n </ul>\r\n </div>\r\n {/* </a> */}\r\n {/* <a href='https://imi-paradigm.eu/' target='_blank'>\r\n <div className='engagement-sec-content-card'>\r\n <img src={imgParadigmTools} />\r\n <div className='engagement-sec-content-card-name'>Paradigm Tools</div>\r\n </div>\r\n </a> */}\r\n </div>\r\n <img src={imgNetBallLight} className='net-ball-stats-left' />\r\n </section>\r\n </>\r\n );\r\n\r\n testimonialComponent = <Testimonials />;\r\n\r\n faqComponent = (\r\n <>\r\n <section className='faq-sec'>\r\n <div className='faq-sec-separator'>\r\n <img src={imgFaqSeparator} />\r\n </div>\r\n <div className='faq-sec-txt'>\r\n <h5 className='faq-sec-txt-title mb-4'>FAQ</h5>\r\n {/* <p className='faq-sec-txt-para'>\r\n Looking for further information on how to engage patients in your project? Check out our patient engagement tools below\r\n </p> */}\r\n </div>\r\n <div className='faq-sec-content'>\r\n {/* <a href='/faq'>\r\n <div className='faq-sec-content-card'>\r\n <img src={imgFaqWhatIsEupati} />\r\n <div className='faq-sec-content-card-name'>What is EUPATIConnect?</div>\r\n </div>\r\n </a> */}\r\n <a href='/faq'>\r\n <div className='faq-sec-content-card'>\r\n <img src={imgFaqHowDoesWork} />\r\n <div className='faq-sec-content-card-name'>\r\n <span className='faq-sec-content-card-text'>What is EUPATIConnect?<br />How does it work?</span>\r\n </div>\r\n </div>\r\n </a>\r\n </div>\r\n <div className='faq-sec-txt'>\r\n <p className='faq-sec-txt-link'>\r\n <a href='/faq'>Check our FAQ page</a>\r\n </p>\r\n </div>\r\n </section >\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {mainComponent}\r\n {whyComponent}\r\n {noteComponent}\r\n {statsComponent}\r\n {patientEngagementComponent}\r\n {testimonialComponent}\r\n {faqComponent}\r\n </>\r\n );\r\n }\r\n}","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAtjSURBVHgB7Z0JVFTXGcf/w4DsmxsuoIOKomgQNbjrgNqodUENpsbaYGpONLYn2lNNl+REmx5TazSxnpoeTaq29SStMWISgSQqqBiJkACyGUR4AygoshREZL357psZHUaWGebNMCw/z3VmmJk37/3nu9/33e+++0aGToQx5kE3SmoKaoGaW4XmaYXeyyuoCTq3Kmpx1FJkMlkFOgkZLIiOYHOpheFJkTqKALWYp/ltZwpqFkg4JbVT1MqZZThCLQxdGW5t1N60oGgtkUctgpoCXQVmHcLpk0ftTVg7TP1t5zHrJY9aBKwN2ikFtVjWdeD+WAFrgHbkVWZd3dVQ+D5HoLNgal/3Luv6vAsT6FAeyNTmf4raRHQPUqitoPxRgJEYLaBGvFhIlwRbCwK1EGNFNErAbiyeFgFGimiwgD1APC0CjBDRIAF7kHhaBBgooqECJqP7BAxD4YElpL3ChA3aQRPme5p4HH7M7Q7/2rRApk40j6Bns5Ws8L3WnmxVQI3f413XAz0b3oWDWvOHbXVh3nV7ungcrkGrvbBFATVdt2sXJKVFyVoZN7fYhenFeeg5KYuhCFB35WZR+QkLZOrCowK96KOgtkX/j80ssAcmzMbCrc9X1wr1LVCJXvHaggeUZlaob4EW9321tfW4ei0XNwtKwJqajHqv3FaOkT4DEDRuOJwc7WEhKsgCPbUPHgnI1NOAp2BB7lfX4NB/LyA6PhPjR/vA3t7WqPfXPqxDdm4RFs4ej5eemwsHeztYCD7Ei2v2F6aeS7Uon0QnsmUb/8ZKy6tYR6morGaLNuxj0RevMQvyyNBsNeLxvh0BC0KfiaQMActCA+Hp7oyvL2fgaroAuY0MzKAN0GDV3weL5kxAyNSx+C4tlyxxAiwEzws9eDDRBhElLA0J+IC6oLubM5rI90WeT0FqZj7qySca0jJybiPybLL43qED3dDUaJz/NBHtKSrQOp3l6ARk9M+uj9pvyeVyrFwQhOd+OhX0zbb73jMX0hBzMVW0RBtxSxY9zYejpBZpUQvk3VbbROiYWdPjDsutyeAmbkdn2+oP0Nm+QY7AFESjs9X4PwXMSGNjI5Kz8nFDdffRcdFhUupyD1PGP9C8pglnr1xHeeUDgyww82Yx6hsed9vrwh18HJWo8+XIoBjSF1MmKGBna1x0NxB+MoEH37LZi6UxF6/h0InLGDtyMGzlGqMnjSYHDCcBFbCxsUHYvEBcSRVQXl1v0DYHDvDE0+N9xPeOoe1mkoDpObfUXxBtu76+ERTl8bPFwVi5cIoYnMyAUkYq7oABlVdT+O2eT+Dn7YkN4UrYyJsPfgyxNsNo3qW5RX985lskZqjw123hsLczixVu5UejgJlpIj/n6uwkjhy4YLpNOppv15Y+y2ugJyXrteaM0IFcwOGwADKLB0mK7DZymBkFt2uzV525Bapu3UNyeh6khg/f/Ed5i4GqioaGHG59rs6OYkARozXMhiigAmZmgt9gxCf+gMKiMpiGDE1cDk2g4D7P080JO7esxMHj53H2ajYcKa+sb2jAh2+tg4+XO+YFjzGX/xOxiAXOmDgCfWxt0Nhkmi+yt7PDvGn+cHJyQEnp/+FB4jlSFUZOkTg7vwQvh89CoP8w/H7fp7hXVgU/38EYOWygeN+WPr+fpyskRmG+r0aHI5FXkJ59i0pP/U3qTo59bDE9aAQybt7G24djMHGMN361NhTFJRW4facCgwd4wKuvC4aT5Z27kkVC2yOXhD1wPBbODnbYs301BvRzg5TwNMbsKftvdp/AZP8heHZhMEyCIlFC8g3sO3YOb2xajPjvcnCJmotjHyyYOQ5hCybBhazz2vV8HP88AbmUqPOh4osrZtD9EqRkFWD39nDyjw6QCotYIEcms6F6n+n1ugdUSLC3kyPAzxtPUXed8/QYDBvcl7qny6O0iP/df8QQGuncJcuzhw+NSNypaBsVnw5IbC9cQAFdqIw/b/o4srBC7P4gBn/cuBiTAtRZWD5F+cybRXhYW4eB/d0QPGEkjXyGiM/lkfX9hV6/Y9NSuLo4QkIqLGaBUmFHKUrAqMH44kI66uoaaWgoR2xCFv59OoGCiiMqaSydc6sUp/++mR47i+/hwYsXLfx8B0JiBJ5ICzAzPA80tdrEKzA8WCRnqnDyq2SsotKXMwWJgqJSvHPkazy/ZCp+uWommuhztq1fIIpH1WoaEzdgqJcnFEP74/hnCbipuoOq+zWQCNECVTAzUgxCvryUjsMnLsHFxQmjKZrPmjJaFDX6Uhp+viSY/J43tu85gZlBo/AMVamvfJ+D/f86hy0vhGJakB9+sXwaDp+MR2xiDvq6O+HA62vEQoSJCFxAfh7cCzAjTRKU5wpLKhH8lC82rw0hy3OADQWMOqq4ZKvuYWP4bHFaYOGsAERfTIevdz98eCIeDpT2cP83deIoTAxQYP8YH6RlF+JP/4gSxZdAQJVFurBcbroN2tLB8lQkITWXZuKKxb/xCpWbUx+UVdxHHxptrFk6narak7Dv6Fm89tIijPIdBAdKcTgPamqRlK4SU5nGhkbxC5CAOG6BcTAzmpGXScyZMormkB/iYlIOiu+W43WKwNU0p6KigKGbHC8OCURwoC/yadiYTf5u7dJpYmnrZEwS4pJuwJ9EfXn1bCqrSVJoSLHlM0uUSwswYyrDd1U70O8ofEg2clioGJC+z8ij4FFGRdp4cR5lBD2XRcXUonuVcHd1gkD5338+/xbrKYH2pYn3wuIyRJ5LwZ5tz2LEcC9IhMC106YxfKHyqzATIcF+eO/YWfHsA+6/OgIfPawLm4F+Hi5i9N1FfuzFVbOwJHQiomJT8VHUVQowzqijQsKgvq7Y+1o4iadOW6qoJlhV/RBurpLmgHH8P7FnMTOflcD9T9r1AqTeKEIDlZ06gjslwEvmjhe75tuHorBu2TTMnxmADBpj//ngGWyJmE9dd4QYHPgciA05yBpKqnneyLswj8jVtB9vvLJEqjkSvrIpUrzH1OverH7BYFZOIVu37TA7GZMoPk7JVLHVvz7IzpxPZrmqO4ySZZGah7Xsq8vpbPvu/7E9H0Sz8or7LPNGIVuwfq94JoNEiFUs3XNjuAVa7VmpOUIx3nr/C6x6ZrJ4NkJKRj7e/ygW65bPEIPJschvsGvrSgwf2k+sDSZnFmARWWxWThHulFbibmkVNj+vxDyyWgk4Sta3nt/RteX9sGIB4xKzMZYKBFy8gttleOefXyKCgoSS6oP1lJZ8FncNd8sq4TXAHUkk3h82/ATjRvuI7iOGigjOVMgInTEOEnFae0f/9LZyWOmJ5Wk/FGAX+b7Qqf44900WjTDmU4I88lEF5nd7T1IhoR7egzwRQ6OWTw+8AjdpCwdaePT11T7QT8X3w0oZTfnbxtVzqVhQg01rlOLoQndWb/WiKfCiKkw9Ban1K2dKWvPTY6fuA30L5NbHZ356lze0jAC9NXTNLFBz7q/VWqEVcEx/wc0TIyyNFfIVSgr0oksz36fliXKExgp3ohd9WtSkrbVyfLmDEr1wIsmwVrT0RO9iw/bp2GJDzRt6u7J6uavQ2pNtlmQ162R7clTeTxocbesF7dY5NVGZ+8Met+SfxAtq70XtTgpoojJ3oAJ6DgLUx9wuvZc9eRIBUl/2REsPEFGAuS68o6UbiyigA5d+MnpiVPMBIVDPJ3cXtNeIEWAkHZpZ5h+kiVDdIcXhx9Ah8SSBqS/72VUvwLgF1gBTXwL0FOs6xDJrvLIv670IrTTQTu5g1iUk7658n7pOYYSpu3VnW2TXE64l6ADCqB1lloGLxv2xEhbAoguw2OMfI+Dzz3Mh7Y8RiD9EAAv/GEEnrGB7jEZQXuVRQr1mTwF1AVd7q4ugc8tbqua2U3+94Ue4MYz6T2OTcQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport * as Actions from '../actions';\r\nimport { State } from '../model';\r\nimport { connect } from 'react-redux';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n setIsUserReal: (token: string) => dispatch(Actions.verifyUserTokenAsync(token)),\r\n setUserStatus: (isAdmin: boolean) => dispatch(Actions.setUserStatusAsync(isAdmin))\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { State } from './model';\r\nimport * as t from './actionType'\r\n\r\nconst initialState: State = {\r\n isLoading: false,\r\n isLoggedIn: false,\r\n isUserReal: true\r\n};\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_HOME_LOADING:\r\n return setHomeLoading(state, action.payload);\r\n case t.SET_HOME_LOGGED_IN:\r\n return setHomeLoggedInStatus(state, action.payload);\r\n case t.SET_IS_USER_REAL:\r\n return setIsUserReal(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst setHomeLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setHomeLoggedInStatus = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isLoggedIn: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setIsUserReal = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isUserReal: val\r\n } as State;\r\n\r\n return newState;\r\n}","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","// constants.ts\r\n\r\nexport const NAME = 'allProjects';","import { NAME } from \"./constants\";\r\n\r\nexport const SET_LOOKUP_DATA = `${NAME}/SET_LOOKUP_DATA`;\r\n\r\nexport const SET_LOADING = `${NAME}/SET_LOADING`;\r\n\r\nexport const SET_PROJECTS = `${NAME}/SET_PROJECTS`;\r\n\r\nexport const SET_PROJECTS_LOADING = `${NAME}/SET_PROJECTS_LOADING`;\r\n\r\nexport const SET_PROJECTS_FILTER = `${NAME}/SET_PROJECTS_FILTER`;\r\n\r\nexport const SET_MATCHED_PATIENTS = `${NAME}/SET_MATCHED_PATIENTS`;\r\n\r\nexport const SET_MATCHED_PATIENTS_LOADING = `${NAME}/SET_MATCHED_PATIENTS_LOADING`;\r\n\r\nexport const SET_PROJECT_DATA = `${NAME}/SET_PROJECT_DATA`;\r\n\r\nexport const SET_PROJECT_LOADING = `${NAME}/SET_PROJECT_LOADING`;\r\n\r\nexport const SET_TEMPLATES_LOADING = `${NAME}/SET_TEMPLATES_LOADING`;\r\n\r\nexport const SET_EMAIL_TEMPLATES = `${NAME}/SET_EMAIL_TEMPLATES`;\r\n\r\nexport const SET_SINGLE_EMAIL_TEMPLATE = `${NAME}/SET_SINGLE_EMAIL_TEMPLATE`;","// model.js\r\n// This is the model of our module state (e.g. return type of the reducer)\r\n\r\nimport { EmailTemplateData, LookUpData } from \"../../../common/models/input-models\";\r\nimport { Patient, Project } from \"../../../common/models/main-models\";\r\n\r\nexport type State = {\r\n isLoading: boolean;\r\n lookUpData: LookUpData[];\r\n isProjectsLoading: boolean;\r\n projects: Project[];\r\n filter: number;\r\n matchedPatients: Patient[];\r\n isMatchedPatientsLoading: boolean;\r\n project: Project;\r\n isProjectLoading: boolean;\r\n emailTemplates: EmailTemplateData[];\r\n singleEmailTemplate: EmailTemplateData;\r\n emailTemplateLoading: boolean;\r\n};\r\n\r\nexport const defaultEmailTemplate = {\r\n id: '',\r\n name: '',\r\n subject: '',\r\n actions: [],\r\n htmlContent: ''\r\n} as EmailTemplateData;","import { ProjectStatus } from \"../../../common/helpers\";\r\nimport { EmailTemplateData, LookUpData, PatientSearchData, ProjectPatientData, ProjectStatusData, RequestData } from \"../../../common/models/input-models\";\r\nimport { Patient, Project } from \"../../../common/models/main-models\";\r\nimport DataSvc from \"../../../common/services/data-svc\";\r\nimport * as t from './actionTypes';\r\nimport { defaultEmailTemplate } from \"./model\";\r\n\r\nexport const setLoading = (isLoading: boolean) => ({\r\n type: t.SET_LOADING,\r\n payload: isLoading\r\n});\r\n\r\nexport const setLookUpData = (data: LookUpData[]) => ({\r\n type: t.SET_LOOKUP_DATA,\r\n payload: data\r\n});\r\n\r\nexport const setProjects = (projects: Project[]) => ({\r\n type: t.SET_PROJECTS,\r\n payload: [...projects]\r\n});\r\n\r\nexport const setIsProjectsLoading = (isProjectsLoading: boolean) => ({\r\n type: t.SET_PROJECTS_LOADING,\r\n payload: isProjectsLoading\r\n});\r\n\r\nexport const setProjectsFilter = (filter: number) => ({\r\n type: t.SET_PROJECTS_FILTER,\r\n payload: filter\r\n});\r\n\r\nexport const setMatchedPatients = (matchedPatients: Patient[]) => ({\r\n type: t.SET_MATCHED_PATIENTS,\r\n payload: [...matchedPatients]\r\n});\r\n\r\nexport const setMatchedPatientsLoading = (isMatchedPatientsLoading: boolean) => ({\r\n type: t.SET_MATCHED_PATIENTS_LOADING,\r\n payload: isMatchedPatientsLoading\r\n});\r\n\r\nexport const setProjectData = (project: Project) => ({\r\n type: t.SET_PROJECT_DATA,\r\n payload: project\r\n});\r\n\r\nexport const setProjectLoading = (isProjectsLoading: boolean) => ({\r\n type: t.SET_PROJECT_LOADING,\r\n payload: isProjectsLoading\r\n});\r\n\r\nexport const setEmailTemplates = (emailTemplates: EmailTemplateData[]) => ({\r\n type: t.SET_EMAIL_TEMPLATES,\r\n payload: [...emailTemplates]\r\n});\r\n\r\nexport const setSingleEmailTemplate = (singleEmailTemplate: EmailTemplateData) => ({\r\n type: t.SET_SINGLE_EMAIL_TEMPLATE,\r\n payload: { ...singleEmailTemplate }\r\n});\r\n\r\nexport const setEmailTemplateLoading = (emailTemplateLoading: boolean) => ({\r\n type: t.SET_TEMPLATES_LOADING,\r\n payload: emailTemplateLoading\r\n});\r\n\r\nexport const getLookUpDataAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setLoading(true));\r\n DataSvc.utilsSvc.getLookUpData().then(\r\n (result: any) => {\r\n dispatch(setLookUpData(result));\r\n dispatch(setLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n };\r\n};\r\n\r\nexport const getAllFilteredProjectsAsync = (condition: number) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsProjectsLoading(true));\r\n DataSvc.projectsSvc.getAllProjects().then(\r\n (result: any) => {\r\n var projects = [];\r\n if (condition > 0) {\r\n projects = [...result.filter((x: any) => {\r\n return x.projectStatusId == condition;\r\n })];\r\n } else {\r\n projects = result;\r\n }\r\n dispatch(setProjects(projects));\r\n dispatch(setIsProjectsLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const updateSearchPatients = (searchData?: PatientSearchData, projectName?: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setMatchedPatientsLoading(true));\r\n DataSvc.patientSvc.searchPatients(searchData).then(\r\n (result: any) => {\r\n if (typeof result !== 'undefined' && typeof projectName !== 'undefined') {\r\n dispatch(setMatchedPatients([...result.filter((pt: Patient) =>\r\n !pt.matchedProjects.some((x: any) => x.name.toLowerCase() === projectName.toLowerCase()) &&\r\n !pt.confirmedProjects.some((x: any) => x.name.toLowerCase() === projectName.toLowerCase()))])\r\n );\r\n }\r\n dispatch(setMatchedPatientsLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const getProjectDataByIdAsync = (projectId: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setProjectLoading(true));\r\n DataSvc.projectsSvc.getProjectById(projectId).then(\r\n (result: any) => {\r\n if (typeof result !== 'undefined') { dispatch(setProjectData(result)); }\r\n dispatch(setProjectLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const removePatientFromProjectAsync = (inputModel: ProjectPatientData) => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.projectsSvc.removePatientFromProject(inputModel).then(\r\n () => {\r\n dispatch(getProjectDataByIdAsync(inputModel.projectId));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const addPatientToProjectAsync = (inputModel: ProjectPatientData, searchData?: PatientSearchData, projectName?: string) => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.projectsSvc.assignPatientToProject(inputModel).then(\r\n () => {\r\n dispatch(updateSearchPatients(searchData, projectName));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const changePatientStatusToConfirmAsync = (inputModel: ProjectPatientData) => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.projectsSvc.changePatientStatusToConfirm(inputModel).then(\r\n () => {\r\n dispatch(getProjectDataByIdAsync(inputModel.projectId));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const changeProjectStatusAsync = (id: string, filter: number) => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.projectsSvc.getProjectById(id).then(\r\n (result: any) => {\r\n const inputModel = {\r\n projectId: result.id,\r\n statusId: filter //=== ProjectStatus.archivedStatusID ? ProjectStatus.inProgressStatusID.toString() : ProjectStatus.archivedStatusID\r\n } as ProjectStatusData;\r\n DataSvc.projectsSvc.changeProjectStatus(inputModel).then(\r\n () => {\r\n dispatch(getAllFilteredProjectsAsync(result.projectStatusId));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n }\r\n}\r\n\r\nexport const submitEmailDataAsync = (data: RequestData) => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.utilsSvc.sendEmail(data).catch(error => console.error(error));\r\n }\r\n}\r\n\r\nexport const getAllEmailTemplatesAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.utilsSvc.getAllEmailTemplates().then(\r\n (result: any) => {\r\n dispatch(setEmailTemplates(result));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const getEmailTemplateByNameAsync = (name: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setEmailTemplateLoading(true));\r\n switch (name) {\r\n case 'empty':\r\n dispatch(setSingleEmailTemplate(defaultEmailTemplate));\r\n dispatch(setEmailTemplateLoading(false));\r\n break;\r\n default:\r\n DataSvc.utilsSvc.getEmailTemplateByName(name).then(\r\n (result: any) => {\r\n dispatch(setSingleEmailTemplate(result));\r\n dispatch(setEmailTemplateLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n }\r\n }\r\n}","import React, { useState } from 'react';\r\nimport { Button, Form } from 'react-bootstrap';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faArrowLeft } from '@fortawesome/fontawesome-free-solid';\r\nimport './static.scss';\r\nimport { ProjectPatientData } from '../models/input-models';\r\nimport DataSvc from '../services/data-svc';\r\nimport { toast } from 'react-toastify';\r\nimport { DEL_PT_FROM_PROJ_MSG, ADD_PT_TO_PROJ_MSG } from '../helpers/messages';\r\n\r\ntype OwnProps = {\r\n leftArrowText: string,\r\n displayStylesProp: string,\r\n isForwardArrowAvail: boolean\r\n patientId?: string,\r\n projectId?: string,\r\n rightArrowText?: string,\r\n forwardBtnHandler?: Function,\r\n}\r\n\r\ntype DispatchProps = {\r\n backBtnHandler: () => void;\r\n}\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function EupatiArrowsMenu(props: Props) {\r\n\r\n const [isBtnDisabled, setIsBtnDisabled] = useState<boolean>(false);\r\n const [btnCursorProps, setBtnCursorProps] = useState<string>('');\r\n\r\n function returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n function removePatientFromProject(inputModel: any) {\r\n DataSvc.projectsSvc.removePatientFromProject(inputModel).then(\r\n (result: any) => {\r\n setIsBtnDisabled(true);\r\n setBtnCursorProps('not-allowed');\r\n toast.success(DEL_PT_FROM_PROJ_MSG);\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n\r\n function assignPatientFromProject(inputModel: any) {\r\n DataSvc.projectsSvc.assignPatientToProject(inputModel).then(\r\n (result: any) => {\r\n setIsBtnDisabled(true);\r\n setBtnCursorProps('not-allowed');\r\n toast.success(ADD_PT_TO_PROJ_MSG);\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n\r\n function rightArrowBtn() {\r\n let inputModel = {\r\n projectId: props.projectId,\r\n patientId: props.patientId\r\n } as ProjectPatientData;\r\n\r\n if (typeof inputModel.projectId === 'undefined' &&\r\n typeof inputModel.patientId === 'undefined') {\r\n if (props.forwardBtnHandler) { props.forwardBtnHandler(); } // redirect to manual search\r\n }\r\n else {\r\n if (props?.rightArrowText?.toLowerCase().includes('remove')) {\r\n removePatientFromProject(inputModel);\r\n } else if (props?.rightArrowText?.toLowerCase().includes('assign')) {\r\n assignPatientFromProject(inputModel);\r\n } else if (props?.rightArrowText?.toLowerCase().includes('edit')) {\r\n //TODO: edit patient info...\r\n if (props.forwardBtnHandler) { props?.forwardBtnHandler(); }\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <Form.Group className='arrows-menu' style={{ display: `${props.displayStylesProp}` }}>\r\n <Form.Group className='left-arrow-container' onClick={props.backBtnHandler}>\r\n <FontAwesomeIcon\r\n icon={returnProperIconType(faArrowLeft)}\r\n className='left-arrow-container-icon'\r\n />\r\n <span className='left-arrow-container-text'>{props.leftArrowText.toUpperCase()}</span>\r\n </Form.Group>\r\n <Form.Group className='right-arrow-container' style={!props.isForwardArrowAvail ? { visibility: 'hidden' } : { visibility: 'visible' }} onClick={rightArrowBtn}>\r\n <Button style={{ cursor: btnCursorProps }} disabled={isBtnDisabled} variant='warning' className='right-arrow-container-btn'>{props?.rightArrowText?.toUpperCase()}</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n );\r\n}\r\n","import { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport * as React from 'react';\r\nimport { Table } from 'react-bootstrap';\r\nimport { LookUpData } from '../models/input-models';\r\nimport { Patient } from '../models/main-models';\r\nimport EupatiArrowsMenu from './arrows-menu';\r\n\r\ntype OwnProps = {\r\n patientInfo: Patient;\r\n lookUpData: LookUpData[];\r\n leftArrowText: string;\r\n rightArrowText?: string;\r\n isForwardArrowAvail: boolean;\r\n searchData?: any;\r\n projectName?: string;\r\n projectId?: string;\r\n forwardBtnHandler?: Function;\r\n};\r\n\r\nexport type DispatchProps = {\r\n backBtnHandler: () => void;\r\n};\r\n\r\ntype OwnState = {\r\n backBtnClicked: boolean;\r\n};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nexport default class EupatiPatientDetails extends React.Component<Props, OwnState> {\r\n\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n backBtnClicked: false\r\n }\r\n\r\n this.returnValueById = this.returnValueById.bind(this);\r\n this.returnJoinedArrayValues = this.returnJoinedArrayValues.bind(this);\r\n this.returnProperIconType = this.returnProperIconType.bind(this);\r\n this.toggleField = this.toggleField.bind(this);\r\n }\r\n\r\n returnValueById(propName: string, projectPropId: any) {\r\n let propType = this.props.lookUpData?.find(x => x.name == propName); // projectType\r\n\r\n let propValue = propType?.data.find(x => x.id == projectPropId);\r\n\r\n return propValue?.name;\r\n }\r\n\r\n returnJoinedArrayValues(fieldProps: any, lookUpDataType: any) {\r\n let arr = fieldProps?.map((x: any, i: any) => {\r\n return (\r\n this.returnValueById(lookUpDataType, x)\r\n )\r\n });\r\n\r\n return arr?.join(', ');\r\n }\r\n\r\n returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n toggleField(val: string) {\r\n return val !== null && val !== '' ? true : false;\r\n }\r\n\r\n render() {\r\n\r\n let mainComponent = (\r\n <>\r\n <tbody>\r\n <tr>\r\n <th style={{ textAlign: 'center' }}>Patient information</th>\r\n </tr>\r\n <tr>\r\n <td>First name</td>\r\n <td>{this.props.patientInfo.firstName}</td>\r\n </tr>\r\n <tr>\r\n <td>Last name</td>\r\n <td>{this.props.patientInfo.lastName}</td>\r\n </tr>\r\n <tr>\r\n <td>Phone number</td>\r\n <td>{this.props.patientInfo.phoneNumber}</td>\r\n </tr>\r\n <tr>\r\n <td>Email</td>\r\n <td>{this.props.patientInfo.email}</td>\r\n </tr>\r\n <tr>\r\n <td>Birth year</td>\r\n <td>{this.props.patientInfo.birthYear}</td>\r\n </tr>\r\n <tr>\r\n <td>Gender</td>\r\n <td>{this.returnValueById('genderType', this.props.patientInfo.genderTypeId)}</td>\r\n </tr>\r\n {this.toggleField(this.props?.patientInfo?.genderTypeDescription) &&\r\n <tr>\r\n <td>Gender description</td>\r\n <td>{this.props?.patientInfo?.genderTypeDescription}</td>\r\n </tr>\r\n }\r\n <tr>\r\n <td>Country</td>\r\n <td>{this.returnValueById('country', this.props.patientInfo.countryId)}</td>\r\n </tr>\r\n <tr>\r\n <td>Languages</td>\r\n <td>{this.returnJoinedArrayValues(this.props.patientInfo?.languages, 'language')}</td>\r\n </tr>\r\n <tr>\r\n <td>Countries with experience</td>\r\n <td>{this.returnJoinedArrayValues(this.props.patientInfo?.countriesWithExperience, 'countryWithContinents')}</td>\r\n </tr>\r\n <tr>\r\n <td>Is patient org affiliated</td>\r\n <td>{this.props.patientInfo.isPOAffiliated ? \"Yes\" : \"No\"}</td>\r\n </tr>\r\n {this.props.patientInfo.isPOAffiliated &&\r\n <tr>\r\n <td>Patient organisation</td>\r\n <td>{this.props.patientInfo.patientOrganisation}</td>\r\n </tr>\r\n }\r\n <tr>\r\n <td>Disease experience</td>\r\n <td>{this.props.patientInfo.noDiseaseExpertise ? \"No specific disease experience\" : this.props.patientInfo.diseases.map(d => d.name).join(\", \")}</td>\r\n </tr>\r\n <tr>\r\n <td>Patient experience</td>\r\n <td>{this.returnValueById('patientExperiense', this.props.patientInfo?.patientExperienceId)}</td>\r\n </tr>\r\n <tr>\r\n <td>Patient expertise</td>\r\n <td>{this.returnJoinedArrayValues(this.props.patientInfo?.patientExpertises, 'expertise')}</td>\r\n </tr>\r\n {this.toggleField(this.props?.patientInfo?.patientExpertiseDescription) &&\r\n <tr>\r\n <td>Patient expertise description</td>\r\n <td>{this.props?.patientInfo?.patientExpertiseDescription}</td>\r\n </tr>\r\n }\r\n <tr>\r\n <td>Project type experiences</td>\r\n <td>{this.returnJoinedArrayValues(this.props.patientInfo?.projectTypeExperiences, 'projectType')}</td>\r\n </tr>\r\n {this.toggleField(this.props?.patientInfo?.projectTypeExperiencesDescription) &&\r\n <tr>\r\n <td>Project type experience description</td>\r\n <td>{this.props?.patientInfo?.projectTypeExperiencesDescription}</td>\r\n </tr>\r\n }\r\n <tr>\r\n <td>Is eligible for compensations</td>\r\n <td>{this.props.patientInfo.isEligibleForCompensation ? \"Yes\" : \"No\"}</td>\r\n </tr>\r\n <tr>\r\n <td>Is available for voluntary work</td>\r\n <td>{this.props.patientInfo.isAvailableForNoCompensation ? \"Yes\" : \"No\"}</td>\r\n </tr>\r\n <tr>\r\n <td>Project preferences</td>\r\n <td>{this.returnJoinedArrayValues(this.props.patientInfo?.projectPreferences, 'projectType')}</td>\r\n </tr>\r\n {this.toggleField(this.props?.patientInfo?.projectPreferenceDescription) &&\r\n <tr>\r\n <td>Project preferences description</td>\r\n <td>{this.props?.patientInfo?.projectPreferenceDescription}</td>\r\n </tr>\r\n }\r\n <tr>\r\n <td>Organisation preferences</td>\r\n <td>{this.returnJoinedArrayValues(this.props.patientInfo?.organisationPreferences, 'organisationType')}</td>\r\n </tr>\r\n {this.toggleField(this.props?.patientInfo?.organisationPreferenceDescription) &&\r\n <tr>\r\n <td>Organisation preference description</td>\r\n <td>{this.props?.patientInfo?.organisationPreferenceDescription}</td>\r\n </tr>\r\n }\r\n <tr>\r\n <td>Activity preference</td>\r\n <td>{this.returnValueById('activityType', this.props.patientInfo?.activityPreferenceId)}</td>\r\n </tr>\r\n <tr>\r\n <td>Other information</td>\r\n <td>{this.props.patientInfo.otherInformation}</td>\r\n </tr>\r\n {/* {this.props.patientInfo.matchedProjects.length > 0 &&\r\n <tr>\r\n <td>Matched projects</td>\r\n <td>{this.props.patientInfo.matchedProjects.map((x: any) => x.name).join(',')}</td>\r\n </tr>\r\n } */}\r\n <tr>\r\n <td>Is banned from search</td>\r\n <td>{this.props.patientInfo.isBannedFromSearch ? \"Yes\" : \"No\"}</td>\r\n </tr>\r\n </tbody>\r\n </>\r\n )\r\n\r\n return (\r\n <>\r\n <EupatiArrowsMenu\r\n {...{\r\n displayStylesProp: '',\r\n leftArrowText: this.props.leftArrowText,\r\n rightArrowText: this.props.rightArrowText,\r\n backBtnHandler: this.props.backBtnHandler,\r\n forwardBtnHandler: this.props.forwardBtnHandler,\r\n projectId: this.props.projectId,\r\n patientId: this.props.patientInfo.id,\r\n isForwardArrowAvail: this.props.isForwardArrowAvail\r\n }}\r\n />\r\n\r\n <Table striped bordered hover>\r\n {mainComponent}\r\n </Table>\r\n </>\r\n );\r\n }\r\n}","import React, { useEffect, useState } from 'react';\r\nimport Popup from 'reactjs-popup';\r\nimport { Form, Button } from 'react-bootstrap';\r\nimport { useForm, Controller } from \"react-hook-form\";\r\nimport EupatiTextbox from './textbox';\r\nimport EupatiTextarea from './textarea';\r\nimport { Rules } from '../helpers';\r\n//import { EditorState, ContentState } from 'draft-js';\r\n//import { Editor } from 'react-draft-wysiwyg';\r\nimport { toast } from 'react-toastify';\r\nimport './static.scss';\r\nimport 'reactjs-popup/dist/index.css';\r\n//import \"react-draft-wysiwyg/dist/react-draft-wysiwyg.css\";\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faWindowClose, faWindowMinimize, faWindowMaximize } from '@fortawesome/fontawesome-free-regular';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { EmailPatientDetails, LookUpOptions, RequestData } from '../models/input-models';\r\n//import { stateToHTML } from 'draft-js-export-html';\r\nimport { SEND_EMAILS_SUCC_MSG } from '../helpers/messages';\r\n//import htmlToDraft from 'html-to-draftjs';\r\nimport { Patient, Project } from '../models/main-models';\r\nimport { EmailTemplateData } from '../models/input-models';\r\nimport EupatiDropdown from './dropdown';\r\nimport EupatiLoader from './loading-animation/loader';\r\nimport { Editor } from '@tinymce/tinymce-react';\r\nconst escape_quotes = require('escape-quotes');\r\n\r\ntype OwnProps = {\r\n recipients: string;\r\n project: Project;\r\n btnText: string;\r\n emailTemplates: EmailTemplateData[];\r\n dropdownValues: LookUpOptions[];\r\n singleEmailTemplate: EmailTemplateData;\r\n emailTemplateLoading: boolean;\r\n matchedPatients: Patient[];\r\n};\r\n\r\ntype DispatchProps = {\r\n submitRequest: (reqData: RequestData) => void;\r\n resetValues: () => void;\r\n returnLookUpValueByTypeAndId: (propName: string, projectPropId: number) => string | undefined;\r\n getAllEmailTemplates: () => void;\r\n selectTemplateByIndex: (index: number) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function EmailModalPopup(props: Props) {\r\n\r\n const { handleSubmit, reset, control, watch, formState: { errors } } = useForm();\r\n\r\n const [isMaxSize, setIsMaxSize] = useState<boolean>(false);\r\n const [singleTemplateData, setSingleTemplateData] = useState<EmailTemplateData>({ ...props.singleEmailTemplate });\r\n\r\n const onSubmit = (data: any) => {\r\n toast.success(SEND_EMAILS_SUCC_MSG);\r\n const targetedPeople = data.recipients.split('\\t');\r\n props.submitRequest({\r\n recipients: targetedPeople,\r\n subject: data.subject,\r\n content: escape_quotes(returnHtmlContent()),\r\n projectId: props.project.id,\r\n patients: props.matchedPatients.filter((x: Patient) => targetedPeople.some((tp: string) => tp === x.email)).map((x: Patient) => { return { id: x.id, email: x.email } as EmailPatientDetails })\r\n } as RequestData);\r\n }\r\n\r\n const handleTemplateOnChange = (e: any) => {\r\n if (e) {\r\n //e.target.value --> selected menu option index\r\n const index = parseInt(e.target.value);\r\n if (index !== undefined && index !== null) {\r\n props.selectTemplateByIndex(index);\r\n }\r\n }\r\n }\r\n\r\n const returnProperIconType = (icon: any) => {\r\n return icon as IconProp;\r\n }\r\n\r\n const returnHtmlContent = () => {\r\n let htmlContent = '';\r\n if (singleTemplateData.htmlContent !== '') {\r\n htmlContent = props.singleEmailTemplate.htmlContent === singleTemplateData.htmlContent ? props.singleEmailTemplate.htmlContent : singleTemplateData.htmlContent;\r\n }\r\n else {\r\n htmlContent = props.singleEmailTemplate.htmlContent;\r\n }\r\n\r\n return htmlContent;\r\n }\r\n\r\n // const returnSelectedDropdownOption = () => {\r\n // if (templateIndex !== undefined && templateIndex !== null) {\r\n // return props.dropdownValues.filter((x: LookUpOptions) => x.id === templateIndex);\r\n // }\r\n // }\r\n\r\n const handleEditorChange = (content: any) => {\r\n if (content) {\r\n const updatedHtmlContent = Object.assign(props.singleEmailTemplate, { htmlContent: escape_quotes(content) });\r\n setSingleTemplateData({ ...updatedHtmlContent });\r\n }\r\n }\r\n\r\n return (\r\n <Popup className={`${!isMaxSize ? 'modal' : 'modal max-size'}`} trigger={<Button className=\"button\"> {props.btnText} </Button>} modal>\r\n {(close: any) => (\r\n <Form onSubmit={handleSubmit(onSubmit)} onFocus={(e) => e.stopPropagation()} >\r\n <Form.Group className='modal-header'>\r\n <span className='modal-header-title'>New Message</span>\r\n <div className='modal-header-icons'>\r\n <div className='modal-header-icons-ext' onClick={() => { close(); reset(); props.selectTemplateByIndex(-1); }}>\r\n <FontAwesomeIcon icon={returnProperIconType(faWindowClose)} />\r\n </div>\r\n <div className='modal-header-icons-max'>\r\n <FontAwesomeIcon icon={returnProperIconType(faWindowMaximize)} onClick={() => setIsMaxSize(!isMaxSize)} />\r\n </div>\r\n <div className='modal-header-icons-min' onClick={close}>\r\n <FontAwesomeIcon icon={returnProperIconType(faWindowMinimize)} />\r\n </div>\r\n </div>\r\n </Form.Group>\r\n <div className='modal-content-wrapper'>\r\n <Form.Group className='modal-recipients'>\r\n <Form.Label className='modal-recipients-title'>Bcc recipients</Form.Label>\r\n <Controller\r\n name='recipients'\r\n control={control}\r\n defaultValue={props.recipients}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextarea\r\n {...{\r\n ...field,\r\n errorMsg: errors?.recipients?.message,\r\n rowsCount: 1,\r\n placeholderMsg: 'Please select recipient(s)',\r\n isDisabled: true\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='modal-subject'>\r\n <Form.Label className='modal-subject-title'>Subject</Form.Label>\r\n <Controller\r\n name='subject'\r\n control={control}\r\n defaultValue=''\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.subject?.message,\r\n placeholder: 'Please type subject'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='modal-templates'>\r\n <Form.Label className='modal-templates-title'>Choose template</Form.Label>\r\n <Controller\r\n name='templates'\r\n control={control}\r\n //defaultValue={returnSelectedDropdownOption()}\r\n rules={Rules.notRequired}\r\n render={({ field }) =>\r\n <EupatiDropdown\r\n {...{\r\n ...field,\r\n onChange: handleTemplateOnChange,\r\n errorMsg: errors?.templates?.message,\r\n fieldName: 'templates',\r\n values: props.dropdownValues,\r\n defaultOptionText: 'Select template...'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <div style={{ padding: '1rem 1rem' }}>\r\n {props.emailTemplateLoading ? (\r\n <>\r\n <EupatiLoader />\r\n </>\r\n ) : (\r\n <Form.Group id='content-editor' className='modal-content'>\r\n {/* <Controller\r\n name='content'\r\n control={control}\r\n defaultValue={props.singleEmailTemplate.htmlContent}\r\n rules={Rules.requiredMessage}\r\n render={({ field }) =>\r\n <EupatiContentEditor\r\n {...{\r\n ...field,\r\n errorMsg: errors?.content?.message,\r\n }}\r\n />\r\n }\r\n /> */}\r\n <Editor\r\n apiKey=\"gi5vdpb46pw329w18n94luc6ne2yimgpjks785wd387s2qvu\"\r\n value={escape_quotes(props.singleEmailTemplate.htmlContent)}\r\n init={{\r\n height: 500,\r\n menubar: false,\r\n convert_urls: true,\r\n relative_urls: false,\r\n remove_script_host: false,\r\n plugins: ['lists'],\r\n toolbar: 'undo redo | ' +\r\n 'bold italic | alignleft aligncenter ' +\r\n 'alignright alignjustify | bullist numlist outdent indent | ' +\r\n 'removeformat',\r\n content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:18px }'\r\n }}\r\n onEditorChange={handleEditorChange}\r\n />\r\n </Form.Group>\r\n )}\r\n </div>\r\n\r\n </div>\r\n <Form.Group className='modal-btns'>\r\n <Button variant='primary' className='modal-btns-save' type='submit'>SEND</Button>\r\n </Form.Group>\r\n </Form>\r\n )\r\n }\r\n </Popup >\r\n )\r\n};","// Row Selection: https://react-table.tanstack.com/docs/examples/row-selection\r\nimport React from \"react\";\r\n\r\n// @ts-ignore\r\nexport const Check = React.forwardRef(({ indeterminate, ...rest }, ref) => {\r\n const defaultRef = React.useRef();\r\n const resolvedRef = ref || defaultRef;\r\n\r\n React.useEffect(() => {\r\n // @ts-ignore\r\n resolvedRef.current.indeterminate = indeterminate;\r\n }, [resolvedRef, indeterminate]);\r\n\r\n return (\r\n <>\r\n <input\r\n type=\"checkbox\"\r\n // @ts-ignore\r\n ref={resolvedRef}\r\n {...rest}\r\n />\r\n </>\r\n );\r\n});\r\n","import React, { useEffect, useMemo, useState } from 'react';\r\nimport { Button, Table } from 'react-bootstrap';\r\nimport { useRowSelect, useTable } from 'react-table';\r\nimport { EmailTemplateData, LookUpData, LookUpOptions, PatientSearchData, ProjectPatientData, RequestData } from '../models/input-models';\r\nimport { Patient, Project } from '../models/main-models';\r\nimport EupatiPatientDetails from './patient-details';\r\nimport { toast } from 'react-toastify';\r\nimport { ADD_PT_TO_PROJ_MSG, DEL_PT_FROM_PROJ_MSG, CONFIRM_PATIENT_MSG } from '../helpers/messages';\r\nimport EmailPopupModal from '../static/popup-modal';\r\nimport { Check } from './react-table-checkbox';\r\n\r\ntype OwnProps = {\r\n matchedPatients: Patient[],\r\n lookUpData: LookUpData[],\r\n isPatientProfileClicked: boolean,\r\n leftArrowText: string,\r\n rightArrowText: string\r\n isForwardArrowAvail: boolean,\r\n leftBtnText: string,\r\n rightBtnText: string,\r\n projectId: string,\r\n projectName: string,\r\n isManualSearchBtnClicked: boolean,\r\n patientSearchData?: any,\r\n project: Project,\r\n isConfirmed: boolean,\r\n emailTemplates: EmailTemplateData[],\r\n singleEmailTemplate: EmailTemplateData,\r\n emailTemplateLoading: boolean\r\n};\r\n\r\ntype DispatchProps = {\r\n patientProfileBtnHandler: () => void;\r\n backToProjectProfile: () => void;\r\n toggleComponents: (val: string) => void;\r\n removePatient: (inputModel: ProjectPatientData) => void;\r\n addPatient: (inputModel: ProjectPatientData, searchData: PatientSearchData, projectName: string) => void;\r\n updateSearchPatients?: (ptSrchData: any) => void;\r\n submitRequest?: (data: RequestData) => void;\r\n changePatientStatus: (inputModel: ProjectPatientData) => void;\r\n getAllEmailTemplates: () => void;\r\n getEmailTemplateByName: (name: string) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function EupatiPatientsGrid(props: Props) {\r\n\r\n const [patientInfo, setPatientInfo] = useState<any>({});\r\n const [allTemplates, setAllTemplates] = useState<EmailTemplateData[]>(props.emailTemplates.length > 0 ? [...props.emailTemplates] : []);\r\n const [dropdownValues, setDropdownValue] = useState<LookUpOptions[]>([]);\r\n\r\n useEffect(() => {\r\n if (allTemplates.length > 0) {\r\n //sort by name alphabetically\r\n setAllTemplates([...allTemplates.sort((a, b) => a.name.localeCompare(b.name))]);\r\n //convert templates to dropdown menu options\r\n templatesToLookUpOptions();\r\n }\r\n }, []);\r\n\r\n let mainComponent: any;\r\n\r\n const returnLookUpValueByTypeAndId = (propName: string, projectPropId: number) => {\r\n const propType = props.lookUpData.find((x: any) => x.name == propName); // projectType\r\n const propValue = propType?.data.find((x: any) => x.id == projectPropId);\r\n return propValue?.name;\r\n }\r\n\r\n function profileBtnHandler(id: any) {\r\n setPatientInfo(props.matchedPatients.find((x: any) => x.id === id));\r\n props.patientProfileBtnHandler(); // isPatientProfileClicked:true\r\n props.toggleComponents('none');\r\n //window.scrollTo(0, 0);\r\n }\r\n\r\n function deleteProjectPatient(inputModel: ProjectPatientData) {\r\n toast.success(DEL_PT_FROM_PROJ_MSG);\r\n props.removePatient(inputModel);\r\n }\r\n\r\n function addProjectPatient(inputModel: ProjectPatientData) {\r\n toast.success(ADD_PT_TO_PROJ_MSG);\r\n props.addPatient(inputModel, props.patientSearchData, props.projectName);\r\n }\r\n\r\n function confirmPatient(inputModel: ProjectPatientData) {\r\n toast.success(CONFIRM_PATIENT_MSG);\r\n props.changePatientStatus(inputModel);\r\n }\r\n\r\n function resetTableSelectedState() {\r\n toggleAllRowsSelected(false); // reset tbl state\r\n }\r\n\r\n function rightBtnHandler(patientId: any) {\r\n let inputModel = {\r\n projectId: props.projectId,\r\n patientId: patientId\r\n } as ProjectPatientData;\r\n\r\n switch (props.rightBtnText.toLowerCase()) {\r\n case 'remove':\r\n deleteProjectPatient(inputModel);\r\n break;\r\n case 'assign':\r\n addProjectPatient(inputModel);\r\n break;\r\n }\r\n }\r\n\r\n function backBtnHandler() {\r\n setPatientInfo({});\r\n props.backToProjectProfile(); // isPatientProfileClicked:false\r\n props.toggleComponents('');\r\n if (typeof props.updateSearchPatients !== 'undefined') {\r\n props.updateSearchPatients(props.patientSearchData);\r\n }\r\n }\r\n\r\n function templatesToLookUpOptions() {\r\n const arr = allTemplates?.map((x: EmailTemplateData, i: number) => {\r\n return (\r\n {\r\n id: i,\r\n name: x.name\r\n } as LookUpOptions\r\n )\r\n });\r\n setDropdownValue([...arr]);\r\n }\r\n\r\n function selectTemplateByIndex(index: number) {\r\n const selectedTemplate = allTemplates[index];\r\n if (selectedTemplate !== undefined) {\r\n props.getEmailTemplateByName(selectedTemplate.name);\r\n }\r\n else {\r\n props.getEmailTemplateByName('empty');\r\n }\r\n }\r\n\r\n // function handleCopyOnClick(e: any) {\r\n // e.preventDefault();\r\n // const emails = selectedFlatRows.map((row: any) => row.original.email).join(';');\r\n // navigator.clipboard.writeText(emails.trim());\r\n // toast.success(EMAILS_COPIED_MSG);\r\n // }\r\n\r\n const data = useMemo(\r\n () => props?.matchedPatients.map((x: any, i: any) => {\r\n return {\r\n id: x.id,\r\n name: x.firstName.concat(' ', x.lastName),\r\n country: returnLookUpValueByTypeAndId('country', x.countryId),\r\n diseases: x.noDiseaseExpertise ? \"No specific disease experience\" : x.diseases?.map((d: any) => d.name).join(\", \"),\r\n email: x.email,\r\n expertises: x.patientExpertises.map((pe: number) => returnLookUpValueByTypeAndId('expertise', pe)).join(\", \")\r\n }\r\n }), [props.matchedPatients]\r\n )\r\n\r\n const columns = useMemo(\r\n () => [\r\n {\r\n Header: 'Name',\r\n accessor: 'name'\r\n },\r\n {\r\n Header: 'Country',\r\n accessor: 'country'\r\n },\r\n {\r\n Header: 'Diseases',\r\n accessor: 'diseases'\r\n },\r\n {\r\n Header: 'Email',\r\n accessor: 'email'\r\n },\r\n {\r\n Header: 'Expertises',\r\n accessor: 'expertises'\r\n }\r\n ], []\r\n )\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n rows,\r\n prepareRow,\r\n //@ts-ignore\r\n selectedFlatRows,\r\n //@ts-ignore\r\n toggleAllRowsSelected\r\n } = useTable({\r\n //@ts-ignore\r\n columns,\r\n data\r\n },\r\n useRowSelect,\r\n (hooks) => {\r\n {\r\n !props.isManualSearchBtnClicked &&\r\n hooks.visibleColumns.push((cols) => {\r\n return [\r\n {\r\n id: 'selection',\r\n //@ts-ignore\r\n Header: (({ getToggleAllRowsSelectedProps }) => (\r\n <Check {...getToggleAllRowsSelectedProps()} />\r\n )),\r\n //@ts-ignore\r\n Cell: ({ row }) => <Check {...row.getToggleRowSelectedProps()} />\r\n },\r\n ...cols\r\n ]\r\n })\r\n }\r\n }\r\n )\r\n\r\n mainComponent = (\r\n <Table {...getTableProps()} striped bordered hover>\r\n <thead>\r\n {headerGroups.map(headerGroup => (\r\n <tr {...headerGroup.getHeaderGroupProps()}>\r\n {headerGroup.headers.map(col => (\r\n <th {...col.getHeaderProps()}>\r\n {col.render('Header')}\r\n </th>\r\n ))}\r\n </tr>\r\n ))}\r\n </thead>\r\n <tbody {...getTableBodyProps()}>\r\n {rows.map(row => {\r\n prepareRow(row);\r\n return (\r\n <tr {...row.getRowProps()}>\r\n {row.cells.map(cell => {\r\n return (\r\n <td {...cell.getCellProps()}>\r\n {cell.render('Cell')}\r\n </td>\r\n )\r\n })}\r\n <>\r\n <td>\r\n <Button\r\n variant=\"info\"\r\n onClick={() => profileBtnHandler(row.original.id)}\r\n >\r\n {props.leftBtnText.toUpperCase()}\r\n </Button>\r\n </td>\r\n {props.isConfirmed === false &&\r\n <td>\r\n <Button\r\n variant=\"success\"\r\n onClick={() => confirmPatient({ patientId: row.original.id, projectId: props.projectId } as ProjectPatientData)}\r\n >\r\n CONFIRM\r\n </Button>\r\n </td>\r\n }\r\n <td>\r\n <Button\r\n variant='danger'\r\n onClick={() => rightBtnHandler(row.original.id)}\r\n >\r\n {props.rightBtnText.toUpperCase()}\r\n </Button>\r\n </td>\r\n </>\r\n </tr>\r\n )\r\n })}\r\n </tbody>\r\n {/* <pre>\r\n <code>\r\n {JSON.stringify(\r\n {\r\n selectedFlatRows: selectedFlatRows.map((row: any) => row.original.email),\r\n },\r\n null,\r\n 2\r\n )}\r\n </code>\r\n </pre> */}\r\n </Table >\r\n )\r\n\r\n return (\r\n <>\r\n {props.isPatientProfileClicked &&\r\n <EupatiPatientDetails\r\n {...{\r\n patientInfo,\r\n lookUpData: props.lookUpData,\r\n backBtnHandler,\r\n //forwardBtnHandler: props.rightArrowText.includes('remove') ? props.removePatient : props.addPatient,\r\n projectName: props.projectName,\r\n searchData: props.patientSearchData,\r\n leftArrowText: props.leftArrowText,\r\n rightArrowText: props.rightArrowText,\r\n isForwardArrowAvail: props.isForwardArrowAvail,\r\n projectId: props.projectId\r\n }}\r\n />\r\n }\r\n {!props.isPatientProfileClicked &&\r\n <>\r\n {!props.isManualSearchBtnClicked &&\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'flex-end', marginBottom: '10px' }}>\r\n {/* <Button\r\n id='copy-emails-btn'\r\n onClick={(e) => { handleCopyOnClick(e) }}\r\n disabled={selectedFlatRows.length === 0 ? true : false}\r\n style={selectedFlatRows.length === 0 ? { cursor: 'not-allowed', margin: '0 10px 0 0' } : { margin: '0 10px 0 0', cursor: 'pointer' }}\r\n >\r\n COPY SELECTED EMAILS\r\n </Button> */}\r\n <EmailPopupModal\r\n recipients={selectedFlatRows.map((row: any) => row.original.email).join('\\t')}\r\n submitRequest={props.submitRequest !== undefined ? props.submitRequest : () => { void 0; }}\r\n btnText='Email Patients'\r\n resetValues={() => { }}\r\n singleEmailTemplate={props.singleEmailTemplate}\r\n emailTemplateLoading={props.emailTemplateLoading}\r\n project={props.project}\r\n returnLookUpValueByTypeAndId={returnLookUpValueByTypeAndId}\r\n getAllEmailTemplates={props.getAllEmailTemplates}\r\n emailTemplates={props.emailTemplates}\r\n selectTemplateByIndex={selectTemplateByIndex}\r\n dropdownValues={dropdownValues}\r\n matchedPatients={props.matchedPatients}\r\n />\r\n </div>\r\n }\r\n {mainComponent}\r\n </>\r\n }\r\n </>\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport { Button, Form } from 'react-bootstrap';\r\nimport { Controller, useForm } from 'react-hook-form';\r\nimport EupatiTextbox from '../textbox';\r\nimport EupatiPatientsGrid from '../matched-patients-grid';\r\nimport EupatiArrowsMenu from '../arrows-menu';\r\nimport EupatiLoader from '../loading-animation/loader';\r\nimport { LookUpData, PatientSearchData, ProjectPatientData, EmailTemplateData } from '../../models/input-models';\r\nimport './manual-search.scss';\r\nimport EupatiEmailbox from '../emailbox';\r\nimport EupatiDropdown from '../dropdown';\r\nimport EupatiDiseaseAsyncSelect from '../async-select-menu';\r\nimport EupatiMultiselect from '../multiselect';\r\nimport { Patient, Project } from '../../models/main-models';\r\nimport { DiseaseInfo } from '../../models/main-models';\r\n\r\ntype OwnProps = {\r\n projectId: string,\r\n displayStylesProp: string,\r\n isPatientProfileClicked: boolean,\r\n lookUpData: LookUpData[],\r\n projectName: string,\r\n matchedPatients: Patient[],\r\n isMatchedPatientsLoading: boolean,\r\n project: Project,\r\n emailTemplates: EmailTemplateData[],\r\n singleEmailTemplate: EmailTemplateData;\r\n emailTemplateLoading: boolean;\r\n};\r\n\r\ntype DispatchProps = {\r\n toggleComponents: (val: string) => void;\r\n patientProfileBtnHandler: () => void;\r\n backToProjectProfile: () => void;\r\n setMatchedPatients: (searchData: PatientSearchData, projectName: string) => void;\r\n removePatient: (inputModel: ProjectPatientData) => void;\r\n addPatient: (inputModel: ProjectPatientData, searchData: PatientSearchData, projectName: string) => void;\r\n changePatientStatus: (inputModel: ProjectPatientData) => void;\r\n getAllEmailTemplates: () => void;\r\n getEmailTemplateByName: (name: string) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\ntype SubmitData = {\r\n pocFirstName: string,\r\n pocLastName: string,\r\n email: string,\r\n country: number,\r\n diseases: DiseaseInfo[],\r\n patientExpertises: number[]\r\n};\r\n\r\nexport default function EupatiManualMatch(props: Props) {\r\n\r\n const { handleSubmit, control, watch, formState: { errors } } = useForm();\r\n\r\n const [isSubmitBtnClicked, setIsSubmitBtnClicked] = useState<boolean>(false);\r\n const [isPatientProfileClicked, setIsPatientProfileClicked] = useState<boolean>(false);\r\n const [ptSearchData, setPtSearchData] = useState({});\r\n\r\n const onSubmit = (data: SubmitData) => {\r\n setIsSubmitBtnClicked(true);\r\n\r\n const patientSearchData = {\r\n firstName: data.pocFirstName === undefined ? '' : data.pocFirstName,\r\n lastName: data.pocLastName === undefined ? '' : data.pocLastName,\r\n email: data.email === undefined ? '' : data.email,\r\n countryId: data.country === undefined ? null : data.country,\r\n diseases: data.diseases === undefined ? [] : data.diseases,\r\n patientExpertises: data.patientExpertises === undefined ? [] : data.patientExpertises\r\n } as PatientSearchData;\r\n\r\n setPtSearchData(patientSearchData);\r\n updateSearchPatients(patientSearchData);\r\n }\r\n\r\n function updateSearchPatients(patientSearchData: PatientSearchData) {\r\n props.setMatchedPatients(patientSearchData, props.projectName);\r\n }\r\n\r\n function findLookUpData(lookUpDataType?: string) {\r\n if (props.lookUpData &&\r\n props.lookUpData.length > 0) {\r\n return props.lookUpData?.filter((x: any) => x.name == lookUpDataType)[0]?.data;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n function backToManualSearch() {\r\n setIsPatientProfileClicked(false);\r\n }\r\n\r\n function patientProfileBtnHandler() {\r\n setIsPatientProfileClicked(true);\r\n }\r\n\r\n let loadingComp = (\r\n <EupatiLoader />\r\n )\r\n\r\n let patientsGridComp = (\r\n <EupatiPatientsGrid\r\n {...{\r\n matchedPatients: props.matchedPatients,\r\n lookUpData: props.lookUpData,\r\n emailTemplates: props.emailTemplates,\r\n singleEmailTemplate: props.singleEmailTemplate,\r\n emailTemplateLoading: props.emailTemplateLoading,\r\n backToProjectProfile: backToManualSearch,\r\n isPatientProfileClicked: isPatientProfileClicked,\r\n patientProfileBtnHandler: patientProfileBtnHandler,\r\n toggleComponents: props.toggleComponents,\r\n leftArrowText: 'manual search',\r\n rightArrowText: 'assign to project',\r\n isForwardArrowAvail: true,\r\n leftBtnText: 'profile',\r\n rightBtnText: 'assign',\r\n projectId: props.projectId,\r\n updateSearchPatients,\r\n patientSearchData: ptSearchData,\r\n projectName: props.projectName,\r\n addPatient: props.addPatient,\r\n removePatient: props.removePatient,\r\n isManualSearchBtnClicked: true,\r\n project: props.project,\r\n changePatientStatus: props.changePatientStatus,\r\n isConfirmed: true,\r\n getAllEmailTemplates: props.getAllEmailTemplates,\r\n getEmailTemplateByName: props.getEmailTemplateByName\r\n }}\r\n />\r\n )\r\n\r\n if (props.isMatchedPatientsLoading) {\r\n patientsGridComp = loadingComp;\r\n }\r\n\r\n return (\r\n <>\r\n <Form className='manual' onSubmit={handleSubmit(onSubmit)} style={{ display: `${props.displayStylesProp}` }}>\r\n <EupatiArrowsMenu\r\n {...{\r\n displayStylesProp: props.displayStylesProp,\r\n leftArrowText: 'project details',\r\n rightArrowText: props.projectName,\r\n backBtnHandler: props.backToProjectProfile,\r\n //forwardBtnHandler: props.backToProjectProfile,\r\n isForwardArrowAvail: false\r\n }}\r\n />\r\n <Form.Group style={{ display: 'flex', justifyContent: 'center' }}>\r\n <h4 style={{ margin: 'auto auto 50px auto' }} >Current project - {props.projectName.toUpperCase()}</h4>\r\n </Form.Group>\r\n <Form.Group className='manual-info'>\r\n <Form.Group className='lcolumn'>\r\n <Form.Group className='manual-info-field'>\r\n <Form.Label>First name</Form.Label>\r\n <Controller\r\n control={control}\r\n name='pocFirstName'\r\n render={({ field }) =>\r\n <EupatiTextbox {...{ ...field, errorMsg: errors?.pocFirstName?.message, placeholder: 'Please type first name' }} />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='manual-info-field'>\r\n <Form.Label>Surname</Form.Label>\r\n <Controller\r\n control={control}\r\n name='pocLastName'\r\n render={({ field }) =>\r\n <EupatiTextbox {...{ ...field, errorMsg: errors?.pocLastName?.message, placeholder: 'Please type last name' }} />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='manual-info-field'>\r\n <Form.Label>Email</Form.Label>\r\n <Controller\r\n control={control}\r\n name='email'\r\n render={({ field }) =>\r\n <EupatiEmailbox {...{ ...field, errorMsg: errors?.email?.message }} />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='manual-info-field'>\r\n <Form.Label>Therapeutic Areas or Diseases</Form.Label>\r\n <Controller\r\n name='diseases'\r\n control={control}\r\n render={({ field }) =>\r\n <EupatiDiseaseAsyncSelect\r\n {...{\r\n ...field,\r\n errorMsg: errors?.diseases?.message\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n </Form.Group>\r\n\r\n <Form.Group className='rcolumn'>\r\n\r\n <Form.Group className='manual-info-field mb-4'>\r\n <Form.Label>Country</Form.Label>\r\n <Controller\r\n control={control}\r\n name='country'\r\n render={({ field }) =>\r\n <EupatiDropdown\r\n {...{\r\n ...field,\r\n errorMsg: errors?.country?.message,\r\n fieldName: 'countries',\r\n values: findLookUpData('country'),\r\n defaultOptionText: 'Please select country...'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='manual-info-field'>\r\n <Form.Label>Expertises (multiple answers possible)</Form.Label>\r\n <Controller\r\n control={control}\r\n name='patientExpertises'\r\n render={({ field }) =>\r\n <EupatiMultiselect\r\n {...{\r\n ...field,\r\n errorMsg: errors?.patientExpertises?.message,\r\n fieldName: 'patientExpertises',\r\n values: findLookUpData('expertise')\r\n }} />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n </Form.Group>\r\n </Form.Group>\r\n <Form.Group id='manual-btn' style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\r\n <Button className='sbmt' variant=\"primary\" type='submit'>SEARCH</Button>\r\n </Form.Group>\r\n </Form>\r\n {isSubmitBtnClicked &&\r\n <>\r\n {patientsGridComp}\r\n </>\r\n }\r\n </>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Table, Form, Button } from 'react-bootstrap';\r\nimport { LookUpData, PatientSearchData, ProjectPatientData, RequestData, EmailTemplateData, LookUpOptions } from '../models/input-models';\r\nimport EupatiLoader from './loading-animation/loader';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport EupatiManualMatch from './manual-search/index';\r\nimport EupatiPatientsGrid from './matched-patients-grid';\r\nimport './static.scss';\r\nimport EupatiArrowsMenu from './arrows-menu';\r\nimport { Patient, Project } from '../models/main-models';\r\nimport EmailModalPopup from './popup-modal';\r\nimport { jsPDF } from \"jspdf\";\r\nimport html2canvas from 'html2canvas';\r\n\r\ntype OwnProps = {\r\n projectId: string;\r\n lookUpData: LookUpData[];\r\n patientSearchData?: any;\r\n matchedPatients: Patient[];\r\n isMatchedPatientsLoading: boolean;\r\n isProjectLoading: boolean;\r\n project: Project;\r\n emailTemplates: EmailTemplateData[];\r\n singleEmailTemplate: EmailTemplateData;\r\n emailTemplateLoading: boolean;\r\n};\r\n\r\ntype OwnState = {\r\n isManualSearchBtnClicked: boolean;\r\n isPatientProfileClicked: boolean;\r\n displayStylesProp: string;\r\n allTemplates: EmailTemplateData[];\r\n};\r\n\r\ntype DispatchProps = {\r\n updateSearchPatients?: (ptSrchData: any) => void;\r\n backToAllProjects: () => void;\r\n setMatchedPatients: (searchData: PatientSearchData, projectName: string) => void;\r\n setProjectById: (id: string) => void;\r\n removePatient: (inputModel: ProjectPatientData) => void;\r\n addPatient: (inputModel: ProjectPatientData, searchData: PatientSearchData, projectName: string) => void;\r\n submitRequest: (data: RequestData) => void;\r\n changePatientStatus: (inputModel: ProjectPatientData) => void;\r\n getAllEmailTemplates: () => void;\r\n getEmailTemplateByName: (name: string) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default class EupatiProjectDetails extends React.Component<Props, OwnState> {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n isManualSearchBtnClicked: false,\r\n isPatientProfileClicked: false,\r\n displayStylesProp: '',\r\n allTemplates: this.props.emailTemplates.length > 0 ? [...this.props.emailTemplates] : [],\r\n }\r\n\r\n this.returnValueById = this.returnValueById.bind(this);\r\n this.returnProperIconType = this.returnProperIconType.bind(this);\r\n this.returnJoinedArrayValues = this.returnJoinedArrayValues.bind(this);\r\n this.manualSearchBtnHandler = this.manualSearchBtnHandler.bind(this);\r\n this.backToProjectProfile = this.backToProjectProfile.bind(this);\r\n this.patientProfileBtnHandler = this.patientProfileBtnHandler.bind(this);\r\n this.toggleComponents = this.toggleComponents.bind(this);\r\n this.convertDate = this.convertDate.bind(this);\r\n this.toggleField = this.toggleField.bind(this);\r\n this.returnLookUpValueByTypeAndId = this.returnLookUpValueByTypeAndId.bind(this);\r\n this.templatesToLookUpOptions = this.templatesToLookUpOptions.bind(this);\r\n this.selectTemplateByIndex = this.selectTemplateByIndex.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n this.props.setProjectById(this.props?.projectId);\r\n if (this.state.allTemplates.length > 0) {\r\n //sort by name alphabetically\r\n this.setState(prevState => ({\r\n allTemplates: [...prevState.allTemplates.sort((a, b) => a.name.localeCompare(b.name))]\r\n }));\r\n }\r\n }\r\n\r\n returnValueById(propName: string, projectPropId: number) {\r\n let propType = this.props.lookUpData.find(x => x.name === propName); // projectType\r\n let propValue = propType?.data.find(x => x.id === projectPropId);\r\n return propValue?.name;\r\n }\r\n\r\n returnJoinedArrayValues(fieldProps: any, lookUpDataType: any) {\r\n let arr = fieldProps?.map((x: any, i: any) => {\r\n return (\r\n this.returnValueById(lookUpDataType, x)\r\n )\r\n });\r\n\r\n return arr?.join(', ');\r\n }\r\n\r\n templatesToLookUpOptions() {\r\n const arr = this.state.allTemplates?.map((x: EmailTemplateData, i: number) => {\r\n return (\r\n {\r\n id: i,\r\n name: x.name\r\n } as LookUpOptions\r\n )\r\n });\r\n\r\n return arr;\r\n }\r\n\r\n selectTemplateByIndex(index: number) {\r\n const selectedTemplate = this.state.allTemplates[index];\r\n if (selectedTemplate !== undefined) {\r\n this.props.getEmailTemplateByName(selectedTemplate.name);\r\n }\r\n else {\r\n this.props.getEmailTemplateByName('empty');\r\n }\r\n }\r\n\r\n returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n manualSearchBtnHandler() {\r\n this.setState({\r\n isManualSearchBtnClicked: true\r\n });\r\n }\r\n\r\n backToProjectProfile() {\r\n this.props.setProjectById(this.props?.projectId);\r\n this.setState({\r\n isManualSearchBtnClicked: false,\r\n isPatientProfileClicked: false\r\n })\r\n }\r\n\r\n patientProfileBtnHandler() {\r\n this.setState({\r\n isPatientProfileClicked: true\r\n })\r\n }\r\n\r\n toggleComponents(val: string) {\r\n this.setState({\r\n displayStylesProp: val\r\n })\r\n }\r\n\r\n convertDate(date: any) {\r\n if (typeof date === 'undefined') { return }\r\n date = new Date(date);\r\n function pad(s: any) { return (s < 10) ? '0' + s : s; }\r\n return [pad(date.getDate()), pad(date.getMonth() + 1), date.getFullYear()].join('/')\r\n }\r\n\r\n toggleField(val: string) {\r\n return val !== null && val !== '' ? true : false;\r\n }\r\n\r\n returnLookUpValueByTypeAndId = (propName: string, projectPropId: number) => {\r\n const propType = this.props.lookUpData.find((x: any) => x.name == propName); // projectType\r\n const propValue = propType?.data.find((x: any) => x.id == projectPropId);\r\n return propValue?.name;\r\n }\r\n\r\n downloadPDF() {\r\n let page = document.getElementById('all-projects-tbl');\r\n if (page) {\r\n html2canvas(page)\r\n .then((canvas) => {\r\n const imgData = canvas.toDataURL('image/png');\r\n const pdf = new jsPDF();\r\n pdf.addImage(imgData, 'JPEG', 0, 0, canvas.width / 12, canvas.height / 14);\r\n window.open(pdf.output('bloburl'))\r\n //pdf.save(\"EUPATIProject.pdf\");\r\n })\r\n }\r\n }\r\n\r\n render() {\r\n\r\n let loadingComponent = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n );\r\n\r\n let mainComponent: any;\r\n\r\n if (this.props.project.name === '') {\r\n mainComponent = loadingComponent;\r\n } else {\r\n mainComponent = (\r\n <>\r\n <EupatiArrowsMenu\r\n {...{\r\n displayStylesProp: this.state.displayStylesProp,\r\n leftArrowText: 'all projects',\r\n rightArrowText: 'manual match',\r\n backBtnHandler: this.props.backToAllProjects,\r\n forwardBtnHandler: this.manualSearchBtnHandler,\r\n isForwardArrowAvail: true,\r\n }}\r\n />\r\n <Form.Group style={{ display: this.state.displayStylesProp === '' ? 'flex' : this.state.displayStylesProp, justifyContent: 'center' }}>\r\n <h5 style={{ color: '#F0B72F', fontWeight: 'bold', textDecoration: 'underline' }}>Projects information</h5>\r\n </Form.Group>\r\n <Table striped bordered hover style={{ display: `${this.state.displayStylesProp}` }}>\r\n <tbody>\r\n <tr>\r\n <td>Name</td>\r\n <td>{this.props?.project?.name}</td>\r\n </tr>\r\n <tr>\r\n <td>Overview</td>\r\n <td>{this.props?.project?.overview}</td>\r\n </tr>\r\n <tr>\r\n <td>Type</td>\r\n <td>{this.returnValueById('projectType', this.props?.project?.projectTypeId)}</td>\r\n </tr>\r\n {this.toggleField(this.props?.project?.projectTypeDescription) &&\r\n <tr>\r\n <td>Type description</td>\r\n <td>{this.props?.project?.projectTypeDescription}</td>\r\n </tr>\r\n }\r\n <tr>\r\n <td>Interaction</td>\r\n <td>{this.returnValueById('interactionType', this.props?.project?.interactionTypeId)}</td>\r\n </tr>\r\n <tr>\r\n <td>Activity</td>\r\n <td>{this.returnValueById('activityType', this.props?.project?.projectActivityId)}</td>\r\n </tr>\r\n <tr>\r\n <td>How many patients are you looking for?</td>\r\n <td>{(this.props?.project?.projectNumberOfPatientsNeeded == 0 || this.props?.project?.projectNumberOfPatientsNeeded == undefined) ? '' : this.props?.project?.projectNumberOfPatientsNeeded}</td>\r\n </tr>\r\n <tr>\r\n <td>Role and expectations</td>\r\n <td>{this.props?.project?.roleAndExpectations}</td>\r\n </tr>\r\n <tr>\r\n <td>Start date</td>\r\n <td>{this.convertDate(this.props?.project?.startDate)}</td>\r\n </tr>\r\n <tr>\r\n <td>End date</td>\r\n <td>{this.convertDate(this.props?.project?.endDate)}</td>\r\n </tr>\r\n <tr>\r\n <td>Time required</td>\r\n <td>{this.props?.project?.timeRequired}</td>\r\n </tr>\r\n <tr>\r\n <td>Is compensation provided </td>\r\n <td>{this.props?.project?.isCompensationProvided ? \"Yes\" : \"No\"}</td>\r\n </tr>\r\n {this.props?.project?.isCompensationProvided &&\r\n <tr>\r\n <td>Compensation amout</td>\r\n <td>{this.props?.project?.compensation}</td>\r\n </tr>\r\n }\r\n <tr>\r\n <td>Is ThereTravel Reimbursement</td>\r\n <td>{this.props?.project?.isThereTravelReimbursement ? \"Yes\" : \"No\"}</td>\r\n </tr>\r\n <tr>\r\n <td>Equipment requirements</td>\r\n <td>{this.props?.project?.equipmentRequirements}</td>\r\n </tr>\r\n <tr>\r\n <td>Response deadline</td>\r\n <td>{this.convertDate(this.props?.project?.responseDeadline)}</td>\r\n </tr>\r\n <tr>\r\n <td>Price</td>\r\n <td>{this.props.project.price}</td>\r\n </tr>\r\n <tr>\r\n <td>Plan</td>\r\n <td>{this.props.project.plan}</td>\r\n </tr>\r\n <tr>\r\n <td>Package</td>\r\n <td>{this.props.project.package}</td>\r\n </tr>\r\n <tr>\r\n <td>Payment method</td>\r\n <td>{this.props.project.paymentMethod}</td>\r\n </tr>\r\n <tr>\r\n <td>Disease Experience</td>\r\n <td>{this.props?.project?.noDiseaseExpertiseRequired ? \"No specific disease experience is required\" : this.props?.project?.diseases?.map((d: any) => d.name).join(\", \")}</td>\r\n </tr>\r\n <tr>\r\n <td>Disease Preference</td>\r\n <td>{this.props?.project?.searchDiseaseTherapeuticArea ? \"Match patients in the therapeutic area(s) as well\" : \"Match only from the selected disease(s)\"}</td>\r\n </tr>\r\n {/* <tr>\r\n <td>Disease area</td>\r\n <td>{this.props?.project?.diseaseTAName}</td>\r\n </tr> */}\r\n <tr>\r\n <td>Patient expertises</td>\r\n <td>{this.returnJoinedArrayValues(this.props?.project?.patientExpertises, 'expertise')}</td>\r\n </tr>\r\n {this.toggleField(this.props?.project?.patientExpertisesDescription) &&\r\n <tr>\r\n <td>Patient expertises description</td>\r\n <td>{this.props?.project?.patientExpertisesDescription}</td>\r\n </tr>\r\n }\r\n <tr>\r\n <td>Countries</td>\r\n <td>{this.returnJoinedArrayValues(this.props?.project?.countries, 'countryWithContinents')}</td>\r\n </tr>\r\n <tr>\r\n <td>Languages</td>\r\n <td>{this.returnJoinedArrayValues(this.props?.project?.languages, 'language')}</td>\r\n </tr>\r\n <tr>\r\n <td>Other information</td>\r\n <td>{this.props?.project?.otherInformation}</td>\r\n </tr>\r\n </tbody>\r\n </Table>\r\n\r\n <Form.Group style={{ display: this.state.displayStylesProp === '' ? 'flex' : this.state.displayStylesProp, justifyContent: 'center' }}>\r\n <h5 style={{ color: '#F0B72F', fontWeight: 'bold', textDecoration: 'underline' }}>Person of contact</h5>\r\n </Form.Group>\r\n <Form.Group style={{ display: 'flex', justifyContent: 'flex-end' }}>\r\n <EmailModalPopup\r\n recipients={this.props?.project?.pocEmail}\r\n project={this.props?.project}\r\n btnText='Email Researcher'\r\n submitRequest={this.props.submitRequest}\r\n resetValues={() => { }}\r\n singleEmailTemplate={this.props.singleEmailTemplate}\r\n emailTemplateLoading={this.props.emailTemplateLoading}\r\n returnLookUpValueByTypeAndId={this.returnLookUpValueByTypeAndId}\r\n getAllEmailTemplates={this.props.getAllEmailTemplates}\r\n emailTemplates={this.state.allTemplates}\r\n selectTemplateByIndex={this.selectTemplateByIndex}\r\n dropdownValues={this.templatesToLookUpOptions()}\r\n matchedPatients={this.props.matchedPatients}\r\n />\r\n </Form.Group>\r\n <Table striped bordered hover style={{ display: `${this.state.displayStylesProp}` }}>\r\n <tbody>\r\n <tr>\r\n <td>First name</td>\r\n <td>{this.props?.project?.pocFirstName}</td>\r\n </tr>\r\n <tr>\r\n <td>Last name</td>\r\n <td>{this.props?.project?.pocLastName}</td>\r\n </tr>\r\n <tr>\r\n <td>Organisation</td>\r\n <td>{this.props?.project?.pocOrganisation}</td>\r\n </tr>\r\n <tr>\r\n <td>Organisation type</td>\r\n <td>{this.returnValueById('organisationType', this.props?.project?.pocOrganisationTypeId)}</td>\r\n </tr>\r\n {this.toggleField(this.props?.project?.pocOrganisationTypeDescription) &&\r\n <tr>\r\n <td>Organisation type description</td>\r\n <td>{this.props?.project?.pocOrganisationTypeDescription}</td>\r\n </tr>\r\n }\r\n <tr>\r\n <td>Job title</td>\r\n <td>{this.props?.project?.pocJobTitle}</td>\r\n </tr>\r\n <tr>\r\n <td>Country of origin</td>\r\n <td>{this.returnValueById('country', this.props?.project?.pocCountryId)}</td>\r\n </tr>\r\n <tr>\r\n <td>Phone number</td>\r\n <td>{this.props?.project?.pocPhoneNumber}</td>\r\n </tr>\r\n <tr>\r\n <td>Email</td>\r\n <td>{this.props?.project?.pocEmail}</td>\r\n </tr>\r\n </tbody>\r\n </Table>\r\n <Form.Group onClick={this.downloadPDF}>\r\n <Button className='right-arrow-container-btn'>Download Project Information as PDF</Button>\r\n </Form.Group>\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {!this.state.isManualSearchBtnClicked ? (\r\n <>\r\n <>\r\n {mainComponent}\r\n </>\r\n {this.props?.project?.matchedPatients?.length > 0 &&\r\n <>\r\n <Form.Group style={{ display: this.state.displayStylesProp === '' ? 'flex' : this.state.displayStylesProp, justifyContent: 'center', margin: '0', padding: '0' }}>\r\n <h5 style={{ color: '#F0B72F', fontWeight: 'bold', textDecoration: 'underline' }}>Matched patients</h5>\r\n </Form.Group>\r\n <EupatiPatientsGrid\r\n {...{\r\n matchedPatients: [...this.props?.project?.matchedPatients],\r\n lookUpData: this.props.lookUpData,\r\n emailTemplates: this.props.emailTemplates,\r\n singleEmailTemplate: this.props.singleEmailTemplate,\r\n emailTemplateLoading: this.props.emailTemplateLoading,\r\n patientProfileBtnHandler: this.patientProfileBtnHandler,\r\n backToProjectProfile: this.backToProjectProfile,\r\n isPatientProfileClicked: this.state.isPatientProfileClicked,\r\n toggleComponents: this.toggleComponents,\r\n leftArrowText: 'projects details',\r\n rightArrowText: 'remove from project',\r\n isForwardArrowAvail: true,\r\n leftBtnText: 'profile',\r\n rightBtnText: 'remove',\r\n projectId: this.props?.projectId,\r\n updateSearchPatients: this.props.updateSearchPatients,\r\n patientSearchData: this.props.patientSearchData,\r\n projectName: this.props?.project?.name,\r\n addPatient: this.props.addPatient,\r\n removePatient: this.props.removePatient,\r\n isManualSearchBtnClicked: this.state.isManualSearchBtnClicked,\r\n submitRequest: this.props.submitRequest,\r\n project: this.props.project,\r\n changePatientStatus: this.props.changePatientStatus,\r\n isConfirmed: false,\r\n getAllEmailTemplates: this.props.getAllEmailTemplates,\r\n getEmailTemplateByName: this.props.getEmailTemplateByName\r\n }}\r\n />\r\n </>\r\n }\r\n {this.props?.project?.confirmedPatients?.length > 0 &&\r\n <>\r\n <Form.Group style={{ display: this.state.displayStylesProp === '' ? 'flex' : this.state.displayStylesProp, justifyContent: 'center', margin: '0', padding: '0' }}>\r\n <h5 style={{ color: '#F0B72F', fontWeight: 'bold', textDecoration: 'underline' }}>Confirmed patients</h5>\r\n </Form.Group>\r\n <EupatiPatientsGrid\r\n {...{\r\n matchedPatients: [...this.props?.project?.confirmedPatients],\r\n lookUpData: this.props.lookUpData,\r\n emailTemplates: this.props.emailTemplates,\r\n singleEmailTemplate: this.props.singleEmailTemplate,\r\n emailTemplateLoading: this.props.emailTemplateLoading,\r\n patientProfileBtnHandler: this.patientProfileBtnHandler,\r\n backToProjectProfile: this.backToProjectProfile,\r\n isPatientProfileClicked: this.state.isPatientProfileClicked,\r\n toggleComponents: this.toggleComponents,\r\n leftArrowText: 'projects details',\r\n rightArrowText: 'remove from project',\r\n isForwardArrowAvail: true,\r\n leftBtnText: 'profile',\r\n rightBtnText: 'remove',\r\n projectId: this.props?.projectId,\r\n updateSearchPatients: this.props.updateSearchPatients,\r\n patientSearchData: this.props.patientSearchData,\r\n projectName: this.props?.project?.name,\r\n addPatient: this.props.addPatient,\r\n removePatient: this.props.removePatient,\r\n isManualSearchBtnClicked: this.state.isManualSearchBtnClicked,\r\n submitRequest: this.props.submitRequest,\r\n project: this.props.project,\r\n changePatientStatus: this.props.changePatientStatus,\r\n isConfirmed: true,\r\n getAllEmailTemplates: this.props.getAllEmailTemplates,\r\n getEmailTemplateByName: this.props.getEmailTemplateByName\r\n }}\r\n />\r\n </>\r\n }\r\n </>\r\n ) : (\r\n <>\r\n <EupatiManualMatch\r\n {...{\r\n //matchedPatients: [...this.props?.project?.matchedPatients],\r\n projectName: this.props?.project?.name,\r\n backToProjectProfile: this.backToProjectProfile,//\r\n lookUpData: this.props.lookUpData,\r\n emailTemplates: this.props.emailTemplates,\r\n singleEmailTemplate: this.props.singleEmailTemplate,\r\n emailTemplateLoading: this.props.emailTemplateLoading,\r\n isPatientProfileClicked: this.state.isPatientProfileClicked,\r\n patientProfileBtnHandler: this.patientProfileBtnHandler,\r\n toggleComponents: this.toggleComponents,\r\n displayStylesProp: this.state.displayStylesProp,\r\n projectId: this.props?.projectId,\r\n setMatchedPatients: this.props.setMatchedPatients,\r\n matchedPatients: this.props.matchedPatients,\r\n isMatchedPatientsLoading: this.props.isMatchedPatientsLoading,\r\n addPatient: this.props.addPatient,\r\n removePatient: this.props.removePatient,\r\n project: this.props.project,\r\n changePatientStatus: this.props.changePatientStatus,\r\n getAllEmailTemplates: this.props.getAllEmailTemplates,\r\n getEmailTemplateByName: this.props.getEmailTemplateByName\r\n }}\r\n />\r\n </>\r\n )}\r\n </>\r\n );\r\n }\r\n}","import React from 'react';\r\n\r\nexport default function GlobalFilter(props: any) {\r\n return (\r\n <span>\r\n Search:{' '}\r\n <input\r\n value={props.filter || \"\"}\r\n onChange={e => props.setFilter(e.target.value)}\r\n placeholder='Filter the records...'\r\n style={{ fontSize: '1.1rem', border: '0' }}\r\n />\r\n </span>\r\n )\r\n}","import React, { useState } from 'react';\r\nimport { Table, Button, Form } from 'react-bootstrap';\r\nimport EupatiProjectDetails from './project-details';\r\nimport { useTable, useGlobalFilter, usePagination, useSortBy } from \"react-table\";\r\nimport { useMemo } from 'react';\r\nimport EupatiDropdown from './dropdown';\r\nimport { LookUpData, PatientSearchData, ProjectPatientData, RequestData, EmailTemplateData, LookUpOptions } from '../models/input-models';\r\nimport { ProjectStatus } from '../helpers';\r\nimport GlobalFilter from './global-filter';\r\nimport './static.scss';\r\nimport { Patient, Project } from '../models/main-models';\r\nimport EupatiLoader from './loading-animation/loader';\r\nimport { toast } from 'react-toastify';\r\nimport { ARCHIVE_PROJ_SUCC_MSG } from '../helpers/messages';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faSortAlphaDown, faSortAlphaUp, faFileExcel } from '@fortawesome/fontawesome-free-solid';\r\nimport { faWindowMinimize } from '@fortawesome/fontawesome-free-regular';\r\nimport { CSVLink } from \"react-csv\";\r\nimport uniqid from 'uniqid';\r\nimport { projectStatus } from '../helpers/status';\r\n\r\ntype OwnProps = {\r\n lookUpData: LookUpData[],\r\n projects: Project[],\r\n projectsFilter: number,\r\n matchedPatients: Patient[],\r\n isMatchedPatientsLoading: boolean,\r\n isProjectLoading: boolean,\r\n project: Project\r\n emailTemplates: EmailTemplateData[];\r\n singleEmailTemplate: EmailTemplateData;\r\n emailTemplateLoading: boolean;\r\n};\r\n\r\ntype DispatchProps = {\r\n setProjects: (condition: number) => void;\r\n setProjectsFilter: (filter: number) => void;\r\n setMatchedPatients: (searchData: PatientSearchData, projectName: string) => void;\r\n setProjectById: (id: string) => void;\r\n removePatient: (inputModel: ProjectPatientData) => void;\r\n addPatient: (inputModel: ProjectPatientData, searchData: PatientSearchData, projectName: string) => void;\r\n changeProjectStatus: (id: string, filter: number) => void;\r\n submitRequest: (data: RequestData) => void;\r\n changePatientStatus: (inputModel: ProjectPatientData) => void;\r\n getAllEmailTemplates: () => void;\r\n getEmailTemplateByName: (name: string) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nconst OUTLINE_PADDING_STYLE = {\r\n paddingLeft: '1.2rem',\r\n paddingRight: '1.2rem'\r\n};\r\nconst PRIMARY_PADDING_STYLE = {\r\n paddingLeft: '1.7rem',\r\n paddingRight: '1.7rem'\r\n}\r\nexport default function EupatiAllProjectsGrid(props: Props) {\r\n\r\n const [isDetailsBtnClicked, setIsDetailsBtnClicked] = useState<boolean>(false);\r\n const [clickedProjectId, setClickedProjectId] = useState<string>('');\r\n\r\n const detailsBtnHandler = (id: any) => {\r\n setClickedProjectId(id);\r\n props.setProjectById(id);\r\n setIsDetailsBtnClicked(true);\r\n }\r\n\r\n const changeProjectStatusHandler = (id: any, filter: number) => {\r\n toast.success(ARCHIVE_PROJ_SUCC_MSG);\r\n props.changeProjectStatus(id, filter);\r\n }\r\n\r\n const backBtnHandler = () => {\r\n setClickedProjectId('');\r\n setIsDetailsBtnClicked(false);\r\n }\r\n\r\n const returnValueById = (propName: string, projectPropId: number) => {\r\n let propType = props.lookUpData.find((x: any) => x.name == propName); // projectType\r\n let propValue = propType?.data.find((x: any) => x.id == projectPropId);\r\n return propValue?.name;\r\n }\r\n\r\n function findLookUpData(lookUpDataType?: string) {\r\n if (props.lookUpData &&\r\n props.lookUpData.length > 0) {\r\n var data = props.lookUpData?.filter((x: any) => x.name == lookUpDataType)[0]?.data;\r\n if (lookUpDataType == \"projectStatus\" && data.findIndex(d => d.id == 0) == -1)//add \"All Statuses option in the filter dropdown\"\r\n {\r\n data.unshift({\r\n id: 0, name: \"Show All\"\r\n } as LookUpOptions)\r\n }\r\n\r\n return data;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n const projectStatusHandler = (statusId: number) => {\r\n props.setProjectsFilter(statusId);\r\n props.setProjects(statusId);\r\n }\r\n\r\n function convertDate(date: any) {\r\n if (typeof date === 'undefined') { return }\r\n function pad(s: any) { return (s < 10) ? '0' + s : s; } // 9 --> 09 || 10 --> 10\r\n return [pad(date.getDate()), pad(date.getMonth() + 1), date.getFullYear()].join('/') // format date --> 09/12/2021 \r\n }\r\n\r\n function setValue(val: any) {\r\n if (isNaN(val)) {\r\n projectStatusHandler(ProjectStatus.inProgressStatusID);\r\n return ProjectStatus.inProgressStatusID;\r\n }\r\n\r\n return val;\r\n }\r\n\r\n function returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n let projectsDetailsComp: any;\r\n let loadComp = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n )\r\n\r\n if (clickedProjectId === '') {\r\n projectsDetailsComp = loadComp;\r\n }\r\n else {\r\n projectsDetailsComp = (\r\n <EupatiProjectDetails\r\n {...{\r\n projectId: clickedProjectId,\r\n backToAllProjects: backBtnHandler,\r\n lookUpData: props.lookUpData,\r\n emailTemplates: props.emailTemplates,\r\n singleEmailTemplate: props.singleEmailTemplate,\r\n emailTemplateLoading: props.emailTemplateLoading,\r\n setMatchedPatients: props.setMatchedPatients,\r\n matchedPatients: props.matchedPatients,\r\n isMatchedPatientsLoading: props.isMatchedPatientsLoading,\r\n setProjectById: props.setProjectById,\r\n isProjectLoading: props.isProjectLoading,\r\n project: props.project,\r\n removePatient: props.removePatient,\r\n addPatient: props.addPatient,\r\n submitRequest: props.submitRequest,\r\n changePatientStatus: props.changePatientStatus,\r\n getAllEmailTemplates: props.getAllEmailTemplates,\r\n getEmailTemplateByName: props.getEmailTemplateByName\r\n }}\r\n />\r\n )\r\n }\r\n\r\n const headers = [\r\n { label: \"Name\", key: \"name\" },\r\n { label: \"Type\", key: \"type\" },\r\n { label: \"Start date\", key: \"date\" },\r\n { label: \"Disease(s) experience\", key: \"diseases\" },\r\n { label: \"Chosen plan\", key: \"plan\" },\r\n { label: \"Organisation\", key: \"org\" }\r\n ];\r\n\r\n const data = useMemo(\r\n () => props.projects?.map((x: any, i: any) => {\r\n let statuses = findLookUpData('projectStatus');\r\n\r\n return {\r\n id: x.id,\r\n name: x.name,\r\n type: returnValueById('projectType', x.projectTypeId),\r\n date: x.createdOn,\r\n diseases: x.noDiseaseExpertiseRequired ? \"No disease experience required\" : x.diseases?.map((d: any) => d.name).join(\", \"),\r\n plan: x.plan,\r\n org: x.pocOrganisation,\r\n status: x.projectStatusId,\r\n statusText: statuses.find(s => s.id == x.projectStatusId)?.name\r\n }\r\n }), [props.projects]\r\n )\r\n\r\n const columns = useMemo(\r\n () => [\r\n {\r\n Header: 'Name',\r\n accessor: 'name', // accessor is the \"key\" in the data\r\n },\r\n {\r\n Header: 'Type',\r\n accessor: 'type'\r\n },\r\n {\r\n Header: 'Date',\r\n accessor: 'date',\r\n Cell: (props: any) => {\r\n if (props.value != undefined && props.value != null) {\r\n return props.value.toString() == \"0001-01-01T00:00:00\" ? \"-\" : convertDate(new Date(props.value));\r\n } else {\r\n return '';\r\n }\r\n }\r\n },\r\n {\r\n Header: 'Diseases',\r\n accessor: 'diseases'\r\n },\r\n {\r\n Header: 'Plan',\r\n accessor: 'plan'\r\n },\r\n {\r\n Header: 'Organisation',\r\n accessor: 'org'\r\n },\r\n {\r\n Header: 'Status',\r\n accessor: 'statusText'\r\n }\r\n ], []\r\n )\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups, // columns Header\r\n rows, // render data based on accessor\r\n // @ts-ignore\r\n page,\r\n // @ts-ignore\r\n nextPage,\r\n // @ts-ignore\r\n previousPage,\r\n // @ts-ignore\r\n canNextPage,\r\n // @ts-ignore\r\n canPreviousPage,\r\n prepareRow,\r\n // @ts-ignore\r\n visibleColumns,\r\n // @ts-ignore\r\n pageOptions,\r\n // @ts-ignore\r\n gotoPage,\r\n // @ts-ignore\r\n pageCount,\r\n // @ts-ignore\r\n setPageSize,\r\n // @ts-ignore\r\n state,\r\n // @ts-ignore\r\n setGlobalFilter,\r\n } = useTable({\r\n // @ts-ignore\r\n columns,\r\n data\r\n },\r\n useGlobalFilter,\r\n useSortBy,\r\n usePagination,\r\n )\r\n // @ts-ignore\r\n const { globalFilter, pageSize, pageIndex } = state;\r\n\r\n let mainComponent = (\r\n <>\r\n <Table {...getTableProps()} striped bordered hover>\r\n <thead>\r\n {headerGroups.map(headerGroup => (\r\n <tr {...headerGroup.getHeaderGroupProps()}>\r\n {headerGroup.headers.map(col => (\r\n //@ts-ignore\r\n <th {...col.getHeaderProps(col.getSortByToggleProps())}>\r\n {col.render('Header')}\r\n <span>\r\n {/* @ts-ignore */\r\n col.isSorted ? (col.isSortedDesc ? <FontAwesomeIcon icon={returnProperIconType(faSortAlphaDown)} /> : <FontAwesomeIcon icon={returnProperIconType(faSortAlphaUp)} />) : <FontAwesomeIcon id='line' icon={returnProperIconType(faWindowMinimize)} />\r\n }\r\n </span>\r\n </th>\r\n ))}\r\n </tr>\r\n ))}\r\n <tr>\r\n <th\r\n colSpan={visibleColumns.length}\r\n style={{ textAlign: 'left' }}\r\n >\r\n <GlobalFilter filter={globalFilter} setFilter={setGlobalFilter} />\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody {...getTableBodyProps()}>\r\n {page.map((row: any) => {\r\n prepareRow(row)\r\n return (\r\n <tr {...row.getRowProps()}>\r\n {row.cells.map((cell: any) => {\r\n return (\r\n <td {...cell.getCellProps()}>\r\n {cell.render('Cell')}\r\n </td>\r\n )\r\n })}\r\n <>\r\n <td role='cell'>\r\n <Button\r\n variant=\"info\"\r\n onClick={() => detailsBtnHandler(row.original.id)}\r\n >\r\n DETAILS\r\n </Button>\r\n </td>\r\n {row.original.status === projectStatus.archivedStatusID ? (\r\n <td role='cell'>\r\n <Button\r\n variant='secondary'\r\n onClick={() => changeProjectStatusHandler(row.original.id, projectStatus.inProgressStatusID)}\r\n style={{ cursor: 'pointer' }}\r\n >\r\n REVIVE\r\n </Button>\r\n </td>\r\n ) : (\r\n <td role='cell'>\r\n <Button\r\n variant='danger'\r\n onClick={() => changeProjectStatusHandler(row.original.id, projectStatus.archivedStatusID)}\r\n style={{ cursor: 'pointer' }}\r\n >\r\n ARCHIVE\r\n </Button>\r\n </td>\r\n )}\r\n </>\r\n </tr>\r\n )\r\n })}\r\n </tbody>\r\n </Table>\r\n <Form.Group style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\r\n <span>\r\n Page{' '}\r\n <strong>\r\n {pageIndex + 1} of {pageOptions.length}\r\n </strong>\r\n </span>\r\n <span>\r\n Go to page: {' '}\r\n <input\r\n type='number'\r\n defaultValue={pageIndex + 1}\r\n min='1'\r\n disabled={pageSize >= rows.length}\r\n onChange={(e) => {\r\n e.preventDefault();\r\n const pageNum = e.target.value ? Number(e.target.value) - 1 : 0;\r\n gotoPage(pageNum);\r\n }}\r\n />\r\n </span>\r\n <select value={pageSize} onChange={e => setPageSize(e.target.value)}>\r\n {\r\n [10, 25, 50, 100].map(pageSize => (\r\n <option key={pageSize} value={pageSize}>\r\n Show {pageSize}\r\n </option>\r\n ))\r\n }\r\n </select>\r\n <Button id='backToFirstPageBtn' onClick={() => gotoPage(0)} disabled={!canPreviousPage} style={canPreviousPage ? { cursor: 'pointer', ...OUTLINE_PADDING_STYLE } : { cursor: 'not-allowed', ...OUTLINE_PADDING_STYLE }} className='btn btn-outline-dark btn-sm' >{'<<'}</Button>\r\n <Button onClick={() => previousPage()} disabled={!canPreviousPage} style={canPreviousPage ? { cursor: 'pointer' } : { cursor: 'not-allowed' }} variant='secondary' >Previous</Button>\r\n <Button onClick={() => nextPage()} disabled={!canNextPage} style={canNextPage ? { cursor: 'pointer', ...PRIMARY_PADDING_STYLE } : { cursor: 'not-allowed', ...PRIMARY_PADDING_STYLE }} variant='primary'>Next</Button>\r\n <Button id='gotoLastPageBtn' onClick={() => gotoPage(pageCount - 1)} disabled={!canNextPage} style={canNextPage ? { cursor: 'pointer', ...OUTLINE_PADDING_STYLE } : { cursor: 'not-allowed', ...OUTLINE_PADDING_STYLE }} className='btn btn-outline-dark btn-sm' >{'>>'}</Button>\r\n </Form.Group>\r\n </>\r\n );\r\n\r\n return (\r\n <>\r\n {isDetailsBtnClicked &&\r\n <>\r\n {projectsDetailsComp}\r\n </>\r\n }\r\n {!isDetailsBtnClicked &&\r\n <>\r\n <h4 style={{ textAlign: 'center', textDecoration: 'underline' }}>PROJECTS</h4>\r\n <div className='table-btns'>\r\n <EupatiDropdown {...{\r\n fieldName: 'projectStatusId',\r\n errorMsg: '',\r\n values: findLookUpData('projectStatus'),\r\n onChange: (e: any) => projectStatusHandler(parseInt(e.target.value)),\r\n value: setValue(parseInt(props.projectsFilter.toString())),\r\n width: 'auto'\r\n }} />\r\n <span><strong>{props.projects?.length}</strong> projects.</span>\r\n <CSVLink\r\n data={data}\r\n headers={headers}\r\n id='csv-download-btn'\r\n filename={`${uniqid('projects-table-')}.csv`}\r\n className=\"btn btn-success\"\r\n >\r\n DOWNLOAD <FontAwesomeIcon icon={returnProperIconType(faFileExcel)} />\r\n </CSVLink>\r\n </div>\r\n {mainComponent}\r\n </>\r\n }\r\n </>\r\n );\r\n}","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\nimport { EmailTemplateData, LookUpData, PatientSearchData, ProjectPatientData, RequestData } from '../../../../common/models/input-models';\r\nimport { Patient, Project } from '../../../../common/models/main-models';\r\nimport EupatiLoader from '../../../../common/static/loading-animation/loader';\r\nimport EupatiAllProjectsGrid from '../../../../common/static/projects-grid';\r\nimport { State } from '../model';\r\nimport '../style.scss';\r\n\r\ntype OwnProps = {\r\n isLoading: boolean;\r\n lookUpData: LookUpData[];\r\n isProjectsLoading: boolean;\r\n projects: Project[];\r\n filter: number;\r\n matchedPatients: Patient[];\r\n isMatchedPatientsLoading: boolean;\r\n project: Project;\r\n isProjectLoading: boolean;\r\n emailTemplates: EmailTemplateData[];\r\n singleEmailTemplate: EmailTemplateData;\r\n emailTemplateLoading: boolean;\r\n};\r\n\r\nexport type DispatchProps = {\r\n setLookUpData: () => void;\r\n setProjects: (condition: number) => void;\r\n setFilter: (filter: number) => void;\r\n setMatchedPatients: (searchData: PatientSearchData, projectName: string) => void;\r\n setProjectById: (id: string) => void;\r\n removePatient: (inputModel: ProjectPatientData) => void;\r\n addPatient: (inputModel: ProjectPatientData, searchData: PatientSearchData, projectName: string) => void;\r\n changeProjectStatus: (id: string, filter: number) => void;\r\n submitRequest: (data: RequestData) => void;\r\n changePatientStatus: (inputModel: ProjectPatientData) => void;\r\n getAllEmailTemplates: () => void;\r\n getEmailTemplateByName: (name: string) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps;\r\n\r\ntype OwnState = {};\r\n\r\n//TODO: pass func to grid so it doesnt call services directly\r\nexport default class ComponentRoot extends React.Component<Props, OwnState> {\r\n\r\n componentDidMount() {\r\n this.props.setLookUpData();\r\n this.props.getAllEmailTemplates();\r\n this.props.setProjects(this.props.filter);\r\n }\r\n\r\n render() {\r\n\r\n let mainComponent: any;\r\n\r\n let loadingComponent = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n )\r\n\r\n if (this.props.isLoading ||\r\n this.props.isProjectsLoading) {\r\n mainComponent = loadingComponent;\r\n }\r\n else {\r\n mainComponent = (\r\n <Form.Group id='all-projects-tbl' className='all-projects-wrapper mb-5'>\r\n <EupatiAllProjectsGrid\r\n {...{\r\n lookUpData: this.props.lookUpData,\r\n projects: this.props.projects,\r\n setProjects: this.props.setProjects,\r\n setProjectsFilter: this.props.setFilter,\r\n projectsFilter: this.props.filter,\r\n emailTemplates: this.props.emailTemplates,\r\n singleEmailTemplate: this.props.singleEmailTemplate,\r\n emailTemplateLoading: this.props.emailTemplateLoading,\r\n setMatchedPatients: this.props.setMatchedPatients,\r\n matchedPatients: this.props.matchedPatients,\r\n isMatchedPatientsLoading: this.props.isMatchedPatientsLoading,\r\n setProjectById: this.props.setProjectById,\r\n isProjectLoading: this.props.isProjectLoading,\r\n project: this.props.project,\r\n removePatient: this.props.removePatient,\r\n addPatient: this.props.addPatient,\r\n changeProjectStatus: this.props.changeProjectStatus,\r\n submitRequest: this.props.submitRequest,\r\n changePatientStatus: this.props.changePatientStatus,\r\n getAllEmailTemplates: this.props.getAllEmailTemplates,\r\n getEmailTemplateByName: this.props.getEmailTemplateByName\r\n }}\r\n />\r\n </Form.Group>\r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {mainComponent}\r\n </>\r\n );\r\n }\r\n}","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport * as Actions from '../actions';\r\nimport { State } from '../model';\r\nimport { connect } from 'react-redux';\r\nimport { PatientSearchData, ProjectPatientData, RequestData } from '../../../../common/models/input-models';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n setLookUpData: () => dispatch(Actions.getLookUpDataAsync()),\r\n setProjects: (condition: number) => dispatch(Actions.getAllFilteredProjectsAsync(condition)),\r\n setFilter: (filter: number) => dispatch(Actions.setProjectsFilter(filter)),\r\n setMatchedPatients: (searchData: PatientSearchData, projectName: string) => dispatch(Actions.updateSearchPatients(searchData, projectName)),\r\n setProjectById: (id: string) => dispatch(Actions.getProjectDataByIdAsync(id)),\r\n removePatient: (inputModel: ProjectPatientData) => dispatch(Actions.removePatientFromProjectAsync(inputModel)),\r\n addPatient: (inputModel: ProjectPatientData, searchData: PatientSearchData, projectName: string) => dispatch(Actions.addPatientToProjectAsync(inputModel, searchData, projectName)),\r\n changeProjectStatus: (id: string, filter: number) => dispatch(Actions.changeProjectStatusAsync(id, filter)),\r\n submitRequest: (data: RequestData) => dispatch(Actions.submitEmailDataAsync(data)),\r\n changePatientStatus: (inputModel: ProjectPatientData) => dispatch(Actions.changePatientStatusToConfirmAsync(inputModel)),\r\n getAllEmailTemplates: () => dispatch(Actions.getAllEmailTemplatesAsync()),\r\n getEmailTemplateByName: (name: string) => dispatch(Actions.getEmailTemplateByNameAsync(name))\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { CSVMappedField } from './csv-mapping-model';\r\n\r\nlet newMappedObj: any; // otherwise it gives an error\r\n\r\nexport const csvDataToJson = (data: any[], mapping: CSVMappedField[]) => {\r\n let mappedData = [];\r\n for (let i = 0; i < data.length; i++) {\r\n const patientInfo = data[i];\r\n newMappedObj = {};\r\n for (let j = 0; j < mapping.length; j++) {\r\n const mapItem = mapping[j];\r\n newMappedObj[mapItem.objectProperty] = patientInfo[mapItem.csvColumnName];\r\n }\r\n mappedData.push(newMappedObj);\r\n }\r\n\r\n return mappedData;\r\n};\r\n","import { defaultEmailTemplate, State } from './model';\r\nimport * as t from './actionTypes';\r\nimport { EmailTemplateData, LookUpData } from '../../../common/models/input-models';\r\nimport { Patient, Project } from '../../../common/models/main-models';\r\nimport { emptyProject } from '../../new-project/model';\r\n\r\nconst initialState: State = {\r\n projects: [],\r\n lookUpData: [],\r\n isLoading: false,\r\n isProjectsLoading: false,\r\n filter: 1,\r\n matchedPatients: [],\r\n isMatchedPatientsLoading: false,\r\n project: emptyProject,\r\n isProjectLoading: false,\r\n emailTemplates: [],\r\n singleEmailTemplate: defaultEmailTemplate,\r\n emailTemplateLoading: false\r\n};\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_LOADING:\r\n return setLoading(state, action.payload);\r\n case t.SET_LOOKUP_DATA:\r\n return setLookUpData(state, action.payload);\r\n case t.SET_PROJECTS_LOADING:\r\n return setProjectsLoading(state, action.payload);\r\n case t.SET_PROJECTS:\r\n return setProjects(state, action.payload);\r\n case t.SET_PROJECTS_FILTER:\r\n return setProjectsFilter(state, action.payload);\r\n case t.SET_MATCHED_PATIENTS:\r\n return setMatchedPatients(state, action.payload);\r\n case t.SET_MATCHED_PATIENTS_LOADING:\r\n return setMatchedPatientsLoading(state, action.payload);\r\n case t.SET_PROJECT_DATA:\r\n return setProjectData(state, action.payload);\r\n case t.SET_PROJECTS_LOADING:\r\n return setProjectLoading(state, action.payload);\r\n case t.SET_EMAIL_TEMPLATES:\r\n return setEmailTemplates(state, action.payload);\r\n case t.SET_SINGLE_EMAIL_TEMPLATE:\r\n return setSingleEmailTemplate(state, action.payload);\r\n case t.SET_TEMPLATES_LOADING:\r\n return setEmailTemplateLoading(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nconst setLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setLookUpData = (state: State, val: LookUpData[]): State => {\r\n let newState = {\r\n ...state,\r\n lookUpData: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setProjectsLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isProjectsLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setProjects = (state: State, val: Project[]): State => {\r\n let newState = {\r\n ...state,\r\n projects: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setProjectsFilter = (state: State, val: number): State => {\r\n let newState = {\r\n ...state,\r\n filter: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setMatchedPatients = (state: State, val: Patient[]): State => {\r\n let newState = {\r\n ...state,\r\n matchedPatients: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setMatchedPatientsLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isMatchedPatientsLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setProjectData = (state: State, val: Project): State => {\r\n let newState = {\r\n ...state,\r\n project: { ...val }\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setProjectLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isProjectLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setEmailTemplates = (state: State, val: EmailTemplateData[]): State => {\r\n let newState = {\r\n ...state,\r\n emailTemplates: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setSingleEmailTemplate = (state: State, val: EmailTemplateData): State => {\r\n let newState = {\r\n ...state,\r\n singleEmailTemplate: { ...val }\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setEmailTemplateLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n emailTemplateLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","// constants.ts\r\n\r\nexport const NAME = 'importPatients';","import { NAME } from \"./constants\";\r\n\r\nexport const SET_IS_DATA_SUBMITTED = `${NAME}/SET_IS_DATA_SUBMITTED`;\r\n\r\nexport const SET_LOOK_UP_DATA = `${NAME}/SET_LOOK_UP_DATA`;","import { LookUpData, PatientsImportData } from \"../../../common/models/input-models\";\r\nimport DataSvc from \"../../../common/services/data-svc\";\r\nimport * as t from './actionTypes';\r\n\r\nexport const setIsDataSubmitted = (isDataSubmitted: boolean) => ({\r\n type: t.SET_IS_DATA_SUBMITTED,\r\n payload: isDataSubmitted,\r\n});\r\n\r\nexport const setLookUpData = (lookUpData: LookUpData[]) => ({\r\n type: t.SET_LOOK_UP_DATA,\r\n payload: lookUpData\r\n});\r\n\r\nexport const submitMatchedDataAsync = (patientsData: PatientsImportData) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsDataSubmitted(false));\r\n DataSvc.patientSvc.importPatients(patientsData).then(\r\n (result: any) => {\r\n dispatch(setIsDataSubmitted(true));\r\n },\r\n (error) => {\r\n console.error(error);\r\n }\r\n )\r\n }\r\n}\r\n\r\nexport const getLookUpDataAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.utilsSvc.getLookUpData().then(\r\n (result: any) => {\r\n dispatch(setLookUpData(result));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}","import * as React from \"react\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport { FormGroup } from \"reactstrap\";\r\nimport { CSVMappedField } from \"./csv-mapping-model\";\r\nimport { Rules } from '../../helpers';\r\nimport { toast } from 'react-toastify';\r\n\r\ntype OwnProps = {\r\n csvObject: any;\r\n objectProperties: string[];\r\n mapping: CSVMappedField[];\r\n isOptionSelected: boolean;\r\n}\r\n\r\nexport type DispatchProps = {\r\n finishMapping: (mapping: any) => void;\r\n}\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\ntype OwnState = {\r\n mapping: CSVMappedField[];\r\n}\r\n\r\nexport default class CSVMappingComponent extends React.Component<Props, OwnState> {\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n mapping: []\r\n };\r\n\r\n this.selectMatchingCsvColumn = this.selectMatchingCsvColumn.bind(this);\r\n this.finishMapping = this.finishMapping.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({ mapping: this.props.mapping });\r\n }\r\n\r\n selectMatchingCsvColumn(value: any, key: any) {\r\n let mapping = this.state.mapping;\r\n\r\n let mapItem = mapping.filter((m) => m.objectProperty === key)[0];\r\n if (mapItem) {\r\n mapItem.csvColumnName = value;\r\n } else {\r\n mapping.push({\r\n objectProperty: key,\r\n csvColumnName: value,\r\n } as CSVMappedField);\r\n }\r\n\r\n this.setState({ mapping: mapping });\r\n }\r\n\r\n finishMapping() {\r\n if (!this.props.isOptionSelected) {\r\n toast.error(Rules.selectOptionMessage.required);\r\n }\r\n else {\r\n this.props.finishMapping(this.state.mapping);\r\n }\r\n }\r\n\r\n render() {\r\n\r\n let objPropsOptions = Object.keys(this.props.csvObject[0]).map((k, i) => {\r\n return (\r\n <option key={i} value={k}>\r\n {k.toLowerCase()}\r\n </option>\r\n );\r\n });\r\n\r\n let mappingComponent = this.props.objectProperties.map((p, i) => {\r\n let mapItem = this.state.mapping.filter(\r\n (m) => m.objectProperty === p\r\n )[0];\r\n\r\n if (!mapItem) {\r\n mapItem = {\r\n objectProperty: '',\r\n csvColumnName: ''\r\n };\r\n }\r\n\r\n return (\r\n <FormGroup key={i} className=\"mapping-item-wrapper\">\r\n <FormGroup className=\"mapping-item-object-property\">{p.toUpperCase()}</FormGroup>\r\n <FormGroup className=\"mapping-item-csv-column\">\r\n <select\r\n onChange={(event) =>\r\n this.selectMatchingCsvColumn(\r\n event.target.value,\r\n p\r\n )\r\n }\r\n className=\"blue-dropdown\"\r\n value={mapItem.csvColumnName}\r\n >\r\n <option value=\"\">-</option>\r\n {objPropsOptions}\r\n </select>\r\n </FormGroup>\r\n </FormGroup>\r\n );\r\n });\r\n\r\n return (\r\n <FormGroup id=\"mapping-wrapper\">\r\n {mappingComponent}\r\n <FormGroup className='mapping-item-wrapper'>\r\n <Button\r\n id=\"mapping-button\"\r\n className=\"btn-fmp\"\r\n onClick={this.finishMapping}\r\n >\r\n Finish Mapping\r\n </Button>\r\n </FormGroup>\r\n </FormGroup>\r\n )\r\n }\r\n}","// model.js\r\n// This is the model of our module state (e.g. return type of the reducer)\r\n\r\nimport { LookUpData } from \"../../../common/models/input-models\";\r\n\r\nexport type State = {\r\n isDataSubmitted: boolean;\r\n lookUpData: LookUpData[];\r\n};\r\n\r\nexport const ImportProperties = [\r\n 'firstName',\r\n 'lastName',\r\n 'phoneNumber',\r\n 'email',\r\n 'country',\r\n //'countryCode',\r\n 'condition',\r\n 'gender'\r\n];","import React, { useMemo } from 'react';\r\nimport { Table } from 'react-bootstrap';\r\nimport { useTable } from 'react-table';\r\n\r\ntype OwnProps = {\r\n importPatients: any[]\r\n};\r\n\r\ntype DispatchProps = {\r\n\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function ImportPreviewGrid(props: Props) {\r\n const data = useMemo(\r\n () => props?.importPatients.map((x: any, i: any) => {\r\n return x\r\n }), [props?.importPatients]\r\n )\r\n\r\n const columns = useMemo(\r\n () => [\r\n {\r\n Header: 'First name',\r\n accessor: 'firstName'\r\n },\r\n {\r\n Header: 'Surname',\r\n accessor: 'lastName'\r\n },\r\n {\r\n Header: 'Phone number',\r\n accessor: 'phoneNumber'\r\n },\r\n {\r\n Header: 'Email',\r\n accessor: 'email'\r\n },\r\n {\r\n Header: 'Country',\r\n accessor: 'country'\r\n },\r\n // {\r\n // Header: 'Country code',\r\n // accessor: 'countryCode'\r\n // },\r\n {\r\n Header: 'Condition',\r\n accessor: 'condition'\r\n },\r\n {\r\n Header: 'Gender',\r\n accessor: 'gender'\r\n }\r\n ], []\r\n )\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n rows,\r\n prepareRow,\r\n } = useTable({ columns, data })\r\n\r\n return (\r\n <Table {...getTableProps()} striped bordered hover>\r\n <thead>\r\n {headerGroups.map(headerGroup => (\r\n <tr {...headerGroup.getHeaderGroupProps()}>\r\n {headerGroup.headers.map(col => (\r\n <th {...col.getHeaderProps()}>\r\n {col.render('Header')}\r\n </th>\r\n ))}\r\n </tr>\r\n ))}\r\n </thead>\r\n <tbody {...getTableBodyProps()}>\r\n {rows.map(row => {\r\n prepareRow(row);\r\n return (\r\n <tr {...row.getRowProps()}>\r\n {row.cells.map(cell => {\r\n return (\r\n <td {...cell.getCellProps()}>\r\n {cell.render('Cell')}\r\n </td>\r\n )\r\n })}\r\n </tr>\r\n )\r\n })}\r\n </tbody>\r\n </Table>\r\n )\r\n}\r\n","import * as React from 'react';\r\nimport { State } from '../model';\r\nimport CSVReader, { IFileInfo } from 'react-csv-reader';\r\nimport '../style.scss';\r\nimport EupatiDropdown from '../../../../common/static/dropdown';\r\nimport { FormGroup } from 'reactstrap';\r\nimport {\r\n LookUpOptions,\r\n PatientsImportData,\r\n} from '../../../../common/models/input-models';\r\nimport { Rules } from '../../../../common/helpers';\r\nimport { Button, FormLabel } from 'react-bootstrap';\r\nimport CSVMappingComponent from '../../../../common/static/csv-import/csv-mapping';\r\nimport { ImportProperties } from '../model';\r\nimport { csvDataToJson } from '../../../../common/static/csv-import/csv-mapping-helper';\r\nimport ImportPreviewGrid from '../../../../common/static/import-preview-grid';\r\nimport { CSVMappedField } from '../../../../common/static/csv-import/csv-mapping-model';\r\nimport EupatiConfirmPage from '../../../../common/static/confirm-page';\r\n\r\ntype OwnProps = {};\r\n\r\nexport type DispatchProps = {\r\n submitPatientsData: (patientsData: PatientsImportData) => void;\r\n //getLookUpDate: () => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps;\r\n\r\ntype OwnState = {\r\n errorMessage: string;\r\n lookUpValue: any;\r\n data: any[];\r\n mapping: CSVMappedField[];\r\n isMappingMode: boolean;\r\n isPreviewMode: boolean;\r\n isOptionSelected: boolean;\r\n isDataSubmitted: boolean;\r\n};\r\n\r\n// ids are based on enum PatientExpertises\r\nconst lookUpOptions = [\r\n { id: 1, name: 'EUPATI Fellow' } as LookUpOptions,\r\n { id: 3, name: 'EUPATI Open Classroom Learner' } as LookUpOptions,\r\n { id: 2, name: 'National EUPATI Fellow' } as LookUpOptions,\r\n];\r\nexport default class ComponentRoot extends React.Component<Props, OwnState> {\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n errorMessage: Rules.selectOptionMessage.required,\r\n lookUpValue: { expertise: 0 },\r\n data: [],\r\n mapping: [],\r\n isMappingMode: true,\r\n isPreviewMode: false,\r\n isOptionSelected: false,\r\n isDataSubmitted: false,\r\n };\r\n\r\n this.csvImportTypeHandler = this.csvImportTypeHandler.bind(this);\r\n this.readCSVData = this.readCSVData.bind(this);\r\n this.handleReadingError = this.handleReadingError.bind(this);\r\n this.finishMapping = this.finishMapping.bind(this);\r\n this.activateMapping = this.activateMapping.bind(this);\r\n this.submitData = this.submitData.bind(this);\r\n }\r\n\r\n csvImportTypeHandler(e: any) {\r\n switch (e.target.value !== '') {\r\n case true:\r\n this.setState({\r\n errorMessage: '',\r\n lookUpValue: { expertise: parseInt(e.target.value) },\r\n isOptionSelected: true,\r\n });\r\n break;\r\n case false:\r\n this.setState({\r\n errorMessage: Rules.selectOptionMessage.required,\r\n lookUpValue: { expertise: 0 },\r\n isOptionSelected: false,\r\n data: [],\r\n });\r\n break;\r\n }\r\n }\r\n\r\n readCSVData(data: Array<any>, fileInfo: IFileInfo) {\r\n this.setState({ data: data });\r\n console.debug(fileInfo);\r\n }\r\n\r\n handleReadingError(err: any) {\r\n console.error(err);\r\n }\r\n\r\n finishMapping(mapping: any) {\r\n this.setState({\r\n mapping: mapping,\r\n isMappingMode: false,\r\n isPreviewMode: true,\r\n });\r\n }\r\n\r\n activateMapping() {\r\n this.setState({\r\n isMappingMode: true,\r\n isPreviewMode: false,\r\n });\r\n }\r\n\r\n submitData() {\r\n const mappedData = csvDataToJson(this.state.data, this.state.mapping);\r\n const patientExpertise = lookUpOptions.find(\r\n (l) => l.id === this.state.lookUpValue.expertise\r\n );\r\n mappedData.forEach((md: any) =>\r\n Object.assign(md, { expertise: patientExpertise })\r\n );\r\n this.props.submitPatientsData(mappedData as PatientsImportData);\r\n this.setState({\r\n isDataSubmitted: true,\r\n isMappingMode: false,\r\n isPreviewMode: false,\r\n isOptionSelected: false,\r\n });\r\n }\r\n\r\n render() {\r\n //Upload CSV UTF-8 (Comma delimited)\r\n let uploadCSVComponent: any;\r\n if (this.state.isOptionSelected) {\r\n let papaparseOptions = {\r\n header: true,\r\n dynamicTyping: true,\r\n skipEmptyLines: true,\r\n encoding: 'utf-8',\r\n transformHeader: (header: any) =>\r\n header.toLowerCase().replace(`/\\W/g`, '_'),\r\n };\r\n uploadCSVComponent = (\r\n <>\r\n <CSVReader\r\n cssClass=\"csv-reader-input\"\r\n label=\"Select CSV patients data\"\r\n onFileLoaded={(data, fileInfo) => this.readCSVData(data, fileInfo)}\r\n parserOptions={papaparseOptions}\r\n onError={this.handleReadingError}\r\n inputId=\"patients-csv-import\"\r\n inputName=\"patients-csv\"\r\n inputStyle={{ color: '#F0B72F', margin: 'auto' }}\r\n />\r\n <hr className=\"solid\" />\r\n </>\r\n );\r\n }\r\n\r\n //Column mapping\r\n let csvMappingComponent: any;\r\n if (this.state.data.length > 0 && this.state.isMappingMode) {\r\n let csvMappingProps = {\r\n csvObject: this.state.data,\r\n objectProperties: ImportProperties,\r\n mapping: this.state.mapping,\r\n finishMapping: (mapping: any) => this.finishMapping(mapping),\r\n isOptionSelected: this.state.isOptionSelected,\r\n };\r\n csvMappingComponent = <CSVMappingComponent {...csvMappingProps} />;\r\n }\r\n\r\n //Data preview\r\n let previewComponent: any;\r\n if (this.state.data.length > 0 && this.state.isPreviewMode) {\r\n let previewData;\r\n if (this.state.data.length > 10) {\r\n previewData = this.state.data.slice(0, 10);\r\n } else {\r\n previewData = this.state.data;\r\n }\r\n\r\n let mappedPreviewData = csvDataToJson(previewData, this.state.mapping);\r\n\r\n previewComponent = (\r\n <>\r\n <ImportPreviewGrid importPatients={mappedPreviewData} />\r\n <div className=\"d-flex\" id=\"importBtns\">\r\n <Button\r\n id=\"mapping-button\"\r\n className=\"btn-back\"\r\n onClick={this.activateMapping}\r\n >\r\n Go To Mapping\r\n </Button>\r\n <Button\r\n id=\"mapping-button\"\r\n className=\"btn\"\r\n onClick={this.submitData}\r\n >\r\n Upload Data\r\n </Button>\r\n </div>\r\n </>\r\n );\r\n }\r\n\r\n //Confirm page\r\n let confirmPage: any;\r\n if (this.state.isDataSubmitted) {\r\n confirmPage = (\r\n <>\r\n <EupatiConfirmPage />\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <FormGroup>\r\n {!this.state.isDataSubmitted && (\r\n <>\r\n <h4\r\n style={{\r\n textAlign: 'center',\r\n margin: '5rem auto auto auto',\r\n textDecoration: 'underline',\r\n fontWeight: 'bold',\r\n }}\r\n >\r\n IMPORT PATIENTS DATA\r\n </h4>\r\n <hr className=\"solid\" />\r\n <FormGroup className=\"import-pt-dropdown mb-5\">\r\n <FormLabel style={{ alignItems: 'center' }}>\r\n Select EUPATI Patient type\r\n </FormLabel>\r\n <EupatiDropdown\r\n {...{\r\n fieldName: 'csv-type',\r\n errorMsg: this.state.errorMessage,\r\n values: lookUpOptions,\r\n onChange: (e: any) => this.csvImportTypeHandler(e),\r\n defaultOptionText: '',\r\n width: 'auto',\r\n }}\r\n />\r\n </FormGroup>\r\n </>\r\n )}\r\n {uploadCSVComponent}\r\n {csvMappingComponent}\r\n {previewComponent}\r\n {confirmPage}\r\n </FormGroup>\r\n );\r\n }\r\n}\r\n","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport * as Actions from '../actions';\r\nimport { State } from '../model';\r\nimport { connect } from 'react-redux';\r\nimport { PatientsImportData } from '../../../../common/models/input-models';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n submitPatientsData: (patientsData: PatientsImportData) => dispatch(Actions.submitMatchedDataAsync(patientsData)),\r\n getLookUpDate: () => dispatch(Actions.getLookUpDataAsync())\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { State } from './model';\r\nimport * as t from './actionTypes';\r\nimport { LookUpData } from '../../../common/models/input-models';\r\n\r\nconst initialState: State = {\r\n isDataSubmitted: false,\r\n lookUpData: []\r\n};\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_IS_DATA_SUBMITTED:\r\n return setIsDataSubmitted(state, action.payload);\r\n case t.SET_LOOK_UP_DATA:\r\n return setLookUpData(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst setIsDataSubmitted = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isDataSubmitted: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setLookUpData = (state: State, val: LookUpData[]): State => {\r\n let newState = {\r\n ...state,\r\n lookUpData: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","// constants.ts\r\n\r\nexport const NAME = 'allPatients';","import { NAME } from \"./constants\";\r\n\r\nexport const SET_LOOKUP_DATA = `${NAME}/SET_LOOKUP_DATA`;\r\n\r\nexport const SET_LOADING = `${NAME}/SET_LOADING`;\r\n\r\nexport const SET_PATIENTS = `${NAME}/SET_PATIENTS`;\r\n\r\nexport const SET_PATIENTS_LOADING = `${NAME}/SET_PATIENTS_LOADING`;\r\n\r\nexport const REMOVE_PATIENT = `${NAME}/REMOVE_PATIENT`;\r\n\r\nexport const SET_PATIENT_INFO = `allPatient/SET_PATIENT_INFO`;\r\n\r\nexport const SET_PATIENT_INFO_LOADING = `allPatient/SET_PATIENT_INFO_LOADING`;","import { LookUpData } from \"../../../common/models/input-models\";\r\nimport { Patient } from \"../../../common/models/main-models\";\r\nimport DataSvc from \"../../../common/services/data-svc\";\r\nimport * as t from './actionTypes';\r\n\r\nexport const setLoading = (isLoading: boolean) => ({\r\n type: t.SET_LOADING,\r\n payload: isLoading\r\n});\r\n\r\nexport const setLookUpData = (data: LookUpData[]) => ({\r\n type: t.SET_LOOKUP_DATA,\r\n payload: data\r\n});\r\n\r\nexport const setPatients = (patients: Patient[]) => ({\r\n type: t.SET_PATIENTS,\r\n payload: [...patients]\r\n});\r\n\r\nexport const setIsPatientsLoading = (isPatientsLoading: boolean) => ({\r\n type: t.SET_PATIENTS_LOADING,\r\n payload: isPatientsLoading\r\n});\r\n\r\nexport const setPatientInfo = (patient: Patient) => ({\r\n type: t.SET_PATIENT_INFO,\r\n payload: patient\r\n});\r\n\r\nexport const setPatientInfoLoading = (isPatientInfoLoading: boolean) => ({\r\n type: t.SET_PATIENT_INFO_LOADING,\r\n payload: isPatientInfoLoading\r\n});\r\n\r\nexport const getLookUpDataAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setLoading(true));\r\n DataSvc.utilsSvc.getLookUpData().then(\r\n (result: any) => {\r\n dispatch(setLookUpData(result));\r\n dispatch(setLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n };\r\n};\r\n\r\nexport const getAllPatientsAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsPatientsLoading(true));\r\n DataSvc.patientSvc.getAllPatients().then(\r\n (result: any) => {\r\n dispatch(setPatients(result));\r\n dispatch(setIsPatientsLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const getPatientByIdAsync = (id: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setPatientInfoLoading(true));\r\n DataSvc.patientSvc.getPatientById(id).then(\r\n (result: any) => {\r\n dispatch(setPatientInfo(result));\r\n dispatch(setPatientInfoLoading(false));\r\n },\r\n (error) => { console.log(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const removePatientByIdAsync = (id: string) => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.patientSvc.getPatientById(id).then(\r\n (result: any) => {\r\n DataSvc.patientSvc.removePatient(result).then(\r\n () => {\r\n dispatch(getAllPatientsAsync());\r\n },\r\n (error) => { console.log(error); }\r\n )\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}","import React from 'react';\r\nimport { Button, Form } from 'react-bootstrap';\r\nimport Popup from 'reactjs-popup';\r\nimport './static.scss';\r\n\r\ntype OwnProps = {\r\n target: string;\r\n params: string;\r\n targetId: string;\r\n};\r\n\r\ntype DispatchProps = {\r\n handleRemove: (id: string, e: any) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function ConfirmDenyModal(props: Props) {\r\n return (\r\n <Popup\r\n className='modal'\r\n trigger={\r\n <Button variant='danger' className='modal-rm'>REMOVE</Button>\r\n }\r\n modal\r\n >\r\n {(close: any) => (\r\n <Form.Group>\r\n <button className='modal-close' onClick={close}>\r\n ×\r\n </button>\r\n <Form.Label className='modal-head'>Do you want to permanently delete this?</Form.Label>\r\n <Form.Group className='modal-core'>\r\n {' '}\r\n {`The following action will remove ${props.target.toLocaleUpperCase()} with ${props.params.toLocaleUpperCase()}`}\r\n </Form.Group>\r\n <Form.Group className='modal-actions'>\r\n <Button variant='success' onClick={(e: any) => props.handleRemove(props.targetId, e)} >CONFRIM</Button>\r\n <Button variant='secondary' onClick={close} >CANCEL</Button>\r\n </Form.Group>\r\n </Form.Group>\r\n )\r\n }\r\n </Popup >\r\n )\r\n}","import React, { useMemo, useState } from 'react';\r\nimport { Table } from 'react-bootstrap';\r\nimport {\r\n useTable,\r\n useGlobalFilter,\r\n usePagination,\r\n useSortBy,\r\n} from 'react-table';\r\nimport { Button, Form } from 'react-bootstrap';\r\nimport GlobalFilter from './global-filter';\r\nimport EupatiPatientDetails from './patient-details';\r\nimport './static.scss';\r\nimport EupatiLoader from './loading-animation/loader';\r\nimport { DiseaseInfo, Patient } from '../models/main-models';\r\nimport { LookUpData } from '../models/input-models';\r\nimport { useHistory } from 'react-router';\r\nimport { toast } from 'react-toastify';\r\nimport { REMOVE_PT_SUCC_MSG } from '../../common/helpers/messages';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport {\r\n faSortAlphaDown,\r\n faSortAlphaUp,\r\n faFileExcel,\r\n} from '@fortawesome/fontawesome-free-solid';\r\nimport { faWindowMinimize } from '@fortawesome/fontawesome-free-regular';\r\nimport { CSVLink } from 'react-csv';\r\nimport uniqid from 'uniqid';\r\nimport ConfirmDenyModal from './confirm-deny-modal';\r\n\r\ntype OwnProps = {\r\n lookUpData: LookUpData[];\r\n patients: Patient[];\r\n patientDetails: Patient;\r\n};\r\n\r\ntype DispatchProps = {\r\n removePatientById: (patientId: string) => void;\r\n showPatientDetails: (patientId: string) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nconst OUTLINE_PADDING_STYLE = {\r\n paddingLeft: '1.2rem',\r\n paddingRight: '1.2rem',\r\n};\r\nconst PRIMARY_PADDING_STYLE = {\r\n paddingLeft: '1.7rem',\r\n paddingRight: '1.7rem',\r\n};\r\nexport default function EupatiAllPatients(props: Props) {\r\n const history = useHistory();\r\n\r\n const [isDetailsBtnClicked, setIsDetailsBtnClicked] =\r\n useState<boolean>(false);\r\n\r\n const handleRemovePatient = (id: string, e: any) => {\r\n e.preventDefault();\r\n props.removePatientById(id);\r\n toast.success(REMOVE_PT_SUCC_MSG);\r\n };\r\n\r\n const handlePatientDetails = (id: string, e: any) => {\r\n e.preventDefault();\r\n setIsDetailsBtnClicked(true);\r\n props.showPatientDetails(id);\r\n };\r\n\r\n const backBtnHandler = () => {\r\n setIsDetailsBtnClicked(false);\r\n };\r\n\r\n const addBtnHandler = () => {\r\n history.push({\r\n pathname: '/patient',\r\n state: { isNewPatient: true },\r\n });\r\n };\r\n\r\n const returnValueById = (propName: string, projectPropId: number) => {\r\n let propType = props.lookUpData.find((x: any) => x.name == propName); // projectType\r\n let propValue = propType?.data.find((x: any) => x.id == projectPropId);\r\n return propValue?.name;\r\n };\r\n\r\n const headers = [\r\n { label: 'First Name', key: 'firstName' },\r\n { label: 'Last Name', key: 'lastName' },\r\n { label: 'Country', key: 'country' },\r\n { label: 'Diseases', key: 'diseases' },\r\n { label: 'Email', key: 'email' },\r\n { label: 'Expertises', key: 'expertises' },\r\n { label: 'Phone number', key: 'phone' },\r\n { label: 'Other Information', key: 'otherInformation' },\r\n { label: 'Gender', key: 'gender' },\r\n { label: 'Patient Experience', key: 'patientExperience' },\r\n { label: 'Activity Preference', key: 'activityPreference' },\r\n { label: 'Is Affiliated With Patient Org', key: 'isPOAffiliated' },\r\n { label: 'Is Eligible For Compensation', key: 'isEligibleForCompensation' },\r\n {\r\n label: 'Is Available Without Compensation',\r\n key: 'isAvailableForNoCompensation',\r\n },\r\n { label: 'Languages', key: 'languages' },\r\n { label: 'Project Preferences', key: 'projectPreferences' },\r\n { label: 'Project Experiences', key: 'projectTypeExperiences' },\r\n { label: 'Organisation Preferences', key: 'organisationPreferences' },\r\n { label: 'Countries With Experience', key: 'countriesWithExperience' },\r\n ];\r\n\r\n const data = useMemo(\r\n () =>\r\n props.patients?.map((x: any, i: any) => {\r\n return {\r\n //default grid cols\r\n id: x.id,\r\n firstName: x.firstName,\r\n lastName: x.lastName,\r\n country: returnValueById('country', x.countryId),\r\n diseases: x.noDiseaseExpertise\r\n ? 'No specific disease experience'\r\n : x.diseases?.map((d: any) => d.name).join(', '),\r\n email: x.email,\r\n expertises: x.patientExpertises\r\n .map((pe: number) => returnValueById('expertise', pe))\r\n .join(', '),\r\n //additional csv cols\r\n //single fields\r\n phone: `${x.phoneNumber}`,\r\n otherInformation: x.otherInformation?.replace(/\\r?\\n/g, ''),\r\n gender: returnValueById('genderType', x.genderTypeId),\r\n patientExperience: returnValueById(\r\n 'patientExperiense',\r\n x.patientExperienceId\r\n ),\r\n activityPreference: returnValueById(\r\n 'activityType',\r\n x.activityPreferenceId\r\n ),\r\n isPOAffiliated: x.isPOAffiliated ? 'Yes' : 'No',\r\n isEligibleForCompensation: x.isEligibleForCompensation ? 'Yes' : 'No',\r\n isAvailableForNoCompensation: x.isAvailableForNoCompensation\r\n ? 'Yes'\r\n : 'No',\r\n //collections\r\n projectPreferences: x.projectPreferences\r\n .map((pp: number) => returnValueById('projectType', pp))\r\n .join(', '),\r\n projectTypeExperiences: x.projectTypeExperiences\r\n .map((pte: number) => returnValueById('projectType', pte))\r\n .join(', '),\r\n organisationPreferences: x.organisationPreferences\r\n .map((op: number) => returnValueById('organisationType', op))\r\n .join(', '),\r\n countriesWithExperience: x.countriesWithExperience\r\n .map((c: string) => returnValueById('country', parseInt(c)))\r\n .join(', '),\r\n languages: x.languages\r\n .map((l: string) => returnValueById('language', parseInt(l)))\r\n .join(', '),\r\n matchedProjects: x.matchedProjects.length,\r\n confirmedProjects: x.confirmedProjects.length,\r\n };\r\n }),\r\n [props.patients]\r\n );\r\n\r\n const columns = useMemo(\r\n () => [\r\n {\r\n Header: 'Name',\r\n accessor: 'name', // accessor is the \"key\" in the data\r\n },\r\n {\r\n Header: 'Country',\r\n accessor: 'country',\r\n },\r\n {\r\n Header: 'Disease',\r\n accessor: 'diseases',\r\n },\r\n {\r\n Header: 'Email',\r\n accessor: 'email',\r\n },\r\n {\r\n Header: 'Expertises',\r\n accessor: 'expertises',\r\n },\r\n ],\r\n []\r\n );\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n // @ts-ignore\r\n page,\r\n rows,\r\n // @ts-ignore\r\n nextPage,\r\n // @ts-ignore\r\n previousPage,\r\n // @ts-ignore\r\n canNextPage,\r\n // @ts-ignore\r\n canPreviousPage,\r\n prepareRow,\r\n visibleColumns,\r\n // @ts-ignore\r\n pageOptions,\r\n // @ts-ignore\r\n gotoPage,\r\n // @ts-ignore\r\n pageCount,\r\n // @ts-ignore\r\n setPageSize,\r\n state,\r\n // @ts-ignore\r\n setGlobalFilter,\r\n } = useTable(\r\n {\r\n // @ts-ignore\r\n columns,\r\n data,\r\n // @ts-ignore\r\n initialState: { pageIndex: 0 },\r\n },\r\n useGlobalFilter,\r\n useSortBy,\r\n usePagination\r\n );\r\n // @ts-ignore\r\n const { globalFilter, pageSize, pageIndex } = state;\r\n\r\n let patientsDetailsComp: any;\r\n let loadComp = (\r\n <div className=\"loader-wrapper\">\r\n <EupatiLoader />\r\n </div>\r\n );\r\n\r\n function redirectToPatientsPage() {\r\n history.push({\r\n pathname: '/patient',\r\n state: {\r\n patientId: props.patientDetails.id,\r\n isNewPatient: false,\r\n },\r\n });\r\n }\r\n\r\n function returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n if (props.patientDetails.id === '') {\r\n patientsDetailsComp = loadComp;\r\n } else {\r\n patientsDetailsComp = (\r\n <EupatiPatientDetails\r\n {...{\r\n patientInfo: props.patientDetails,\r\n lookUpData: props.lookUpData,\r\n backBtnHandler: backBtnHandler,\r\n leftArrowText: 'all patients',\r\n rightArrowText: 'edit patient',\r\n forwardBtnHandler: redirectToPatientsPage,\r\n isForwardArrowAvail: true,\r\n }}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {isDetailsBtnClicked && <>{patientsDetailsComp}</>}\r\n {!isDetailsBtnClicked && (\r\n <>\r\n <h4 style={{ textAlign: 'center', textDecoration: 'underline' }}>\r\n PATIENTS\r\n </h4>\r\n <div className=\"table-btns\">\r\n <Button id=\"add-pt-btn\" onClick={addBtnHandler}>\r\n ADD PATIENT\r\n </Button>\r\n <span>\r\n <strong>{props.patients?.length}</strong> patients in total.\r\n </span>\r\n <CSVLink\r\n data={data}\r\n headers={headers}\r\n id=\"csv-download-btn\"\r\n filename={`${uniqid('patients-table-')}.csv`}\r\n className=\"btn btn-success\"\r\n >\r\n DOWNLOAD{' '}\r\n <FontAwesomeIcon icon={returnProperIconType(faFileExcel)} />\r\n </CSVLink>\r\n </div>\r\n <Table {...getTableProps()} striped bordered hover>\r\n <thead>\r\n {headerGroups.map((headerGroup) => (\r\n <tr {...headerGroup.getHeaderGroupProps()}>\r\n {headerGroup.headers.map((col) => (\r\n //@ts-ignore\r\n <th {...col.getHeaderProps(col.getSortByToggleProps())}>\r\n {col.render('Header')}\r\n <span>\r\n {\r\n /* @ts-ignore */\r\n col.isSorted ? (\r\n /* @ts-ignore */\r\n col.isSortedDesc ? (\r\n <FontAwesomeIcon\r\n icon={returnProperIconType(faSortAlphaDown)}\r\n />\r\n ) : (\r\n <FontAwesomeIcon\r\n icon={returnProperIconType(faSortAlphaUp)}\r\n />\r\n )\r\n ) : (\r\n <FontAwesomeIcon\r\n id=\"line\"\r\n icon={returnProperIconType(faWindowMinimize)}\r\n />\r\n )\r\n }\r\n </span>\r\n </th>\r\n ))}\r\n </tr>\r\n ))}\r\n <tr>\r\n <th\r\n colSpan={visibleColumns.length}\r\n style={{ textAlign: 'left' }}\r\n >\r\n <GlobalFilter\r\n filter={globalFilter}\r\n setFilter={setGlobalFilter}\r\n />\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody {...getTableBodyProps()}>\r\n {page.map((row: any) => {\r\n prepareRow(row);\r\n return (\r\n <tr {...row.getRowProps()}>\r\n {row.cells.map((cell: any) => {\r\n return (\r\n <td {...cell.getCellProps()}>{cell.render('Cell')}</td>\r\n );\r\n })}\r\n <>\r\n <td>\r\n <Button\r\n variant=\"info\"\r\n onClick={(e: any) =>\r\n handlePatientDetails(row.original.id, e)\r\n }\r\n >\r\n DETAILS\r\n </Button>\r\n </td>\r\n <td>\r\n <ConfirmDenyModal\r\n {...{\r\n targetId: row.original.id,\r\n target: 'patient',\r\n params: `email address - ${\r\n props.patients.find(\r\n (pt: Patient) => pt.id === row.original.id\r\n )?.email\r\n }`,\r\n handleRemove: handleRemovePatient,\r\n }}\r\n />\r\n {/* <Button\r\n variant='danger'\r\n onClick={(e: any) => handleRemovePatient(row.original.id, e)}\r\n >\r\n REMOVE\r\n </Button> */}\r\n </td>\r\n </>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </Table>\r\n <Form.Group\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n }}\r\n >\r\n <span>\r\n Page{' '}\r\n <strong>\r\n {pageIndex + 1} of {pageOptions.length}\r\n </strong>\r\n </span>\r\n <span>\r\n Go to page:{' '}\r\n <input\r\n type=\"number\"\r\n defaultValue={pageIndex + 1}\r\n min=\"1\"\r\n disabled={pageSize >= rows.length}\r\n onChange={(e) => {\r\n e.preventDefault();\r\n const pageNum = e.target.value\r\n ? Number(e.target.value) - 1\r\n : 0;\r\n gotoPage(pageNum);\r\n }}\r\n />\r\n </span>\r\n <select\r\n value={pageSize}\r\n onChange={(e) => setPageSize(e.target.value)}\r\n >\r\n {[10, 25, 50, 100].map((pageSize) => (\r\n <option key={pageSize} value={pageSize}>\r\n Show {pageSize}\r\n </option>\r\n ))}\r\n </select>\r\n <Button\r\n id=\"backToFirstPageBtn\"\r\n onClick={() => gotoPage(0)}\r\n disabled={!canPreviousPage}\r\n style={\r\n canPreviousPage\r\n ? { cursor: 'pointer', ...OUTLINE_PADDING_STYLE }\r\n : { cursor: 'not-allowed', ...OUTLINE_PADDING_STYLE }\r\n }\r\n className=\"btn btn-outline-dark btn-sm\"\r\n >\r\n {'<<'}\r\n </Button>\r\n <Button\r\n onClick={() => previousPage()}\r\n disabled={!canPreviousPage}\r\n style={\r\n canPreviousPage\r\n ? { cursor: 'pointer' }\r\n : { cursor: 'not-allowed' }\r\n }\r\n variant=\"secondary\"\r\n >\r\n Previous\r\n </Button>\r\n <Button\r\n onClick={() => nextPage()}\r\n disabled={!canNextPage}\r\n style={\r\n canNextPage\r\n ? { cursor: 'pointer', ...PRIMARY_PADDING_STYLE }\r\n : { cursor: 'not-allowed', ...PRIMARY_PADDING_STYLE }\r\n }\r\n variant=\"primary\"\r\n >\r\n Next\r\n </Button>\r\n <Button\r\n id=\"gotoLastPageBtn\"\r\n onClick={() => gotoPage(pageCount - 1)}\r\n disabled={!canNextPage}\r\n style={\r\n canNextPage\r\n ? { cursor: 'pointer', ...OUTLINE_PADDING_STYLE }\r\n : { cursor: 'not-allowed', ...OUTLINE_PADDING_STYLE }\r\n }\r\n className=\"btn btn-outline-dark btn-sm\"\r\n >\r\n {'>>'}\r\n </Button>\r\n </Form.Group>\r\n </>\r\n )}\r\n </>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\nimport EupatiLoader from '../../../../common/static/loading-animation/loader';\r\nimport EupatiAllPatients from '../../../../common/static/patients-grid';\r\nimport { State } from '../model';\r\nimport '../style.scss';\r\n\r\ntype OwnProps = {};\r\n\r\nexport type DispatchProps = {\r\n setLookUpData: () => void;\r\n setPatients: () => void;\r\n removePatientById: (patientId: string) => void;\r\n setPatientInfo: (patientId: string) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps;\r\n\r\ntype OwnState = {};\r\n\r\nexport default class ComponentRoot extends React.Component<Props, OwnState> {\r\n\r\n componentDidMount() {\r\n this.props.setPatients();\r\n this.props.setLookUpData();\r\n }\r\n\r\n render() {\r\n\r\n let mainComponent: any;\r\n\r\n let loadingComponent = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n )\r\n\r\n if (this.props.isLoading ||\r\n this.props.isPatientsLoading) {\r\n mainComponent = loadingComponent;\r\n }\r\n else {\r\n mainComponent = (\r\n <Form.Group id='all-patients-tbl' className='all-patients-wrapper mb-5'>\r\n <EupatiAllPatients\r\n {...{\r\n lookUpData: this.props.lookUpData,\r\n patients: this.props.patients,\r\n removePatientById: this.props.removePatientById,\r\n showPatientDetails: this.props.setPatientInfo,\r\n patientDetails: this.props.patientInfo\r\n }}\r\n />\r\n </Form.Group>\r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {mainComponent}\r\n </>\r\n );\r\n }\r\n}","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport * as Actions from '../actions';\r\nimport { State } from '../model';\r\nimport { connect } from 'react-redux';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n setLookUpData: () => dispatch(Actions.getLookUpDataAsync()),\r\n setPatients: () => dispatch(Actions.getAllPatientsAsync()),\r\n removePatientById: (patientId: string) => dispatch(Actions.removePatientByIdAsync(patientId)),\r\n setPatientInfo: (patientId: string) => dispatch(Actions.getPatientByIdAsync(patientId))\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { State } from './model';\r\nimport * as t from './actionTypes';\r\nimport { LookUpData } from '../../../common/models/input-models';\r\nimport { Patient } from '../../../common/models/main-models';\r\nimport { defaultPatientInfo } from '../../patient-profile/model';\r\n\r\nconst initialState: State = {\r\n patients: [],\r\n lookUpData: [],\r\n isLoading: false,\r\n isPatientsLoading: false,\r\n isPatientInfoLoading: false,\r\n patientInfo: defaultPatientInfo\r\n};\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_LOADING:\r\n return setLoading(state, action.payload);\r\n case t.SET_LOOKUP_DATA:\r\n return setLookUpData(state, action.payload);\r\n case t.SET_PATIENTS_LOADING:\r\n return setPatientsLoading(state, action.payload);\r\n case t.SET_PATIENTS:\r\n return setPatients(state, action.payload);\r\n case t.SET_PATIENT_INFO_LOADING:\r\n return setPatientInfoLoading(state, action.payload);\r\n case t.SET_PATIENT_INFO:\r\n return setPatientInfo(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nconst setLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setLookUpData = (state: State, val: LookUpData[]): State => {\r\n let newState = {\r\n ...state,\r\n lookUpData: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setPatientsLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isPatientsLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setPatients = (state: State, val: Patient[]): State => {\r\n let newState = {\r\n ...state,\r\n patients: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setPatientInfoLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isPatientInfoLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setPatientInfo = (state: State, val: Patient): State => {\r\n let newState = {\r\n ...state,\r\n patientInfo: { ...val }\r\n } as State;\r\n\r\n return newState;\r\n}\r\n","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","// constants.ts\r\n\r\nexport const NAME = 'allAdmins';","import { NAME } from \"./constants\";\r\n\r\nexport const SET_ADMINS_LOADING = `${NAME}/SET_ADMINS_LOADING`;\r\n\r\nexport const SET_ADMINS = `${NAME}/SET_ADMINS`;","import { User } from '../../../common/models/main-models';\r\nimport DataSvc from '../../../common/services/data-svc';\r\nimport * as t from './actionTypes';\r\n\r\nexport const setIsAdminsLoading = (isAdminsLoading: boolean) => ({\r\n type: t.SET_ADMINS_LOADING,\r\n payload: isAdminsLoading,\r\n});\r\n\r\nexport const setAdmins = (admins: User[]) => ({\r\n type: t.SET_ADMINS,\r\n payload: [...admins],\r\n});\r\n\r\nexport const getAllAdminsAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsAdminsLoading(true));\r\n DataSvc.usersSvc.getAllAdmins().then(\r\n (result: any) => {\r\n dispatch(setAdmins(result));\r\n dispatch(setIsAdminsLoading(false));\r\n },\r\n (error) => {\r\n console.error(error);\r\n }\r\n );\r\n };\r\n};\r\n\r\nexport const removeAdminAsync = (id: string, ownerId: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsAdminsLoading(true));\r\n DataSvc.usersSvc.getEupatiUserById(ownerId).then(\r\n (result: any) => {\r\n DataSvc.usersSvc.removeAdmin({ id: id, email: '' } as User).then(\r\n () => {\r\n dispatch(getAllAdminsAsync());\r\n dispatch(setIsAdminsLoading(false));\r\n },\r\n (error) => {\r\n console.error(error);\r\n }\r\n );\r\n },\r\n (error) => {\r\n console.error(error);\r\n }\r\n );\r\n };\r\n};\r\n\r\nexport const approveAdminAsync = (id: string, ownerId: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsAdminsLoading(true));\r\n DataSvc.usersSvc.getAdminById(ownerId).then(\r\n (result: any) => {\r\n DataSvc.usersSvc.approveAdmin({ id: id, email: '' } as User).then(\r\n () => {\r\n dispatch(getAllAdminsAsync());\r\n dispatch(setIsAdminsLoading(false));\r\n },\r\n (error) => {\r\n console.error(error);\r\n }\r\n );\r\n },\r\n (error) => {\r\n console.error(error);\r\n }\r\n );\r\n };\r\n};\r\n","import React, { useMemo, useContext } from 'react';\r\nimport { Button } from 'react-bootstrap';\r\nimport { useTable, useGlobalFilter, usePagination } from 'react-table';\r\nimport { Table } from 'reactstrap';\r\nimport { User } from '../models/main-models';\r\nimport GlobalFilter from './global-filter';\r\nimport { toast } from 'react-toastify';\r\nimport {\r\n REMOVE_ADMIN_SUCC_MSG,\r\n APPROVE_ADMIN_SUCC_MSG,\r\n} from '../../common/helpers/messages';\r\nimport AuthenticationContext from '../../common/static/auth-context';\r\nimport './static.scss';\r\nimport { Roles } from '../helpers';\r\nimport ConfirmDenyModal from './confirm-deny-modal';\r\n\r\ntype OwnProps = {\r\n admins: User[];\r\n};\r\n\r\ntype DispatchProps = {\r\n removeAdmin: (id: string, ownerId: string) => void;\r\n approveAdmin: (id: string, ownerId: string) => void;\r\n};\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function EupatiAllAdminsGrid(props: Props) {\r\n const contextData = useContext(AuthenticationContext);\r\n\r\n const handleOnRemove = (id: string, event: any) => {\r\n event.preventDefault();\r\n props.removeAdmin(id, contextData.userIdentity);\r\n toast.success(REMOVE_ADMIN_SUCC_MSG);\r\n };\r\n\r\n const handleOnApprove = (id: string, event: any) => {\r\n event.preventDefault();\r\n props.approveAdmin(id, contextData.userIdentity);\r\n toast.success(APPROVE_ADMIN_SUCC_MSG);\r\n };\r\n\r\n const data = useMemo(\r\n () =>\r\n props?.admins?.map((x: any, i: any) => {\r\n return {\r\n id: x.id,\r\n email: x.email,\r\n role: x.role,\r\n };\r\n }),\r\n [props?.admins]\r\n );\r\n\r\n const columns = useMemo(\r\n () => [\r\n {\r\n Header: 'Email',\r\n accessor: 'email',\r\n },\r\n ],\r\n []\r\n );\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups, // columns Header\r\n rows, // render data based on accessor\r\n // @ts-ignore\r\n page,\r\n prepareRow,\r\n // @ts-ignore\r\n visibleColumns,\r\n // @ts-ignore\r\n state,\r\n // @ts-ignore\r\n setGlobalFilter,\r\n } = useTable(\r\n {\r\n // @ts-ignore\r\n columns,\r\n data,\r\n },\r\n useGlobalFilter,\r\n usePagination\r\n );\r\n // @ts-ignore\r\n const { globalFilter, pageSize, pageIndex } = state;\r\n\r\n return (\r\n <>\r\n <h4\r\n style={{\r\n textAlign: 'center',\r\n textDecoration: 'underline',\r\n margin: '5rem auto 2.5rem auto',\r\n }}\r\n >\r\n ADMINS\r\n </h4>\r\n <Table {...getTableProps()} striped bordered hover>\r\n <thead>\r\n {headerGroups.map((headerGroup) => (\r\n <tr {...headerGroup.getHeaderGroupProps()}>\r\n {headerGroup.headers.map((col) => (\r\n <th {...col.getHeaderProps()}>{col.render('Header')}</th>\r\n ))}\r\n </tr>\r\n ))}\r\n <tr>\r\n <th colSpan={visibleColumns.length} style={{ textAlign: 'left' }}>\r\n <GlobalFilter filter={globalFilter} setFilter={setGlobalFilter} />\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody {...getTableBodyProps()}>\r\n {page.map((row: any) => {\r\n prepareRow(row);\r\n return (\r\n <tr {...row.getRowProps()}>\r\n {row.cells.map((cell: any) => {\r\n return (\r\n <td {...cell.getCellProps()}>{cell.render('Cell')}</td>\r\n );\r\n })}\r\n <>\r\n {props.admins\r\n .find((a) => a.id === row.original.id)\r\n ?.role.toUpperCase() === Roles.Member && (\r\n <td>\r\n <Button\r\n variant=\"success\"\r\n onClick={(e: any) =>\r\n handleOnApprove(row.original.id, e)\r\n }\r\n >\r\n APPROVE\r\n </Button>\r\n </td>\r\n )}\r\n <td>\r\n <ConfirmDenyModal\r\n {...{\r\n targetId: row.original.id,\r\n target: 'admin',\r\n params: `email - ${\r\n props.admins.find(\r\n (a: User) => a.id === row.original.id\r\n )?.email\r\n }`,\r\n handleRemove: handleOnRemove,\r\n }}\r\n />\r\n {/* <Button\r\n variant=\"danger\"\r\n onClick={(e: any) => handleOnRemove(row.original.id, e)}\r\n >\r\n REMOVE\r\n </Button> */}\r\n </td>\r\n </>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </Table>\r\n </>\r\n );\r\n}\r\n","import React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\nimport EupatiAllAdminsGrid from '../../../../common/static/admins-grid';\r\nimport EupatiLoader from '../../../../common/static/loading-animation/loader';\r\nimport { State } from '../model';\r\nimport '../style.scss';\r\n\r\ntype OwnProps = {};\r\n\r\nexport type DispatchProps = {\r\n setAdminsData: () => void;\r\n removeAdminData: (id: string, ownerId: string) => void;\r\n approveAdmin: (id: string, ownerId: string) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps;\r\n\r\ntype OwnState = {};\r\n\r\nconst HtmlToReactParser = require('html-to-react').Parser;\r\nexport default class ComponentRoot extends React.Component<Props, OwnState> {\r\n componentDidMount() {\r\n this.props.setAdminsData();\r\n }\r\n\r\n render() {\r\n let mainComp: any;\r\n\r\n let loadComp = (\r\n <div className=\"loader-wrapper\">\r\n <EupatiLoader />\r\n </div>\r\n );\r\n\r\n if (this.props.isAdminsLoading) {\r\n mainComp = loadComp;\r\n } else {\r\n mainComp = (\r\n <Form.Group id=\"all-admins-tbl\" className=\"all-admins-wrapper mb-5\">\r\n <EupatiAllAdminsGrid\r\n {...{\r\n admins: this.props?.admins,\r\n removeAdmin: this.props?.removeAdminData,\r\n approveAdmin: this.props?.approveAdmin,\r\n }}\r\n />\r\n </Form.Group>\r\n );\r\n }\r\n\r\n return <>{mainComp}</>;\r\n }\r\n}\r\n","import {\r\n default as RootComponent,\r\n DispatchProps,\r\n} from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport * as Actions from '../actions';\r\nimport { State } from '../model';\r\nimport { connect } from 'react-redux';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n setAdminsData: () => dispatch(Actions.getAllAdminsAsync()),\r\n removeAdminData: (id: string, ownerId: string) =>\r\n dispatch(Actions.removeAdminAsync(id, ownerId)),\r\n approveAdmin: (id: string, ownerId: string) =>\r\n dispatch(Actions.approveAdminAsync(id, ownerId)),\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);\r\n","import { User } from \"../../../common/models/main-models\";\r\nimport { State } from \"./model\";\r\nimport * as t from './actionTypes';\r\n\r\nconst initialState: State = {\r\n admins: [],\r\n isAdminsLoading: false\r\n}\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_ADMINS_LOADING:\r\n return setAdminsLoading(state, action.payload);\r\n case t.SET_ADMINS:\r\n return setAdmins(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nconst setAdminsLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isAdminsLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setAdmins = (state: State, val: User[]): State => {\r\n let newState = {\r\n ...state,\r\n admins: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","// constants.ts\r\n\r\nexport const NAME = 'contentEditor';","import { NAME } from \"./constants\";\r\n\r\nexport const SET_CONTENT_LOADING = `${NAME}/SET_CONTENT_LOADING`;\r\n\r\nexport const SET_CONTENT_RESPONSE = `${NAME}/SET_CONTENT_RESPONSE`;","import { ContentData, ContentResponse } from '../../../common/models/input-models';\r\nimport DataSvc from '../../../common/services/data-svc';\r\nimport * as t from './actionTypes';\r\n\r\nexport const setContentLoading = (isContentLoading: boolean) => ({\r\n type: t.SET_CONTENT_LOADING,\r\n payload: isContentLoading\r\n});\r\n\r\nexport const setContentResponse = (contentResponse: ContentResponse) => ({\r\n type: t.SET_CONTENT_RESPONSE,\r\n payload: { ...contentResponse }\r\n});\r\n\r\nexport const getContentByNameAsync = (name: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setContentLoading(true));\r\n DataSvc.utilsSvc.getContent(name).then(\r\n (result: any) => {\r\n dispatch(setContentResponse(result));\r\n dispatch(setContentLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const updateContentAsync = (contentData: ContentData) => {\r\n return (dispatch: any, getState: any) => {\r\n try {\r\n DataSvc.utilsSvc.updateContent(contentData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n}","import React, { useRef } from 'react';\r\nimport { Editor } from '@tinymce/tinymce-react';\r\nimport { ContentData } from '../models/input-models';\r\nimport { useHistory } from 'react-router';\r\nimport { toast } from 'react-toastify';\r\nimport { Button } from 'react-bootstrap';\r\n\r\ntype OwnProps = {\r\n content: string; // default state\r\n pageName: string; // privacy or terms\r\n}\r\n\r\nexport type DispatchProps = {\r\n updateContent: (data: ContentData) => void;\r\n}\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nexport default function TinyMCEditor(props: Props) {\r\n const history = useHistory();\r\n const editorRef = useRef(null);\r\n const submit = () => {\r\n if (editorRef.current) {\r\n props.updateContent({\r\n name: props.pageName,\r\n rawDraftContent: '',\r\n //@ts-ignore\r\n htmlContent: editorRef.current.getContent()\r\n } as ContentData);\r\n toast.success(`You have successfully updated the ${props.pageName.toUpperCase()} content.`);\r\n setTimeout(() => {\r\n history.push(`/${props.pageName.toLowerCase()}`);\r\n }, 200);\r\n }\r\n };\r\n return (\r\n <>\r\n <Editor\r\n //@ts-ignore\r\n onInit={(evt, editor) => (editorRef.current) = editor}\r\n initialValue={props.content}\r\n apiKey=\"gi5vdpb46pw329w18n94luc6ne2yimgpjks785wd387s2qvu\"\r\n init={{\r\n height: 500,\r\n convert_urls: true,\r\n relative_urls: false,\r\n remove_script_host: false,\r\n menubar: 'file edit view insert format tools table',\r\n plugins: [\r\n 'advlist autolink lists link image charmap print preview anchor',\r\n 'searchreplace visualblocks code fullscreen',\r\n 'insertdatetime media table paste code wordcount'\r\n ],\r\n toolbar: 'undo redo | formatselect | ' +\r\n 'bold italic backcolor | alignleft aligncenter ' +\r\n 'alignright alignjustify | bullist numlist outdent indent | accordion |' +\r\n 'removeformat',\r\n setup: function (editor) {\r\n editor.ui.registry.addButton('accordion', {\r\n text: 'Collapsible',\r\n onAction: function (_) {\r\n editor.insertContent(' <details> <summary>CHANGE THE TITLE</summary> <p>CHANGE THE CONTENT</p></details> ');\r\n }\r\n });\r\n },\r\n content_style: 'body {font-family:Helvetica,Arial,sans-serif; font-size:18px }'\r\n }}\r\n />\r\n <div id='editor-btns'>\r\n <Button variant='secondary' onClick={() => history.push(`/${props.pageName.toLowerCase()}`)} >{`BACK TO ${props.pageName.toUpperCase()}`}</Button>\r\n <Button variant='primary' onClick={submit}>SAVE</Button>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport EupatiLoader from '../../../../common/static/loading-animation/loader';\r\nimport { State } from '../models';\r\nimport EupatiRichTextEditor from '../../../../common/static/text-editor';\r\nimport { ContentData, ContentResponse } from '../../../../common/models/input-models';\r\nimport { RouteComponentProps } from '@reach/router';\r\nimport { History } from 'history';\r\nimport \"react-draft-wysiwyg/dist/react-draft-wysiwyg.css\";\r\nimport TinyMCEditor from '../../../../common/static/tinymce-editor';\r\n\r\ntype OwnProps = {\r\n isContentLoading: boolean,\r\n contentResponse: ContentResponse,\r\n history: History\r\n};\r\n\r\nexport type DispatchProps = {\r\n getContent: (name: string) => void;\r\n updateContent: (data: ContentData) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps & RouteComponentProps<{ location: { state: { pageName: string } } }>;\r\n\r\ntype OwnState = {};\r\n\r\n//raw draft content:\r\n//`{\"blocks\": [{\"key\": \"fl66k\",\"text\": \"asdasdasdasd\",\"type\": \"unstyled\",\"depth\": 0,\"inlineStyleRanges\": [],\"entityRanges\": [],\"data\": {}}],\"entityMap\": {}}`,\r\nexport default class ComponentRoot extends React.Component<Props, OwnState> {\r\n\r\n componentDidMount() {\r\n if (this.props.location?.state.pageName !== undefined) {\r\n this.props.getContent(this.props.location?.state.pageName);\r\n }\r\n }\r\n\r\n render() {\r\n\r\n let mainComp: any;\r\n\r\n let loadComp = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n )\r\n\r\n if (this.props.isContentLoading ||\r\n this.props.location?.state.pageName === undefined) {\r\n mainComp = loadComp;\r\n }\r\n else {\r\n mainComp = (\r\n // <EupatiRichTextEditor\r\n // {...{\r\n // pageName: this.props?.location?.state.pageName !== undefined ? this.props.location?.state.pageName : '',\r\n // content: this.props?.contentResponse?.rawDraftContent !== undefined ? this.props.contentResponse.rawDraftContent : '',\r\n // updateContent: this.props?.updateContent,\r\n // history: this.props.history\r\n // }}\r\n // />\r\n <TinyMCEditor\r\n {...{\r\n pageName: this.props?.location?.state.pageName !== undefined ? this.props.location?.state.pageName : '',\r\n content: this.props?.contentResponse?.htmlContent !== undefined ? this.props.contentResponse.htmlContent : '',\r\n updateContent: this.props?.updateContent\r\n }}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {mainComp}\r\n </>\r\n )\r\n }\r\n}","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport { State } from '../models';\r\nimport * as Actions from '../actions';\r\nimport { ContentData } from '../../../../common/models/input-models';\r\nimport { connect } from 'react-redux';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n getContent: (name: string) => dispatch(Actions.getContentByNameAsync(name)),\r\n updateContent: (data: ContentData) => dispatch(Actions.updateContentAsync(data))\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { blankResponse, State } from \"./models\";\r\nimport * as t from './actionTypes';\r\nimport { ContentResponse } from \"../../../common/models/input-models\";\r\n\r\nconst initialState: State = {\r\n isContentLoading: false,\r\n contentResponse: blankResponse\r\n}\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_CONTENT_LOADING:\r\n return setContentLoading(state, action.payload);\r\n case t.SET_CONTENT_RESPONSE:\r\n return setContentResponse(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nconst setContentLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isContentLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setContentResponse = (state: State, val: ContentResponse): State => {\r\n let newState = {\r\n ...state,\r\n contentResponse: { ...val }\r\n } as State;\r\n\r\n return newState;\r\n}","// model.js\r\n// This is the model of our module state (e.g. return type of the reducer)\r\n\r\nimport { ContentResponse } from \"../../../common/models/input-models\";\r\n\r\nexport type State = {\r\n isContentLoading: boolean;\r\n contentResponse: ContentResponse;\r\n}\r\n\r\nexport const blankResponse = {\r\n rawDraftContent: '',\r\n htmlContent: ''\r\n} as ContentResponse;","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","// constants.ts\r\n\r\nexport const NAME = 'priceCatalog';","import { NAME } from './constants';\r\n\r\nexport const SET_IS_CATALOGS_LOADING = `${NAME}/SET_IS_CATALOGS_LOADING`;\r\n\r\nexport const SET_CATALOGS_DATA = `${NAME}/SET_CATALOGS_DATA`;","import { Messages } from '../../../common/helpers';\r\nimport { CatalogData } from '../../../common/models/input-models';\r\nimport DataSvc from '../../../common/services/data-svc';\r\nimport * as t from './actionTypes';\r\n\r\nexport const setIsCatalogsLoading = (isCatalogsLoading: boolean) => ({\r\n type: t.SET_IS_CATALOGS_LOADING,\r\n payload: isCatalogsLoading\r\n});\r\n\r\nexport const setCatalogsData = (catalogsData: CatalogData[]) => ({\r\n type: t.SET_CATALOGS_DATA,\r\n payload: catalogsData\r\n});\r\n\r\nexport const getCatalogsPricesAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsCatalogsLoading(true));\r\n DataSvc.utilsSvc.getPriceCatalogs().then(\r\n (result: any) => {\r\n dispatch(setCatalogsData(result));\r\n dispatch(setIsCatalogsLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const updateCatalogsPricesAsync = (data: CatalogData[]) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsCatalogsLoading(true));\r\n DataSvc.utilsSvc.updatePriceCatalogs(data).then(\r\n (result: any) => {\r\n dispatch(getCatalogsPricesAsync());\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}","export const CATALOG_TYPES = {\r\n Basic: 'Basic',\r\n TailorMade: 'TailorMade'\r\n};\r\n\r\nexport const CATEGORY_NAMES = {\r\n Researcher: 'ExternalResearcher',\r\n Industry: 'IndustryPartner',\r\n Academia: 'AcademiaPartner'\r\n};\r\n\r\nexport const OPTION_NAMES = {\r\n Network: 'NetworkOption',\r\n Mentorship: 'MentorshipOption'\r\n};\r\n\r\nexport const CONVERTED_NAMES = {\r\n // based on pricing excel spreadsheet\r\n AcademiaPartner: 'EUPATI Partner - Academic',\r\n IndustryPartner: 'EUPATI Partner - Industry',\r\n ExternalResearcher: 'External Researcher',\r\n NetworkOption: 'External Networks Option',\r\n MentorshipOption: 'Mentorship Option',\r\n TailorMadeType: 'Tailor-Made'\r\n}","import * as React from 'react';\r\nimport { Button, Table } from 'react-bootstrap';\r\nimport { CatalogData, CategoryData, OptionData } from '../models/input-models';\r\nimport { CATALOG_TYPES, CATEGORY_NAMES, CONVERTED_NAMES, OPTION_NAMES } from '../../common/helpers/pricing-list';\r\nimport { toast } from 'react-toastify';\r\nimport { SAVED_NEW_PRICES_MSG, INVALID_NUMERIC_INPUT, CANCEL_PRICES_UPDATE } from '../helpers/messages';\r\n\r\ntype OwnProps = {\r\n catalogsData: CatalogData[]\r\n};\r\n\r\nexport type DispatchProps = {\r\n setCatalogsPrices: () => void\r\n updateCatalogsPrices: (data: CatalogData[]) => void;\r\n};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nexport default function EupatiPricesGrid(props: Props) {\r\n\r\n const [isEditBtnClicked, setIsEditBtnClicked] = React.useState<boolean>(false);\r\n const [tempData, setTempData] = React.useState<CatalogData[]>([...props.catalogsData]);\r\n\r\n function onEditRowHandler(e: any) {\r\n e.preventDefault();\r\n setIsEditBtnClicked(true);\r\n }\r\n\r\n function onCancelOperationHandler(e: any) {\r\n e.preventDefault();\r\n toast.info(CANCEL_PRICES_UPDATE);\r\n setTimeout(() => {\r\n setIsEditBtnClicked(false);\r\n props.setCatalogsPrices();\r\n }, 100);\r\n }\r\n\r\n function onChangeBasePriceHandler(e: any, val: any, categoryIndex: number, catalogIndex: number) {\r\n e.preventDefault();\r\n if (isNaN(val.basePrice)) { return toast.error(INVALID_NUMERIC_INPUT); }\r\n const updatedData = Object.assign(tempData[catalogIndex].categoryOptionsData[categoryIndex], val);\r\n Object.assign(tempData[catalogIndex].categoryOptionsData[categoryIndex], updatedData);\r\n setTempData([...tempData]);\r\n }\r\n\r\n function onChangeOptionsPriceHandler(e: any, val: any, catalogIndex: number, categoryIndex: number, optionIndex: number) {\r\n e.preventDefault();\r\n if (isNaN(val.price)) { return toast.error(INVALID_NUMERIC_INPUT); }\r\n const updatedData = Object.assign(tempData[catalogIndex].categoryOptionsData[categoryIndex].additionalOptionsData[optionIndex], val);\r\n Object.assign(tempData[catalogIndex].categoryOptionsData[categoryIndex].additionalOptionsData[optionIndex], updatedData);\r\n setTempData([...tempData]);\r\n }\r\n\r\n function onSaveStateHandler(e: any) {\r\n e.preventDefault();\r\n toast.success(SAVED_NEW_PRICES_MSG);\r\n props.updateCatalogsPrices(tempData);\r\n setIsEditBtnClicked(false);\r\n }\r\n\r\n function formatNumber(num: number) {\r\n return (Math.round(num * 100) / 100).toFixed(2);\r\n }\r\n\r\n function convertCategoriesNames(name: string) {\r\n switch (name) {\r\n case CATEGORY_NAMES.Academia:\r\n return `${CONVERTED_NAMES.AcademiaPartner}`\r\n case CATEGORY_NAMES.Industry:\r\n return `${CONVERTED_NAMES.IndustryPartner}`\r\n case CATEGORY_NAMES.Researcher:\r\n return `${CONVERTED_NAMES.ExternalResearcher}`\r\n default:\r\n return ''\r\n }\r\n }\r\n\r\n function convertOptionsNames(category: string, name: string) {\r\n switch (name) {\r\n case OPTION_NAMES.Network:\r\n return `${category.concat(` with ${CONVERTED_NAMES.NetworkOption}`)}`\r\n case OPTION_NAMES.Mentorship:\r\n return `${category.concat(` with ${CONVERTED_NAMES.MentorshipOption}`)}`\r\n default:\r\n return ''\r\n }\r\n }\r\n\r\n function convertCatalogTypesNames(name: string) {\r\n switch (name) {\r\n case CATALOG_TYPES.Basic:\r\n return `${CATALOG_TYPES.Basic}`\r\n case CATALOG_TYPES.TailorMade:\r\n return `${CONVERTED_NAMES.TailorMadeType}`\r\n default:\r\n return ''\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <h4 style={{ textAlign: 'center', textDecoration: 'underline', margin: '5rem auto auto auto' }} >PRICING DASHBOARD</h4>\r\n <div style={isEditBtnClicked === false ? { display: 'flex', justifyContent: 'center', alignItems: 'center' } : { display: 'flex', justifyContent: 'space-evenly', alignItems: 'center' }}>\r\n {isEditBtnClicked === true ? (\r\n <Button onClick={onCancelOperationHandler}>Exit</Button>\r\n ) : (\r\n <Button onClick={onEditRowHandler}>Edit</Button>\r\n )}\r\n <Button onClick={onSaveStateHandler} style={isEditBtnClicked === false ? { display: 'none' } : { display: 'block' }} >Save</Button>\r\n </div>\r\n <Table striped bordered hover>\r\n <thead>\r\n <tr>\r\n <th>Type</th>\r\n <th>Category</th>\r\n <th>Price</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {tempData.map((data: CatalogData, catalogIndex: number) => {\r\n return (\r\n <React.Fragment key={catalogIndex + 'a'}>\r\n <tr style={{ fontWeight: 'bolder', textDecoration: 'underline', backgroundColor: '#113D7C', color: '#fff' }}>\r\n <td>\r\n {`${convertCatalogTypesNames(data.type)}`}\r\n </td>\r\n <td></td>\r\n <td></td>\r\n </tr>\r\n <React.Fragment key={catalogIndex + 'b'}>\r\n {data.categoryOptionsData.map((category: CategoryData, categoryIndex: number) => {\r\n return (\r\n <React.Fragment key={categoryIndex + 'c'}>\r\n <tr>\r\n <td></td>\r\n <td>\r\n {`${convertCategoriesNames(category.name)}`}\r\n </td>\r\n {isEditBtnClicked &&\r\n <td>\r\n <input type='text' value={category.basePrice} onChange={(e: any) => onChangeBasePriceHandler(e, { basePrice: parseFloat(e.target.value) }, categoryIndex, catalogIndex)} />\r\n </td>\r\n }\r\n {!isEditBtnClicked &&\r\n <td>\r\n {formatNumber(category.basePrice)}\r\n </td>\r\n }\r\n </tr>\r\n {\r\n category.additionalOptionsData.map((option: OptionData, optionIndex: number) => {\r\n return (\r\n <React.Fragment key={optionIndex + 'd'}>\r\n <tr>\r\n <td></td>\r\n <td>\r\n {convertOptionsNames(convertCategoriesNames(category.name), option.name)}\r\n </td>\r\n {isEditBtnClicked &&\r\n <td>\r\n <input type='text' value={option.price} onChange={(e: any) => onChangeOptionsPriceHandler(e, { price: parseFloat(e.target.value) }, catalogIndex, categoryIndex, optionIndex)} />\r\n </td>\r\n }\r\n {!isEditBtnClicked &&\r\n <td>\r\n {formatNumber(option.price)}\r\n </td>\r\n }\r\n </tr>\r\n </React.Fragment>\r\n )\r\n })\r\n }\r\n {category.additionalOptionsData.length > 0 &&\r\n <tr style={{ fontWeight: 'bold', backgroundColor: '#F0B72F' }}>\r\n <td></td>\r\n <td>\r\n {`${convertCategoriesNames(category.name)} ${(category.additionalOptionsData.map(x => convertOptionsNames('', x.name)).join(' and ')).trim()}`}\r\n </td>\r\n <td>\r\n {formatNumber(category.totalPrice)}\r\n </td>\r\n </tr>\r\n }\r\n </React.Fragment>\r\n )\r\n })}\r\n </React.Fragment>\r\n </React.Fragment>\r\n )\r\n })}\r\n </tbody>\r\n </Table>\r\n </>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { Form } from 'react-bootstrap';\r\nimport { CatalogData } from '../../../../common/models/input-models';\r\nimport EupatiLoader from '../../../../common/static/loading-animation/loader';\r\nimport EupatiPricesGrid from '../../../../common/static/prices-grid';\r\nimport { State } from '../model';\r\nimport '../style.scss';\r\n\r\ntype OwnProps = {\r\n isCatalogsLoading: boolean;\r\n catalogsData: CatalogData[]\r\n};\r\n\r\nexport type DispatchProps = {\r\n setCatalogsPrices: () => void;\r\n updateCatalogsPrices: (data: CatalogData[]) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps;\r\n\r\ntype OwnState = {};\r\n\r\nexport default class ComponentRoot extends React.Component<Props, OwnState> {\r\n\r\n componentDidMount() {\r\n this.props.setCatalogsPrices();\r\n }\r\n\r\n render() {\r\n\r\n let mainComp: any;\r\n\r\n let loadComp = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n )\r\n\r\n if (this.props.isCatalogsLoading) {\r\n mainComp = loadComp;\r\n }\r\n else {\r\n mainComp = (\r\n <Form.Group id='price-catalog-tbl' className='price-catalog-wrapper mb-5'>\r\n <EupatiPricesGrid\r\n {...{\r\n catalogsData: this.props.catalogsData,\r\n setCatalogsPrices: this.props.setCatalogsPrices,\r\n updateCatalogsPrices: this.props.updateCatalogsPrices\r\n }}\r\n />\r\n </Form.Group>\r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {mainComp}\r\n </>\r\n )\r\n }\r\n}","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport * as Actions from '../actions';\r\nimport { State } from '../model';\r\nimport { connect } from 'react-redux';\r\nimport { CatalogData } from '../../../../common/models/input-models';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n setCatalogsPrices: () => dispatch(Actions.getCatalogsPricesAsync()),\r\n updateCatalogsPrices: (data: CatalogData[]) => dispatch(Actions.updateCatalogsPricesAsync(data))\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { State } from \"./model\";\r\nimport * as t from './actionTypes';\r\nimport { CatalogData } from \"../../../common/models/input-models\";\r\n\r\nconst initialState: State = {\r\n isCatalogsLoading: false,\r\n catalogsData: []\r\n}\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_IS_CATALOGS_LOADING:\r\n return setIsCatalogsLoading(state, action.payload);\r\n case t.SET_CATALOGS_DATA:\r\n return setCatalogsData(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nconst setIsCatalogsLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isCatalogsLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setCatalogsData = (state: State, val: CatalogData[]): State => {\r\n let newState = {\r\n ...state,\r\n catalogsData: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","// constants.ts\r\n\r\nexport const NAME = 'pricingPage';","import { NAME } from \"./constants\";\r\n\r\nexport const SET_PRICING_LOADING = `${NAME}/SET_PRICING_LOADING`;\r\n\r\nexport const SET_PRICING_LOGGED_IN = `${NAME}/SET_PRICING_LOGGED_IN`;\r\n\r\nexport const SET_IS_USER_REAL = `${NAME}/SET_IS_USER_REAL`;\r\n\r\nexport const SET_IS_USER_ADMIN = `${NAME}/SET_IS_USER_ADMIN`;\r\n\r\nexport const SET_CATALOGS_DATA = `${NAME}/SET_CATALOGS_DATA`;","// matching/actions.js\r\n\r\nimport DataSvc from '../../common/services/data-svc';\r\nimport * as t from './actionType';\r\nimport { Res } from '../../common/helpers';\r\nimport { CatalogData } from '../../common/models/input-models';\r\n\r\nexport const setPricingLoading = (isLoading: boolean) => ({\r\n type: t.SET_PRICING_LOADING,\r\n payload: isLoading,\r\n});\r\n\r\nexport const setPricingLoggedInStatus = (isLoggedIn: boolean) => ({\r\n type: t.SET_PRICING_LOGGED_IN,\r\n payload: isLoggedIn\r\n});\r\n\r\nexport const setIsUserReal = (isUserReal: boolean) => ({\r\n type: t.SET_IS_USER_REAL,\r\n payload: isUserReal\r\n});\r\n\r\nexport const setIsUserAdmin = (isUserAdmin: boolean) => ({\r\n type: t.SET_IS_USER_ADMIN,\r\n payload: isUserAdmin\r\n});\r\n\r\nexport const setCatalogsData = (data: CatalogData[]) => ({\r\n type: t.SET_CATALOGS_DATA,\r\n payload: data\r\n});\r\n\r\nexport const verifyUserTokenAsync = (token: string) => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.utilsSvc.verifyUserByRecaptchaToken({ recaptchaToken: token }).then(\r\n (result: any) => {\r\n if (result !== Res.success) {\r\n dispatch(setIsUserReal(false));\r\n }\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n }\r\n}\r\n\r\nexport const getCatalogsPricesDataAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setPricingLoading(true));\r\n DataSvc.utilsSvc.getPriceCatalogs().then(\r\n (result: any) => {\r\n dispatch(setCatalogsData(result));\r\n dispatch(setPricingLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEDSURBVHgBlZDBTcNgDIXfb3qBC84G7QZ0AugFFXHpBqQTQCdomACYoGxAOQDlVDZoNoAN8gMXLo15riIUQhH0SZGj2H5+X4CGigdtv87UWFOskWBDSXGvg9/c6lffH/XC38PbTOcGHARgujSMVi4Bz6VhiA9MWzs4LYEzGLRcoiscGrJ5zqWBD24FjH2JdV+2sWAvM0NeCrrJccxD/SxLxqWTWpqcC6PkKD6thaarNeIrn/Z36BtVAo1FsOB0yrxXKzgyVTwTck6qBBDmnH/lNHR449IbZLvd7cdOxZc6X3Gne0IYh+5pP/aY9aURCfyWuZH/NYduJYcxxx+qjK5/QP9Hn3hDcJ1fpbEAAAAAAElFTkSuQmCC\"","import React, { useEffect, useState } from 'react';\r\nimport { Accordion, Button, Card, Form } from 'react-bootstrap';\r\nimport astericsImg from '../../../../images/pricing/asterics.png';\r\nimport { CategoryData } from '../../../common/models/input-models';\r\nimport { faChevronDown, faChevronUp, faCheck } from '@fortawesome/fontawesome-free-solid';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { useHistory } from 'react-router';\r\nimport { CATALOG_TYPES } from '../../../common/helpers/pricing-list';\r\nimport { INVALID_PRICING_DATA, INVALID_PAYMENT_METHOD } from '../../../common/helpers/messages';\r\nimport { toast } from 'react-toastify';\r\n\r\ntype OwnProps = {\r\n basicPlanCategories: CategoryData[],\r\n paymentMethods: string[]\r\n};\r\n\r\nexport type DispatchProps = {\r\n returnIcon: (icon: any) => IconProp;\r\n convertCategoriesNames: (name: string) => string;\r\n};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\ntype SelectedOptionData = {\r\n price: number,\r\n plan: string,\r\n text: string,\r\n index: number,\r\n bgColor: string\r\n}\r\n\r\nconst DEFAULT_COLOR_SELECTED = '#00A4B6';\r\nexport default function BasicPlanComponent(props: Props) {\r\n const history = useHistory();\r\n\r\n const [selectedOption, setSelectedOption] = useState<SelectedOptionData>({ price: -1, plan: CATALOG_TYPES.Basic, text: '', index: -1, bgColor: DEFAULT_COLOR_SELECTED });\r\n const [icon, setIcon] = useState<IconProp>(faChevronDown as IconProp);\r\n const [paymentIcon, setPaymentIcon] = useState<IconProp>(faChevronUp as IconProp);\r\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState<string>('');\r\n const [defaultPaymentMethod, setDefaultPaymentMethod] = useState<string>('');\r\n\r\n useEffect(() => {\r\n setDefaultPaymentMethod(props.paymentMethods.find(pm => pm.toLowerCase().includes('invoice'))!);//component-root state\r\n }, []);\r\n\r\n function priceChanged(price: number, categoryName: string, categoryIndex: number) {\r\n const updatedState = Object.assign(selectedOption, { price: price, text: categoryName, index: categoryIndex });\r\n setSelectedOption({ ...updatedState });\r\n }\r\n\r\n function toggleIcons() {\r\n if (icon === props.returnIcon(faChevronDown)) {\r\n setIcon(props.returnIcon(faChevronUp));\r\n setPaymentIcon(props.returnIcon(faChevronDown));\r\n }\r\n else {\r\n setIcon(props.returnIcon(faChevronDown));\r\n setPaymentIcon(props.returnIcon(faChevronDown));\r\n }\r\n }\r\n\r\n function updatePaymentMethodOnClick(method: string) {\r\n if (selectedOption.price === -1) {\r\n toast.error(INVALID_PRICING_DATA);\r\n return;\r\n }\r\n setSelectedPaymentMethod(method);\r\n }\r\n\r\n function reverseToggleIcon() {\r\n if (paymentIcon === props.returnIcon(faChevronUp)) {\r\n setPaymentIcon(props.returnIcon(faChevronDown));\r\n setIcon(props.returnIcon(faChevronDown));\r\n }\r\n else {\r\n setPaymentIcon(props.returnIcon(faChevronUp));\r\n setIcon(props.returnIcon(faChevronDown));\r\n }\r\n }\r\n\r\n const selectedOptionStyle = {\r\n backgroundColor: selectedOption.bgColor,\r\n color: '#ffffff'\r\n };\r\n\r\n const submitBtn = (\r\n <div className='pricing-plan-card-submit-button'>\r\n <Button\r\n variant='primary'\r\n type='submit'\r\n className='submit-btn'\r\n onClick={() => {\r\n if (selectedOption.price < 0 || selectedOption.text === '') {\r\n return toast.error(INVALID_PRICING_DATA);\r\n }\r\n else if (selectedPaymentMethod === '') {\r\n return toast.error(INVALID_PAYMENT_METHOD);\r\n }\r\n history.push({\r\n pathname: '/new-project',\r\n state: {\r\n price: selectedOption.price,\r\n plan: selectedOption.plan,\r\n package: props.convertCategoriesNames(selectedOption.text),\r\n paymentMethod: selectedPaymentMethod\r\n }\r\n });\r\n //if they wanna pay via invoice\r\n //redirect directly to new project page\r\n //cos our stripe implementation works only with cards\r\n // switch (selectedPaymentMethod === defaultPaymentMethod) {\r\n // case true:\r\n // history.push({\r\n // pathname: '/new-project',\r\n // state: {\r\n // price: selectedOption.price,\r\n // plan: selectedOption.plan,\r\n // package: props.convertCategoriesNames(selectedOption.text),\r\n // paymentMethod: selectedPaymentMethod\r\n // }\r\n // });\r\n // break;\r\n // default:\r\n // history.push({\r\n // pathname: '/payment',\r\n // state: {\r\n // price: selectedOption.price,\r\n // plan: selectedOption.plan,\r\n // package: props.convertCategoriesNames(selectedOption.text),\r\n // paymentMethod: selectedPaymentMethod\r\n // }\r\n // });\r\n // break;\r\n // }\r\n }}\r\n >\r\n Submit Your Request\r\n </Button>\r\n </div >\r\n );\r\n\r\n const pricingCard = (\r\n <Card>\r\n <Card.Header style={{ marginBottom: '0.5rem', borderRadius: '4px' }}>\r\n <Accordion.Toggle as={Button} variant=\"link\" eventKey=\"0\" onClick={toggleIcons}>\r\n Pricing\r\n <FontAwesomeIcon icon={props.returnIcon(icon)} />\r\n </Accordion.Toggle>\r\n\r\n </Card.Header>\r\n <Accordion.Collapse eventKey=\"0\">\r\n <Card.Body>\r\n {props?.basicPlanCategories?.map((category: CategoryData, categoryIndex: number) => {\r\n return (\r\n <Form.Group\r\n key={categoryIndex + 'a'}\r\n style={selectedOption.index === categoryIndex ? { ...selectedOptionStyle } : {}}\r\n onClick={() => priceChanged(category.basePrice, category.name, categoryIndex)}\r\n >\r\n <Form.Label id='cat-price'>{`€\t${category.basePrice}`}</Form.Label>\r\n <Form.Label id='cat-name' >{props.convertCategoriesNames(category.name)}</Form.Label>\r\n </Form.Group>\r\n )\r\n })}\r\n </Card.Body>\r\n </Accordion.Collapse>\r\n </Card>\r\n );\r\n\r\n const paymentOptions = (\r\n <>\r\n {selectedOption.price === 0 ? (\r\n <Form.Group\r\n key={69420 + 'b'}\r\n >\r\n <div\r\n className='payments-wrapper'\r\n style={selectedPaymentMethod === defaultPaymentMethod ? { ...selectedOptionStyle } : {}}\r\n onClick={() => updatePaymentMethodOnClick(defaultPaymentMethod)}\r\n >\r\n <div className='payment-check'>\r\n <FontAwesomeIcon icon={props.returnIcon(faCheck)} style={selectedPaymentMethod === defaultPaymentMethod ? { position: 'relative', top: '0', left: '0', color: '#fff' } : { position: 'relative', top: '0', left: '0' }} />\r\n </div>\r\n <Form.Label id='cat-name'>{defaultPaymentMethod}</Form.Label>\r\n </div>\r\n </Form.Group>\r\n ) : (\r\n <>\r\n {props.paymentMethods.map((method: string, methodIndex: number) => {\r\n return (\r\n <Form.Group\r\n key={methodIndex + 'b'}\r\n //id={`${method.toLowerCase().includes('card') ? 'disabled-option-cursor' : ''}`}\r\n >\r\n <div\r\n className='payments-wrapper'\r\n //id={`${method.toLowerCase().includes('card') ? 'disabled-option-events' : ''}`}\r\n style={selectedPaymentMethod === method ? { ...selectedOptionStyle } : {}}\r\n onClick={() => updatePaymentMethodOnClick(method)}\r\n >\r\n <div className='payment-check'>\r\n <FontAwesomeIcon icon={props.returnIcon(faCheck)} style={selectedPaymentMethod === method ? { position: 'relative', top: '0', left: '0', color: '#fff' } : { position: 'relative', top: '0', left: '0' }} />\r\n </div>\r\n <Form.Label id='cat-name'>{method}</Form.Label>\r\n </div>\r\n </Form.Group>\r\n )\r\n })}\r\n </>\r\n )}\r\n </>\r\n )\r\n\r\n const paymentsCard = (\r\n <Card>\r\n <Card.Header id='payment-card-header' style={{ marginBottom: '0.5rem', borderRadius: '4px' }}>\r\n <Accordion.Toggle as={Button} variant=\"link\" eventKey=\"1\" onClick={reverseToggleIcon}>\r\n Payment method\r\n <FontAwesomeIcon icon={props.returnIcon(paymentIcon)} />\r\n </Accordion.Toggle>\r\n </Card.Header>\r\n <Accordion.Collapse eventKey=\"1\">\r\n <Card.Body style={{ border: '0' }}>\r\n {paymentOptions}\r\n </Card.Body>\r\n </Accordion.Collapse>\r\n </Card>\r\n );\r\n\r\n const submitBasic = (\r\n <>\r\n <Accordion defaultActiveKey=\"0\">\r\n {pricingCard}\r\n {paymentsCard}\r\n </Accordion>\r\n <div className='pricing-plan-card-submit'>\r\n {submitBtn}\r\n <div className='pricing-plan-card-submit-note'>\r\n <img src={astericsImg} className='pricing-plan-card-submit-note-asterics' />\r\n <strong>Over 90% of our requests have been successfully matched.</strong> However, please note that EUPATI cannot guarantee a successful matching result.\r\n </div>\r\n </div>\r\n </>\r\n );\r\n\r\n return <div className='pricing-plan'>\r\n <div className='pricing-plan-card pricing-plan-basic' style={{ paddingTop: '15px' }}>\r\n {selectedOption.text !== '' &&\r\n <div className='d-flex' style={{ minHeight: '1px' }}>\r\n <div className='pricing-plan-card-pricebox'>{'€ ' + selectedOption.price}</div>\r\n <div className='pricing-plan-card-pricetitle'>{props.convertCategoriesNames(selectedOption.text)}</div>\r\n </div>\r\n }\r\n {selectedOption.text === '' &&\r\n <div className='d-flex' style={{ minHeight: '1px' }}>\r\n <div className='pricing-plan-card-plantitle'>Basic Plan</div>\r\n </div>\r\n }\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-description'>\r\n Are you are looking for a EUPATI Patient Expert and happy to manage the process of selecting the right patient for your project among a pool of matched individuals? Select the basic plan - we can connect you with patient experts corresponding to the requested profile and you can take it from there.\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n Search\r\n </div>\r\n <div className='pricing-plan-card-benefit-description'>\r\n We will search over 200+ EUPATI Fellows along with our EUPATI Open Classroom Learners to find the right Patient Expert for you.\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n Match\r\n </div>\r\n <div className='pricing-plan-card-benefit-description'>\r\n We will share your request with our matched Patient Experts.\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n Connect\r\n </div>\r\n <div className='pricing-plan-card-benefit-description'>\r\n Our interested Patient Experts will contact you directly.\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n Co-Create!\r\n </div>\r\n <div className='pricing-plan-card-benefit-description'>\r\n You and your matched Patients Experts can start working together straight away.\r\n </div>\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card pricing-plan-basic pricing-plan-card-2'>\r\n {submitBasic}\r\n </div>\r\n </div>;\r\n}","import React, { useEffect, useState } from 'react';\r\nimport { Accordion, Button, Card, Form } from 'react-bootstrap';\r\nimport { CategoryData, OptionData } from '../../../common/models/input-models';\r\nimport astericsImg from '../../../../images/pricing/asterics.png';\r\nimport { faCheck, faChevronDown, faChevronUp, faSquare } from '@fortawesome/fontawesome-free-solid';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { CATALOG_TYPES, CATEGORY_NAMES } from '../../../common/helpers/pricing-list';\r\nimport { INVALID_PRICING_DATA, INVALID_PAYMENT_METHOD } from '../../../common/helpers/messages';\r\nimport { useHistory } from 'react-router';\r\nimport { toast } from 'react-toastify';\r\n\r\ntype OwnProps = {\r\n tailorMadePlanCategories: CategoryData[],\r\n paymentMethods: string[]\r\n};\r\n\r\nexport type DispatchProps = {\r\n returnIcon: (icon: any) => IconProp;\r\n convertCategoriesNames: (name: string) => string;\r\n convertOptionsNames: (name: string) => string;\r\n};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\ntype SelectedOptionData = {\r\n price: number,\r\n text: string[],\r\n plan: string,\r\n index: number,\r\n bgColor: string,\r\n additionals: AdditionalsData[]\r\n}\r\n\r\ntype AdditionalsData = {\r\n name: string,\r\n price: number\r\n}\r\n\r\nconst DEFAULT_COLOR_SELECTED = '#00A4B6';\r\nconst DEFAULT_OPTIONS_MENU = ['Mentorship Option', 'External Networks Option']; // if these ever change blame Tech0\r\nconst SELECT_PRICING_WARNING = 'Please first select pricing option';\r\nexport default function TailorMadeComponent(props: Props) {\r\n const history = useHistory();\r\n\r\n const [selectedOption, setSelectedOption] = useState<SelectedOptionData>({ price: -1, text: [], plan: CATALOG_TYPES.TailorMade, index: -1, bgColor: DEFAULT_COLOR_SELECTED, additionals: [] });\r\n const [icon, setIcon] = useState<IconProp>(faChevronDown as IconProp);\r\n const [paymentIcon, setPaymentIcon] = useState<IconProp>(faChevronUp as IconProp);\r\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState<string>('');\r\n const [defaultPaymentMethod, setDefaultPaymentMethod] = useState<string>('');\r\n\r\n useEffect(() => {\r\n setDefaultPaymentMethod(props.paymentMethods.find(pm => pm.toLowerCase().includes('invoice'))!);//component-root state\r\n }, []);\r\n\r\n function updateStateOnClick(price: number, categoryName: string, categoryIndex: number) {\r\n // calls only when selecting category (ExternalResearcher, IndustryPartner, AcademiaPartner)\r\n const updatedText = [categoryName];\r\n setSelectedOption({ price: price, text: updatedText, plan: CATALOG_TYPES.TailorMade, index: categoryIndex, additionals: [], bgColor: DEFAULT_COLOR_SELECTED });\r\n }\r\n\r\n function removeItemFromAdditionals(option: AdditionalsData) {\r\n const updatedAdditionals = selectedOption.additionals.filter(x => x.name !== option.name);\r\n const updatedText = selectedOption.text.filter(x => x !== option.name);\r\n setSelectedOption({\r\n price: selectedOption.price -= option.price,\r\n text: updatedText,\r\n plan: CATALOG_TYPES.TailorMade,\r\n index: selectedOption.index,\r\n bgColor: selectedOption.bgColor,\r\n additionals: updatedAdditionals\r\n });\r\n }\r\n\r\n function addItemToAdditionals(option: AdditionalsData) {\r\n const updatedAdditionals = selectedOption.additionals.concat(option);\r\n const updatedText = selectedOption.text.concat(option.name);\r\n setSelectedOption({\r\n price: selectedOption.price += option.price,\r\n text: updatedText,\r\n plan: CATALOG_TYPES.TailorMade,\r\n index: selectedOption.index,\r\n bgColor: selectedOption.bgColor,\r\n additionals: updatedAdditionals\r\n });\r\n }\r\n\r\n function updateAdditionalOptionsOnClick(option: AdditionalsData) {\r\n selectedOption.additionals.some(x => x.name === option.name) ? removeItemFromAdditionals(option) : addItemToAdditionals(option);\r\n }\r\n\r\n function updatePaymentMethodOnClick(method: string) {\r\n if (selectedOption.price === -1) {\r\n toast.error(INVALID_PRICING_DATA);\r\n return;\r\n }\r\n setSelectedPaymentMethod(method);\r\n }\r\n\r\n function toggleIcons() {\r\n /*\r\n down --> open\r\n up --> close\r\n */\r\n if (icon === props.returnIcon(faChevronDown)) {\r\n setIcon(props.returnIcon(faChevronUp));\r\n setPaymentIcon(props.returnIcon(faChevronDown));\r\n }\r\n else {\r\n setIcon(props.returnIcon(faChevronDown));\r\n setPaymentIcon(props.returnIcon(faChevronDown));\r\n }\r\n }\r\n\r\n function reverseToggleIcon() {\r\n if (paymentIcon === props.returnIcon(faChevronUp)) {\r\n setPaymentIcon(props.returnIcon(faChevronDown));\r\n setIcon(props.returnIcon(faChevronDown));\r\n }\r\n else {\r\n setPaymentIcon(props.returnIcon(faChevronUp));\r\n setIcon(props.returnIcon(faChevronDown));\r\n }\r\n }\r\n\r\n function displayCategoryNameWithOptions() {\r\n let result = '';\r\n const categoryName = selectedOption.text.find(x => Object.values(CATEGORY_NAMES).some(name => name.toLowerCase() === x.toLowerCase()));\r\n if (categoryName) {\r\n // \"NetworkOption\"--> \"External Networks Option\" --> \"External Networks\" (convert names based on xlsx and extract 'Option' due to repetitiveness)\r\n const optionNames = selectedOption.text.filter(x => x !== categoryName).map(x => props.convertOptionsNames(x)).map(x => x.replace('Option', '').trim());\r\n // \"External Researcher\" --> \"External Researcher with\" (depends on whether optionNames.length > 0)\r\n result = optionNames.length > 0 ? `${props.convertCategoriesNames(categoryName)} with ` : `${props.convertCategoriesNames(categoryName)}`;\r\n // \"Mentorship\" --> \"Mentorship and External Networks\" (depends on whether optionNames.length > 1)\r\n optionNames.length > 1 ? result += `${optionNames.join(' and ')}` : optionNames.forEach(o => result += `${o}`);\r\n }\r\n\r\n return result.trim();\r\n }\r\n\r\n const selectedOptionStyle = {\r\n backgroundColor: selectedOption.bgColor,\r\n color: '#ffffff'\r\n };\r\n\r\n const submitBtn = (\r\n <div className='pricing-plan-card-submit-button'>\r\n <Button\r\n variant='primary'\r\n type='submit'\r\n className='submit-btn'\r\n onClick={() => {\r\n if (selectedOption.price < 0 || selectedOption.text.length === 0) {\r\n return toast.error(INVALID_PRICING_DATA);\r\n }\r\n else if (selectedPaymentMethod === '') {\r\n return toast.error(INVALID_PAYMENT_METHOD);\r\n }\r\n history.push({\r\n pathname: '/new-project',\r\n state: {\r\n price: selectedOption.price,\r\n plan: selectedOption.plan,\r\n package: displayCategoryNameWithOptions(),\r\n paymentMethod: selectedPaymentMethod\r\n }\r\n });\r\n //if they wanna pay via invoice\r\n //redirect directly to new project page\r\n //cos our stripe implementation works only with cards\r\n // switch (selectedPaymentMethod === defaultPaymentMethod) {\r\n // case true:\r\n // history.push({\r\n // pathname: '/new-project',\r\n // state: {\r\n // price: selectedOption.price,\r\n // plan: selectedOption.plan,\r\n // package: displayCategoryNameWithOptions(),\r\n // paymentMethod: selectedPaymentMethod\r\n // }\r\n // });\r\n // break;\r\n // default:\r\n // history.push({\r\n // pathname: '/payment',\r\n // state: {\r\n // price: selectedOption.price,\r\n // plan: selectedOption.plan,\r\n // package: displayCategoryNameWithOptions(),\r\n // paymentMethod: selectedPaymentMethod\r\n // }\r\n // });\r\n // break;\r\n // }\r\n }}\r\n >\r\n Submit Your Request\r\n </Button>\r\n </div>\r\n );\r\n\r\n const categoriesCard = (\r\n <Card style={{ padding: '34px 26px 0px 26px' }}>\r\n <Card.Header style={{ marginBottom: '0.5rem', borderRadius: '4px' }}>\r\n <Accordion.Toggle as={Button} variant=\"link\" eventKey=\"0\" onClick={toggleIcons}>\r\n Pricing\r\n <FontAwesomeIcon icon={props.returnIcon(icon)} />\r\n </Accordion.Toggle>\r\n\r\n </Card.Header>\r\n <Accordion.Collapse eventKey=\"0\">\r\n <Card.Body>\r\n {props?.tailorMadePlanCategories?.map((category: CategoryData, index: number) => {\r\n return (\r\n <Form.Group\r\n key={index + 'ge'}\r\n style={selectedOption.index === index ? { ...selectedOptionStyle } : {}}\r\n onClick={() => updateStateOnClick(category.basePrice, category.name, index)}\r\n >\r\n <Form.Label id='cat-price'>{`€\t${category.basePrice}`}</Form.Label>\r\n <Form.Label id='cat-name' >{props.convertCategoriesNames(category.name)}</Form.Label>\r\n </Form.Group>\r\n )\r\n })}\r\n </Card.Body>\r\n </Accordion.Collapse>\r\n </Card>\r\n );\r\n\r\n // const optionsCard = (\r\n // <Card>\r\n // <Card.Header style={{ marginBottom: '0.5rem', borderRadius: '4px' }}>\r\n // <Accordion.Toggle as={Button} variant=\"link\" eventKey=\"0\" onClick={toggleIcons}>\r\n // Options\r\n // <FontAwesomeIcon icon={props.returnIcon(icon)} />\r\n // </Accordion.Toggle>\r\n // </Card.Header>\r\n // <Accordion.Collapse eventKey=\"0\">\r\n // <Card.Body>\r\n // {props.tailorMadePlanCategories[selectedOption.index]?.additionalOptionsData.map((option: OptionData, optionIndex: number) => {\r\n // return (\r\n // <Form.Group\r\n // style={selectedOption.additionals.some(x => x.name === option.name) ? { ...selectedOptionStyle } : {}}\r\n // onClick={() => updateAdditionalOptionsOnClick({ name: option.name, price: option.price } as AdditionalsData)}\r\n // >\r\n // <Form.Label id='cat-price'>{`€\t${option.price}`}</Form.Label>\r\n // <Form.Label id='cat-name' >{props.convertOptionsNames(option.name)}</Form.Label>\r\n // </Form.Group>\r\n // )\r\n // })}\r\n // </Card.Body>\r\n // </Accordion.Collapse>\r\n // </Card>\r\n // );\r\n\r\n const optionsBlock = (\r\n <section className='options-section'>\r\n <div className='options-section-title'>\r\n <label>ADDITIONAL OPTIONS:</label>\r\n </div>\r\n <div className='options-section-menu'>\r\n {props.tailorMadePlanCategories[selectedOption.index] === undefined ? (\r\n <React.Fragment key={selectedOption.index + 'a'}>\r\n {DEFAULT_OPTIONS_MENU.map((optionName: string, index: number) => {\r\n return (\r\n <div\r\n key={index + 'ce'}\r\n className='options-section-menu-item'\r\n onClick={() => toast.error(SELECT_PRICING_WARNING)}>\r\n <FontAwesomeIcon icon={props.returnIcon(faSquare)} />\r\n <label>{optionName}</label>\r\n </div>\r\n )\r\n })}\r\n </React.Fragment>\r\n ) : (\r\n <React.Fragment key={selectedOption.index + 'be'}>\r\n {props.tailorMadePlanCategories[selectedOption.index]?.additionalOptionsData.map((option: OptionData, optionIndex: number) => {\r\n return (\r\n <div\r\n key={optionIndex + 'ef'}\r\n className='options-section-menu-item'\r\n onClick={() => updateAdditionalOptionsOnClick({ name: option.name, price: option.price } as AdditionalsData)}\r\n >\r\n <FontAwesomeIcon icon={props.returnIcon(faSquare)} style={selectedOption.additionals.some(x => x.name === option.name) ? { color: 'rgb(0, 164, 182)', backgroundColor: '#fff' } : {}} />\r\n <label>{`${props.convertOptionsNames(option.name)} - €\t${option.price}`}</label>\r\n </div>\r\n )\r\n })}\r\n </React.Fragment>\r\n )}\r\n </div>\r\n </section>\r\n );\r\n\r\n const paymentOptions = (\r\n <>\r\n {selectedOption.price === 0 ? (\r\n <Form.Group\r\n key={69420 + 'b'}\r\n >\r\n <div\r\n className='payments-wrapper'\r\n style={selectedPaymentMethod === defaultPaymentMethod ? { ...selectedOptionStyle } : {}}\r\n onClick={() => updatePaymentMethodOnClick(defaultPaymentMethod)}\r\n >\r\n <div className='payment-check'>\r\n <FontAwesomeIcon icon={props.returnIcon(faCheck)} style={selectedPaymentMethod === defaultPaymentMethod ? { position: 'relative', top: '0', left: '0', color: '#fff' } : { position: 'relative', top: '0', left: '0' }} />\r\n </div>\r\n <Form.Label id='cat-name'>{defaultPaymentMethod}</Form.Label>\r\n </div>\r\n </Form.Group>\r\n ) : (\r\n <>\r\n {props.paymentMethods.map((method: string, methodIndex: number) => {\r\n return (\r\n <Form.Group\r\n key={methodIndex + 'de'}\r\n //id={`${method.toLowerCase().includes('card') ? 'disabled-option-cursor' : ''}`}\r\n >\r\n <div\r\n className='payments-wrapper'\r\n //id={`${method.toLowerCase().includes('card') ? 'disabled-option-events' : ''}`}\r\n style={selectedPaymentMethod === method ? { ...selectedOptionStyle } : {}}\r\n onClick={() => updatePaymentMethodOnClick(method)}\r\n >\r\n <div className='payment-check'>\r\n <FontAwesomeIcon icon={props.returnIcon(faCheck)} style={selectedPaymentMethod === method ? { position: 'relative', top: '0', left: '0', color: '#fff' } : { position: 'relative', top: '0', left: '0' }} />\r\n </div>\r\n <Form.Label id='cat-name' >{method}</Form.Label>\r\n </div>\r\n </Form.Group>\r\n )\r\n })}\r\n </>\r\n )}\r\n </>\r\n )\r\n\r\n const paymentsCard = (\r\n <Card style={{ padding: '16px 26px 34px 26px' }}>\r\n <Card.Header id='payment-card-header' style={{ marginBottom: '0.5rem', borderRadius: '4px' }}>\r\n <Accordion.Toggle as={Button} variant=\"link\" eventKey=\"1\" onClick={reverseToggleIcon}>\r\n Payment method\r\n <FontAwesomeIcon icon={props.returnIcon(paymentIcon)} />\r\n </Accordion.Toggle>\r\n </Card.Header>\r\n <Accordion.Collapse eventKey=\"1\">\r\n <Card.Body style={{ border: '0' }}>\r\n {paymentOptions}\r\n </Card.Body>\r\n </Accordion.Collapse>\r\n </Card>\r\n )\r\n\r\n const submitTailorMade = (\r\n <>\r\n <Accordion id='tailor-made-accordion' defaultActiveKey=\"0\" style={{ height: '100%' }}>\r\n <section>\r\n {categoriesCard}\r\n {paymentsCard}\r\n </section>\r\n {optionsBlock}\r\n </Accordion>\r\n <div className='pricing-plan-card-submit' style={{ margin: '0.1px' }}>\r\n {submitBtn}\r\n <div className='pricing-plan-card-submit-note'>\r\n <img src={astericsImg} className='pricing-plan-card-submit-note-asterics' />\r\n <strong>Over 90% of our requests have been successfully matched.</strong> However, please note that EUPATI cannot guarantee a successful matching result. In the case of an unsuccessful match only the basic fee will be charged.\r\n </div>\r\n </div>\r\n </>\r\n );\r\n\r\n return (\r\n <div className='pricing-plan' key={selectedOption.text.length + 'eh'}>\r\n <div className='pricing-plan-card pricing-plan-tailor-made' style={{ paddingTop: '27px' }}>\r\n {selectedOption.text.length > 0 &&\r\n <div className='d-flex' style={{ minHeight: '1px' }}>\r\n <div className='pricing-plan-card-pricebox'>{'€ ' + selectedOption.price}</div>\r\n <div className='pricing-plan-card-pricetitle'>{displayCategoryNameWithOptions()}</div>\r\n </div>\r\n }\r\n {selectedOption.text.length === 0 &&\r\n <div className='d-flex' style={{ minHeight: '1px' }}>\r\n <div className='pricing-plan-card-plantitle'>Tailor-Made Plan</div>\r\n </div>\r\n }\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-description'>\r\n Need some extra help? Let us take the hassle out of finding the right patient for you! If you would like some additional help in finding the right Patient Expert for your project, select the Tailor-Made plan. Under this plan, we will use our expert knowledge of our patient database to find the most suitable Patient Expert for you, connecting you solely with the patients who are interested in your project. We can also reduce the burden on you by liaising on any follow up actions with our EUPATI Patient Experts where necessary.\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n Search\r\n </div>\r\n <div className='pricing-plan-card-benefit-description'>\r\n We will search over 200+ EUPATI Fellows along with our EUPATI Open Classroom Learners to find the right Patient Expert for you.\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n Match\r\n </div>\r\n <div className='pricing-plan-card-benefit-description'>\r\n We will share your request with our matched Patient Experts.\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n Share & Connect\r\n </div>\r\n <div className='pricing-plan-card-benefit-description'>\r\n We will share the matched and interested Patient Experts with you.\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n Co-Create!\r\n </div>\r\n <div className='pricing-plan-card-benefit-description'>\r\n You and your matched Patients Experts can start working together straight away.\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n Follow Up\r\n </div>\r\n <div className='pricing-plan-card-benefit-description'>\r\n We liaise with you on any follow up where necessary.\r\n </div>\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card pricing-plan-tailor-made pricing-plan-card-2' style={{ padding: '0px' }}>\r\n {submitTailorMade}\r\n </div>\r\n <div className='pricing-plan-card pricing-plan-tailor-made-options'>\r\n <div id='options-icon-plus'>+</div>\r\n <div id='options-title-box'>Additional Options:</div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n Mentorship\r\n </div>\r\n <div className='pricing-plan-card-benefit-description'>\r\n If you desire, we can provide additional mentorship to your organisation or the Patient Expert where either party has minimal expertise in previous patient engagement projects.\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n External Networks\r\n </div>\r\n <div className='pricing-plan-card-benefit-description'>\r\n Are you looking to reach beyond EUPATI Expert Patients? If necessary, we can reach out to our external networks, outside the EUPATI Patient Expert Pool, to find the right patient for you.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}","import React, { Component } from 'react';\r\nimport { Button } from 'react-bootstrap';\r\nimport astericsImg from '../../../../images/pricing/asterics.png';\r\n\r\ntype OwnProps = {};\r\n\r\nexport type DispatchProps = {};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\ntype OwnState = {};\r\n\r\nexport default class CustomPlanComponent extends Component<Props, OwnState> {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n\r\n const contactUsBtn = (\r\n <div className='pricing-plan-card-submit-button'>\r\n <Button\r\n variant='primary'\r\n type='submit'\r\n className='submit-btn'\r\n onClick={(e) => {\r\n e.preventDefault();\r\n window.location.href = 'https://eupati.eu/contact/';\r\n }}\r\n >\r\n Contact Us\r\n </Button>\r\n </div>\r\n );\r\n\r\n return (\r\n <div className='pricing-plan' style={{ justifyContent: 'center', alignItems: 'center' }} >\r\n <div className='pricing-plan-card pricing-plan-custom' style={{ display: 'flex', flexDirection: 'column', justifyContent: 'space-between' }}>\r\n <div className='d-flex' style={{ minHeight: '1px' }}>\r\n <div className='pricing-plan-card-pricebox' style={{ flexDirection: 'column', paddingBottom: '10px' }}>20% <span className='discount'>discount</span></div>\r\n <div className='pricing-plan-card-pricetitle'>Based on the number of requests</div>\r\n </div>\r\n <div className='pricing-plan-card-benefit'>\r\n <div className='pricing-plan-card-benefit-title'>\r\n Customised Annual Subscription Plan\r\n </div>\r\n <div className='pricing-plan-card-benefit-description' style={{ lineHeight: '250%' }}>\r\n Would you like to sign up for an annual subscription plan for a certain number of matchmaking requests per year to streamline your internal approval and payments processes? Contact us and we will customise the right matchmaking plan for you.\r\n </div>\r\n </div>\r\n <div className='pricing-plan-card-submit' style={{ backgroundColor: '#fff', display: 'flex', flexDirection: 'column', justifyContent: 'center', padding: '0px', height: 'auto' }}>\r\n {contactUsBtn}\r\n <div className='pricing-plan-card-submit-note' style={{ display: 'none' }}>\r\n <img src={astericsImg} className='pricing-plan-card-submit-note-asterics' />\r\n <strong>Over 90% of our requests have been successfully matched.</strong> However, please note that EUPATI cannot guarantee a successful matching result. In the case of an unsuccessful match only the basic fee will be charged.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n}","import * as React from 'react';\r\nimport { Nav, Tab } from 'react-bootstrap';\r\nimport EupatiLoader from '../../../common/static/loading-animation/loader';\r\nimport { State } from '../model';\r\nimport '../style.scss';\r\nimport { GoogleReCaptcha } from 'react-google-recaptcha-v3';\r\nimport BasicPlanComponent from './basic-plan';\r\nimport TailorMadeComponent from './tailor-made-plan';\r\nimport CustomPlanComponent from './custom-plan';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { CATALOG_TYPES, CATEGORY_NAMES, CONVERTED_NAMES, OPTION_NAMES } from '../../../common/helpers/pricing-list';\r\n\r\ntype OwnProps = {};\r\n\r\nexport type DispatchProps = {\r\n setIsUserReal: (token: string) => void;\r\n setCatalogsPrices: () => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps;\r\n\r\ntype OwnState = {\r\n paymentMethods: string[]\r\n};\r\n\r\n//const EMPTY_SUBMIT_WARNING = 'You have to select a Pricing from the menu.';\r\n//const PAYMENT_METHOD_WARNING = 'Please select a Payment method';\r\nexport default class ComponentRoot extends React.Component<Props, OwnState> {\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.returnIcon = this.returnIcon.bind(this);\r\n this.convertOptionsNames = this.convertOptionsNames.bind(this);\r\n this.convertCategoriesNames = this.convertCategoriesNames.bind(this);\r\n this.returnCategoriesArrayByCatalogType = this.returnCategoriesArrayByCatalogType.bind(this);\r\n\r\n this.state = {\r\n //paymentMethods: ['Pay via Invoice', 'Pay by Credit Card']//'invoice' and 'card' are keywords\r\n paymentMethods: ['Pay via Invoice']\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.props.setCatalogsPrices();\r\n }\r\n\r\n convertCategoriesNames(name: string) {\r\n switch (name) {\r\n case CATEGORY_NAMES.Researcher:\r\n return `${CONVERTED_NAMES.ExternalResearcher}`\r\n case CATEGORY_NAMES.Industry:\r\n return `${CONVERTED_NAMES.IndustryPartner}`\r\n case CATEGORY_NAMES.Academia:\r\n return `${CONVERTED_NAMES.AcademiaPartner}`\r\n default:\r\n return ''\r\n }\r\n }\r\n\r\n convertOptionsNames(name: string) {\r\n switch (name) {\r\n case OPTION_NAMES.Network:\r\n return `${CONVERTED_NAMES.NetworkOption}`\r\n case OPTION_NAMES.Mentorship:\r\n return `${CONVERTED_NAMES.MentorshipOption}`\r\n default:\r\n return ''\r\n }\r\n }\r\n\r\n returnIcon(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n returnCategoriesArrayByCatalogType(catalogType: string) {\r\n const priceCatalog = this.props.catalogData.find(x => x.type.toLowerCase() === catalogType);\r\n if (priceCatalog) {\r\n return priceCatalog.categoryOptionsData;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n render() {\r\n\r\n let mainComponent: any;\r\n\r\n let loadingComponent = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n );\r\n\r\n if (this.props.isLoading) {\r\n mainComponent = loadingComponent;\r\n }\r\n else {\r\n const tabs = (\r\n <div className=\"tabs-nav-wrapper\">\r\n <Nav variant=\"tabs\" className=\"tabs\">\r\n <Nav.Item>\r\n <Nav.Link eventKey='basic'>\r\n Basic\r\n </Nav.Link>\r\n </Nav.Item>\r\n <Nav.Item>\r\n <Nav.Link eventKey='tailor'>\r\n Tailor-Made\r\n </Nav.Link>\r\n </Nav.Item>\r\n <Nav.Item>\r\n <Nav.Link eventKey='custom'>\r\n Custom\r\n </Nav.Link>\r\n </Nav.Item>\r\n </Nav>\r\n </div>\r\n );\r\n\r\n const tabContents = (\r\n <>\r\n <Tab.Pane eventKey='basic'>\r\n <BasicPlanComponent\r\n {...{\r\n returnIcon: this.returnIcon,\r\n paymentMethods: this.state.paymentMethods,\r\n basicPlanCategories: this.returnCategoriesArrayByCatalogType(CATALOG_TYPES.Basic.toLowerCase()),\r\n convertCategoriesNames: this.convertCategoriesNames\r\n }}\r\n />\r\n </Tab.Pane>\r\n\r\n <Tab.Pane eventKey='tailor'>\r\n <TailorMadeComponent\r\n {...{\r\n returnIcon: this.returnIcon,\r\n paymentMethods: this.state.paymentMethods,\r\n convertOptionsNames: this.convertOptionsNames,\r\n convertCategoriesNames: this.convertCategoriesNames,\r\n tailorMadePlanCategories: this.returnCategoriesArrayByCatalogType(CATALOG_TYPES.TailorMade.toLowerCase())\r\n }}\r\n />\r\n </Tab.Pane>\r\n\r\n <Tab.Pane eventKey='custom'>\r\n <CustomPlanComponent />\r\n </Tab.Pane>\r\n </>\r\n );\r\n\r\n mainComponent = (\r\n <>\r\n <GoogleReCaptcha action='homePage' onVerify={token => this.props.setIsUserReal(token)} />\r\n\r\n <section className='pricing-upper-sec'>\r\n <div className='pricing-upper-sec-txt'>\r\n <h5 className='pricing-upper-sec-txt-title mb-4'>Connect Now</h5>\r\n <h5 className='pricing-upper-sec-txt-sub-title'>Would you like to engage a EUPATI Patient Expert in your patient engagement opportunity?</h5>\r\n <p className='pricing-upper-sec-txt-para'>\r\n We have created 3 different packages to suit your needs.\r\n Select the right one for you and we can begin finding the right patient for your project today.\r\n </p>\r\n </div>\r\n </section>\r\n\r\n <section className='pricing-lower-sec'>\r\n <div id='pricing-tabs'>\r\n <Tab.Container\r\n id=\"tabs\"\r\n defaultActiveKey='basic'\r\n >\r\n {tabs}\r\n <Tab.Content>{tabContents}</Tab.Content>\r\n </Tab.Container>\r\n </div>\r\n </section>\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {mainComponent}\r\n </>\r\n );\r\n }\r\n}","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport * as Actions from '../actions';\r\nimport { State } from '../model';\r\nimport { connect } from 'react-redux';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n setIsUserReal: (token: string) => dispatch(Actions.verifyUserTokenAsync(token)),\r\n setCatalogsPrices: () => dispatch(Actions.getCatalogsPricesDataAsync())\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { State } from './model';\r\nimport * as t from './actionType'\r\nimport { CatalogData } from '../../common/models/input-models';\r\n\r\nconst initialState: State = {\r\n isLoading: false,\r\n isLoggedIn: false,\r\n isUserReal: true,\r\n catalogData: []\r\n};\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_PRICING_LOADING:\r\n return setPricingLoading(state, action.payload);\r\n case t.SET_PRICING_LOGGED_IN:\r\n return setPricingLoggedInStatus(state, action.payload);\r\n case t.SET_IS_USER_REAL:\r\n return setIsUserReal(state, action.payload);\r\n case t.SET_CATALOGS_DATA:\r\n return setCatalogsData(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst setPricingLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setPricingLoggedInStatus = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isLoggedIn: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setIsUserReal = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isUserReal: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setCatalogsData = (state: State, val: CatalogData[]): State => {\r\n let newState = {\r\n ...state,\r\n catalogData: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","// constants.ts\r\n\r\nexport const NAME = 'contentManagement';","import { NAME } from \"./constants\";\r\n\r\nexport const SET_CONTENT_LOADING = `${NAME}/SET_CONTENT_LOADING`;\r\n\r\nexport const SET_CONTENT_RESPONSE = `${NAME}/SET_CONTENT_RESPONSE`;","import { ContentData, ContentResponse } from '../../../common/models/input-models';\r\nimport DataSvc from '../../../common/services/data-svc';\r\nimport * as t from './actionTypes';\r\n\r\nexport const setContentLoading = (isContentLoading: boolean) => ({\r\n type: t.SET_CONTENT_LOADING,\r\n payload: isContentLoading\r\n});\r\n\r\nexport const setContentResponse = (contentResponse: ContentResponse) => ({\r\n type: t.SET_CONTENT_RESPONSE,\r\n payload: { ...contentResponse }\r\n});\r\n\r\nexport const getContentByNameAsync = (name: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setContentLoading(true));\r\n DataSvc.utilsSvc.getContent(name).then(\r\n (result: any) => {\r\n dispatch(setContentResponse(result));\r\n dispatch(setContentLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const updateContentAsync = (contentData: ContentData) => {\r\n return (dispatch: any, getState: any) => {\r\n try {\r\n DataSvc.utilsSvc.updateContent(contentData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n}","import * as React from 'react';\r\nimport { Button, Form } from 'react-bootstrap';\r\nimport { RouteComponentProps } from '@reach/router';\r\nimport { ContentResponse } from '../../../../common/models/input-models';\r\nimport ReactDOMServer from 'react-dom/server';\r\nimport EupatiLoader from '../../../../common/static/loading-animation/loader';\r\nimport { useHistory } from 'react-router';\r\nimport '../style.scss';\r\n\r\ntype OwnProps = {\r\n content: ContentResponse,\r\n isContentLoading: boolean,\r\n contentName: string,\r\n isUserAdmin: boolean\r\n};\r\n\r\nexport type DispatchProps = {};\r\n\r\ntype Props = DispatchProps & OwnProps & RouteComponentProps<{ location: { state: { html: string } } }>;\r\n\r\nconst HtmlToReactParser = require('html-to-react').Parser;\r\nexport default function EupatiPrivacyPage(props: Props) {\r\n const history = useHistory();\r\n\r\n const htmlToReactParser = new HtmlToReactParser();\r\n const reactElement = htmlToReactParser.parse(props.content.htmlContent);\r\n const reactHtml = ReactDOMServer.renderToStaticMarkup(reactElement);\r\n\r\n const redirectToEditor = () => {\r\n history.push({\r\n pathname: '/admin/content-editor',\r\n state: { pageName: props.contentName }\r\n });\r\n }\r\n\r\n let mainComp: any;\r\n let loadComp = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n )\r\n\r\n if (props.isContentLoading) {\r\n mainComp = loadComp;\r\n }\r\n else {\r\n mainComp = (\r\n <div className={`${props.contentName}-content`} dangerouslySetInnerHTML={{ __html: reactHtml }}></div>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <Form.Group id={`${props.contentName}`}>\r\n {props.isUserAdmin &&\r\n <div id={`${props.contentName}-btns`}>\r\n <Button variant='primary' onClick={redirectToEditor}>Edit page</Button>\r\n </div>\r\n }\r\n {mainComp}\r\n </Form.Group>\r\n </>\r\n );\r\n}\r\n","import React from \"react\"\r\nimport { ContentData, ContentResponse } from \"../../../../common/models/input-models\";\r\nimport { State } from \"../model\";\r\nimport EupatiContentPage from \"./content\";\r\nimport 'reactjs-popup/dist/index.css';\r\nimport '../style.scss';\r\nimport AuthenticationContext from \"../../../../common/static/auth-context\";\r\n\r\ntype OwnProps = {\r\n isContentLoading: boolean,\r\n contentResponse: ContentResponse\r\n};\r\n\r\nexport type DispatchProps = {\r\n getContent: (name: string) => void;\r\n updateContent: (data: ContentData) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps;\r\n\r\ntype OwnState = {\r\n name: string;\r\n};\r\n\r\nconst CURRENT_PATH = window.location.pathname; // (e.g. \"/privacy\")\r\nexport default class ComponentRoot extends React.Component<Props, OwnState> {\r\n static contextType = AuthenticationContext;\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n name: CURRENT_PATH.substring(1) // removes the slash from CURRENT_PATH\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.props.getContent(this.state.name);\r\n if (this.context.isUserAdmin === null || this.context.isUserAdmin === undefined) {\r\n this.context.authenticateUser();\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n <EupatiContentPage\r\n {...{\r\n content: this.props.contentResponse,\r\n isContentLoading: this.props.isContentLoading,\r\n contentName: this.state.name,\r\n isUserAdmin: this.context.isUserAdmin\r\n }}\r\n />\r\n </>\r\n )\r\n }\r\n}","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport { State } from '../model';\r\nimport * as Actions from '../actions';\r\nimport { ContentData } from '../../../../common/models/input-models';\r\nimport { connect } from 'react-redux';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n getContent: (name: string) => dispatch(Actions.getContentByNameAsync(name)),\r\n updateContent: (data: ContentData) => dispatch(Actions.updateContentAsync(data))\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { blankResponse, State } from \"./model\";\r\nimport * as t from './actionTypes';\r\nimport { ContentResponse } from \"../../../common/models/input-models\";\r\n\r\nconst initialState: State = {\r\n isContentLoading: false,\r\n contentResponse: blankResponse\r\n}\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_CONTENT_LOADING:\r\n return setContentLoading(state, action.payload);\r\n case t.SET_CONTENT_RESPONSE:\r\n return setContentResponse(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nconst setContentLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isContentLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setContentResponse = (state: State, val: ContentResponse): State => {\r\n let newState = {\r\n ...state,\r\n contentResponse: { ...val }\r\n } as State;\r\n\r\n return newState;\r\n}","// model.js\r\n// This is the model of our module state (e.g. return type of the reducer)\r\n\r\nimport { ContentResponse } from \"../../../common/models/input-models\";\r\n\r\nexport type State = {\r\n isContentLoading: boolean;\r\n contentResponse: ContentResponse;\r\n}\r\n\r\nexport const blankResponse = {\r\n rawDraftContent: '',\r\n htmlContent: ''\r\n} as ContentResponse;","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","export const NAME = 'emailTemplates';","import { NAME } from './constants';\r\n\r\nexport const SET_EMAIL_TEMPLATES_LOADING = `${NAME}/SET_EMAIL_TEMPLATES_LOADING`;\r\n\r\nexport const SET_EMAIL_TEMPLATE_DATA = `${NAME}/SET_EMAIL_TEMPLATE_DATA`;\r\n\r\nexport const SET_SINGLE_EMAIL_TEMPLATE_LOADING = `${NAME}/SET_SINGLE_EMAIL_TEMPLATE_LOADING`;\r\n\r\nexport const SET_SINGLE_EMAIL_TEMPLATE_DATA = `${NAME}/SET_SINGLE_EMAIL_TEMPLATE_DATA`;\r\n\r\nexport const SET_PROJECT_MODEL_PROPS_NAMES = `${NAME}/SET_PROJECT_MODEL_PROPS_NAMES`;\r\n\r\nexport const SET_PATIENT_MODEL_PROPS_NAMES = `${NAME}/SET_PATIENT_MODEL_PROPS_NAMES`;\r\n\r\nexport const SET_TRIGGERS_MENU_OPTIONS = `${NAME}/SET_TRIGGERS_MENU_OPTIONS`;\r\n\r\nexport const SET_TRIGGERS_MENU_OPTIONS_LOADING = `${NAME}/SET_TRIGGERS_MENU_OPTIONS_LOADING`;\r\n\r\nexport const SET_RECEIVERS_MENU_OPTIONS = `${NAME}/SET_RECEIVERS_MENU_OPTIONS`;\r\n\r\nexport const SET_CHOOSEN_RECEIVERS = `${NAME}/SET_CHOOSEN_RECEIVERS`;","import { EmailAutomationTriggersMenu, EmailTemplateData, LookUpOptions, ModelPropsNames } from \"../../../common/models/input-models\";\r\n\r\nexport type State = {\r\n isEmailTemplatesLoading: boolean;\r\n isSingleEmailTemplateLoading: boolean;\r\n emailTemplatesData: EmailTemplateData[];\r\n singleEmailTemplateData: EmailTemplateData;\r\n projectPropsNames: ModelPropsNames[];\r\n patientPropsNames: ModelPropsNames[];\r\n triggersMenuOptions: EmailAutomationTriggersMenu[];\r\n isTriggersMenuOptionsLoading: boolean;\r\n receiversMenuOptions: LookUpOptions[];\r\n choosenReceivers: number[];\r\n};\r\n\r\nexport const emptyTemplate = {\r\n id: '',\r\n name: '',\r\n htmlContent: ''\r\n} as EmailTemplateData;","import { ActionsTemplateData, EmailAutomationTriggersMenu, EmailTemplateData, LookUpOptions, ModelPropsNames } from '../../../common/models/input-models';\r\nimport DataSvc from '../../../common/services/data-svc';\r\nimport * as t from './actionTypes';\r\nimport { emptyTemplate } from './models';\r\n\r\nexport const setIsEmailTemplatesLoading = (isEmailTemplatesLoading: boolean) => ({\r\n type: t.SET_EMAIL_TEMPLATES_LOADING,\r\n payload: isEmailTemplatesLoading\r\n});\r\n\r\nexport const setEmailTemplatesData = (emailTemplatesData: EmailTemplateData[]) => ({\r\n type: t.SET_EMAIL_TEMPLATE_DATA,\r\n payload: [...emailTemplatesData]\r\n});\r\n\r\nexport const setIsSingleEmailTemplateLoading = (isSingleEmailTemplateLoading: boolean) => ({\r\n type: t.SET_SINGLE_EMAIL_TEMPLATE_LOADING,\r\n payload: isSingleEmailTemplateLoading\r\n});\r\n\r\nexport const setSingleEmailTemplateData = (emailTemplateData: EmailTemplateData) => ({\r\n type: t.SET_SINGLE_EMAIL_TEMPLATE_DATA,\r\n payload: { ...emailTemplateData }\r\n});\r\n\r\nexport const setProjectModelPropsNames = (projectModelPropsNames: ModelPropsNames[]) => ({\r\n type: t.SET_PROJECT_MODEL_PROPS_NAMES,\r\n payload: [...projectModelPropsNames]\r\n});\r\n\r\nexport const setPatientModelPropsNames = (patientModelPropsNames: ModelPropsNames[]) => ({\r\n type: t.SET_PATIENT_MODEL_PROPS_NAMES,\r\n payload: [...patientModelPropsNames]\r\n});\r\n\r\nexport const setTriggersMenuOptions = (emailAutomationTriggers: EmailAutomationTriggersMenu[]) => ({\r\n type: t.SET_TRIGGERS_MENU_OPTIONS,\r\n payload: [...emailAutomationTriggers]\r\n});\r\n\r\nexport const setTriggersMenuOptionsLoading = (isTriggersMenuOptionsLoading: boolean) => ({\r\n type: t.SET_TRIGGERS_MENU_OPTIONS_LOADING,\r\n payload: isTriggersMenuOptionsLoading\r\n});\r\n\r\nexport const setReceiversMenuOptions = (receiversMenuOptions: LookUpOptions[]) => ({\r\n type: t.SET_RECEIVERS_MENU_OPTIONS,\r\n payload: [...receiversMenuOptions]\r\n});\r\n\r\nexport const setChoosenReceivers = (choosenReceivers: number[]) => ({\r\n type: t.SET_CHOOSEN_RECEIVERS,\r\n payload: [...choosenReceivers]\r\n});\r\n\r\nexport const setAllEmailTemplatesAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsEmailTemplatesLoading(true));\r\n DataSvc.utilsSvc.getAllEmailTemplates().then(\r\n (result: any) => {\r\n dispatch(setEmailTemplatesData(result));\r\n dispatch(setIsEmailTemplatesLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n };\r\n};\r\n\r\nexport const setEmailTemplateByIdAsync = (id?: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsSingleEmailTemplateLoading(true));\r\n switch (id) {\r\n case undefined:\r\n dispatch(setSingleEmailTemplateData(emptyTemplate));\r\n dispatch(setIsSingleEmailTemplateLoading(false));\r\n break;\r\n default:\r\n DataSvc.utilsSvc.getEmailTemplate(id).then(\r\n (result: any) => {\r\n dispatch(setSingleEmailTemplateData(result));\r\n dispatch(setIsSingleEmailTemplateLoading(false));\r\n //dispatch(setEmailTriggerTemplateBeneficiariesAsync(id));\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n break;\r\n }\r\n };\r\n};\r\n\r\nexport const createNewEmailTemplateAsync = (emailTemplateData: EmailTemplateData) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsSingleEmailTemplateLoading(true));\r\n DataSvc.utilsSvc.addEmailTemplate(emailTemplateData).then(\r\n (result: any) => {\r\n dispatch(setIsSingleEmailTemplateLoading(false));\r\n dispatch(setSingleEmailTemplateData(emptyTemplate));\r\n dispatch(setAllEmailTemplatesAsync());\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n };\r\n};\r\n\r\nexport const updateEmailTemplateDataAsync = (emailTemplateData: EmailTemplateData) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsSingleEmailTemplateLoading(true));\r\n DataSvc.utilsSvc.alterEmailTemplateData(emailTemplateData).then(\r\n (result: any) => {\r\n dispatch(setIsSingleEmailTemplateLoading(false));\r\n dispatch(setSingleEmailTemplateData(emptyTemplate));\r\n dispatch(setAllEmailTemplatesAsync());\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n };\r\n};\r\n\r\nexport const removeEmailTemplateDataAsync = (id: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsSingleEmailTemplateLoading(true));\r\n DataSvc.utilsSvc.getEmailTemplate(id).then(\r\n (result: any) => {\r\n DataSvc.utilsSvc.removeEmailTemplate(result).then(\r\n (result: any) => {\r\n dispatch(setAllEmailTemplatesAsync());\r\n dispatch(setIsSingleEmailTemplateLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n };\r\n};\r\n\r\nexport const setModelsPropsNamesAsync = (id: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsSingleEmailTemplateLoading(true));\r\n DataSvc.utilsSvc.getClassPropertiesNames({ id: id }).then(\r\n (result: any) => {\r\n const projectProps = result.find((x: any) => x.name === 'project');\r\n dispatch(setProjectModelPropsNames(projectProps.items));\r\n const patientsProps = result.find((x: any) => x.name === 'patient');\r\n dispatch(setPatientModelPropsNames(patientsProps.items));\r\n dispatch(setIsSingleEmailTemplateLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n };\r\n};\r\n\r\nexport const setTriggersMenuOptionsAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setTriggersMenuOptionsLoading(true));\r\n DataSvc.utilsSvc.getEmailAutomationTriggers().then(\r\n (result: any) => {\r\n dispatch(setTriggersMenuOptions(result));\r\n dispatch(setTriggersMenuOptionsLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const assignActionsToEmailTemplateAsync = (data: ActionsTemplateData) => {\r\n return (dispatch: any, getState: any) => {\r\n DataSvc.utilsSvc.assignActionsToEmailTemplate(data).then(\r\n () => {\r\n dispatch(setAllEmailTemplatesAsync())\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const misallocateActionsFromEmailTemplateAsync = (data: ActionsTemplateData) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsSingleEmailTemplateLoading(true));\r\n DataSvc.utilsSvc.misallocateActionsFromEmailTemplate(data).then(\r\n (result: any) => {\r\n dispatch(setEmailTemplateByIdAsync(data.emailTemplateId));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const setReceiversMenuOptionsAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setTriggersMenuOptionsLoading(true));\r\n DataSvc.utilsSvc.getLookUpData().then(\r\n (result: any) => {\r\n dispatch(setReceiversMenuOptions(result.find((x: any) => x.name === \"receiverType\").data));\r\n dispatch(setTriggersMenuOptionsLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const setEmailTriggerTemplateBeneficiariesAsync = (id: string) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setIsSingleEmailTemplateLoading(true));\r\n DataSvc.utilsSvc.getEmailTriggerTemplateBeneficiaries(id).then(\r\n (result: any) => {\r\n dispatch(setChoosenReceivers(result));\r\n dispatch(setIsSingleEmailTemplateLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}","import React, { useRef, useState } from \"react\";\r\nimport { Editor } from \"@tinymce/tinymce-react\";\r\nimport { EmailTemplateData, ModelPropsNames, OptionsData } from \"../models/input-models\";\r\nimport { Button, Form } from \"react-bootstrap\";\r\nimport { toast } from \"react-toastify\";\r\nimport { FILL_ALL_FIELD_ERR_MSG } from \"../helpers/messages\";\r\n\r\ntype OwnProps = {\r\n emailTemplateData: EmailTemplateData;\r\n projectPropsNames: ModelPropsNames[];\r\n patientPropsNames: ModelPropsNames[];\r\n options: OptionsData[];\r\n}\r\n\r\nexport type DispatchProps = {\r\n onBackToAllHandler: () => void;\r\n onSaveTemplateChangesHandler: (templateData: EmailTemplateData) => void;\r\n}\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nconst randomstring = require(\"randomstring\");\r\nexport default function EmailTemplateEditor(props: Props) {\r\n const editorRef = useRef(null);\r\n const eupatiURL = \"https://connect.eupati.eu/\";\r\n\r\n const [emailTemplateName, setEmailTemplateName] = useState<string>(props.emailTemplateData.name);\r\n const [emailTemplateSubject, setEmailTemplateSubject] = useState<string>(props.emailTemplateData.subject);\r\n\r\n const onSubmit = (e: any) => {\r\n e.preventDefault();\r\n if (editorRef.current) {\r\n const updatedEmailTemplateData = Object.assign(props.emailTemplateData, {\r\n name: emailTemplateName, actions: [],\r\n subject: emailTemplateSubject,\r\n //@ts-ignore\r\n htmlContent: editorRef.current.getContent()\r\n });\r\n if (updatedEmailTemplateData.name === '' ||\r\n updatedEmailTemplateData.subject === '' ||\r\n updatedEmailTemplateData.htmlContent === '') {\r\n return toast.error(FILL_ALL_FIELD_ERR_MSG);\r\n }\r\n props.onSaveTemplateChangesHandler(updatedEmailTemplateData);\r\n }\r\n }\r\n\r\n const onEmailTemplateNameChangeHandler = (e: any) => {\r\n setEmailTemplateName(e.target.value);\r\n }\r\n\r\n const onEmailTemplateSubjectChangeHandler = (e: any) => {\r\n setEmailTemplateSubject(e.target.value);\r\n }\r\n\r\n return (\r\n <Form onSubmit={onSubmit} >\r\n <Form.Group id='email-template-editor-btns' className=\"mb-3\">\r\n <Button\r\n variant='secondary'\r\n id='back-btn'\r\n onClick={() => props.onBackToAllHandler()}\r\n >\r\n BACK\r\n </Button>\r\n <Button\r\n variant='primary'\r\n id='save-btn'\r\n type=\"submit\"\r\n >\r\n SAVE\r\n </Button>\r\n </Form.Group>\r\n <Form.Group className=\"mb-3\">\r\n <Form.Label>Name</Form.Label>\r\n <Form.Control type=\"text\" value={emailTemplateName} placeholder=\"Enter template name...\" onChange={onEmailTemplateNameChangeHandler} />\r\n </Form.Group>\r\n <Form.Group className=\"mb-3\">\r\n <Form.Label>Subject</Form.Label>\r\n <Form.Control type=\"text\" value={emailTemplateSubject} placeholder=\"Enter template subject...\" onChange={onEmailTemplateSubjectChangeHandler} />\r\n </Form.Group>\r\n <Form.Group className=\"mb-3\">\r\n <Form.Label>Content</Form.Label>\r\n <Editor\r\n //@ts-ignore\r\n onInit={(evt, editor) => (editorRef.current) = editor}\r\n initialValue={props.emailTemplateData.htmlContent}\r\n apiKey=\"gi5vdpb46pw329w18n94luc6ne2yimgpjks785wd387s2qvu\"\r\n init={{\r\n height: 500,\r\n convert_urls: true,\r\n relative_urls: false,\r\n remove_script_host: false,\r\n menubar: 'file edit view insert format tools table properties',\r\n plugins: [\r\n 'advlist autolink lists link image charmap print preview anchor',\r\n 'searchreplace visualblocks code fullscreen',\r\n 'insertdatetime media table paste code wordcount'\r\n ],\r\n toolbar: 'undo redo | formatselect | ' +\r\n 'bold italic backcolor | alignleft aligncenter ' +\r\n 'alignright alignjustify | bullist numlist outdent indent |' +\r\n 'removeformat | ptconfirmation | ptrejection | projconfirmation | projrejection',\r\n menu: {\r\n properties: { title: 'Fields', items: 'project patient' }\r\n },\r\n setup: function (editor) {\r\n //toolbar\r\n editor.ui.registry.addButton('ptconfirmation', {\r\n text: 'Patient Confirm',\r\n onAction: function () {\r\n const url = `${eupatiURL}letter-of-confirmation/?uid=##uid##+${randomstring.generate(128)}&pid=##pid##`;\r\n editor.insertContent(`<a href='${url}' target='_blank' style=\"color:#fff; border-radius:41px; border-color:transparent; background-color:#00749F; font-size: 18px; padding:12px 24px; cursor:pointer; margin-top:30px; text-decoration: none;\">Confirm</a>`);\r\n }\r\n });\r\n editor.ui.registry.addButton('ptrejection', {\r\n text: 'Patient Reject',\r\n onAction: function () {\r\n const url = `${eupatiURL}letter-of-rejection/?uid=##uid##+${randomstring.generate(128)}&pid=##pid##`;\r\n editor.insertContent(`<a href='${url}' target='_blank' style=\"color:#fff; border-radius:41px; border-color:transparent; background-color:#A7171A; font-size: 18px; padding:12px 24px; cursor:pointer; margin-top:30px; text-decoration: none;\">Not Interested</a>`);\r\n }\r\n });\r\n editor.ui.registry.addButton('projconfirmation', {\r\n text: 'Project Confirm',\r\n onAction: function () {\r\n const url = `${eupatiURL}letter-of-confirmation/?pid=##pid##+${randomstring.generate(128)}`;\r\n editor.insertContent(`<a href='${url}' target='_blank' style=\"color:#fff; border-radius:41px; border-color:transparent; background-color:#00749F; font-size: 18px; padding:12px 24px; cursor:pointer; margin-top:30px; text-decoration: none;\">Confirm</a>`);\r\n }\r\n });\r\n editor.ui.registry.addButton('projrejection', {\r\n text: 'Project Reject',\r\n onAction: function () {\r\n const url = `${eupatiURL}letter-of-rejection/?pid=##pid##+${randomstring.generate(128)}`;\r\n editor.insertContent(`<a href='${url}' target='_blank' style=\"color:#fff; border-radius:41px; border-color:transparent; background-color:#A7171A; font-size: 18px; padding:12px 24px; cursor:pointer; margin-top:30px; text-decoration: none;\">Not Interested</a>`);\r\n }\r\n });\r\n //menu\r\n editor.ui.registry.addNestedMenuItem('project', {\r\n text: 'Project',\r\n getSubmenuItems: () => {\r\n return props.projectPropsNames.map(x => {\r\n return {\r\n type: x.type,\r\n text: x.text,\r\n onAction: () => {\r\n editor.insertContent(`${x.value}`);\r\n }\r\n }\r\n }) as any;\r\n }\r\n });\r\n editor.ui.registry.addNestedMenuItem('patient', {\r\n text: 'Patient',\r\n getSubmenuItems: () => {\r\n return props.patientPropsNames.map(x => {\r\n return {\r\n type: x.type,\r\n text: x.text,\r\n onAction: () => {\r\n editor.insertContent(`${x.value}`);\r\n }\r\n }\r\n }) as any;\r\n }\r\n });\r\n },\r\n content_style: 'body {font - family:Helvetica,Arial,sans-serif; font-size:18px }'\r\n }}\r\n />\r\n </Form.Group>\r\n </Form>\r\n )\r\n}","import React, { useState } from \"react\";\r\nimport { Button, Form } from \"react-bootstrap\";\r\nimport { toast } from \"react-toastify\";\r\nimport { SUCC_ASSIGN_ACTIONS_TO_TEMPLATE } from \"../helpers/messages\";\r\nimport { ActionsTemplateData, EmailAutomationTriggersMenu, EmailTemplateData, LookUpOptions } from \"../models/input-models\";\r\nimport EupatiDropdown from \"./dropdown\";\r\n\r\ntype OwnProps = {\r\n emailTemplate: EmailTemplateData;\r\n triggersMenuOptions: EmailAutomationTriggersMenu[];\r\n filteredTriggersMenuOptions: EmailAutomationTriggersMenu[];\r\n receiversMenuOptions: LookUpOptions[];\r\n choosenReceivers: number[];\r\n};\r\n\r\nexport type DispatchProps = {\r\n onBackToAllHandler: () => void;\r\n assignActionsToTemplate: (data: ActionsTemplateData) => void;\r\n compare: (a: any, b: any) => number;\r\n misallocateActionsFromEmailTemplate: (data: ActionsTemplateData) => void;\r\n};\r\n\r\ntype Props = DispatchProps & OwnProps;\r\n\r\nexport default function ActionsTemplateMenu(props: Props) {\r\n\r\n const [templateTriggers, setTemplateTriggers] = useState<string[]>(props.emailTemplate?.actions?.length > 0 ? props.emailTemplate?.actions?.map((eta) => eta.name) : []);\r\n //const [currentTrigger, setCurrentTrigger] = useState<EmailAutomationTriggersMenu | undefined>(props.triggersMenuOptions.sort(props.compare).find((o: any) => templateTriggers.some(tt => tt === o.name)))\r\n\r\n const onSubmit = (e: any) => {\r\n e.preventDefault();\r\n toast.success(SUCC_ASSIGN_ACTIONS_TO_TEMPLATE);\r\n props.assignActionsToTemplate({\r\n emailTemplateId: props.emailTemplate.id,\r\n actions: templateTriggers,\r\n receivers: []\r\n } as ActionsTemplateData);\r\n props.onBackToAllHandler();\r\n }\r\n\r\n const onTemplateTriggersChangeHandler = (e: any) => {\r\n //if empty string, remove assigned actions\r\n const val = props.triggersMenuOptions[e.target.value].name;\r\n switch (val) {\r\n case undefined:\r\n setTemplateTriggers([]);\r\n break;\r\n default:\r\n setTemplateTriggers([val]);\r\n break;\r\n }\r\n }\r\n\r\n return (\r\n <Form onSubmit={onSubmit}>\r\n <Form.Group id='template-triggers-btns' className=\"mb-3\">\r\n <Button\r\n variant='secondary'\r\n id='back-btn'\r\n onClick={() => props.onBackToAllHandler()}\r\n >\r\n BACK\r\n </Button>\r\n <Button\r\n variant='primary'\r\n id='save-btn'\r\n type=\"submit\"\r\n >\r\n SAVE\r\n </Button>\r\n </Form.Group>\r\n <Form.Group className=\"mb-3\">\r\n <Form.Label>Email Template Name</Form.Label>\r\n <Form.Control type=\"text\" value={props.emailTemplate.name} placeholder=\"Enter template name...\" disabled={true} />\r\n </Form.Group>\r\n <Form.Group className=\"mb-3\" >\r\n <Form.Label>Available Triggers</Form.Label>\r\n <EupatiDropdown\r\n fieldName=\"actions\"\r\n values={props.triggersMenuOptions.sort(props.compare).map((x: EmailAutomationTriggersMenu, i: number) => { return { id: i, name: x.name } })}\r\n value={props.triggersMenuOptions.sort(props.compare).findIndex((o: any) => templateTriggers.some(tt => tt === o.name))}\r\n errorMsg=\"\"\r\n defaultOptionText=\"No action assigned...\"\r\n onChange={onTemplateTriggersChangeHandler}\r\n />\r\n </Form.Group>\r\n {/* <Form.Group className=\"mb-3\">\r\n <Form.Label>Choosen Receivers</Form.Label>\r\n <EupatiMultiselect\r\n fieldName=\"receivers\"\r\n values={props.receiversMenuOptions}\r\n value={receivers}\r\n errorMsg=''\r\n onChange={(e) => onReceiversChangeHandler(e)}\r\n />\r\n </Form.Group> */}\r\n </Form>\r\n )\r\n}","import React, { useContext, useEffect, useMemo, useState } from \"react\";\r\nimport { Button, Form, Table } from \"react-bootstrap\";\r\nimport { useTable } from \"react-table\";\r\nimport { toast } from \"react-toastify\";\r\nimport { EMAIL_TEMPLATE_CREATED, EMAIL_TEMPLATE_UPDATED } from \"../../../../common/helpers/messages\";\r\nimport { ActionsTemplateData, EmailAutomationTriggerData, EmailAutomationTriggersMenu, EmailTemplateData, LookUpOptions, ModelPropsNames, OptionsData } from \"../../../../common/models/input-models\";\r\nimport AuthenticationContext from \"../../../../common/static/auth-context\";\r\nimport EupatiLoader from \"../../../../common/static/loading-animation/loader\";\r\nimport EmailTemplateEditor from \"../../../../common/static/template-editor\";\r\nimport ActionsTemplateMenu from '../../../../common/static/actions-template-menu';\r\nimport { State } from \"../models\";\r\nimport '../style.scss';\r\nimport ConfirmDenyModal from \"../../../../common/static/confirm-deny-modal\";\r\n\r\ntype OwnProps = {\r\n isEmailTemplatesLoading: boolean;\r\n isSingleEmailTemplateLoading: boolean;\r\n emailTemplatesData: EmailTemplateData[];\r\n singleEmailTemplateData: EmailTemplateData;\r\n projectPropsNames: ModelPropsNames[];\r\n patientPropsNames: ModelPropsNames[];\r\n triggersMenuOptions: EmailAutomationTriggersMenu[];\r\n isTriggersMenuOptionsLoading: boolean;\r\n receiversMenuOptions: LookUpOptions[];\r\n choosenReceivers: number[];\r\n};\r\n\r\nexport type DispatchProps = {\r\n getAllTemplates: () => void;\r\n getSingleTemplate: (id?: string) => void;\r\n createEmailTemplate: (data: EmailTemplateData) => void;\r\n updateEmailTemplate: (data: EmailTemplateData) => void\r\n removeEmailTemplate: (id: string) => void;\r\n getModelsPropsName: (id: string) => void;\r\n getTriggersMenuOptions: () => void;\r\n assignActionsToEmailTemplate: (data: ActionsTemplateData) => void;\r\n getReceiversMenuOptions: () => void;\r\n getEmailTriggerTemplateBeneficiaries: (id: string) => void;\r\n misallocateActionsFromEmailTemplate: (data: ActionsTemplateData) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps;\r\n\r\nconst options = [\r\n { value: 'toResearcher', label: \"Send to researcher\" },\r\n { value: 'toPatient', label: \"Send to patients\" }\r\n] as OptionsData[];\r\n\r\nexport default function EmailTemplates(props: Props) {\r\n const contextData = useContext(AuthenticationContext);\r\n\r\n const [isCreateTemplateClicked, setIsCreateTemplateClicked] = useState<boolean>(false);\r\n const [isEditTemplateClicked, setIsEditTemplateClicked] = useState<boolean>(false);\r\n const [isActionsBtnClicked, setIsActionsBtnClicked] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n if (contextData.isUserAdmin === true) {\r\n props.getAllTemplates();\r\n props.getTriggersMenuOptions();\r\n props.getReceiversMenuOptions();\r\n props.getModelsPropsName(contextData.userIdentity);\r\n }\r\n }, []);\r\n\r\n const onCreateNewHandler = () => {\r\n props.getSingleTemplate();//reset to emptyTemplate\r\n setIsCreateTemplateClicked(true);\r\n }\r\n\r\n const onEditTemplateHandler = (id: string) => {\r\n setIsEditTemplateClicked(true);\r\n props.getSingleTemplate(id);\r\n }\r\n\r\n const onBackToAllHandler = () => {\r\n props.getSingleTemplate();//reset to emptyTemplate\r\n setIsCreateTemplateClicked(false);\r\n setIsEditTemplateClicked(false);\r\n setIsActionsBtnClicked(false);\r\n }\r\n\r\n const onAssignActionsHandler = (id: string) => {\r\n props.getSingleTemplate(id);\r\n setIsActionsBtnClicked(true);\r\n }\r\n\r\n const onRemoveTemplateHandler = (id: string) => {\r\n props.removeEmailTemplate(id);\r\n }\r\n\r\n const onSaveTemplateChangesHandler = (emailTemplateData: EmailTemplateData) => {\r\n switch (emailTemplateData.id !== '') {\r\n case true:\r\n toast.success(EMAIL_TEMPLATE_UPDATED);\r\n props.updateEmailTemplate(emailTemplateData);\r\n break;\r\n default:\r\n toast.success(EMAIL_TEMPLATE_CREATED);\r\n props.createEmailTemplate(emailTemplateData);\r\n break;\r\n }\r\n setIsCreateTemplateClicked(false);\r\n setIsEditTemplateClicked(false);\r\n }\r\n\r\n const compare = (a: any, b: any) => {\r\n if (a.name < b.name) {\r\n return -1;\r\n }\r\n if (a.name > b.name) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n\r\n const data = useMemo(\r\n () => props.emailTemplatesData?.sort(compare).map((x: any, i: any) => {\r\n return {\r\n id: x.id,\r\n index: i + 1,\r\n name: x.name,\r\n //actions: options.filter((o: OptionsData) => x.actions.split(';').some((a: any) => a === o.value)).map((el: OptionsData) => el.label).join(', '),\r\n content: x.htmlContent,\r\n }\r\n }), [props.emailTemplatesData]\r\n )\r\n\r\n const columns = useMemo(\r\n () => [\r\n {\r\n Header: '#',\r\n accessor: 'index'\r\n },\r\n {\r\n Header: 'Name',\r\n accessor: 'name'\r\n },\r\n // {\r\n // Header: 'Actions',\r\n // accessor: 'actions'\r\n // }\r\n ], []\r\n )\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n rows,\r\n prepareRow\r\n } = useTable({\r\n // @ts-ignore\r\n columns,\r\n data,\r\n });\r\n\r\n const loadComp = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n );\r\n\r\n const emailTemplatesComp = (\r\n <>\r\n <h4 style={{ textAlign: 'center', textDecoration: 'underline' }}>EMAIL TEMPLATES</h4>\r\n <Button variant='primary' id='create-btn' onClick={onCreateNewHandler} >CREATE NEW</Button>\r\n <Table {...getTableProps()} striped bordered hover>\r\n <thead>\r\n {headerGroups.map(headerGroup => (\r\n <tr {...headerGroup.getHeaderGroupProps()}>\r\n {headerGroup.headers.map(col => (\r\n <th {...col.getHeaderProps()}>\r\n {col.render('Header')}\r\n </th>\r\n ))}\r\n </tr>\r\n ))}\r\n </thead>\r\n <tbody {...getTableBodyProps()}>\r\n {rows.map((row: any) => {\r\n prepareRow(row);\r\n return (\r\n <tr {...row.getRowProps()}>\r\n {row.cells.map((cell: any) => {\r\n return (\r\n <td {...cell.getCellProps()}>\r\n {cell.render('Cell')}\r\n </td>\r\n )\r\n })}\r\n <>\r\n <td>\r\n <Button\r\n variant='info'\r\n onClick={(e: any) => onAssignActionsHandler(row.original.id)}\r\n >\r\n ACTIONS\r\n </Button>\r\n </td>\r\n <td>\r\n <Button\r\n variant='warning'\r\n onClick={(e: any) => onEditTemplateHandler(row.original.id)}\r\n >\r\n EDIT\r\n </Button>\r\n </td>\r\n <td>\r\n <ConfirmDenyModal\r\n {...{\r\n targetId: row.original.id,\r\n target: 'email template',\r\n params: `name - ${props.emailTemplatesData.find((etd: EmailTemplateData) => etd.id === row.original.id)?.name}`,\r\n handleRemove: onRemoveTemplateHandler\r\n }}\r\n />\r\n {/* <Button\r\n variant='danger'\r\n onClick={(e: any) => onRemoveTemplateHandler(row.original.id)}\r\n >\r\n REMOVE\r\n </Button> */}\r\n </td>\r\n </>\r\n </tr>\r\n )\r\n })}\r\n </tbody>\r\n </Table>\r\n </>\r\n )\r\n\r\n const emailTemplateEditor = (\r\n <>\r\n <h4 style={{ textAlign: 'center', textDecoration: 'underline' }}>EMAIL TEMPLATE EDITOR</h4>\r\n <EmailTemplateEditor\r\n {...{\r\n emailTemplateData: props.singleEmailTemplateData,\r\n onBackToAllHandler: onBackToAllHandler,\r\n onSaveTemplateChangesHandler: onSaveTemplateChangesHandler,\r\n projectPropsNames: props.projectPropsNames,\r\n patientPropsNames: props.patientPropsNames,\r\n options: options\r\n }}\r\n />\r\n </>\r\n )\r\n\r\n const emailTemplatesActionsComp = (\r\n <>\r\n <h4 style={{ textAlign: 'center', textDecoration: 'underline' }}>ASSIGN TRIGGERS TO TEMPLATE</h4>\r\n <ActionsTemplateMenu\r\n {...{\r\n emailTemplate: props.singleEmailTemplateData,\r\n triggersMenuOptions: props.triggersMenuOptions,\r\n filteredTriggersMenuOptions: props.triggersMenuOptions.filter((tmo: EmailAutomationTriggersMenu) => !props.emailTemplatesData.map((etd: EmailTemplateData) => etd.actions).map((etda: EmailAutomationTriggerData[]) => etda.map((x: EmailAutomationTriggerData) => x.name)[0]).some((val: string) => val === tmo.name)),\r\n onBackToAllHandler: onBackToAllHandler,\r\n assignActionsToTemplate: props.assignActionsToEmailTemplate,\r\n receiversMenuOptions: props.receiversMenuOptions,\r\n choosenReceivers: props.choosenReceivers,\r\n compare: compare,\r\n misallocateActionsFromEmailTemplate: props.misallocateActionsFromEmailTemplate\r\n }}\r\n />\r\n </>\r\n )\r\n\r\n const pageSwitcher = () => {\r\n if (props.isEmailTemplatesLoading || props.isSingleEmailTemplateLoading || props.isTriggersMenuOptionsLoading) {\r\n return loadComp;\r\n }\r\n else if (!isCreateTemplateClicked && !isEditTemplateClicked && !isActionsBtnClicked) {\r\n return emailTemplatesComp//grid\r\n }\r\n else if (isActionsBtnClicked) {\r\n return emailTemplatesActionsComp\r\n }\r\n else {\r\n return emailTemplateEditor\r\n }\r\n }\r\n\r\n return (\r\n <Form.Group className='email-templates-wrapper'>\r\n {pageSwitcher()}\r\n </Form.Group>\r\n )\r\n}","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport { State } from '../models';\r\nimport * as Actions from '../actions';\r\nimport { connect } from 'react-redux';\r\nimport { ActionsTemplateData, EmailTemplateData } from '../../../../common/models/input-models';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n getAllTemplates: () => dispatch(Actions.setAllEmailTemplatesAsync()),\r\n getSingleTemplate: (id: string) => dispatch(Actions.setEmailTemplateByIdAsync(id)),\r\n createEmailTemplate: (data: EmailTemplateData) => dispatch(Actions.createNewEmailTemplateAsync(data)),\r\n updateEmailTemplate: (data: EmailTemplateData) => dispatch(Actions.updateEmailTemplateDataAsync(data)),\r\n removeEmailTemplate: (id: string) => dispatch(Actions.removeEmailTemplateDataAsync(id)),\r\n getModelsPropsName: (id: string) => dispatch(Actions.setModelsPropsNamesAsync(id)),\r\n getTriggersMenuOptions: () => dispatch(Actions.setTriggersMenuOptionsAsync()),\r\n assignActionsToEmailTemplate: (data: ActionsTemplateData) => dispatch(Actions.assignActionsToEmailTemplateAsync(data)),\r\n getReceiversMenuOptions: () => dispatch(Actions.setReceiversMenuOptionsAsync()),\r\n getEmailTriggerTemplateBeneficiaries: (id: string) => dispatch(Actions.setEmailTriggerTemplateBeneficiariesAsync(id)),\r\n misallocateActionsFromEmailTemplate: (data: ActionsTemplateData) => dispatch(Actions.misallocateActionsFromEmailTemplateAsync(data))\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { emptyTemplate, State } from \"./models\";\r\nimport * as t from './actionTypes';\r\nimport { EmailAutomationTriggersMenu, EmailTemplateData, LookUpOptions, ModelPropsNames } from \"../../../common/models/input-models\";\r\n\r\nconst initialState: State = {\r\n isEmailTemplatesLoading: false,\r\n isSingleEmailTemplateLoading: false,\r\n emailTemplatesData: [],\r\n singleEmailTemplateData: emptyTemplate,\r\n projectPropsNames: [],\r\n patientPropsNames: [],\r\n triggersMenuOptions: [],\r\n isTriggersMenuOptionsLoading: false,\r\n receiversMenuOptions: [],\r\n choosenReceivers: []\r\n};\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_EMAIL_TEMPLATES_LOADING:\r\n return setEmailTemplatesLoading(state, action.payload);\r\n case t.SET_EMAIL_TEMPLATE_DATA:\r\n return setEmailTemplatesData(state, action.payload);\r\n case t.SET_SINGLE_EMAIL_TEMPLATE_LOADING:\r\n return setSingleEmailTemplateLoading(state, action.payload);\r\n case t.SET_SINGLE_EMAIL_TEMPLATE_DATA:\r\n return setSingleEmailTemplateData(state, action.payload);\r\n case t.SET_PROJECT_MODEL_PROPS_NAMES:\r\n return setProjectModelPropsNames(state, action.payload);\r\n case t.SET_PATIENT_MODEL_PROPS_NAMES:\r\n return setPatientModelPropsNames(state, action.payload);\r\n case t.SET_TRIGGERS_MENU_OPTIONS:\r\n return setTriggersMenuOptions(state, action.payload);\r\n case t.SET_TRIGGERS_MENU_OPTIONS_LOADING:\r\n return setTriggersMenuOptionsLoading(state, action.payload);\r\n case t.SET_RECEIVERS_MENU_OPTIONS:\r\n return setReceiversMenuOptions(state, action.payload);\r\n case t.SET_CHOOSEN_RECEIVERS:\r\n return setChoosenReceivers(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst setEmailTemplatesLoading = (state: State, val: boolean): State => {\r\n const newState = {\r\n ...state,\r\n isEmailTemplatesLoading: val\r\n } as State;\r\n\r\n return newState;\r\n};\r\n\r\nconst setSingleEmailTemplateLoading = (state: State, val: boolean): State => {\r\n const newState = {\r\n ...state,\r\n isSingleEmailTemplateLoading: val\r\n } as State;\r\n\r\n return newState;\r\n};\r\n\r\nconst setEmailTemplatesData = (state: State, val: EmailTemplateData[]): State => {\r\n const newState = {\r\n ...state,\r\n emailTemplatesData: [...val]\r\n } as State;\r\n\r\n return newState;\r\n};\r\n\r\nconst setSingleEmailTemplateData = (state: State, val: EmailTemplateData): State => {\r\n const newState = {\r\n ...state,\r\n singleEmailTemplateData: { ...val }\r\n } as State;\r\n\r\n return newState;\r\n};\r\n\r\nconst setProjectModelPropsNames = (state: State, val: ModelPropsNames[]): State => {\r\n const newState = {\r\n ...state,\r\n projectPropsNames: [...val]\r\n } as State;\r\n\r\n return newState;\r\n};\r\n\r\nconst setPatientModelPropsNames = (state: State, val: ModelPropsNames[]): State => {\r\n const newState = {\r\n ...state,\r\n patientPropsNames: [...val]\r\n } as State;\r\n\r\n return newState;\r\n};\r\n\r\nconst setTriggersMenuOptions = (state: State, val: EmailAutomationTriggersMenu[]): State => {\r\n const newState = {\r\n ...state,\r\n triggersMenuOptions: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setTriggersMenuOptionsLoading = (state: State, val: boolean): State => {\r\n const newState = {\r\n ...state,\r\n isTriggersMenuOptionsLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setReceiversMenuOptions = (state: State, val: LookUpOptions[]): State => {\r\n const newState = {\r\n ...state,\r\n receiversMenuOptions: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setChoosenReceivers = (state: State, val: number[]): State => {\r\n const newState = {\r\n ...state,\r\n choosenReceivers: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","export const NAME = 'emailResponse';","import { NAME } from \"./constants\";\r\n\r\nexport const SET_LOADING = `${NAME}/SET_LOADING`;","import DataSvc from '../../common/services/data-svc';\r\nimport { ChangePatientStatusData, ProjectFeedbackData, ProjectStatusData, SurveyAnswerData } from '../../common/models/input-models';\r\nimport * as t from './actionTypes';\r\n\r\nexport const setLoading = (isLoading: boolean) => ({\r\n type: t.SET_LOADING,\r\n payload: isLoading\r\n});\r\n\r\nexport const changePatientStatusAsync = (data: ChangePatientStatusData) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setLoading(true));\r\n DataSvc.patientSvc.changePatientStatus(data).then(\r\n (result: any) => {\r\n if (result === 'You got me on that one...') {\r\n dispatch(setLoading(false));\r\n }\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const addSurveyAnswerAsync = (data: SurveyAnswerData) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setLoading(true));\r\n DataSvc.patientSvc.addSurveyAnswer(data).then(\r\n (result: any) => {\r\n if (result === 'You are a wizard, Harry...') {\r\n dispatch(setLoading(false));\r\n }\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const changeProjectStatusAsync = (data: ProjectStatusData) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setLoading(true));\r\n DataSvc.projectsSvc.changeProjectStatus(data).then(\r\n (result: any) => {\r\n dispatch(setLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const addProjectFeedbackAsync = (data: ProjectFeedbackData) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setLoading(true));\r\n DataSvc.projectsSvc.addFeedback(data).then(\r\n (result: any) => {\r\n dispatch(setLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}","import React, { useEffect, useState } from \"react\";\r\nimport { ChangePatientStatusData, ProjectFeedbackData, ProjectStatusData, SurveyAnswerData } from \"../../../common/models/input-models\";\r\nimport { State } from \"../model\";\r\nimport confrimImg from '../../../../images/confirm-img.png';\r\nimport declineImg from '../../../../images/decline-img.png';\r\nimport { Button } from \"react-bootstrap\";\r\nimport '../style.scss';\r\nimport { useHistory } from \"react-router\";\r\nimport EupatiLoader from \"../../../common/static/loading-animation/loader\";\r\nimport { toast } from \"react-toastify\";\r\nimport { ANSWER_SUBMIT_SUCC } from \"../../../common/helpers/messages\";\r\nimport { projectStatus, patientStatus } from '../../../common/helpers/status';\r\n\r\ntype OwnProps = {\r\n isLoading: boolean;\r\n};\r\n\r\nexport type DispatchProps = {\r\n changePatientStatus: (data: ChangePatientStatusData) => void;\r\n addSurveyAnswer: (data: SurveyAnswerData) => void;\r\n changeProjectStatus: (data: ProjectStatusData) => void;\r\n addProjectFeedback: (data: ProjectFeedbackData) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps;\r\n\r\nconst CONFRIM_PATH = 'letter-of-confirmation';\r\nconst REJECT_PATH = 'letter-of-rejection';\r\nconst url = window.location.href;\r\nconst regex = /(\\?|\\&)(uid|pid)\\=([a-zA-Z0-9-]+)/gm;\r\nconst DEFAULT_HTML = '<p>The page does not exist!</p>';\r\nexport default function EmailResponsePage(props: Props) {\r\n const history = useHistory();\r\n\r\n const [html, setHtml] = useState<string>(DEFAULT_HTML);\r\n const [text, setText] = useState<string>('');\r\n const [uid, setUID] = useState<string>('');\r\n const [pid, setPID] = useState<string>('');\r\n const [matches, setMatches] = useState<number>(0);\r\n\r\n useEffect(() => {\r\n //match 1: ?uid=e9d034f0-410d-4b52-b6df-d754c942c0ee match 2: &pid=df915d9a-06c8-4af3-981a-b668e2c11db7\r\n //group 1: ? group 1: &\r\n //group 2: uid group 2: pid\r\n //group 3: e9d034f0-410d-4b52-b6df-d754c942c0ee group 3: df915d9a-06c8-4af3-981a-b668e2c11db7\r\n const match = [...url.matchAll(regex)];\r\n setMatches(match.length);\r\n if (match !== null && match.length === 2) {\r\n try {\r\n const patientId = match[0][3];\r\n const projectId = match[1][3];\r\n setUID(patientId); setPID(projectId);\r\n if (url.includes(REJECT_PATH)) {\r\n const data = {\r\n uid: patientId,\r\n pid: projectId,\r\n sid: patientStatus.notInterestedStatusID\r\n } as ChangePatientStatusData;\r\n props.changePatientStatus(data);\r\n setHtml('<p>Thank you for the response.</br>We understand you are busy right now.</br>We will keep you informed on further opportunities.</p>');\r\n }\r\n else if (url.includes(CONFRIM_PATH)) {\r\n const data = {\r\n uid: patientId,\r\n pid: projectId,\r\n sid: patientStatus.confirmedStatusID\r\n } as ChangePatientStatusData;\r\n props.changePatientStatus(data);\r\n setHtml('<p>Thank you for confirming.</br>We will contact you shortly.</p>');\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n else if (match !== null && match.length === 1) {\r\n try {\r\n if (url.includes(CONFRIM_PATH)) {\r\n const projectId = match[0][3];\r\n setPID(projectId);\r\n const data = {\r\n projectId: projectId,\r\n statusId: projectStatus.inProgressStatusID\r\n } as ProjectStatusData;\r\n props.changeProjectStatus(data);\r\n setHtml('<p>Thank you for confirming.</br>We will contact you shortly.</p>');\r\n }\r\n else if (url.includes(REJECT_PATH)) {\r\n const projectId = match[0][3];\r\n setPID(projectId);\r\n const data = {\r\n projectId: projectId,\r\n statusId: projectStatus.declinedStatusID\r\n } as ProjectStatusData;\r\n props.changeProjectStatus(data);\r\n setHtml('<p>Thank you for the response.</br>Please do not hesitate to contact us, if you need further assistance.</p>');\r\n }\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n }, []);\r\n //patient response\r\n function addPatientSurveyAnswerHandler() {\r\n props.addSurveyAnswer({\r\n uid: uid,\r\n pid: pid,\r\n txt: text\r\n } as SurveyAnswerData);\r\n toast.success(ANSWER_SUBMIT_SUCC);\r\n history.push('/');\r\n }\r\n //researcher response\r\n function addProjectFeedbackHandler() {\r\n props.addProjectFeedback({\r\n projectId: pid,\r\n feedback: text\r\n } as ProjectFeedbackData);\r\n toast.success(ANSWER_SUBMIT_SUCC);\r\n history.push('/');\r\n }\r\n\r\n let mainComp = null;\r\n let loadingComp = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n );\r\n\r\n if (props.isLoading) {\r\n mainComp = loadingComp;\r\n }\r\n else {\r\n mainComp = (\r\n <div className='mail-response'>\r\n {/* <img src={html === DEFAULT_HTML ? declineImg : confrimImg} alt='confrim' className=\"mail-response-img\" /> */}\r\n <div\r\n className=\"mail-response-text\"\r\n dangerouslySetInnerHTML={{ __html: html }}\r\n style={{ paddingTop: '40px', paddingBottom: '40px' }}\r\n >\r\n </div>\r\n {html !== DEFAULT_HTML &&\r\n <>\r\n <div>\r\n <textarea\r\n rows={10}\r\n cols={50}\r\n placeholder={html.includes('confirming') ?\r\n \"Please tell us why you are fit for this project...\" : \"To help us improve, please give us your feedback...\"\r\n }\r\n value={text}\r\n onChange={(e) => setText(e.target.value)}\r\n />\r\n </div>\r\n <div style={{ width: '100%' }}>\r\n {matches === 2 && (\r\n <Button\r\n className='mail-response-btn'\r\n onClick={addPatientSurveyAnswerHandler}\r\n >\r\n Submit\r\n </Button>\r\n )}\r\n {matches === 1 && (\r\n <Button\r\n className='mail-response-btn'\r\n onClick={addProjectFeedbackHandler}\r\n >\r\n Submit\r\n </Button>\r\n )}\r\n </div>\r\n </>\r\n }\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {mainComp}\r\n </>\r\n )\r\n}","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport * as Actions from '../actions';\r\nimport { State } from '../model';\r\nimport { connect } from 'react-redux';\r\nimport { ChangePatientStatusData, ProjectFeedbackData, ProjectStatusData, SurveyAnswerData } from '../../../common/models/input-models';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n changePatientStatus: (data: ChangePatientStatusData) => dispatch(Actions.changePatientStatusAsync(data)),\r\n addSurveyAnswer: (data: SurveyAnswerData) => dispatch(Actions.addSurveyAnswerAsync(data)),\r\n changeProjectStatus: (data: ProjectStatusData) => dispatch(Actions.changeProjectStatusAsync(data)),\r\n addProjectFeedback: (data: ProjectFeedbackData) => dispatch(Actions.addProjectFeedbackAsync(data))\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { State } from \"./model\";\r\nimport * as t from './actionTypes';\r\n\r\nconst initialState: State = {\r\n isLoading: false\r\n};\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_LOADING:\r\n return setLoading(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst setLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","// constants.ts\r\n\r\nexport const NAME = 'paymentPage';","import { NAME } from \"./constants\";\r\n\r\nexport const SET_PAYMENT_LOADING = `${NAME}/SET_PAYMENT_LOADING`;\r\n\r\nexport const SET_LOOKUP_DATA_LOADING = `${NAME}/SET_LOOKUP_DATA_LOADING`;\r\n\r\nexport const SET_LOOKUP_DATA = `${NAME}/SET_LOOKUP_DATA`;\r\n\r\nexport const SET_PAYMENT_RESPONSE = `${NAME}/SET_PAYMENT_RESPONSE`;\r\n\r\nexport const SET_ALL_COUNTRIES_DATA = `${NAME}/SET_ALL_COUNTRIES_DATA`;\r\n\r\nexport const SET_ALL_COUNTRIES_LOADING = `${NAME}/SET_ALL_COUNTRIES_LOADING`;","// matching/actions.js\r\n\r\nimport { CountriesWithCodeModel, LookUpData, PaymentIntentCreateModel, PaymentIntentResponseModel } from '../../common/models/input-models.js';\r\nimport DataSvc from '../../common/services/data-svc';\r\nimport * as t from './actionType.js';\r\n\r\nexport const setPaymentLoading = (isLoading: boolean) => ({\r\n type: t.SET_PAYMENT_LOADING,\r\n payload: isLoading,\r\n});\r\n\r\nexport const setLookUpDataLoading = (isLoading: boolean) => ({\r\n type: t.SET_LOOKUP_DATA_LOADING,\r\n payload: isLoading\r\n});\r\n\r\nexport const setLookUpData = (data: LookUpData[]) => ({\r\n type: t.SET_LOOKUP_DATA,\r\n payload: [...data]\r\n});\r\n\r\nexport const setPaymentResponse = (model: PaymentIntentResponseModel) => ({\r\n type: t.SET_PAYMENT_RESPONSE,\r\n payload: { ...model }\r\n});\r\n\r\nexport const setAllCountriesData = (model: CountriesWithCodeModel[]) => ({\r\n type: t.SET_ALL_COUNTRIES_DATA,\r\n payload: [...model]\r\n});\r\n\r\nexport const setAllCountriesLoading = (isLoading: boolean) => ({\r\n type: t.SET_ALL_COUNTRIES_LOADING,\r\n payload: isLoading\r\n});\r\n\r\nexport const getLookUpDataAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setLookUpDataLoading(true));\r\n DataSvc.utilsSvc.getLookUpData().then(\r\n (result: any) => {\r\n dispatch(setLookUpData(result));\r\n dispatch(setLookUpDataLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n };\r\n};\r\n\r\nexport const getAllCountriesAsync = () => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setAllCountriesLoading(true));\r\n DataSvc.utilsSvc.getAllCountries().then(\r\n (result: any) => {\r\n dispatch(setAllCountriesData(result));\r\n dispatch(setAllCountriesLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n )\r\n }\r\n}\r\n\r\nexport const createPaymentIntentAsync = (data: PaymentIntentCreateModel) => {\r\n return (dispatch: any, getState: any) => {\r\n dispatch(setPaymentLoading(true));\r\n DataSvc.paymentSvc.createPaymentIntent(data).then(\r\n (result: any) => {\r\n //TODO: add error handler;\r\n //just to log the error is not enough in this case;\r\n //because we are chargin real money;\r\n //and if it fails for some reason;\r\n //we should be able to display the message to the user;\r\n //endless loading screen after you click \"Pay\" is a big no no imo.\r\n dispatch(setPaymentResponse(result));//clientSecret\r\n dispatch(setPaymentLoading(false));\r\n },\r\n (error) => { console.error(error); }\r\n );\r\n };\r\n};","import React from \"react\"\r\nimport { useHistory } from \"react-router\";\r\n\r\ntype OwnProps = {\r\n message: string;\r\n isFail: boolean;\r\n price?: number;\r\n plan?: string;\r\n package?: string;\r\n paymentMethod?: string;\r\n clientSecret?: string;\r\n}\r\n\r\ntype DispatchProps = {\r\n swapComponents: (shouldSwap: boolean) => void;\r\n startLoading: () => void;\r\n}\r\n\r\ntype Props = OwnProps & DispatchProps;\r\n\r\nexport default function CheckoutResult(props: Props) {\r\n const history = useHistory();\r\n\r\n function redirectTo(pathname: string) {\r\n history.push({\r\n pathname: pathname,\r\n state: {\r\n price: props.price === undefined ? -1 : props.price,\r\n plan: props.plan === undefined ? '' : props.plan,\r\n package: props.package === undefined ? '' : props.package,\r\n paymentMethod: props.paymentMethod === undefined ? '' : props.paymentMethod,\r\n clientSecret: props.clientSecret\r\n }\r\n });\r\n }\r\n\r\n return (\r\n <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\r\n {props.isFail ? (\r\n <div>purchased failed - <span style={{ color: '#bb2124' }} >{props.message}</span>\r\n <button onClick={() => {\r\n props.startLoading();\r\n setTimeout(() => {\r\n props.swapComponents(false)\r\n }, 200);\r\n }}>\r\n Try again\r\n </button>\r\n </div>\r\n ) : (\r\n <div>thanks for the purchase - <span style={{ color: '#22bb33' }} >{props.message}</span>\r\n <button onClick={() => redirectTo('/new-project')}>Proceed</button>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}","import React, { useState } from 'react';\r\nimport { CardElement, useElements, useStripe } from '@stripe/react-stripe-js';\r\nimport { Button, Form } from 'react-bootstrap';\r\nimport { Controller, useForm } from 'react-hook-form';\r\nimport EupatiTextbox from './textbox';\r\nimport EupatiDropdown from './dropdown';\r\nimport { CountriesWithCodeModel, LookUpData } from '../models/input-models';\r\nimport { Rules } from '../helpers';\r\nimport CheckoutResult from './checkout-outcome';\r\nimport EupatiLoader from './loading-animation/loader';\r\nimport './static.scss';\r\n\r\ntype Props = {\r\n lookUpData: LookUpData[],\r\n clientSecret: string,\r\n countries: CountriesWithCodeModel[];\r\n price?: number;\r\n plan?: string;\r\n package?: string;\r\n paymentMethod?: string;\r\n};\r\n\r\ntype SubmitFormData = {\r\n name: string;\r\n phone: string;\r\n email: string;\r\n city: string;\r\n country: string;\r\n line1: string;\r\n line2: string;\r\n zip: string;//postal_code\r\n state: string;\r\n};\r\n\r\nexport default function StripeCard(props: Props) {\r\n const { handleSubmit, control, watch, formState: { errors } } = useForm();\r\n\r\n const elements = useElements();\r\n const stripe = useStripe();\r\n\r\n const [isLoading, setIsLoading] = useState<boolean>(false);\r\n const [message, setMessage] = useState<string>('');\r\n const [shouldRenderSubComp, setShouldRenderSubComp] = useState<boolean>(false);\r\n const [isPaymentFailed, setIsPaymentFailed] = useState<boolean>(false);\r\n\r\n const fieldsData = {\r\n name: watch(\"name\", '') as string,\r\n phone: watch(\"phone\", '') as string,\r\n email: watch(\"email\", '') as string,\r\n city: watch(\"city\", '') as string,\r\n country: watch(\"country\", '') as string,\r\n line1: watch(\"line1\", '') as string,\r\n line2: watch(\"line2\", '') as string,\r\n zip: watch(\"zip\", '') as string,\r\n state: watch(\"state\", '') as string,\r\n } as SubmitFormData;\r\n\r\n const onSubmit = async (data: SubmitFormData) => {\r\n if (!stripe || !elements) {\r\n return;\r\n }\r\n\r\n // confirm payment\r\n // TODO: add checkout outcome pages (success and fail)\r\n const cardElement = elements.getElement(CardElement);\r\n if (cardElement) {\r\n const { error: stripeError, paymentIntent } = await stripe.confirmCardPayment(\r\n //props.clientSecret, {\r\n \"pi_3Ktr2NAfbriVg9as0afScgCw_secret_RHZRBa3UvEqVqYrWXWVILMSj9\", {\r\n payment_method: {\r\n card: cardElement,\r\n billing_details: {\r\n address: {\r\n city: data.city,\r\n country: returnCountryCode(parseInt(data.country)),\r\n line1: data.line1,\r\n line2: data.line2,\r\n postal_code: data.zip,\r\n state: data.state\r\n },\r\n email: data.email,\r\n name: data.name,\r\n phone: data.phone\r\n }\r\n }\r\n });\r\n setIsLoading(true);\r\n if (stripeError) {\r\n //console.error(stripeError);\r\n setIsPaymentFailed(true);\r\n const message = stripeError.message;\r\n if (message) {\r\n setMessage(message);\r\n }\r\n else {\r\n setMessage('Something went wrong...');\r\n }\r\n swapComponents(true);\r\n return;\r\n }\r\n\r\n //console.log(paymentIntent);\r\n setIsPaymentFailed(false);\r\n setMessage('you can now create a project');\r\n swapComponents(true);\r\n }\r\n }\r\n\r\n function findLookUpData(lookUpDataType?: string) {\r\n if (props.lookUpData &&\r\n props.lookUpData.length > 0) {\r\n return props.lookUpData?.filter((x: any) => x.name == lookUpDataType)[0]?.data;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n const returnCountryCode = (countryId: number) => {\r\n const country = props.countries.find(c => c.id === countryId);\r\n if (country) {\r\n return country.code;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n const swapComponents = (shouldSwap: boolean) => {\r\n setIsLoading(true);\r\n setShouldRenderSubComp(shouldSwap);\r\n setTimeout(() => {\r\n setIsLoading(false);\r\n }, 300);\r\n }\r\n\r\n const cardElementOptions = {\r\n // a way to inject styles into stripe iframe\r\n hidePostalCode: true,\r\n }\r\n\r\n let loadComp = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n );\r\n\r\n let mainComp = null;\r\n let subComp = null;\r\n if (isLoading) {\r\n mainComp = loadComp;\r\n subComp = loadComp;\r\n }\r\n else {\r\n //#region MainComponent\r\n mainComp = (\r\n <div id='stripe-payment'>\r\n <h4>Checkout</h4>\r\n <Form id='stripe-payment-form' onSubmit={handleSubmit(onSubmit)}>\r\n {/* <Form.Group className='billing-info'>\r\n <h6 className='billing-info-text'>Billing details</h6>\r\n </Form.Group> */}\r\n\r\n <Form.Group id='row-wrapper'>\r\n <Form.Group className='stripe-payment-field' id='row'>\r\n <Form.Label>Name</Form.Label>\r\n <Controller\r\n control={control}\r\n name='name'\r\n rules={Rules.requiredMessage}\r\n defaultValue={fieldsData.name}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.name?.message,\r\n placeholder: 'John Doe'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='stripe-payment-field' id='row'>\r\n <Form.Label>Phone</Form.Label>\r\n <Controller\r\n control={control}\r\n name='phone'\r\n rules={Rules.requiredMessage}\r\n defaultValue={fieldsData.phone}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.phone?.message,\r\n placeholder: '+447975777666'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='stripe-payment-field' id='row'>\r\n <Form.Label>Email</Form.Label>\r\n <Controller\r\n control={control}\r\n name='email'\r\n rules={Rules.requiredMessage}\r\n defaultValue={fieldsData.email}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.email?.message,\r\n placeholder: 'john.doe@example.com'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='stripe-payment-field' id='row'>\r\n <Form.Label>City</Form.Label>\r\n <Controller\r\n control={control}\r\n name='city'\r\n rules={Rules.requiredMessage}\r\n defaultValue={fieldsData.city}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.city?.message,\r\n placeholder: 'Essex'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='stripe-payment-field' id='row'>\r\n <Form.Label>Ðddress Line 1</Form.Label>\r\n <Controller\r\n control={control}\r\n name='line1'\r\n rules={Rules.requiredMessage}\r\n defaultValue={fieldsData.line1}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.line1?.message,\r\n placeholder: 'Street address'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='stripe-payment-field' id='row'>\r\n <Form.Label>Address Line 2</Form.Label>\r\n <Controller\r\n control={control}\r\n name='line2'\r\n rules={Rules.notRequired}\r\n defaultValue={fieldsData.line2}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.line2?.message,\r\n placeholder: 'Apartment, building, floor'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='stripe-payment-field' id='row'>\r\n <Form.Label>Postal code</Form.Label>\r\n <Controller\r\n control={control}\r\n name='zip'\r\n rules={Rules.requiredMessage}\r\n defaultValue={fieldsData.zip}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.zip?.message,\r\n placeholder: 'CB1 6NU'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='stripe-payment-field' id='row'>\r\n <Form.Label>Province</Form.Label>\r\n <Controller\r\n control={control}\r\n name='state'\r\n rules={Rules.requiredMessage}\r\n defaultValue={fieldsData.state}\r\n render={({ field }) =>\r\n <EupatiTextbox\r\n {...{\r\n ...field,\r\n errorMsg: errors?.state?.message,\r\n placeholder: 'Greater London'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n </Form.Group>\r\n\r\n <Form.Group id='row-wrapper-2'>\r\n <Form.Group className='stripe-payment-field mb-4' id='row-2'>\r\n <Form.Label>Country</Form.Label>\r\n <Controller\r\n control={control}\r\n name='country'\r\n rules={Rules.selectOptionMessage}\r\n defaultValue={fieldsData.country}\r\n render={({ field }) =>\r\n <EupatiDropdown\r\n {...{\r\n ...field,\r\n errorMsg: errors?.country?.message,\r\n fieldName: 'countries',\r\n values: findLookUpData('country'),\r\n defaultOptionText: 'Please select country...'\r\n }}\r\n />\r\n }\r\n />\r\n </Form.Group>\r\n\r\n <Form.Group className='card-info' id='row-2'>\r\n <Form.Label htmlFor='stripe-card-element'>Card information</Form.Label>\r\n <Form.Group className=\"form-control\" style={{ height: '2.4rem', paddingTop: '.7em' }} >\r\n <CardElement\r\n id='stripe-card-element'\r\n options={cardElementOptions}\r\n />\r\n </Form.Group>\r\n </Form.Group>\r\n </Form.Group>\r\n <Button type='submit'>Pay</Button>\r\n </Form>\r\n </div>\r\n );\r\n //#endregion\r\n\r\n //#region SubComponent\r\n subComp = (\r\n <>\r\n <CheckoutResult\r\n {...{\r\n isFail: isPaymentFailed,\r\n message: message,\r\n plan: props.plan,\r\n package: props.package,\r\n paymentMethod: props.paymentMethod,\r\n price: props.price,\r\n clientSecret: props.clientSecret,\r\n swapComponents: swapComponents,\r\n startLoading: () => setIsLoading(true)\r\n }}\r\n />\r\n </>\r\n );\r\n //#endregion\r\n }\r\n\r\n return (\r\n <>\r\n {shouldRenderSubComp ? (\r\n <>\r\n {subComp}\r\n </>\r\n ) : (\r\n <>\r\n {mainComp}\r\n </>\r\n )}\r\n </>\r\n )\r\n}","import { RouteComponentProps } from \"@reach/router\";\r\nimport React from \"react\";\r\nimport { INVALID_PRICING_DATA } from \"../../../common/helpers/messages\";\r\nimport { State } from \"../model\";\r\nimport { toast } from 'react-toastify';\r\nimport { CountriesWithCodeModel, LookUpData, PaymentIntentCreateModel, PaymentIntentResponseModel } from \"../../../common/models/input-models\";\r\nimport EupatiLoader from \"../../../common/static/loading-animation/loader\";\r\nimport '../styles.scss';\r\nimport StripeCard from \"../../../common/static/stripe-card\";\r\n\r\ntype OwnProps = {\r\n isPaymentLoading: boolean;\r\n isLookUpDataLoading: boolean;\r\n isCountriesLoading: boolean;\r\n lookUpData: LookUpData[];\r\n countries: CountriesWithCodeModel[];\r\n paymentResponse: PaymentIntentResponseModel;\r\n};\r\n\r\nexport type DispatchProps = {\r\n getLookUpData: () => void;\r\n getAllCountries: () => void;\r\n createPaymentIntent: (data: PaymentIntentCreateModel) => void;\r\n};\r\n\r\ntype Props = State & DispatchProps & OwnProps & RouteComponentProps<{ location: { state: { price: number, plan: string, package: string, paymentMethod: string, clientSecret?: string } } }>;\r\n\r\ntype OwnState = {\r\n clientSecret: string;\r\n};\r\n\r\nexport default class ComponentRoot extends React.Component<Props, OwnState> {\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n clientSecret: ''\r\n } as OwnState;\r\n }\r\n\r\n componentDidMount() {\r\n const historyState = this.props.location?.state;\r\n if (historyState === undefined || historyState.price <= 0 ||\r\n historyState.package === '' || historyState.paymentMethod === '') {\r\n toast.error(INVALID_PRICING_DATA);\r\n window.location.href = '/pricing';\r\n }\r\n else {\r\n if (historyState.clientSecret === undefined) {\r\n this.props.createPaymentIntent({ price: historyState.price });\r\n }\r\n else {\r\n this.setState({ clientSecret: historyState.clientSecret });\r\n }\r\n this.props.getLookUpData();\r\n this.props.getAllCountries();\r\n }\r\n }\r\n\r\n render() {\r\n let mainComp = null;\r\n let loadComp = (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n );\r\n\r\n if (this.props.isLookUpDataLoading ||\r\n this.props.isPaymentLoading ||\r\n this.props.isCountriesLoading\r\n ) {\r\n mainComp = loadComp;\r\n }\r\n else {\r\n mainComp = (\r\n <>\r\n <StripeCard\r\n {...{\r\n lookUpData: this.props.lookUpData,\r\n countries: this.props.countries,\r\n clientSecret: this.state.clientSecret === '' ? this.props.paymentResponse.clientSecret : this.state.clientSecret,\r\n package: this.props.location?.state.package,\r\n plan: this.props.location?.state.plan,\r\n price: this.props.location?.state.price,\r\n paymentMethod: this.props.location?.state.paymentMethod\r\n }}\r\n />\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <React.Fragment>\r\n {mainComp}\r\n </React.Fragment>\r\n )\r\n }\r\n}","import { default as RootComponent, DispatchProps } from '../components/component-root';\r\nimport * as Constants from '../constants';\r\nimport * as Actions from '../actions';\r\nimport { State } from '../model';\r\nimport { connect } from 'react-redux';\r\nimport { PaymentIntentCreateModel } from '../../../common/models/input-models';\r\n\r\nexport function mapStateToProps(globalState: any) {\r\n let name = Constants.NAME;\r\n let pageState = globalState[name] as State;\r\n return pageState;\r\n}\r\n\r\nexport function mapDispatchToProps(dispatch: any) {\r\n return {\r\n getLookUpData: () => dispatch(Actions.getLookUpDataAsync()),\r\n createPaymentIntent: (data: PaymentIntentCreateModel) => dispatch(Actions.createPaymentIntentAsync(data)),\r\n getAllCountries: () => dispatch(Actions.getAllCountriesAsync())\r\n } as DispatchProps;\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RootComponent);","import { State } from './model';\r\nimport * as t from './actionType'\r\nimport { CountriesWithCodeModel, LookUpData, PaymentIntentResponseModel } from '../../common/models/input-models';\r\n\r\nconst initialState: State = {\r\n isPaymentLoading: false,\r\n isLookUpDataLoading: false,\r\n isCountriesLoading: false,\r\n lookUpData: [],\r\n countries: [],\r\n paymentResponse: {\r\n clientSecret: ''\r\n }\r\n};\r\n\r\nexport default (state = initialState, action: any): State => {\r\n switch (action.type) {\r\n case t.SET_PAYMENT_LOADING:\r\n return setPaymentLoading(state, action.payload);\r\n case t.SET_LOOKUP_DATA_LOADING:\r\n return setLookUpDataLoading(state, action.payload);\r\n case t.SET_LOOKUP_DATA:\r\n return setLookUpData(state, action.payload);\r\n case t.SET_PAYMENT_RESPONSE:\r\n return setPaymentResponse(state, action.payload);\r\n case t.SET_ALL_COUNTRIES_DATA:\r\n return setAllCountriesData(state, action.payload);\r\n case t.SET_ALL_COUNTRIES_LOADING:\r\n return setAllCountriesLoading(state, action.payload);\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst setPaymentLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isPaymentLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setLookUpDataLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isLookUpDataLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setLookUpData = (state: State, val: LookUpData[]): State => {\r\n let newState = {\r\n ...state,\r\n lookUpData: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setPaymentResponse = (state: State, val: PaymentIntentResponseModel): State => {\r\n let newState = {\r\n ...state,\r\n paymentResponse: { ...val }\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setAllCountriesData = (state: State, val: CountriesWithCodeModel[]): State => {\r\n let newState = {\r\n ...state,\r\n countries: [...val]\r\n } as State;\r\n\r\n return newState;\r\n}\r\n\r\nconst setAllCountriesLoading = (state: State, val: boolean): State => {\r\n let newState = {\r\n ...state,\r\n isCountriesLoading: val\r\n } as State;\r\n\r\n return newState;\r\n}","import * as Actions from './actions';\r\nimport * as Components from './components/index';\r\nimport * as Containers from './containers/index';\r\nimport * as Constants from './constants';\r\nimport Reducer from './reducer';\r\n\r\nexport default {\r\n actions: Actions,\r\n components: Components,\r\n containers: Containers,\r\n constants: Constants,\r\n reducer: Reducer\r\n};\r\n\r\nexport const Root = Containers.ComponentRoot;","import newProject from '../components/modules/new-project';\r\nimport patientProfile from '../components/modules/patient-profile';\r\nimport homePage from '../components/modules/home';\r\nimport allProjects from '../components/modules/admin/all-projects';\r\nimport importPatients from '../components/modules/admin/import-patients';\r\nimport allPatients from '../components/modules/admin/all-patients';\r\nimport adminsLs from '../components/modules/admin/admins-ls';\r\nimport contentEditor from '../components/modules/admin/content-editor';\r\nimport priceCatalog from '../components/modules/admin/price-catalog';\r\nimport pricing from '../components/modules/pricing';\r\nimport contentManagement from '../components/modules/admin/content-management';\r\nimport emailTemplates from '../components/modules/admin/email-templates';\r\nimport emailResponse from '../components/modules/confirm';\r\nimport payment from '../components/modules/payment';\r\n\r\n// The top-level state object\r\nexport interface ApplicationState {\r\n\r\n}\r\n\r\n// Whenever an action is dispatched, Redux will update each top-level application state property using\r\n// the reducer with the matching name. It's important that the names match exactly, and that the reducer\r\n// acts on the corresponding ApplicationState property type.\r\nexport const reducers = {\r\n // guest\r\n contentManagement: contentManagement.reducer,\r\n homePage: homePage.reducer,\r\n newProject: newProject.reducer,\r\n paymentPage: payment.reducer,\r\n // users\r\n patientProfile: patientProfile.reducer,\r\n emailResponse: emailResponse.reducer,\r\n // admins\r\n allAdmins: adminsLs.reducer,\r\n allPatients: allPatients.reducer,\r\n allProjects: allProjects.reducer,\r\n contentEditor: contentEditor.reducer,\r\n emailTemplates: emailTemplates.reducer,\r\n importPatients: importPatients.reducer,\r\n priceCatalog: priceCatalog.reducer,\r\n pricingPage: pricing.reducer,\r\n};\r\n\r\n// This type can be used as a hint on action creators so that its 'dispatch' and 'getState' params are\r\n// correctly typed to match your store.\r\nexport interface AppThunkAction<TAction> {\r\n (dispatch: (action: TAction) => void, getState: () => ApplicationState): void;\r\n}\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport { Redirect, Route } from \"react-router-dom\";\r\nimport AuthenticationContext from \"../auth-context\";\r\n\r\nexport default function AdminRoute({ component: Component, ...restOfProps }) {\r\n\r\n const contextData = useContext(AuthenticationContext);\r\n\r\n useEffect(() => {\r\n if (contextData.isUserAdmin === null || contextData.isUserAdmin === undefined) {\r\n contextData.authenticateUser();\r\n }\r\n });\r\n\r\n return (\r\n <Route\r\n {...restOfProps}\r\n render={(props) =>\r\n contextData.isUserAdmin ? <Component {...props} {...restOfProps} /> : <Redirect to=\"/\" />\r\n }\r\n />\r\n );\r\n}","import React, { useContext, useEffect } from \"react\";\r\nimport { Redirect, Route } from \"react-router-dom\";\r\nimport AuthenticationContext from \"../auth-context\";\r\n\r\nexport default function ProtectedRoute({ component: Component, ...restOfProps }) {\r\n\r\n const contextData = useContext(AuthenticationContext);\r\n\r\n useEffect(() => {\r\n if (contextData.isUserAdmin === null || contextData.isUserAdmin === undefined) {\r\n contextData.authenticateUser();\r\n }\r\n });\r\n\r\n function isUserLoggedIn() {\r\n if (contextData.isUserAdmin === null || contextData.isUserAdmin === undefined) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return (\r\n <Route\r\n {...restOfProps}\r\n render={(props) =>\r\n isUserLoggedIn() ? <Component {...props} {...restOfProps} /> : <Redirect to=\"/\" />\r\n }\r\n />\r\n );\r\n}","export default __webpack_public_path__ + \"static/media/logo.aa07d840.jpg\";","import React from 'react'\r\nimport { Component } from 'react';\r\nimport authService from './AuthorizeService';\r\nimport { AuthenticationResultStatus } from './AuthorizeService';\r\nimport { LoginActions, QueryParameterNames, ApplicationPaths } from './ApiAuthorizationConstants';\r\nimport EupatiLoader from '../common/static/loading-animation/loader';\r\n\r\n// The main responsibility of this component is to handle the user's login process.\r\n// This is the starting point for the login process. Any component that needs to authenticate\r\n// a user can simply perform a redirect to this component with a returnUrl query parameter and\r\n// let the component perform the login and return back to the return url.\r\nexport class LoginHelper {\r\n\r\n getReturnUrl(state) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\")\r\n }\r\n return (state && state.returnUrl) || fromQuery || `${window.location.origin}/`;\r\n }\r\n}\r\nexport const loginHelper = new LoginHelper();\r\n\r\nexport class Login extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LoginActions.Login:\r\n this.login(loginHelper.getReturnUrl());\r\n break;\r\n case LoginActions.LoginCallback:\r\n this.processLoginCallback();\r\n break;\r\n case LoginActions.LoginFailed:\r\n const params = new URLSearchParams(window.location.search);\r\n const error = params.get(QueryParameterNames.Message);\r\n this.setState({ message: error });\r\n break;\r\n case LoginActions.Profile:\r\n this.redirectToProfile();\r\n break;\r\n case LoginActions.Register:\r\n this.redirectToRegister();\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n\r\n render() {\r\n const action = this.props.action;\r\n const { message } = this.state;\r\n\r\n if (!!message) {\r\n return <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>{message}</div>\r\n } else {\r\n switch (action) {\r\n case LoginActions.Login:\r\n return (\r\n <div className='loader-wrapper'>\r\n <EupatiLoader />\r\n </div>\r\n );\r\n case LoginActions.LoginCallback:\r\n return (<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>Processing login callback</div>);\r\n case LoginActions.Profile:\r\n case LoginActions.Register:\r\n return (<div></div>);\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n }\r\n\r\n async login(returnUrl) {\r\n const state = { returnUrl };\r\n const result = await authService.signIn(state);\r\n\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(`Invalid status result ${result.status}.`);\r\n }\r\n }\r\n\r\n async processLoginCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignIn(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as the only time completeSignIn finishes\r\n // is when we are doing a redirect sign in flow.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(loginHelper.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(`Invalid authentication result status '${result.status}'.`);\r\n }\r\n }\r\n\r\n redirectToRegister() {\r\n this.redirectToApiAuthorizationPath(`${ApplicationPaths.IdentityRegisterPath}?${QueryParameterNames.ReturnUrl}=${encodeURI(ApplicationPaths.Login)}`);\r\n }\r\n\r\n redirectToProfile() {\r\n this.redirectToApiAuthorizationPath(ApplicationPaths.IdentityManagePath);\r\n }\r\n\r\n redirectToApiAuthorizationPath(apiAuthorizationPath) {\r\n const redirectUrl = `${window.location.origin}/${apiAuthorizationPath}`;\r\n // It's important that we do a replace here so that when the user hits the back arrow on the\r\n // browser they get sent back to where it was on the app instead of to an endpoint on this\r\n // component.\r\n window.location.replace(redirectUrl);\r\n }\r\n\r\n navigateToReturnUrl(returnUrl) {\r\n // It's important that we do a replace here so that we remove the callback uri with the\r\n // fragment containing the tokens from the browser history.\r\n window.location.replace(returnUrl);\r\n }\r\n}\r\n","import React, { Component, Fragment } from 'react';\r\nimport { NavItem, NavLink } from 'reactstrap';\r\nimport { Link } from 'react-router-dom';\r\nimport authService from './AuthorizeService';\r\nimport { loginHelper } from './Login';\r\nimport { ApplicationPaths, LoginActions } from './ApiAuthorizationConstants';\r\n\r\nexport class LoginMenu extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n isAuthenticated: false,\r\n userName: null\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this._subscription = authService.subscribe(() => this.populateState());\r\n this.populateState();\r\n\r\n authService.signInSilent();\r\n }\r\n\r\n componentWillUnmount() {\r\n authService.unsubscribe(this._subscription);\r\n }\r\n\r\n async populateState() {\r\n const [isAuthenticated, user] = await Promise.all([authService.isAuthenticated(), authService.getUser()])\r\n\r\n this.setState({\r\n isAuthenticated,\r\n userName: user && user.name\r\n });\r\n }\r\n\r\n render() {\r\n const { isAuthenticated, userName } = this.state;\r\n if (!isAuthenticated) {\r\n const registerPath = `${ApplicationPaths.Register}`;\r\n const loginPath = `${ApplicationPaths.Login}`;\r\n return this.anonymousView(registerPath, loginPath);\r\n } else {\r\n const profilePath = `${ApplicationPaths.Profile}`;\r\n const logoutPath = { pathname: `${ApplicationPaths.LogOut}`, state: { local: true } };\r\n return this.authenticatedView(userName, profilePath, logoutPath);\r\n }\r\n }\r\n\r\n authenticatedView(userName, profilePath, logoutPath) {\r\n return (<Fragment>\r\n {/* <NavItem>\r\n <NavLink tag={Link} className=\"text-dark\" to={profilePath}>{userName}</NavLink>\r\n </NavItem> */}\r\n <NavItem>\r\n {/* <a href={logoutPath.pathname}>Logout</a> */}\r\n <NavLink tag={Link} to={logoutPath} style={{ color: '#fff' }}>Logout</NavLink>\r\n </NavItem>\r\n </Fragment>);\r\n\r\n }\r\n\r\n anonymousView(registerPath, loginPath) {\r\n return (<Fragment>\r\n <NavItem>\r\n <a href={\"/faq\"} style={{ color: '#fff' }}>About</a>\r\n </NavItem>\r\n <NavItem>\r\n <a href={loginPath} style={{ color: '#fff' }}>Login</a>\r\n {/* <NavLink tag={Link} className=\"text-dark\" to={loginPath}>Login</NavLink> */}\r\n </NavItem>\r\n </Fragment>);\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { Image } from 'react-bootstrap';\r\nimport { withRouter, NavLink } from 'react-router-dom';\r\nimport logo from '../../../images/logo.jpg';\r\nimport { Navbar } from 'react-bootstrap';\r\nimport { Nav } from 'react-bootstrap';\r\nimport { LoginMenu } from '../../api-authorization/LoginMenu';\r\nimport { faHome } from '@fortawesome/fontawesome-free-solid';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\n\r\ntype OwnProps = {\r\n isUserAdmin: boolean;\r\n authenticateUser: () => void;\r\n}\r\n\r\nexport default class NavBar extends React.PureComponent<OwnProps, {}> {\r\n\r\n componentDidMount() {\r\n if (this.props.isUserAdmin === null || this.props.isUserAdmin === undefined) {\r\n this.props.authenticateUser();\r\n this.forceUpdate();\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: any) {\r\n if (prevProps.isUserAdmin === null || prevProps.isUserAdmin === undefined) {\r\n this.props.authenticateUser();\r\n }\r\n }\r\n\r\n returnProperIconType(icon: any) {\r\n return icon as IconProp;\r\n }\r\n\r\n public render() {\r\n\r\n const ImgCard = withRouter(({ history }) => (\r\n <Image\r\n src={logo}\r\n rounded\r\n className='navbar-top-brand-logo'\r\n onClick={() => history.push('/')}\r\n >\r\n </Image>\r\n ));\r\n\r\n return (\r\n <div className='navigation-bar'>\r\n <Navbar className='navbar-top'>\r\n <Navbar.Brand className='navbar-top-brand' style={{ cursor: 'pointer' }}>\r\n <ImgCard />\r\n </Navbar.Brand>\r\n <div className='navbar-top-btns'>\r\n <Nav>\r\n <Nav.Link id='homeLink' href='/' className='navbar-top-button'><FontAwesomeIcon className='navbar-top-home' icon={this.returnProperIconType(faHome)} />Home</Nav.Link>\r\n </Nav>\r\n <Nav>\r\n <Nav.Link id='eupatiLink' href='https://eupati.eu/' className='navbar-top-button' style={{ marginLeft: '1.5rem' }}>Back To EUPATI</Nav.Link>\r\n </Nav>\r\n </div>\r\n </Navbar>\r\n <Navbar className='navbar-bottom' expand='lg' collapseOnSelect style={{ display: 'flex', justifyContent: 'flex-end' }}>\r\n <Navbar.Toggle />\r\n <Navbar.Collapse className='navbar-bottom-menu'>\r\n <Nav className='navbar-bottom-menu-list' style={!this.props.isUserAdmin ? { justifyContent: 'flex-end' } : {}}>\r\n {this.props.isUserAdmin &&\r\n <div className='admin-nav-items'>\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' to='/admin/prices' style={{ textDecoration: 'none', color: '#fff' }}>Pricing</NavLink>\r\n </li>\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' to='/admin/all-admins' style={{ textDecoration: 'none', color: '#fff' }}>Admins</NavLink>\r\n </li>\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' to='/admin/all-patients' style={{ textDecoration: 'none', color: '#fff' }}>Patients</NavLink>\r\n </li>\r\n\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' to='/admin/projects' style={{ textDecoration: 'none', color: '#fff' }}>Projects</NavLink>\r\n </li>\r\n\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' to='/admin/import-patients' style={{ textDecoration: 'none', color: '#fff' }}>Import</NavLink>\r\n </li>\r\n\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' to='/admin/email-templates' style={{ textDecoration: 'none', color: '#fff' }}>Templates</NavLink>\r\n </li>\r\n </div>\r\n }\r\n </Nav>\r\n <Nav className='navbar-bottom-menu-list' style={!this.props.isUserAdmin ? { justifyContent: 'flex-end' } : {}}>\r\n <div className='auth-nav-items'>\r\n <LoginMenu />\r\n </div>\r\n </Nav>\r\n </Navbar.Collapse>\r\n </Navbar>\r\n <hr className='ribbon'></hr>\r\n </div>\r\n )\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { Navbar, Nav } from \"react-bootstrap\";\r\nimport { NavLink } from \"reactstrap\";\r\n\r\ntype OwnProps = {};\r\n\r\ntype DispatchProps = {};\r\n\r\ntype Props = {} & DispatchProps & OwnProps;\r\n\r\ntype OwnState = {\r\n currentYear: number;\r\n};\r\n\r\nexport default class Footer extends React.PureComponent<Props, OwnState> {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n currentYear: new Date().getFullYear()\r\n }\r\n }\r\n\r\n render() {\r\n\r\n return (\r\n <div className='footer'>\r\n <div className='footer-top'>\r\n <div className='footer-top-txt'>\r\n <a target='_blank' href='https://eupati.eu/contact/'><h5 className='footer-top-txt-title'>Contact Us</h5></a>\r\n </div>\r\n {/* <Nav className='footer-top-menu'>\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' target='_blank' href='https://eupati.eu/contact/'>Contact</NavLink>\r\n </li>\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' target='_blank' href='https://eupati.eu/donate/'>Donate</NavLink>\r\n </li>\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' target='_blank' href='https://collaborate.eupati.eu/'>Collaborate</NavLink>\r\n </li>\r\n </Nav> */}\r\n </div>\r\n <Navbar className='footer-bottom'>\r\n <span>{`\\u00A9 Copyright EUPATI ${this.state.currentYear}`}</span>\r\n <Nav className='footer-bottom-menu'>\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' href='/terms'>Terms & Conditions</NavLink>\r\n </li>\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' href='/privacy'>Privacy</NavLink>\r\n </li>\r\n <li className='nav-item'>\r\n <NavLink className='nav-link' href='/faq'>FAQ</NavLink>\r\n </li>\r\n {/* <li className='nav-item'>\r\n <NavLink className='nav-link' target='_blank' href='https://eupati.eu/cookies/'>Cookies</NavLink>\r\n </li> */}\r\n </Nav>\r\n </Navbar>\r\n </div>\r\n )\r\n }\r\n}","import * as React from 'react';\r\nimport { Container } from 'react-bootstrap';\r\nimport NavBar from './navbar';\r\nimport Footer from './footer';\r\nimport AuthenticationContext from './auth-context';\r\n\r\nexport default class Layout extends React.PureComponent<{}, { children?: React.ReactNode }> {\r\n static contextType = AuthenticationContext;\r\n public render() {\r\n return (\r\n <React.Fragment>\r\n <NavBar {...this.context} />\r\n <Container>\r\n {this.props.children}\r\n </Container>\r\n <Footer />\r\n </React.Fragment>\r\n );\r\n }\r\n}","import React from 'react'\r\nimport { Component } from 'react';\r\nimport authService from './AuthorizeService';\r\nimport { AuthenticationResultStatus } from './AuthorizeService';\r\nimport { QueryParameterNames, LogoutActions, ApplicationPaths } from './ApiAuthorizationConstants';\r\n\r\n// The main responsibility of this component is to handle the user's logout process.\r\n// This is the starting point for the logout process, which is usually initiated when a\r\n// user clicks on the logout button on the LoginMenu component.\r\nexport class Logout extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined,\r\n isReady: false,\r\n authenticated: false\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n if (!!window.history.state.state.local) {\r\n this.logout(this.getReturnUrl());\r\n } else {\r\n // This prevents regular links to <app>/authentication/logout from triggering a logout\r\n this.setState({ isReady: true, message: \"The logout was not initiated from within the page.\" });\r\n }\r\n break;\r\n case LogoutActions.LogoutCallback:\r\n this.processLogoutCallback();\r\n break;\r\n case LogoutActions.LoggedOut:\r\n this.navigateToReturnUrl('/');\r\n //this.setState({ isReady: true, message: \"You successfully logged out!\" });\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n\r\n this.populateAuthenticationState();\r\n }\r\n\r\n render() {\r\n const { isReady, message } = this.state;\r\n if (!isReady) {\r\n return <div></div>\r\n }\r\n if (!!message) {\r\n return (<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>{message}</div>);\r\n } else {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n return (<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>Processing logout</div>);\r\n case LogoutActions.LogoutCallback:\r\n return (<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>Processing logout callback</div>);\r\n case LogoutActions.LoggedOut:\r\n return (<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>{message}</div>);\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n }\r\n\r\n async logout(returnUrl) {\r\n const state = { returnUrl };\r\n const isauthenticated = await authService.isAuthenticated();\r\n if (isauthenticated) {\r\n const result = await authService.signOut(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n } else {\r\n this.setState({ message: \"You successfully logged out!\" });\r\n }\r\n }\r\n\r\n async processLogoutCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignOut(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as the only time completeAuthentication finishes\r\n // is when we are doing a redirect sign in flow.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n }\r\n\r\n async populateAuthenticationState() {\r\n const authenticated = await authService.isAuthenticated();\r\n this.setState({ isReady: true, authenticated });\r\n }\r\n\r\n getReturnUrl(state) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\")\r\n }\r\n return (state && state.returnUrl) ||\r\n fromQuery ||\r\n `${window.location.origin}${ApplicationPaths.LoggedOut}`;\r\n }\r\n\r\n navigateToReturnUrl(returnUrl) {\r\n return window.location.replace(returnUrl);\r\n }\r\n}\r\n","import React, { Component, Fragment } from 'react';\r\nimport { Route } from 'react-router';\r\nimport { Login } from './Login'\r\nimport { Logout } from './Logout'\r\nimport { ApplicationPaths, LoginActions, LogoutActions } from './ApiAuthorizationConstants';\r\n\r\nexport default class ApiAuthorizationRoutes extends Component {\r\n\r\n render () {\r\n return(\r\n <Fragment>\r\n <Route path={ApplicationPaths.Login} render={() => loginAction(LoginActions.Login)} />\r\n <Route path={ApplicationPaths.LoginFailed} render={() => loginAction(LoginActions.LoginFailed)} />\r\n <Route path={ApplicationPaths.LoginCallback} render={() => loginAction(LoginActions.LoginCallback)} />\r\n <Route path={ApplicationPaths.Profile} render={() => loginAction(LoginActions.Profile)} />\r\n <Route path={ApplicationPaths.Register} render={() => loginAction(LoginActions.Register)} />\r\n <Route path={ApplicationPaths.LogOut} render={() => logoutAction(LogoutActions.Logout)} />\r\n <Route path={ApplicationPaths.LogOutCallback} render={() => logoutAction(LogoutActions.LogoutCallback)} />\r\n <Route path={ApplicationPaths.LoggedOut} render={() => logoutAction(LogoutActions.LoggedOut)} />\r\n </Fragment>);\r\n }\r\n}\r\n\r\nfunction loginAction(name){\r\n return (<Login action={name}></Login>);\r\n}\r\n\r\nfunction logoutAction(name) {\r\n return (<Logout action={name}></Logout>);\r\n}\r\n","import React, { useEffect, useState } from 'react';\r\nimport { Route, useHistory } from 'react-router';\r\nimport AdminRoute from './components/common/static/routes/admin-routes';\r\nimport ProtectedRoute from './components/common/static/routes/protected-route';\r\nimport Layout from './components/common/static/Layout';\r\nimport { Root as NewProjectPage } from './components/modules/new-project';\r\nimport { Root as PatientInfoPage } from './components/modules/patient-profile';\r\nimport { Root as HomePage } from './components/modules/home';\r\nimport { Root as PricingPage } from './components/modules/pricing';\r\nimport { Root as AdminProjectsPage } from './components/modules/admin/all-projects';\r\nimport { Root as AdminImportPatients } from './components/modules/admin/import-patients';\r\nimport { Root as AdminPatientsPage } from './components/modules/admin/all-patients';\r\nimport { Root as AdminLsPage } from './components/modules/admin/admins-ls';\r\nimport { Root as ContentEditor } from './components/modules/admin/content-editor';\r\nimport { Root as PriceCatalog } from './components/modules/admin/price-catalog';\r\nimport { Root as ContentManagement } from './components/modules/admin/content-management';\r\nimport { Root as EmailTemplates } from './components/modules/admin/email-templates';\r\nimport { Root as EmailResponsePage } from './components/modules/confirm';\r\nimport { Root as PaymentPage } from './components/modules/payment';\r\n//import AuthorizeRoute from './components/api-authorization/AuthorizeRoute';\r\nimport ApiAuthorizationRoutes from './components/api-authorization/ApiAuthorizationRoutes';\r\nimport { ApplicationPaths } from './components/api-authorization/ApiAuthorizationConstants';\r\nimport './App.scss';\r\nimport { AuthenticationProvider } from './components/common/static/auth-context';\r\nimport { ToastContainer, Slide } from 'react-toastify';\r\nimport 'react-toastify/dist/ReactToastify.css';\r\nimport CookieConsent, { Cookies } from 'react-cookie-consent';\r\nimport { Elements } from '@stripe/react-stripe-js';\r\nimport { loadStripe } from '@stripe/stripe-js';\r\n\r\nexport default function App() {\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n const handler = (e: any) => {\r\n if (\r\n e.target.closest(\r\n '.tox-tinymce-aux, .moxman-window, .tam-assetmanager-root'\r\n ) !== null\r\n ) {\r\n e.stopImmediatePropagation();\r\n }\r\n };\r\n document.addEventListener('focusin', handler);\r\n return () => document.removeEventListener('focusin', handler);\r\n }, []);\r\n\r\n // const getPublishableKey = async () => {\r\n // const { publishableKey } = await fetch('/api/payments/getstripeconfig').then(res => res.json());\r\n // const stripePromise = loadStripe(publishableKey);\r\n // return stripePromise;\r\n // }\r\n\r\n return (\r\n //<Elements stripe={getPublishableKey()}>\r\n <AuthenticationProvider>\r\n <ToastContainer\r\n autoClose={4000}\r\n transition={Slide}\r\n position={'top-center'}\r\n style={{ width: '33%' }}\r\n hideProgressBar={true}\r\n />\r\n <CookieConsent\r\n location=\"bottom\"\r\n style={{ background: '#113D7C' }}\r\n buttonStyle={{ color: '#secondaryColor', fontSize: '13px' }}\r\n buttonClasses=\"cookieConsentBtn\"\r\n expires={150}\r\n >\r\n This website uses cookies to enhance the user experience.{' '}\r\n <span style={{ fontSize: '13px' }}>\r\n Please refer to our <a href=\"/privacy\">Privacy policy</a> page for\r\n more details.\r\n </span>\r\n </CookieConsent>\r\n <Layout>\r\n <Route exact path=\"/\" component={HomePage} />\r\n <Route exact path=\"/pricing\" component={PricingPage} />\r\n <Route exact path=\"/new-project\" component={NewProjectPage} />\r\n {/* <Route exact path='/payment' component={PaymentPage} /> */}\r\n <Route exact path=\"/privacy\" component={ContentManagement} />\r\n <Route exact path=\"/faq\" component={ContentManagement} />\r\n <Route exact path=\"/terms\" component={ContentManagement} />\r\n <Route path=\"/letter-of-confirmation\" component={EmailResponsePage} />\r\n <Route path=\"/letter-of-rejection\" component={EmailResponsePage} />\r\n <ProtectedRoute exact path=\"/patient\" component={PatientInfoPage} />\r\n <AdminRoute\r\n exact\r\n path=\"/admin/projects\"\r\n component={AdminProjectsPage}\r\n />\r\n <AdminRoute\r\n exact\r\n path=\"/admin/import-patients\"\r\n component={AdminImportPatients}\r\n />\r\n <AdminRoute\r\n exact\r\n path=\"/admin/all-patients\"\r\n component={AdminPatientsPage}\r\n />\r\n <AdminRoute exact path=\"/admin/all-admins\" component={AdminLsPage} />\r\n <AdminRoute\r\n exact\r\n path=\"/admin/content-editor\"\r\n history={history}\r\n component={ContentEditor}\r\n />\r\n <AdminRoute exact path=\"/admin/prices\" component={PriceCatalog} />\r\n <AdminRoute\r\n exact\r\n path=\"/admin/email-templates\"\r\n component={EmailTemplates}\r\n />\r\n <Route\r\n path={ApplicationPaths.ApiAuthorizationPrefix}\r\n component={ApiAuthorizationRoutes}\r\n />\r\n </Layout>\r\n </AuthenticationProvider>\r\n //</Elements>\r\n );\r\n}\r\n","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register() {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const url = process.env.PUBLIC_URL as string;\r\n const publicUrl = new URL(url, window.location.toString());\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing as ServiceWorker;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (response.status === 404 || (contentType && contentType.indexOf('javascript') === -1)) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log('No internet connection found. App is running in offline mode.');\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import 'bootstrap/dist/css/bootstrap.css';\r\n\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\nimport { ConnectedRouter } from 'connected-react-router';\r\nimport { createBrowserHistory } from 'history';\r\nimport configureStore from './store/configureStore';\r\nimport App from './App';\r\nimport registerServiceWorker from './registerServiceWorker';\r\n\r\n// Create browser history to use in the Redux store\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href') as string;\r\nconst history = createBrowserHistory({ basename: baseUrl });\r\n\r\n// Get the application-wide store instance, prepopulating with state from the server where available.\r\nconst store = configureStore(history);\r\n\r\nconst SITE_KEY = '6LdxnJMcAAAAAFdlE2cY43syjTlKK_qAMAKZRocG';\r\n\r\nimport { GoogleReCaptchaProvider } from 'react-google-recaptcha-v3';\r\n\r\nReactDOM.render(\r\n <Provider store={store}>\r\n <ConnectedRouter history={history}>\r\n <GoogleReCaptchaProvider reCaptchaKey={SITE_KEY}>\r\n <App />\r\n </GoogleReCaptchaProvider>\r\n </ConnectedRouter>\r\n </Provider>,\r\n document.getElementById('root')\r\n);\r\n\r\nregisterServiceWorker();","import { applyMiddleware, combineReducers, compose, createStore } from 'redux';\r\nimport thunk from 'redux-thunk';\r\nimport { connectRouter, routerMiddleware } from 'connected-react-router';\r\nimport { History } from 'history';\r\nimport { ApplicationState, reducers } from './';\r\n\r\nexport default function configureStore(history: History, initialState?: ApplicationState) {\r\n \r\n let middleware = [\r\n thunk,\r\n routerMiddleware(history)\r\n ];\r\n\r\n if (process.env.NODE_ENV === 'development') {\r\n middleware = [...middleware, require('redux-logger').default];\r\n }\r\n\r\n const rootReducer = combineReducers({\r\n ...reducers,\r\n router: connectRouter(history)\r\n });\r\n\r\n const enhancers = [];\r\n const windowIfDefined = typeof window === 'undefined' ? null : window as any; // eslint-disable-line @typescript-eslint/no-explicit-any\r\n if (windowIfDefined && windowIfDefined.__REDUX_DEVTOOLS_EXTENSION__) {\r\n enhancers.push(windowIfDefined.__REDUX_DEVTOOLS_EXTENSION__());\r\n }\r\n\r\n return createStore(\r\n rootReducer,\r\n initialState,\r\n compose(applyMiddleware(...middleware), ...enhancers)\r\n );\r\n}\r\n"],"sourceRoot":""}