{"version":3,"sources":["assets/logo_zf.png","assets/logo_tbc.svg","assets/triangle-down-white.svg","assets/logo_zf.svg","assets/logo_tbc.gif","assets/triangle-down.svg","assets/logo.svg","assets/goal_flag_green.svg","assets/goal_flag_blue.svg","assets/chart.svg","assets/processing.svg","../config/polyfills.js","localization/textDirection.ts","core/redux/appState.ts","core/redux/actionType.ts","localization/setLocaleAction.ts","localization/translationKeys.ts","core/api/rsaa.ts","core/api/module.ts","navigation/routes.ts","core/api/endpoints.ts","language/arrays.ts","localization/loadTranslationsAction.ts","featureFlags/loadConfigAction.ts","featureFlags/loadFeatureFlagsAction.ts","featureFlags/showLoginAnnouncementAction.ts","auth/login/api/loginAction.ts","auth/login/api/loginTalentSmartAction.ts","auth/login/api/loginBXAction.ts","auth/forgotPassword/api/securityQuestionAction.ts","auth/forgotPassword/api/sendPortalPasswordResetEmailAction.ts","auth/forgotPassword/api/sendRaterApprovalPasswordResetEmailAction.ts","auth/accountSetup/api/newPasswordAction.ts","auth/accountSetup/api/createSecurityChallengeAction.ts","project/loadProjectsAction.ts","auth/forgotPassword/api/securityQuestionKeysAction.ts","project/messages/loadProjMsgsAction.ts","project/messages/projectLanguagesAction.ts","auth/accountSetup/api/passwordRequirementMessageAction.ts","localization/portalLanguagesAction.ts","localization/allLanguagesAction.ts","project/loadProjectSummaryAction.ts","project/requirements/loadParticipantRequirementsAction.ts","project/resources/loadProjectResourcesAction.ts","project/survey/raters/addRaterByEmailAction.ts","project/survey/raters/addRaterByIdAction.ts","project/survey/raters/participantRatersAction.ts","language/module.ts","language/time.ts","project/survey/raters/module.ts","project/survey/raters/sendInvitationsAction.ts","project/survey/raters/raterLevelsAction.ts","project/survey/raters/deleteRaterAction.ts","project/loadProjectIdAction.ts","auth/login/api/logoutAction.ts","project/survey/raters/updateRaterAction.ts","project/sideMenu/openMenuAction.ts","project/survey/raters/previousRatersAction.ts","project/survey/raters/directorySearch/directoryRatersAction.ts","project/survey/raters/updateInviteDataAction.ts","project/survey/raters/remindRaters/sendRemindersAction.ts","project/survey/raters/setApproverAction.ts","legal/updateConfidentialityAction.ts","project/survey/raters/sendForApprovalAction.ts","auth/sso/YmcaLoginAction.ts","auth/sso/YmcaSsoAction.ts","project/setGoals/setGoalAnswerAction.ts","project/setGoals/sendGoalsAction.ts","project/setGoals/goalsAnswersAction.ts","project/survey/raters/inviteEmailPreviewAction.ts","project/survey/raters/approverEmailPreviewAction.ts","project/devPlan/reminders/setRemindersOnAction.ts","project/devPlan/reminders/getRemindersOnAction.ts","project/devPlan/api/getDevPlanItemsAction.ts","globalStyle/colors.ts","raterApproval/raterApprovalStatus.ts","project/devPlan/devPlanAction/api/getDevPlanActionsAction.ts","project/devPlan/module.ts","project/devPlan/devPlanAction/api/updateDevPlanFieldAnswerAction.ts","project/devPlan/devPlanAction/module.ts","project/devPlan/devPlanAction/api/getDevPlanFieldsAndAnswersAction.ts","project/viewReport/api/loadReportsAction.ts","auth/sso/IsSsoAction.ts","auth/sso/SamlAssertionAction.ts","project/devPlan/devPlanAction/api/deleteDevPlanActionAction.ts","project/devPlan/api/updateDevPlanItemDescriptionAction.ts","project/devPlan/api/updateDevPlanItemTitleAction.ts","project/resources/loadDevResourcesAction.ts","project/devPlan/devPlanAction/api/updateActionCompleteByAction.ts","project/loadCurrentStatusAction.ts","project/devPlan/devPlanAction/api/addDevPlanActionAction.ts","project/devPlan/api/deleteDevPlanItemAction.ts","project/devPlan/api/addDevPlanItemAction.ts","project/devPlan/devPlanAction/api/getDevPlanStatusesAction.ts","project/devPlan/devPlanAction/api/updateDevPlanActionStatusAction.ts","raterApproval/api/raterApprovalParticipantsAction.ts","project/devPlan/devPlanAction/api/sendDevPlanAction.ts","project/survey/raters/undeliveredEmailsAction.ts","reportRecipient/api/reportRecipientProjectsAction.ts","reportRecipient/api/reportRecipientParticipantsAction.ts","reportRecipient/api/reportRecipientReportsAction.ts","reportRecipient/api/deliverReportsAction.ts","reportRecipient/api/deliverReportsToRecipientAction.ts","project/createSurvey/api/getSelectedQuestionsAction.ts","project/createSurvey/api/addQuestionAction.ts","project/createSurvey/api/addQuestionsForCompetencyAction.ts","project/createSurvey/api/deleteQuestionAction.ts","project/createSurvey/api/deleteQuestionsForCompetencyAction.ts","project/createSurvey/api/getCompetenciesAndQuestionsAction.ts","project/createSurvey/api/applyPendingChangesAction.ts","raterApproval/api/raterApprovalRatersAction.ts","raterApproval/api/sendRaterApprovalAction.ts","raterApproval/api/raterApprovalEmailPreviewAction.ts","auth/forgotPassword/api/sendReportRecipientPasswordResetEmailAction.ts","project/createSurvey/api/unsetCreatedSurveyAction.ts","raterApproval/api/addRaterByEmailAsApproverAction.ts","raterApproval/api/approveRaterAction.ts","localStorage/sessionStorageKeys.ts","raterApproval/api/declineRaterAction.ts","core/redux/setPortalTypeAction.ts","auth/login/api/appActivityReducer.ts","showTimeoutModalAction.ts","reportRecipient/api/reportDataAction.ts","project/devPlan/api/setDevPlanViewedAction.ts","project/devPlan/collaboration/api/addDevPlanCollaboratorAction.ts","project/devPlan/collaboration/api/deleteDevPlanCollaboratorAction.ts","project/devPlan/collaboration/api/addDevItemCommentAction.ts","project/devPlan/collaboration/api/updateDevItemCommentAction.ts","project/devPlan/collaboration/api/deleteDevItemCommentAction.ts","project/devPlan/collaboration/api/getDevPlanCollaboratorsAction.ts","project/devPlan/collaboration/api/setDevPlanCollaboratorAcceptedAction.ts","project/devPlan/collaboration/api/getDevItemCommentsAction.ts","project/devPlan/collaboration/module.ts","project/devPlan/collaboration/constants.ts","project/devPlan/collaboration/api/setDevItemCommentsReadAction.ts","project/devPlan/collaboration/api/authenticateCollaboratorAction.ts","project/devPlan/collaboration/api/sendDevPlanCollaboratorInviteAction.ts","project/devPlan/collaboration/api/sendDevItemCommentNotificationAction.ts","project/devPlan/collaboration/api/sendParticipantCommentNotificationAction.ts","project/devPlan/listItems/api/getDevActionListItemsAction.ts","project/devPlan/listItems/api/updateFieldAnswerListAction.ts","project/viewReport/api/sendEQScoresAction.ts","traceLogging/api/logInfoAction.ts","project/viewReport/api/eqScoresEmailPreviewAction.ts","project/viewReport/api/getEQScoresAction.ts","project/api/getProjectCSContactAction.ts","project/api/getEBookUrlAction.ts","project/api/reassessmentAction.ts","core/redux/rootReducer.ts","core/redux/updateStateAction.ts","showTimedOutAction.ts","setTimedOutHandleAction.ts","project/survey/raters/saveEditedRaterAction.ts","core/redux/raterInviteTimestampReducer.ts","core/redux/clearLoadingStateAction.ts","project/devPlan/devPlanAction/clearLastSentEmailAction.ts","project/devPlan/listItems/saveFieldAnswerListAction.ts","reportRecipient/actions/setDateRangeAction.ts","reportRecipient/actions/setLastOnlyAction.ts","reportRecipient/actions/addFilterParticipantAction.ts","reportRecipient/actions/addFilterProjectAction.ts","reportRecipient/actions/removeFilterParticipantAction.ts","reportRecipient/actions/removeFilterProjectAction.ts","reportRecipient/actions/setAllSelectedAction.ts","reportRecipient/actions/setSelectedAction.ts","core/hooks/useMount.ts","core/hooks/useSessionStorage.ts","localization/defaultLanguages.ts","localization/localeState.ts","core/redux/hooks.ts","localStorage/AppStateSessionStorageBridge.tsx","serviceWorker.ts","localization/module.ts","auth/hooks.ts","localization/defaultMessages.ts","localization/hooks.ts","core/hooks/useToggle.ts","project/devPlan/collaboration/hooks.ts","localization/TranslationLoader.tsx","featureFlags/ConfigLoader.tsx","globalStyle/zIndex.ts","globalStyle/mediaQueries.tsx","localization/RtlToggle.tsx","globalStyle/fonts.ts","localization/LocalDiv.tsx","version/AppVersion.tsx","navigation/module.ts","navigation/OldRouteInterceptor.tsx","language/browser.ts","auth/LogoutTimer.tsx","layout/modal/ModalHeader.tsx","layout/modal/Modal.tsx","core/hooks/useKeyListener.ts","localization/LocalHTMLContainer.tsx","localization/removeRedundantBackslashes.ts","localization/Msg.tsx","forms/styles/button.ts","layout/Spacer.tsx","layout/flexBox.ts","localization/LocalBtn.tsx","navigation/portalType.ts","language/useBrowser.ts","TimeoutModal.tsx","legal/Statement.tsx","project/projectStatus.ts","core/api/hooks.ts","auth/sso/YmcaLoginPage.tsx","loading/Spinner.tsx","loading/Loader.tsx","layout/table/style.ts","core/hooks/useWindowSize.ts","project/module.ts","project/ProjectCard.tsx","project/ProjectTable.tsx","project/ProjectModal.tsx","auth/sso/YmcaSsoPage.tsx","reportRecipient/ReportRecipientRedirect.tsx","auth/login/RaterApprovalRedirect.tsx","auth/sso/SamlAssertionPage.tsx","forms/styles/links.ts","branding/LogoBox.tsx","auth/login/LoginFooter.tsx","auth/login/LoginLayout.tsx","auth/sso/SsoErrorPage.tsx","forms/styles/input.ts","forms/styles/form.ts","localization/LocalInput.tsx","auth/formValidations.ts","forms/styles/messages.ts","layout/fieldSetStyle.ts","auth/login/LoginForm.tsx","auth/login/module.ts","navigation/ExternalRedirect.tsx","auth/login/LoginPage.tsx","auth/forgotPassword/ForgotPasswordEmailForm.tsx","auth/forgotPassword/ForgotPasswordSecurityAnswerForm.tsx","auth/forgotPassword/ForgotPasswordSuccessForm.tsx","core/hooks/useStickyDiff.ts","core/hooks/useToggleOnSuccess.ts","auth/forgotPassword/ForgotPasswordPage.tsx","layout/pageStyle.ts","auth/ProtectedRoute.tsx","auth/accountSetup/NewPasswordForm.tsx","forms/styles/select.ts","localization/LocalDropdownOption.tsx","localization/LocalSelect.tsx","auth/accountSetup/CreateSecurityQuestionForm.tsx","auth/accountSetup/AccountSetupPage.tsx","layout/BulletedMsg.tsx","project/sideMenu/AppActions.tsx","navigation/hooks.ts","raterApproval/RaterApprovalMenu.tsx","globalStyle/shadows.ts","navigation/SideMenu.tsx","layout/DashboardLayout.tsx","raterApproval/RaterApprovalLayout.tsx","layout/ActionIcon.tsx","raterApproval/RaterApprovalTableRow.tsx","raterApproval/RaterApprovalCard.tsx","raterApproval/module.ts","raterApproval/RaterApprovalList.tsx","project/survey/raters/formValidations.ts","project/survey/raters/AddRaterForm.tsx","raterApproval/RaterApprovalTable.tsx","layout/mobile/MobileToolbar.tsx","localization/MobileToolbarBtn.tsx","raterApproval/MobileRaterApprovalToolbar.tsx","localization/LocalTextArea.tsx","project/survey/raters/CustomizeEmailModal.tsx","core/hooks/useMap.ts","core/hooks/useTimedToggle.ts","core/hooks/useCounter.ts","core/hooks/useCounterOnAnySuccess.ts","core/hooks/useCounterOnAnyError.ts","raterApproval/RaterApprovalDashboard.tsx","core/hooks/useTimedToggleOnSuccess.ts","core/hooks/useToggleOnError.ts","core/hooks/useInterval.ts","layout/Metric.tsx","project/survey/CountDown.tsx","project/survey/DeadlineCounter.tsx","project/survey/SurveyHeader.tsx","reportRecipient/ReportRecipientMenu.tsx","reportRecipient/ReportRecipientLayout.tsx","project/sideMenu/ProjectSteps.tsx","project/resources/models.ts","project/resources/module.ts","project/sideMenu/ResourceMenu.tsx","localization/LocalLink.tsx","project/sideMenu/ProjectMenu.tsx","project/ProjectLayout.tsx","project/devPlan/collaboration/sideMenu/CollaboratorAppActions.tsx","project/devPlan/collaboration/sideMenu/CollaboratorProjectSteps.tsx","project/devPlan/collaboration/sideMenu/CollaboratorMenu.tsx","project/devPlan/collaboration/CollaboratorLayout.tsx","layout/PortalAutoLayout.tsx","account/Account.tsx","customerService/CustomerService.tsx","layout/ClamShell.tsx","localization/ActionMsg.tsx","error/ErrorMsg.tsx","account/ChangePasswordModal.tsx","account/ChangeSecurityQuestionModal.tsx","raterApproval/RaterApprovalRouter.tsx","icons/FilterIcon.tsx","reportRecipient/FilterBar.tsx","icons/DownloadIcon.tsx","icons/SendIcon.tsx","reportRecipient/ReportTableRow.tsx","layout/DataTable.tsx","reportRecipient/ReportRecipientReportList.tsx","layout/SearchableDataModelList.tsx","reportRecipient/ReportRecipientProjectList.tsx","reportRecipient/ReportRecipientParticipantList.tsx","layout/card/Card.tsx","reportRecipient/RecipientProjectCard.tsx","reportRecipient/RecipientParticipantCard.tsx","reportRecipient/ReportRecipientTable.tsx","reportRecipient/ReportRecipientDashboard.tsx","reportRecipient/ReportRecipientRouter.tsx","layout/card/CardHeader.tsx","layout/IconRow.tsx","project/requirements/RequirementSummary.tsx","layout/CircleImg.tsx","project/survey/raters/raterSummary/RaterCounts.tsx","project/requirements/module.ts","loading/ProgressCircle.tsx","project/survey/raters/raterSummary/module.ts","project/survey/raters/raterSummary/RaterSummaryChart.tsx","project/survey/raters/raterSummary/RaterStatusCard.tsx","project/ProjectSteps.tsx","project/resources/ProjectResources.tsx","project/devPlan/DevPlanSummary.tsx","project/survey/ReassessmentModal.tsx","project/ProjectSummary.tsx","project/resources/DevResourceModal.tsx","project/messages/ProjStr.ts","project/messages/hooks.ts","project/messages/ProjMsg.tsx","project/setGoals/Answer.tsx","project/setGoals/Goal.tsx","project/setGoals/formValidations.ts","project/setGoals/EmailGoalsForm.tsx","project/setGoals/MobileSetGoalsActionsBar.tsx","project/setGoals/SendGoalsEmailModal.tsx","project/setGoals/SetGoals.tsx","project/survey/selfSurvey/SelfSurvey.tsx","project/createSurvey/CreateSurveyMessageBar.tsx","project/createSurvey/CreateSurveyViewAccordian.tsx","project/createSurvey/CreateSurveyFootnote.tsx","project/createSurvey/MobileCreateSurveyActionsBar.tsx","project/createSurvey/CreateSurveyAdded.tsx","project/createSurvey/CreateSurveyRequired.tsx","project/createSurvey/CreateSurveyAddAccordian.tsx","project/createSurvey/CreateSurveyAddModal.tsx","project/createSurvey/CreateSurvey.tsx","project/survey/raters/DeleteRaterModal.tsx","project/survey/raters/RaterTableRow.tsx","project/survey/raters/RaterEditableTableRow.tsx","project/survey/raters/RaterEditableCard.tsx","project/survey/raters/RaterCard.tsx","project/survey/raters/RaterList.tsx","project/survey/raters/RaterTable.tsx","project/survey/raters/MobileRaterActionsBar.tsx","project/survey/raters/LeaveInviteModal.tsx","project/requirements/RequirementMenuItem.tsx","project/survey/raters/RequirementBar.tsx","project/survey/raters/RequirementMobileMenu.tsx","raterApproval/raterApprovalOption.ts","core/hooks/usePrevious.ts","core/hooks/useOnSuccess.ts","project/survey/raters/hooks.ts","project/survey/raters/InviteRaters.tsx","project/viewReport/module.ts","project/viewReport/FeedbackReportTableRow.tsx","project/viewReport/FeedbackReportTableData.tsx","project/viewReport/ReportCard.tsx","project/viewReport/ReportCards.tsx","project/viewReport/ReportTable.tsx","project/viewReport/CompetencyList.tsx","layout/ToggleSwitch.tsx","layout/modal/ConfirmationModal.tsx","project/viewReport/hooks.ts","forms/styles/textarea.ts","project/viewReport/SendEQScoresModal.tsx","project/viewReport/FeedbackReport.tsx","project/resources/ReportTutorial.tsx","localization/ChangeLanguageModal.tsx","legal/ConfidentialityAgreementModal.tsx","project/devPlan/AddDevPlanItemModal.tsx","project/devPlan/EditDevPlanItemModal.tsx","project/devPlan/listItems/hooks.ts","core/hooks/useArray.ts","project/devPlan/listItems/DevActionListItem.tsx","project/devPlan/listItems/DevActionListModal.tsx","project/devPlan/listItems/DevActionListField.tsx","project/devPlan/DevActionField.tsx","project/devPlan/devPlanAction/DevActionForm.tsx","forms/AddToCalendarBtn.tsx","project/devPlan/devPlanAction/hooks.ts","project/devPlan/devPlanAction/CompletionCard.tsx","project/devPlan/devPlanAction/StatusCard.tsx","forms/MobileDatePicker.tsx","project/devPlan/devPlanAction/MobileActionBtns.tsx","icons/FaceIcon.tsx","project/devPlan/collaboration/DevItemCommentView.tsx","project/devPlan/collaboration/AddDevItemCommentForm.tsx","project/devPlan/collaboration/DevItemComments.tsx","project/devPlan/devPlanAction/DevActionView.tsx","project/devPlan/DevPlanDescText.tsx","project/devPlan/DevItemHeader.tsx","project/devPlan/MobileDevPlanItemActions.tsx","project/devPlan/collaboration/CollaboratorPageHeader.tsx","project/devPlan/DevPlanItem.tsx","project/devPlan/AddDevItemCard.tsx","layout/styles.ts","project/devPlan/DevItemCard.tsx","forms/Toggle.tsx","project/devPlan/reminders/DevPlanRemindersCard.tsx","project/devPlan/emailPlan/EmailDevPlanForm.tsx","project/devPlan/emailPlan/EmailDevPlanCard.tsx","project/devPlan/MobileDevPlanActionBar.tsx","project/devPlan/collaboration/CollaboratorListItem.tsx","project/devPlan/collaboration/CollaboratorsList.tsx","project/devPlan/DevPlanView.tsx","project/devPlan/emailPlan/EmailDevPlanModal.tsx","project/devPlan/reminders/DevPlanRemindersModal.tsx","project/devPlan/devPlanAction/DevPlanRouter.tsx","project/survey/raters/directorySearch/formValidations.ts","project/survey/raters/directorySearch/SearchDirectoryForm.tsx","project/survey/raters/directorySearch/RaterSearchTableRow.tsx","project/survey/raters/directorySearch/RaterSearchCard.tsx","layout/PaginatedScroll.tsx","project/survey/raters/directorySearch/RaterSearchResultList.tsx","project/survey/raters/directorySearch/RaterSearchTable.tsx","project/survey/raters/directorySearch/RaterDirectorySearch.tsx","core/hooks/useTimedState.ts","project/resources/CustomResource.tsx","project/ProjectStatusPoller.tsx","project/survey/raters/remindRaters/hooks.ts","core/hooks/useToggleOnComplete.ts","project/survey/raters/remindRaters/RemindRatersModal.tsx","project/resources/EBook.tsx","project/ProjectRouter.tsx","project/devPlan/collaboration/CollaboratorRoute.tsx","project/devPlan/collaboration/CollaboratorDevPlanRouter.tsx","fileData/FileData.tsx","navigation/AppRouter.tsx","index.tsx","core/redux/middleware/noOpMiddleware.ts","assets/logo_hrdq.gif","assets/logo_talentsmart.png"],"names":["module","exports","require","TextDirection","ActionType","makeInitialState","lang","onMobile","direction","rtl","RTL","LTR","loading","error","lastActivity","Date","sessionStorageLoaded","showTimeoutModal","showTimedOut","timedOutHandle","featureFlags","undefined","config","locale","portalLanguages","textDirection","translations","allLanguages","openSideMenu","displayIdMapping","projectCSContacts","eqScores","inviteEmailTemplates","approverEmailTemplates","raterApprovalEmailTemplates","eqScoresEmailTemplates","reportRecipientDateRange","reportRecipientLastOnly","auth","showLoginAnnouncement","Str","setLocaleAction","language","type","SetLocaleAction","makeRsaaTypes","actions","meta","mapper","action","map","makeApiAction","request","createAction","makeApiReducer","loadingAction","withResults","defaultErrorMsg","state","incomingAction","includes","payload","R","errorMsg","isLoading","pathCombine","segments","fullPath","join","deduped","split","filter","segment","prefixMatch","match","withDoubleSlashedPrefix","replace","startsWithSlash","startsWith","keyFor","actionType","requestId","addLoading","extras","key","getLoading","addError","getError","noLoadingNoError","RouteTemplates","getAppRoot","win","location","href","origin","makeRoutes","rest","participantId","projectId","devPlanItemId","fileName","root","window","project","collaborator","raterApprovalDash","Root","Login","ForgotPassword","AccountSetup","NewPassword","ChangePassword","ChangeSecurityQuestion","Copyright","Privacy","CopyrightStatic","PrivacyStatic","InviteEmailPreview","ApproverEmailPreview","RaterApprovalEmailPreview","SendEQScoresEmailPreview","Project","SelectProject","DevResources","EBook","SetGoals","SelfSurvey","DevPlan","EmailDevPlanModal","DevPlanRemindersModal","AddPlanItem","EditPlanItem","ViewPlanItem","DevResources_DevPlan","Collaborator","CollaboratorDevPlan","CollaboratorViewPlanItem","CollaboratorCustomerService","CreateSurvey","InviteRaters","SearchDirectory","RemindRatersProjDash","RemindRaters","FeedbackReport","ReportTutorial","CustomResource","Account","CustomerService","Language","YmcaLogin","YmcaSso","SamlLogin","SamlAssertion","SsoError","RaterApproval","RaterApprovalLogin","RaterApprovalForgotPassword","RaterApprovalAccountSetup","RaterApprovalDashboard","RaterApprovalAccountConfig","RaterApprovalChangePassword","RaterApprovalChangeSecurityQuestion","RaterApprovalLanguage","RaterApprovalCustomerService","ReportRecipient","ReportRecipientLogin","ReportRecipientForgotPassword","ReportRecipientAccountSetup","ReportRecipientDashboard","ReportRecipientAccountConfig","ReportRecipientChangePassword","ReportRecipientChangeSecurityQuestion","ReportRecipientLanguage","ReportRecipientCustomerService","FileDataDevelopmentPlan","FileDataDevelopmentTip","FileDataDocument","FileDataResource","useRoutes","React","useMemo","BaseUrl","Endpoints","Config","FeatureFlags","ShowLoginAnnouncement","TranslatedLanguages","PortalMessages","ProjectLanguages","ProjectMessages","AllLanguages","Authenticate","AuthenticateBX","AuthenticateTalentSmart","SecurityQuestionKeys","GetSecurityQuestion","SendPortalForgotPassword","SendRaterApprovalForgotPassword","SendReportRecipientForgotPassword","UpdateSecurityQuestion","UpdatePassword","PasswordRequirements","Projects","ProjectSummary","ParticipantRequirements","ProjectResources","ProjectId","UpdateConfidentiality","CurrentStatus","ProjectCSContact","GetEBookUrl","CreateReassessmentRater","AddRaterByEmail","AddRaterById","ParticipantRaters","PreviousRaters","DirectoryRaters","UpdateInviteData","SendInvitations","SendReminders","RaterLevels","DeleteRater","EditRater","SetApprover","SendForApproval","UndeliveredEmails","RaterApprovalParticipants","RaterApprovalRaters","SendRaterApproval","UpdateApprovalStatus","AddRaterByEmailAsApprover","GoalsAnswers","SetGoalAnswer","SendGoals","IsSso","GetSelectedQuestions","AddQuestion","AddQuestionsForCompetency","DeleteQuestion","DeleteQuestionsForCompetency","GetCompetenciesAndQuestions","ApplyPendingChanges","UnsetCreatedSurvey","GetDevPlanItems","GetDevPlanActions","GetDevPlanFieldsAndAnswers","AddDevPlanItem","AddDevPlanAction","DeleteDevPlanItem","DeleteDevPlanAction","UpdateDevPlanItemDescription","UpdateDevPlanItemTitle","UpdateDevPlanActionCompleteByDate","UpdateDevPlanActionStatus","UpdateDevPlanFieldAnswer","GetStatusKeys","SetRemindersOn","GetRemindersOn","SendDevPlan","GetDevActionListItems","UpdateFieldAnswerList","AuthenticateCollaborator","DevPlanCollaborators","AddDevPlanCollaborator","SetDevPlanCollaboratorAccepted","DeleteDevPlanCollaborator","SendDevPlanCollaboratorInvite","SendDevItemCommentNotification","SendParticipantCommentNotification","DevItemComments","AddDevItemComment","UpdateDevItemComment","SetDevItemCommentsRead","DeleteDevItemComment","ViewReports","ReportData","GetEQScores","SendEQScores","EQScoresEmailPreview","ReportRecipientProjects","ReportRecipientParticipants","ReportRecipientReports","DeliverReports","DeliverReportsToRecipient","LogInfo","toMap","objs","getKey","reduce","running","next","toIndexAwareMap","index","sourceIndex","KEY_ACTION","LoadTranslationsRequest","ACTIONS","LoadTranslationsResponse","LoadTranslationsError","loadTranslationsReducer","languageId","successState","item","LoadConfigRequest","LoadConfigResponse","LoadConfigError","loadConfigReducer","JSON","parse","LoadFeatureFlagsRequest","LoadFeatureFlagsResponse","LoadFeatureFlagsError","loadFeatureFlagsReducer","ShowLoginAnnouncementRequest","ShowLoginAnnouncementResponse","ShowLoginAnnouncementError","showLoginAnnouncementReducer","LoginRequest","LoginResponse","LoginError","loginReducer","updatedUser","passwordUsed","password","LoginTalentSmartRequest","LoginTalentSmartResponse","LoginTalentSmartError","loginTalentSmartReducer","temporaryPasskey","LoginBXRequest","LoginBXResponse","LoginBXError","loginBXReducer","withLogoutUrl","logoutUrl","withProjId","SecurityQuestionRequest","SecurityQuestionResponse","SecurityQuestionError","securityQuestionReducer","SendPortalPasswordResetEmailRequest","SendPortalPasswordResetEmailResponse","SendPortalPasswordResetEmailError","sendPortalPasswordResetEmailAction","emailAddress","method","endpoint","headers","body","stringify","toAddress","types","bailout","sendPortalPasswordResetEmailReducer","metaTag","SendRaterApprovalPasswordResetEmailRequest","SendRaterApprovalPasswordResetEmailResponse","SendRaterApprovalPasswordResetEmailError","sendRaterApprovalPasswordResetEmailAction","sendRaterApprovalPasswordResetEmailReducer","NewPasswordRequest","NewPasswordResponse","NewPasswordError","newPasswordAction","userId","currentUser","newPasswordReducer","updatedAuth","passwordReset","passwordRequirementMessage","requirePasswordChange","passwordDigest","CreateSecurityChallengeRequest","CreateSecurityChallengeResponse","CreateSecurityChallengeError","createSecurityChallengeAction","questionId","answer","securityQuestionId","securityAnswer","createSecurityChallengeReducer","LoadProjectsRequest","LoadProjectsResponse","LoadProjectsError","loadProjectsAction","personId","loadProjectsReducer","SecurityQuestionKeysRequest","SecurityQuestionKeysResponse","SecurityQuestionKeysError","securityQuestionKeysAction","securityQuestionKeysReducer","ProjectTranslationsRequest","ProjectTranslationsResponse","ProjectTranslationsError","loadProjMsgsReducer","ProjectLanguagesRequest","ProjectLanguagesResponse","ProjectLanguagesError","projectLanguagesReducer","PasswordRequirementMessageRequest","PasswordRequirementMessageResponse","PasswordRequirementMessageError","passwordRequirementMessageAction","passwordRequirementMessageReducer","PortalLanguagesRequest","PortalLanguagesResponse","PortalLanguagesError","portalLanguagesAction","portalLanguagesReducer","languages","code","AllLanguagesRequest","AllLanguagesResponse","AllLanguagesError","allLanguagesAction","allLanguagesReducer","LoadProjectSummaryRequest","LoadProjectSummaryResponse","LoadProjectSummaryError","loadProjectSummaryAction","loadProjectSummaryReducer","LoadParticipantRequirementsRequest","LoadParticipantRequirementsResponse","LoadParticipantRequirementsError","loadParticipantRequirementsAction","loadParticipantRequirementsReducer","LoadProjectResourcesRequest","LoadProjectResourcesResponse","LoadProjectResourcesError","loadProjectResourcesAction","loadProjectResourcesReducer","AddRaterByEmailRequest","AddRaterByEmailResponse","AddRaterByEmailError","addRaterByEmailReducer","email","requirements","participantRequirements","req","surveyLevelId","requirementToUpdate","levelId","withRaterAdded","raterId","ratersWithUpdatedCount","raterCount","Object","values","AddRaterByIdRequest","AddRaterByIdResponse","AddRaterByIdError","addRaterByIdAction","pageLanguageId","addRaterByIdReducer","ParticipantRatersRequest","ParticipantRatersResponse","ParticipantRatersError","participantRatersAction","participantRatersReducer","mappedRaters","rater","strictEquals","one","two","doNothing","addImgEncoding","imgData","encoding","isNilOrEmpty","value","TIME","BENCHMARKS","UNIX_EPOCH","MS_EPOCH","Y2K","diffMs","startDate","endDate","getTime","isValidDate","date","getFullYear","firstLast","named","firstName","lastName","firstLastReverse","lastCommaFirstLocal","dir","lastCommaFirst","lastCommaFirstReverse","withValidMinimum","r","minimumRequired","withValidMinOrMax","maximumRequired","raterIsInvited","invitedDate","SendInvitationsRequest","SendInvitationsResponse","SendInvitationsError","sendInvitationsReducer","projIdString","sentTo","message","currentRaters","projectRaters","invitedEmailAddresses","st","indexOf","hasBeenInvited","ratersOnTheInvite","ratersNotOnTheInvite","ratersMarkedInvited","updateInvitedDateFor","requirement","invitedRaters","invitedCount","length","updateInvitedCountFor","raters","concat","RaterLevelsRequest","RaterLevelsResponse","RaterLevelsError","raterLevelsAction","raterLevelsReducer","mappedLevels","projectRaterLevels","DeleteRaterRequest","DeleteRaterResponse","DeleteRaterError","deleteRaterReducer","level","withRaterDeleted","allUpdated","prospectiveApprover","approvalStatus","markedApprover","requirementsWithUpdatedCount","LoadProjectIdRequest","LoadProjectIdResponse","LoadProjectIdError","loadProjectIdReducer","displayId","logOutAction","isMobile","LogOut","UpdateRaterRequest","UpdateRaterResponse","UpdateRaterError","updateRaterReducer","openMenuAction","setOpen","OpenMenu","PreviousRatersRequest","PreviousRatersResponse","PreviousRatersError","previousRatersReducer","previousRaters","DirectoryRatersRequest","DirectoryRatersResponse","DirectoryRatersError","directoryRatersReducer","lowercaseSearchTerm","keyword","toLocaleLowerCase","UpdateInviteDataRequest","UpdateInviteDataResponse","UpdateInviteDataError","updateInviteDataReducer","SendRemindersRequest","SendRemindersResponse","SendRemindersError","sendRemindersReducer","SetApproverRequest","SetApproverResponse","SetApproverError","setApproverReducer","allRaters","raterIdsToUpdate","keys","ratersToUpdate","updatedRaters","withUpdatedRaters","withNewApprover","UpdateConfidentialityRequest","UpdateConfidentialityResponse","UpdateConfidentialityError","updateConfidentialityReducer","SendForApprovalRequest","SendForApprovalResponse","SendForApprovalError","sendForApprovalReducer","approvableIds","approvableRaters","setToWaiting","merged","YmcaLoginRequest","YmcaLoginResponse","YmcaLoginError","ymcaLoginReducer","YmcaSsoRequest","YmcaSsoResponse","YmcaSsoError","ymcaSsoReducer","SetGoalAnswerRequest","SetGoalAnswerResponse","SetGoalAnswerError","setGoalAnswerReducer","goalQuestionId","goalsAnswers","editing","changed","updated","goal","questionAnswer","updatedGoalsAnswers","SendGoalsRequest","SendGoalsResponse","SendGoalsError","sendGoalsReducer","GoalsAnswersRequest","GoalsAnswersResponse","GoalsAnswersError","goalsAnswersAction","goalsAnswersReducer","InviteEmailPreviewRequest","InviteEmailPreviewResponse","InviteEmailPreviewError","inviteEmailPreviewReducer","projectSummary","ApproverEmailPreviewRequest","ApproverEmailPreviewResponse","ApproverEmailPreviewError","approverEmailPreviewReducer","SetRemindersOnRequest","SetRemindersOnResponse","SetRemindersOnError","setRemindersOnAction","remindersOn","setRemindersOnReducer","GetRemindersOnRequest","GetRemindersOnResponse","GetRemindersOnError","getRemindersOnReducer","GetDevPlanItemsRequest","GetDevPlanItemsResponse","GetDevPlanItemsError","getDevPlanItemsAction","getDevPlanItemsReducer","RaterApprovalStatus","COLORS","CHART_COLORS","TABLE_COLORS","DARK_BG","LIGHT_BG","BORDER","GetDevPlanActionsRequest","GetDevPlanActionsResponse","GetDevPlanActionsError","getDevPlanActionsAction","getDevPlanActionsReducer","devItemId","UpdateDevPlanFieldAnswerRequest","UpdateDevPlanFieldAnswerResponse","UpdateDevPlanFieldAnswerError","updateDevPlanFieldAnswerAction","fieldAnswer","devFieldId","isNaN","updateDevPlanFieldAnswerReducer","devActionId","toUpdate","devPlan","fieldsAnswers","updateFieldAnswer","updateAction","actionId","updateFunc","updateIndex","actionsByItemId","findIndex","newAction","actionFieldsById","fields","mapping","field","addField","fieldAnswers","newState","targetIndex","devPlanFieldId","sequence","newValue","GetDevPlanFieldsAndAnswersRequest","GetDevPlanFieldsAndAnswersResponse","GetDevPlanFieldsAndAnswersError","getDevPlanFieldsAndAnswersAction","getDevPlanFieldsAndAnswersReducer","fa","question","LoadReportsRequest","LoadReportsResponse","LoadReportsError","loadReportsAction","userName","loadReportsReducer","IsSsoRequest","IsSsoResponse","IsSsoError","isSsoReducer","SamlAssertionRequest","SamlAssertionResponse","SamlAssertionError","samlAssertionReducer","DeleteDevPlanActionRequest","DeleteDevPlanActionResponse","DeleteDevPlanActionError","deleteDevPlanActionReducer","devPlanId","filterOutAction","UpdateDevPlanItemDescriptionRequest","UpdateDevPlanItemDescriptionResponse","UpdateDevPlanItemDescriptionError","updateDevPlanItemDescriptionReducer","itemId","itemIndex","items","newItem","description","UpdateDevPlanItemTitleRequest","UpdateDevPlanItemTitleResponse","UpdateDevPlanItemTitleError","updateDevPlanItemTitleReducer","newTitle","competencyId","competencyName","title","updatedItem","LoadDevResourcesRequest","LoadDevResourcesResponse","LoadDevResourcesError","loadDevResourcesAction","loadDevResourcesReducer","UpdateDevPlanActionCompleteByDateRequest","UpdateDevPlanActionCompleteByDateResponse","UpdateDevPlanActionCompleteByDateError","updateDevPlanActionCompleteByDateReducer","completeBy","LoadCurrentStatusRequest","LoadCurrentStatusResponse","LoadCurrentStatusError","loadCurrentStatusReducer","AddDevPlanActionRequest","AddDevPlanActionResponse","AddDevPlanActionError","addDevPlanActionReducer","goalDate","status","DeleteDevPlanItemRequest","DeleteDevPlanItemResponse","DeleteDevPlanItemError","deleteDevPlanItemAction","deleteDevPlanItemReducer","AddDevPlanItemRequest","AddDevPlanItemResponse","AddDevPlanItemError","addDevPlanItemAction","itemName","addDevPlanItemReducer","GetStatusKeysRequest","GetStatusKeysResponse","GetStatusKeysError","getDevPlanStatusesAction","getDevPlanStatusesReducer","UpdateDevPlanActionStatusRequest","UpdateDevPlanActionStatusResponse","UpdateDevPlanActionStatusError","updateDevPlanActionStatusReducer","statusId","RaterApprovalParticipantsRequest","RaterApprovalParticipantsResponse","RaterApprovalParticipantsError","raterApprovalParticipantsAction","raterApprovalParticipantsReducer","SendDevPlanRequest","SendDevPlanResponse","SendDevPlanError","sendDevPlanAction","to","comment","sendDevPlanReducer","UndeliveredEmailsRequest","UndeliveredEmailsResponse","UndeliveredEmailsError","undeliveredEmailsReducer","undeliveredIds","toLowerCase","undelivered","marked","undeliveredEmail","statusMessageKey","Undelivered","withUndeliveredMarked","ReportRecipientProjectsRequest","ReportRecipientProjectsResponse","ReportRecipientProjectsError","reportRecipientProjectsAction","recipientId","dateRange","reportRecipientProjectsReducer","ReportRecipientParticipantsRequest","ReportRecipientParticipantsResponse","ReportRecipientParticipantsError","reportRecipientParticipantsAction","projectIds","reportRecipientParticipantsReducer","ReportRecipientReportsRequest","ReportRecipientReportsResponse","ReportRecipientReportsError","reportRecipientReportsAction","participantIds","lastOnly","reportRecipientReportsReducer","withOldReportsDeleted","DeliverReportsRequest","DeliverReportsResponse","DeliverReportsError","deliverReportsAction","deliveryRequest","reports","deliverReportsReducer","allReports","reportRecipientReports","reportSetId","reportId","requestArray","requestMap","reportsToUpdate","updatedReports","deliveryDate","portalDelivered","reMappedUpdatedReports","DeliverReportsToRecipientRequest","DeliverReportsToRecipientResponse","DeliverReportsToRecipientError","deliverReportsToRecipientReducer","GetSelectedQuestionsRequest","GetSelectedQuestionsResponse","GetSelectedQuestionsError","getSelectedQuestionsAction","getSelectedQuestionsReducer","AddQuestionRequest","AddQuestionResponse","AddQuestionError","addQuestionReducer","selectedQuestions","AddQuestionsForCompetencyRequest","AddQuestionsForCompetencyResponse","AddQuestionsForCompetencyError","addQuestionsForCompetencyReducer","DeleteQuestionRequest","DeleteQuestionResponse","DeleteQuestionError","deleteQuestionReducer","required","DeleteQuestionsForCompetencyRequest","DeleteQuestionsForCompetencyResponse","DeleteQuestionsForCompetencyError","deleteQuestionsForCompetencyReducer","GetCompetenciesAndQuestionsRequest","GetCompetenciesAndQuestionsResponse","GetCompetenciesAndQuestionsError","getCompetenciesAndQuestionsAction","getCompetenciesAndQuestionsReducer","ApplyPendingChangesRequest","ApplyPendingChangesResponse","ApplyPendingChangesError","applyPendingChangesReducer","RaterApprovalRatersRequest","RaterApprovalRatersResponse","RaterApprovalRatersError","raterApprovalRatersReducer","SendRaterApprovalRequest","SendRaterApprovalResponse","SendRaterApprovalError","sendRaterApprovalReducer","approverId","RaterApprovalEmailPreviewRequest","RaterApprovalEmailPreviewResponse","RaterApprovalEmailPreviewError","raterApprovalEmailPreviewReducer","SendReportRecipientPasswordResetEmailRequest","SendReportRecipientPasswordResetEmailResponse","SendReportRecipientPasswordResetEmailError","sendReportRecipientPasswordResetEmailAction","sendReportRecipientPasswordResetEmailReducer","UnsetCreatedSurveyRequest","UnsetCreatedSurveyResponse","UnsetCreatedSurveyError","unsetCreatedSurveyReducer","AddRaterByEmailAsApproverRequest","AddRaterByEmailAsApproverResponse","AddRaterByEmailAsApproverError","addRaterByEmailAsApproverAction","addRaterByEmailAsApproverReducer","raterApprovalRaters","SessionStorageKeys","ApproveRaterRequest","ApproveRaterResponse","ApproveRaterError","approveRaterReducer","projectRaterArray","raterToUpdate","DeclineRaterRequest","DeclineRaterResponse","DeclineRaterError","declineRaterReducer","setPortalTypeAction","portalType","SetPortalTypeAction","ACTIONS_TO_IGNORE","showTimeoutModalAction","show","ShowTimeoutModalAction","showModal","ReportDataRequest","ReportDataResponse","ReportDataError","reportDataReducer","file","setDevPlanViewedAction","viewed","SetDevPlanViewedAction","AddDevPlanCollaboratorRequest","AddDevPlanCollaboratorResponse","AddDevPlanCollaboratorError","addDevPlanCollaboratorReducer","currentCollaborators","withCollaboratorAdded","DeleteDevPlanCollaboratorRequest","DeleteDevPlanCollaboratorResponse","DeleteDevPlanCollaboratorError","deleteDevPlanCollaboratorReducer","collaborators","c","AddDevItemCommentRequest","AddDevItemCommentResponse","AddDevItemCommentError","addDevItemCommentReducer","itemComments","UpdateDevItemCommentRequest","UpdateDevItemCommentResponse","UpdateDevItemCommentError","updateDevItemCommentReducer","commentId","commentIndex","commentToUpdate","lastUpdated","DeleteDevItemCommentRequest","DeleteDevItemCommentResponse","DeleteDevItemCommentError","deleteDevItemCommentReducer","GetDevPlanCollaboratorsRequest","GetDevPlanCollaboratorsResponse","GetDevPlanCollaboratorsError","getDevPlanCollaboratorsAction","getDevPlanCollaboratorsReducer","SetDevPlanCollaboratorAcceptedRequest","SetDevPlanCollaboratorAcceptedResponse","SetDevPlanCollaboratorAcceptedError","setDevPlanCollaboratorAcceptedReducer","GetDevItemCommentsRequest","GetDevItemCommentsResponse","GetDevItemCommentsError","getDevItemCommentsAction","getDevItemCommentsReducer","unreadCommentCount","comments","commentRead","isCurrentUserComment","isParticipantComment","devItemSubtitleLocal","participant","participantFirstName","participantLastName","participantEmail","nameStr","devItemSubtitle","devItemSubtitleReverse","SetDevItemCommentsReadRequest","SetDevItemCommentsReadResponse","SetDevItemCommentsReadError","setDevItemCommentsReadReducer","readComments","unreadComments","commentsByReadStatus","updatedUnreadComments","AuthenticateCollaboratorRequest","AuthenticateCollaboratorResponse","AuthenticateCollaboratorError","authenticateCollaboratorReducer","displayProjectId","SendDevPlanCollaboratorInviteRequest","SendDevPlanCollaboratorInviteResponse","SendDevPlanCollaboratorInviteError","sendDevPlanCollaboratorInviteReducer","SendDevItemCommentNotificationRequest","SendDevItemCommentNotificationResponse","SendDevItemCommentNotificationError","sendDevItemCommentNotificationReducer","SendParticipantCommentNotificationRequest","SendParticipantCommentNotificationResponse","SendParticipantCommentNotificationError","sendParticipantCommentNotificationReducer","GetDevActionListItemsRequest","GetDevActionListItemsResponse","GetDevActionListItemsError","getDevActionListItemsReducer","compilationCategoryListItemId","UpdateFieldAnswerListRequest","UpdateFieldAnswerListResponse","UpdateFieldAnswerListError","updateFieldAnswerListReducer","SendEQScoresRequest","SendEQScoresResponse","SendEQScoresError","sendEQScoresReducer","LogInfoRequest","LogInfoResponse","LogInfoError","logInfoAction","triggeringActionType","category","logInfoReducer","EQScoresEmailPreviewRequest","EQScoresEmailPreviewResponse","EQScoresEmailPreviewError","eqScoresEmailPreviewReducer","GetEQScoresRequest","GetEQScoresResponse","GetEQScoresError","getEQScoresReducer","releaseId","GetProjectCSContactRequest","GetProjectCSContactResponse","GetProjectCSContactError","getProjectCSContactReducer","GetEBookUrlRequest","GetEBookUrlResponse","GetEBookUrlError","getEBookUrlReducer","ReassessmentRequest","ReassessmentResponse","ReassessmentError","reducers","UpdateStateAction","ShowTimedOutAction","SetTimedOutHandleAction","handle","sla","participants","surveyUrl","SaveEditedRater","updatedRater","raterLevel","surveyLevelName","fullName","nativeName","englishName","ClearLoadingStateAction","ClearLastSentEmail","sdpva","SaveFieldAnswerList","compilationCategoryListIds","listItems","listFieldIndex","f","list","answers","compCatId","text","SetDateRange","SetLastOnly","AddFilterParticipant","displayName","AddFilterProject","RemoveFilterParticipant","RemoveFilterProject","SetAllSelected","participantReportId","isChecked","selected","SetSelected","selectedReport","report","updatedReport","sort","a","b","useMount","onMount","storage","sessionStorage","setItem","ex","console","log","serialized","getItem","removeItem","useSessionStorage","defaultValue","setValue","set","remove","defaultLanguages","default","codePage","charSet","defaultLocaleState","useAppState","selector","useSelector","AppStateSessionStorageBridge","Auth","authValue","setAuth","collabValue","setCollab","configValue","setConfig","featureFlagsValue","setFeatureFlags","Locale","localeValue","setLocale","InviteEmailTemplates","inviteTemplatesValue","setInviteTemplates","ApproverEmailTemplates","approverTemplatesValue","setApproverTemplates","RaterEmailTemplates","raterApprovalTemplatesValue","setRaterApprovalTemplates","EQScoresEmailTemplates","eqScoresTemplatesValue","setEqScoresTemplates","dispatch","useDispatch","currentCollaborator","inviteTemplates","approverTemplates","raterApprovalTemplates","inviteRef","approverRef","raterApprovalRef","eqScoresRef","current","Boolean","hostname","isRtl","doMsgReplacements","RegExp","useCurrentUser","usePortalType","CreateMessage","containsMarkup","containsToken","isDefault","defaultMessages","InviteRatersParen","RemindRatersParen","FooterCopyrightPrivacy","NameAdded","ActionsAdded","RatersNotInvitedWarn","RatersNotSentWarn","ReportsDelivered","ReportsDownloaded","UndeliveredRaters","CustomerServicePhone","FooterPhoneLinks","CustomerServiceSupportLink","FooterSupportSiteLink","CopyrightText","PrivacyText","CopyrightRightsReserved","DevPlanAccessMsg","ActionNumber","Add","AddDate","AddDevItem","AddAction","AddItem","AddOptionalText","AddPreviousRaters","AddRater","AddCalendar","Added","AggregateReport","All","AllDeliveries","AnswerRequired","Answer","AnswerSecurityQuestion","Approval","ApprovalColon","ApprovalRequestSent","Approve","ApprovalStatus3","ApprovalStatus1","Approver","ApproverColon","RatersNotInvitedConfirm","AutoRemindersConfirm","ConfirmRemind","ConfirmRemoveRater","ConfirmRemoveItem","ConfirmRemoveAction","DevPlanReminders","Available","BackToLogin","Begin","EntryAgreement","Cancel","ChangePasswordTitle","ChangeSecurityQuestionTitle","ChooseLanguage","ChooseProject","ChooseRater","ChooseSecurityQuestion","ChooseCompetency","ChooseCompetencies","Company","Competencies","DashDevPlanItemsMsg","DashDevPlanItemsEmailMsg","CompleteBy","Completed","Composite","ConfirmPassword","PasswordMismatch","DevPlanCompleteMsg","Continue","CreatePassword","CreateASurvey","CreateDevPlan","CurrentPassword","CustomerSupport","CustomizeEmail","CustomizeInvite","Dashboard","DateRangeReports","Days","DeadlineColon","Decline","ApprovalStatus4","Deliver","DeliverAll","DeliverSelected","Delivered","DeliveredParticipant","Description","DescriptionNotAdded","DevActions","Devitem","DevTips","Done","Download","DownloadAll","DownloadSelected","EditSurvey","Email","EmailColon","EmailRater","EmailOther","EmailPreview","EmailReminders","TemplateMissing","EmailGoals","EmailPlan","DashDevPlanEmailMsg","EnterDevItem","EnterEmail","Expired","AddFailed","LoadFailed","SecurityQuestionFather","SecurityQuestionColor","SecurityQuestionDessert","FilterParticipant","FilterProject","FirstName","SecurityQuestionPet","FullReport","GoalsSentTo","Hours","DashDevPlanDoneMsg","DefaultDevPlanField2","RaterApprovalMsg","ScoredHigh","ScoredLow","InProgress","CreateSurveyFootnote","Incomplete","InvalidEmail","LoginFailure","Individual","InviteRemindRaters","InviteRequirements","Invited","InvitedColon","InvitesSent","WebReportMsg","LanguageColon","Last3Months","Last6Months","LastMonth","LastName","LastYear","LogIn","Minutes","CustomerServiceHours","SecurityQuestionMother","NA","NameColon","Name","NameOrEmail","NameEmail","ApprovalStatus2","SecurityQuestionNickname","No","NotAvailable","NotInvited","NotStarted","NoteForReminders","Off","On","Online","OptionalComments","Or","Password","PasswordFailsRequirements","Phone","SelectQuestion","LoginTitle","PrivacyPolicy","Question","Questions","RaterStatus","RecommendedMinimums","Relationship","RelationshipColon","RemindersSent","Remove","ReportPortal","Reports","RequiredMinimums","RequiredOpenQuestions","Resources","ResponseNotAdded","Retry","Review","ReviewDevPlan","ReviewFeedback","Save","Search","SearchParticipants","SearchProjects","SecurityQuestion","Select","SelectOne","Send","SendApproval","SetPassword","SetSecurityQuestion","ShowMostRecent","Skills","Status","Submitted","Summary","SummaryReport","SurveyDeadline","SurveyDeadlineColon","TakeSelfSurvey","IncorrectAnswer","IncorrectPassword","SetGoalsDefaultIntro","ThisMonth","ThisYear","Tips","DashInviteMsg","DevPlanDefaultInstructions","ViewReport","ViewRequirements","ViewEdit","ViewEditDetails","ApprovalStatus5","DefaultDevPlanField1","DefaultGoal3","DefaultGoal1","WhatToDevelop","DefaultDevPlanField3","DefaultGoal2","Yes","DevPlanNumberEmailMsg","DevPlanNumberMsg","InviteApprovalMsg","ApproveFor","DashCreateSurveyMsg","DevPlanEmailMsg","InviteApprovalMsg2","UninvitedRatersMsg","MaxRatersMsg","NoProjects","PasswordRestrictDays","PasswordLastX","RequiredRatersApprovalMsg","RequiredRatersInviteMsg","AccountLocked","AutoRemindersWarn","YourSurvey","SurveyCreated","SurveyFinal","TempPasswordSent","DashMakingProgressMsg","Pdf","Type","Web","SsoFailure","ChooseApprover","PlanSentTo","ChooseOne","PermissionMsg","OpenQuestions","NoReports","UnableToProcess","NameRequired","LoadMore","NoApprovalParticipants","ApprovalSent","RatersNotProcessed","LoginApprovalTitle","LoginRecipientTitle","NoRaters","UnknownError","NoResults","AddApproveRater","TimedOutMsg","TimeoutMsg","Ok","DevPlanContentExists","DevPlanNumberShareMsg","DevPlanShareMsg","InviteShare","UnreadCommentsMsg","ConfirmUnshare","ConfirmShare","ViewDetails","AssessmentDetail","EnterName","Accepted","NotAccepted","UnreadComments","You","DateNotAdded","Comments","Other","InviteSent","SharePlan","RequireSymbol","RestrictPI","InviteApprovalMsg3","Share","ShareScores","ScoresSent","Generating","Redeliver","EnterComment","EBookAvailability","ReassessmentMsg","RetakeAssessment","ReassessmentAreYouSure","LoginAnnouncement","useMsg","str","useMsgText","defaultMsg","msg","useToggle","startToggled","useState","isToggled","setIsToggled","useDevPlanCollaborationSetting","developmentPlanCollaborate","useCurrentCollaborator","useAddCollaboratorModalProps","projId","collaboratorEmail","setCollaboratorEmail","collaboratorComment","setCollaboratorComment","modalVisible","toggleModal","addCollaboratorModalVisible","showAddCollaboratorModal","dismissAddCollaboratorModal","confirmAddCollaboratorMsg","langId","onConfirmAddCollaborator","useCallback","addDevPlanCollaboratorAction","useDeleteCollaboratorModalProps","deleteCollaboratorModalVisible","showDeleteCollaboratorModal","dismissDeleteCollaboratorModal","confirmDeleteCollaboratorMsg","onConfirmDeleteCollaborator","deleteDevPlanCollaboratorAction","useCollaborationProjIds","useRouteMatch","routePartId","params","routeProjDispId","statePartId","currentProject","stateProjDispId","projDisplayId","TranslationLoader","langs","routes","devPlanProjectId","questions","compQ","competenciesAndQuestions","devItems","projects","devResources","custResources","projectResources","raterLevels","goals","questionsRef","useRef","useEffect","compQRef","devItemsRef","fieldsAnswersRef","requirementsRef","projectsRef","projectRef","devResourcesRef","custResourcesRef","ratersRef","raterLevelsRef","goalsRef","supportedLanguages","defaultLang","intersection","find","userLang","getSupportedLanguage","navigator","appRoot","loadTranslationsAction","loadProjMsgsAction","ConfigLoader","Z_INDEX","BREAKPOINTS_PX","mq","bp","onPhone","onMobileMedium","onMobileDevice","HIDE_ON_MOBILE","css","HIDE_ON_MOBILE_MED","SHOW_ON_MOBILE","styles","RtlToggle","props","showDebugRtlSelector","onClick","className","GLOBAL_FONTS","LocalDiv","forceDirection","layoutDirection","version","hidden","AppVersion","process","parseQueryToKeyedStrings","query","scrubbed","substr","querystring","OldRouteInterceptor","useLocation","queryParams","search","participantid","projectid","from","pathname","isOnMobile","matchMedia","matches","LogoutTimer","timeoutMin","timeout","isLoggedIn","scheduleModal","lastActive","remaining","moment","diff","setTimeout","clearTimeout","closeButton","ModalHeader","dismissable","aria-label","onDismiss","icon","faTimes","defaultProps","modalBg","modal","Modal","onClickToDismissModal","dismissOnClickOutside","onKeyUp","event","dismissOnEsc","stopPropagation","addEventListener","removeEventListener","useKeyListener","ReactDOM","div","aria-modal","animate","opacity","transition","duration","scale","children","document","LocalHTMLContainer","innerHtml","dangerouslySetInnerHTML","__html","removeRedundantBackslashes","Msg","msgText","BTN_DISABLED","BTN_HOVER","BTN_GENERAL","BTN_SHIMMER","btnStyle","primary","color","secondary","tertiary","transparent","invisible","rootStyle","Spacer","sizePx","FLEX_COLUMN","FLEX_ROW","FLEX_ADAPTIVE","FLEX_ADAPTIVE_MED","FLEX_CENTERED","FLEX_SPACED","content","label","mobileToolbarLabel","LocalBtn","defaultText","svg","useMobileToolbarStyling","translation","size","iconStyle","PortalType","BROWSER","getCurrentBrowser","agent","userAgent","FIRE_FOX","IE11","EDGE","CHROME","SAFARI","UNKNOWN","parseUserAgent","currentBrowser","onFirefox","onIe","onEdge","onChrome","onSafari","useBrowser","msgContainer","btnRow","btn","TimeoutModal","timedOut","history","useHistory","logoutClick","RATER_APPROVAL","REPORT_RECIPIENT","continueClick","dismissAction","setTimedOut","setTimedOutHandleAction","ProjectStatus","parent","header","iframe","Statement","titleKey","rawContent","bodyKey","headerElement","frameBorder","srcDoc","src","srcPage","CopyrightStatement","PrivacyStatement","useLoading","useAnyLoading","actionTypes","useLoadingOfType","loadingMap","useError","useAnyError","useErrorOfType","errorMap","YmcaLoginPage","queryObj","loginError","isLoggingIn","ymcaSso","ssoRedirect","returnUrl","returnURL","path","render","redirectUrl","Spinner","xmlns","viewBox","fill","d","attributeName","dur","repeatCount","Loader","ROW_STYLE","TABLE_STYLE","getWindowSize","innerWidth","innerHeight","outerWidth","outerHeight","useWindowSize","windowSize","setWindowSize","updateDimens","debounce","statusToColor","getProjectStatus","expired","canAddRaterForLevel","maximumsRequired","dataRow","link","renderDataPoint","labelKey","labelDefault","ProjectCard","selectMsg","statusKey","surveyName","surveyDeadline","toLocaleDateString","projectRoute","loader","noProjects","tableWrapper","table","cells","name","deadline","navBtn","projectCard","ProjectTable","edgeCase","renderEdgeCase","colSpan","renderData","ProjectModal","hasProjects","hasOneProject","dismiss","push","YmcaSsoPage","userInfo","ticket","ymcaSsoAction","authenticated","spinner","ReportRecipientRedirect","reportRecipientParticipants","reportRecipientProjects","RaterApprovalRedirect","raterApprovalParticipants","SamlAssertionPage","redirect","reportRecipient","raterApproval","PLAIN_GREEN_LINKS","PLAIN_BLUE_LINKS","LogoBox","system","logo","zfLogo","hrdqLogo","talentSmartLogo","tbcLogo","alt","container","csHeader","phoneLinks","LoginFooter","msgs","customerSupport","customerServicePhone","footerPhoneLinks","footerSupportSiteLink","hasContactInfo","hasCopyrightPrivacy","faUserCircle","logoContainer","formContainer","announcementMsg","headerMsg","loaderContainer","LoginLayout","showAnnouncement","SsoErrorPage","INPUT","borderColor","textColor","FORM_COLUMN","LocalInput","placeholderTranslation","placeholderDefault","placeholder","loginFormValidation","yup","shape","username","trim","forgotPasswordEmailFormValidation","updatePasswordFormValidation","invalidPassword","reqsNotMet","fieldsDoNotMatch","minLength","currentPassword","oneOf","min","confirmPassword","setupSecurityQuestionFormValidation","questionRequired","positive","ERROR_MSG","FIELDSET_DEFAULT","fieldset","form","input","LoginForm","useFormik","initialValues","initialEmail","initialPassword","onSubmit","onLoginAttempt","resetForm","validationSchema","validateOnChange","handleSubmit","handleChange","isValid","disabled","onChange","autoComplete","loginPermission","user","hasRaterApprovalLoginPermission","hasReportRecipientLoginPermission","hasPortalLoginPermission","ExternalRedirect","route","assign","loginForm","forgotPasswordLink","entryAgreement","LoginPage","portalHeader","raterApprovalHeader","reportRecipientHeader","announcement","raterApprovalLogin","reportRecipientLogin","allLangs","userQueryObj","langid","setup","login","checkSurveyPasskey","loginAction","loginTalentSmart","loginTalentSmartAction","loginBX","loginBXAction","passkey","em","bx_email","signout","signout_url","uId","bx_uid","pId","bx_pid","collaboratorid","collaboratorInfo","ssoInfo","isAuthorized","locked","notAuthorized","isSso","accountSetupUrl","postLogin","forgotPasswordUrl","ForgotPasswordEmailForm","getSecurityQuestion","setEmailAddress","emailAddressNotFound","ForgotPasswordSecurityAnswerForm","sendPasswordResetEmailRequest","incorrectSecurityAnswer","ForgotPasswordSuccessForm","handleKeyPress","e","charCode","loginUrl","linkRef","focus","onKeyPress","ref","useStickyDiff","diffFn","startingValue","hasChanged","prevInput","returnVal","newOut","setState","useToggleOnSuccess","hasError","prev","ForgotPasswordPage","pwResetInfo","securityQuestionKeys","stateLangId","paramLangId","securityQuestionAction","requestPasswordResetEmail","awaitingSecurityQuestion","resetRequestMetaTag","awaitingEmailRequestResult","requestActionType","errorRequestingEmail","requestSubmitted","securityQuestionKey","securityQuestion","enteringEmail","answeringSecurityQuestion","forgotPasswordSuccess","PAGE_PADDING","PAGE_HEIGHT","PAGE_BG","loginUrlFor","pathName","ProtectedRoute","component","renderFunc","routeProps","at","NewPasswordForm","requireSymbol","pwReqsNotMet","pwsDoNotMatch","createPassword","minPwLength","errors","pwRequirements","serverSideValidationError","SELECT_GENERAL","SELECT_ARROW","arrow","SELECT","LocalDropdownOption","labelText","LocalSelect","CreateSecurityQuestionForm","questionMsg","ansReqsNotMet","createSecurityChallenge","Number","renderQuestionOptions","errorCreatingSecurityChallenge","AccountSetupPage","passwordHash","createPasswordLoading","isLoadingSecurityQuestionResult","createPasswordError","questionKeys","pwReqMsg","passwordRequirements","passwordLength","needsNewPassword","hasSecurityChallenge","pwFormHeaderMsg","questionFormHeaderMsg","isLoadingCreationQuestionResponse","postSetup","spacer","BulletedMsg","role","spacePx","option","optionIcon","silentLink","AppActions","logLogoutUrl","projectLanguages","url","logout","accountUrl","languageUrl","faGlobeAfrica","customerServiceUrl","faQuestionCircle","faTimesCircle","useProjIds","useRaterApprovalIds","useProjIdsForUserType","isParticipant","participantProjIds","collaboratorProjIds","appActions","footer","linkContainer","inactiveLink","activeLink","iconMediumGrey","iconGreen","RaterApprovalMenu","routeIds","projectLogo","truScoreLogo","endsWith","faCircle","LTR_SHADOW","RTL_SHADOW","displaceDiv","menuContentWrapper","openCloseBtns","hamburgerBtn","chevronBtn","getChevronInset","isOpen","getChevronImg","faChevronRight","faChevronLeft","SideMenu","Localization","toggleMenu","toggleMenuDelayed","shadow","getShadow","chevronOffset","getChevronOffset","menuOffset","contentWidthPx","menuDisplacement","closeOnClickInside","target","tagName","displace","aria-expanded","faBars","tabIndex","getElementById","pageContent","DashboardLayout","initial","exit","floatMenu","startOpen","menu","contentStyle","RaterApprovalLayout","ActionIcon","iconSize","caption","captionStyle","nameEmailCell","greenIcon","grayIcon","RaterApprovalTableRow","showName","levelName","canEdit","approved","faCircleSolid","preventDefault","markRaterApproved","faCheck","declined","markRaterDeclined","infoRow","iconRow","actionIcon","green","gray","translucent","RaterApprovalCard","onClickApproveIcon","onClickDeclineIcon","approveIconProps","captionMsg","declineIconProps","editableStatuses","None","NeedApproval","WaitingForApproval","participantByUniqueIdentifier","projectParticipantKey","p","projectParticipant","hasStatus","approvable","canEditRater","approvalStatuses","hasStatusIn","isApproved","Approved","isDeclined","Declined","row","cardsContainer","RaterApprovalList","mapRatersToRows","showRaterNames","ratersToApprove","ratersToDecline","mapRatersToCards","editRaterWithNamesFormValidation","invalidEmail","invalidLevelId","acceptableLevelIds","test","n","editRaterFormValidation","customizeMessageFormValidation","customText","essentialFields","dropdownBtnContainer","dropdown","btnContainer","button","AddRaterForm","invalidEmailMsg","nameRequiredMsg","requiresNameToAdd","levels","includeName","relationshipMsg","maximumRatersAdded","hideLevelSelect","setErrors","addRater","requireNamesOnAdd","enableReinitialize","setErrorMsg","addingRater","showNameFields","approver","toolbar","msgBar","actionsBar","approverMsg","customizeApprovalBtn","sendApprovalBtn","RaterApprovalTable","notifMsg","showProcessingErrorMsg","ratersNotUpdatedCount","addErrorMsg","showApprovalSentMsg","some","i","msgStyle","msgData","participantName","showIcon","faExclamationTriangle","toggleCustomizeEmailModal","disableCustomizeModalButton","faEnvelope","sendApprovalEmail","disableSendApprovalButton","setAddErrorMsg","MobileToolbar","MobileToolbarBtn","MobileRaterApprovalToolbar","faWrench","onClickCustomizeModalButton","onClickSendMsgButton","LocalTextArea","contentContainer","textArea","previewContainer","emailPreview","btnSpacer","CustomizeEmailModal","portalProjectId","raterApprovalProjectId","CustomEmailTxt","setCustomEmailTxt","CustomEmailLogo","setCustomEmailLogo","CustomEmailParticipant","setCustomEmailParticipant","CustomEmailSurvey","setCustomEmailSurvey","CustomEmailDateDue","setCustomEmailDateDue","CustomEmailRatersApproved","setCustomEmailRatersApproved","CustomEmailRatersDeclined","setCustomEmailRatersDeclined","CustomEmailRatersAdded","setCustomEmailRatersAdded","emailLogo","survey","dateDue","ratersApproved","ratersDeclined","ratersAdded","modalTitle","previewBoxTitle","emailComment","setEmailComment","rows","allowFullScreen","ieIframeRoute","useMap","initialMap","setMap","addElement","removeElement","useTimedToggle","delay","useCounter","startValue","setterFn","useCounterOnAnySuccess","successCount","incrementSuccessCount","resetSuccessCount","returnedReqs","loadingObjs","errorObjs","useCounterOnAnyError","errorCount","incrementErrorCount","resetErrorCount","selectMsgContainer","singleParticipantName","select","readyToSend","toggleSendSignal","customizeModalVisible","toggleCustomizeModal","addedRaterCount","resetAddedRaterCount","approvalCount","resetApprovalCount","declineCount","resetDeclineCount","decisionCount","resetDecisionCount","approvalErrorCount","resetApprovalErrorCount","declineErrorCount","resetDeclineErrorCount","updateErrorCount","resetUpdateErrorCount","markRaterToApprove","cancelApprovingRater","markRaterToDecline","cancelDecliningRater","langInfo","emailBody","hasParticipants","hasOneParticipant","hasMultipleParticipants","pendingRaters","ratersByApprovalStatuses","editableRaterMarked","allUpdateRequestsReturned","participantEmailInfo","loadingRaters","approvalSent","useTimedToggleOnSuccess","useToggleOnError","errorSendingApproval","resetSendingApprovalError","sendLoading","approveLoading","declineLoading","disableSendApprovalBtn","onSelectParticipant","identifiers","approveRater","approveRaterAction","declineRater","declineRaterAction","sendRaterApprovalAction","sendAllUpdates","raterApprovalEmailPreviewAction","raterApprovalRatersAction","mapParticipantsToOptions","toLocaleString","inviteRatersPromptRaterNames","inviteRatersRequireRaterNames","useInterval","callback","delayMs","savedCallback","id","setInterval","clearInterval","Metric","valueStyle","defaultLabel","labelStyle","unitContainer","unit","toStr","time","pad","Math","max","floor","CountDown","remainingMs","setRemainingMs","onTick","remainingDays","remainingHours","remainingMinutes","deadlineTitle","countdown","clockImg","getColor","now","DeadlineCounter","txtColor","setTxtColor","toLocaleTimeString","faClock","breadcrumb","homeLink","homeImg","deadlineCounter","SurveyHeader","faHome","ReportRecipientMenu","projIds","ReportRecipientLayout","KnownResources","stepLink","disabledLink","iconBlue","iconDarkGrey","iconFor","nextStep","started","complete","faCheckCircle","faHistory","faCircleHollow","iconColorFor","active","ProjectSteps","proj","requirementsMet","every","s","followupSurveyStep","followupSurveyStarted","followupSurveyCreated","inviteRatersStep","approval","inviteRatersRaterApprovalOption","raterInvited","sentForApproval","approverEmailSent","selfSurveyStep","selfSurveyInProgress","selfSurveyAmountComplete","selfSurveyCompleted","setGoalsStep","setGoalsAmountComplete","viewReportStep","reportAvailable","devPlanInteractive","developmentPlanUseInteractive","devPlanStaticUrl","developmentPlanPageUrl","developmentPlanStep","devPlanAmountComplete","developmentPlanEmailLevelId","developmentPlanGoalsToTrack","devPlanEmailSent","devPlanItemCount","devPlanViewed","pastDue","surveyPastDue","passkeyExpired","viewReportActive","inviteStarted","createSurveyNextStep","inviteRatersNextStep","inviteRatersDisabled","inviteRatersComplete","selfSurveyNextStep","selfSurveyDisabled","setGoalsNextStep","noDevPlanRequirements","devPlanStarted","devPlanNextStep","devPlanComplete","staticDevPlanUrl","staticUrl","baseUrl","substring","lcUrl","reload","rel","isSpecificResource","resourceName","resource","nameText","isDevResources","isTutorialResource","Tutorial","isEBookResource","resourceLinks","resourceLink","linkIcon","ResourceMenu","resources","res","faBook","nameMessageId","LocalLink","projectSelect","mockSelectDiv","mockSelectSpan","realSelect","ProjectMenu","defaultLogo","clientImageData","ProjectLayout","CollaboratorAppActions","CollaboratorProjectSteps","CollaboratorMenu","CollaboratorLayout","PortalAutoLayout","COLLABORATOR","renderLayout","labels","buttons","pageTitle","lowerCasePath","passwordClicked","questionClicked","personName","clientName","ClamShell","height","overflow","ease","ActionMsg","showBtn","btnMsg","ErrorMsg","showRetry","onRetry","BTN_STYLE","pwInput","buttonRow","submitButton","cancelButton","ChangePasswordModal","goBack","invalidCurrentPw","validationError","ChangeSecurityQuestionModal","RaterApprovalRouter","loadParticipants","loadParticipantInfo","FilterIcon","width","FilterBar","fillColor","useDisabledIconColor","useDarkIconColor","onClickFilterIcon","DownloadIcon","SendIcon","deliverText","linkDisabled","ReportTableRow","delivered","reportType","differentLanguages","typeStr","isComposite","isSummary","languageName","singleReport","reportClicked","faUsers","faUserAlt","redeliverClicked","hasDeliverPermission","deliverClicked","webReport","reportUrl","fileExists","encodeURIComponent","reportFile","fileURL","downloadURL","downloadClicked","checked","DataTable","mapHeaders","tableContainer","allColumnHeader","headerButton","ReportRecipientReportList","allSelected","toggleSelected","sortField","setSortField","sortOrder","setSortOrder","mapReportsToRows","setSelectedAction","name1","name2","localeCompare","email1","email2","delivery1","toString","delivery2","reportType1","reportType2","sortVal","sortedReports","availableDownload","requestSort","sortAsc","sortDesc","faSortUp","faSortDown","downloadAllClicked","inputRow","searchIcon","dataRows","SearchableDataModelList","toggleChecked","currentText","setCurrentText","searchText","setSearchText","searchData","dataValues","displayValue","options","model","aria-checked","searchStr","isProject","faSearch","ReportRecipientProjectList","projectViewData","toggleCheck","ReportRecipientParticipantList","participantViewData","Card","localizeDir","dirProps","RecipientProjectCard","onDelete","RecipientParticipantCard","filterBar","dateRangeBar","projectBar","participantBar","dateContent","selectContainer","checkBoxContainer","checkBox","filterCaption","ReportRecipientTable","setDateRange","range","setDateRangeAction","projectArr","participantArr","part","toggleLastOnly","setLastOnlyAction","projectListVisible","showProjectList","participantListVisible","showParticipantList","stateFilterProjects","reportRecipientSelectedProjects","filterProjects","defaultRecipientProjectId","addFilterProject","addFilterProjectAction","removeFilterProject","removeFilterProjectAction","stateFilterParticipants","reportRecipientSelectedParticipants","filterParticipants","addFilterParticipant","addFilterParticipantAction","removeFilterParticipant","removeFilterParticipantAction","isProjectChecked","toggleCheckProject","isParticipantChecked","participantIdString","toggleCheckParticipant","thisMonthStr","lastMonthStr","last3MonthsStr","last6MonthsStr","thisYearStr","lastYearStr","allDeliveriesStr","projectCards","participantCards","showProjects","showParticipants","checkedProjects","checkedParticipants","messageVisible","downloaded","deliverBtn","downloadBtn","hasReportRecipientDeliverPermission","setDelivered","setDownloaded","showMessage","Array","archiveDir","downloadAllCount","downloadSelectedCount","deliverRequest","last","dates","selectedFiles","fileOnly","deliverDisabled","downloadDisabled","selectedRequest","ReportRecipientRouter","CardHeader","iconOverflow","IconRow","iconMax","numberOfIcons","numberOfActive","faUser","MAX_VALUE","completed","notCompleted","RequirementSummary","minimumsRequired","isCompleted","completedCount","CircleImg","raterRow","metric","metricValue","metricLabel","RaterCounts","invited","incomplete","allowLinking","inviteRatersEnabled","inviteLink","remindLink","linkStyle","circleStyle","aria-disabled","faUserPlus","svgRoot","childContainer","ProgressCircle","ieSvgContainerFix","radius","normalizedRadius","stroke","circumference","PI","rings","ringConfig","progress","normalizedProgress","strokeDashOffest","circleAnimation","keyframes","strokeDashoffset","style","toSvgConfig","ringBg","insideColor","strokeWidth","cx","cy","ring","strokeDasharray","array","getSurveyLevelColor","circle","metricIcon","RaterSummaryChart","numCompleted","sumCompleted","chartConfig","sum","mapRingConfig","circleDiameterPx","faUserCheck","count","raterCounts","RaterStatusCard","cardTitle","nonEmptyRequirements","inviteRemindDisabled","linkLayout","stepTitle","statusTitle","img","processImg","iconDisabled","iconInProgress","iconComplete","nonChartCircle","colorForCompletion","msgFor","completedMsg","selfSurveyStatus","reportProcessing","setGoalsStatus","faPaste","goalFlagBlueImg","goalFlagGreenImg","processingImg","chartImg","cardContent","leftSide","rightSide","fullWidth","subtitle","reqText","progressCircleIcon","progressText","DevPlanSummary","previousDevPlan","plan","linkRoute","linkMsg","statusMsg","noRequirements","subtitleMsgForProgress","reqMsg","requirementsMsgFor","reqSubs","devPlanEmailLevelName","colorForProgress","colorStyle","isTrackingGoals","devPlanStatusMessageKey","ReassessmentModal","onClickYes","customResources","actionBanner","projectSteps","projReqs","showSurveyBanner","showInviteBanner","showProjectSteps","showRaterStatus","showReassessmentBanner","reassessmentProject","reassessmentTriggerOwn","hasReassessmentRater","reassessmentSurveyCompleted","confirmReassessment","toggleConfirmReassessment","onCreateSurveyClick","onInviteRatersClick","reassessmentSurveyUrl","onConfirmReassessmentClick","open","ProjStr","selectRow","whiteBottom","DevResourceModal","compCats","setResource","compCat","visibilityOn","letterCode","disablePreviousBtn","disableNextBtn","selectedIndex","renderInfo","scoreHighMessage","scoreLowMessage","developmentTips","setPrevious","faCaretLeft","setNext","faCaretRight","useProjMsg","projectMsgs","useProjMsgText","ProjMsg","curlyTokens","pointyTokens","withTokensReplaced","editMode","inEditMode","goalAnswer","saveAnswer","handleClick","handleCancel","Goal","questionText","emailGoalsFormValidation","msgRow","EmailGoalsForm","sendingGoals","errorSendingGoals","goalsSent","toggleSentAlert","sendGoals","sendGoalsAction","allAnswered","MobileSetGoalsActionsBar","openSendGoalsModal","SendGoalsEmailModal","intro","card","underEdit","setUnderEdit","toggleSendGoalsModal","goalsAndAnswers","projDefaultLang","setGoalAnswerAction","goalCards","SetGoalsIntro","selfSurveyUrl","handleFinish","data","CreateSurveyMessageBar","iconImage","iconColor","competency","hide","greenBg","lightGreenBg","blueBg","lightBlueBg","borderTop","wrenchIcon","competencyOpen","deleteBtn","deleteIcon","iconWhite","plusMinus","plusMinusDarkBg","center","padEnds","italicized","CreateSurveyViewAccordian","competencies","Set","menuOpen","accordian","showDeleteCompetency","showDelete","addByCompetency","showDeleteQuestion","addedStyle","createdMode","openStyle","q","faMinusSquare","faPlusSquare","darkBackground","x","devItemCompetencyId","showWrench","competencySelected","competencyRequired","deleteQuestionsForCompetency","faTrash","questionKey","questionMap","questionsForCompetency","deleteQuestion","footnote","footnoteIcon","footnoteMsg","MobileCreateSurveyActionsBar","addCaption","faPlus","addClicked","addDisabled","unsetCreated","applyPendingChanges","createDisabled","halfWidth","headerText","addButton","noneAdded","createBtnContainer","createButton","CreateSurveySelected","AddToSurvey","showFootnote","toggleAddModal","NoSurveyItemsAdded","addedQuestions","darkbg","separator","requiredQuestion","CreateSurveyRequired","numericQuestions","requiredQuestions","textQuestion","textQuestions","requiredText","RequiredForSurvey","checkbox","CreateSurveyAddAccordian","allQuestions","questionSelected","checkboxOnClick","CreateSurveyAddModal","questionsToAdd","addQuestion","removeQuestion","addQuestionsForCompetency","infoMsg","finishMsg","added","followupSurveyAddByCompetency","addedQuestionsForCount","itemMin","followupSurveyMinimumQuestion","itemMax","followupSurveyMaximumQuestion","surveyCreated","selfSurveyStarted","showMaxErr","showReady","showCreated","showFinal","showAdd","addProjMsgStr","CreateSurveyMinMaxMsg","CreateSurveyMaxMsg","CreateSurveyMinMsg","CreateSurveyMsg","CreateSurveyMaxErrMsg","CreateSurveyReadyMsg","addQuestionAction","addQuestionsForCompetencyAction","deleteQuestionAction","deleteQuestionsForCompetencyAction","applyPendingChangesAction","unsetCreatedSurveyAction","showingAddModal","CreateSurveyAdded","DeleteRaterModal","raterEmail","disabledIcon","nameAndEmail","RaterTableRow","confirmDeleting","toggleConfirmDeleting","raterNameTxt","showNames","showRelationship","showLanguage","languageNameNative","inviteStatus","approvalElements","faPen","disableEditBtn","setRater","disableDeleteBtn","onConfirmDelete","submitBtn","disabledSaveIcon","saveIcon","trashIcon","errorInput","RaterEditableTableRow","formValues","emailFieldError","disableSubmitBtn","faSave","cancelSetRater","RaterEditableCard","RaterCard","deleting","toggleDeleting","headerWithData","errorRow","editableRow","emailOrName","edit","delete","cardInfoRow","radio","errorCard","editableCard","inviteDate","emailBounced","statusMsgKey","fallbackMsgColor","msgForApprovalStatus","potentialApprover","approverOption","setApprover","approvalLevel","levelCount","approvalCardElements","hideApproverColumn","approvalTableElements","RaterList","raterUnderEdit","markRaterForEdit","languagesById","raterLevelsById","raterUpdateFailedFor","desyncedRaterId","acceptableRaterLevelIds","applicableRequirements","maxRatersErrMsg","currentRequirement","reqName","updateRater","validateOnBlur","showRelationshipColumn","showLanguageColumn","highlightEmailInput","undeliveredEmails","disableSubmitEditBtn","approvalLevelId","approvalLevelCount","cancelRaterEdit","deleteRater","tableAlign","addFormContainer","inviteButtons","RaterTable","addRaterErrorMsg","setAddRaterErrorMsg","editRaterErrorMsg","setEditRaterErrorMsg","validationErrorMsg","hasValidationError","uninvitedRaters","bouncedRaters","approvalReady","approvalLevelName","approverCount","notApproved","needMoreRaters","showReqInvite","showInvite","showLevel","showSelApprover","showReqApproval","showApproval","showReqApprovalAdminSelected","approverIsAdminSelected","requiredInviteAlertMsg","uninvitedAlertMsg","levelAlertMsg","selAppoverMsg","requiredApprovalAlertMsg","adminSelectedApprovalAlertMsg","adminSelectedApproverName","approvalAlertMsg","showInviteSuccess","invitationsSent","showApproverSuccess","approverSent","showError","errorAddingRater","errorAddingPreviousRater","showPrompt","showBounced","msgIconColor","errorMsgTxt","promptAlertMsg","bouncedAlertMsg","toggleCustomizeApproverEmailModal","toggleCustomizeInviteModal","disableCustomizeEmailButton","disableCustomizeInviteButton","sendingForApproval","sendForApproval","sendingInvitations","updatingRater","sendInvitations","enableManualEntry","setEmail","enableDirectorySearch","enableAddPreviousRaters","addPreviousRaters","disableAddPreviousRatersButton","MobileRaterActionsBar","showPreviousRatersButton","onClickAddPreviousRatersButton","showDirectorySearchButton","onClickSearchDirectoryButton","disableSearchDirectoryButton","onClickSendRemindersButton","disableRemindRatersButton","customizeModalButtonLabel","sendMsgButtonLabel","disableInviteOrApproveButton","warning","LeaveInviteModal","unhandledRaters","RequirementMenuItem","isComplete","maxString","showMaximum","spacerSize","reqsContainer","RequirementBar","RaterApprovalOption","padded20Px","reqItem","RequirementMobileMenu","toggleOpen","faChevronUp","faChevronDown","usePrevious","prevRef","useOnSuccess","prevLoading","useRaterActions","addRaterByEmailAction","deleteRaterAction","setApproverAction","saveEditedRaterAction","updateRaterAction","breakLine","introBar","remindBtn","introMsg","inviteComment","setInviteComment","approverComment","setApproverComment","showingApproverEmailModal","toggleApproverEmailModal","showingInviteModal","toggleInviteModal","showingMobileRequirements","toggleMobileRequirements","underUpdate","setUnderUpdate","errorUpdatingRater","currentLanguage","inviteBody","approverEmailBody","raterArr","notInvited","rater1","rater2","approvers","SelectedByAdmin","approverSelectedAdminEmail","inviteRatersApproverEmail","approverEmail","approverAddresses","addressesToInvite","directorySearchEnabled","inviteRatersRaterSelectionOption","manualEntryEnabled","searchDirectory","nonAssociatedPreviousRaterIds","nonAssociatedPreviousRaters","addPreviousRaterErrors","showPreviousRatersBtn","inviteRatersAutoPopulateRaters","disableCustomizeEmailBtn","disableCustomizeInviteBtn","minReq","disableInviteBtn","disableApproveBtn","remindRaters","introTagMapping","selfSurveyPasskey","lastInviteRequestStamp","lastInviteRequest","logSlowInviteRequest","clearLoadingState","delta","abs","InviteRatersIntro","inviteRatersApproverName","inviteRatersApproverLevelId","clientImageUrl","when","currentLocation","nextLocation","onCancel","onConfirm","FeedbackReportTableRow","showShareScoresBtn","showDownloadReportBtn","setReport","onClickShareScoresBtn","reportTypeMessageKey","groupReportTitle","effectiveDate","FeedbackReportTableData","showShareScoresColumn","getLanguage","reportTemplateLanguageId","ReportCard","btnText","noReports","ReportCards","cards","ReportTable","enableReportDownload","right","left","listItem","selectedName","unselectedName","between","CompetencyList","competencyRows","isAdded","itm","deleteItem","addItem","ToggleSwitch","toggleFn","modalContent","confirmationTxt","secondaryBtn","primaryBtn","ConfirmationModal","onSelectSecondary","secondaryActionStr","onSelectPrimary","primaryActionStr","useSendEQScoresModalProps","setComment","recipientEmail","setRecipientEmail","currentReport","setCurrentReport","currentReleaseId","csContact","EQScoresEmailTxt","EQScores","setReportScores","setProjectCSContact","sendEQScoresEmailPreviewRoute","sendEQScoresModalVisible","showSendEQScoresModal","getEQScoresAction","dismissSendEQScoresModal","setEQScoresRecipientEmail","setEQScoresRecipientComment","onConfirmShareEQScores","sendEQScoresAction","TEXT_AREA_PLACEHOLDER","TEXT_AREA_DISABLED","TEXT_AREA_DEFAULT","TEXT_AREA","SendEQScoresModal","dismissModal","templatePreviewRoute","handleChangeRecipientEmail","handleChangeComment","handleConfirmShareEmailScores","modalCaptionMsg","emailPreviewCaptionMsg","reportContent","notFoundRow","notFound","loadingReport","toggleLoadingReport","iFrameFirstLoad","setIframeLoaded","oneReport","reportsNotQueried","oldCount","newCount","reportCount","portalIsTSEQ","isMEReport","surveyId","hasMEReport","enableSharingScores","hasOneReport","autoLoadReport","idToDelete","setIdToDelete","competenciesText","showCompetencies","developmentPlanAddCompetenciesFromWebReport","showList","toggleList","showDeleteConfirmation","toggleShowDeleteConfirmation","devPlanItem","hasContent","deleteConfirmationMsg","showHeader","reportWebUrl","onLoad","controls","ChangeLanguageModal","currentLang","setLanguage","agreementText","acceptRow","checkboxDiv","ConfidentialityAgreementModal","ConfidentialityMessageTitle","isAccepted","toggleAccepted","updateConfidentialityAction","ConfidentialityMessageAgreement","ConfidentialityMessageAcknowledgement","formInputs","loadingForm","radioBtn","inputGroup","orMsg","txtBox","saveBtn","cancelBtn","AddDevPlanItemModal","txtPlaceholder","selPlaceholder","allowAddByCompetency","developmentPlanAddCompetenciesFromDevPlan","allowAddManual","developmentPlanAddManual","txt","setTxt","setCompetency","setAddByCompetency","allowSubmit","onChangeTxt","onChangeSelect","onReset","EditDevPlanItemModal","lastIndexOf","isCompetency","updateDevPlanItemTitleAction","useUpdateFieldAnswerListModalProps","devFieldAnswerId","disableModal","initialData","arr","setArr","valueIndex","useArray","selectedItemIds","addItemId","removeItemId","isSelected","onClickListItemCheckbox","onClickConfirmAdd","saveFieldAnswerListAction","updateFieldAnswerListAction","itemTxt","DevActionListItem","DevActionListModal","filteredListItems","li","compilationCategoryId","handleClickConfirmAdd","renderItems","DevActionListField","devPlanFieldAnswerId","DevActionField","onChangeAnswer","disableTextArea","textAreaStyle","clickable","closed","calcLines","DevActionForm","dirty","setDirtyObj","setEditingObj","isEditing","prevMap","prevValue","calcUpdateFieldAnswerApiState","reset","setEditing","setDirty","dirtyFields","fieldId","newAnswer","forEach","dispatchFieldAnswerUpdates","CALENDARS","google","outlook","yahoo","AddToCalendarBtn","getElementsByTagName","click","startTime","selectedDate","endTime","add","toDate","noDate","valueOf","buttonLabel","useCompletionDate","setSelectedDate","onChangeDate","newDate","updateDevPlanActionCompleteByDateAction","useActionStatus","statusMsgs","actionStatuses","setSelected","colorForStatus","statuses","getStr","updateDevPlanActionStatusAction","headerIcon","addToCalBtn","addDate","collaboratorDate","CompletionCard","toggleStartOpen","faCalendar","dateFormat","minDate","mobileRoot","collaboratorStatusView","dropDownOptions","StatusCard","faThermometerHalf","wrapper","picker","MobileDatePicker","icons","hourGlass","cal","datePicker","statusSelect","MobileActionBtns","actionStatus","faHourglassEnd","FaceIcon","actionBtns","DevItemCommentView","updateComment","commentText","setCommentText","handleClickTextArea","handleClickCancelBtn","handleClickSaveBtn","handleChangeCommentText","userEmail","collabEmail","currentEmail","youCaption","fromCurrentUser","fromParticipant","response","commenterLabel","isFromCurrentUser","useDevCommenterLabel","readOnly","spellCheck","AddDevItemCommentForm","addComment","onCommentAdded","onClickAddBtn","onChangeComment","addCommentReqId","addingComment","isUnderEdit","canEditComment","sortedComments","editedComment","renderComments","actionForm","formHeader","iconBtn","actionCards","mobileActionBtns","DevActionView","actionNumber","deleteConfirmation","itemTitle","confirmDelete","toggleConfirmDelete","deleteDevPlanActionAction","collaborationEnabled","DevPlanDescText","toggleIsEditing","desc","setDesc","onUpdate","titleContainer","titleLink","resourcesLink","DevItemHeader","hasDevResources","showResourcesLink","ACTION_BTN","devResourceBtn","addBtn","MobileDevPlanItemActions","onClickToAdd","CollaboratorPageHeader","headerContainer","itemHeader","planDesc","actionsTitle","horizRule","addActionBtn","actionCard","itemAnimation","DevPlanItem","routeTemplate","planItem","stateActions","actionFields","currentCollaboratorEmail","collaboratorEmails","accepted","sendParticipantCommentNotificationAction","otherCollaboratorEmails","sendDevItemCommentNotificationAction","headerSubtitle","addDevItemCommentAction","updateDevItemCommentAction","commentsById","faReply","developmentPlanBusinessGoalsOn","horizMarginPx","vertMarginPx","addIcon","AddDevItemCard","ellipsizeAt","lines","itemDesc","itemDescPlaceholder","hasUnreadCommentsBtn","noUnreadCommentsBtn","viewDetailsBtn","DevItemCard","descPlaceholder","unreadDefault","viewDefault","actionColors","actionCount","number","itemLocation","THUMB_COLOR","CHECKED_BG_COLOR","UNCHECKED_BG_COLOR","TEXT_COLOR","hiddenInput","visibleInputContainer","visibleInput","onOffMsg","defaultGetTxt","isOn","Toggle","getTxt","disable","reminderTxt","reminderToggle","DevPlanRemindersCard","faBell","remindersEnabled","onChangeRemindersEnabled","VERT_MARGIN","selectPlaceholder","levelSelect","emailInput","commentsInput","EmailDevPlanForm","emailPlaceholder","commentPlaceholder","selection","setSelection","setComments","enableSubmit","setEnableSubmit","emailingRequired","enableEmail","setEnableEmail","onChangeSelection","onChangeEmail","onChangeComments","onClickSubmitBtn","onSent","validate","then","catch","submitBtnMsg","contentSideMargin","emailRequired","emailSent","emailForm","EmailDevPlanCard","lastEmailed","lastEmailRecipient","requiredLevelId","showSentMsg","sentMsg","MobileDevPlanActionBar","emailAndStatus","red","CollaboratorListItem","deleteCollaborator","acceptedMsg","notAcceptedMsg","statusColor","statusIcon","faBan","deletingCollaborator","CollaboratorsList","allCards","itemCards","sharingCol","instructions","DevPlanView","emailRemindersOn","setRemindersOn","raterMap","itemsToTrack","showItems","showEmail","setDevPlanCollaboratorAcceptedAction","sendDevPlan","onClickSendEmailBtn","sendEmailBtnMsg","participantCanAdd","DevPlanInstructions","projectComments","itemActions","itemRouteTemplate","renderDevItemCards","formRoot","addCollaborator","cancelAddCollaborator","dirtyOn","setDirtyOn","dispatchNewValue","API_ACTIONS","loadPlanInfo","hasRaters","getRemindersOnAction","getDevActionListItemsAction","DevPlanRouter","loadPlanDetails","searchDirectoryFormValidation","searchTerm","SearchDirectoryForm","setSearchTerm","raterInfo","dropdownContainer","addBtnContainer","RaterSearchTableRow","setLevelId","setAddedRater","infoAndButton","RaterSearchCard","PaginatedScroll","renderedItems","slice","pageSize","currentPage","loadButtonContainer","RaterSearchResultList","loadMoreBtnText","lastPage","searchResults","resultsPageSize","mapResultsToRows","result","mapResultsToCards","onClickLoadBtn","loadMoreResults","lastLoadedResultsPage","userMsg","RaterSearchTable","raterNameOrEmail","lastAddedRater","showSuccessMsg","showAddErrorMsg","showSearchErrorMsg","showNoResultsMsg","maxedOutRequirement","subtitleRow","bottomBtnRow","RaterDirectorySearch","addedRater","setLastAddedRater","toggleSuccessMsg","toggleNoResultsMsg","toggleAddErrorMsg","toggleSearchErrorMsg","initialValue","useTimedState","maxedOutReq","setMaxedOutReqMsg","directoryRaters","addedRaterRequirement","searchActionTag","searchingDirectory","searchError","addActionTag","results","directoryRatersAction","hasRater","Resource","bodyText","lcText","idx","updatedText","ProjectStatusPoller","refreshMs","refreshSeconds","doRefresh","loadCurrentStatusAction","useRemindRaters","autoRemindersOn","autoReminders","sendingReminders","addressesToRemind","useToggleOnComplete","remindersSent","toggleRemindersSent","sendReminders","sendRemindersAction","modalText","warningMsg","additionalNoteText","RemindRatersModal","primaryMsgStr","availabilityMessage","eBookUrl","useUrl","getEBookUrlAction","loadProjectInfo","projectLanguagesAction","ProjectRouter","PROJECT","loadProjects","completeResponses","confidentialRequired","CollaboratorRoute","isCollaborator","CollaboratorDevPlanRouter","loadProject","loadData","notFoundMsg","FileData","useParams","fileType","setUrl","setError","apiUrl","requestData","folder","http","XMLHttpRequest","setRequestHeader","send","responseType","onload","decoded","atob","len","bytes","Uint8Array","charCodeAt","blob","Blob","URL","createObjectURL","getFileData","AppRouter","devMiddleware","__REDUX_DEVTOOLS_EXTENSION__","logger","initialAppState","enhancers","compose","applyMiddleware","apiMiddleware","store","createStore","StrictMode","basename","serviceWorker","ready","registration","unregister"],"mappings":"+GAAAA,EAAOC,QAAU,k+Z,oBCAjBD,EAAOC,QAAU,IAA0B,sC,oBCA3CD,EAAOC,QAAU,IAA0B,iD,oBCA3CD,EAAOC,QAAU,IAA0B,qC,kBCA3CD,EAAOC,QAAU,suI,oBCAjBD,EAAOC,QAAU,IAA0B,2C,oBCA3CD,EAAOC,QAAU,IAA0B,kC,oBCA3CD,EAAOC,QAAU,IAA0B,6C,oBCA3CD,EAAOC,QAAU,IAA0B,4C,oBCA3CD,EAAOC,QAAU,IAA0B,mC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,84CCG3CC,EAAQ,KACRA,EAAQ,M,2KCJIC,E,4EAAAA,K,UAAAA,E,WAAAA,M,KCuUL,ICjUKC,EDiUCC,EAAmB,SAC9BC,EACAC,GAEA,IAAMC,EAAYF,EAAKG,IAAMN,EAAcO,IAAMP,EAAcQ,IAE/D,MAAQ,CAENC,QAAS,GACTC,MAAS,GACTC,aAAc,IAAIC,KAClBC,sBAAsB,EACtBC,kBAAkB,EAClBC,cAAc,EACdC,eAAgB,EAGhBC,kBAAcC,EACdC,YAAcD,EAGdE,OAAQ,CACNC,gBAAiB,GACjBlB,KAAiBA,EACjBmB,cAAiBjB,EACjBkB,aAAiB,IAEnBC,aAAmB,GAGnBC,cAAerB,EAGfsB,iBAA6B,GAC7BC,kBAA6B,GAC7BC,SAA6B,GAC7BC,qBAA6B,GAC7BC,uBAA6B,GAC7BC,4BAA6B,GAC7BC,uBAA6B,GAG7BC,yBAA0B,EAC1BC,yBAA0B,EAG1BC,KAAM,GAGNC,uBAAuB,I,mBClXfnC,K,sCAAAA,E,0CAAAA,E,gDAAAA,E,wCAAAA,E,kDAAAA,E,kDAAAA,E,gDAAAA,E,kDAAAA,E,4CAAAA,E,kCAAAA,E,kDAAAA,E,oDAAAA,E,8CAAAA,E,kDAAAA,E,oDAAAA,E,8CAAAA,E,wDAAAA,E,0DAAAA,E,oDAAAA,E,0CAAAA,E,4CAAAA,E,sCAAAA,E,kDAAAA,E,oDAAAA,E,8CAAAA,E,sCAAAA,E,wCAAAA,E,kCAAAA,E,4DAAAA,E,8DAAAA,E,wDAAAA,E,4BAAAA,E,8BAAAA,E,wBAAAA,E,gBAAAA,E,kDAAAA,E,oDAAAA,E,8CAAAA,E,gCAAAA,E,kCAAAA,E,4BAAAA,E,0DAAAA,E,4DAAAA,E,sDAAAA,E,kDAAAA,E,oDAAAA,E,8CAAAA,E,0EAAAA,E,4EAAAA,E,sEAAAA,E,wFAAAA,E,0FAAAA,E,oFAAAA,E,4FAAAA,E,8FAAAA,E,wFAAAA,E,wCAAAA,E,0CAAAA,E,oCAAAA,E,sEAAAA,E,wEAAAA,E,kEAAAA,E,gEAAAA,E,kEAAAA,E,4DAAAA,E,oCAAAA,E,sCAAAA,E,gCAAAA,E,gCAAAA,E,kCAAAA,E,4BAAAA,E,4BAAAA,E,8BAAAA,E,wBAAAA,E,4CAAAA,E,8CAAAA,E,wCAAAA,E,oBAAAA,E,4CAAAA,E,8CAAAA,E,wCAAAA,E,0CAAAA,E,4CAAAA,E,sCAAAA,E,sDAAAA,E,wDAAAA,E,kDAAAA,E,oDAAAA,E,sDAAAA,E,gDAAAA,E,wEAAAA,E,0EAAAA,E,oEAAAA,E,0DAAAA,E,4DAAAA,E,sDAAAA,E,4DAAAA,E,8DAAAA,E,wDAAAA,E,kDAAAA,E,oDAAAA,E,8CAAAA,E,wDAAAA,E,0DAAAA,E,oDAAAA,E,wCAAAA,E,0CAAAA,E,oCAAAA,E,0CAAAA,E,4CAAAA,E,sCAAAA,E,gDAAAA,E,kDAAAA,E,4CAAAA,E,0CAAAA,E,4CAAAA,E,sCAAAA,E,oDAAAA,E,sDAAAA,E,gDAAAA,E,8CAAAA,E,gDAAAA,E,0CAAAA,E,oDAAAA,E,sDAAAA,E,gDAAAA,E,gDAAAA,E,kDAAAA,E,4CAAAA,E,kDAAAA,E,oDAAAA,E,8CAAAA,E,sDAAAA,E,wDAAAA,E,kDAAAA,E,0DAAAA,E,4DAAAA,E,sDAAAA,E,gDAAAA,E,kDAAAA,E,4CAAAA,E,4CAAAA,E,8CAAAA,E,wCAAAA,E,wCAAAA,E,0CAAAA,E,oCAAAA,E,wCAAAA,E,0CAAAA,E,oCAAAA,E,kCAAAA,E,wCAAAA,E,0CAAAA,E,oCAAAA,E,wCAAAA,E,0CAAAA,E,oCAAAA,E,gDAAAA,E,kDAAAA,E,4CAAAA,E,oEAAAA,E,sEAAAA,E,gEAAAA,E,wDAAAA,E,0DAAAA,E,oDAAAA,E,oDAAAA,E,sDAAAA,E,gDAAAA,E,0DAAAA,E,4DAAAA,E,sDAAAA,E,0CAAAA,E,4CAAAA,E,sCAAAA,E,0CAAAA,E,4CAAAA,E,sCAAAA,E,oEAAAA,E,sEAAAA,E,gEAAAA,E,oEAAAA,E,sEAAAA,E,gEAAAA,E,0DAAAA,E,4DAAAA,E,sDAAAA,E,wCAAAA,E,0CAAAA,E,oCAAAA,E,oEAAAA,E,sEAAAA,E,gEAAAA,E,8CAAAA,E,gDAAAA,E,0CAAAA,E,0EAAAA,E,4EAAAA,E,sEAAAA,E,wEAAAA,E,0EAAAA,E,oEAAAA,E,wDAAAA,E,0DAAAA,E,oDAAAA,E,sDAAAA,E,wDAAAA,E,kDAAAA,E,gDAAAA,E,kDAAAA,E,4CAAAA,E,oDAAAA,E,sDAAAA,E,gDAAAA,E,sEAAAA,E,wEAAAA,E,kEAAAA,E,8CAAAA,E,gDAAAA,E,0CAAAA,E,kDAAAA,E,oDAAAA,E,8CAAAA,E,oDAAAA,E,sDAAAA,E,gDAAAA,E,wDAAAA,E,0DAAAA,E,oDAAAA,E,0EAAAA,E,4EAAAA,E,sEAAAA,E,8DAAAA,E,gEAAAA,E,0DAAAA,E,oFAAAA,E,sFAAAA,E,gFAAAA,E,oEAAAA,E,sEAAAA,E,gEAAAA,E,kEAAAA,E,oEAAAA,E,8DAAAA,E,4CAAAA,E,8CAAAA,E,wCAAAA,E,8CAAAA,E,gDAAAA,E,0CAAAA,E,8CAAAA,E,gDAAAA,E,0CAAAA,E,wCAAAA,E,0CAAAA,E,oCAAAA,E,wCAAAA,E,gDAAAA,E,4DAAAA,E,8DAAAA,E,wDAAAA,E,4DAAAA,E,8DAAAA,E,wDAAAA,E,0CAAAA,E,kEAAAA,E,oEAAAA,E,8DAAAA,E,gEAAAA,E,kEAAAA,E,4DAAAA,E,8DAAAA,E,gEAAAA,E,0DAAAA,E,4EAAAA,E,8EAAAA,E,wEAAAA,E,8EAAAA,E,gFAAAA,E,0EAAAA,E,oEAAAA,E,sEAAAA,E,gEAAAA,E,sDAAAA,E,wDAAAA,E,kDAAAA,E,oDAAAA,E,sDAAAA,E,gDAAAA,E,8EAAAA,E,gFAAAA,E,0EAAAA,E,sFAAAA,E,wFAAAA,E,kFAAAA,E,0DAAAA,E,4DAAAA,E,sDAAAA,E,8DAAAA,E,gEAAAA,E,0DAAAA,E,0DAAAA,E,4DAAAA,E,sDAAAA,E,0CAAAA,E,4CAAAA,E,sCAAAA,E,4CAAAA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,E,iCAAAA,E,2CAAAA,E,+BAAAA,E,qBAAAA,E,+BAAAA,E,+BAAAA,E,+BAAAA,E,mCAAAA,E,uCAAAA,E,yCAAAA,E,+BAAAA,E,6BAAAA,E,iDAAAA,E,mCAAAA,E,+BAAAA,E,yBAAAA,E,6BAAAA,E,+BAAAA,E,wDAAAA,E,sDAAAA,E,0DAAAA,E,6CAAAA,E,qCAAAA,E,6BAAAA,E,kDAAAA,E,uCAAAA,E,+BAAAA,E,iCAAAA,E,qBAAAA,E,+CAAAA,E,mDAAAA,E,2CAAAA,E,+BAAAA,E,6BAAAA,E,+BAAAA,E,mDAAAA,E,+BAAAA,E,mCAAAA,E,mCAAAA,E,+BAAAA,E,+CAAAA,E,mCAAAA,E,+CAAAA,E,yBAAAA,E,mCAAAA,E,iCAAAA,E,mCAAAA,E,2BAAAA,E,qCAAAA,E,iCAAAA,E,iCAAAA,E,6BAAAA,E,2BAAAA,E,2BAAAA,E,qBAAAA,E,uBAAAA,E,yBAAAA,E,mDAAAA,E,wDAAAA,E,eAAAA,E,6BAAAA,E,mBAAAA,E,iCAAAA,E,6BAAAA,E,yCAAAA,E,iCAAAA,E,4DAAAA,E,eAAAA,E,mCAAAA,E,+BAAAA,E,+BAAAA,E,2CAAAA,E,iBAAAA,E,eAAAA,E,uBAAAA,E,2CAAAA,E,eAAAA,E,2BAAAA,E,6DAAAA,E,mDAAAA,E,qBAAAA,E,uCAAAA,E,+BAAAA,E,yBAAAA,E,qCAAAA,E,yBAAAA,E,2BAAAA,E,6BAAAA,E,qCAAAA,E,iCAAAA,E,iDAAAA,E,mCAAAA,E,6CAAAA,E,mCAAAA,E,qCAAAA,E,uBAAAA,E,mCAAAA,E,uCAAAA,E,yBAAAA,E,2CAAAA,E,qDAAAA,E,6BAAAA,E,2CAAAA,E,qBAAAA,E,uBAAAA,E,qCAAAA,E,uCAAAA,E,mBAAAA,E,uBAAAA,E,yCAAAA,E,+CAAAA,E,uCAAAA,E,2CAAAA,E,uBAAAA,E,6BAAAA,E,+BAAAA,E,mBAAAA,E,6BAAAA,E,mCAAAA,E,yCAAAA,E,2BAAAA,E,iCAAAA,E,iDAAAA,E,uCAAAA,E,uBAAAA,E,uBAAAA,E,6BAAAA,E,yBAAAA,E,qCAAAA,E,uCAAAA,E,iDAAAA,E,uCAAAA,E,yCAAAA,E,6CAA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","file":"static/js/main.3a5e7d85.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAABsCAYAAAAbiWtTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF82lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuN2E3YTIzNiwgMjAyMS8wOC8xMi0wMDoyNToyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NDRiMjZlZDgtYTk4Yi00NTQ2LTkwMDUtM2I0MGY2YTdmNGNjIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjJFN0U1M0M3MTI5QTExRThBQjMzQUVDNUVEQkE3Qjc0IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmU1ZTE0ODQ1LTM4OGMtYWE0Yy1hMTE2LTA0OWJjNGQ0ZGFkNyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIiB4bXA6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\"","module.exports = __webpack_public_path__ + \"static/media/logo_tbc.85c7ea01.svg\";","module.exports = __webpack_public_path__ + \"static/media/triangle-down-white.9d57ab1a.svg\";","module.exports = __webpack_public_path__ + \"static/media/logo_zf.9b726140.svg\";","module.exports = \"data:image/gif;base64,R0lGODlh2gBsAOYAAOHi43F1euXm5mxxdbjUoLCytYGFiWNobZKVmbq8vnh9gZrCd8bcssHarKmrro6Slba4u93e366ws+np6oiMkLu+wH6Chp2hpKKlqPr6+qfKiLS2ufj4+c7Q0ZWYnPLy8426Zv7+/qapq2luc/b399XW2HuAhMDCxNTV1nR5fb2/wZqdoMbIynqvTff69HSrRdfY2aHHgb7YqO7u79PU1qWnqs/R0uz05YSIjKCjppibntna3IeLjrK0tsrMzsjKzKzNkNHT1MzNz+fo6MXHyKutsPDw8Nrc3Xd7f7LQl/T09ZW/cc3P0YO0Wa/PlGJnbP39/dPkxJyfouvs7PX19mZrb/z8/OLj5MLExt/g4fP09N7f4Pn6+vv7/MTFx5CUl+bn6IyQlOvr7OPk5e/v8P3+/dna229zePHy8oaJjezs7e3u7vr8+KzNj+Ds1X6xUnywT3atSPL37dnozd/s1bzWpcfJy9DjwNLkw9Xmx/Hx8rDPlYuPknKqQmFma////yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNEQ0ZENDlD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\"","module.exports = __webpack_public_path__ + \"static/media/triangle-down.058b8503.svg\";","module.exports = __webpack_public_path__ + \"static/media/logo.85c7ea01.svg\";","module.exports = __webpack_public_path__ + \"static/media/goal_flag_green.c2a48936.svg\";","module.exports = __webpack_public_path__ + \"static/media/goal_flag_blue.2418fc10.svg\";","module.exports = __webpack_public_path__ + \"static/media/chart.ffede630.svg\";","module.exports = __webpack_public_path__ + \"static/media/processing.5854f5a6.svg\";","'use strict';\n\nrequire('core-js/stable');\nrequire('regenerator-runtime/runtime');\nrequire('whatwg-fetch');\n","export enum TextDirection {\n RTL = 'rtl',\n LTR = 'ltr',\n}\n","import { ApiLoading } from '../api/apiLoading';\nimport { ApiError } from '../api/apiError';\nimport { AuthState } from '../../auth/authState';\nimport { Config } from '../../featureFlags/config';\nimport { FeatureFlags } from '../../featureFlags/featureFlags';\nimport { Language, Message } from '../../localization/models';\nimport { LocaleState } from '../../localization/localeState';\nimport { TextDirection } from '../../localization/textDirection';\nimport { ParticipantProject, Requirement, Project, ProjectCSContact } from '../../project/models';\nimport { CustomResource, DevResource } from '../../project/resources/models';\nimport { Map } from '../../language/models';\nimport { Rater, RaterLevel, DirectoryRater, PreviousRater, EmailBody } from '../../project/survey/raters/models';\nimport { GoalAnswer } from '../../project/setGoals/models';\nimport { DevPlanItem, DevPlanAction, DevPlanFieldAndAnswer, StatusKey } from '../../project/devPlan/models';\nimport { Report, EQScores } from '../../project/viewReport/models';\nimport { RaterApprovalParticipant, RaterApprovalRater } from '../../raterApproval/models';\nimport {\n ReportRecipientProject,\n ReportRecipientParticipant,\n ReportRecipientReport,\n} from '../../reportRecipient/models';\nimport { FeedbackSurveyQuestion, CompetencyAndQuestion } from '../../project/createSurvey/models';\nimport { PortalType } from '../../navigation/portalType';\nimport { DevPlanCollaborator, DevItemComment } from '../../project/devPlan/collaboration/models';\nimport { CollaboratorAuthInfo } from '../../project/devPlan/collaboration/currentCollaboratorState';\nimport { DevPlanFieldListItem } from '../../project/devPlan/listItems/models';\n\n\n/**\n * Type definition for the global app state\n */\nexport interface AppState {\n // API State\n // -------------------------------------------------------------------------------------------------------------------\n readonly loading: Map;\n readonly error: Map;\n readonly lastActivity: Date;\n readonly sessionStorageLoaded: boolean;\n readonly showTimeoutModal: boolean;\n readonly showTimedOut: boolean;\n readonly timedOutHandle: number;\n\n // Configuration\n // -------------------------------------------------------------------------------------------------------------------\n readonly featureFlags: FeatureFlags | undefined;\n readonly config: Config | undefined;\n\n // App Localization\n // -------------------------------------------------------------------------------------------------------------------\n readonly locale: LocaleState;\n readonly allLanguages: Language[];\n\n // Auth\n // -------------------------------------------------------------------------------------------------------------------\n readonly auth: AuthState;\n readonly portalType?: PortalType;\n\n // Menu\n // -------------------------------------------------------------------------------------------------------------------\n openSideMenu: boolean;\n\n // Project\n // -------------------------------------------------------------------------------------------------------------------\n readonly displayIdMapping: Map;\n readonly projects?: Project[];\n readonly projectSummary?: ParticipantProject;\n readonly participantRequirements?: Requirement[];\n readonly projectResources?: CustomResource[];\n readonly reports?: Report[];\n readonly devResources?: DevResource[];\n readonly reportData?: Uint8Array;\n readonly eBookUrl?: string;\n readonly reassessmentSurveyUrl?: string;\n\n /**\n * Contact details (first name, last name, email) for project-designated customer support personnel\n *\n * Mapping: Project ID -> Contact Info Obj\n */\n readonly projectCSContacts: Map;\n\n /**\n * EQ scores from TalentSmart feedback reports\n *\n * Mapping: Release ID -> Scoresheet\n */\n readonly eqScores: Map;\n\n /**\n * EQ scores email templates are retrieved for preview in the `SendEQScoresModal`.\n * Here they're mapped to their respective (stringified) language Id.\n *\n * E.g. { '2': { html: ..., plainText: ..., extraTextToken: `'<@ExtraText>'` } }\n */\n readonly eqScoresEmailTemplates: Map;\n\n // Project Localization\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * Translations/messages specific to a project\n * {languageId: {key: value}}\n */\n readonly projectMsgs?: Map>;\n\n /**\n * Allows lookup of the supported languages for a project\n *\n * E.g. { '12345': { ... englishName: 'Spanish', nativeName: 'Español', ... } }\n */\n readonly projectLanguages?: { readonly [projectId: string]: Language[]; };\n\n // Create Survey\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * Collection of feedback survey questions\n */\n selectedQuestions?: Map;\n\n /**\n * collection of competencies and questions\n */\n competenciesAndQuestions?: Map;\n\n\n // Dev Plan\n // -------------------------------------------------------------------------------------------------------------------\n readonly devPlan?: {\n emailRemindersOn?: boolean;\n\n /**\n * The email address of the last person to which we sent:\n *\n * * a dev plan, if collaboration for the dev plan is disabled\n * * an invitation to collaborate, if collaboration for the dev plan is enabled\n */\n lastEmailRecipient?: string;\n\n items?: DevPlanItem[];\n\n /**\n * List of status names & IDs for dev plan item actions\n */\n actionStatuses?: StatusKey[];\n\n /**\n * Dev plan item ID -> the actions associated with that item\n */\n actionsByItemId?: Map;\n\n /**\n * Dev plans have actions which in turn have questions the user must answer. These are those question/answer pairs.\n * Mapping: Dev plan item ID -> Action ID -> Field/Answer\n */\n fieldsAnswers?: Map>\n\n /**\n * Dev actions have at most one competency item which is answered by selecting from a list of preexisting options,\n * rather than free-form text\n *\n * Mapping: Language ID -> List Item ID -> Field List Item\n */\n listItems?: Map>;\n\n /**\n * True if dev plan page has been visited\n */\n viewed?: boolean;\n\n // Dev Plan Collaboration\n // -----------------------------------------------------------------------------------------------------------------\n\n /**\n * Information about the current collaborator. These are users who have been invited to interact with a\n * participant's dev plan, but don't necessary have the same access privileges as participants themselves.\n *\n * Note that there is no scenario in which this object and `auth.currentUser` should both be defined.\n */\n currentCollaborator?: CollaboratorAuthInfo;\n\n /**\n * Users who have been granted access to a project's dev plan (e.g., to comment on dev plan items)\n * Mapping: Project ID -> Collaborator\n */\n collaborators?: Map;\n\n /**\n * Comments left on dev items by collaborators\n * Mapping: Project ID -> Dev Item ID -> Comment\n */\n comments?: Map>;\n };\n\n // Raters\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * Invite email templates are retrieved for preview in the `CustomizeEmailModal`.\n * Here they're mapped to their respective project Id, then language Id (both stringified).\n *\n * E.g. { '111': { '2': { html: ..., plainText: ..., extraTextToken: `'<@ExtraText>'` } } }\n */\n readonly inviteEmailTemplates: Map>;\n\n /**\n * Approver email templates are retrieved for preview in the `CustomizeEmailModal`.\n * Here they're mapped to their respective project Id, then language Id (both stringified).\n *\n * E.g. { '111': { '2': { html: ..., plainText: ..., extraTextToken: `'<@ExtraText>'` } } }\n */\n readonly approverEmailTemplates: Map>;\n\n /**\n * Rater approval email templates are retrieved for preview in the `CustomizeEmailModal`.\n * Here they're mapped to their respective project Id, then language Id (both stringified).\n *\n * E.g. { '111': { '2': { html: ..., plainText: ..., extraTextToken: `'<@ExtraText>'` } } }\n */\n readonly raterApprovalEmailTemplates: Map>;\n\n /**\n * A collection of project participant raters mapped by project, then by individual rater Id.\n *\n * E.g. { '111': { '222': { ...Rater info... } } } represents rater 22, who has been invited to rate the user in\n * project 111\n **/\n readonly projectRaters?: Map>;\n\n /**\n * Collection of raters associated with previous projects, mapped by project Id, then by person Id.\n */\n readonly previousRaters?: Map>;\n\n /**\n * A collection of raters for a given project, returned by keyword search\n *\n * Mapped by project Id, then by search term\n */\n readonly directoryRaters?: Map>;\n\n /**\n * A collection of the rater levels associated with a given project (mapped by project Id)\n */\n readonly projectRaterLevels?: Map;\n\n /**\n * Timestamp for the last attempt to send rater invitations; introduced as part of a debugging effort to troubleshoot\n * a hanging request issue.\n *\n * TODO - remove this once the hanging request issue is resolved\n */\n readonly lastInviteRequest?: Date;\n\n // Rater Approval\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * Collection of participants whose raters the current user is assigned to approve\n */\n readonly raterApprovalParticipants?: RaterApprovalParticipant[];\n\n /**\n * Collection of raters the current user is assigned to approve\n *\n * Mapped by participant Id, then project Id\n */\n readonly raterApprovalRaters?: Map>;\n\n /**\n * A collection of email addresses returned as undeliverable by the SendGrid API\n */\n readonly undeliveredEmails?: string[];\n\n\n // Goals\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * A collection of goals and answers mapped by project, then by goal question id.\n *\n * E.g. { '111': { '222': { ...GoalAnswer info... } } } represents goal with question id 222\n * for project 111\n **/\n readonly goalsAnswers?: Map>;\n\n // Report Recipient\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * Report recipient date range\n **/\n readonly reportRecipientDateRange: number;\n /**\n * Collection of projects with reports the recipient is assigned to receive\n **/\n readonly reportRecipientProjects?: ReportRecipientProject[];\n /**\n * Collection of participants with reports the recipient is assigned to receive\n **/\n readonly reportRecipientParticipants?: ReportRecipientParticipant[];\n /**\n * Collection of reports the the recipient is assigned to receive\n **/\n readonly reportRecipientReports?: ReportRecipientReport[];\n /**\n * Report recipient last reports only\n **/\n readonly reportRecipientLastOnly: boolean;\n /**\n * Collection of selected projects\n **/\n readonly reportRecipientSelectedProjects?: Map;\n /**\n * Collection of selected participants\n **/\n readonly reportRecipientSelectedParticipants?: Map;\n /**\n * True if we show a message on the login page\n **/\n readonly showLoginAnnouncement: boolean;\n}\n\n\n/**\n * Startup state for the app without e.g. user input\n */\nexport const makeInitialState = (\n lang: Language,\n onMobile: boolean,\n): AppState => {\n const direction = lang.rtl ? TextDirection.RTL : TextDirection.LTR;\n\n return ({\n // API State\n loading: {},\n error: {},\n lastActivity: new Date(),\n sessionStorageLoaded: false,\n showTimeoutModal: false,\n showTimedOut: false,\n timedOutHandle: 0,\n\n // Configuration\n featureFlags: undefined,\n config: undefined,\n\n // I18n\n locale: {\n portalLanguages: {},\n lang: lang,\n textDirection: direction,\n translations: {},\n },\n allLanguages: [],\n\n // Side Menu\n openSideMenu: !onMobile,\n\n // Projects\n displayIdMapping: {},\n projectCSContacts: {},\n eqScores: {},\n inviteEmailTemplates: {},\n approverEmailTemplates: {},\n raterApprovalEmailTemplates: {},\n eqScoresEmailTemplates: {},\n\n // Report Recipient\n reportRecipientDateRange: 3,\n reportRecipientLastOnly: true,\n\n // Auth\n auth: {},\n\n // Show Login Announcement\n showLoginAnnouncement: false,\n });\n};\n","/**\n * List of all of the Redux actions in the app.\n * Technically, the `= 'SomeStringFoo'` part is unnecessary, but if you leave it off, you're left looking at integers\n * in the dev tools.\n * E.g. `Action dispatched: {type: 14, customerId: 75849375934}` -- not so helpful... but it is smaller for prod builds.\n */\nexport enum ActionType {\n // Misc\n // -------------------------------------------------------------------------------------------------------------------\n UpdateStateAction = 'UpdateStateAction',\n SetPortalTypeAction = 'SetPortalTypeAction',\n ShowTimeoutModalAction = 'ShowTimeoutModalAction',\n ShowTimedOutAction = 'ShowTimedOutAction',\n SetTimedOutHandleAction = 'SetTimedOutHandleAction',\n\n ClearLoadingStateAction = 'ClearLoadingStateAction',\n\n // Localization\n // -------------------------------------------------------------------------------------------------------------------\n PortalLanguagesRequest = 'PortalLanguagesRequest',\n PortalLanguagesResponse = 'PortalLanguagesResponse',\n PortalLanguagesError = 'PortalLanguagesError',\n\n SetLocaleAction = 'SetLocaleAction',\n LoadTranslationsRequest = 'LoadTranslationsRequest',\n LoadTranslationsResponse = 'LoadTranslationsResponse',\n LoadTranslationsError = 'LoadTranslationsError',\n\n ProjectLanguagesRequest = 'ProjectLanguagesRequest',\n ProjectLanguagesResponse = 'ProjectLanguagesResponse',\n ProjectLanguagesError = 'ProjectLanguagesError',\n\n ProjectTranslationsRequest = 'ProjectTranslationsRequest',\n ProjectTranslationsResponse = 'ProjectTranslationsResponse',\n ProjectTranslationsError = 'ProjectTranslationsError',\n\n AllLanguagesRequest = 'AllLanguagesRequest',\n AllLanguagesResponse = 'AllLanguagesResponse',\n AllLanguagesError = 'AllLanguagesError',\n\n // Feature Flags and Configuration\n // -------------------------------------------------------------------------------------------------------------------\n LoadFeatureFlagsRequest = 'LoadFeatureFlagsRequest',\n LoadFeatureFlagsResponse = 'LoadFeatureFlagsResponse',\n LoadFeatureFlagsError = 'LoadFeatureFlagsError',\n\n LoadConfigRequest = 'LoadConfigRequest',\n LoadConfigResponse = 'LoadConfigResponse',\n LoadConfigError = 'LoadConfigError',\n\n ShowLoginAnnouncementRequest = 'ShowLoginAnnouncementRequest',\n ShowLoginAnnouncementResponse = 'ShowLoginAnnouncementResponse',\n ShowLoginAnnouncementError = 'ShowLoginAnnouncementError',\n\n // Login/Authentication\n // -------------------------------------------------------------------------------------------------------------------\n LoginRequest = 'LoginRequest',\n LoginResponse = 'LoginResponse',\n LoginError = 'LoginError',\n LogOut = 'LogOut',\n\n LoginTalentSmartRequest = 'LoginTalentSmartRequest',\n LoginTalentSmartResponse = 'LoginTalentSmartResponse',\n LoginTalentSmartError = 'LoginTalentSmartError',\n\n LoginBXRequest = 'LoginBXRequest',\n LoginBXResponse = 'LoginBXResponse',\n LoginBXError = 'LoginBXError',\n\n SecurityQuestionKeysRequest = 'SecurityQuestionKeysRequest',\n SecurityQuestionKeysResponse = 'SecurityQuestionKeysResponse',\n SecurityQuestionKeysError = 'SecurityQuestionKeysError',\n\n SecurityQuestionRequest = 'SecurityQuestionRequest',\n SecurityQuestionResponse = 'SecurityQuestionResponse',\n SecurityQuestionError = 'SecurityQuestionError',\n\n SendPortalPasswordResetEmailRequest = 'SendPortalPasswordResetEmailRequest',\n SendPortalPasswordResetEmailResponse = 'SendPortalPasswordResetEmailResponse',\n SendPortalPasswordResetEmailError = 'SendPortalPasswordResetEmailError',\n\n SendRaterApprovalPasswordResetEmailRequest = 'SendRaterApprovalPasswordResetEmailRequest',\n SendRaterApprovalPasswordResetEmailResponse = 'SendRaterApprovalPasswordResetEmailResponse',\n SendRaterApprovalPasswordResetEmailError = 'SendRaterApprovalPasswordResetEmailError',\n\n SendReportRecipientPasswordResetEmailRequest = 'SendReportRecipientPasswordResetEmailRequest',\n SendReportRecipientPasswordResetEmailResponse = 'SendReportRecipientPasswordResetEmailResponse',\n SendReportRecipientPasswordResetEmailError = 'SendReportRecipientPasswordResetEmailError',\n\n NewPasswordRequest = 'NewPasswordRequest',\n NewPasswordResponse = 'NewPasswordResponse',\n NewPasswordError = 'NewPasswordError',\n\n PasswordRequirementMessageRequest = 'PasswordRequirementMessageRequest',\n PasswordRequirementMessageResponse = 'PasswordRequirementMessageResponse',\n PasswordRequirementMessageError = 'PasswordRequirementMessageError',\n\n CreateSecurityChallengeRequest = 'CreateSecurityChallengeRequest',\n CreateSecurityChallengeResponse = 'CreateSecurityChallengeResponse',\n CreateSecurityChallengeError = 'CreateSecurityChallengeError',\n\n YmcaLoginRequest = 'YmcaLoginRequest',\n YmcaLoginResponse = 'YmcaLoginResponse',\n YmcaLoginError = 'YmcaLoginError',\n YmcaSsoRequest = 'YmcaSsoRequest',\n YmcaSsoResponse = 'YmcaSsoResponse',\n YmcaSsoError = 'YmcaSsoError',\n\n IsSsoRequest = 'IsSsoRequest',\n IsSsoResponse = 'IsSsoResponse',\n IsSsoError = 'IsSsoError',\n SamlAssertionRequest = 'SamlAssertionRequest',\n SamlAssertionResponse = 'SamlAssertionResponse',\n SamlAssertionError = 'SamlAssertionError',\n\n // Project\n // -------------------------------------------------------------------------------------------------------------------\n OpenMenu = 'OpenMenu',\n\n LoadProjectIdRequest = 'LoadProjectIdRequest',\n LoadProjectIdResponse = 'LoadProjectIdResponse',\n LoadProjectIdError = 'LoadProjectIdError',\n\n LoadProjectsRequest = 'LoadProjectsRequest',\n LoadProjectsResponse = 'LoadProjectsResponse',\n LoadProjectsError = 'LoadProjectsError',\n\n LoadProjectSummaryRequest = 'LoadProjectSummaryRequest',\n LoadProjectSummaryResponse = 'LoadProjectSummaryResponse',\n LoadProjectSummaryError = 'LoadProjectSummaryError',\n\n LoadCurrentStatusRequest = 'LoadCurrentStatusRequest',\n LoadCurrentStatusResponse = 'LoadCurrentStatusResponse',\n LoadCurrentStatusError = 'LoadCurrentStatusError',\n\n LoadParticipantRequirementsRequest = 'LoadParticipantRequirementsRequest',\n LoadParticipantRequirementsResponse = 'LoadParticipantRequirementsResponse',\n LoadParticipantRequirementsError = 'LoadParticipantRequirementsError',\n\n LoadProjectResourcesRequest = 'LoadProjectResourcesRequest',\n LoadProjectResourcesResponse = 'LoadProjectResourcesResponse',\n LoadProjectResourcesError = 'LoadProjectResourcesError',\n\n UpdateConfidentialityRequest = 'UpdateConfidentialityRequest',\n UpdateConfidentialityResponse = 'UpdateConfidentialityResponse',\n UpdateConfidentialityError = 'UpdateConfidentialityError',\n\n LoadDevResourcesRequest = 'LoadDevResourcesRequest',\n LoadDevResourcesResponse = 'LoadDevResourcesResponse',\n LoadDevResourcesError = 'LoadDevResourcesError',\n\n GetProjectCSContactRequest = 'GetProjectCSContactRequest',\n GetProjectCSContactResponse = 'GetProjectCSContactResponse',\n GetProjectCSContactError = 'GetProjectCSContactError',\n\n GetEBookUrlRequest = 'GetEBookUrlRequest',\n GetEBookUrlResponse = 'GetEBookUrlResponse',\n GetEBookUrlError = 'GetEBookUrlError',\n\n ReassessmentRequest = 'ReassessmentRequest',\n ReassessmentResponse = 'ReassessmentResponse',\n ReassessmentError = 'ReassessmentError',\n\n // Rater\n // -------------------------------------------------------------------------------------------------------------------\n AddRaterByEmailRequest = 'AddRaterByEmailRequest',\n AddRaterByEmailResponse = 'AddRaterByEmailResponse',\n AddRaterByEmailError = 'AddRaterByEmailError',\n\n AddRaterByIdRequest = 'AddRaterByIdRequest',\n AddRaterByIdResponse = 'AddRaterByIdResponse',\n AddRaterByIdError = 'AddRaterByIdError',\n\n ParticipantRatersRequest = 'ParticipantRatersRequest',\n ParticipantRatersResponse = 'ParticipantRatersResponse',\n ParticipantRatersError = 'ParticipantRatersError',\n\n PreviousRatersRequest = 'PreviousRatersRequest',\n PreviousRatersResponse = 'PreviousRatersResponse',\n PreviousRatersError = 'PreviousRatersError',\n\n UndeliveredEmailsRequest = 'UndeliveredEmailsRequest',\n UndeliveredEmailsResponse = 'UndeliveredEmailsResponse',\n UndeliveredEmailsError = 'UndeliveredEmailsError',\n\n DirectoryRatersRequest = 'DirectoryRatersRequest',\n DirectoryRatersResponse = 'DirectoryRatersResponse',\n DirectoryRatersError = 'DirectoryRatersError',\n\n UpdateInviteDataRequest = 'UpdateInviteDataRequest',\n UpdateInviteDataResponse = 'UpdateInviteDataResponse',\n UpdateInviteDataError = 'UpdateInviteDataError',\n\n InviteEmailPreviewRequest = 'InviteEmailPreviewRequest',\n InviteEmailPreviewResponse = 'InviteEmailPreviewResponse',\n InviteEmailPreviewError = 'InviteEmailPreviewError',\n\n ApproverEmailPreviewRequest = 'ApproverEmailPreviewRequest',\n ApproverEmailPreviewResponse = 'ApproverEmailPreviewResponse',\n ApproverEmailPreviewError = 'ApproverEmailPreviewError',\n\n SendInvitationsRequest = 'SendInvitationsRequest',\n SendInvitationsResponse = 'SendInvitationsResponse',\n SendInvitationsError = 'SendInvitationsError',\n\n SendRemindersRequest = 'SendRemindersRequest',\n SendRemindersResponse = 'SendRemindersResponse',\n SendRemindersError = 'SendRemindersError',\n\n RaterLevelsRequest = 'RaterLevelsRequest',\n RaterLevelsResponse = 'RaterLevelsResponse',\n RaterLevelsError = 'RaterLevelsError',\n\n DeleteRaterRequest = 'DeleteRaterRequest',\n DeleteRaterResponse = 'DeleteRaterResponse',\n DeleteRaterError = 'DeleteRaterError',\n\n SaveEditedRater = 'SaveEditedRater',\n\n UpdateRaterRequest = 'UpdateRaterRequest',\n UpdateRaterResponse = 'UpdateRaterResponse',\n UpdateRaterError = 'UpdateRaterError',\n\n SetApproverRequest = 'SetApproverRequest',\n SetApproverResponse = 'SetApproverResponse',\n SetApproverError = 'SetApproverError',\n\n SendForApprovalRequest = 'SendForApprovalRequest',\n SendForApprovalResponse = 'SendForApprovalResponse',\n SendForApprovalError = 'SendForApprovalError',\n\n // Rater Approval\n // -------------------------------------------------------------------------------------------------------------------\n RaterApprovalParticipantsRequest = 'RaterApprovalParticipantsRequest',\n RaterApprovalParticipantsResponse = 'RaterApprovalParticipantsResponse',\n RaterApprovalParticipantsError = 'RaterApprovalParticipantsError',\n\n RaterApprovalRatersRequest = 'RaterApprovalRatersRequest',\n RaterApprovalRatersResponse = 'RaterApprovalRatersResponse',\n RaterApprovalRatersError = 'RaterApprovalRatersError',\n\n SendRaterApprovalRequest = 'SendRaterApprovalRequest',\n SendRaterApprovalResponse = 'SendRaterApprovalResponse',\n SendRaterApprovalError = 'SendRaterApprovalError',\n\n UpdateApprovalStatusRequest = 'UpdateApprovalStatusRequest',\n UpdateApprovalStatusResponse = 'UpdateApprovalStatusResponse',\n UpdateApprovalStatusError = 'UpdateApprovalStatusError',\n\n ApproveRaterRequest = 'ApproveRaterRequest',\n ApproveRaterResponse = 'ApproveRaterResponse',\n ApproveRaterError = 'ApproveRaterError',\n\n DeclineRaterRequest = 'DeclineRaterRequest',\n DeclineRaterResponse = 'DeclineRaterResponse',\n DeclineRaterError = 'DeclineRaterError',\n\n RaterApprovalEmailPreviewRequest = 'RaterApprovalEmailPreviewRequest',\n RaterApprovalEmailPreviewResponse = 'RaterApprovalEmailPreviewResponse',\n RaterApprovalEmailPreviewError = 'RaterApprovalEmailPreviewError',\n\n AddRaterByEmailAsApproverRequest = 'AddRaterByEmailAsApproverRequest',\n AddRaterByEmailAsApproverResponse = 'AddRaterByEmailAsApproverResponse',\n AddRaterByEmailAsApproverError = 'AddRaterByEmailAsApproverError',\n\n // Create Survey\n // -------------------------------------------------------------------------------------------------------------------\n GetSelectedQuestionsRequest = 'GetSelectedQuestionsRequest',\n GetSelectedQuestionsResponse = 'GetSelectedQuestionsResponse',\n GetSelectedQuestionsError = 'GetSelectedQuestionsError',\n\n AddQuestionRequest = 'AddQuestionRequest',\n AddQuestionResponse = 'AddQuestionResponse',\n AddQuestionError = 'AddQuestionError',\n\n AddQuestionsForCompetencyRequest = 'AddQuestionsForCompetencyRequest',\n AddQuestionsForCompetencyResponse = 'AddQuestionsForCompetencyResponse',\n AddQuestionsForCompetencyError = 'AddQuestionsForCompetencyError',\n\n DeleteQuestionRequest = 'DeleteQuestionRequest',\n DeleteQuestionResponse = 'DeleteQuestionResponse',\n DeleteQuestionError = 'DeleteQuestionError',\n\n DeleteQuestionsForCompetencyRequest = 'DeleteQuestionsForCompetencyRequest',\n DeleteQuestionsForCompetencyResponse = 'DeleteQuestionsForCompetencyResponse',\n DeleteQuestionsForCompetencyError = 'DeleteQuestionsForCompetencyError',\n\n GetCompetenciesAndQuestionsRequest = 'GetCompetenciesAndQuestionsRequest',\n GetCompetenciesAndQuestionsResponse = 'GetCompetenciesAndQuestionsResponse',\n GetCompetenciesAndQuestionsError = 'GetCompetenciesAndQuestionsError',\n\n ApplyPendingChangesRequest = 'ApplyPendingChangesRequest',\n ApplyPendingChangesResponse = 'ApplyPendingChangesResponse',\n ApplyPendingChangesError = 'ApplyPendingChangesError',\n\n UnsetCreatedSurveyRequest = 'UnsetCreatedSurveyRequest',\n UnsetCreatedSurveyResponse = 'UnsetCreatedSurveyResponse',\n UnsetCreatedSurveyError = 'UnsetCreatedSurveyError',\n\n // Dev Plan\n // -------------------------------------------------------------------------------------------------------------------\n GetDevPlanItemsRequest = 'GetDevPlanItemsRequest',\n GetDevPlanItemsResponse = 'GetDevPlanItemsResponse',\n GetDevPlanItemsError = 'GetDevPlanItemsError',\n\n GetDevPlanActionsRequest = 'GetDevPlanActionsRequest',\n GetDevPlanActionsResponse = 'GetDevPlanActionsResponse',\n GetDevPlanActionsError = 'GetDevPlanActionsError',\n\n GetDevPlanFieldsAndAnswersRequest = 'GetDevPlanFieldsAndAnswersRequest',\n GetDevPlanFieldsAndAnswersResponse = 'GetDevPlanFieldsAndAnswersResponse',\n GetDevPlanFieldsAndAnswersError = 'GetDevPlanFieldsAndAnswersError',\n\n AddDevPlanItemRequest = 'AddDevPlanItemRequest',\n AddDevPlanItemResponse = 'AddDevPlanItemResponse',\n AddDevPlanItemError = 'AddDevPlanItemError',\n\n AddDevPlanActionRequest = 'AddDevPlanActionRequest',\n AddDevPlanActionResponse = 'AddDevPlanActionResponse',\n AddDevPlanActionError = 'AddDevPlanActionError',\n\n DeleteDevPlanItemRequest = 'DeleteDevPlanItemRequest',\n DeleteDevPlanItemResponse = 'DeleteDevPlanItemResponse',\n DeleteDevPlanItemError = 'DeleteDevPlanItemError',\n\n DeleteDevPlanActionRequest = 'DeleteDevPlanActionRequest',\n DeleteDevPlanActionResponse = 'DeleteDevPlanActionResponse',\n DeleteDevPlanActionError = 'DeleteDevPlanActionError',\n\n UpdateDevPlanItemDescriptionRequest = 'UpdateDevPlanItemDescriptionRequest',\n UpdateDevPlanItemDescriptionResponse = 'UpdateDevPlanItemDescriptionResponse',\n UpdateDevPlanItemDescriptionError = 'UpdateDevPlanItemDescriptionError',\n\n UpdateDevPlanItemTitleRequest = 'UpdateDevPlanItemTitleRequest',\n UpdateDevPlanItemTitleResponse = 'UpdateDevPlanItemTitleResponse',\n UpdateDevPlanItemTitleError = 'UpdateDevPlanItemTitleError',\n\n UpdateDevPlanActionCompleteByDateRequest = 'UpdateDevPlanActionCompleteByDateRequest',\n UpdateDevPlanActionCompleteByDateResponse = 'UpdateDevPlanActionCompleteByDateResponse',\n UpdateDevPlanActionCompleteByDateError = 'UpdateDevPlanActionCompleteByDateError',\n\n UpdateDevPlanActionStatusRequest = 'UpdateDevPlanActionStatusRequest',\n UpdateDevPlanActionStatusResponse = 'UpdateDevPlanActionStatusResponse',\n UpdateDevPlanActionStatusError = 'UpdateDevPlanActionStatusError',\n\n UpdateDevPlanFieldAnswerRequest = 'UpdateDevPlanFieldAnswerRequest',\n UpdateDevPlanFieldAnswerResponse = 'UpdateDevPlanFieldAnswerResponse',\n UpdateDevPlanFieldAnswerError = 'UpdateDevPlanFieldAnswerError',\n\n GetStatusKeysRequest = 'GetStatusKeysRequest',\n GetStatusKeysResponse = 'GetStatusKeysResponse',\n GetStatusKeysError = 'GetStatusKeysError',\n\n SetRemindersOnRequest = 'SetRemindersOnRequest',\n SetRemindersOnResponse = 'SetRemindersOnResponse',\n SetRemindersOnError = 'SetRemindersOnError',\n\n GetRemindersOnRequest = 'GetRemindersOnRequest',\n GetRemindersOnResponse = 'GetRemindersOnResponse',\n GetRemindersOnError = 'GetRemindersOnError',\n\n SendDevPlanRequest = 'SendDevPlanRequest',\n SendDevPlanResponse = 'SendDevPlanResponse',\n SendDevPlanError = 'SendDevPlanError',\n\n ClearLastSentEmail = 'ClearLastSentEmail',\n\n SetDevPlanViewedAction = 'SetDevPlanViewedAction',\n\n // Dev Plan Field Answer Lists\n // -------------------------------------------------------------------------------------------------------------------\n GetDevActionListItemsRequest = 'GetDevActionListItemsRequest',\n GetDevActionListItemsResponse = 'GetDevActionListItemsResponse',\n GetDevActionListItemsError = 'GetDevActionListItemsError',\n\n UpdateFieldAnswerListRequest = 'UpdateFieldAnswerListRequest',\n UpdateFieldAnswerListResponse = 'UpdateFieldAnswerListResponse',\n UpdateFieldAnswerListError = 'UpdateFieldAnswerListError',\n\n SaveFieldAnswerList = 'SaveFieldAnswerList',\n\n // Dev Plan Collaboration\n // -------------------------------------------------------------------------------------------------------------------\n AuthenticateCollaboratorRequest = 'AuthenticateCollaboratorRequest',\n AuthenticateCollaboratorResponse = 'AuthenticateCollaboratorResponse',\n AuthenticateCollaboratorError = 'AuthenticateCollaboratorError',\n\n GetDevPlanCollaboratorsRequest = 'GetDevPlanCollaboratorsRequest',\n GetDevPlanCollaboratorsResponse = 'GetDevPlanCollaboratorsResponse',\n GetDevPlanCollaboratorsError = 'GetDevPlanCollaboratorsError',\n\n AddDevPlanCollaboratorRequest = 'AddDevPlanCollaboratorRequest',\n AddDevPlanCollaboratorResponse = 'AddDevPlanCollaboratorResponse',\n AddDevPlanCollaboratorError = 'AddDevPlanCollaboratorError',\n\n SendDevPlanCollaboratorInviteRequest = 'SendDevPlanCollaboratorInviteRequest',\n SendDevPlanCollaboratorInviteResponse = 'SendDevPlanCollaboratorInviteResponse',\n SendDevPlanCollaboratorInviteError = 'SendDevPlanCollaboratorInviteError',\n\n SetDevPlanCollaboratorAcceptedRequest = 'SetDevPlanCollaboratorAcceptedRequest',\n SetDevPlanCollaboratorAcceptedResponse = 'SetDevPlanCollaboratorAcceptedResponse',\n SetDevPlanCollaboratorAcceptedError = 'SetDevPlanCollaboratorAcceptedError',\n\n DeleteDevPlanCollaboratorRequest = 'DeleteDevPlanCollaboratorRequest',\n DeleteDevPlanCollaboratorResponse = 'DeleteDevPlanCollaboratorResponse',\n DeleteDevPlanCollaboratorError = 'DeleteDevPlanCollaboratorError',\n\n GetDevItemCommentsRequest = 'GetDevItemCommentsRequest',\n GetDevItemCommentsResponse = 'GetDevItemCommentsResponse',\n GetDevItemCommentsError = 'GetDevItemCommentsError',\n\n AddDevItemCommentRequest = 'AddDevItemCommentRequest',\n AddDevItemCommentResponse = 'AddDevItemCommentResponse',\n AddDevItemCommentError = 'AddDevItemCommentError',\n\n SendDevItemCommentNotificationRequest = 'SendDevItemCommentNotificationRequest',\n SendDevItemCommentNotificationResponse = 'SendDevItemCommentNotificationResponse',\n SendDevItemCommentNotificationError = 'SendDevItemCommentNotificationError',\n\n SendParticipantCommentNotificationRequest = 'SendParticipantCommentNotificationRequest',\n SendParticipantCommentNotificationResponse = 'SendParticipantCommentNotificationResponse',\n SendParticipantCommentNotificationError = 'SendParticipantCommentNotificationError',\n\n UpdateDevItemCommentRequest = 'UpdateDevItemCommentRequest',\n UpdateDevItemCommentResponse = 'UpdateDevItemCommentResponse',\n UpdateDevItemCommentError = 'UpdateDevItemCommentError',\n\n SetDevItemCommentsReadRequest = 'SetDevItemCommentsReadRequest',\n SetDevItemCommentsReadResponse = 'SetDevItemCommentsReadResponse',\n SetDevItemCommentsReadError = 'SetDevItemCommentsReadError',\n\n DeleteDevItemCommentRequest = 'DeleteDevItemCommentRequest',\n DeleteDevItemCommentResponse = 'DeleteDevItemCommentResponse',\n DeleteDevItemCommentError = 'DeleteDevItemCommentError',\n\n // SetGoals\n // -------------------------------------------------------------------------------------------------------------------\n GoalsAnswersRequest = 'GoalsAnswersRequest',\n GoalsAnswersResponse = 'GoalsAnswersResponse',\n GoalsAnswersError = 'GoalsAnswersError',\n\n SetGoalAnswerRequest = 'SetGoalAnswerRequest',\n SetGoalAnswerResponse = 'SetGoalAnswerResponse',\n SetGoalAnswerError = 'SetGoalAnswerError',\n\n SendGoalsRequest = 'SendGoalsRequest',\n SendGoalsResponse = 'SendGoalsResponse',\n SendGoalsError = 'SendGoalsError',\n\n\n // ViewReport\n // -------------------------------------------------------------------------------------------------------------------\n LoadReportsRequest = 'LoadReportsRequest',\n LoadReportsResponse = 'LoadReportsResponse',\n LoadReportsError = 'LoadReportsError',\n\n ReportDataRequest = 'ReportDataRequest',\n ReportDataResponse = 'ReportDataResponse',\n ReportDataError = 'ReportDataError',\n\n GetEQScoresRequest = 'GetEQScoresRequest',\n GetEQScoresResponse = 'GetEQScoresResponse',\n GetEQScoresError = 'GetEQScoresError',\n\n SendEQScoresRequest = 'SendDevItemCommentNotificationRequest',\n SendEQScoresResponse = 'SendEQScoresResponse',\n SendEQScoresError = 'SendEQScoresError',\n\n EQScoresEmailPreviewRequest = 'EQScoresEmailPreviewRequest',\n EQScoresEmailPreviewResponse = 'EQScoresEmailPreviewResponse',\n EQScoresEmailPreviewError = 'EQScoresEmailPreviewError',\n\n // Report Recipient\n // -------------------------------------------------------------------------------------------------------------------\n ReportRecipientProjectsRequest = 'ReportRecipientProjectsRequest',\n ReportRecipientProjectsResponse = 'ReportRecipientProjectsResponse',\n ReportRecipientProjectsError = 'ReportRecipientProjectsError',\n\n ReportRecipientParticipantsRequest = 'ReportRecipientParticipantsRequest',\n ReportRecipientParticipantsResponse = 'ReportRecipientParticipantsResponse',\n ReportRecipientParticipantsError = 'ReportRecipientParticipantsError',\n\n ReportRecipientReportsRequest = 'ReportRecipientReportsRequest',\n ReportRecipientReportsResponse = 'ReportRecipientReportsResponse',\n ReportRecipientReportsError = 'ReportRecipientReportsError',\n\n DeliverReportsRequest = 'DeliverReportsRequest',\n DeliverReportsResponse = 'DeliverReportsResponse',\n DeliverReportsError = 'DeliverReportsError',\n\n DeliverReportsToRecipientRequest = 'DeliverReportsToRecipientRequest',\n DeliverReportsToRecipientResponse = 'DeliverReportsToRecipientResponse',\n DeliverReportsToRecipientError = 'DeliverReportsToRecipientError',\n\n SetLastOnly = 'SetLastOnly',\n SetDateRange = 'SetDateRange',\n AddFilterParticipant = 'AddFilterParticipant',\n AddFilterProject = 'AddFilterProject',\n RemoveFilterParticipant = 'RemoveFilterParticipant',\n RemoveFilterProject = 'RemoveFilterProject',\n\n SetSelected = 'SetSelected',\n SetAllSelected = 'SetAllSelected',\n\n\n // Trace Logging\n // -------------------------------------------------------------------------------------------------------------------\n LogInfoRequest = 'LogInfoRequest',\n LogInfoResponse = 'LogInfoResponse',\n LogInfoError = 'LogInfoError',\n}\n\n","import * as R from 'ramda';\nimport { ActionType } from '../core/redux/actionType';\nimport { TextDirection } from './textDirection';\nimport { AppState } from '../core/redux/appState';\nimport { Action } from 'redux';\nimport { LocaleState } from './localeState';\nimport { Language } from './models';\n\n\ntype SetLocaleAction = {\n type: ActionType.SetLocaleAction;\n language: Language | undefined;\n textDirection: TextDirection | undefined;\n};\n\nexport const setLocaleAction = (\n language: Language | undefined,\n textDirection: TextDirection | undefined,\n): SetLocaleAction => ({\n type: ActionType.SetLocaleAction,\n language: language,\n textDirection: textDirection,\n});\n\nexport const setLocaleReducer = (state: AppState, action: Action): AppState => {\n if (action.type !== ActionType.SetLocaleAction) {\n return state;\n }\n\n const sla = action as SetLocaleAction;\n\n return R.mergeDeepRight(\n state,\n {\n locale: {\n lang: sla.language ?? state.locale.lang,\n textDirection: sla.textDirection ?? state.locale.textDirection,\n translations: state.locale.translations,\n } as LocaleState,\n },\n );\n};\n","export enum Str {\n InviteRatersParen = 'Portal-InviteRatersParen',\n RemindRatersParen = 'Portal-RemindRatersParen',\n FooterCopyrightPrivacy = 'Portal-FooterCopyrightPrivacy',\n NameAdded = 'Portal-NameAdded',\n ActionsAdded = 'Portal-ActionsAdded',\n RatersNotInvitedWarn = 'Portal-RatersNotInvitedWarn',\n RatersNotSentWarn = 'Portal-RatersNotSentWarn',\n ReportsDelivered = 'Portal-ReportsDelivered',\n ReportsDownloaded = 'Portal-ReportsDownloaded',\n UndeliveredRaters = 'Portal-UndeliveredRaters',\n CustomerServicePhone = 'Portal-CustomerServicePhone',\n FooterPhoneLinks = 'Portal-FooterPhoneLinks',\n CustomerServiceSupportLink = 'Portal-CustomerServiceSupportLink',\n FooterSupportSiteLink = 'Portal-FooterSupportSiteLink',\n CopyrightText = 'Portal-CopyrightText',\n PrivacyText = 'Portal-PrivacyText',\n CopyrightRightsReserved = 'Portal-CopyrightRightsReserved',\n DevPlanAccessMsg = 'Portal-DevPlanAccessMsg',\n Account = 'Portal-Account',\n ActionNumber = 'Portal-ActionNumber',\n Add = 'Portal-Add',\n AddDate = 'Portal-AddDate',\n AddDevItem = 'Portal-AddDevItem',\n AddAction = 'Portal-AddAction',\n AddItem = 'Portal-AddItem',\n AddOptionalText = 'Portal-AddOptionalText',\n AddPreviousRaters = 'Portal-AddPreviousRaters',\n AddRater = 'Portal-AddRater',\n AddCalendar = 'Portal-AddCalendar',\n Added = 'Portal-Added',\n AggregateReport = 'Portal-AggregateReport',\n All = 'Portal-All',\n AllDeliveries = 'Portal-AllDeliveries',\n AnswerRequired = 'Portal-AnswerRequired',\n Answer = 'Portal-Answer',\n AnswerSecurityQuestion = 'Portal-AnswerSecurityQuestion',\n Approval = 'Portal-Approval',\n ApprovalColon = 'Portal-ApprovalColon',\n ApprovalRequestSent = 'Portal-ApprovalRequestSent',\n Approve = 'Portal-Approve',\n ApprovalStatus3 = 'Portal-ApprovalStatus3',\n ApprovalStatus1 = 'Portal-ApprovalStatus1',\n Approver = 'Portal-Approver',\n ApproverColon = 'Portal-ApproverColon',\n RatersNotInvitedConfirm = 'Portal-RatersNotInvitedConfirm',\n AutoRemindersConfirm = 'Portal-AutoRemindersConfirm',\n ConfirmRemind = 'Portal-ConfirmRemind',\n ConfirmRemoveRater = 'Portal-ConfirmRemoveRater',\n ConfirmRemoveItem = 'Portal-ConfirmRemoveItem',\n ConfirmRemoveAction = 'Portal-ConfirmRemoveAction',\n DevPlanReminders = 'Portal-DevPlanReminders',\n Available = 'Portal-Available',\n BackToLogin = 'Portal-BackToLogin',\n Begin = 'Portal-Begin',\n EntryAgreement = 'Portal-EntryAgreement',\n Cancel = 'Portal-Cancel',\n ChangePassword = 'Portal-ChangePassword',\n ChangeSecurityQuestion = 'Portal-ChangeSecurityQuestion',\n ChangePasswordTitle = 'Portal-ChangePasswordTitle',\n ChangeSecurityQuestionTitle = 'Portal-ChangeSecurityQuestionTitle',\n ChooseLanguage = 'Portal-ChooseLanguage',\n ChooseProject = 'Portal-ChooseProject',\n ChooseRater = 'Portal-ChooseRater',\n ChooseSecurityQuestion = 'Portal-ChooseSecurityQuestion',\n ChooseCompetency = 'Portal-ChooseCompetency',\n ChooseCompetencies = 'Portal-ChooseCompetencies',\n Company = 'Portal-Company',\n Competencies = 'Portal-Competencies',\n DashDevPlanItemsMsg = 'Portal-DashDevPlanItemsMsg',\n DashDevPlanItemsEmailMsg = 'Portal-DashDevPlanItemsEmailMsg',\n CompleteBy = 'Portal-CompleteBy',\n Completed = 'Portal-Completed',\n Composite = 'Portal-Composite',\n ConfirmPassword = 'Portal-ConfirmPassword',\n PasswordMismatch = 'Portal-PasswordMismatch',\n DevPlanCompleteMsg = 'Portal-DevPlanCompleteMsg',\n Continue = 'Portal-Continue',\n Copyright = 'Portal-Copyright',\n CreatePassword = 'Portal-CreatePassword',\n CreateASurvey = 'Portal-CreateASurvey',\n CreateDevPlan = 'Portal-CreateDevPlan',\n CreateSurvey = 'Portal-CreateSurvey',\n CurrentPassword = 'Portal-CurrentPassword',\n CustomerService = 'Portal-CustomerService',\n CustomerSupport = 'Portal-CustomerSupport',\n CustomizeEmail = 'Portal-CustomizeEmail',\n CustomizeInvite = 'Portal-CustomizeInvite',\n Dashboard = 'Portal-Dashboard',\n DateRangeReports = 'Portal-DateRangeReports',\n Days = 'Portal-Days',\n DeadlineColon = 'Portal-DeadlineColon',\n Decline = 'Portal-Decline',\n ApprovalStatus4 = 'Portal-ApprovalStatus4',\n Deliver = 'Portal-Deliver',\n DeliverAll = 'Portal-DeliverAll',\n DeliverSelected = 'Portal-DeliverSelected',\n Delivered = 'Portal-Delivered',\n DeliveredParticipant = 'Portal-DeliveredParticipant',\n Description = 'Portal-Description',\n DescriptionNotAdded = 'Portal-DescriptionNotAdded',\n DevActions = 'Portal-DevActions',\n Devitem = 'Portal-Devitem',\n DevPlan = 'Portal-DevPlan',\n DevResources = 'Portal-DevResources',\n DevTips = 'Portal-DevTips',\n Done = 'Portal-Done',\n Download = 'Portal-Download',\n DownloadAll = 'Portal-DownloadAll',\n DownloadSelected = 'Portal-DownloadSelected',\n EditSurvey = 'Portal-EditSurvey',\n Email = 'Portal-Email',\n EmailColon = 'Portal-EmailColon',\n EmailRater = 'Portal-EmailRater',\n EmailOther = 'Portal-EmailOther',\n EmailPreview = 'Portal-EmailPreview',\n EmailReminders = 'Portal-EmailReminders',\n TemplateMissing = 'Portal-TemplateMissing',\n EmailGoals = 'Portal-EmailGoals',\n EmailPlan = 'Portal-EmailPlan',\n DashDevPlanEmailMsg = 'Portal-DashDevPlanEmailMsg',\n EnterDevItem = 'Portal-EnterDevItem',\n EnterEmail = 'Portal-EnterEmail',\n Expired = 'Portal-Expired',\n AddFailed = 'Portal-AddFailed',\n LoadFailed = 'Portal-LoadFailed',\n SecurityQuestionFather = 'Portal-SecurityQuestion-Father',\n SecurityQuestionColor = 'Portal-SecurityQuestion-Color',\n SecurityQuestionDessert = 'Portal-SecurityQuestion-Dessert',\n FilterParticipant = 'Portal-FilterParticipant',\n FilterProject = 'Portal-FilterProject',\n FirstName = 'Portal-FirstName',\n SecurityQuestionPet = 'Portal-SecurityQuestion-Pet',\n ForgotPassword = 'Portal-ForgotPassword',\n FullReport = 'Portal-FullReport',\n GoalsSentTo = 'Portal-GoalsSentTo',\n Hours = 'Portal-Hours',\n DashDevPlanDoneMsg = 'Portal-DashDevPlanDoneMsg',\n DefaultDevPlanField2 = 'Portal-DefaultDevPlanField2',\n RaterApprovalMsg = 'Portal-RaterApprovalMsg',\n ScoredHigh = 'Portal-ScoredHigh',\n ScoredLow = 'Portal-ScoredLow',\n InProgress = 'Portal-InProgress',\n CreateSurveyFootnote = 'Portal-CreateSurveyFootnote',\n Incomplete = 'Portal-Incomplete',\n InvalidEmail = 'Portal-InvalidEmail',\n LoginFailure = 'Portal-LoginFailure',\n Individual = 'Portal-Individual',\n InviteRemindRaters = 'Portal-InviteRemindRaters',\n InviteRaters = 'Portal-InviteRaters',\n InviteRequirements = 'Portal-InviteRequirements',\n Invited = 'Portal-Invited',\n InvitedColon = 'Portal-InvitedColon',\n InvitesSent = 'Portal-InvitesSent',\n WebReportMsg = 'Portal-WebReportMsg',\n Language = 'Portal-Language',\n LanguageColon = 'Portal-LanguageColon',\n Last3Months = 'Portal-Last3Months',\n Last6Months = 'Portal-Last6Months',\n LastMonth = 'Portal-LastMonth',\n LastName = 'Portal-LastName',\n LastYear = 'Portal-LastYear',\n LogIn = 'Portal-LogIn',\n LogOut = 'Portal-LogOut',\n Minutes = 'Portal-Minutes',\n CustomerServiceHours = 'Portal-CustomerServiceHours',\n SecurityQuestionMother = 'Portal-SecurityQuestion-Mother',\n NA = 'Portal-NA',\n NameColon = 'Portal-NameColon',\n Name = 'Portal-Name',\n NameOrEmail = 'Portal-NameOrEmail',\n NameEmail = 'Portal-NameEmail',\n ApprovalStatus2 = 'Portal-ApprovalStatus2',\n NewPassword = 'Portal-NewPassword',\n SecurityQuestionNickname = 'Portal-SecurityQuestion-Nickname',\n No = 'Portal-No',\n NotAvailable = 'Portal-NotAvailable',\n NotInvited = 'Portal-NotInvited',\n NotStarted = 'Portal-NotStarted',\n NoteForReminders = 'Portal-NoteForReminders',\n Off = 'Portal-Off',\n On = 'Portal-On',\n Online = 'Portal-Online',\n OptionalComments = 'Portal-OptionalComments',\n Or = 'Portal-Or',\n Password = 'Portal-Password',\n PasswordFailsRequirements = 'Portal-PasswordFailsRequirements',\n PasswordRequirements = 'Portal-PasswordRequirements',\n Phone = 'Portal-Phone',\n SelectQuestion = 'Portal-SelectQuestion',\n LoginTitle = 'Portal-LoginTitle',\n Privacy = 'Portal-Privacy',\n PrivacyPolicy = 'Portal-PrivacyPolicy',\n Project = 'Portal-Project',\n Question = 'Portal-Question',\n Questions = 'Portal-Questions',\n RaterApproval = 'Portal-RaterApproval',\n RaterStatus = 'Portal-RaterStatus',\n RecommendedMinimums = 'Portal-RecommendedMinimums',\n Relationship = 'Portal-Relationship',\n RelationshipColon = 'Portal-RelationshipColon',\n RemindRaters = 'Portal-RemindRaters',\n RemindersSent = 'Portal-RemindersSent',\n Remove = 'Portal-Remove',\n ReportPortal = 'Portal-ReportPortal',\n ReportTutorial = 'Portal-ReportTutorial',\n Reports = 'Portal-Reports',\n RequiredMinimums = 'Portal-RequiredMinimums',\n RequiredOpenQuestions = 'Portal-RequiredOpenQuestions',\n Resources = 'Portal-Resources',\n ResponseNotAdded = 'Portal-ResponseNotAdded',\n Retry = 'Portal-Retry',\n Review = 'Portal-Review',\n ReviewDevPlan = 'Portal-ReviewDevPlan',\n ReviewFeedback = 'Portal-ReviewFeedback',\n Save = 'Portal-Save',\n Search = 'Portal-Search',\n SearchDirectory = 'Portal-SearchDirectory',\n SearchParticipants = 'Portal-SearchParticipants',\n SearchProjects = 'Portal-SearchProjects',\n SecurityQuestion = 'Portal-SecurityQuestion',\n Select = 'Portal-Select',\n SelectOne = 'Portal-SelectOne',\n SelfSurvey = 'Portal-SelfSurvey',\n Send = 'Portal-Send',\n SendGoals = 'Portal-SendGoals',\n SendApproval = 'Portal-SendApproval',\n SendForApproval = 'Portal-SendForApproval',\n SetGoals = 'Portal-SetGoals',\n SetPassword = 'Portal-SetPassword',\n SetSecurityQuestion = 'Portal-SetSecurityQuestion',\n ShowMostRecent = 'Portal-ShowMostRecent',\n Skills = 'Portal-Skills',\n Status = 'Portal-Status',\n Submitted = 'Portal-Submitted',\n Summary = 'Portal-Summary',\n SummaryReport = 'Portal-SummaryReport',\n SurveyDeadline = 'Portal-SurveyDeadline',\n SurveyDeadlineColon = 'Portal-SurveyDeadlineColon',\n TakeSelfSurvey = 'Portal-TakeSelfSurvey',\n IncorrectAnswer = 'Portal-IncorrectAnswer',\n IncorrectPassword = 'Portal-IncorrectPassword',\n SetGoalsDefaultIntro = 'Portal-SetGoalsDefaultIntro',\n ThisMonth = 'Portal-ThisMonth',\n ThisYear = 'Portal-ThisYear',\n Tips = 'Portal-Tips',\n DashInviteMsg = 'Portal-DashInviteMsg',\n Undelivered = 'Portal-Undelivered',\n DevPlanDefaultInstructions = 'Portal-DevPlanDefaultInstructions',\n ViewReport = 'Portal-ViewReport',\n ViewRequirements = 'Portal-ViewRequirements',\n ViewEdit = 'Portal-ViewEdit',\n ViewEditDetails = 'Portal-ViewEditDetails',\n ApprovalStatus5 = 'Portal-ApprovalStatus5',\n DefaultDevPlanField1 = 'Portal-DefaultDevPlanField1',\n DefaultGoal3 = 'Portal-DefaultGoal3',\n DefaultGoal1 = 'Portal-DefaultGoal1',\n WhatToDevelop = 'Portal-WhatToDevelop',\n DefaultDevPlanField3 = 'Portal-DefaultDevPlanField3',\n DefaultGoal2 = 'Portal-DefaultGoal2',\n Yes = 'Portal-Yes',\n DevPlanNumberEmailMsg = 'Portal-DevPlanNumberEmailMsg',\n DevPlanNumberMsg = 'Portal-DevPlanNumberMsg',\n InviteApprovalMsg = 'Portal-InviteApprovalMsg',\n ApproveFor = 'Portal-ApproveFor',\n DashCreateSurveyMsg = 'Portal-DashCreateSurveyMsg',\n DevPlanEmailMsg = 'Portal-DevPlanEmailMsg',\n InviteApprovalMsg2 = 'Portal-InviteApprovalMsg2',\n UninvitedRatersMsg = 'Portal-UninvitedRatersMsg',\n MaxRatersMsg = 'Portal-MaxRatersMsg',\n NoProjects = 'Portal-NoProjects',\n PasswordRestrictDays = 'Portal-PasswordRestrictDays',\n PasswordLastX = 'Portal-PasswordLastX',\n RequiredRatersApprovalMsg = 'Portal-RequiredRatersApprovalMsg',\n RequiredRatersInviteMsg = 'Portal-RequiredRatersInviteMsg',\n AccountLocked = 'Portal-AccountLocked',\n AutoRemindersWarn = 'Portal-AutoRemindersWarn',\n YourSurvey = 'Portal-YourSurvey',\n SurveyCreated = 'Portal-SurveyCreated',\n SurveyFinal = 'Portal-SurveyFinal',\n TempPasswordSent = 'Portal-TempPasswordSent',\n DashMakingProgressMsg = 'Portal-DashMakingProgressMsg',\n Pdf = 'Portal-Pdf',\n Type = 'Portal-Type',\n Web = 'Portal-Web',\n SsoFailure = 'Portal-SsoFailure',\n ChooseApprover = 'Portal-ChooseApprover',\n PlanSentTo = 'Portal-PlanSentTo',\n ChooseOne = 'Portal-ChooseOne',\n PermissionMsg = 'Portal-PermissionMsg',\n OpenQuestions = 'Portal-OpenQuestions',\n NoReports = 'Portal-NoReports',\n UnableToProcess = 'Portal-UnableToProcess',\n NameRequired = 'Portal-NameRequired',\n LoadMore = 'Portal-LoadMore',\n NoApprovalParticipants = 'Portal-NoApprovalParticipants',\n ApprovalSent = 'Portal-ApprovalSent',\n RatersNotProcessed = 'Portal-RatersNotProcessed',\n LoginApprovalTitle = 'Portal-LoginApprovalTitle',\n LoginRecipientTitle = 'Portal-LoginRecipientTitle',\n NoRaters = 'Portal-NoRaters',\n UnknownError = 'Portal-UnknownError',\n NoResults = 'Portal-NoResults',\n AddApproveRater = 'Portal-AddApproveRater',\n TimedOutMsg = 'Portal-TimedOutMsg',\n TimeoutMsg = 'Portal-TimeoutMsg',\n Ok = 'Portal-Ok',\n DevPlanContentExists = 'Portal-DevPlanContentExists',\n DevPlanNumberShareMsg = 'Portal-DevPlanNumberShareMsg',\n DevPlanShareMsg = 'Portal-DevPlanShareMsg',\n InviteShare = 'Portal-InviteShare',\n UnreadCommentsMsg = 'Portal-UnreadCommentsMsg',\n ConfirmUnshare = 'Portal-ConfirmUnshare',\n ConfirmShare = 'Portal-ConfirmShare',\n ViewDetails = 'Portal-ViewDetails',\n AssessmentDetail = 'Portal-AssessmentDetail',\n EnterName = 'Portal-EnterName',\n Accepted = 'Portal-Accepted',\n NotAccepted = 'Portal-NotAccepted',\n UnreadComments = 'Portal-UnreadComments',\n You = 'Portal-You',\n DateNotAdded = 'Portal-DateNotAdded',\n Comments = 'Portal-Comments',\n Other = 'Portal-Other',\n InviteSent = 'Portal-InviteSent',\n SharePlan = 'Portal-SharePlan',\n RequireSymbol = 'Portal-RequireSymbol',\n RestrictPI = 'Portal-RestrictPI',\n InviteApprovalMsg3 = 'Portal-InviteApprovalMsg3',\n Share = 'Portal-Share',\n ShareScores = 'Portal-ShareScores',\n ScoresSent = 'Portal-ScoresSent',\n Generating = 'Portal-Generating',\n Redeliver = 'Portal-Redeliver',\n EnterComment = 'Portal-EnterComment',\n EBook = 'Portal-EBook',\n EBookAvailability = 'Portal-EBookAvailability',\n ReassessmentMsg = 'Portal-ReassessmentMsg',\n RetakeAssessment = 'Portal-RetakeAssessment',\n ReassessmentAreYouSure = 'Portal-ReassessmentAreYouSure',\n LoginAnnouncement = 'Login-Announcement',\n}\n","import {\n RSAARequestType,\n RSAASuccessType,\n RSAAFailureType,\n RSAAResultAction,\n RSAACall,\n createAction,\n} from 'redux-api-middleware';\nimport { AppState } from '../redux/appState';\nimport { ActionType } from '../redux/actionType';\nimport { Action } from 'redux';\nimport * as R from 'ramda';\n\n\n/**\n * Each RSAA Action results in 2 Redux actions being dispatched:\n * 1. The action at index 0 to indicate the HTTP request has been made and is in progress\n * 2. A result action to indicate success/failure of the HTTP request, including the server response\n * Index 1 = Successful Response Action Type\n * Index 2 = Unsuccessful Response Action Type\n */\nexport type RSAATypes = [\n RSAARequestType,\n RSAASuccessType,\n RSAAFailureType\n]\n\n\n/**\n * Internal type for a function that maps an ActionType into an RSAA Action Type\n */\ntype RsaaTypeMapper = (action: ActionType) => RSAARequestType;\n\n\n/**\n * A function of the kind accepted by `makeApiReducer` that takes information about a reduced API action such as whether\n * or not there was an HTTP error, whether we're waiting on a response, what the current redux store looks like...\n */\nexport type ApiReducer = (\n state: AppState,\n action: RSAAResultAction & { meta: TMeta }, // RSAA typing missed this property for error actions\n errorMsg: string | undefined,\n isLoading: boolean,\n payload: TPayload | undefined,\n) => AppState;\n\n\n/**\n * A function that helps turn ActionTypes into RSAATypes, optionally with some meta.\n * @param actions - The Redux ActionTypes RSAA should dispatch to show the state of the HTTP request\n * @param meta - An optional object (or other thing) to pass along on each Redux action to the reducer\n * (useful for tracking e.g. which product this request was made for)\n */\nexport const makeRsaaTypes = (\n actions: ActionType[],\n meta?: TMeta,\n): RSAATypes => {\n // Map meta into an object, otherwise a good old fashioned string[] is fine\n const mapper: RsaaTypeMapper = meta\n ? (action => ({ type: action, meta: meta }))\n : (action => action as string);\n\n // RSAATypes is an array of length 3, and map returns an array of length indefinite -- so we cast :(\n return actions.map(mapper) as RSAATypes;\n};\n\n\n/**\n * Constructs an action that, when dispatched, RSAA Middleware intercepts and turns into an HTTP Request.\n */\nexport const makeApiAction = (\n request: RSAACall,\n): Action => createAction(\n request,\n) as unknown as Action; // Redux needs this to be an Action even though it doesn't have a `type` attribute\n\n\n/**\n * Constructs a reducer for handling actions from ReduxApiMiddleware.\n * @param actions - The list of actions you care about\n * @param loadingAction - The API Middleware's loading action\n * @param withResults - Your reducer logic\n * @param defaultErrorMsg - Sometimes the API returns no error message -- here's where you can use this!\n */\nexport const makeApiReducer = (\n actions: ActionType[],\n loadingAction: ActionType,\n withResults: ApiReducer,\n defaultErrorMsg: string = '',\n) => (\n state: AppState,\n incomingAction: Action,\n): AppState => {\n if (!actions.includes(incomingAction.type)) {\n return state;\n }\n\n const action = incomingAction as RSAAResultAction;\n const payload = R.path(['payload'], action) as TPayload;\n\n const errorMsg = action.error ? R.path(['message'], payload) ?? defaultErrorMsg : undefined;\n const isLoading = action.type === loadingAction && !errorMsg;\n\n return withResults(\n state,\n action as RSAAResultAction & { meta: TMeta }, // RSAA typing missed this property for error actions\n errorMsg,\n isLoading,\n payload,\n );\n};\n\n","import * as R from 'ramda';\nimport { AppState } from '../redux/appState';\nimport { ActionType } from '../redux/actionType';\nimport { ApiLoading } from './apiLoading';\nimport { ApiError } from './apiError';\n\n\n/**\n * Makes a new path from 1 or more path segments.\n */\nexport const pathCombine = (\n ...segments: Array\n): string => {\n const fullPath = segments.join('/');\n const deduped = fullPath.split('/').filter(segment => !!segment).join('/');\n\n const prefixMatch = deduped.match(/^https?:\\/(?!\\/)/);\n const withDoubleSlashedPrefix = !!prefixMatch ? deduped.replace(prefixMatch[0], prefixMatch[0] + '/') : deduped;\n\n const startsWithSlash = fullPath.startsWith('/');\n return startsWithSlash ? `/${withDoubleSlashedPrefix}` : withDoubleSlashedPrefix;\n};\n\n\n/**\n * When we store loading/error information into Redux, we need a key to associate that information with for easy lookup.\n * This function makes that key.\n */\nexport const keyFor = (\n actionType: ActionType,\n requestId: string | number | ActionType,\n): string => `${actionType}-${requestId}`;\n\n\n/**\n * Adds loading state to AppState, producing a new AppState. This also removes error from app state, as it doesn't make\n * sense to have both loading and error.\n * @param state - The app state to use to make a new App state\n * @param actionType - The Redux action type that triggered this thing\n * @param requestId - the optional unique ID of the request (defaults to ActionType)\n * @param extras - Any extras you want to track with the error\n */\nexport const addLoading = (\n state: AppState,\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n extras?: any,\n): AppState => {\n const key = keyFor(actionType, requestId ?? actionType);\n\n return R.dissocPath(\n ['error', key],\n R.assocPath(\n ['loading', key],\n {\n requestId: requestId,\n actionType: actionType,\n extras: extras,\n } as ApiLoading, // Cast so the type checker gets angry if we ever change ApiLoading\n state,\n ),\n );\n};\n\n\n/**\n * Produces a new app state without the given loading information inside\n * @param state - The app state to use to make a new App state\n * @param actionType - The Redux action type that triggered this thing\n * @param requestId - the optional unique ID of the request (defaults to ActionType)\n */\nexport const removeLoading = (\n state: AppState,\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n): AppState => R.dissocPath(['loading', keyFor(actionType, requestId ?? actionType)], state);\n\n\n/**\n * Retrieves loading information (if it exists) from Redux for the specified request\n * @param state - The app state to use to make a new App state\n * @param actionType - The Redux action type that triggered this thing\n * @param requestId - the optional unique ID of the request (defaults to ActionType)\n */\nexport const getLoading = (\n state: AppState,\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n): ApiLoading | undefined => state.loading[keyFor(actionType, requestId ?? actionType)];\n\n\n/**\n * Adds an error to AppState, producing a new AppState. This also removes loading from app state, as it doesn't make\n * sense to have both loading and error.\n * @param state - The app state to use to make a new App state\n * @param actionType - The Redux action type that triggered this thing\n * @param errorMsg - The error message proper\n * @param requestId - the optional unique ID of the request (defaults to ActionType)\n * @param extras - Any extras you want to track with the error\n */\nexport const addError = (\n state: AppState,\n actionType: ActionType,\n errorMsg: string,\n requestId: string | number | undefined = undefined,\n extras?: any,\n): AppState => {\n const key = keyFor(actionType, requestId ?? actionType);\n\n return R.dissocPath(\n ['loading', key],\n R.assocPath(\n ['error', key],\n {\n requestId: requestId,\n actionType: actionType,\n errorMsg: errorMsg,\n extras: extras,\n } as ApiError, // Cast so the type checker gets angry if we ever change ApiError\n state,\n ),\n );\n};\n\n\n/**\n * Produces a new app state without the given error information inside\n * @param state - The app state to use to make a new App state\n * @param actionType - The Redux action type that triggered this thing\n * @param requestId - the optional unique ID of the request (defaults to ActionType)\n */\nexport const removeError = (\n state: AppState,\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n): AppState => R.dissocPath(['error', keyFor(actionType, requestId ?? actionType)], state);\n\n\n/**\n * Retrieves error information (if it exists) from Redux for the specified request\n * @param state - The app state to use to make a new App state\n * @param actionType - The Redux action type that triggered this thing\n * @param requestId - the optional unique ID of the request (defaults to ActionType)\n */\nexport const getError = (\n state: AppState,\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n): ApiError | undefined => state.error[keyFor(actionType, requestId ?? actionType)];\n\n\n/**\n * Removes both the loading and error info from state for the specified request, producing a new AppState\n * @param state - The app state to use to make a new App state\n * @param actionType - The Redux action type that triggered this thing\n * @param requestId - the optional unique ID of the request (defaults to ActionType)\n */\nexport const noLoadingNoError = (\n state: AppState,\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n): AppState => {\n const key = keyFor(actionType, requestId ?? actionType);\n\n return R.dissocPath(['error', key], R.dissocPath(['loading', key], state));\n};\n","import { pathCombine } from '../core/api/module';\nimport React from 'react';\nimport * as R from 'ramda';\n\n\ntype AuthRoutes = {\n Login: string;\n ForgotPassword: string;\n AccountSetup: string;\n\n NewPassword: string;\n\n ChangePassword: string;\n ChangeSecurityQuestion: string;\n};\n\n\ntype StaticRoutes = {\n CopyrightStatic: string;\n PrivacyStatic: string;\n\n InviteEmailPreview: string;\n ApproverEmailPreview: string;\n RaterApprovalEmailPreview: string;\n SendEQScoresEmailPreview: string;\n};\n\n\ntype DevPlanRoutes = {\n // Dev Plan\n DevPlan: string;\n AddPlanItem: string;\n EditPlanItem: string;\n ViewPlanItem: string;\n DevResources_DevPlan: string;\n EmailDevPlanModal: string;\n DevPlanRemindersModal: string;\n\n // Dev Plan Collaboration\n Collaborator: string;\n CollaboratorDevPlan: string;\n CollaboratorViewPlanItem: string;\n CollaboratorCustomerService: string;\n};\n\n\ntype RaterApprovalRoutes = {\n RaterApproval: string;\n\n RaterApprovalLogin: string;\n RaterApprovalForgotPassword: string;\n RaterApprovalAccountSetup: string;\n\n RaterApprovalDashboard: string;\n RaterApprovalAccountConfig: string;\n RaterApprovalChangePassword: string;\n RaterApprovalChangeSecurityQuestion: string,\n RaterApprovalLanguage: string;\n RaterApprovalCustomerService: string;\n};\n\n\ntype ReportRecipientRoutes = {\n ReportRecipient: string;\n\n ReportRecipientLogin: string;\n ReportRecipientForgotPassword: string;\n ReportRecipientAccountSetup: string;\n\n ReportRecipientDashboard: string;\n ReportRecipientAccountConfig: string;\n ReportRecipientChangePassword: string;\n ReportRecipientChangeSecurityQuestion: string,\n\n ReportRecipientLanguage: string;\n ReportRecipientCustomerService: string;\n};\n\n\ntype FileDataRoutes = {\n FileDataDevelopmentPlan: string;\n FileDataDevelopmentTip: string;\n FileDataDocument: string;\n FileDataResource: string;\n};\n\n\nexport type Routes = AuthRoutes \n & StaticRoutes \n & DevPlanRoutes \n & RaterApprovalRoutes \n & ReportRecipientRoutes \n & FileDataRoutes & {\n\n Root: string;\n\n Copyright: string;\n Privacy: string;\n\n Project: string;\n SelectProject: string;\n DevResources: string;\n EBook: string;\n\n SetGoals: string;\n SelfSurvey: string;\n\n CreateSurvey: string;\n InviteRaters: string;\n SearchDirectory: string;\n RemindRatersProjDash: string;\n RemindRaters: string;\n FeedbackReport: string;\n\n ReportTutorial: string;\n CustomResource: string;\n Account: string;\n CustomerService: string;\n Language: string;\n\n YmcaLogin: string;\n YmcaSso: string;\n SamlLogin: string;\n SamlAssertion: string;\n SsoError: string;\n};\n\n\nexport const RouteTemplates: Routes = {\n Root: '**',\n Login: '**/login',\n ForgotPassword: '**/forgotPassword',\n AccountSetup: '**/accountSetup',\n NewPassword: '**/newPassword',\n ChangePassword: '**/project/:participantId/:projectId/changePassword',\n ChangeSecurityQuestion: '**/project/:participantId/:projectId/changeSecurityQuestion',\n Copyright: '**/copyright',\n Privacy: '**/privacy',\n CopyrightStatic: '**copyright.html',\n PrivacyStatic: '**privacy.html',\n InviteEmailPreview: '**/inviteEmailPreview.html',\n ApproverEmailPreview: '**/approverEmailPreview.html',\n RaterApprovalEmailPreview: '**/raterApprovalEmailPreview.html',\n SendEQScoresEmailPreview: '**/sendEQScoresEmailPreview.html',\n Project: '**/project/:participantId/:projectId',\n SelectProject: '**/project/:participantId/:projectId/selectProject',\n DevResources: '**/project/:participantId/:projectId/devResources',\n EBook: '**/project/:participantId/:projectId/eBook',\n SetGoals: '**/project/:participantId/:projectId/setGoals',\n SelfSurvey: '**/project/:participantId/:projectId/selfSurvey',\n DevPlan: '**/project/:participantId/:projectId/developmentPlan',\n EmailDevPlanModal: '**/project/:participantId/:projectId/developmentPlan/emailDevPlan',\n DevPlanRemindersModal: '**/project/:participantId/:projectId/developmentPlan/emailReminders',\n AddPlanItem: '**/project/:participantId/:projectId/developmentPlan/addPlanItem',\n EditPlanItem: '**/project/:participantId/:projectId/developmentPlan/editPlanItem/:itemId',\n ViewPlanItem: '**/project/:participantId/:projectId/developmentPlan/planItem/:itemId',\n DevResources_DevPlan: '**/project/:participantId/:projectId/developmentPlan/planItem/:itemId/devResources',\n Collaborator: '**/collaborator/:participantId/:projectId',\n CollaboratorDevPlan: '**/collaborator/:participantId/:projectId/developmentPlan',\n CollaboratorViewPlanItem: '**/collaborator/:participantId/:projectId/developmentPlan/planItem/:itemId',\n CollaboratorCustomerService: '**/collaborator/:participantId/:projectId/customerService',\n CreateSurvey: '**/project/:participantId/:projectId/createSurvey',\n InviteRaters: '**/project/:participantId/:projectId/inviteRaters',\n SearchDirectory: '**/project/:participantId/:projectId/searchDirectory',\n RemindRatersProjDash: '**/project/:participantId/:projectId/remindRaters',\n RemindRaters: '**/project/:participantId/:projectId/inviteRaters/remindRaters',\n FeedbackReport: '**/project/:participantId/:projectId/feedbackReport',\n ReportTutorial: '**/project/:participantId/:projectId/reportTutorial',\n CustomResource: '**/project/:participantId/:projectId/resource',\n Account: '**/project/:participantId/:projectId/account',\n CustomerService: '**/project/:participantId/:projectId/customerService',\n Language: '**/project/:participantId/:projectId/language',\n YmcaLogin: '**/ymca/login',\n YmcaSso: '**/ymca/sso',\n SamlLogin: '**/saml/login',\n SamlAssertion: '**/saml/assertion',\n SsoError: '**/sso/error',\n RaterApproval: '**/raterApproval',\n RaterApprovalLogin: '**/raterApproval/login',\n RaterApprovalForgotPassword: '**/raterApproval/forgotPassword',\n RaterApprovalAccountSetup: '**/raterApproval/accountSetup',\n RaterApprovalDashboard: '**/raterApproval/dashboard/:participantId/:projectId',\n RaterApprovalAccountConfig: '**/raterApproval/dashboard/:participantId/:projectId/account',\n RaterApprovalChangePassword: '**/raterApproval/dashboard/:participantId/:projectId/changePassword',\n RaterApprovalChangeSecurityQuestion: '**/raterApproval/dashboard/:participantId/:projectId/changeSecurityQuestion',\n RaterApprovalLanguage: '**/raterApproval/dashboard/:participantId/:projectId/language',\n RaterApprovalCustomerService: '**/raterApproval/dashboard/:participantId/:projectId/customerService',\n ReportRecipient: '**/reportRecipient',\n ReportRecipientLogin: '**/reportRecipient/login',\n ReportRecipientForgotPassword: '**/reportRecipient/forgotPassword',\n ReportRecipientAccountSetup: '**/reportRecipient/accountSetup',\n ReportRecipientDashboard: '**/reportRecipient/dashboard',\n ReportRecipientAccountConfig: '**/reportRecipient/dashboard/account',\n ReportRecipientChangePassword: '**/reportRecipient/dashboard/changePassword',\n ReportRecipientChangeSecurityQuestion: '**/reportRecipient/dashboard/changeSecurityQuestion',\n ReportRecipientLanguage: '**/reportRecipient/dashboard/language',\n ReportRecipientCustomerService: '**/reportRecipient/dashboard/customerService',\n FileDataDevelopmentPlan: '**/developmentPlans/:fileName',\n FileDataDevelopmentTip: '**/developmentTips/:fileName',\n FileDataDocument: '**/documents/:fileName',\n FileDataResource: '**/resources/:fileName',\n};\n\n\nexport const getAppRoot = (\n win: Window,\n): string => win.location\n .href // 'https://www.google.com/foo/bar/baz'\n .split(win.location.origin) // ['', '/foo/bar/baz']\n .filter(segment => !!segment)[0] // '/foo/bar/baz'\n .split('/') // ['', 'foo', 'bar', 'baz']\n .filter(segment => !!segment)[0] || ''; // 'foo'\n\n\nexport const makeRoutes = R.memoizeWith(\n (...rest: any[]) => rest.join(),\n (\n participantId: string | number = ':participantId',\n projectId: string | number = ':projectId',\n devPlanItemId: string | number = ':itemId',\n fileName: string = ':fileName',\n ) => {\n const root = getAppRoot(window);\n\n const project = pathCombine('/project', participantId, projectId);\n\n const collaborator = pathCombine('/collaborator', participantId, projectId);\n\n // `participantId` works differently in the rater flow from the survey portal flow.\n // The logged-in user is an approver in this flow, and participants are simply other users\n // for whom the approver has been designated to approve raters. (Note that an approver can also\n // be asked to approve raters for more than one project for the same participant, each of which\n // will be represented by a distinct path containing the same `participantId`.\n const raterApprovalDash = pathCombine('/raterApproval/dashboard', participantId, projectId);\n\n return {\n Root: root,\n Login: '/login',\n ForgotPassword: '/forgotPassword',\n AccountSetup: '/accountSetup',\n\n NewPassword: '/newPassword',\n\n ChangePassword: pathCombine(project, '/changePassword'),\n ChangeSecurityQuestion: pathCombine(project, '/changeSecurityQuestion'),\n\n Copyright: '/copyright',\n Privacy: '/privacy',\n\n CopyrightStatic: 'copyright.html',\n PrivacyStatic: 'privacy.html',\n\n InviteEmailPreview: pathCombine('/', root, '/inviteEmailPreview.html'),\n ApproverEmailPreview: pathCombine('/', root, '/approverEmailPreview.html'),\n RaterApprovalEmailPreview: pathCombine('/', root, '/raterApprovalEmailPreview.html'),\n SendEQScoresEmailPreview: pathCombine('/', root, '/sendEQScoresEmailPreview.html'),\n\n Project: project,\n SelectProject: pathCombine(project, '/selectProject'),\n DevResources: pathCombine(project, 'devResources'),\n EBook: pathCombine(project, '/eBook'),\n\n SetGoals: pathCombine(project, '/setGoals'),\n SelfSurvey: pathCombine(project, '/selfSurvey'),\n\n // Dev Plan\n DevPlan: pathCombine(project, '/developmentPlan'),\n EmailDevPlanModal: pathCombine(project, `/developmentPlan/emailDevPlan`),\n DevPlanRemindersModal: pathCombine(project, `/developmentPlan/emailReminders`),\n AddPlanItem: pathCombine(project, '/developmentPlan/addPlanItem'),\n EditPlanItem: pathCombine(project, `/developmentPlan/editPlanItem/${devPlanItemId}/`),\n ViewPlanItem: pathCombine(project, `/developmentPlan/planItem/${devPlanItemId}/`),\n DevResources_DevPlan: pathCombine(project, `/developmentPlan/planItem/${devPlanItemId}/`, 'devResources'),\n\n // Dev Plan Collaboration\n Collaborator: collaborator,\n CollaboratorDevPlan: pathCombine(collaborator, '/developmentPlan'),\n CollaboratorViewPlanItem: pathCombine(collaborator, `/developmentPlan/planItem/${devPlanItemId}/`),\n CollaboratorCustomerService: pathCombine(collaborator, '/customerService'),\n\n CreateSurvey: pathCombine(project, '/createSurvey'),\n InviteRaters: pathCombine(project, '/inviteRaters'),\n SearchDirectory: pathCombine(project, '/searchDirectory'),\n\n RemindRatersProjDash: pathCombine(project, '/remindRaters'),\n RemindRaters: pathCombine(project, '/inviteRaters/remindRaters'),\n\n FeedbackReport: pathCombine(project, '/feedbackReport'),\n\n ReportTutorial: pathCombine(project, '/reportTutorial'),\n CustomResource: pathCombine(project, '/resource'),\n Account: pathCombine(project, '/account'),\n CustomerService: pathCombine(project, '/customerService'),\n Language: pathCombine(project, '/language'),\n\n YmcaLogin: '/ymca/login',\n YmcaSso: '/ymca/sso',\n SamlLogin: '/saml/login',\n SamlAssertion: '/saml/assertion',\n SsoError: '/sso/error',\n\n RaterApproval: '/raterApproval',\n\n RaterApprovalLogin: '/raterApproval/login',\n RaterApprovalForgotPassword: '/raterApproval/forgotPassword',\n RaterApprovalAccountSetup: '/raterApproval/accountSetup',\n\n RaterApprovalDashboard: raterApprovalDash,\n RaterApprovalAccountConfig: pathCombine(raterApprovalDash, '/account'),\n RaterApprovalChangePassword: pathCombine(raterApprovalDash, '/changePassword'),\n RaterApprovalChangeSecurityQuestion: pathCombine(raterApprovalDash, '/changeSecurityQuestion'),\n RaterApprovalLanguage: pathCombine(raterApprovalDash, '/language'),\n RaterApprovalCustomerService: pathCombine(raterApprovalDash, '/customerService'),\n\n ReportRecipient: '/reportRecipient',\n\n ReportRecipientLogin: '/reportRecipient/login',\n ReportRecipientForgotPassword: '/reportRecipient/forgotPassword',\n ReportRecipientAccountSetup: '/reportRecipient/accountSetup',\n\n ReportRecipientDashboard: '/reportRecipient/dashboard',\n ReportRecipientAccountConfig: '/reportRecipient/dashboard/account',\n ReportRecipientChangePassword: '/reportRecipient/dashboard/changePassword',\n ReportRecipientChangeSecurityQuestion: '/reportRecipient/dashboard/changeSecurityQuestion',\n ReportRecipientLanguage: '/reportRecipient/dashboard/language',\n ReportRecipientCustomerService: '/reportRecipient/dashboard/customerService',\n\n FileDataDevelopmentPlan: `/developmentPlans/${fileName}`,\n FileDataDevelopmentTip: `/developmentTips/${fileName}`,\n FileDataDocument: `/documents/${fileName}`,\n FileDataResource: `/resources/${fileName}`,\n };\n },\n);\n\n\nexport const useRoutes = (\n participantId: string | number = ':participantId',\n projectId: string | number = ':projectId',\n devPlanItemId: string | number = ':itemId',\n fileName: string | undefined = ':fileName',\n): Routes => React.useMemo(\n () => makeRoutes(participantId, projectId, devPlanItemId, fileName),\n [projectId, participantId, devPlanItemId, fileName],\n);\n","import { pathCombine } from './module';\nimport { IS_DEV_ENV, IS_TEST_ENV } from '../windowProps';\nimport { getAppRoot } from '../../navigation/routes';\n\n\nexport const BaseUrl = IS_DEV_ENV || IS_TEST_ENV\n ? 'https://staging.truscore.com/newportal/api/'\n : pathCombine(window.location.origin, getAppRoot(window), '/api/');\n// : 'https://staging.truscore.com/newportal/api/'; // For testing prod builds on localhost\n// : 'https://localhost:44371/'; // For testing entirely local\n\n\nexport const Endpoints = {\n Config: pathCombine(BaseUrl, 'config/configSettings'),\n FeatureFlags: pathCombine(BaseUrl, 'config/featureFlags'),\n ShowLoginAnnouncement: pathCombine(BaseUrl, 'config/showLoginAnnouncement'),\n\n //I18n\n TranslatedLanguages: pathCombine(BaseUrl, 'language', 'translated'),\n PortalMessages: pathCombine(BaseUrl, 'message', 'portal'),\n\n ProjectLanguages: pathCombine(BaseUrl, 'language', 'project'),\n ProjectMessages: pathCombine(BaseUrl, 'message', 'project'),\n AllLanguages: pathCombine(BaseUrl, 'language', 'all'),\n\n //Login\n Authenticate: pathCombine(BaseUrl, 'user', 'authenticate'),\n AuthenticateBX: pathCombine(BaseUrl, 'user', 'authenticateBX'),\n AuthenticateTalentSmart: pathCombine(BaseUrl, 'user', 'authenticateTalentSmart'),\n SecurityQuestionKeys: pathCombine(BaseUrl, 'message', 'securityQuestionKeys'),\n GetSecurityQuestion: pathCombine(BaseUrl, 'user', 'getsecurityquestion'),\n SendPortalForgotPassword: pathCombine(BaseUrl, 'email', 'sendPortalForgotPassword'),\n SendRaterApprovalForgotPassword: pathCombine(BaseUrl, 'email', 'sendRaterApprovalForgotPassword'),\n SendReportRecipientForgotPassword: pathCombine(BaseUrl, 'email', 'sendReportRecipientForgotPassword'),\n UpdateSecurityQuestion: pathCombine(BaseUrl, 'user', 'updatesecurityquestion'),\n UpdatePassword: pathCombine(BaseUrl, 'user', 'updatePassword'),\n PasswordRequirements: pathCombine(BaseUrl, 'message', 'passwordRequirements'),\n\n // Project\n Projects: pathCombine(BaseUrl, 'project', 'portalProjects'),\n ProjectSummary: pathCombine(BaseUrl, '/project/participantProject'),\n ParticipantRequirements: pathCombine(BaseUrl, '/participant/requirements'),\n ProjectResources: pathCombine(BaseUrl, '/project/customResources'),\n ProjectId: pathCombine(BaseUrl, '/project/projectId'),\n UpdateConfidentiality: pathCombine(BaseUrl, '/participant/updateConfidentiality'),\n DevResources: pathCombine(BaseUrl, '/project/developmentResources'),\n CurrentStatus: pathCombine(BaseUrl, '/project/currentStatus'),\n ProjectCSContact: pathCombine(BaseUrl, '/customerSupport/contactInfo'),\n GetEBookUrl: pathCombine(BaseUrl, '/eBook/eBookUrl'),\n CreateReassessmentRater: pathCombine(BaseUrl, '/report/createReassessmentRater'),\n\n // Rater\n AddRaterByEmail: pathCombine(BaseUrl, '/rater/addRaterByEmail'),\n AddRaterById: pathCombine(BaseUrl, '/rater/addRaterById'),\n ParticipantRaters: pathCombine(BaseUrl, '/rater/participantRaters'),\n PreviousRaters: pathCombine(BaseUrl, '/rater/previousRaters'),\n DirectoryRaters: pathCombine(BaseUrl, '/rater/directoryRaters'),\n UpdateInviteData: pathCombine(BaseUrl, '/rater/updateInviteData'),\n InviteEmailPreview: pathCombine(BaseUrl, '/email/inviteBodyPreview'),\n ApproverEmailPreview: pathCombine(BaseUrl, '/email/approverBodyPreview'),\n SendInvitations: pathCombine(BaseUrl, '/email/sendInvitations'),\n SendReminders: pathCombine(BaseUrl, '/email/sendReminders'),\n RaterLevels: pathCombine(BaseUrl, '/rater/raterLevels'),\n DeleteRater: pathCombine(BaseUrl, '/rater/deleteRater'),\n EditRater: pathCombine(BaseUrl, '/rater/updateRater'),\n SetApprover: pathCombine(BaseUrl, '/rater/updateApprover'),\n SendForApproval: pathCombine(BaseUrl, '/email/sendApprover'),\n UndeliveredEmails: pathCombine(BaseUrl, '/rater/undeliveredEmails'),\n\n // Rater Approval\n RaterApprovalParticipants: pathCombine(BaseUrl, '/participant/raterApprovalParticipants'),\n RaterApprovalRaters: pathCombine(BaseUrl, '/rater/raterApprovalRaters'),\n SendRaterApproval: pathCombine(BaseUrl, '/email/sendApproval'),\n UpdateApprovalStatus: pathCombine(BaseUrl, '/rater/updateApprovalStatus'),\n RaterApprovalEmailPreview: pathCombine(BaseUrl, '/email/approvalBodyPreview'),\n AddRaterByEmailAsApprover: pathCombine(BaseUrl, '/rater/addRaterByEmailAsApprover'),\n\n // Set Goals\n GoalsAnswers: pathCombine(BaseUrl, '/setGoal/getGoals'),\n SetGoalAnswer: pathCombine(BaseUrl, '/setGoal/saveAnswer'),\n SendGoals: pathCombine(BaseUrl, '/email/sendGoals'),\n\n //SSO\n YmcaLogin: pathCombine(BaseUrl, '/ymca/login'),\n IsSso: pathCombine(BaseUrl, '/sso/isSso'),\n SamlLogin: pathCombine(BaseUrl, '/sso/login'),\n SamlAssertion: pathCombine(BaseUrl, '/sso/getUser'),\n\n // Create Survey\n GetSelectedQuestions: pathCombine(BaseUrl, '/createSurvey/getSelectedQuestions'),\n AddQuestion: pathCombine(BaseUrl, '/createSurvey/addQuestion'),\n AddQuestionsForCompetency: pathCombine(BaseUrl, '/createSurvey/addQuestionsForCompetency'),\n DeleteQuestion: pathCombine(BaseUrl, '/createSurvey/deleteQuestion'),\n DeleteQuestionsForCompetency: pathCombine(BaseUrl, '/createSurvey/deleteQuestionsForCompetency'),\n GetCompetenciesAndQuestions: pathCombine(BaseUrl, '/createSurvey/getCompetenciesAndQuestions'),\n ApplyPendingChanges: pathCombine(BaseUrl, '/createSurvey/applyPendingChanges'),\n UnsetCreatedSurvey: pathCombine(BaseUrl, '/createSurvey/unsetCreatedSurvey'),\n\n // Dev Plan\n GetDevPlanItems: pathCombine(BaseUrl, '/developmentPlan/items'),\n GetDevPlanActions: pathCombine(BaseUrl, '/developmentPlan/actions'),\n GetDevPlanFieldsAndAnswers: pathCombine(BaseUrl, '/developmentPlan/fieldsAndAnswers'),\n AddDevPlanItem: pathCombine(BaseUrl, '/developmentPlan/addDevPlanItem'),\n AddDevPlanAction: pathCombine(BaseUrl, '/developmentPlan/addDevPlanAction'),\n DeleteDevPlanItem: pathCombine(BaseUrl, '/developmentPlan/deleteDevPlanItem'),\n DeleteDevPlanAction: pathCombine(BaseUrl, '/developmentPlan/deleteDevPlanAction'),\n UpdateDevPlanItemDescription: pathCombine(BaseUrl, '/developmentPlan/updateItemDescription'),\n UpdateDevPlanItemTitle: pathCombine(BaseUrl, '/developmentPlan/updateItemTitle'),\n UpdateDevPlanActionCompleteByDate: pathCombine(BaseUrl, '/developmentPlan/updateActionCompleteBy'),\n UpdateDevPlanActionStatus: pathCombine(BaseUrl, '/developmentPlan/updateActionStatus'),\n UpdateDevPlanFieldAnswer: pathCombine(BaseUrl, '/developmentPlan/updateFieldAnswer'),\n GetStatusKeys: pathCombine(BaseUrl, '/developmentPlan/statusKeys'),\n SetRemindersOn: pathCombine(BaseUrl, '/developmentPlan/updateRemindersOn'),\n GetRemindersOn: pathCombine(BaseUrl, '/developmentPlan/getRemindersOn'),\n SendDevPlan: pathCombine(BaseUrl, '/email/sendDevPlan'),\n GetDevActionListItems: pathCombine(BaseUrl, '/developmentPlan/getDevActionListItems'),\n UpdateFieldAnswerList: pathCombine(BaseUrl, '/developmentPlan/updateFieldAnswerList'),\n\n // Dev Plan Collaboration\n AuthenticateCollaborator: pathCombine(BaseUrl, '/collaboration/authenticateCollaborator'),\n DevPlanCollaborators: pathCombine(BaseUrl, '/collaboration/collaborators'),\n AddDevPlanCollaborator: pathCombine(BaseUrl, '/collaboration/addCollaborator'),\n SetDevPlanCollaboratorAccepted: pathCombine(BaseUrl, '/collaboration/updateAccepted'),\n DeleteDevPlanCollaborator: pathCombine(BaseUrl, '/collaboration/deleteCollaborator'),\n SendDevPlanCollaboratorInvite: pathCombine(BaseUrl, '/email/sendCollaborationInvite'),\n SendDevItemCommentNotification: pathCombine(BaseUrl, '/email/sendCollaboratorComment'),\n SendParticipantCommentNotification: pathCombine(BaseUrl, '/email/sendParticipantComment'),\n\n DevItemComments: pathCombine(BaseUrl, '/collaboration/comments'),\n AddDevItemComment: pathCombine(BaseUrl, '/collaboration/addComment'),\n UpdateDevItemComment: pathCombine(BaseUrl, '/collaboration/updateComment'),\n SetDevItemCommentsRead: pathCombine(BaseUrl, '/collaboration/updateCommentAsRead'),\n DeleteDevItemComment: pathCombine(BaseUrl, '/collaboration/deleteComment'),\n\n // View Reports\n ViewReports: pathCombine(BaseUrl, '/report/viewReportData'),\n ReportData: pathCombine(BaseUrl, '/report/reportData'),\n\n GetEQScores: pathCombine(BaseUrl, '/report/eqScores'),\n SendEQScores: pathCombine(BaseUrl, '/email/sendEQScores'),\n EQScoresEmailPreview: pathCombine(BaseUrl, '/email/eqScoresEmailBodyPreview'),\n\n // Report Recipient\n ReportRecipientProjects: pathCombine(BaseUrl, '/project/reportRecipientProjects'),\n ReportRecipientParticipants: pathCombine(BaseUrl, '/participant/reportRecipientParticipants'),\n ReportRecipientReports: pathCombine(BaseUrl, '/report/reportRecipientReports'),\n DeliverReports: pathCombine(BaseUrl, '/report/deliverReports'),\n DeliverReportsToRecipient: pathCombine(BaseUrl, '/report/deliverReportsToRecipient'),\n\n // Trace Logging\n LogInfo: pathCombine(BaseUrl, '/traceLog/logInfo'),\n};\n","import * as R from 'ramda';\nimport { Map } from './models';\n\n\ntype keyName = string | number;\n\n\n/**\n * Converts an array of objects to a map using one of the object's string properties as a key.\n *\n * @param objs - the array of objects to be added to the map\n * @param getKey - a function which selects the property to be used as a key; note that, if you wish to use a numeric or\n * other non-string type as your key, it must first be stringified\n */\nexport const toMap = (\n objs: T[],\n getKey: (obj: T) => string,\n): Map => objs.reduce(\n (running, next) => R.assoc(getKey(next), next, running),\n {},\n);\n\n\n/**\n * Converts an array of objects to a map using one of the object's string properties as a key. Each object keeps a\n * record of its position in the source array (via a `sourceIndex` property).\n *\n * @param objs - the array of objects to be added to the map\n * @param getKey - a function which selects the property to be used as a key; note that, if you wish to use a numeric or\n * other non-string type as your key, it must first be stringified\n */\nexport const toIndexAwareMap = (\n objs: T[],\n getKey: (obj: T) => string,\n): Map => objs.reduce(\n (running, next, index) => R.assoc(getKey(next), { ...next, sourceIndex: index }, running),\n {},\n);\n\n\n/**\n * Curried function that takes an array and an index, then returns the item in the array at that index. If the index is\n * out of bounds, instead of returning `undefined`, this function will loop back around on the array, basically returning\n * the item at the remainder index of the array.\n *\n * This is useful if e.g. you're mapping an indefinite array of items to a finite list of colors, and you want to wrap\n * back around to the first color when you run out of colors.\n */\nexport const loopIndex = (array: T[]) => (index: number): T => array[index % array.length];\n\n","import * as R from 'ramda';\nimport { ActionType } from '../core/redux/actionType';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../core/api/module';\nimport { Endpoints } from '../core/api/endpoints';\nimport { Message } from './models';\nimport { toMap } from '../language/arrays';\n\n\nconst KEY_ACTION = ActionType.LoadTranslationsRequest;\nconst ACTIONS = [\n ActionType.LoadTranslationsRequest,\n ActionType.LoadTranslationsResponse,\n ActionType.LoadTranslationsError,\n];\n\n\ntype Payload = Message[];\n\n\ntype Meta = {\n languageId: number;\n}\n\n\n/**\n * Dispatch this action to load the translations for the given language from the internet\n */\nexport const loadTranslationsAction = (appRoot: string, languageId: number) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.PortalMessages,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ languageId: languageId, root: appRoot }),\n types: makeRsaaTypes(ACTIONS, { languageId }),\n bailout: state => !!getLoading(state, KEY_ACTION, languageId),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION, action.meta.languageId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, action.meta.languageId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n const translations = toMap((payload || []), item => item.key);\n\n return R.assocPath(\n ['locale', 'translations', `${R.head(payload || [])?.languageId}`],\n translations,\n successState,\n );\n};\n\n\nexport const loadTranslationsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../core/redux/actionType';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../core/api/module';\nimport { Endpoints } from '../core/api/endpoints';\n\n\nconst KEY_ACTION = ActionType.LoadConfigRequest;\nconst ACTIONS = [\n ActionType.LoadConfigRequest,\n ActionType.LoadConfigResponse,\n ActionType.LoadConfigError,\n];\n\n\ntype Payload = string;\n\n\n/**\n * Dispatch this action to load the app's configuration\n */\nexport const loadConfigAction = () => makeApiAction({\n method: 'GET',\n endpoint: Endpoints.Config,\n headers: { 'accept': 'application/json' },\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assoc('config', JSON.parse(payload || ''), successState);\n};\n\n\nexport const loadConfigReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../core/redux/actionType';\nimport { ApiReducer, makeApiReducer, makeRsaaTypes, makeApiAction } from '../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../core/api/module';\nimport { Endpoints } from '../core/api/endpoints';\n\n\nconst KEY_ACTION = ActionType.LoadFeatureFlagsRequest;\nconst ACTIONS = [\n ActionType.LoadFeatureFlagsRequest,\n ActionType.LoadFeatureFlagsResponse,\n ActionType.LoadFeatureFlagsError,\n];\n\n\ntype Payload = string;\n\n\n/**\n * Dispatch this action to load the app's feature flags\n */\nexport const loadFeatureFlagsAction = () => makeApiAction({\n method: 'GET',\n endpoint: Endpoints.FeatureFlags,\n headers: { 'accept': 'application/json' },\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assoc('featureFlags', JSON.parse(payload || ''), successState);\n};\n\n\nexport const loadFeatureFlagsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../core/redux/actionType';\nimport { ApiReducer, makeApiReducer, makeRsaaTypes, makeApiAction } from '../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../core/api/module';\nimport { Endpoints } from '../core/api/endpoints';\n\n\nconst KEY_ACTION = ActionType.ShowLoginAnnouncementRequest;\nconst ACTIONS = [\n ActionType.ShowLoginAnnouncementRequest,\n ActionType.ShowLoginAnnouncementResponse,\n ActionType.ShowLoginAnnouncementError,\n];\n\n\ntype Payload = boolean;\n\n\n/*\n * Dispatch this action to load the app's feature flags\n */\nexport const showLoginAnnouncementAction = () => makeApiAction({\n method: 'GET',\n endpoint: Endpoints.ShowLoginAnnouncement,\n headers: { 'accept': 'application/json' },\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assoc('showLoginAnnouncement', payload, successState);\n};\n\n\nexport const showLoginAnnouncementReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { UserInfo } from '../../authState';\n\n\nconst KEY_ACTION = ActionType.LoginRequest;\nconst ACTIONS = [\n ActionType.LoginRequest,\n ActionType.LoginResponse,\n ActionType.LoginError,\n];\n\n\ntype Payload = UserInfo;\n\n\ntype Meta = {\n email: string;\n password: string;\n};\n\n\n/**\n * Dispatch this action to authenticate to the portal with user credentials\n * @param email - the email address associated with the account of the user attempting to authenticate\n * @param password - a secret string supplied by the user in support of their identity\n * @param checkSurveyPasskey - checks password against rater passkey\n */\nexport const loginAction = (\n email: string,\n password: string,\n checkSurveyPasskey: boolean) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.Authenticate,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ email: email, password: password, checkSurveyPasskey: checkSurveyPasskey }),\n types: makeRsaaTypes(ACTIONS, { email: email, password: password }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n const updatedUser = payload;\n updatedUser!.passwordUsed = action.meta.password;\n\n return R.assocPath([ 'auth', 'currentUser' ], updatedUser, successState);\n};\n\nexport const loginReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);","import { ActionType } from '../../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { UserInfo } from '../../authState';\n\n\nconst KEY_ACTION = ActionType.LoginTalentSmartRequest;\nconst ACTIONS = [\n ActionType.LoginTalentSmartRequest,\n ActionType.LoginTalentSmartResponse,\n ActionType.LoginTalentSmartError,\n];\n\n\ntype Payload = UserInfo;\n\n\ntype Meta = {\n auth: string;\n};\n\n\n/**\n * Dispatch this action to authenticate to the portal with user credentials\n * @param auth - an encrypted string containg email address and time stamp\n */\nexport const loginTalentSmartAction = (\n auth: string) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.AuthenticateTalentSmart,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ auth: auth }),\n types: makeRsaaTypes(ACTIONS, { auth: auth }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n const updatedUser = payload;\n updatedUser!.passwordUsed = updatedUser?.temporaryPasskey ?? ''; //TODO = pw handling for TSEQ?\n\n return R.assocPath([ 'auth', 'currentUser' ], updatedUser, successState);\n};\n\nexport const loginTalentSmartReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);","import { ActionType } from '../../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { UserInfo } from '../../authState';\n\n\nconst KEY_ACTION = ActionType.LoginBXRequest;\nconst ACTIONS = [\n ActionType.LoginBXRequest,\n ActionType.LoginBXResponse,\n ActionType.LoginBXError,\n];\n\n\ntype Payload = UserInfo;\n\n\ntype Meta = {\n email: string;\n projectId: string;\n logoutUrl: string;\n};\n\n\n/**\n * Dispatch this action to authenticate to the portal with user credentials\n * @param email - and encrypted string containg email address and time stamp\n * @param projectId - project id for report recipient\n * @param logoutUrl - redirect URL for logout\n */\nexport const loginBXAction = (\n email: string, projectId: string, logoutUrl: string) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.AuthenticateBX,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ email: email }),\n types: makeRsaaTypes(ACTIONS, { email: email, projectId: projectId, logoutUrl: logoutUrl }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n const updatedUser = payload;\n updatedUser!.passwordUsed = updatedUser?.temporaryPasskey ?? ''; //TODO = pw handling for BX?\n\n const withLogoutUrl = R.assocPath([ 'auth', 'logoutUrl' ], action.meta.logoutUrl, successState);\n const withProjId = R.assocPath([ 'auth', 'defaultRecipientProjectId' ], action.meta.projectId, withLogoutUrl);\n return R.assocPath([ 'auth', 'currentUser' ], updatedUser, withProjId);\n};\n\nexport const loginBXReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\n\n\nconst KEY_ACTION = ActionType.SecurityQuestionRequest;\nconst ACTIONS = [\n ActionType.SecurityQuestionRequest,\n ActionType.SecurityQuestionResponse,\n ActionType.SecurityQuestionError,\n];\n\ntype Payload = {\n securityQuestionId: number;\n securityAnswer: string;\n};\n\ntype Meta = {\n emailAddress: string;\n}\n\n/**\n * Dispatch this action to retrieve the user's security question (which they will have to answer in order to reset\n * their password)\n * @param emailAddress - the email address of the user whose security question we need to retrieve\n */\nexport const securityQuestionAction = (emailAddress: string) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.GetSecurityQuestion,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ email: emailAddress }),\n types: makeRsaaTypes(ACTIONS, { emailAddress: emailAddress }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['auth', 'passwordReset'], payload, successState);\n};\n\n\nexport const securityQuestionReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\n\n\nconst KEY_ACTION = ActionType.SendPortalPasswordResetEmailRequest;\nconst ACTIONS = [\n ActionType.SendPortalPasswordResetEmailRequest,\n ActionType.SendPortalPasswordResetEmailResponse,\n ActionType.SendPortalPasswordResetEmailError,\n];\n\ntype Payload = number;\n\ntype Meta = {\n emailAddress: string;\n languageId: number;\n};\n\n/**\n * Dispatch this action to send the user's answer to their security question (which is required in order to reset their\n * password) when attempting to log in from the survey participant portal\n *\n * @param emailAddress - the email address of the user attempting to answer the question\n * @param languageId - the database Id of the language in which the email should be sent\n */\nexport const sendPortalPasswordResetEmailAction = (\n emailAddress: string,\n languageId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.SendPortalForgotPassword,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ toAddress: emailAddress, languageId: languageId }),\n types: makeRsaaTypes(ACTIONS, { emailAddress: emailAddress, languageId: languageId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${emailAddress}-${languageId}`),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.emailAddress}-${action.meta.languageId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.dissocPath(['auth', 'passwordReset'], successState);\n};\n\nexport const sendPortalPasswordResetEmailReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\n\n\nconst KEY_ACTION = ActionType.SendRaterApprovalPasswordResetEmailRequest;\nconst ACTIONS = [\n ActionType.SendRaterApprovalPasswordResetEmailRequest,\n ActionType.SendRaterApprovalPasswordResetEmailResponse,\n ActionType.SendRaterApprovalPasswordResetEmailError,\n];\n\ntype Payload = number;\n\ntype Meta = {\n emailAddress: string;\n languageId: number;\n};\n\n/**\n * Dispatch this action to send the user's answer to their security question (which is required in order to reset their\n * password) when attempting to log in from the rater approval portal\n *\n * @param emailAddress - the email address of the user attempting to answer the question\n * @param languageId - the database Id of the language in which the email should be sent\n */\nexport const sendRaterApprovalPasswordResetEmailAction = (\n emailAddress: string,\n languageId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.SendRaterApprovalForgotPassword,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ toAddress: emailAddress, languageId: languageId }),\n types: makeRsaaTypes(ACTIONS, { emailAddress: emailAddress, languageId: languageId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${emailAddress}-${languageId}`),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.emailAddress}-${action.meta.languageId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.dissocPath(['auth', 'passwordReset'], successState);\n};\n\nexport const sendRaterApprovalPasswordResetEmailReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, makeApiReducer, ApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport { AppState } from '../../../core/redux/appState';\nimport * as R from 'ramda';\nimport { AuthState } from '../../authState';\n\n\nconst KEY_ACTION = ActionType.NewPasswordRequest;\nconst ACTIONS = [\n ActionType.NewPasswordRequest,\n ActionType.NewPasswordResponse,\n ActionType.NewPasswordError,\n];\n\n\ntype Payload = string;\n\n\n/**\n * Dispatch this action to submit and set the current user's self-selected new password\n *\n * @param password - an encrypted representation of the user's self-selected password\n */\nexport const newPasswordAction = (password: string) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.UpdatePassword,\n headers: {\n 'content-type': 'application/json',\n 'accept': 'application/json',\n },\n body: (state: AppState) => JSON.stringify({ userId: state.auth.currentUser?.userId, password: password }),\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n // The update password endpoint returns 200 on failure, but with an informative error message\n if (payload !== 'Success') {\n return addError(state, KEY_ACTION, payload || '');\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n const updatedAuth = R.mergeDeepRight(\n successState.auth,\n {\n passwordReset: undefined,\n passwordRequirementMessage: undefined,\n currentUser: {\n requirePasswordChange: false,\n passwordDigest: 'updated',\n },\n } as AuthState,\n );\n\n return R.assoc('auth', updatedAuth, successState);\n};\n\n\nexport const newPasswordReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport { AppState } from '../../../core/redux/appState';\n\n\nconst KEY_ACTION = ActionType.CreateSecurityChallengeRequest;\nconst ACTIONS = [\n ActionType.CreateSecurityChallengeRequest,\n ActionType.CreateSecurityChallengeResponse,\n ActionType.CreateSecurityChallengeError,\n];\n\n\ntype Payload = string;\n\ntype Meta = {\n securityQuestionId: number;\n securityAnswer: string;\n}\n\n\n/**\n * Dispatch this action to set a new security question/answer pair for the current user.\n * TODO: implement hashing once hashed answers are by the API\n *\n * @param questionId The database Id of the question selected by the user\n * @param answer A cryptographically hashed representation of the user's answer to their security question\n */\nexport const createSecurityChallengeAction = (\n questionId: number,\n answer: string,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.UpdateSecurityQuestion,\n headers: { 'content-type': 'application/json' },\n body: (state: AppState) => JSON.stringify({\n userId: state.auth.currentUser?.userId,\n questionId: questionId,\n answer: answer,\n }),\n types: makeRsaaTypes(ACTIONS, { securityQuestionId: questionId, securityAnswer: answer }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(\n ['auth', 'currentUser', 'securityQuestionId'],\n action.meta.securityQuestionId,\n R.assocPath(['auth', 'currentUser', 'securityAnswer'], action.meta.securityAnswer, successState),\n );\n};\n\n\nexport const createSecurityChallengeReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../core/api/rsaa';\nimport { Endpoints } from '../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../core/api/module';\nimport * as R from 'ramda';\nimport { Project } from './models';\n\n\nconst KEY_ACTION = ActionType.LoadProjectsRequest;\nconst ACTIONS = [\n ActionType.LoadProjectsRequest,\n ActionType.LoadProjectsResponse,\n ActionType.LoadProjectsError,\n];\n\n\ntype Payload = Project[];\ntype Meta = { personId: number; };\n\n\n/**\n * Dispatch this action to load the list of projects associated with a specific person\n */\nexport const loadProjectsAction = (personId: number) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.Projects,\n headers: { 'content-type': 'application/json' },\n body: (state) => (JSON.stringify({ personId: personId, languageId: state.locale.lang.languageId})),\n types: makeRsaaTypes(ACTIONS, { personId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assoc('projects', payload, successState);\n};\n\n\nexport const loadProjectsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport * as R from 'ramda';\n\n\nconst KEY_ACTION = ActionType.SecurityQuestionKeysRequest;\nconst ACTIONS = [\n ActionType.SecurityQuestionKeysRequest,\n ActionType.SecurityQuestionKeysResponse,\n ActionType.SecurityQuestionKeysError,\n];\n\n\ntype SecurityQuestionKey = {\n key: string;\n questionId: number;\n}\n\n\ntype Payload = SecurityQuestionKey[];\n\n\n/**\n * Dispatch this action to retrieve the user's security question (which they will have to answer in order to reset\n * their password)\n * @param emailAddress - the email address of the user whose security question we need to retrieve\n */\nexport const securityQuestionKeysAction = makeApiAction({\n method: 'POST',\n endpoint: Endpoints.SecurityQuestionKeys,\n headers: { 'content-type': 'application/json' },\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['auth', 'securityQuestionKeys'], payload, successState);\n};\n\n\nexport const securityQuestionKeysReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../core/api/module';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { Message } from '../../localization/models';\n\n\nconst KEY_ACTION = ActionType.ProjectTranslationsRequest;\nconst ACTIONS = [\n ActionType.ProjectTranslationsRequest,\n ActionType.ProjectTranslationsResponse,\n ActionType.ProjectTranslationsError,\n];\n\n\ntype Payload = Message[];\n\ntype Meta = {\n language: number;\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to load the project-specific translations/messages for the given language from the internet\n */\nexport const loadProjMsgsAction = (language: number, projectId: number) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.ProjectMessages,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ languageId: language, projectId: projectId }),\n types: makeRsaaTypes(ACTIONS, { language: language, projectId: projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${projectId}-${language}`),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const requestId = `${action.meta.projectId}-${action.meta.language}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, requestId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, requestId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, requestId);\n\n const translations = (payload || []).reduce((running, next) => R.assoc(next.key, next, running), {});\n\n return R.assocPath(['projectMsgs', action.meta.language], translations, successState);\n};\n\n\nexport const loadProjMsgsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../core/api/module';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { Language } from '../../localization/models';\n\n\nconst KEY_ACTION = ActionType.ProjectLanguagesRequest;\nconst ACTIONS = [\n ActionType.ProjectLanguagesRequest,\n ActionType.ProjectLanguagesResponse,\n ActionType.ProjectLanguagesError,\n];\n\n\ntype Payload = Language[];\n\ntype Meta = {\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to load the translations for the given language from the internet\n */\nexport const projectLanguagesAction = (projectId: number) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.ProjectLanguages,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ projectId: projectId }),\n types: makeRsaaTypes(ACTIONS, { projectId: projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, projectId),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION, action.meta.projectId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, action.meta.projectId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, action.meta.projectId);\n\n return R.assocPath(['projectLanguages', `${action.meta.projectId}`], payload, successState);\n};\n\n\nexport const projectLanguagesReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, makeApiReducer, ApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport { AppState } from '../../../core/redux/appState';\n\n\nconst KEY_ACTION = ActionType.PasswordRequirementMessageRequest;\nconst ACTIONS = [\n ActionType.PasswordRequirementMessageRequest,\n ActionType.PasswordRequirementMessageResponse,\n ActionType.PasswordRequirementMessageError,\n];\n\n\ntype Payload = string;\n\n\n/**\n * Dispatch this action to submit and set the current user's self-selected new password\n */\nexport const passwordRequirementMessageAction = makeApiAction({\n method: 'POST',\n endpoint: Endpoints.PasswordRequirements,\n headers: {\n 'content-type': 'application/json',\n 'accept': 'application/json',\n },\n body: (state: AppState) => JSON.stringify({\n userId: state.auth.currentUser?.userId,\n languageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['auth', 'passwordRequirementMessage'], payload, successState);\n};\n\n\nexport const passwordRequirementMessageReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../core/redux/actionType';\nimport { Language } from './models';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../core/api/rsaa';\nimport { Endpoints } from '../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../core/api/module';\nimport * as R from 'ramda';\nimport { toMap } from '../language/arrays';\n\n\nconst KEY_ACTION = ActionType.PortalLanguagesRequest;\nconst ACTIONS = [\n ActionType.PortalLanguagesRequest,\n ActionType.PortalLanguagesResponse,\n ActionType.PortalLanguagesError,\n];\n\n\ntype Payload = Language[];\n\n\n/**\n * Dispatch this action to retrieve the user's security question (which they will have to answer in order to reset\n * their password)\n * @param emailAddress - the email address of the user whose security question we need to retrieve\n */\nexport const portalLanguagesAction = makeApiAction({\n method: 'POST',\n endpoint: Endpoints.TranslatedLanguages,\n headers: { 'content-type': 'application/json' },\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n const languages = toMap((payload || []), lang => lang.code);\n\n return R.assocPath(\n ['locale', 'portalLanguages'],\n languages,\n successState,\n );\n};\n\n\nexport const portalLanguagesReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../core/redux/actionType';\nimport { Language } from './models';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../core/api/rsaa';\nimport { Endpoints } from '../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../core/api/module';\nimport * as R from 'ramda';\n\n\nconst KEY_ACTION = ActionType.AllLanguagesRequest;\nconst ACTIONS = [\n ActionType.AllLanguagesRequest,\n ActionType.AllLanguagesResponse,\n ActionType.AllLanguagesError,\n];\n\n\ntype Payload = Language[];\n\n\n/**\n * Dispatch this action to retrieve the user's security question (which they will have to answer in order to reset\n * their password)\n * @param emailAddress - the email address of the user whose security question we need to retrieve\n */\nexport const allLanguagesAction = makeApiAction({\n method: 'POST',\n endpoint: Endpoints.AllLanguages,\n headers: { 'content-type': 'application/json' },\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assoc('allLanguages', payload, successState);\n};\n\n\nexport const allLanguagesReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../core/api/rsaa';\nimport { Endpoints } from '../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../core/api/module';\nimport * as R from 'ramda';\nimport { ParticipantProject } from './models';\n\n\nconst KEY_ACTION = ActionType.LoadProjectSummaryRequest;\nconst ACTIONS = [\n ActionType.LoadProjectSummaryRequest,\n ActionType.LoadProjectSummaryResponse,\n ActionType.LoadProjectSummaryError,\n];\n\n\ntype Payload = ParticipantProject;\n\ntype Meta = {\n projectId: number,\n participantId: number,\n};\n\n\n/**\n * Dispatch this action to load a bunch of basic information about a specific project\n */\nexport const loadProjectSummaryAction = (\n projectId: number,\n participantId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.ProjectSummary,\n headers: { 'content-type': 'application/json' },\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n body: state => JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n languageId: state.locale.lang.languageId,\n }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assoc('projectSummary', payload, successState);\n};\n\n\nexport const loadProjectSummaryReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { Requirement } from '../models';\nimport { AppState } from '../../core/redux/appState';\n\n\nconst KEY_ACTION = ActionType.LoadParticipantRequirementsRequest;\nconst ACTIONS = [\n ActionType.LoadParticipantRequirementsRequest,\n ActionType.LoadParticipantRequirementsResponse,\n ActionType.LoadParticipantRequirementsError,\n];\n\n\ntype Payload = Requirement[];\n\ntype Meta = {\n projectId: number,\n participantId: number,\n};\n\n\n/**\n * Dispatch this action to load the set of requirements for project participants\n * e.g. do they have to do the self survey? How about the Development Plan?\n */\nexport const loadParticipantRequirementsAction = (\n projectId: number,\n participantId: number,\n languageId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.ParticipantRequirements,\n headers: { 'content-type': 'application/json' },\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n body: (state: AppState) => JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n languageId: state.locale.lang.languageId,\n },\n ),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assoc('participantRequirements', payload, successState);\n};\n\n\nexport const loadParticipantRequirementsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { ParticipantProject } from '../models';\n\n\nconst KEY_ACTION = ActionType.LoadProjectResourcesRequest;\nconst ACTIONS = [\n ActionType.LoadProjectResourcesRequest,\n ActionType.LoadProjectResourcesResponse,\n ActionType.LoadProjectResourcesError,\n];\n\n\ntype Payload = ParticipantProject;\n\ntype Meta = {\n projectId: number,\n};\n\n\n/**\n * Dispatch this action to load an index of project resources (basically, educational content for how to use TruScore\n * for this specific project)\n */\nexport const loadProjectResourcesAction = (\n projectId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.ProjectResources,\n headers: { 'content-type': 'application/json' },\n types: makeRsaaTypes(ACTIONS, { projectId }),\n body: state => JSON.stringify({\n projectId: projectId,\n languageId: state.locale.lang.languageId,\n }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assoc('projectResources', payload, successState);\n};\n\n\nexport const loadProjectResourcesReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { Rater } from './models';\nimport { AppState } from '../../../core/redux/appState';\nimport { toMap } from '../../../language/arrays';\n\n\nconst KEY_ACTION = ActionType.AddRaterByEmailRequest;\nconst ACTIONS = [\n ActionType.AddRaterByEmailRequest,\n ActionType.AddRaterByEmailResponse,\n ActionType.AddRaterByEmailError,\n];\n\n\ntype Payload = Rater;\n\n\ntype Meta = {\n email: string;\n projectId: number;\n};\n\n\n/**\n * Dispatch this to associate a new rater with the specified project\n *\n * @param projectId - the database Id for the project to which this person should be added\n * @param participantId - the database Id for the participant to be rated\n * @param levelId - the rater's permissions level\n * @param email - the rater's email address\n * @param firstName - the rater's first name\n * @param lastName - the rater's last name\n */\nexport const addRaterByEmailAction = (\n projectId: number,\n participantId: number,\n levelId: number,\n email: string,\n firstName: string,\n lastName: string,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.AddRaterByEmail,\n headers: { 'content-type': 'application/json' },\n body: (state: AppState) => JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n levelId: levelId,\n email: email,\n firstName: firstName,\n lastName: lastName,\n pageLanguageId: state.locale.lang.languageId,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n email: email,\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${email}-${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const email = action.meta.email;\n const projectId = action.meta.projectId;\n const metaTag = `${email}-${projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const requirements = toMap(successState.participantRequirements || [], req => `${req.surveyLevelId}`);\n\n const requirementToUpdate = requirements[payload?.levelId ?? -1];\n\n const withRaterAdded = R.assocPath(\n ['projectRaters', `${payload!.projectId}`, `${payload!.raterId}`],\n payload,\n successState,\n );\n\n if (!requirementToUpdate) {\n return withRaterAdded;\n }\n\n const ratersWithUpdatedCount = R.assocPath(\n [`${payload?.levelId}`, 'raterCount'],\n requirementToUpdate.raterCount + 1,\n requirements,\n );\n\n return R.assoc('participantRequirements', Object.values(ratersWithUpdatedCount), withRaterAdded);\n};\n\nexport const addRaterByEmailReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { Rater } from './models';\nimport { AppState } from '../../../core/redux/appState';\nimport { toMap } from '../../../language/arrays';\n\n\nconst KEY_ACTION = ActionType.AddRaterByIdRequest;\nconst ACTIONS = [\n ActionType.AddRaterByIdRequest,\n ActionType.AddRaterByIdResponse,\n ActionType.AddRaterByIdError,\n];\n\n\ntype Payload = Rater;\n\n\ntype Meta = {\n raterId: number;\n projectId: number;\n};\n\n\n/**\n * Dispatch this associate a new rater with the specified project\n *\n * @param projectId - the database Id for the project to which this person should be added\n * @param participantId - the rater's participant Id\n * @param raterId - the rater's database Id\n * @param levelId - the rater's permissions level\n */\nexport const addRaterByIdAction = (\n projectId: number,\n participantId: number,\n raterId: number,\n levelId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.AddRaterById,\n headers: { 'content-type': 'application/json' },\n body: (state: AppState) => JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n raterId: raterId,\n levelId: levelId,\n pageLanguageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(\n ACTIONS,\n {\n raterId: raterId,\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${raterId}-${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.raterId}-${action.meta.projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const requirements = toMap(successState.participantRequirements || [], req => `${req.surveyLevelId}`);\n const requirementToUpdate = requirements[payload!.levelId];\n\n const withRaterAdded = R.assocPath(\n ['projectRaters', `${payload!.projectId}`, `${payload!.raterId}`],\n payload,\n successState,\n );\n\n if (!requirementToUpdate) {\n return withRaterAdded;\n }\n\n const ratersWithUpdatedCount = R.assocPath(\n [`${payload?.levelId}`, 'raterCount'],\n requirementToUpdate.raterCount + 1,\n requirements,\n );\n\n return R.assoc('participantRequirements', Object.values(ratersWithUpdatedCount), withRaterAdded);\n};\n\nexport const addRaterByIdReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { Rater } from './models';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { makeRsaaTypes, makeApiAction, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { AppState } from '../../../core/redux/appState';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { toMap } from '../../../language/arrays';\n\n\nconst KEY_ACTION = ActionType.ParticipantRatersRequest;\nconst ACTIONS = [\n ActionType.ParticipantRatersRequest,\n ActionType.ParticipantRatersResponse,\n ActionType.ParticipantRatersError,\n];\n\n\ntype Payload = Rater[];\n\n\ntype Meta = {\n projectId: number;\n}\n\n\n/**\n * Dispatch this action to retrieve all raters associated with the provided project (and assigned to rate the provided\n * participant).\n *\n * @param projectId - the database Id for the project for which we're retrieving raters\n * @param participantId - the database Id for the specific project participant whose raters we're retrieving\n */\nexport const participantRatersAction = (projectId: number, participantId: number) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.ParticipantRaters,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n languageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const mappedRaters = !!payload ? toMap(payload, rater => `${rater.raterId}`) : undefined;\n\n return R.assocPath(['projectRaters', `${action.meta.projectId}`], mappedRaters, successState);\n};\n\nexport const participantRatersReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\n\n// Only things that you wish were part of the standard JS API!\n// If your code references a single domain concept, it can't go in this folder!\n\n/**\n * Returns whether or not the two arguments are strictly equal (which, in the case of objects, means referential\n * equality) AKA `===` equality\n */\nexport const strictEquals = (one: any, two: any): boolean => one === two;\n\n/**\n * An occasionally useful function... which does nothing\n */\nexport const doNothing = () => {};\n\n\n/**\n * A function that adds the given encoding if an encoding isn't already present in the image data.\n * Defaults to JPEG encoding.\n */\nexport const addImgEncoding = (\n imgData: string,\n encoding: string = 'data:image/jpeg;base64,',\n): string => imgData.startsWith('data') ? imgData : `${encoding}${imgData}`;\n\n\nexport const isNilOrEmpty = (value: any): value is null | undefined => R.isEmpty(value) || R.isNil(value);\n","/**\n * List of the number of milliseconds in common time units.\n * E.g. 1s = 1000ms, so TIME.S === 1000\n */\nexport const TIME = {\n MS: 1,\n S: 1000,\n M: 1000 * 60,\n H: 1000 * 60 * 60,\n D: 1000 * 60 * 60 * 24,\n W: 1000 * 60 * 60 * 24 * 7,\n};\n\n\nexport const BENCHMARKS = {\n UNIX_EPOCH: new Date(1970, 0, 1, 0, 0, 0, 0),\n MS_EPOCH: new Date('0001-01-01T00:00:00'),\n Y2K: new Date('2000-01-01T00:00:00'),\n};\n\n\n/**\n * Returns the number of milliseconds between startDate and endDate.\n * Order matters -- you'll get a negative number if startDate is in the past relative to endDate\n */\nexport const diffMs = (\n startDate: string | Date,\n endDate: string | Date,\n): number => new Date(startDate).getTime() - new Date(endDate).getTime();\n\n\n/**\n * Returns the number of seconds between startDate and endDate.\n * Order matters -- you'll get a negative number if startDate is in the past relative to endDate\n */\nexport const diffS = (\n startDate: string | Date,\n endDate: string | Date,\n): number => Math.floor((new Date(startDate).getTime() - new Date(endDate).getTime()) / TIME.S);\n\n\n/**\n * Checks whether the given date is 'valid' or a placeholder based on the same heuristic utilized in the previous\n * incarnation of the app.\n *\n * @param date - the date (or date string) to be examined\n */\nexport const isValidDate = (date: string | Date): boolean => new Date(date).getFullYear() > 1900;\n\n\n/**\n * Microsoft thought it would be different and not use the Unix Epoch. So, this tests for the MS Epoch i.e. 01-01-0001\n */\nexport const isDotNetDefault = (\n date: string | Date,\n): boolean => new Date(date).getTime() === BENCHMARKS.MS_EPOCH.getTime();\n","import { TextDirection } from '../../../localization/textDirection';\nimport { DirectoryRater, AddedDirectoryRater, Rater } from './models';\nimport { Requirement } from '../../models';\nimport { isValidDate } from '../../../language/time';\nimport { Map } from '../../../language/models';\nimport * as R from 'ramda';\n\n\n/**\n * Returns a name string in the form `firstName lastName`, formatted left-to-right\n *\n * @param named - a `Rater` or other object with `firstName` and `lastName` properties\n * @returns\n * * undefined if `named` does not exist or has no first or last name\n * * the `lastName` property of `named` if `firstName` is missing\n * * the `firstName` property of `named` if `lastName` is missing\n * * otherwise a name string formatted `firstName lastName`\n */\nexport const firstLast = (\n named: { firstName: string | undefined; lastName: string | undefined; } | undefined,\n): string | undefined => {\n if (!named || (!named.firstName && !named.lastName)) {\n return undefined;\n }\n\n if (!named.firstName) {\n return named.lastName;\n }\n\n if (!named.lastName) {\n return named.firstName;\n }\n\n return `${named.firstName} ${named.lastName}`;\n};\n\n\n/**\n * Returns a name string in the form `firstName lastName`, formatted right-to-left\n *\n * @param named - a `Rater` or other object with `firstName` and `lastName` properties\n * @returns\n * * undefined if `named` does not exist or has no first or last name\n * * the `lastName` property of `named` if `firstName` is missing\n * * the `firstName` property of `named` if `lastName` is missing\n * * otherwise a name string formatted `lastName firstName`\n */\nexport const firstLastReverse = (\n named: { firstName: string | undefined; lastName: string | undefined; } | undefined,\n): string | undefined => {\n if (!named || (!named.firstName && !named.lastName)) {\n return undefined;\n }\n\n if (!named.firstName) {\n return named.lastName;\n }\n\n if (!named.lastName) {\n return named.firstName;\n }\n\n return `${named.lastName} ${named.firstName}`;\n};\n\n/**\n * Returns a name string in the form `firstName lastName`, formatted to match the provided text direction\n *\n * @param dir - the text direction which the name string should be formatted to match\n * @param named - a `Rater` or other object with `firstName` and `lastName` properties\n * @returns\n * * undefined if `named` does not exist or has no first or last name\n * * the `lastName` property of `named` if `firstName` is missing\n * * the `firstName` property of `named` if `lastName` is missing\n * * otherwise a full name string of the form `firstName lastName`, formatted for the provided text direction\n */\nexport const firstLastLocal = (\n dir: TextDirection,\n named: { firstName: string | undefined; lastName: string | undefined; } | undefined,\n): string | undefined => dir === TextDirection.LTR ? firstLast(named) : firstLastReverse(named);\n\n\n/**\n * Returns a name string in the form `lastName, firstName`, formatted left-to-right\n *\n * @param named - a `Rater` or other object with `firstName` and `lastName` properties\n * @returns\n * * undefined if `named` does not exist or has no first or last name\n * * the `lastName` property of `named` if `firstName` is missing\n * * the `firstName` property of `named` if `lastName` is missing\n * * otherwise a name string formatted `lastName, firstName`\n */\nexport const lastCommaFirst = (\n named: { firstName: string | undefined; lastName: string | undefined; } | undefined,\n): string | undefined => {\n if (!named || (!named.firstName && !named.lastName)) {\n return undefined;\n }\n\n if (!named.firstName) {\n return named.lastName;\n }\n\n if (!named.lastName) {\n return named.firstName;\n }\n\n return `${named.lastName}, ${named.firstName}`;\n};\n\n\n/**\n * Returns a name string in the form `lastName, firstName`, formatted right-to-left\n *\n * @param named - a `Rater` or other object with `firstName` and `lastName` properties\n * @returns\n * * undefined if `named` does not exist or has no first or last name\n * * the `lastName` property of `named` if `firstName` is missing\n * * the `firstName` property of `named` if `lastName` is missing\n * * otherwise a name string formatted `firstName ,lastName`\n */\nexport const lastCommaFirstReverse = (\n named: { firstName: string | undefined; lastName: string | undefined; } | undefined,\n): string | undefined => {\n if (!named || (!named.firstName && !named.lastName)) {\n return undefined;\n }\n\n if (!named.firstName) {\n return named.lastName;\n }\n\n if (!named.lastName) {\n return named.firstName;\n }\n\n return `${named.firstName} ,${named.lastName}`;\n};\n\n\n/**\n * Returns a name string in the form `lastName, firstName`, formatted to match the provided text direction\n *\n * @param dir - the text direction which the name string should be formatted to match\n * @param named - a `Rater` or other object with `firstName` and `lastName` properties\n * @returns\n * * undefined if `named` does not exist or has no first or last name\n * * the `lastName` property of `named` if `firstName` is missing\n * * the `firstName` property of `named` if `lastName` is missing\n * * otherwise a full name string of the form `lastName, firstName`, formatted for the provided text direction\n */\nexport const lastCommaFirstLocal = (\n dir: TextDirection,\n named: { firstName: string | undefined; lastName: string | undefined; } | undefined,\n): string | undefined => dir === TextDirection.LTR ? lastCommaFirst(named) : lastCommaFirstReverse(named);\n\n\n/**\n * Returns a name string in the form `lastName, firstName`, formatted to match the provided text direction, or the\n * user's email address in the event that the user's name string is undefined or empty\n *\n * @param dir - the text direction which the name string should be formatted to match\n * @param rater - the rater whose name or email address we wish to retrieve\n * @returns\n * * the `lastName` property of `rater` if `firstName` is missing\n * * the `firstName` property of `rater` if `lastName` is missing\n * * a full name string of the form `lastName, firstName`, formatted for the provided text direction, if both\n * `firstName` and `lastName` properties are defined on `rater`\n * * otherwise the `email` property of `rater`\n */\nexport const nameOrEmail = (\n dir: TextDirection,\n rater: Rater | DirectoryRater | AddedDirectoryRater,\n): string => lastCommaFirstLocal(dir, { firstName: rater.firstName, lastName: rater.lastName }) || rater.email;\n\n\n/**\n * Returns all requirements in the provided array which have a valid required minimum. Used for rendering the list of\n * project requirements for the user when maximum rater counts are not mandatory, since a minimum of 0 entails that any\n * number of raters of the corresponding level is valid.\n *\n * @param requirements - the list of requirements to be filtered\n */\nexport const withValidMinimum = (\n requirements: Requirement[] | undefined,\n) => requirements?.filter(r => r.minimumRequired > 0);\n\n\n/**\n * Returns all requirements in the provided array which have a valid required minimum. Used for rendering the list of\n * project requirements for the user when maximum rater counts are mandatory (a non-zero minimum with a maximum of zero\n * signifies that any number of raters equal to or greater than the minimum required for that level is valid).\n *\n * @param requirements - the list of requirements to be filtered\n */\nexport const withValidMinOrMax = (\n requirements: Requirement[] | undefined,\n) => requirements?.filter(r => r.minimumRequired > 0 || r.maximumRequired > 0);\n\n\n/**\n * Returns the provided rater with the invite date updated to the provided date.\n *\n * @param rater - the rater to be updated\n * @param invitedDate - the invite date to set for the rater\n */\nexport const updateInvitedDateFor = (\n rater: Rater,\n invitedDate: Date | string,\n): Rater => R.assoc('invitedDate', invitedDate, rater);\n\n\n/**\n * Returns whether or not the given rater has an invite date and is thus invited.\n */\nexport const raterIsInvited = (rater: { invitedDate: string | Date }): boolean => isValidDate(rater.invitedDate);\n\n\n/**\n * Returns a map of the provided, keyed as sub-arrays by their respective (stringified) level Ids.\n *\n * @param raters - the raters to be mapped by level Id\n */\nexport const ratersByLevel = (\n raters: Rater[],\n): Map => R.groupBy(rater => `${rater.levelId}`, raters);\n\n\n/**\n * Returns the provided requirement, with the invited count updated to reflect the number of raters provided whose level\n * Id matches the rater level corresponding to that requirement\n *\n * @param requirement - the requirement whose invited count we wish to update\n * @param invitedRaters - a map of all newly invited raters (i.e., whose invite status is not currently reflected in the\n * requirement's invited count), mapped by level Id, that we must check in order to adjust the invited count\n */\nexport const updateInvitedCountFor = (\n requirement: Requirement,\n invitedRaters: Map,\n): Requirement => R.assoc(\n 'invitedCount',\n requirement.invitedCount + (invitedRaters[`${requirement.surveyLevelId}`]?.length ?? 0),\n requirement,\n);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport { SendTo, Rater } from './models';\nimport { isNilOrEmpty } from '../../../language/module';\nimport { toMap } from '../../../language/arrays';\nimport { updateInvitedDateFor, updateInvitedCountFor, ratersByLevel } from './module';\n\n\nconst KEY_ACTION = ActionType.SendInvitationsRequest;\nconst ACTIONS = [\n ActionType.SendInvitationsRequest,\n ActionType.SendInvitationsResponse,\n ActionType.SendInvitationsError,\n];\n\n\ntype Payload = {\n message: string;\n sentTo: SendTo[];\n};\n\n\ntype Meta = {\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to send invitation emails to all as-yet uninvited raters who have been added to the given\n * project for the listed participant\n *\n * @param projectId - the project to which we wish to invite raters\n * @param participantId - the specific project participant for whom we wish to invite raters\n * @param comment - a custom comment included in the email sent out to invited raters\n * @param to - the list of email addresses to invite (along with the language that should be used for each message)\n */\nexport const sendInvitationsAction = (\n projectId: number,\n participantId: number,\n comment: string,\n to: SendTo[],\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SendInvitations,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ projectId: projectId, participantId: participantId, comment: comment, to: to }),\n types: makeRsaaTypes(ACTIONS, { projectId: projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const projIdString = `${action.meta.projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, projIdString);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, projIdString);\n }\n\n if (isNilOrEmpty(payload?.sentTo)) {\n return addError(state, KEY_ACTION, payload?.message || '', projIdString);\n }\n\n let successState = noLoadingNoError(state, KEY_ACTION, projIdString);\n\n const currentRaters = Object.values(successState.projectRaters?.[projIdString] || {});\n const requirements = state.participantRequirements ?? [];\n\n const invitedEmailAddresses = R.map(st => st.toAddress, payload?.sentTo ?? []);\n const hasBeenInvited = (rater: Rater) => invitedEmailAddresses?.indexOf(rater.email) > -1;\n\n // Bifurcate raters based on whether they were included in the last round of invite emails\n const { ratersOnTheInvite, ratersNotOnTheInvite } = R.groupBy(\n rater => hasBeenInvited(rater) ? 'ratersOnTheInvite' : 'ratersNotOnTheInvite',\n currentRaters,\n );\n\n // Update raters who were included to reflect that they were invited today\n const ratersMarkedInvited = (ratersOnTheInvite ?? []).map(rater => updateInvitedDateFor(rater, new Date()));\n\n successState = R.assoc(\n 'participantRequirements',\n requirements.map(req => updateInvitedCountFor(req, ratersByLevel(ratersMarkedInvited))),\n successState,\n );\n\n successState = R.dissoc('lastInviteRequest', successState);\n\n return R.assocPath(\n ['projectRaters', projIdString],\n toMap(ratersMarkedInvited.concat(ratersNotOnTheInvite ?? []), rater => `${rater.raterId}`),\n successState,\n );\n};\n\nexport const sendInvitationsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { RaterLevel } from './models';\nimport { AppState } from '../../../core/redux/appState';\n\n\nconst KEY_ACTION = ActionType.RaterLevelsRequest;\nconst ACTIONS = [\n ActionType.RaterLevelsRequest,\n ActionType.RaterLevelsResponse,\n ActionType.RaterLevelsError,\n];\n\n\ntype Payload = RaterLevel[];\n\n\ntype Meta = {\n projectId: number;\n};\n\n\n/**\n * Dispatch this to retrieve info for the rater levels associated with a given project\n *\n * @param projectId - the database Id for the project whose rater levels we wish to retrieve\n */\nexport const raterLevelsAction = (projectId: number) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.RaterLevels,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({ projectId: projectId, languageId: state.locale.lang.languageId }),\n types: makeRsaaTypes(ACTIONS, { projectId: projectId }),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const mappedLevels = !!payload ? { [`${action.meta.projectId}`]: payload } : undefined;\n\n return R.assoc(\n 'projectRaterLevels',\n R.mergeDeepRight(successState.projectRaterLevels || {}, mappedLevels || {}),\n successState,\n );\n};\n\nexport const raterLevelsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { AppState } from '../../../core/redux/appState';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { toMap } from '../../../language/arrays';\n\n\nconst KEY_ACTION = ActionType.DeleteRaterRequest;\nconst ACTIONS = [\n ActionType.DeleteRaterRequest,\n ActionType.DeleteRaterResponse,\n ActionType.DeleteRaterError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n raterId: number;\n};\n\n\nexport const deleteRaterAction = (\n projectId: number,\n participantId: number,\n raterId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.DeleteRater,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n raterId: raterId,\n }),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n raterId: raterId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${raterId}`),\n },\n);\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const projectId = action.meta.projectId;\n const raterId = action.meta.raterId;\n const metaTag = `${action.meta.projectId}-${action.meta.raterId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const rater = successState.projectRaters?.[`${projectId}`]?.[`${raterId}`];\n const level = rater?.levelId || 0;\n const requirements = toMap(successState.participantRequirements || [], req => `${req.surveyLevelId}`);\n const requirementToUpdate = requirements[rater!.levelId];\n\n const withRaterDeleted = R.dissocPath(['projectRaters', `${projectId}`, `${raterId}`], successState) as AppState;\n\n // see if we need to set another approver\n let allUpdated = withRaterDeleted;\n const raters = withRaterDeleted.projectRaters?.[`${projectId}`] || {};\n const prospectiveApprover = R.find(r => r.levelId === level, Object.values(raters));\n if (rater?.approvalStatus === 1 && !!prospectiveApprover) {\n const markedApprover = R.assoc('approvalStatus', 1, prospectiveApprover);\n allUpdated = R.assocPath(\n ['projectRaters', `${projectId}`, `${prospectiveApprover.raterId}`],\n markedApprover,\n withRaterDeleted,\n ) as AppState;\n }\n\n if (!requirementToUpdate) {\n return allUpdated;\n }\n\n const requirementsWithUpdatedCount = R.assocPath(\n [`${rater!.levelId}`, 'raterCount'],\n requirementToUpdate.raterCount - 1,\n requirements,\n );\n\n return R.assoc('participantRequirements', Object.values(requirementsWithUpdatedCount), allUpdated);\n};\n\n\nexport const deleteRaterReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../core/api/rsaa';\nimport { Endpoints } from '../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../core/api/module';\nimport * as R from 'ramda';\n\n\nconst KEY_ACTION = ActionType.LoadProjectIdRequest;\nconst ACTIONS = [\n ActionType.LoadProjectIdRequest,\n ActionType.LoadProjectIdResponse,\n ActionType.LoadProjectIdError,\n];\n\n\ntype Payload = number;\n\ntype Meta = { displayId: string; };\n\n\n/**\n * Dispatch this action to get the Project ID from the server that corresponds to the given display ID\n */\nexport const loadProjectIdAction = (displayId: string) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.ProjectId,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ displayProjectId: displayId }),\n types: makeRsaaTypes(ACTIONS, { displayId }),\n bailout: state => !!getLoading(state, KEY_ACTION, displayId),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION, action.meta.displayId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, action.meta.displayId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, action.meta.displayId);\n\n return R.assocPath(\n ['displayIdMapping', action.meta.displayId],\n payload,\n successState,\n );\n};\n\n\nexport const loadProjectIdReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { AppState, makeInitialState } from '../../../core/redux/appState';\nimport { Action } from 'redux';\n\n\ntype LogOutAction = {\n type: ActionType.LogOut;\n isMobile: boolean;\n}\n\n\nexport const logOutAction = (isMobile: boolean): LogOutAction => ({\n type: ActionType.LogOut,\n isMobile: isMobile,\n});\n\nexport const logOutReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.LogOut) {\n return state;\n }\n\n const action = incomingAction as LogOutAction;\n\n return R.mergeRight(\n makeInitialState(state.locale.lang, action.isMobile),\n {\n sessionStorageLoaded: true,\n featureFlags: state.featureFlags,\n config: state.config,\n showLoginAnnouncement: state.showLoginAnnouncement,\n locale: state.locale,\n allLanguages: state.allLanguages,\n },\n );\n};\n","import { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { AppState } from '../../../core/redux/appState';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { Rater } from './models';\n\n\nconst KEY_ACTION = ActionType.UpdateRaterRequest;\nconst ACTIONS = [\n ActionType.UpdateRaterRequest,\n ActionType.UpdateRaterResponse,\n ActionType.UpdateRaterError,\n];\n\n\ntype Payload = Rater;\n\n\ntype Meta = {\n projectId: number;\n participantId: number;\n raterId: number;\n};\n\n\nexport const updateRaterAction = (\n projectId: number,\n participantId: number,\n raterId: number,\n email?: string,\n undelivered?: boolean,\n firstName?: string,\n lastName?: string,\n levelId?: number,\n languageId?: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.EditRater,\n headers: { 'content-type': 'application/json' },\n body: (state: AppState) => JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n raterId: raterId,\n email: email,\n undelivered: undelivered,\n firstName: firstName,\n lastName: lastName,\n levelId: levelId,\n languageId: languageId,\n pageLanguageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId, participantId: participantId, raterId: raterId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${raterId}`),\n },\n);\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}-${action.meta.raterId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const projectId = action.meta.projectId;\n const raterId = action.meta.raterId;\n const withRaterDeleted = R.dissocPath(['projectRaters', `${projectId}`, `${raterId}`], successState) as AppState;\n\n return R.assocPath(\n ['projectRaters', `${payload!.projectId}`, `${payload!.raterId}`],\n payload,\n withRaterDeleted,\n );\n};\n\n\nexport const updateRaterReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { AppState } from '../../core/redux/appState';\nimport { Action } from 'redux';\n\n\ntype OpenMenuAction = {\n type: ActionType.OpenMenu;\n setOpen: boolean;\n}\n\n\n/**\n * Dispatch this action to open/close the app's side menu.\n * @param setOpen - the new open state you want (default: open)\n */\nexport const openMenuAction = (setOpen: boolean = true): OpenMenuAction => ({\n type: ActionType.OpenMenu,\n setOpen: setOpen,\n});\n\n\nexport const openMenuReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.OpenMenu) {\n return state;\n }\n const action = incomingAction as OpenMenuAction;\n\n return R.assoc('openSideMenu', action.setOpen, state);\n};\n\n","import { ActionType } from '../../../core/redux/actionType';\nimport { PreviousRater } from './models';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { makeRsaaTypes, makeApiAction, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { AppState } from '../../../core/redux/appState';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { toMap } from '../../../language/arrays';\n\n\nconst KEY_ACTION = ActionType.PreviousRatersRequest;\nconst ACTIONS = [\n ActionType.PreviousRatersRequest,\n ActionType.PreviousRatersResponse,\n ActionType.PreviousRatersError,\n];\n\n\ntype Payload = PreviousRater[];\n\n\ntype Meta = {\n projectId: number;\n}\n\n\n/**\n * Dispatch this action to retrieve all raters previously associated with the provided project (and previously assigned\n * to rate the provided participant).\n *\n * @param projectId - the database Id for the project for which we're retrieving raters\n * @param participantId - the database Id for the specific project participant whose raters we're retrieving\n */\nexport const previousRatersAction = (projectId: number, participantId: number) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.PreviousRaters,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n }),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const mappedRaters = !!payload ? toMap(payload, rater => `${rater.raterId}`) : undefined;\n\n return R.mergeDeepRight(\n successState,\n {\n previousRaters: { [`${action.meta.projectId}`]: mappedRaters },\n },\n );\n};\n\nexport const previousRatersReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../../core/redux/actionType';\nimport { DirectoryRater } from '../models';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { makeRsaaTypes, makeApiAction, ApiReducer, makeApiReducer } from '../../../../core/api/rsaa';\nimport { AppState } from '../../../../core/redux/appState';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../../core/api/module';\nimport * as R from 'ramda';\n\n\nconst KEY_ACTION = ActionType.DirectoryRatersRequest;\nconst ACTIONS = [\n ActionType.DirectoryRatersRequest,\n ActionType.DirectoryRatersResponse,\n ActionType.DirectoryRatersError,\n];\n\n\ntype Payload = DirectoryRater[];\n\n\n// TODO: determine if we need to store with this level of granularity; if so, we should probably hash the search term\ntype Meta = {\n projectId: number;\n participantId: number;\n keyword: string;\n}\n\n\n/**\n * Dispatch this action to search for prospective raters by keyword.\n *\n * @param projectId - the database Id for the project for which we're retrieving raters\n * @param participantId - the person Id for the user for whom raters are being searched\n * @param keyword - the search term used to find one or more raters\n */\nexport const directoryRatersAction = (\n projectId: number,\n participantId: number,\n keyword: string,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.DirectoryRaters,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n keyword: keyword,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId, keyword }),\n bailout: (state: AppState) => !!getLoading(\n state,\n KEY_ACTION,\n `${projectId}-${participantId}-${keyword.toLocaleLowerCase(state.locale.lang.code)}`,\n ),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const lowercaseSearchTerm = action.meta.keyword.toLocaleLowerCase(state.locale.lang.code);\n\n const metaTag = `${action.meta.projectId}-${action.meta.participantId}-${lowercaseSearchTerm}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.assocPath(\n ['directoryRaters', `${action.meta.projectId}`, `${lowercaseSearchTerm}`],\n payload,\n successState,\n );\n};\n\nexport const directoryRatersReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { Rater } from './models';\nimport { AppState } from '../../../core/redux/appState';\n\n\nconst KEY_ACTION = ActionType.UpdateInviteDataRequest;\nconst ACTIONS = [\n ActionType.UpdateInviteDataRequest,\n ActionType.UpdateInviteDataResponse,\n ActionType.UpdateInviteDataError,\n];\n\n\ntype Payload = Rater;\n\n\ntype Meta = {\n projectId: number;\n raterId: number;\n};\n\n\n/**\n * Dispatch this to add custom content to the message sent with a rater's invitation\n *\n * @param projectId - the database Id for the project to which this person should be added\n * @param participantId - the database Id for the participant to be rated\n * @param raterId - the rater's permissions level\n * @param comment - the rater's email address\n */\nexport const updateInviteDataAction = (\n projectId: number,\n participantId: number,\n raterId: number,\n comment: string,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.UpdateInviteData,\n headers: { 'content-type': 'application/json' },\n body: state => (JSON.stringify(\n {\n projectId: projectId,\n participantId: state.auth.currentUser?.personId,\n raterId: raterId,\n comment: comment,\n },\n )\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n raterId: raterId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${raterId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}-${action.meta.raterId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.mergeRight(\n successState,\n {\n projectRaters: { [`${action.meta.projectId}`]: { [`${action.meta.raterId}`]: payload! } },\n },\n );\n};\n\nexport const updateInviteDataReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../../core/api/rsaa';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../../core/api/module';\nimport { SendTo } from '../models';\n\n\nconst KEY_ACTION = ActionType.SendRemindersRequest;\nconst ACTIONS = [\n ActionType.SendRemindersRequest,\n ActionType.SendRemindersResponse,\n ActionType.SendRemindersError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to send reminder emails to raters who have no yet completed the survey for the given project\n * and participant\n *\n * @param projectId - the project to which we wish to invite raters\n * @param participantId - the specific project participant for whom we wish to invite raters\n * @param comment - a custom comment included in the email sent out to invited raters\n * @param to - the list of email addresses to invite (along with the language that should be used for each message)\n */\nexport const sendRemindersAction = (\n projectId: number,\n participantId: number,\n comment: string,\n to: SendTo[],\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SendReminders,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ projectId: projectId, participantId: participantId, comment: comment, to: to }),\n types: makeRsaaTypes(ACTIONS, { projectId: projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n return noLoadingNoError(state, KEY_ACTION, metaTag);\n};\n\nexport const sendRemindersReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { AppState } from '../../../core/redux/appState';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { Rater } from './models';\nimport { Map } from '../../../language/models';\n\n\nconst KEY_ACTION = ActionType.SetApproverRequest;\nconst ACTIONS = [\n ActionType.SetApproverRequest,\n ActionType.SetApproverResponse,\n ActionType.SetApproverError,\n];\n\n\ntype Payload = Rater;\n\n\ntype Meta = {\n projectId: number;\n raterId: number;\n};\n\n\nexport const setApproverAction = (\n projectId: number,\n participantId: number,\n raterId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SetApprover,\n headers: { 'content-type': 'application/json' },\n body: (state: AppState) => JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n raterId: raterId,\n pageLanguageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n raterId: raterId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${raterId}`),\n },\n);\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}-${action.meta.raterId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n // There should only ever be one approver set at a given time, but given the state of the current admin module\n // leaves open the possibility for an unexpected edge case where have more than one.\n // Doesn't seem to be an easy way around having to check the whole collection.\n\n const allRaters = state.projectRaters?.[action.meta.projectId] || {};\n const raterIdsToUpdate = R.filter(key => allRaters[key].approvalStatus === 1, Object.keys(allRaters));\n const ratersToUpdate = R.pick(raterIdsToUpdate, allRaters) as Map;\n const updatedRaters = Object.values(ratersToUpdate).reduce(\n (map, rater) => R.assoc(`${rater.raterId}`, R.mergeRight(rater, { approvalStatus: 2 }), map),\n {},\n );\n\n const withUpdatedRaters = R.mergeRight(allRaters, updatedRaters);\n\n const withNewApprover = R.assoc(`${payload!.raterId}`, payload!, withUpdatedRaters);\n\n return R.assocPath(\n ['projectRaters', `${action.meta.projectId}`],\n withNewApprover,\n successState,\n );\n};\n\n\nexport const setApproverReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../core/api/rsaa';\nimport { Endpoints } from '../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../core/api/module';\nimport * as R from 'ramda';\n\n\nconst KEY_ACTION = ActionType.UpdateConfidentialityRequest;\nconst ACTIONS = [\n ActionType.UpdateConfidentialityRequest,\n ActionType.UpdateConfidentialityResponse,\n ActionType.UpdateConfidentialityError,\n];\n\n\n/**\n * Dispatch this action to accept the project confidentiality agreement for the given user/project IDs\n */\nexport const updateConfidentialityAction = (personId: number, projectId: number) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.UpdateConfidentiality,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ projectId: projectId, participantId: personId }),\n types: makeRsaaTypes(ACTIONS, { personId, projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['projectSummary', 'confidentialRequired'], false, successState);\n};\n\n\nexport const updateConfidentialityReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport { SendTo, Rater } from './models';\nimport * as R from 'ramda';\nimport { Map } from '../../../language/models';\n\n\nconst KEY_ACTION = ActionType.SendForApprovalRequest;\nconst ACTIONS = [\n ActionType.SendForApprovalRequest,\n ActionType.SendForApprovalResponse,\n ActionType.SendForApprovalError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to request approval for the participant's added raters from the designated approver\n *\n * @param projectId - the project to which we wish to invite raters\n * @param participantId - the specific project participant for whom we wish to invite raters\n * @param comment - a custom comment included in the email sent out to invited raters\n * @param to - the list of rater email addresses to invite (along with the database Id for the language to be used for\n * each message)\n */\nexport const sendForApprovalAction = (\n projectId: number,\n participantId: number,\n comment: string,\n to: SendTo[],\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SendForApproval,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ projectId: projectId, participantId: participantId, comment: comment, to: to }),\n types: makeRsaaTypes(ACTIONS, { projectId: projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const allRaters = state.projectRaters?.[action.meta.projectId] || {};\n const approvableIds = R.filter(\n key => allRaters[key].approvalStatus === 0 || allRaters[key].approvalStatus === 2,\n Object.keys(allRaters),\n );\n const approvableRaters = R.pick(approvableIds, allRaters) as Map;\n const setToWaiting = Object.values(approvableRaters).reduce(\n (map, rater) => R.assoc(`${rater.raterId}`, R.mergeRight(rater, { approvalStatus: 5 }), map),\n {},\n );\n\n const merged = R.mergeRight(allRaters, setToWaiting);\n return R.assocPath(\n ['projectRaters', `${action.meta.projectId}`],\n merged,\n successState,\n ); \n};\n\nexport const sendForApprovalReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { SsoRedirect } from '../authState';\n\n\nconst KEY_ACTION = ActionType.LoginRequest;\nconst ACTIONS = [\n ActionType.YmcaLoginRequest,\n ActionType.YmcaLoginResponse,\n ActionType.YmcaLoginError,\n];\n\n\ntype Payload = SsoRedirect;\n\n\ntype Meta = {\n email: string;\n};\n\n\n/**\n * Dispatch this action to authenticate to the portal through Ymca SSO\n * @param projectId - project display id\n * @param returnUrl - alternate way to get project display id. \n */\nexport const ymcaLoginAction = (projectId?: string, returnUrl?: string) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.YmcaLogin,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ projectId: projectId, returnUrl: returnUrl }),\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['auth', 'ssoRedirect'], payload, successState);\n};\n\nexport const ymcaLoginReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);","import { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { UserInfo } from '../authState';\n\n\nconst KEY_ACTION = ActionType.YmcaSsoRequest;\nconst ACTIONS = [\n ActionType.YmcaSsoRequest,\n ActionType.YmcaSsoResponse,\n ActionType.YmcaSsoError,\n];\n\n\ntype Payload = UserInfo;\n\n\ntype Meta = {\n email: string;\n};\n\n\n/**\n * Dispatch this action to authenticate to the portal through Ymca SSO\n * @param ticket - comes from ymca\n * @param projectId - project display id\n * @param returnUrl - alternate way to get project display id. \n */\nexport const ymcaSsoAction = (ticket?: string, projectId?: string, returnUrl?: string) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.YmcaLogin,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ ticket: ticket, projectId: projectId, returnUrl: returnUrl }),\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['auth', 'currentUser'], payload, successState);\n};\n\nexport const ymcaSsoReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);","import { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, makeApiReducer, ApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\nimport * as R from 'ramda';\n\n\nconst KEY_ACTION = ActionType.SetGoalAnswerRequest;\nconst ACTIONS = [\n ActionType.SetGoalAnswerRequest,\n ActionType.SetGoalAnswerResponse,\n ActionType.SetGoalAnswerError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n goalQuestionId: number;\n answer: string;\n};\n\n\n/*\n * Dispatch this action to set an answer for one of the project goals\n*/\nexport const setGoalAnswerAction = (\n projectId: number,\n participantId: number,\n goalQuestionId: number,\n answer: string,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.SetGoalAnswer,\n headers: {\n 'content-type': 'application/json',\n 'accept': 'application/json',\n },\n body: JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n questionId: goalQuestionId,\n questionAnswer: answer,\n }),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n goalQuestionId: goalQuestionId,\n answer: answer,\n },\n ), \n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}-${action.meta.goalQuestionId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n // The set goal answer endpoint could retrun 200 on failure, but with an informative error message\n if (payload !== 'Success') {\n return addError(state, KEY_ACTION, payload || '');\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const goalsAnswers = state.goalsAnswers?.[action.meta.projectId] || {};\n const editing = R.filter(\n key => goalsAnswers[key].questionId === action.meta.goalQuestionId,\n Object.keys(goalsAnswers),\n );\n const changed = R.pick(editing, goalsAnswers);\n const updated = Object.values(changed).reduce(\n (map, goal) => R.assoc(\n `${goal.questionId}`,\n R.mergeRight(goal, { questionAnswer: `${action.meta.answer}` }),\n map,\n ),\n {},\n );\n const updatedGoalsAnswers = R.mergeRight(goalsAnswers, updated);\n\n return R.assocPath(\n ['goalsAnswers', `${action.meta.projectId}`],\n updatedGoalsAnswers,\n successState,\n );\n\n\n};\n\n\nexport const setGoalAnswerReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\nimport { SendTo } from '../survey/raters/models';\n\n\nconst KEY_ACTION = ActionType.SendGoalsRequest;\nconst ACTIONS = [\n ActionType.SendGoalsRequest,\n ActionType.SendGoalsResponse,\n ActionType.SendGoalsError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to send goals email to selected email address\n * and participant\n *\n * @param projectId - the project to which we wish to invite raters\n * @param participantId - the specific project participant for whom we wish to invite raters\n * @param comment - a custom comment included in the email sent out to invited raters\n * @param to - the list of email addresses to invite (along with the language that should be used for each message)\n */\nexport const sendGoalsAction = (\n projectId: number,\n participantId: number,\n comment: string,\n to: SendTo[],\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SendGoals,\n headers: { 'content-type': 'application/json', 'accept': 'application/json' },\n body: JSON.stringify({ projectId: projectId, participantId: participantId, comment: comment, to: to }),\n types: makeRsaaTypes(ACTIONS, { projectId: projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n // The send goal endpoint could return 200 on failure, but with an informative error message\n if (payload !== 'Success') {\n return addError(state, KEY_ACTION, payload || '');\n }\n \n return noLoadingNoError(state, KEY_ACTION, metaTag);\n};\n\nexport const sendGoalsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { GoalAnswer } from './models';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { makeRsaaTypes, makeApiAction, ApiReducer, makeApiReducer } from '../../core/api/rsaa';\nimport { AppState } from '../../core/redux/appState';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { toMap } from '../../language/arrays';\n\n\nconst KEY_ACTION = ActionType.GoalsAnswersRequest;\nconst ACTIONS = [\n ActionType.GoalsAnswersRequest,\n ActionType.GoalsAnswersResponse,\n ActionType.GoalsAnswersError,\n];\n\n\ntype Payload = GoalAnswer[];\n\n\ntype Meta = {\n projectId: number;\n}\n\n\n/**\n * Dispatch this action to retrieve goals associated with the provided project and participant.\n *\n * @param projectId - the database Id for the currently selected project\n * @param participantId - the database Id for the specific participant\n */\nexport const goalsAnswersAction = (\n projectId: number,\n participantId: number,\n languageId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.GoalsAnswers,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n languageId: languageId,\n }),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const goalsAnswers = !!payload ? toMap(payload, goal => `${goal.questionId}`) : undefined;\n\n return R.mergeDeepRight(\n successState,\n {\n goalsAnswers: { [`${action.meta.projectId}`]: goalsAnswers },\n },\n );\n};\n\nexport const goalsAnswersReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport { EmailBody } from './models';\n\n\nconst KEY_ACTION = ActionType.InviteEmailPreviewRequest;\nconst ACTIONS = [\n ActionType.InviteEmailPreviewRequest,\n ActionType.InviteEmailPreviewResponse,\n ActionType.InviteEmailPreviewError,\n];\n\n\ntype Payload = EmailBody;\n\n\ntype Meta = {\n projectId: number;\n languageId: number;\n};\n\n\n/**\n * Dispatch this action to send invitation emails to all as-yet uninvited raters who have been added to the given\n * project for the listed participant\n */\nexport const inviteEmailPreviewAction = (projectId: number, languageId: number) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.InviteEmailPreview,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectId: projectId,\n languageId: languageId,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, languageId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${projectId}-${languageId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}-${action.meta.languageId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.assocPath(\n ['inviteEmailTemplates', `${state.projectSummary?.projectId}` || '0', `${state.locale.lang.languageId}`],\n payload,\n successState,\n );\n};\n\nexport const inviteEmailPreviewReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport { EmailBody } from './models';\n\n\nconst KEY_ACTION = ActionType.ApproverEmailPreviewRequest;\nconst ACTIONS = [\n ActionType.ApproverEmailPreviewRequest,\n ActionType.ApproverEmailPreviewResponse,\n ActionType.ApproverEmailPreviewError,\n];\n\n\ntype Payload = EmailBody;\n\n\ntype Meta = {\n projectId: number;\n languageId: number;\n};\n\n\n/**\n * Dispatch this action to send invitation emails to all as-yet uninvited raters who have been added to the given\n * project for the listed participant\n */\nexport const approverEmailPreviewAction = (\n projectId: number,\n languageId: number,\n emailAddress: string,\n ) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.ApproverEmailPreview,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectId: projectId,\n languageId: languageId,\n emailAddress: emailAddress,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, languageId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${projectId}-${languageId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}-${action.meta.languageId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.assocPath(\n ['approverEmailTemplates', `${state.projectSummary?.projectId}` || '0', `${state.locale.lang.languageId}`],\n payload,\n successState,\n );\n};\n\nexport const approverEmailPreviewReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.SetRemindersOnRequest;\nconst ACTIONS = [\n ActionType.SetRemindersOnRequest,\n ActionType.SetRemindersOnResponse,\n ActionType.SetRemindersOnError,\n];\n\n\ntype Payload = undefined;\n\ntype Meta = {\n projectId: number;\n participantId: number;\n value: boolean;\n};\n\n\n/**\n * Dispatch this action to set the state of whether or not the user has set email reminders to 'on'\n */\nexport const setRemindersOnAction = (\n projectId: number,\n participantId: number,\n value: boolean,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.SetRemindersOn,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({ \n projectId: projectId,\n participantId: participantId,\n remindersOn: value,\n languageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId, value }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['devPlan', 'emailRemindersOn'], action.meta.value, successState);\n};\n\n\nexport const setRemindersOnReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.GetRemindersOnRequest;\nconst ACTIONS = [\n ActionType.GetRemindersOnRequest,\n ActionType.GetRemindersOnResponse,\n ActionType.GetRemindersOnError,\n];\n\n\ntype Payload = boolean;\n\ntype Meta = {\n projectId: number;\n participantId: number;\n};\n\n\n/**\n * Dispatch this action to get the state of whether or not the user has set email reminders to 'on'\n */\nexport const getRemindersOnAction = (projectId: number, participantId: number) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.GetRemindersOn,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ projectId, participantId }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['devPlan', 'emailRemindersOn'], payload, successState);\n};\n\n\nexport const getRemindersOnReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.GetDevPlanItemsRequest;\nconst ACTIONS = [\n ActionType.GetDevPlanItemsRequest,\n ActionType.GetDevPlanItemsResponse,\n ActionType.GetDevPlanItemsError,\n];\n\n\ntype Payload = boolean;\n\ntype Meta = {\n projectId: number;\n participantId: number;\n};\n\n\n/**\n * Dispatch this action to get the dev plan items made by the user\n */\nexport const getDevPlanItemsAction = (projectId: number, participantId: number) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.GetDevPlanItems,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({ projectId, participantId, languageId: state.locale.lang.languageId }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['devPlan', 'items'], payload, successState);\n};\n\n\nexport const getDevPlanItemsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","export const COLORS = {\n GREEN: '#73C724',\n MEDIUM_GREEN: '#ABE872',\n LIGHT_GREEN: '#D2E8BE',\n\n RED: '#FF5454',\n\n DARK_BLUE: '#2F72A8',\n BLUE: '#5698D6',\n LIGHT_BLUE: '#8FC1FF',\n\n WHITE: '#FFFFFF',\n LIGHTEST_GREY: '#F5F5F5',\n LIGHTER_GREY: '#EBEBEB',\n LIGHT_GREY: '#C8C8C8',\n FIELD_GREY: '#ABABAB',\n MENU_GREY: '#9E9E9E',\n MEDIUM_GREY: '#828282',\n DARK_GREY: '#474747',\n BLACK: '#000000',\n\n DISABLED: '#D6D6D6',\n ICON_GREY: '#666666',\n PAGE_BG: '#EBEBEB',\n\n HOVER_GREY: '#757575',\n\n PROJECTBAR_GREY: '#CFCFCF',\n PARTICIPANTBAR_GREY: '#DADADA',\n\n // Used in the dev plan cards for 0 unread comment notifications\n UNREAD_GREY: '#7D7D7D',\n};\n\nexport const CHART_COLORS = {\n RING_BG: '#D6D6D6',\n PERSON: '#D6D6D6',\n\n LEVELS: [\n '#3E7BC7',\n '#5698D6',\n '#73ABF0',\n '#A7B6FC',\n '#C3CDFA',\n '#575757',\n '#707070',\n '#969696',\n '#B3B3B3',\n '#C7C7C7',\n ],\n};\n\nexport const TABLE_COLORS = {\n DARK_BG: '#F4F4F4',\n LIGHT_BG: '#FAFAFA',\n BORDER: COLORS.LIGHTER_GREY,\n};\n","export enum RaterApprovalStatus {\n None,\n Approver,\n NeedApproval,\n Approved,\n Declined,\n WaitingForApproval\n}","import * as R from 'ramda';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../../core/api/module';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { actionsByItemId } from '../../module';\nimport { DevPlanAction } from '../../models';\n\n\nconst KEY_ACTION = ActionType.GetDevPlanActionsRequest;\nconst ACTIONS = [\n ActionType.GetDevPlanActionsRequest,\n ActionType.GetDevPlanActionsResponse,\n ActionType.GetDevPlanActionsError,\n];\n\n\ntype Payload = DevPlanAction[];\n\ntype Meta = {\n projectId: number;\n participantId: number;\n};\n\n\n/**\n * Dispatch this action to get the list of dev plan actions made by the user\n */\nexport const getDevPlanActionsAction = (projectId: number, participantId: number) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.GetDevPlanActions,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ projectId, participantId }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['devPlan', 'actionsByItemId'], actionsByItemId(payload || []), successState);\n};\n\n\nexport const getDevPlanActionsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { Str } from '../../localization/translationKeys';\nimport { COLORS } from '../../globalStyle/colors';\nimport { Map } from '../../language/models';\nimport { Routes } from '../../navigation/routes';\nimport { DevPlan, DevPlanAction } from './models';\nimport * as R from 'ramda';\n\n\nexport const ctaMsgForProgress = (plan: DevPlan | undefined): Str => \n plan?.devPlanItemCount !== 0 || plan.devPlanEmailSent ? Str.ViewEdit : Str.Begin;\n\nexport const subtitleMsgForProgress = (plan: DevPlan | undefined): Str => {\n const progress = plan?.devPlanAmountComplete;\n const started = plan?.devPlanItemCount! > 0 || plan?.devPlanEmailSent;\n\n const noRequirements = plan?.developmentPlanEmailLevelId === 0 && plan?.developmentPlanGoalsToTrack === 0;\n\n if (!started) {\n return Str.ReviewFeedback;\n }\n\n if (!noRequirements && (progress === 1 || progress === 100) && started) {\n return Str.DevPlanCompleteMsg;\n }\n\n return Str.DashMakingProgressMsg;\n};\n\n\nexport const requirementsMsgFor = (plan: DevPlan | undefined): Str | undefined => {\n if (!plan || plan.devPlanAmountComplete === 0) {\n return undefined;\n }\n\n return plan.developmentPlanEmailLevelId > 0 && plan.developmentPlanGoalsToTrack > 0\n ? Str.DashDevPlanItemsEmailMsg\n : plan.developmentPlanGoalsToTrack > 0\n ? Str.DashDevPlanItemsMsg\n : Str.DashDevPlanEmailMsg;\n};\n\nexport const requirementsMsgSubstitutionsFor = (plan: DevPlan | undefined): { [key: string]: string; } => {\n if (!plan) {\n return {};\n }\n\n return {\n 'number': `${plan.developmentPlanGoalsToTrack}`,\n 'levelName': plan.devPlanEmailLevelName,\n };\n};\n\n\nexport const colorForProgress = (\n plan: DevPlan | undefined,\n): string => {\n const noRequirements = plan?.developmentPlanEmailLevelId === 0 && plan?.developmentPlanGoalsToTrack === 0;\n const complete = plan?.devPlanAmountComplete === 1 || plan?.devPlanAmountComplete === 100;\n\n return !noRequirements && complete ? COLORS.BLUE : COLORS.GREEN;\n}\n\n\nexport const routeForProgress = (\n plan: DevPlan | undefined,\n routes: Routes,\n): string => {\n const started = plan?.devPlanItemCount !== 0 || plan.devPlanEmailSent;\n return started ? routes.DevPlan : routes.AddPlanItem\n};\n\n\n/**\n * Sums up the given actions, bucketed by dev item ID. Returns a mapping ItemId -> Action Total\n */\nexport const actionsByItemId = (\n actions: DevPlanAction[],\n): Map => actions.reduce(\n (running, next) => R.assoc(\n `${next.devItemId}`,\n (running[next.devItemId] ?? []).concat(next),\n running,\n ),\n {} as Map,\n);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../../core/api/module';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { UpdateFieldAnswerRequest } from '../../models';\nimport { updateFieldAnswer } from '../module';\n\n\nconst KEY_ACTION = ActionType.UpdateDevPlanFieldAnswerRequest;\nconst ACTIONS = [\n ActionType.UpdateDevPlanFieldAnswerRequest,\n ActionType.UpdateDevPlanFieldAnswerResponse,\n ActionType.UpdateDevPlanFieldAnswerError,\n];\n\n\ntype Payload = undefined;\ntype Meta = UpdateFieldAnswerRequest;\n\n\nconst keyForMeta = (meta: Meta) => `${meta.devActionId}-${meta.devFieldId}`;\n\n\n/**\n * Dispatch this action to update the list of dev plan action fields and answers\n */\nexport const updateDevPlanFieldAnswerAction = (\n fieldAnswer: UpdateFieldAnswerRequest,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.UpdateDevPlanFieldAnswer,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ ...fieldAnswer, devFieldId: isNaN(+fieldAnswer.devFieldId) ? 0 : fieldAnswer.devFieldId}),\n types: makeRsaaTypes(ACTIONS, fieldAnswer),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const key = keyForMeta(action.meta);\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, key);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, key);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, key);\n\n // Assert not null because: how is the user updating an item we haven't loaded?\n const toUpdate = successState.devPlan?.fieldsAnswers?.[`${action.meta.devItemId}`]?.[`${action.meta.devActionId}`]!;\n\n // Update the relevant field/answer to reflect the user's changes\n return R.assocPath(\n ['devPlan', 'fieldsAnswers', `${action.meta.devItemId}`, `${action.meta.devActionId}`],\n updateFieldAnswer(toUpdate, action.meta),\n successState,\n );\n};\n\n\nexport const updateDevPlanFieldAnswerReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { Map } from '../../../language/models';\nimport { DevPlanFieldAndAnswer, UpdateFieldAnswerRequest, DevPlanAction } from '../models';\nimport * as R from 'ramda';\nimport { keyFor } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { Dispatch } from 'react';\nimport { toMap } from '../../../language/arrays';\nimport { updateDevPlanFieldAnswerAction } from './api/updateDevPlanFieldAnswerAction';\nimport { AppState } from '../../../core/redux/appState';\nimport { COLORS } from '../../../globalStyle/colors';\n\n\n/**\n * Filters out any actions from the given maybe array with the given action ID. If no array is given, an empty array is\n * returned.\n */\nexport const filterOutAction = (\n actions: DevPlanAction[] | undefined,\n actionId: number,\n): DevPlanAction[] => actions?.filter(action => action.devActionId !== actionId) ?? [];\n\n\n/**\n * Removes the action by the given ID associated to the given Dev Plan ID from the given map of actions, returning a new\n * map of actions. If the given map of actions is undefined, you get back an object with an empty array on it at the\n * given dev plan ID.\n */\nexport const removeAction = (\n devPlanId: number,\n actionId: number,\n actionsByItemId: Map | undefined,\n): Map => R.assoc(\n `${devPlanId}`,\n filterOutAction(actionsByItemId?.[`${devPlanId}`], actionId),\n actionsByItemId || {},\n);\n\n\n/**\n * Applies the given function to the action in app state with the given ID. If no such action is found, state is\n * returned unchanged.\n */\nexport const updateAction = (\n devPlanItemId: number | string,\n actionId: number,\n updateFunc: (action: DevPlanAction) => DevPlanAction,\n state: AppState,\n): AppState => {\n const updateIndex = state\n .devPlan\n ?.actionsByItemId\n ?.[`${devPlanItemId}`]\n ?.findIndex(action => action.devActionId === actionId)\n ?? -1;\n\n if (updateIndex === -1) {\n return state;\n }\n\n const updateAction = state.devPlan!.actionsByItemId![`${devPlanItemId}`]![updateIndex];\n const newAction = updateFunc(updateAction);\n\n return R.assocPath(\n ['devPlan', 'actionsByItemId', `${devPlanItemId}`],\n R.update(updateIndex, newAction, state.devPlan!.actionsByItemId![`${devPlanItemId}`]!),\n state,\n );\n};\n\n\nconst addField = (\n mapping: Map | undefined,\n field: DevPlanFieldAndAnswer,\n): Map => R.assoc(\n `${field.devActionId}`,\n (mapping?.[`${field.devActionId}`] ?? []).concat(field),\n mapping ?? {},\n);\n\n\n/**\n * Reduce a list of action fields/answers into a mapping: Dev plan item ID -> Action ID -> Field/Answer\n */\nexport const actionFieldsById = (\n fields: DevPlanFieldAndAnswer[],\n): Map> => fields.reduce(\n (running, next) => R.assoc(`${next.devItemId}`, addField(running[`${next.devItemId}`], next), running),\n {} as Map>,\n);\n\n\nexport const makeUpdateFieldAnswerRequestObj = (\n field: DevPlanFieldAndAnswer,\n newAnswer: string,\n): UpdateFieldAnswerRequest => ({\n participantId: field.participantId,\n projectId: field.projectId,\n devItemId: field.devItemId,\n devActionId: field.devActionId,\n devFieldId: field.devPlanFieldId,\n devFieldAnswerId: field.devPlanFieldAnswerId,\n sequence: field.sequence,\n answer: newAnswer.trim(),\n}) as UpdateFieldAnswerRequest;\n\n\n/**\n * Updates the given array of field answers (immutably) to include the new field/answer state given. Useful when the user\n * changes a field/answer and you need to update app state to reflect the changes.\n * @param fieldAnswers - The array of old field answers\n * @param newState - The new state to put into the array\n */\nexport const updateFieldAnswer = (\n fieldAnswers: DevPlanFieldAndAnswer[],\n newState: UpdateFieldAnswerRequest,\n): DevPlanFieldAndAnswer[] => {\n const targetIndex = fieldAnswers.findIndex(\n item => item.devPlanFieldId === newState.devFieldId\n // is old-style answer and matches on the intersection of other properties\n || (\n !newState.devFieldId\n && item.sequence === newState.sequence\n && item.devActionId === newState.devActionId\n && item.devItemId === newState.devItemId\n ),\n );\n\n const newValue = R.mergeDeepRight(\n fieldAnswers?.[targetIndex],\n newState,\n );\n\n return R.update(targetIndex, newValue, fieldAnswers);\n};\n\n\n/**\n * Dev plans have items which have actions which have questions which have answers. When updating an answer or answers\n * for a specific question, you get a loading/error state.\n * Shallow-memoized function that returns loading/error state for a given list of field/answers\n */\nexport const calcUpdateFieldAnswerApiState = (fieldsAnswers: DevPlanFieldAndAnswer[]) => {\n let prevMap: Map | undefined = undefined;\n let prevValue: boolean = false;\n\n return (map: Map): boolean => {\n if (map === prevMap) {\n return prevValue;\n }\n\n prevMap = map;\n prevValue = R.any(\n field => !!map[keyFor(\n ActionType.UpdateDevPlanFieldAnswerRequest,\n `${field.devActionId}-${field.devPlanFieldId}`,\n )],\n fieldsAnswers,\n );\n\n return prevValue;\n };\n};\n\n\nexport const dispatchFieldAnswerUpdates = (\n dispatch: Dispatch,\n fieldsAnswers: DevPlanFieldAndAnswer[],\n dirtyFields: Map,\n): void => {\n const fields = toMap(fieldsAnswers, field => `${field.devPlanFieldId}`);\n\n Object\n .keys(dirtyFields)\n .map(fieldId => makeUpdateFieldAnswerRequestObj(fields[fieldId]!, dirtyFields[fieldId]))\n .map(updateDevPlanFieldAnswerAction)\n .forEach(dispatch);\n};\n\n\nexport const colorForStatus = (status: number): string => {\n switch (status) {\n // Not Started\n case 0:\n return COLORS.RED;\n\n // In Progress\n case 1:\n return COLORS.GREEN;\n\n // Complete\n default:\n return COLORS.BLUE;\n }\n};\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../../core/api/module';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { DevPlanFieldAndAnswer } from '../../models';\nimport { actionFieldsById } from '../module';\n\n\nconst KEY_ACTION = ActionType.GetDevPlanFieldsAndAnswersRequest;\nconst ACTIONS = [\n ActionType.GetDevPlanFieldsAndAnswersRequest,\n ActionType.GetDevPlanFieldsAndAnswersResponse,\n ActionType.GetDevPlanFieldsAndAnswersError,\n];\n\n\ntype Payload = DevPlanFieldAndAnswer[];\n\ntype Meta = {\n projectId: number;\n participantId: number;\n};\n\n\n/**\n * Dispatch this action to get the list of dev plan action fields and answers\n */\nexport const getDevPlanFieldsAndAnswersAction = (\n projectId: number,\n participantId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.GetDevPlanFieldsAndAnswers,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({ projectId, participantId, languageId: state.locale.lang.languageId }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n const actions = (payload || [])\n .map(fa => !!fa.devPlanFieldId ? fa : R.assoc('devPlanFieldId', fa.question, fa));\n\n return R.assocPath(['devPlan', 'fieldsAnswers'], actionFieldsById(actions), successState);\n};\n\n\nexport const getDevPlanFieldsAndAnswersReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { Report } from '../models';\n\n\nconst KEY_ACTION = ActionType.LoadReportsRequest;\nconst ACTIONS = [\n ActionType.LoadReportsRequest,\n ActionType.LoadReportsResponse,\n ActionType.LoadReportsError,\n];\n\n\ntype Payload = Report[];\ntype Meta = { projectId: number; }\n\n\n/**\n * Dispatch this action to load the list of reports associated with a specific person\n */\nexport const loadReportsAction = (\n projectId: number,\n participantId: number,\n userName: string,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.ViewReports,\n headers: { 'content-type': 'application/json' },\n body: (state) => (JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n userName: userName,\n })),\n types: makeRsaaTypes(ACTIONS, { projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assoc('reports', payload, successState);\n};\n\n\nexport const loadReportsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../core/api/endpoints';\n\n\nconst KEY_ACTION = ActionType.IsSsoRequest;\nconst ACTIONS = [\n ActionType.IsSsoRequest,\n ActionType.IsSsoResponse,\n ActionType.IsSsoError,\n];\n\n\ntype Payload = boolean;\n\n\ntype Meta = {\n email: string;\n};\n\n\n/**\n * Dispatch this action to authenticate to the portal through Saml SSO \n */\nexport const isSsoAction = () => makeApiAction({\n method: 'GET',\n endpoint: Endpoints.IsSso,\n headers: { 'content-type': 'application/json' },\n body: null,\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['auth', 'ssoRedirect'], payload, successState);\n};\n\nexport const isSsoReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);","import { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { UserInfo } from '../authState';\n\n\nconst KEY_ACTION = ActionType.SamlAssertionRequest;\nconst ACTIONS = [\n ActionType.SamlAssertionRequest,\n ActionType.SamlAssertionResponse,\n ActionType.SamlAssertionError,\n];\n\n\ntype Payload = UserInfo;\n\n\ntype Meta = {\n email: string;\n};\n\n\n/**\n * Dispatch this action to authenticate to the portal through Saml SSO \n */\nexport const samlAssertionAction = (email?: string) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.SamlAssertion,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ email: email }),\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['auth', 'currentUser'], payload, successState);\n};\n\nexport const samlAssertionReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);","import * as R from 'ramda';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../../core/api/module';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { removeAction } from '../module';\n\n\nconst KEY_ACTION = ActionType.DeleteDevPlanActionRequest;\nconst ACTIONS = [\n ActionType.DeleteDevPlanActionRequest,\n ActionType.DeleteDevPlanActionResponse,\n ActionType.DeleteDevPlanActionError,\n];\n\n\ntype Payload = undefined;\ntype Meta = { projectId: number; actionId: number; devPlanId: number; };\n\n\n/**\n * Dispatch this action to delete a dev plan item's action\n */\nexport const deleteDevPlanActionAction = (projectId: number, devPlanId: number, actionId: number) => \nmakeApiAction({\n method: 'POST',\n endpoint: Endpoints.DeleteDevPlanAction,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({\n devActionId: actionId,\n projectId: projectId,\n participantId: state.auth.currentUser?.personId ?? 0,\n languageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, actionId, devPlanId }),\n bailout: state => !!getLoading(state, KEY_ACTION, actionId),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION, action.meta.actionId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, action.meta.actionId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, action.meta.actionId);\n\n // Remove the offending action from app state now that the API says it was successfully deleted\n return R.assocPath( // Remove from actions mapped by dev plan\n ['devPlan', 'actionsByItemId'],\n removeAction(action.meta.devPlanId, action.meta.actionId, successState.devPlan?.actionsByItemId),\n successState,\n );\n};\n\n\nexport const deleteDevPlanActionReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.UpdateDevPlanItemDescriptionRequest;\nconst ACTIONS = [\n ActionType.UpdateDevPlanItemDescriptionRequest,\n ActionType.UpdateDevPlanItemDescriptionResponse,\n ActionType.UpdateDevPlanItemDescriptionError,\n];\n\n\ntype Payload = undefined;\ntype Meta = {\n itemId: number;\n description: string;\n};\n\n\n/**\n * Dispatch this action to update the description field for a dev plan item\n */\nexport const updateDevPlanItemDescriptionAction = (\n participantId: number,\n projectId: number,\n itemId: number,\n description: string,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.UpdateDevPlanItemDescription,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n participantId: participantId,\n projectId: projectId,\n devItemId: itemId,\n description: description,\n }),\n types: makeRsaaTypes(ACTIONS, { itemId, description }),\n bailout: state => !!getLoading(state, KEY_ACTION, itemId),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION, action.meta.itemId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, action.meta.itemId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, action.meta.itemId);\n\n const itemIndex = successState.devPlan?.items?.findIndex(item => item.devItemId === action.meta.itemId) ?? -1;\n\n // Can't update an item we didn't find ¯\\_(ツ)_/¯\n if (itemIndex === -1) {\n return successState;\n }\n\n const newItem = R.assoc('description', action.meta.description, successState.devPlan!.items![itemIndex]);\n\n return R.assocPath(\n ['devPlan', 'items'],\n R.update(itemIndex, newItem, successState.devPlan!.items!),\n successState,\n );\n};\n\n\nexport const updateDevPlanItemDescriptionReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.UpdateDevPlanItemTitleRequest;\nconst ACTIONS = [\n ActionType.UpdateDevPlanItemTitleRequest,\n ActionType.UpdateDevPlanItemTitleResponse,\n ActionType.UpdateDevPlanItemTitleError,\n];\n\n\ntype Payload = undefined;\ntype Meta = {\n itemId: number;\n title: string;\n competencyId: number;\n competencyName: string;\n};\n\n\n/**\n * Dispatch this action to update the title for a dev plan item\n */\nexport const updateDevPlanItemTitleAction = (\n participantId: number,\n projectId: number,\n itemId: number,\n title: string,\n competencyId: number,\n competencyName: string,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.UpdateDevPlanItemTitle,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({\n participantId: participantId,\n projectId: projectId,\n devItemId: itemId,\n title: title,\n competencyId: competencyId,\n languageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(ACTIONS, { itemId, title, competencyId, competencyName }),\n bailout: state => !!getLoading(state, KEY_ACTION, itemId),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION, action.meta.itemId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, action.meta.itemId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, action.meta.itemId);\n\n const itemIndex = successState.devPlan?.items?.findIndex(item => item.devItemId === action.meta.itemId) ?? -1;\n\n // Can't update an item we didn't find ¯\\_(ツ)_/¯\n if (itemIndex === -1) {\n return successState;\n }\n\n const newTitle = action.meta.competencyId > 0 ? action.meta.competencyName : action.meta.title;\n\n const item = R.assoc('title', newTitle, successState.devPlan!.items![itemIndex]);\n const updatedItem = R.assoc('devItemCompetencyId', action.meta.competencyId, item);\n \n return R.assocPath(\n ['devPlan', 'items'],\n R.update(itemIndex, updatedItem, successState.devPlan!.items!),\n successState,\n );\n};\n\n\nexport const updateDevPlanItemTitleReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { DevResource } from './models';\n\n\nconst KEY_ACTION = ActionType.LoadDevResourcesRequest;\nconst ACTIONS = [\n ActionType.LoadDevResourcesRequest,\n ActionType.LoadDevResourcesResponse,\n ActionType.LoadDevResourcesError,\n];\n\n\ntype Payload = DevResource[];\n\ntype Meta = {\n projectId: number,\n};\n\n\n/**\n * Dispatch this action to load an index of project dev resources\n */\nexport const loadDevResourcesAction = (\n projectId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.DevResources,\n headers: { 'content-type': 'application/json' },\n types: makeRsaaTypes(ACTIONS, { projectId }),\n body: state => JSON.stringify({\n projectId: projectId,\n languageId: state.locale.lang.languageId,\n }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assoc('devResources', payload, successState);\n};\n\n\nexport const loadDevResourcesReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading } from '../../../../core/api/module';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { updateAction } from '../module';\n\n\nconst KEY_ACTION = ActionType.UpdateDevPlanActionCompleteByDateRequest;\nconst ACTIONS = [\n ActionType.UpdateDevPlanActionCompleteByDateRequest,\n ActionType.UpdateDevPlanActionCompleteByDateResponse,\n ActionType.UpdateDevPlanActionCompleteByDateError,\n];\n\n\ntype Payload = undefined;\ntype Meta = { devItemId: number; devActionId: number; completeBy: string | Date; };\n\n\n/**\n * Dispatch this action to update the date that an action should be completed by\n */\nexport const updateDevPlanActionCompleteByDateAction = (\n devItemId: number,\n devActionId: number,\n completeBy: string | Date,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.UpdateDevPlanActionCompleteByDate,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ devActionId, completeBy }),\n types: makeRsaaTypes(ACTIONS, { devItemId, devActionId, completeBy }),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION, action.meta.devActionId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, action.meta.devActionId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, action.meta.devActionId);\n\n return updateAction(\n action.meta.devItemId,\n action.meta.devActionId,\n R.assoc('goalDate', action.meta.completeBy),\n successState,\n );\n};\n\n\nexport const updateDevPlanActionCompleteByDateReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../core/api/rsaa';\nimport { Endpoints } from '../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../core/api/module';\nimport * as R from 'ramda';\nimport { CurrentStatus } from './models';\n\n\nconst KEY_ACTION = ActionType.LoadCurrentStatusRequest;\nconst ACTIONS = [\n ActionType.LoadCurrentStatusRequest,\n ActionType.LoadCurrentStatusResponse,\n ActionType.LoadCurrentStatusError,\n];\n\n\ntype Payload = CurrentStatus;\n\ntype Meta = {\n projectId: number,\n participantId: number,\n};\n\n\n/**\n * Dispatch this action to load a current status information for selected project\n */\nexport const loadCurrentStatusAction = (\n projectId: number,\n participantId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.CurrentStatus,\n headers: { 'content-type': 'application/json' },\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n body: state => JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n const project = state.projectSummary;\n return R.assoc('projectSummary', R.mergeRight(project!, payload!), successState);\n};\n\n\nexport const loadCurrentStatusReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../../core/api/module';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { DevPlanFieldAndAnswer } from '../../models';\nimport { BENCHMARKS } from '../../../../language/time';\n\n\nconst KEY_ACTION = ActionType.AddDevPlanActionRequest;\nconst ACTIONS = [\n ActionType.AddDevPlanActionRequest,\n ActionType.AddDevPlanActionResponse,\n ActionType.AddDevPlanActionError,\n];\n\n\ntype Payload = DevPlanFieldAndAnswer[];\ntype Meta = { projectId: number; devPlanId: number; };\n\n\n/**\n * Dispatch this action to add a new dev plan item action\n */\nexport const addDevPlanActionAction = (projectId: number, devPlanId: number) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.AddDevPlanAction,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({\n devItemId: devPlanId,\n languageId: state.locale.lang.languageId,\n projectId: projectId ?? 0,\n participantId: state.auth.currentUser?.personId ?? 0,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, devPlanId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n const actionId = (payload || [])[0]?.devActionId ?? -1;\n const itemId = action.meta.devPlanId;\n\n const actions = (payload || [])\n .map(fa => !!fa.devPlanFieldId ? fa : R.assoc('devPlanFieldId', fa.question, fa));\n\n return R.assocPath(\n ['devPlan', 'fieldsAnswers', `${itemId}`, `${actionId}`],\n actions,\n R.assocPath(\n ['devPlan', 'actionsByItemId', `${itemId}`],\n R.concat(\n [\n {\n devItemId: itemId,\n devActionId: actionId,\n goalDate: BENCHMARKS.Y2K,\n status: 0,\n },\n ],\n successState.devPlan?.actionsByItemId?.[`${itemId}`] || [],\n ),\n successState,\n ),\n );\n};\n\n\nexport const addDevPlanActionReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.DeleteDevPlanItemRequest;\nconst ACTIONS = [\n ActionType.DeleteDevPlanItemRequest,\n ActionType.DeleteDevPlanItemResponse,\n ActionType.DeleteDevPlanItemError,\n];\n\n\ntype Payload = boolean;\n\ntype Meta = {\n devItemId: number;\n};\n\n\n/**\n * Dispatch this action to delete the dev plan items made by the user\n */\nexport const deleteDevPlanItemAction = (\n participantId: number,\n projectId: number,\n devItemId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.DeleteDevPlanItem,\n headers: { 'content-type': 'application/json', 'accept': 'application/json' },\n body: state => JSON.stringify({\n participantId,\n projectId,\n devItemId,\n languageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(ACTIONS, { devItemId }),\n bailout: state => !!getLoading(state, KEY_ACTION, devItemId),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const devItemId = action.meta.devItemId;\n if (isLoading) {\n return addLoading(state, KEY_ACTION, devItemId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, devItemId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, devItemId);\n\n return R.assocPath(\n ['devPlan', 'items'],\n successState.devPlan?.items?.filter(item => item.devItemId !== devItemId) ?? [],\n R.dissocPath(['devPlan', 'actionsByItemId', `${devItemId}`], successState),\n );\n};\n\n\nexport const deleteDevPlanItemReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { DevPlanItem } from '../models';\n\n\nconst KEY_ACTION = ActionType.AddDevPlanItemRequest;\nconst ACTIONS = [\n ActionType.AddDevPlanItemRequest,\n ActionType.AddDevPlanItemResponse,\n ActionType.AddDevPlanItemError,\n];\n\n\ntype Payload = DevPlanItem;\n\ntype Meta = {\n projectId: number;\n participantId: number;\n};\n\n\n/**\n * Dispatch this action to add a dev plan item\n */\nexport const addDevPlanItemAction = (\n participantId: number,\n projectId: number,\n competencyId: number,\n itemName: string | undefined,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.AddDevPlanItem,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({\n participantId: participantId,\n languageId: state.locale.lang.languageId,\n projectId: projectId,\n competencyId: competencyId,\n itemName: itemName,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n if (!payload) {\n return successState;\n }\n\n return R.assocPath(\n ['devPlan', 'items'],\n (successState.devPlan?.items || []).concat(payload),\n successState,\n );\n};\n\n\nexport const addDevPlanItemReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../../core/api/module';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { StatusKey } from '../../models';\n\n\nconst KEY_ACTION = ActionType.GetStatusKeysRequest;\nconst ACTIONS = [\n ActionType.GetStatusKeysRequest,\n ActionType.GetStatusKeysResponse,\n ActionType.GetStatusKeysError,\n];\n\n\ntype Payload = StatusKey[];\n\n\n/**\n * Dispatch this action to get a list of the statuses a dev plan item action can have (not started, in progress,\n * complete)\n */\nexport const getDevPlanStatusesAction = () => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.GetStatusKeys,\n headers: { 'content-type': 'application/json' },\n body: '',\n types: makeRsaaTypes(ACTIONS),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['devPlan', 'actionStatuses'], payload, successState);\n};\n\n\nexport const getDevPlanStatusesReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../../core/api/module';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { updateAction } from '../module';\n\n\nconst KEY_ACTION = ActionType.UpdateDevPlanActionStatusRequest;\nconst ACTIONS = [\n ActionType.UpdateDevPlanActionStatusRequest,\n ActionType.UpdateDevPlanActionStatusResponse,\n ActionType.UpdateDevPlanActionStatusError,\n];\n\n\ntype Payload = undefined;\ntype Meta = {\n projectId: number;\n devItemId: number;\n devActionId: number;\n statusId: number;\n};\n\n\n/**\n * Dispatch this action to change an action's status\n */\nexport const updateDevPlanActionStatusAction = (\n projectId: number,\n devItemId: number,\n devActionId: number,\n statusId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.UpdateDevPlanActionStatus,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({\n devActionId,\n status: statusId,\n projectId: projectId,\n participantId: state.auth.currentUser?.personId ?? 0,\n languageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, devItemId, devActionId, statusId }),\n bailout: state => !!getLoading(state, KEY_ACTION, devActionId),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION, action.meta.devActionId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, action.meta.devActionId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, action.meta.devActionId);\n\n return updateAction(\n action.meta.devItemId,\n action.meta.devActionId,\n R.assoc('status', action.meta.statusId),\n successState,\n );\n};\n\n\nexport const updateDevPlanActionStatusReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { AppState } from '../../core/redux/appState';\nimport { RaterApprovalParticipant } from '../models';\n\n\nconst KEY_ACTION = ActionType.RaterApprovalParticipantsRequest;\nconst ACTIONS = [\n ActionType.RaterApprovalParticipantsRequest,\n ActionType.RaterApprovalParticipantsResponse,\n ActionType.RaterApprovalParticipantsError,\n];\n\n\ntype Payload = RaterApprovalParticipant[];\n\n\ntype Meta = {\n personId: number;\n};\n\n\n/**\n * Dispatch this to retrieve all the participants whose raters the current user has been assigned to approve\n *\n * @param personId - the user's database Id\n */\nexport const raterApprovalParticipantsAction = (\n personId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.RaterApprovalParticipants,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n personId: personId,\n }),\n types: makeRsaaTypes(ACTIONS, { personId }),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${personId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.personId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.assoc('raterApprovalParticipants', payload, successState);\n};\n\nexport const raterApprovalParticipantsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../../core/api/module';\nimport { ActionType } from '../../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.SendDevPlanRequest;\nconst ACTIONS = [\n ActionType.SendDevPlanRequest,\n ActionType.SendDevPlanResponse,\n ActionType.SendDevPlanError,\n];\n\n\ntype Payload = undefined;\ntype Meta = { to: string; };\n\n\n/**\n * Dispatch this action to email the user's dev plan to the given recipient.\n */\nexport const sendDevPlanAction = (\n projectId: number,\n participantId: number,\n to: string,\n comment: string | undefined,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.SendDevPlan,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({\n projectId,\n participantId,\n to: [{ toAddress: to, languageId: state.locale.lang.languageId }],\n comment,\n }),\n types: makeRsaaTypes(ACTIONS, { to }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(\n ['devPlan', 'lastEmailRecipient'],\n action.meta.to,\n R.assocPath(\n ['projectSummary', 'devPlanEmailSent'],\n true,\n successState,\n ),\n );\n};\n\n\nexport const sendDevPlanReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { makeRsaaTypes, makeApiAction, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { AppState } from '../../../core/redux/appState';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport * as R from 'ramda';\nimport { Rater } from './models';\nimport { Map } from '../../../language/models';\nimport { Str } from '../../../localization/translationKeys';\n\n\nconst KEY_ACTION = ActionType.UndeliveredEmailsRequest;\nconst ACTIONS = [\n ActionType.UndeliveredEmailsRequest,\n ActionType.UndeliveredEmailsResponse,\n ActionType.UndeliveredEmailsError,\n];\n\n\ntype Payload = string[];\n\n\ntype Meta = {\n projectId: number;\n}\n\n\n/**\n * Dispatch this action to retrieve undelivered emails\n *\n * @param projectId - the database Id for the project for which we're retrieving raters\n * @param participantId - the database Id for the specific project participant whose raters we're retrieving\n */\nexport const undeliveredEmailsAction = (projectId: number, participantId: number) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.UndeliveredEmails,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n }),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const raters = state.projectRaters?.[action.meta.projectId] || {};\n const undeliveredIds = R.filter(key => payload!.includes(raters[key].email.toLowerCase()), Object.keys(raters));\n const undelivered = R.pick(undeliveredIds, raters) as Map;\n const marked = Object.values(undelivered).reduce(\n (map, rater) => R.assoc(\n `${rater.raterId}`,\n R.mergeRight(rater, { undeliveredEmail: true, statusMessageKey: Str.Undelivered }),\n map,\n ),\n {},\n );\n\n const withUndeliveredMarked = R.mergeRight(raters, marked);\n const withUpdatedRaters = R.assocPath(\n ['projectRaters', `${action.meta.projectId}`], withUndeliveredMarked,\n successState,\n );\n\n return R.assoc('undeliveredEmails', payload || [], withUpdatedRaters);\n};\n\nexport const undeliveredEmailsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { AppState } from '../../core/redux/appState';\nimport { ReportRecipientProject } from '../models';\n\n\nconst KEY_ACTION = ActionType.ReportRecipientProjectsRequest;\nconst ACTIONS = [\n ActionType.ReportRecipientProjectsRequest,\n ActionType.ReportRecipientProjectsResponse,\n ActionType.ReportRecipientProjectsError,\n];\n\n\ntype Payload = ReportRecipientProject[];\n\n\ntype Meta = {\n recipientId: number;\n dateRange?: number;\n};\n\n\n/**\n * Dispatch this to retrieve all the projects for which the recipient has access to reports\n *\n * @param recipientId - the user's database person Id\n * @param dateRange - can be undefined or the selected date range - defaults to 3 (last 3 months)\n */\nexport const reportRecipientProjectsAction = (\n recipientId: number,\n dateRange?: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.ReportRecipientProjects,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n recipientId: recipientId,\n dateRange: dateRange,\n }),\n types: makeRsaaTypes(ACTIONS, { recipientId, dateRange }),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${recipientId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.recipientId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.assoc('reportRecipientProjects', payload, successState);\n};\n\nexport const reportRecipientProjectsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { AppState } from '../../core/redux/appState';\nimport { ReportRecipientParticipant } from '../models';\n\n\nconst KEY_ACTION = ActionType.ReportRecipientParticipantsRequest;\nconst ACTIONS = [\n ActionType.ReportRecipientParticipantsRequest,\n ActionType.ReportRecipientParticipantsResponse,\n ActionType.ReportRecipientParticipantsError,\n];\n\n\ntype Payload = ReportRecipientParticipant[];\n\n\ntype Meta = {\n recipientId: number;\n projectIds?: number[];\n dateRange?: number;\n};\n\n\n/**\n * Dispatch this to retrieve all the participants for whom the recipient can access reports\n *\n * @param recipientId - the user's database person Id\n * @param projectIds - can be undefined or a list of project ids - defaults to empty list\n * @param dateRange - can be undefined or the selected date range - defaults to 3 (last 3 months)\n */\nexport const reportRecipientParticipantsAction = (\n recipientId: number,\n projectIds?: number[],\n dateRange?: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.ReportRecipientParticipants,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n recipientId: recipientId,\n projectIds: projectIds,\n dateRange: dateRange,\n }),\n types: makeRsaaTypes(ACTIONS, { recipientId, projectIds, dateRange }),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${recipientId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.recipientId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.assoc('reportRecipientParticipants', payload, successState);\n};\n\nexport const reportRecipientParticipantsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { AppState } from '../../core/redux/appState';\nimport { ReportRecipientReport } from '../models';\n\n\nconst KEY_ACTION = ActionType.ReportRecipientReportsRequest;\nconst ACTIONS = [\n ActionType.ReportRecipientReportsRequest,\n ActionType.ReportRecipientReportsResponse,\n ActionType.ReportRecipientReportsError,\n];\n\n\ntype Payload = ReportRecipientReport[];\n\n\ntype Meta = {\n recipientId: number;\n projectIds?: number[];\n participantIds?: number[];\n dateRange?: number;\n lastOnly?: boolean;\n};\n\n\n/**\n * Dispatch this to retrieve all the reports to which the recipient has access\n *\n * @param recipientId - the user's database person Id\n * @param projectIds - can be undefined or a list of project ids - defaults to empty list\n * @param participantIds - can be undefined or a list of participant ids - defaults to empty list\n * @param dateRange - can be undefined or the selected date range - defaults to 3 (last 3 months)\n * @param lastOnly: can be undefined or true to get only the last report - defaults to false\n * @param userName: current user name\n*/\nexport const reportRecipientReportsAction = (\n recipientId: number,\n userName: string,\n projectIds?: number[],\n participantIds?: number[],\n dateRange?: number,\n lastOnly?: boolean,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.ReportRecipientReports,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n recipientId: recipientId,\n userName: userName,\n projectIds: projectIds,\n participantIds: participantIds,\n dateRange: dateRange,\n lastOnly: lastOnly,\n }),\n types: makeRsaaTypes(ACTIONS, {\n recipientId,\n projectIds,\n participantIds,\n dateRange,\n lastOnly,\n }),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${recipientId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.recipientId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const withOldReportsDeleted = R.dissoc('reportRecipientReports', successState);\n return R.assoc('reportRecipientReports', payload, withOldReportsDeleted) as AppState;\n};\n\nexport const reportRecipientReportsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { ReportDeliveryRequest } from '../models';\nimport { toMap } from '../../language/arrays';\n\n\nconst KEY_ACTION = ActionType.DeliverReportsRequest;\nconst ACTIONS = [\n ActionType.DeliverReportsRequest,\n ActionType.DeliverReportsResponse,\n ActionType.DeliverReportsError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n deliveryRequest: ReportDeliveryRequest[];\n};\n\n\n/**\n * Dispatch this to retrieve all the participants whose raters the current user has been assigned to approve\n */\nexport const deliverReportsAction = (\n deliveryRequest: ReportDeliveryRequest[],\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.DeliverReports,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n reports: deliveryRequest,\n }),\n types: makeRsaaTypes(ACTIONS, { deliveryRequest }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.deliveryRequest}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const allReports = toMap(\n state.reportRecipientReports || [],\n r => `${r.reportSetId}-${r.participantId}-${r.reportId}`,\n );\n const requestArray = action.meta.deliveryRequest;\n const requestMap = toMap(requestArray, req => `${req.reportSetId}-${req.participantId}-${req.reportId}`);\n const reportsToUpdate = R.map(key => allReports[key], Object.keys(requestMap));\n const updatedReports = R.map(\n r => R.mergeRight(r, { deliveryDate: new Date(), portalDelivered: true }), reportsToUpdate,\n );\n const reMappedUpdatedReports = toMap(\n updatedReports,\n r => `${r.reportSetId}-${r.participantId}-${r.reportId}`,\n );\n const merged = R.mergeRight(allReports, reMappedUpdatedReports);\n\n return R.assoc('reportRecipientReports', Object.values(merged), successState);\n};\n\nexport const deliverReportsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { ReportDeliveryRequest } from '../models';\nimport { toMap } from '../../language/arrays';\n\n\nconst KEY_ACTION = ActionType.DeliverReportsToRecipientRequest;\nconst ACTIONS = [\n ActionType.DeliverReportsToRecipientRequest,\n ActionType.DeliverReportsToRecipientResponse,\n ActionType.DeliverReportsToRecipientError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n deliveryRequest: ReportDeliveryRequest[];\n\n};\n\n\n/**\n * Dispatch this to retrieve all the participants whose raters the current user has been assigned to approve\n */\nexport const deliverReportsAction = (\n deliveryRequest: ReportDeliveryRequest[],\n recipientId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.DeliverReportsToRecipient,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n reports: deliveryRequest,\n recipientId: recipientId,\n }),\n types: makeRsaaTypes(ACTIONS, { deliveryRequest }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.deliveryRequest}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const allReports = toMap(\n state.reportRecipientReports || [],\n r => `${r.reportSetId}-${r.participantId}-${r.reportId}`,\n );\n const requestArray = action.meta.deliveryRequest;\n const requestMap = toMap(requestArray, req => `${req.reportSetId}-${req.participantId}-${req.reportId}`);\n const reportsToUpdate = R.map(key => allReports[key], Object.keys(requestMap));\n const updatedReports = R.map(\n r => R.mergeRight(r, { deliveryDate: new Date(), portalDelivered: true }), reportsToUpdate,\n );\n const reMappedUpdatedReports = toMap(\n updatedReports,\n r => `${r.reportSetId}-${r.participantId}-${r.reportId}`,\n );\n const merged = R.mergeRight(allReports, reMappedUpdatedReports);\n\n return R.assoc('reportRecipientReports', Object.values(merged), successState);\n};\n\nexport const deliverReportsToRecipientReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { FeedbackSurveyQuestion } from '../models';\n\n\nconst KEY_ACTION = ActionType.GetSelectedQuestionsRequest;\nconst ACTIONS = [\n ActionType.GetSelectedQuestionsRequest,\n ActionType.GetSelectedQuestionsResponse,\n ActionType.GetSelectedQuestionsError,\n];\n\n\ntype Payload = FeedbackSurveyQuestion[];\n\ntype Meta = {\n projectId: number;\n participantId: number;\n};\n\n\n/**\n * Dispatch this action to get the selected feedback survey questions\n */\nexport const getSelectedQuestionsAction = (projectId: number, participantId: number) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.GetSelectedQuestions,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({ projectId, participantId, languageId: state.locale.lang.languageId }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['selectedQuestions', `${action.meta.projectId}`], payload, successState);\n};\n\n\nexport const getSelectedQuestionsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { FeedbackSurveyQuestion } from '../models';\n\n\nconst KEY_ACTION = ActionType.AddQuestionRequest;\nconst ACTIONS = [\n ActionType.AddQuestionRequest,\n ActionType.AddQuestionResponse,\n ActionType.AddQuestionError,\n];\n\n\ntype Payload = FeedbackSurveyQuestion;\n\ntype Meta = {\n projectId: number;\n participantId: number;\n};\n\n\n/**\n * Dispatch this action to add a dev plan item\n */\nexport const addQuestionAction = (\n projectId: number,\n participantId: number,\n questionId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.AddQuestion,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n questionId: questionId,\n languageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n if (!payload) {\n return successState;\n }\n\n return R.assocPath(\n ['selectedQuestions', `${action.meta.projectId}`],\n (successState.selectedQuestions?.[`${action.meta.projectId}`] || []).concat(payload),\n successState,\n );\n};\n\n\nexport const addQuestionReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { FeedbackSurveyQuestion } from '../models';\n\n\nconst KEY_ACTION = ActionType.AddQuestionsForCompetencyRequest;\nconst ACTIONS = [\n ActionType.AddQuestionsForCompetencyRequest,\n ActionType.AddQuestionsForCompetencyResponse,\n ActionType.AddQuestionsForCompetencyError,\n];\n\n\ntype Payload = FeedbackSurveyQuestion[];\n\ntype Meta = {\n projectId: number;\n participantId: number;\n};\n\n\n/**\n * Dispatch this action to add a dev plan item\n */\nexport const addQuestionsForCompetencyAction = (\n projectId: number,\n participantId: number,\n competencyId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.AddQuestionsForCompetency,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n competencyId: competencyId,\n languageId: state.locale.lang.languageId,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n if (!payload) {\n return successState;\n }\n\n return R.assocPath(\n ['selectedQuestions', `${action.meta.projectId}`],\n (successState.selectedQuestions?.[`${action.meta.projectId}`] || []).concat(payload),\n successState,\n ); \n};\n\n\nexport const addQuestionsForCompetencyReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.DeleteQuestionRequest;\nconst ACTIONS = [\n ActionType.DeleteQuestionRequest,\n ActionType.DeleteQuestionResponse,\n ActionType.DeleteQuestionError,\n];\n\n\ntype Payload = boolean;\n\ntype Meta = {\n questionId: number;\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to delete the dev plan items made by the user\n */\nexport const deleteQuestionAction = (\n projectId: number,\n participantId: number,\n questionId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.DeleteQuestion,\n headers: { 'content-type': 'application/json', 'accept': 'application/json' },\n body: state => JSON.stringify({\n projectId,\n participantId,\n questionId,\n }),\n types: makeRsaaTypes(ACTIONS, { questionId, projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, questionId),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const questionId = action.meta.questionId;\n if (isLoading) {\n return addLoading(state, KEY_ACTION, questionId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, questionId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, questionId);\n\n return R.assocPath(\n ['selectedQuestions', `${action.meta.projectId}`],\n successState.selectedQuestions?.\n [`${action.meta.projectId}`].\n filter(item => item.questionId !== questionId || item.required) ?? [],\n R.dissocPath(['selectedQuestions', `${action.meta.projectId}`, `${questionId}`], successState),\n ); \n};\n\n\nexport const deleteQuestionReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.DeleteQuestionsForCompetencyRequest;\nconst ACTIONS = [\n ActionType.DeleteQuestionsForCompetencyRequest,\n ActionType.DeleteQuestionsForCompetencyResponse,\n ActionType.DeleteQuestionsForCompetencyError,\n];\n\n\ntype Payload = boolean;\n\ntype Meta = {\n competencyId: number;\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to delete the dev plan items made by the user\n */\nexport const deleteQuestionsForCompetencyAction = (\n projectId: number,\n participantId: number,\n competencyId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.DeleteQuestionsForCompetency,\n headers: { 'content-type': 'application/json', 'accept': 'application/json' },\n body: state => JSON.stringify({\n projectId,\n participantId,\n competencyId,\n }),\n types: makeRsaaTypes(ACTIONS, { competencyId, projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, competencyId),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const competencyId = action.meta.competencyId;\n if (isLoading) {\n return addLoading(state, KEY_ACTION, competencyId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, competencyId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, competencyId);\n\n return R.assocPath(\n ['selectedQuestions', `${action.meta.projectId}`],\n successState.selectedQuestions?.\n [`${action.meta.projectId}`].\n filter(item => item.competencyId !== competencyId || item.required) ?? [],\n R.dissocPath(['selectedQuestions', `${action.meta.projectId}`, `${action.meta.competencyId}`], successState),\n );\n};\n\n\nexport const deleteQuestionsForCompetencyReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { CompetencyAndQuestion } from '../models';\n\n\nconst KEY_ACTION = ActionType.GetCompetenciesAndQuestionsRequest;\nconst ACTIONS = [\n ActionType.GetCompetenciesAndQuestionsRequest,\n ActionType.GetCompetenciesAndQuestionsResponse,\n ActionType.GetCompetenciesAndQuestionsError,\n];\n\n\ntype Payload = CompetencyAndQuestion[];\n\ntype Meta = {\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to get the competencies and questions used to build the feedback survey\n */\nexport const getCompetenciesAndQuestionsAction = (projectId: number) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.GetCompetenciesAndQuestions,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({ projectId, languageId: state.locale.lang.languageId }),\n types: makeRsaaTypes(ACTIONS, { projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['competenciesAndQuestions', `${action.meta.projectId}`], payload, successState);\n};\n\n\nexport const getCompetenciesAndQuestionsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.ApplyPendingChangesRequest;\nconst ACTIONS = [\n ActionType.ApplyPendingChangesRequest,\n ActionType.ApplyPendingChangesResponse,\n ActionType.ApplyPendingChangesError,\n];\n\n\ntype Payload = string;\n\ntype Meta = {\n projectId: number;\n participantId: number;\n};\n\n\n/**\n * Dispatch this action to add a dev plan item\n */\nexport const applyPendingChangesAction = (\n projectId: number,\n participantId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.ApplyPendingChanges,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['projectSummary', 'followupSurveyCreated'], true, successState);\n};\n\n\nexport const applyPendingChangesReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { AppState } from '../../core/redux/appState';\nimport { RaterApprovalRater } from '../models';\n\n\nconst KEY_ACTION = ActionType.RaterApprovalRatersRequest;\nconst ACTIONS = [\n ActionType.RaterApprovalRatersRequest,\n ActionType.RaterApprovalRatersResponse,\n ActionType.RaterApprovalRatersError,\n];\n\n\ntype Payload = RaterApprovalRater[];\n\n\ntype Meta = {\n participantId: number;\n projectId: number;\n};\n\n\n/**\n * Dispatch this to retrieve all the participants whose raters the current user has been assigned to approve\n *\n * @param participantId - the user's database Id\n * @param projectId - the user's database Id\n */\nexport const raterApprovalRatersAction = (\n participantId: number,\n projectId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.RaterApprovalRaters,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ participantId, projectId }),\n types: makeRsaaTypes(ACTIONS, { participantId, projectId }),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${participantId}-${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const participantId = action.meta.participantId;\n const projectId = action.meta.projectId;\n const metaTag = `${participantId}-${projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.assocPath(['raterApprovalRaters', `${participantId}`, `${projectId}`], payload, successState);\n};\n\nexport const raterApprovalRatersReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\nimport { SendTo } from '../../project/survey/raters/models';\n\n\nconst KEY_ACTION = ActionType.SendRaterApprovalRequest;\nconst ACTIONS = [\n ActionType.SendRaterApprovalRequest,\n ActionType.SendRaterApprovalResponse,\n ActionType.SendRaterApprovalError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n approverId: number;\n participantId: number;\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to request approval for the participant's added raters from the designated approver\n *\n * @param approverId - the person Id of the rater designated as approver for this list of raters\n * @param participantId - the specific project participant for whom we wish to invite raters\n * @param projectId - the project to which we wish to invite raters\n * @param comment - a custom comment included in the email sent out to invited raters\n * @param to - the list of rater email addresses to invite (along with the database Id for the language to be used for\n * each message)\n * @param ratersApproved - the number of raters approved by the designated approver\n * @param ratersDeclined - the number of raters declined by the designated approver\n * @param ratersAdded - the number of raters added to the project by the designated approver (as opposed to the\n * participant themself)\n */\nexport const sendRaterApprovalAction = (\n approverId: number,\n participantId: number,\n projectId: number,\n comment: string,\n to: SendTo[],\n ratersApproved: number,\n ratersDeclined: number,\n ratersAdded: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SendRaterApproval,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectId,\n participantId,\n comment,\n to,\n approverId,\n ratersApproved,\n ratersDeclined,\n ratersAdded,\n }),\n types: makeRsaaTypes(ACTIONS, { approverId, participantId, projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${approverId}-${participantId}-${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const approverId = action.meta.approverId;\n const participantId = action.meta.participantId;\n const projectId = action.meta.projectId;\n const metaTag = `${approverId}-${participantId}-${projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n return noLoadingNoError(state, KEY_ACTION, metaTag);\n};\n\nexport const sendRaterApprovalReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\nimport { EmailBody } from '../../project/survey/raters/models';\n\n\nconst KEY_ACTION = ActionType.RaterApprovalEmailPreviewRequest;\nconst ACTIONS = [\n ActionType.RaterApprovalEmailPreviewRequest,\n ActionType.RaterApprovalEmailPreviewResponse,\n ActionType.RaterApprovalEmailPreviewError,\n];\n\n\ntype Payload = EmailBody;\n\n\ntype Meta = {\n projectId: number;\n languageId: number;\n};\n\n\n/**\n * Dispatch this action to send invitation emails to all as-yet uninvited raters who have been added to the given\n * project for the listed participant\n */\nexport const raterApprovalEmailPreviewAction = (projectId: number, languageId: number) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.RaterApprovalEmailPreview,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectId: projectId,\n languageId: languageId,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, languageId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${projectId}-${languageId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const projectId = action.meta.projectId;\n const languageId = action.meta.languageId;\n const metaTag = `${projectId}-${languageId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.assocPath(\n ['raterApprovalEmailTemplates', `${projectId}`, `${languageId}`],\n payload,\n successState,\n );\n};\n\nexport const raterApprovalEmailPreviewReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\n\n\nconst KEY_ACTION = ActionType.SendReportRecipientPasswordResetEmailRequest;\nconst ACTIONS = [\n ActionType.SendReportRecipientPasswordResetEmailRequest,\n ActionType.SendReportRecipientPasswordResetEmailResponse,\n ActionType.SendReportRecipientPasswordResetEmailError,\n];\n\ntype Payload = number;\n\ntype Meta = {\n emailAddress: string;\n languageId: number;\n};\n\n/**\n * Dispatch this action to send the user's answer to their security question (which is required in order to reset their\n * password) when attempting to log in from the report recipient portal\n *\n * @param emailAddress - the email address of the user attempting to answer the question\n * @param languageId - the database Id of the language in which the email should be sent\n */\nexport const sendReportRecipientPasswordResetEmailAction = (\n emailAddress: string,\n languageId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.SendReportRecipientForgotPassword,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ toAddress: emailAddress, languageId: languageId }),\n types: makeRsaaTypes(ACTIONS, { emailAddress: emailAddress, languageId: languageId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${emailAddress}-${languageId}`),\n});\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.emailAddress}-${action.meta.languageId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.dissocPath(['auth', 'passwordReset'], successState);\n};\n\nexport const sendReportRecipientPasswordResetEmailReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { ApiReducer, makeApiReducer, makeApiAction, makeRsaaTypes } from '../../../core/api/rsaa';\nimport { addError, noLoadingNoError, addLoading, getLoading } from '../../../core/api/module';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.UnsetCreatedSurveyRequest;\nconst ACTIONS = [\n ActionType.UnsetCreatedSurveyRequest,\n ActionType.UnsetCreatedSurveyResponse,\n ActionType.UnsetCreatedSurveyError,\n];\n\n\ntype Payload = string;\n\ntype Meta = {\n projectId: number;\n participantId: number;\n};\n\n\n/**\n * Dispatch this action to add a dev plan item\n */\nexport const unsetCreatedSurveyAction = (\n projectId: number,\n participantId: number,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.UnsetCreatedSurvey,\n headers: { 'content-type': 'application/json' },\n body: state => JSON.stringify({\n projectId: projectId,\n participantId: participantId,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId, participantId }),\n bailout: state => !!getLoading(state, KEY_ACTION),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n if (isLoading) {\n return addLoading(state, KEY_ACTION);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION);\n\n return R.assocPath(['projectSummary', 'followupSurveyCreated'], false, successState);\n};\n\n\nexport const unsetCreatedSurveyReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport * as R from 'ramda';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { Rater } from '../../project/survey/raters/models';\nimport { AppState } from '../../core/redux/appState';\n\n\nconst KEY_ACTION = ActionType.AddRaterByEmailAsApproverRequest;\nconst ACTIONS = [\n ActionType.AddRaterByEmailAsApproverRequest,\n ActionType.AddRaterByEmailAsApproverResponse,\n ActionType.AddRaterByEmailAsApproverError,\n];\n\n\ntype Payload = Rater;\n\n\ntype Meta = {\n email: string;\n projectId: number;\n};\n\n\n/**\n * Dispatch this to associate a new rater with the specified project\n *\n * @param projectId - the database Id for the project to which this person should be added\n * @param participantId - the database Id for the participant to be rated\n * @param levelId - the rater's permissions level\n * @param email - the rater's email address\n * @param firstName - the rater's first name\n * @param lastName - the rater's last name\n */\nexport const addRaterByEmailAsApproverAction = (\n projectId: number,\n participantId: number,\n levelId: number,\n email: string,\n firstName: string,\n lastName: string,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.AddRaterByEmailAsApprover,\n headers: { 'content-type': 'application/json' },\n body: (state: AppState) => JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n levelId: levelId,\n email: email,\n firstName: firstName,\n lastName: lastName,\n pageLanguageId: state.locale.lang.languageId,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n email: email,\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${email}-${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const email = action.meta.email;\n const projectId = action.meta.projectId;\n const participantId = payload?.participantId;\n const metaTag = `${email}-${projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const raterApprovalRaters = successState.raterApprovalRaters?.[`${participantId}`]?.[`${projectId}`];\n\n return R.assocPath(\n ['raterApprovalRaters', `${participantId}`, `${projectId}`],\n !!payload ? raterApprovalRaters?.concat(payload) : raterApprovalRaters,\n successState,\n );\n};\n\nexport const addRaterByEmailAsApproverReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\nimport { Rater } from '../../project/survey/raters/models';\nimport * as R from 'ramda';\nimport { toIndexAwareMap } from '../../language/arrays';\nimport { RaterApprovalStatus } from '../raterApprovalStatus';\nimport { AppState } from '../../core/redux/appState';\n\n\nconst KEY_ACTION = ActionType.ApproveRaterRequest;\nconst ACTIONS = [\n ActionType.ApproveRaterRequest,\n ActionType.ApproveRaterResponse,\n ActionType.ApproveRaterError,\n];\n\n\ntype Payload = Rater;\n\n\ntype Meta = {\n participantId: number;\n projectId: number;\n raterId: number;\n};\n\n\n/**\n * Dispatch this action to change a participant rater's approval status (i.e., to approve or decline the rater)\n *\n * @param participantId - database Id of the specific project participant for whom we wish to invite raters\n * @param projectId - database Id of the project to which we wish to invite raters\n * @param raterId - person Id for the rater whose approval status we wish to change\n */\nexport const approveRaterAction = (\n participantId: number,\n projectId: number,\n raterId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.UpdateApprovalStatus,\n headers: { 'content-type': 'application/json' },\n body: (state: AppState) => JSON.stringify(\n {\n participantId,\n projectId,\n raterId,\n pageLanguageId: state.locale.lang.languageId,\n approvalStatus: RaterApprovalStatus.Approved,\n }),\n types: makeRsaaTypes(ACTIONS, { participantId, projectId, raterId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${participantId}-${projectId}-${raterId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const participantId = action.meta.participantId;\n const projectId = action.meta.projectId;\n const raterId = action.meta.raterId;\n const metaTag = `${participantId}-${projectId}-${raterId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const projectRaterArray = state.raterApprovalRaters?.[`${participantId}`]?.[`${projectId}`] || [];\n\n // Maintain the sort order we had before we send the update approval status request\n const projectRaterMap = toIndexAwareMap(\n projectRaterArray,\n r => `${r.email}`,\n );\n\n const raterToUpdate = projectRaterMap[payload!.email];\n\n return R.assocPath(\n ['raterApprovalRaters', `${participantId}`, `${projectId}`],\n R.update(raterToUpdate.sourceIndex, payload, projectRaterArray),\n successState,\n );\n};\n\nexport const approveRaterReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","export enum SessionStorageKeys {\n // Global\n Config = 'config',\n FeatureFlags = 'featureFlags',\n Auth = 'auth',\n Collaborator = 'collaborator',\n Locale = 'locale',\n ProjectSummary = 'projectSummary',\n\n // Email templates\n InviteEmailTemplates = 'inviteEmailTemplates',\n ApproverEmailTemplates = 'approverEmailTemplates',\n RaterEmailTemplates = 'raterApprovalEmailTemplates',\n EQScoresEmailTemplates = 'eqScoresEmailTemplates',\n\n // Email tags\n CustomEmailTxt = 'customEmailTxt',\n CustomEmailLogo = 'customEmailLogo',\n CustomEmailParticipant = 'customEmailParticipant',\n CustomEmailSurvey = 'customEmailSurvey',\n CustomEmailDateDue = 'customEmailDateDue',\n CustomEmailRatersApproved = 'customEmailRatersApproved',\n CustomEmailRatersDeclined = 'customEmailRatersDeclined',\n CustomEmailRatersAdded = 'customEmailRatersAdded',\n\n // Specific to the share EQ scores email template\n EQScores = 'eqScores',\n EQScoresEmailTxt = 'eqScoresEmailTxt',\n ProjectCSContact = 'projectCSContact',\n}\n","import { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\nimport { Rater } from '../../project/survey/raters/models';\nimport * as R from 'ramda';\nimport { toIndexAwareMap } from '../../language/arrays';\nimport { RaterApprovalStatus } from '../raterApprovalStatus';\nimport { AppState } from '../../core/redux/appState';\n\n\nconst KEY_ACTION = ActionType.DeclineRaterRequest;\nconst ACTIONS = [\n ActionType.DeclineRaterRequest,\n ActionType.DeclineRaterResponse,\n ActionType.DeclineRaterError,\n];\n\n\ntype Payload = Rater;\n\n\ntype Meta = {\n participantId: number;\n projectId: number;\n raterId: number;\n};\n\n\n/**\n * Dispatch this action to change a participant rater's approval status (i.e., to approve or decline the rater)\n *\n * @param participantId - database Id of the specific project participant for whom we wish to invite raters\n * @param projectId - database Id of the project to which we wish to invite raters\n * @param raterId - person Id for the rater whose approval status we wish to change\n */\nexport const declineRaterAction = (\n participantId: number,\n projectId: number,\n raterId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.UpdateApprovalStatus,\n headers: { 'content-type': 'application/json' },\n body: (state: AppState) => JSON.stringify(\n {\n participantId,\n projectId,\n raterId,\n pageLanguageId: state.locale.lang.languageId,\n approvalStatus: RaterApprovalStatus.Declined,\n }), types: makeRsaaTypes(ACTIONS, { participantId, projectId, raterId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${participantId}-${projectId}-${raterId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const participantId = action.meta.participantId;\n const projectId = action.meta.projectId;\n const raterId = action.meta.raterId;\n const metaTag = `${participantId}-${projectId}-${raterId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const projectRaterArray = state.raterApprovalRaters?.[`${participantId}`]?.[`${projectId}`] || [];\n\n const projectRaterMap = toIndexAwareMap(\n projectRaterArray,\n r => `${r.email}`,\n );\n\n const raterToUpdate = projectRaterMap[payload!.email];\n\n return R.assocPath(\n ['raterApprovalRaters', `${participantId}`, `${projectId}`],\n R.update(raterToUpdate.sourceIndex, payload, projectRaterArray),\n successState,\n );\n};\n\nexport const declineRaterReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { AppState } from './appState';\nimport { ActionType } from './actionType';\nimport { Action } from 'redux';\nimport { PortalType } from '../../navigation/portalType';\n\n\ntype SetPortalTypeAction = {\n type: ActionType.SetPortalTypeAction;\n portalType: PortalType;\n}\n\n\n/**\n * Generally, you don't want to use this action, but it's useful in a handful of circumstances.\n * Deep-merges the state given here onto the current app state.\n */\nexport const setPortalTypeAction = (\n portalType: PortalType,\n): SetPortalTypeAction => ({\n type: ActionType.SetPortalTypeAction,\n portalType: portalType,\n});\n\n\nexport const setPortalTypeReducer = (state: AppState, action: Action): AppState => {\n if (action.type !== ActionType.SetPortalTypeAction) {\n return state;\n }\n\n return R.assoc(\n 'portalType',\n (action as SetPortalTypeAction).portalType,\n state,\n );\n};\n","import * as R from 'ramda';\nimport { AppState } from '../../../core/redux/appState';\nimport { Action } from 'redux';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\n/**\n * Hash map of actions that don't count as user activity in the app for the purposes of logout timing. Boolean value is\n * just to ensure something truthy is returned when looking up actions in the map.\n * Needs to be a hash map for high lookup performance, even if an array is more intuitive.\n */\nconst ACTIONS_TO_IGNORE: { [key: string]: true } = {\n [ActionType.LogOut]: true,\n\n // Polling Status Check doesn't count as user activity\n [ActionType.LoadCurrentStatusRequest]: true,\n [ActionType.LoadCurrentStatusResponse]: true,\n [ActionType.LoadCurrentStatusError]: true,\n};\n\n\n/**\n * Reducer that tracks the user's activity for the logout timer\n */\nexport const appActivityReducer = (state: AppState, action: Action): AppState => {\n if (ACTIONS_TO_IGNORE[action.type]) {\n return state;\n }\n\n return R.assoc('lastActivity', new Date(), state);\n};\n","import * as R from 'ramda';\nimport { Action } from 'redux';\nimport { ActionType } from './core/redux/actionType';\nimport { AppState } from './core/redux/appState';\n\n\ntype ShowTimeoutModalAction = {\n type : ActionType.ShowTimeoutModalAction;\n showModal: boolean;\n}\n\n\nexport const showTimeoutModalAction = (\n show: boolean,\n): ShowTimeoutModalAction => ({\n type: ActionType.ShowTimeoutModalAction,\n showModal: show,\n});\n\n\nexport const showTimeoutModalReducer = (state: AppState, action: Action): AppState => {\n if (action.type !== ActionType.ShowTimeoutModalAction) {\n return state;\n }\n\n return R.assoc('showTimeoutModal', (action as ShowTimeoutModalAction).showModal, state);\n};\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../core/api/module';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { AppState } from '../../core/redux/appState';\n\n\nconst KEY_ACTION = ActionType.ReportDataRequest;\nconst ACTIONS = [\n ActionType.ReportDataRequest,\n ActionType.ReportDataResponse,\n ActionType.ReportDataError,\n];\n\n\ntype Payload = Uint8Array;\n\n\ntype Meta = {\n file: string;\n};\n\n\n/**\n * Dispatch this to retrieve file data for report\n *\n * @param file - the file to return\n */\nexport const reportDataAction = (\n file: string,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.ReportData,\n headers: { 'content-type': 'application/json',\n 'accept': 'application/octet-stream'},\n body: JSON.stringify({\n file: file,\n }),\n types: makeRsaaTypes(ACTIONS, { file }),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.file}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n//TODO - payload moved into state - need to handle elsewhere or maybe get rid of this action all together\n\n return R.assoc('reportData', payload, successState);\n};\n\nexport const reportDataReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { AppState } from '../../../core/redux/appState';\nimport { Action } from 'redux';\n\ntype SetDevPlanViewedAction = {\n type: ActionType.SetDevPlanViewedAction;\n viewed: boolean;\n};\n\nexport const setDevPlanViewedAction = (\n viewed: boolean,\n): SetDevPlanViewedAction => ({\n type: ActionType.SetDevPlanViewedAction,\n viewed: viewed,\n});\n\nexport const setDevPlanViewedReducer = (state: AppState, action: Action): AppState => {\n if (action.type !== ActionType.SetDevPlanViewedAction) {\n return state;\n }\n\n const sdpva = action as SetDevPlanViewedAction;\n\n return R.assocPath(['devPlan', 'viewed'], sdpva.viewed, state);\n};\n","import * as R from 'ramda';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../../core/api/module';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { DevPlanCollaborator } from '../models';\n\n\nconst KEY_ACTION = ActionType.AddDevPlanCollaboratorRequest;\nconst ACTIONS = [\n ActionType.AddDevPlanCollaboratorRequest,\n ActionType.AddDevPlanCollaboratorResponse,\n ActionType.AddDevPlanCollaboratorError,\n];\n\n\ntype Payload = DevPlanCollaborator;\n\n\ntype Meta = {\n email: string;\n projectId: number;\n};\n\n\n/**\n * Dispatch this to associate a new collaborator, by email address, with the dev plan for the specified project and\n * participant\n *\n * @param projectId - the database Id for the project the dev plan for which this person should be added\n * @param participantId - the database Id for the participant for whom this person should be added\n * @param email - the collaborator's email address\n * @param comment - additional text supplied by the user, to be included in the collaborator's invite email\n * @param languageId - the database Id for the language in which the email should be sent (usually just the project\n * default language)\n */\nexport const addDevPlanCollaboratorAction = (\n projectId: number,\n participantId: number,\n email: string,\n comment: string,\n languageId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.AddDevPlanCollaborator,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n to: {\n toAddress: email,\n languageId: languageId,\n },\n comment: comment,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n email: email,\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${email}-${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { email, projectId } = action.meta;\n\n const metaTag = `${email}-${projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n let successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n if (!payload) {\n return successState;\n }\n\n const currentCollaborators = R.path(\n ['devPlan', 'collaborators', `${projectId}`],\n successState,\n );\n\n const withCollaboratorAdded = (currentCollaborators ?? []).concat(payload);\n\n successState = R.assocPath(\n ['devPlan', 'collaborators', `${projectId}`],\n withCollaboratorAdded,\n successState,\n );\n\n // Notify the user that the invite was successfully sent.\n return R.assocPath(\n ['devPlan', 'lastEmailRecipient'],\n payload.email,\n successState,\n );\n};\n\nexport const addDevPlanCollaboratorReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../../core/api/module';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { DevPlanCollaborator } from '../models';\nimport { toMap } from '../../../../language/arrays';\nimport { Map } from '../../../../language/models';\n\n\nconst KEY_ACTION = ActionType.DeleteDevPlanCollaboratorRequest;\nconst ACTIONS = [\n ActionType.DeleteDevPlanCollaboratorRequest,\n ActionType.DeleteDevPlanCollaboratorResponse,\n ActionType.DeleteDevPlanCollaboratorError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n email: string;\n};\n\n\n/**\n * Dispatch this to delete a collaborator from the dev plan for the specified project and participant\n *\n * @param projectId - the database Id for the project the dev plan for which this person should be deleted\n * @param participantId - the database Id for the participant for whom this person should be deleted\n * @param email - the collaborator's email address\n */\nexport const deleteDevPlanCollaboratorAction = (\n projectId: number,\n participantId: number,\n email: string,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.DeleteDevPlanCollaborator,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n email: email,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n email: email,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${email}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId, email } = action.meta;\n\n const metaTag = `${projectId}-${email}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n let collaborators = toMap(\n R.path(['devPlan', 'collaborators', `${projectId}`], successState) ?? [],\n c => `${c.email}`,\n );\n\n collaborators = R.dissoc(`${email}`, collaborators) as Map;\n\n return R.assocPath(\n ['devPlan', 'collaborators', `${projectId}`],\n Object.values(collaborators),\n successState,\n );\n};\n\nexport const deleteDevPlanCollaboratorReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../../core/api/module';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { DevItemComment } from '../models';\n\n\nconst KEY_ACTION = ActionType.AddDevItemCommentRequest;\nconst ACTIONS = [\n ActionType.AddDevItemCommentRequest,\n ActionType.AddDevItemCommentResponse,\n ActionType.AddDevItemCommentError,\n];\n\n\ntype Payload = DevItemComment;\n\n\ntype Meta = {\n projectId: number;\n devItemId: number;\n devActionId: number;\n email: string;\n};\n\n\n/**\n * Dispatch this to associate a new comment with a dev item. Also associates the added comment to the commenting\n * collaborator.\n *\n * @param projectId - the database Id for the project containing the commented dev item\n * @param participantId - the database Id for the participant to whose dev item we're adding a comment\n * @param devItemId - the database Id for the commented dev item\n * @param devActionId - the database Id for the specific action in the dev item to which the comment is to be added\n * @param email - the email address of the commenting user\n * @param comment - the content of the posted comment\n */\nexport const addDevItemCommentAction = (\n projectId: number,\n participantId: number,\n devItemId: number,\n devActionId: number,\n email: string,\n comment: string,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.AddDevItemComment,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n devItemId: devItemId,\n devActionId: devActionId,\n email: email,\n comment: comment,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n devItemId: devItemId,\n devActionId: devActionId,\n email: email,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${devItemId}-${devActionId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId, devItemId, devActionId } = action.meta;\n\n const metaTag = `${projectId}-${devItemId}-${devActionId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n if (!payload) {\n return successState;\n }\n\n let itemComments = R.path(\n ['devPlan', 'comments', projectId, `${devItemId}`],\n successState,\n );\n\n itemComments = payload ? (itemComments ?? []).concat(payload) : itemComments;\n\n return R.assocPath(\n ['devPlan', 'comments', projectId, `${devItemId}`],\n itemComments,\n successState,\n );\n};\n\nexport const addDevItemCommentReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../../core/api/module';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { DevItemComment } from '../models';\n\n\nconst KEY_ACTION = ActionType.UpdateDevItemCommentRequest;\nconst ACTIONS = [\n ActionType.UpdateDevItemCommentRequest,\n ActionType.UpdateDevItemCommentResponse,\n ActionType.UpdateDevItemCommentError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n devItemId: number;\n commentId: number;\n comment: string;\n};\n\n\n/**\n * Dispatch this to update the content of a dev item comment.\n *\n * @param projectId - the database Id for the project containing the commented dev item\n * @param participantId - the database Id for the participant for whose dev item we're updating a comment\n * @param devItemId - the database Id for the commented dev item\n * @param commentId = the database Id for the edited comment\n * @param comment - the content of the updated comment\n */\nexport const updateDevItemCommentAction = (\n projectId: number,\n participantId: number,\n devItemId: number,\n commentId: number,\n comment: string,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.UpdateDevItemComment,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n commentId: commentId,\n comment: comment,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n devItemId: devItemId,\n commentId: commentId,\n comment: comment,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${devItemId}-${commentId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId, devItemId, commentId, comment } = action.meta;\n\n const metaTag = `${projectId}-${devItemId}-${commentId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n const itemComments = R.path(['devPlan', 'comments', `${projectId}`, `${devItemId}`], successState)\n ?? [];\n\n const commentIndex = R.findIndex(\n comment => comment.commentId === commentId,\n itemComments,\n );\n\n const commentToUpdate = R.mergeRight(\n itemComments[commentIndex],\n {\n comment: comment,\n lastUpdated: new Date(),\n } as DevItemComment,\n );\n\n return R.assocPath(\n ['devPlan', 'comments', `${projectId}`, `${devItemId}`, commentIndex],\n commentToUpdate,\n successState,\n );\n};\n\nexport const updateDevItemCommentReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../../core/api/module';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { DevItemComment } from '../models';\nimport { toMap } from '../../../../language/arrays';\nimport { Map } from '../../../../language/models';\n\n\nconst KEY_ACTION = ActionType.DeleteDevItemCommentRequest;\nconst ACTIONS = [\n ActionType.DeleteDevItemCommentRequest,\n ActionType.DeleteDevItemCommentResponse,\n ActionType.DeleteDevItemCommentError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n devItemId: number;\n commentId: number;\n};\n\n\n/**\n * Dispatch this to delete a dev item comment.\n *\n * @param projectId - the database Id for the project containing the commented dev item\n * @param participantId - the database Id for the participant for whose dev item we're deleting a comment\n * @param devItemId - the database Id for the commented dev item\n * @param commentId = the database Id for the deleted comment\n */\nexport const deleteDevItemCommentAction = (\n projectId: number,\n participantId: number,\n devItemId: number,\n commentId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.DeleteDevItemComment,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n commentId: commentId,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n devItemId: devItemId,\n commentId: commentId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${devItemId}-${commentId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId, devItemId, commentId } = action.meta;\n\n const metaTag = `${projectId}-${devItemId}-${commentId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n let itemComments = toMap(\n R.path(['devPlan', 'comments', `${projectId}`, `${devItemId}`], successState) ?? [],\n comment => `${comment.commentId}`,\n );\n\n itemComments = R.dissoc(`${commentId}`, itemComments) as Map;\n\n return R.assocPath(\n ['devPlan', 'collaborators', `${projectId}`, `${devItemId}`],\n Object.values(itemComments),\n successState,\n );\n};\n\nexport const deleteDevItemCommentReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../../core/api/module';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { DevPlanCollaborator } from '../models';\n\n\nconst KEY_ACTION = ActionType.GetDevPlanCollaboratorsRequest;\nconst ACTIONS = [\n ActionType.GetDevPlanCollaboratorsRequest,\n ActionType.GetDevPlanCollaboratorsResponse,\n ActionType.GetDevPlanCollaboratorsError,\n];\n\n\ntype Payload = DevPlanCollaborator[];\n\n\ntype Meta = {\n projectId: number;\n};\n\n\n/**\n * Dispatch this to retrieve all dev plan collaborators for the current project/participant pair\n *\n * @param projectId - the database Id for the project the dev plan for which collaborators are to be retrieved\n * @param participantId - the database Id for the participant for whom we're retrieving collaborators\n */\nexport const getDevPlanCollaboratorsAction = (\n projectId: number,\n participantId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.DevPlanCollaborators,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId } = action.meta;\n\n const metaTag = `${projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n if (!payload) {\n return successState;\n }\n\n return R.assocPath(\n ['devPlan', 'collaborators', `${projectId}`],\n payload,\n successState,\n );\n};\n\nexport const getDevPlanCollaboratorsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../../core/api/module';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { ActionType } from '../../../../core/redux/actionType';\n\n\nconst KEY_ACTION = ActionType.SetDevPlanCollaboratorAcceptedRequest;\nconst ACTIONS = [\n ActionType.SetDevPlanCollaboratorAcceptedRequest,\n ActionType.SetDevPlanCollaboratorAcceptedResponse,\n ActionType.SetDevPlanCollaboratorAcceptedError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n email: string;\n};\n\n\n/**\n * Dispatch this to retrieve all dev plan collaborators for the current project/participant pair\n *\n * @param projectId - the database Id for the project the dev plan for which the collaborators should be marked\n * @param participantId - the database Id for the participant for whom this person should be marked as having accepted\n * their invite\n * @param email - the collaborator's email address\n */\nexport const setDevPlanCollaboratorAcceptedAction = (\n projectId: number,\n participantId: number,\n email: string,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SetDevPlanCollaboratorAccepted,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n email: email,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n email: email,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${email}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId, email } = action.meta;\n\n const metaTag = `${projectId}-${email}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.assocPath(\n ['devPlan', 'currentCollaborator', 'currentProject', 'accepted'],\n true,\n successState,\n );\n};\n\nexport const setDevPlanCollaboratorAcceptedReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../../core/api/module';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { DevItemComment } from '../models';\n\n\nconst KEY_ACTION = ActionType.GetDevItemCommentsRequest;\nconst ACTIONS = [\n ActionType.GetDevItemCommentsRequest,\n ActionType.GetDevItemCommentsResponse,\n ActionType.GetDevItemCommentsError,\n];\n\n\ntype Payload = DevItemComment[];\n\n\ntype Meta = {\n projectId: number;\n};\n\n\n/**\n * Dispatch this to retrieve all dev plan collaborators for the current project/participant pair\n *\n * @param projectId - the database Id for the project the dev plan for which collaborators are to be retrieved\n * @param participantId - the database Id for the participant for whom we're retrieving collaborators\n */\nexport const getDevItemCommentsAction = (\n projectId: number,\n participantId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.DevItemComments,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId } = action.meta;\n\n const metaTag = `${projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n if (!payload) {\n return successState;\n }\n\n return R.assocPath(\n ['devPlan', 'comments', `${projectId}`],\n R.groupBy(c => `${c.devItemId}`, payload),\n successState,\n );\n};\n\nexport const getDevItemCommentsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { DevItemComment } from './models';\nimport * as R from 'ramda';\nimport { ParticipantEmailTag } from './constants';\nimport { TextDirection } from '../../../localization/textDirection';\nimport { firstLast, firstLastReverse } from '../../survey/raters/module';\n\n\ntype CommentsByReadStatus = {\n readComments: DevItemComment[],\n unreadComments: DevItemComment[],\n};\n\n\n/**\n * Use this to return an object that groups the provided comments array into two sub-arrays:\n *\n * * The `readComments` property contains all of the comments in the array marked as read\n * * The `unreadComments` property contains all of the comments in the array marked as unread\n *\n * @param comments - the collection of comments to be grouped by read status\n */\nexport const commentsByReadStatus = (\n comments: DevItemComment[],\n): CommentsByReadStatus => {\n // { readComments: [], unreadComments: [] }\n const { readComments, unreadComments } = R.groupBy(\n (c: DevItemComment) => c.commentRead || c.email === '||PARTICIPANT||' ? 'readComments' : 'unreadComments',\n comments ?? [],\n );\n\n return { readComments: readComments ?? [], unreadComments: unreadComments ?? [] };\n};\n\n\n/**\n * Returns the total number of comments marked unread in the provided comment array\n *\n * @param comments - the comments amongst which we wish to count the total unread\n */\nexport const unreadCommentCount = (\n comments: DevItemComment[],\n): number => comments.filter(c => !c.commentRead && c.email !== '||PARTICIPANT||').length;\n\n\n/**\n * Returns true if the comment was written by the current user, otherwise false\n *\n * @param comment - the comment to check for authorship\n * @param email - the email address for which we wish to check the comment\n */\nexport const isCurrentUserComment = (comment: DevItemComment, email: string) => email === comment.email;\n\n\n/**\n * Returns true if the comment was written by the project participant, otherwise false\n *\n * @param comment - the comment to check for authorship\n */\nexport const isParticipantComment = (comment: DevItemComment) => comment.email === ParticipantEmailTag;\n\n\n/**\n * Returns the subtitle for dev plan collaborator pages (the collaborator's name and email), formatted for left-to-right\n * page layouts.\n *\n * @param participant - the object from whose properties we'll build the subtitle\n */\nexport const devItemSubtitle = (\n participant: {\n participantFirstName: string | undefined;\n participantLastName: string | undefined;\n participantEmail: string | undefined;\n } | undefined,\n): string | undefined => {\n const firstName = participant?.participantFirstName;\n const lastName = participant?.participantLastName;\n const email = participant?.participantEmail;\n const nameStr = firstLast({ firstName, lastName });\n\n if (!nameStr) {\n return email;\n }\n\n if (!email) {\n return email;\n }\n\n return `${nameStr}, ${email}`;\n};\n\n\n/**\n * Returns the subtitle for dev plan collaborator pages (the collaborator's name and email), formatted for right-to-left\n * page layouts.\n *\n * @param participant - the object from whose properties we'll build the subtitle\n */\nexport const devItemSubtitleReverse = (\n participant: {\n participantFirstName: string | undefined;\n participantLastName: string | undefined;\n participantEmail: string | undefined;\n } | undefined,\n): string | undefined => {\n const firstName = participant?.participantFirstName;\n const lastName = participant?.participantLastName;\n const email = participant?.participantEmail;\n const nameStr = firstLastReverse({ firstName, lastName });\n\n if (!nameStr) {\n return email;\n }\n\n if (!email) {\n return email;\n }\n\n return `${email} ,${nameStr}`;\n};\n\n\n/**\n * Returns the subtitle for dev plan collaborator pages (the collaborator's name and email), formatted according to the\n * layout direction.\n *\n * @param dir - the text direction for which the subtitle should be rendered\n * @param participant - the object from whose properties we'll build the subtitle\n */\nexport const devItemSubtitleLocal = (\n dir: TextDirection,\n participant: {\n participantFirstName: string | undefined;\n participantLastName: string | undefined;\n participantEmail: string | undefined;\n } | undefined,\n): string | undefined => dir === TextDirection.LTR ? devItemSubtitle(participant) : devItemSubtitleReverse(participant);\n","export const ParticipantEmailTag = '||PARTICIPANT||';\n","import * as R from 'ramda';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../../core/api/module';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { DevItemComment } from '../models';\nimport { commentsByReadStatus } from '../module';\n\n\nconst KEY_ACTION = ActionType.SetDevItemCommentsReadRequest;\nconst ACTIONS = [\n ActionType.SetDevItemCommentsReadRequest,\n ActionType.SetDevItemCommentsReadResponse,\n ActionType.SetDevItemCommentsReadError,\n];\n\n\ntype Payload = DevItemComment[];\n\n\ntype Meta = {\n projectId: number;\n devPlanItemId: number;\n};\n\n\n/**\n * Dispatch this to retrieve all dev plan collaborators for the current project/participant pair\n *\n * @param projectId - the database Id for the project the dev plan for which collaborators are to be retrieved\n * @param devPlanItemId - the database Id for the dev item the comments for which we wish to update\n */\nexport const setDevItemCommentsReadAction = (\n projectId: number,\n devPlanItemId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SetDevItemCommentsRead,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n devPlanItemId: devPlanItemId,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n devPlanItemId: devPlanItemId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${devPlanItemId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId, devPlanItemId } = action.meta;\n\n const metaTag = `${projectId}-${devPlanItemId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n if (!payload) {\n return successState;\n }\n\n const comments = R.path(\n ['devPlan', 'comments', `${projectId}`, `${devPlanItemId}`],\n successState,\n );\n\n const { readComments, unreadComments } = commentsByReadStatus(comments ?? []);\n\n const updatedUnreadComments = unreadComments?.map(c => R.assoc('commentRead', true, c));\n\n return R.assocPath(\n ['devPlan', 'comments', `${projectId}`, `${devPlanItemId}`],\n readComments.concat(updatedUnreadComments),\n successState,\n );\n};\n\nexport const setDevItemCommentsReadReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../../core/api/rsaa';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../../core/api/module';\nimport * as R from 'ramda';\nimport { CollaboratorAuthInfo } from '../currentCollaboratorState';\n\n\nconst KEY_ACTION = ActionType.AuthenticateCollaboratorRequest;\nconst ACTIONS = [\n ActionType.AuthenticateCollaboratorRequest,\n ActionType.AuthenticateCollaboratorResponse,\n ActionType.AuthenticateCollaboratorError,\n];\n\ntype Payload = CollaboratorAuthInfo;\ntype Meta = {\n displayProjectId: string;\n participantId: number;\n email: string;\n};\n\n\n/**\n * Dispatch this action to authenticate a user accessing the portal from a collaborator invite email\n */\nexport const authenticateCollaboratorAction = (\n displayProjectId: string,\n participantId: number,\n email: string,\n) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.AuthenticateCollaborator,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n displayProjectId: displayProjectId,\n participantId: participantId,\n email: email,\n }),\n types: makeRsaaTypes(ACTIONS, { displayProjectId: displayProjectId, participantId, email }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${displayProjectId}-${participantId}-${email}`),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { displayProjectId, participantId, email } = action.meta;\n\n const requestId = `${displayProjectId}-${participantId}-${email}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, requestId);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, requestId);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, requestId);\n\n if (!payload) {\n return successState;\n }\n\n return R.assocPath(\n ['devPlan', 'currentCollaborator'],\n R.assocPath(['currentProject', 'displayProjectId'], displayProjectId, payload),\n successState,\n );\n};\n\n\nexport const authenticateCollaboratorReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../../core/api/rsaa';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { getLoading, addError, noLoadingNoError, addLoading } from '../../../../core/api/module';\n\n\nconst KEY_ACTION = ActionType.SendDevPlanCollaboratorInviteRequest;\nconst ACTIONS = [\n ActionType.SendDevPlanCollaboratorInviteRequest,\n ActionType.SendDevPlanCollaboratorInviteResponse,\n ActionType.SendDevPlanCollaboratorInviteError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n email: string;\n projectId: number;\n};\n\n\n/**\n * Dispatch this to send an email inviting a newly added collaborator to view the participant's dev plan\n *\n * @param projectId - the database Id for the project the dev plan for which this person has been added\n * @param participantId - the database Id for the participant for whom this person has been added\n * @param email - the collaborator's email address\n * @param comment - additional text supplied by the user, to be included in the collaborator's invite email\n * @param languageId - the language in which the invite should be sent (usually just the project default language)\n */\nexport const sendDevPlanCollaboratorInviteAction = (\n projectId: number,\n participantId: number,\n email: string,\n comment: string,\n languageId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SendDevPlanCollaboratorInvite,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n comment: comment,\n to: [{ toAddress: email, languageId: languageId }],\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n email: email,\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${email}-${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { email, projectId } = action.meta;\n\n const metaTag = `${email}-${projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n return noLoadingNoError(state, KEY_ACTION, metaTag);\n};\n\nexport const sendDevPlanCollaboratorInviteReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../../core/api/rsaa';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { getLoading, addError, noLoadingNoError, addLoading } from '../../../../core/api/module';\n\n\nconst KEY_ACTION = ActionType.SendDevItemCommentNotificationRequest;\nconst ACTIONS = [\n ActionType.SendDevItemCommentNotificationRequest,\n ActionType.SendDevItemCommentNotificationResponse,\n ActionType.SendDevItemCommentNotificationError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n devItemId: number;\n devActionId: number;\n};\n\n\n/**\n * Dispatch this to send an email notifying the project participant of a new collaborator comment\n *\n * @param projectId - the database Id for the project that's been commented-on\n * @param participantId - the database Id for the participant receiving the comment\n * @param devItemId - the database Id for the commented dev item\n * @param devActionId - the database Id for the specific action in the dev item to which the comment is to be added\n * @param participantEmail - the participant's email address\n * @param collaboratorEmail - the collaborator's email address\n * @param otherCollaboratorEmails - email addresses for all other collaborators, who will also be notified\n * @param comment - the text content of the newly added comment\n * @param languageId - the language in which notifications should be sent (usually just the project default language)\n */\nexport const sendDevItemCommentNotificationAction = (\n projectId: number,\n participantId: number,\n devItemId: number,\n devActionId: number,\n participantEmail: string,\n collaboratorEmail: string,\n otherCollaboratorEmails: string[],\n comment: string,\n languageId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SendDevItemCommentNotification,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n comment: comment,\n to: otherCollaboratorEmails.map(c => ({ toAddress: c, languageId: languageId }))\n .concat({ toAddress: participantEmail, languageId: languageId }),\n collaboratorEmail: collaboratorEmail,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n devItemId: devItemId,\n devActionId: devActionId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${devItemId}-${devActionId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId, devItemId, devActionId } = action.meta;\n\n const metaTag = `${projectId}-${devItemId}-${devActionId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n return noLoadingNoError(state, KEY_ACTION, metaTag);\n};\n\nexport const sendDevItemCommentNotificationReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../../core/api/rsaa';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { getLoading, addError, noLoadingNoError, addLoading } from '../../../../core/api/module';\n\n\nconst KEY_ACTION = ActionType.SendParticipantCommentNotificationRequest;\nconst ACTIONS = [\n ActionType.SendParticipantCommentNotificationRequest,\n ActionType.SendParticipantCommentNotificationResponse,\n ActionType.SendParticipantCommentNotificationError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n devItemId: number;\n devActionId: number;\n};\n\n\n/**\n * Dispatch this to send an email notifying all dev plan collaborators of a new participant comment\n *\n * @param projectId - the database Id for the project that's been commented-on\n * @param participantId - the database Id for the participant receiving the comment\n * @param devItemId - the database Id for the commented dev item\n * @param devActionId - the database Id for the specific action in the dev item to which the comment is to be added\n * @param collaboratorEmails - the email addresses of the dev plan collaborators\n * @param comment - the text content of the newly added comment\n * @param languageId - the language in which notifications should be sent (usually just the project default language)\n */\nexport const sendParticipantCommentNotificationAction = (\n projectId: number,\n participantId: number,\n devItemId: number,\n devActionId: number,\n collaboratorEmails: string[],\n comment: string,\n languageId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SendParticipantCommentNotification,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n comment: comment,\n to: collaboratorEmails.map(email => ({ toAddress: email, languageId: languageId })),\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n devItemId: devItemId,\n devActionId: devActionId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${devItemId}-${devActionId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId, devItemId, devActionId } = action.meta;\n\n const metaTag = `${projectId}-${devItemId}-${devActionId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n return noLoadingNoError(state, KEY_ACTION, metaTag);\n};\n\nexport const sendParticipantCommentNotificationReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ApiReducer, makeApiAction, makeApiReducer, makeRsaaTypes } from '../../../../core/api/rsaa';\nimport { addError, addLoading, noLoadingNoError, getLoading } from '../../../../core/api/module';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { DevPlanFieldListItem } from '../models';\nimport { toMap } from '../../../../language/arrays';\n\n\nconst KEY_ACTION = ActionType.GetDevActionListItemsRequest;\nconst ACTIONS = [\n ActionType.GetDevActionListItemsRequest,\n ActionType.GetDevActionListItemsResponse,\n ActionType.GetDevActionListItemsError,\n];\n\n\ntype Payload = DevPlanFieldListItem[];\n\n\ntype Meta = {\n projectId: number;\n languageId: number;\n};\n\n\n/**\n * Dispatch this to retrieve the list of items which can be associated with the dev action list field as answers\n *\n * @param projectId - the database Id for the project the dev plan for which this person should be added\n * @param languageId - the database Id for the language in which the email should be sent (usually just the project\n * default language)\n */\nexport const getDevActionListItemsAction = (\n projectId: number,\n languageId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.GetDevActionListItems,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId: projectId,\n languageId: languageId,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n projectId: projectId,\n languageId: languageId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${languageId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId, languageId } = action.meta;\n\n const metaTag = `${projectId}-${languageId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n if (!payload) {\n return successState;\n }\n\n return R.assocPath(\n ['devPlan', 'listItems', `${languageId}`],\n toMap(payload, item => `${item.compilationCategoryListItemId}`),\n successState,\n );\n};\n\nexport const getDevActionListItemsReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../../core/redux/actionType';\nimport { DevPlanFieldAndAnswer } from '../../models';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../../core/api/rsaa';\nimport { Endpoints } from '../../../../core/api/endpoints';\nimport { AppState } from '../../../../core/redux/appState';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../../core/api/module';\nimport * as R from 'ramda';\nimport { actionFieldsById } from '../../devPlanAction/module';\n\n\nconst KEY_ACTION = ActionType.UpdateFieldAnswerListRequest;\nconst ACTIONS = [\n ActionType.UpdateFieldAnswerListRequest,\n ActionType.UpdateFieldAnswerListResponse,\n ActionType.UpdateFieldAnswerListError,\n];\n\ntype Payload = DevPlanFieldAndAnswer[];\ntype Meta = {\n projectId: number;\n participantId: number;\n};\n\n\n/**\n * Dispatch this to update the list of answers associated with the dev action list field\n *\n * @param projectId - the database Id for the project containing the dev plan\n * @param participantId - the database Id for the participant of the project containing the dev plan\n * @param languageId - the database Id for the language in which the answers were selected\n * @param devItemId - the database Id for the development item containing the dev action\n * @param devActionId - the database Id for the development action\n * @param devFieldId - the database Id for the field whose answers we're updating\n * @param devFieldAnswerId - the database Id for the dev field's answer list\n * @param compilationCategoryListIds - the database Ids for the answers which comprise the dev field's answer list\n */\nexport const updateFieldAnswerListAction = (\n projectId: number,\n participantId: number,\n languageId: number,\n devItemId: number,\n devActionId: number,\n devFieldId: number,\n devFieldAnswerId: number,\n compilationCategoryListIds: number[],\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.UpdateFieldAnswerList,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId,\n participantId,\n languageId,\n devItemId,\n devActionId,\n devFieldId,\n devFieldAnswerId,\n compilationCategoryListIds,\n },\n ),\n types: makeRsaaTypes(ACTIONS,{ projectId, participantId }),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${projectId}-${participantId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId, participantId } = action.meta;\n\n const metaTag = `${projectId}-${participantId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n if (!payload) {\n return successState;\n }\n\n const actions = (payload || [])\n .map(fa => !!fa.devPlanFieldId ? fa : R.assoc('devPlanFieldId', fa.question, fa));\n\n return R.assocPath(['devPlan', 'fieldsAnswers'], actionFieldsById(actions), successState);\n};\n\nexport const updateFieldAnswerListReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { AppState } from '../../../core/redux/appState';\nimport { getLoading, addError, noLoadingNoError, addLoading } from '../../../core/api/module';\n\n\nconst KEY_ACTION = ActionType.SendEQScoresRequest;\nconst ACTIONS = [\n ActionType.SendEQScoresRequest,\n ActionType.SendEQScoresResponse,\n ActionType.SendEQScoresError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n email: string;\n projectId: number;\n};\n\n\n/**\n * Dispatch this to send an email inviting a newly added collaborator to view the participant's dev plan\n *\n * @param projectId - the database Id for the project the dev plan for which this person has been added\n * @param participantId - the database Id for the participant for whom this person has been added\n * @param email - the collaborator's email address\n * @param comment - additional text supplied by the user, to be included in the collaborator's invite email\n * @param languageId - the language in which the invite should be sent (usually just the project default language)\n * @param releaseId - the release id for the report which will be used to get the scores\n */\nexport const sendEQScoresAction = (\n projectId: number,\n participantId: number,\n email: string,\n comment: string,\n languageId: number,\n releaseId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.SendEQScores,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(\n {\n projectId: projectId,\n participantId: participantId,\n comment: comment,\n to: [{ toAddress: email, languageId: languageId }],\n releaseId: releaseId,\n },\n ),\n types: makeRsaaTypes(\n ACTIONS,\n {\n email: email,\n projectId: projectId,\n },\n ),\n bailout: (state: AppState) => !!getLoading(state, KEY_ACTION, `${email}-${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { email, projectId } = action.meta;\n\n const metaTag = `${email}-${projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n return noLoadingNoError(state, KEY_ACTION, metaTag);\n};\n\nexport const sendEQScoresReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\n\n\nconst KEY_ACTION = ActionType.LogInfoRequest;\nconst ACTIONS = [\n ActionType.LogInfoRequest,\n ActionType.LogInfoResponse,\n ActionType.LogInfoError,\n];\n\ntype Payload = string;\ntype Meta = {\n triggeringActionType: ActionType;\n}\n\n/**\n * Dispatch this action to add a new dev plan item action\n */\nexport const logInfoAction = (message: string, triggeringActionType: ActionType) => makeApiAction({\n method: 'POST',\n endpoint: Endpoints.LogInfo,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n message: message,\n category: 'Portal',\n }),\n types: makeRsaaTypes(ACTIONS, { triggeringActionType }),\n bailout: state => !!getLoading(state, KEY_ACTION, triggeringActionType),\n});\n\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { triggeringActionType } = action.meta;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, triggeringActionType);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, triggeringActionType);\n }\n\n return noLoadingNoError(state, KEY_ACTION);\n};\n\n\nexport const logInfoReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport { EmailBody } from '../../survey/raters/models';\n\n\nconst KEY_ACTION = ActionType.EQScoresEmailPreviewRequest;\nconst ACTIONS = [\n ActionType.EQScoresEmailPreviewRequest,\n ActionType.EQScoresEmailPreviewResponse,\n ActionType.EQScoresEmailPreviewError,\n];\n\n\ntype Payload = EmailBody;\n\n\ntype Meta = {\n languageId: number;\n};\n\n\n/**\n * Dispatch this action to retrieve the email template used for sending EQ scores to participant-selected recipients\n *\n * @param languageId - the language in which the template should be returned\n */\nexport const eqScoresEmailPreviewAction = (\n languageId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.EQScoresEmailPreview,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n languageId: languageId,\n }),\n types: makeRsaaTypes(ACTIONS, { languageId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${languageId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const metaTag = `${action.meta.languageId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n return R.assocPath(\n ['eqScoresEmailTemplates', metaTag],\n payload,\n successState,\n );\n};\n\nexport const eqScoresEmailPreviewReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, ApiReducer, makeApiReducer } from '../../../core/api/rsaa';\nimport { Endpoints } from '../../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../../core/api/module';\nimport { EQScores } from '../models';\n\n\nconst KEY_ACTION = ActionType.GetEQScoresRequest;\nconst ACTIONS = [\n ActionType.GetEQScoresRequest,\n ActionType.GetEQScoresResponse,\n ActionType.GetEQScoresError,\n];\n\n\ntype Payload = EQScores;\n\n\ntype Meta = {\n releaseId: number;\n};\n\n\n/**\n * Dispatch this action to retrieve the scores associated with a particular release of a particular feedback report\n *\n * @param participantId - the database Id for the participant whose scores the report contains\n * @param releaseId - the database Id of the specific report release\n */\nexport const getEQScoresAction = (\n participantId: number,\n releaseId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.GetEQScores,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n participantId,\n releaseId,\n }),\n types: makeRsaaTypes(ACTIONS, { releaseId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${releaseId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { releaseId } = action.meta;\n const metaTag = `${releaseId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n if (!payload) {\n return successState;\n }\n\n return R.assocPath(\n ['eqScores', `${releaseId}`],\n payload,\n successState,\n );\n};\n\nexport const getEQScoresReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { ProjectCSContact } from '../models';\nimport { makeApiAction, makeRsaaTypes, makeApiReducer, ApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\n\n\nconst KEY_ACTION = ActionType.GetProjectCSContactRequest;\nconst ACTIONS = [\n ActionType.GetProjectCSContactRequest,\n ActionType.GetProjectCSContactResponse,\n ActionType.GetProjectCSContactError,\n];\n\n\ntype Payload = ProjectCSContact;\n\n\ntype Meta = {\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to retrieve the contact details for the participant's current project\n *\n * @param projectId - the database Id of the project whose contact info we want\n */\nexport const getProjectCSContactAction = (\n projectId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.ProjectCSContact,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectId,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId } = action.meta;\n const metaTag = `${projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n if (!payload) {\n return successState;\n }\n\n // In order to avoid breaking email templates that use these values, store all strings as empty if not defined in the\n // payload.\n return R.assocPath(\n ['projectCSContacts', `${projectId}`],\n R.mergeRight(\n payload,\n {\n firstName: payload?.firstName ?? '',\n lastName: payload?.lastName ?? '',\n email: payload?.email ?? '',\n },\n ),\n successState,\n );\n};\n\nexport const getProjectCSContactReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, makeApiReducer, ApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\n\n\nconst KEY_ACTION = ActionType.GetEBookUrlRequest;\nconst ACTIONS = [\n ActionType.GetEBookUrlRequest,\n ActionType.GetEBookUrlResponse,\n ActionType.GetEBookUrlError,\n];\n\n\ntype Payload = string;\n\n\ntype Meta = {\n projectId: number;\n};\n\n\n/**\n * Dispatch this action to retrieve the contact details for the participant's current project\n *\n * @param projectId - the database Id of the project whose contact info we want\n * @param participantId - the database Id of the participant whose contact info we want\n*/\nexport const getEBookUrlAction = (\n projectId: number,\n participantId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.GetEBookUrl,\n headers: { 'content-type': 'application/json', 'accept': 'application/json' },\n body: JSON.stringify({\n projectId,\n participantId,\n }),\n types: makeRsaaTypes(ACTIONS, { projectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${projectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { projectId } = action.meta;\n const metaTag = `${projectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n if (!payload) {\n return successState;\n }\n\n return R.assoc('eBookUrl', payload, successState);\n};\n\nexport const getEBookUrlReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { makeApiAction, makeRsaaTypes, makeApiReducer, ApiReducer } from '../../core/api/rsaa';\nimport { Endpoints } from '../../core/api/endpoints';\nimport { getLoading, addLoading, addError, noLoadingNoError } from '../../core/api/module';\nimport { CreateReassessmentResponse } from '../models';\n\n\nconst KEY_ACTION = ActionType.ReassessmentRequest;\nconst ACTIONS = [\n ActionType.ReassessmentRequest,\n ActionType.ReassessmentResponse,\n ActionType.ReassessmentError,\n];\n\n\ntype Payload = CreateReassessmentResponse;\n\n\ntype Meta = {\n displayProjectId: string;\n};\n\n\n/**\n * Dispatch this action to create a reassessment rater for the current project and participant\n *\n * @param displayProjectId - the display Id of the project whose reassessment rater we want\n * @param participantId - the database Id of the participant whose reassessment rater we want\n*/\nexport const reassessmentAction = (\n displayProjectId: string,\n participantId: number,\n) => makeApiAction(\n {\n method: 'POST',\n endpoint: Endpoints.CreateReassessmentRater,\n headers: { 'content-type': 'application/json', 'accept': 'application/json' },\n body: JSON.stringify({\n displayProjectId,\n participantId,\n }),\n types: makeRsaaTypes(ACTIONS, { displayProjectId }),\n bailout: state => !!getLoading(state, KEY_ACTION, `${displayProjectId}`),\n },\n);\n\nconst reducer: ApiReducer = (state, action, errorMsg, isLoading, payload) => {\n const { displayProjectId } = action.meta;\n const metaTag = `${displayProjectId}`;\n\n if (isLoading) {\n return addLoading(state, KEY_ACTION, metaTag);\n }\n\n if (errorMsg) {\n return addError(state, KEY_ACTION, errorMsg, metaTag);\n }\n\n const successState = noLoadingNoError(state, KEY_ACTION, metaTag);\n\n if (!payload) {\n return successState;\n }\n\n return R.assoc('reassessmentSurveyUrl', payload.participants[0].surveyUrl, successState);\n};\n\nexport const reassessmentReducer = makeApiReducer(ACTIONS, KEY_ACTION, reducer);\n","import { Action, Reducer } from 'redux';\nimport { AppState } from './appState';\nimport { setLocaleReducer } from '../../localization/setLocaleAction';\nimport { loadTranslationsReducer } from '../../localization/loadTranslationsAction';\nimport { loadConfigReducer } from '../../featureFlags/loadConfigAction';\nimport { loadFeatureFlagsReducer } from '../../featureFlags/loadFeatureFlagsAction';\nimport { showLoginAnnouncementReducer } from '../../featureFlags/showLoginAnnouncementAction';\nimport { updateStateReducer } from './updateStateAction';\nimport { loginReducer } from '../../auth/login/api/loginAction';\nimport { loginTalentSmartReducer } from '../../auth/login/api/loginTalentSmartAction';\nimport { loginBXReducer } from '../../auth/login/api/loginBXAction';\nimport { securityQuestionReducer } from '../../auth/forgotPassword/api/securityQuestionAction';\nimport { sendPortalPasswordResetEmailReducer } from '../../auth/forgotPassword/api/sendPortalPasswordResetEmailAction';\nimport {\n sendRaterApprovalPasswordResetEmailReducer,\n} from '../../auth/forgotPassword/api/sendRaterApprovalPasswordResetEmailAction';\nimport { newPasswordReducer } from '../../auth/accountSetup/api/newPasswordAction';\nimport { createSecurityChallengeReducer } from '../../auth/accountSetup/api/createSecurityChallengeAction';\nimport { loadProjectsReducer } from '../../project/loadProjectsAction';\nimport { securityQuestionKeysReducer } from '../../auth/forgotPassword/api/securityQuestionKeysAction';\nimport { loadProjMsgsReducer } from '../../project/messages/loadProjMsgsAction';\nimport { projectLanguagesReducer } from '../../project/messages/projectLanguagesAction';\nimport { passwordRequirementMessageReducer } from '../../auth/accountSetup/api/passwordRequirementMessageAction';\nimport { portalLanguagesReducer } from '../../localization/portalLanguagesAction';\nimport { allLanguagesReducer } from '../../localization/allLanguagesAction';\nimport { loadProjectSummaryReducer } from '../../project/loadProjectSummaryAction';\nimport { loadParticipantRequirementsReducer } from '../../project/requirements/loadParticipantRequirementsAction';\nimport { loadProjectResourcesReducer } from '../../project/resources/loadProjectResourcesAction';\nimport { addRaterByEmailReducer } from '../../project/survey/raters/addRaterByEmailAction';\nimport { addRaterByIdReducer } from '../../project/survey/raters/addRaterByIdAction';\nimport { participantRatersReducer } from '../../project/survey/raters/participantRatersAction';\nimport { sendInvitationsReducer } from '../../project/survey/raters/sendInvitationsAction';\nimport { raterLevelsReducer } from '../../project/survey/raters/raterLevelsAction';\nimport { deleteRaterReducer } from '../../project/survey/raters/deleteRaterAction';\nimport { loadProjectIdReducer } from '../../project/loadProjectIdAction';\nimport { logOutReducer } from '../../auth/login/api/logoutAction';\nimport { updateRaterReducer } from '../../project/survey/raters/updateRaterAction';\nimport { openMenuReducer } from '../../project/sideMenu/openMenuAction';\nimport { previousRatersReducer } from '../../project/survey/raters/previousRatersAction';\nimport { directoryRatersReducer } from '../../project/survey/raters/directorySearch/directoryRatersAction';\nimport { updateInviteDataReducer } from '../../project/survey/raters/updateInviteDataAction';\nimport { sendRemindersReducer } from '../../project/survey/raters/remindRaters/sendRemindersAction';\nimport { setApproverReducer } from '../../project/survey/raters/setApproverAction';\nimport { updateConfidentialityReducer } from '../../legal/updateConfidentialityAction';\nimport { sendForApprovalReducer } from '../../project/survey/raters/sendForApprovalAction';\nimport { ymcaLoginReducer } from '../../auth/sso/YmcaLoginAction';\nimport { ymcaSsoReducer } from '../../auth/sso/YmcaSsoAction';\nimport { setGoalAnswerReducer } from '../../project/setGoals/setGoalAnswerAction';\nimport { sendGoalsReducer } from '../../project/setGoals/sendGoalsAction';\nimport { goalsAnswersReducer } from '../../project/setGoals/goalsAnswersAction';\nimport { inviteEmailPreviewReducer } from '../../project/survey/raters/inviteEmailPreviewAction';\nimport { approverEmailPreviewReducer } from '../../project/survey/raters/approverEmailPreviewAction';\nimport { setRemindersOnReducer } from '../../project/devPlan/reminders/setRemindersOnAction';\nimport { getRemindersOnReducer } from '../../project/devPlan/reminders/getRemindersOnAction';\nimport { getDevPlanItemsReducer } from '../../project/devPlan/api/getDevPlanItemsAction';\nimport { getDevPlanActionsReducer } from '../../project/devPlan/devPlanAction/api/getDevPlanActionsAction';\nimport {\n getDevPlanFieldsAndAnswersReducer,\n} from '../../project/devPlan/devPlanAction/api/getDevPlanFieldsAndAnswersAction';\nimport {\n updateDevPlanFieldAnswerReducer,\n} from '../../project/devPlan/devPlanAction/api/updateDevPlanFieldAnswerAction';\nimport { loadReportsReducer } from '../../project/viewReport/api/loadReportsAction';\nimport { isSsoReducer } from '../../auth/sso/IsSsoAction';\nimport { samlAssertionReducer } from '../../auth/sso/SamlAssertionAction';\nimport { deleteDevPlanActionReducer } from '../../project/devPlan/devPlanAction/api/deleteDevPlanActionAction';\nimport {\n updateDevPlanItemDescriptionReducer,\n} from '../../project/devPlan/api/updateDevPlanItemDescriptionAction';\nimport { updateDevPlanItemTitleReducer } from '../../project/devPlan/api/updateDevPlanItemTitleAction';\nimport { loadDevResourcesReducer } from '../../project/resources/loadDevResourcesAction';\nimport {\n updateDevPlanActionCompleteByDateReducer,\n} from '../../project/devPlan/devPlanAction/api/updateActionCompleteByAction';\nimport { loadCurrentStatusReducer } from '../../project/loadCurrentStatusAction';\nimport { addDevPlanActionReducer } from '../../project/devPlan/devPlanAction/api/addDevPlanActionAction';\nimport { deleteDevPlanItemReducer } from '../../project/devPlan/api/deleteDevPlanItemAction';\nimport { addDevPlanItemReducer } from '../../project/devPlan/api/addDevPlanItemAction';\nimport { getDevPlanStatusesReducer } from '../../project/devPlan/devPlanAction/api/getDevPlanStatusesAction';\nimport {\n updateDevPlanActionStatusReducer,\n} from '../../project/devPlan/devPlanAction/api/updateDevPlanActionStatusAction';\nimport { raterApprovalParticipantsReducer } from '../../raterApproval/api/raterApprovalParticipantsAction';\nimport { sendDevPlanReducer } from '../../project/devPlan/devPlanAction/api/sendDevPlanAction';\nimport { undeliveredEmailsReducer } from '../../project/survey/raters/undeliveredEmailsAction';\nimport { reportRecipientProjectsReducer } from '../../reportRecipient/api/reportRecipientProjectsAction';\nimport { reportRecipientParticipantsReducer } from '../../reportRecipient/api/reportRecipientParticipantsAction';\nimport { reportRecipientReportsReducer } from '../../reportRecipient/api/reportRecipientReportsAction';\nimport { deliverReportsReducer } from '../../reportRecipient/api/deliverReportsAction';\nimport { deliverReportsToRecipientReducer } from '../../reportRecipient/api/deliverReportsToRecipientAction';\nimport { getSelectedQuestionsReducer } from '../../project/createSurvey/api/getSelectedQuestionsAction';\nimport { addQuestionReducer } from '../../project/createSurvey/api/addQuestionAction';\nimport { addQuestionsForCompetencyReducer } from '../../project/createSurvey/api/addQuestionsForCompetencyAction';\nimport { deleteQuestionReducer } from '../../project/createSurvey/api/deleteQuestionAction';\nimport { deleteQuestionsForCompetencyReducer } from '../../project/createSurvey/api/deleteQuestionsForCompetencyAction';\nimport { getCompetenciesAndQuestionsReducer } from '../../project/createSurvey/api/getCompetenciesAndQuestionsAction';\nimport { applyPendingChangesReducer } from '../../project/createSurvey/api/applyPendingChangesAction';\nimport { raterApprovalRatersReducer } from '../../raterApproval/api/raterApprovalRatersAction';\nimport { sendRaterApprovalReducer } from '../../raterApproval/api/sendRaterApprovalAction';\nimport { raterApprovalEmailPreviewReducer } from '../../raterApproval/api/raterApprovalEmailPreviewAction';\nimport {\n sendReportRecipientPasswordResetEmailReducer,\n} from '../../auth/forgotPassword/api/sendReportRecipientPasswordResetEmailAction';\nimport { unsetCreatedSurveyReducer } from '../../project/createSurvey/api/unsetCreatedSurveyAction';\nimport { addRaterByEmailAsApproverReducer } from '../../raterApproval/api/addRaterByEmailAsApproverAction';\nimport { approveRaterReducer } from '../../raterApproval/api/approveRaterAction';\nimport { declineRaterReducer } from '../../raterApproval/api/declineRaterAction';\nimport { setPortalTypeReducer } from './setPortalTypeAction';\nimport { clearLastSentEmailReducer } from '../../project/devPlan/devPlanAction/clearLastSentEmailAction';\nimport { appActivityReducer } from '../../auth/login/api/appActivityReducer';\nimport { setDateRangeReducer } from '../../reportRecipient/actions/setDateRangeAction';\nimport { setLastOnlyReducer } from '../../reportRecipient/actions/setLastOnlyAction';\nimport { addFilterParticipantReducer } from '../../reportRecipient/actions/addFilterParticipantAction';\nimport { addFilterProjectReducer } from '../../reportRecipient/actions/addFilterProjectAction';\nimport { removeFilterParticipantReducer } from '../../reportRecipient/actions/removeFilterParticipantAction';\nimport { removeFilterProjectReducer } from '../../reportRecipient/actions/removeFilterProjectAction';\nimport { setAllSelectedReducer } from '../../reportRecipient/actions/setAllSelectedAction';\nimport { setSelectedReducer } from '../../reportRecipient/actions/setSelectedAction';\nimport { showTimeoutModalReducer } from '../../showTimeoutModalAction';\nimport { showTimedOutReducer } from '../../showTimedOutAction';\nimport { setTimedOutHandleReducer } from '../../setTimedOutHandleAction';\nimport { reportDataReducer } from '../../reportRecipient/api/reportDataAction';\nimport { setDevPlanViewedReducer } from '../../project/devPlan/api/setDevPlanViewedAction';\nimport { saveEditedRaterReducer } from '../../project/survey/raters/saveEditedRaterAction';\nimport { addDevPlanCollaboratorReducer } from '../../project/devPlan/collaboration/api/addDevPlanCollaboratorAction';\nimport {\n deleteDevPlanCollaboratorReducer,\n} from '../../project/devPlan/collaboration/api/deleteDevPlanCollaboratorAction';\nimport { addDevItemCommentReducer } from '../../project/devPlan/collaboration/api/addDevItemCommentAction';\nimport { updateDevItemCommentReducer } from '../../project/devPlan/collaboration/api/updateDevItemCommentAction';\nimport { deleteDevItemCommentReducer } from '../../project/devPlan/collaboration/api/deleteDevItemCommentAction';\nimport { getDevPlanCollaboratorsReducer } from '../../project/devPlan/collaboration/api/getDevPlanCollaboratorsAction';\nimport {\n setDevPlanCollaboratorAcceptedReducer,\n} from '../../project/devPlan/collaboration/api/setDevPlanCollaboratorAcceptedAction';\nimport { getDevItemCommentsReducer } from '../../project/devPlan/collaboration/api/getDevItemCommentsAction';\nimport {\n setDevItemCommentsReadReducer,\n} from '../../project/devPlan/collaboration/api/setDevItemCommentsReadAction';\nimport {\n authenticateCollaboratorReducer,\n} from '../../project/devPlan/collaboration/api/authenticateCollaboratorAction';\nimport {\n sendDevPlanCollaboratorInviteReducer,\n} from '../../project/devPlan/collaboration/api/sendDevPlanCollaboratorInviteAction';\nimport {\n sendDevItemCommentNotificationReducer,\n} from '../../project/devPlan/collaboration/api/sendDevItemCommentNotificationAction';\nimport {\n sendParticipantCommentNotificationReducer,\n} from '../../project/devPlan/collaboration/api/sendParticipantCommentNotificationAction';\nimport { getDevActionListItemsReducer } from '../../project/devPlan/listItems/api/getDevActionListItemsAction';\nimport { updateFieldAnswerListReducer } from '../../project/devPlan/listItems/api/updateFieldAnswerListAction';\nimport { saveFieldAnswerListReducer } from '../../project/devPlan/listItems/saveFieldAnswerListAction';\nimport { sendEQScoresReducer } from '../../project/viewReport/api/sendEQScoresAction';\nimport { logInfoReducer } from '../../traceLogging/api/logInfoAction';\nimport { raterInviteTimestampReducer } from './raterInviteTimestampReducer';\nimport { clearLoadingStateReducer } from './clearLoadingStateAction';\nimport { eqScoresEmailPreviewReducer } from '../../project/viewReport/api/eqScoresEmailPreviewAction';\nimport { getEQScoresReducer } from '../../project/viewReport/api/getEQScoresAction';\nimport { getProjectCSContactReducer } from '../../project/api/getProjectCSContactAction';\nimport { getEBookUrlReducer } from '../../project/api/getEBookUrlAction';\nimport { reassessmentReducer } from '../../project/api/reassessmentAction';\n\n/**\n * The default Redux typing supports having a null app state -- but that's not a valid app state IMO, and I always write\n * my code such that the Redux store is never null.\n * To avoid doing a null-check in every reducer just to make the compiler happy about an impossible state, I just do a\n * not-null assertion in the root reducer, and type all other reducers as this guy.\n */\nexport type NonNullReducer = (state: AppState, action: Action) => AppState;\n\n/**\n * The collection of all app state reducers available to the app\n */\nconst reducers: NonNullReducer[] = [\n // Misc\n updateStateReducer,\n setPortalTypeReducer,\n openMenuReducer,\n showTimeoutModalReducer,\n showTimedOutReducer,\n setTimedOutHandleReducer,\n\n // I18n\n portalLanguagesReducer,\n setLocaleReducer,\n loadTranslationsReducer,\n projectLanguagesReducer,\n loadProjMsgsReducer,\n allLanguagesReducer,\n\n // Feature Flags / Config\n loadFeatureFlagsReducer,\n loadConfigReducer,\n showLoginAnnouncementReducer,\n\n // Login/authentication\n loginReducer,\n loginTalentSmartReducer,\n loginBXReducer,\n securityQuestionKeysReducer,\n securityQuestionReducer,\n sendPortalPasswordResetEmailReducer,\n sendRaterApprovalPasswordResetEmailReducer,\n sendReportRecipientPasswordResetEmailReducer,\n newPasswordReducer,\n createSecurityChallengeReducer,\n passwordRequirementMessageReducer,\n logOutReducer,\n appActivityReducer,\n\n // Projects\n loadProjectsReducer,\n loadProjectSummaryReducer,\n loadCurrentStatusReducer,\n loadParticipantRequirementsReducer,\n loadProjectResourcesReducer,\n loadProjectIdReducer,\n updateConfidentialityReducer,\n loadDevResourcesReducer,\n getProjectCSContactReducer,\n getEBookUrlReducer,\n reassessmentReducer,\n\n // Raters\n addRaterByEmailReducer,\n addRaterByIdReducer,\n participantRatersReducer,\n previousRatersReducer,\n directoryRatersReducer,\n updateInviteDataReducer,\n inviteEmailPreviewReducer,\n approverEmailPreviewReducer,\n sendInvitationsReducer,\n sendRemindersReducer,\n raterLevelsReducer,\n deleteRaterReducer,\n saveEditedRaterReducer,\n updateRaterReducer,\n setApproverReducer,\n sendForApprovalReducer,\n undeliveredEmailsReducer,\n // TODO - remove these next two when the hanging rater-invite request issue is resolved\n raterInviteTimestampReducer,\n clearLoadingStateReducer,\n\n // Rater Approval\n raterApprovalParticipantsReducer,\n raterApprovalRatersReducer,\n sendRaterApprovalReducer,\n approveRaterReducer,\n declineRaterReducer,\n raterApprovalEmailPreviewReducer,\n addRaterByEmailAsApproverReducer,\n\n // Set Goals\n setGoalAnswerReducer,\n sendGoalsReducer,\n goalsAnswersReducer,\n\n //SSO\n ymcaLoginReducer,\n ymcaSsoReducer,\n isSsoReducer,\n samlAssertionReducer,\n\n // Create Survey\n getSelectedQuestionsReducer,\n addQuestionReducer,\n addQuestionsForCompetencyReducer,\n deleteQuestionReducer,\n deleteQuestionsForCompetencyReducer,\n getSelectedQuestionsReducer,\n getCompetenciesAndQuestionsReducer,\n applyPendingChangesReducer,\n unsetCreatedSurveyReducer,\n\n // Dev Plan\n getRemindersOnReducer,\n setRemindersOnReducer,\n deleteDevPlanItemReducer,\n addDevPlanItemReducer,\n getDevPlanItemsReducer,\n getDevPlanActionsReducer,\n getDevPlanFieldsAndAnswersReducer,\n updateDevPlanFieldAnswerReducer,\n deleteDevPlanActionReducer,\n updateDevPlanItemDescriptionReducer,\n updateDevPlanItemTitleReducer,\n updateDevPlanActionCompleteByDateReducer,\n addDevPlanActionReducer,\n getDevPlanStatusesReducer,\n updateDevPlanActionStatusReducer,\n sendDevPlanReducer,\n\n // Dev Plan Collaboration\n authenticateCollaboratorReducer,\n getDevPlanCollaboratorsReducer,\n addDevPlanCollaboratorReducer,\n setDevPlanCollaboratorAcceptedReducer,\n deleteDevPlanCollaboratorReducer,\n\n getDevItemCommentsReducer,\n addDevItemCommentReducer,\n updateDevItemCommentReducer,\n setDevItemCommentsReadReducer,\n deleteDevItemCommentReducer,\n\n sendDevPlanCollaboratorInviteReducer,\n sendDevItemCommentNotificationReducer,\n sendParticipantCommentNotificationReducer,\n\n clearLastSentEmailReducer,\n setDevPlanViewedReducer,\n\n // Dev Plan Field Answer Lists\n getDevActionListItemsReducer,\n updateFieldAnswerListReducer,\n saveFieldAnswerListReducer,\n\n // View Reports\n loadReportsReducer,\n reportDataReducer,\n getEQScoresReducer,\n sendEQScoresReducer,\n eqScoresEmailPreviewReducer,\n\n // Report Recipient\n reportRecipientProjectsReducer,\n reportRecipientParticipantsReducer,\n reportRecipientReportsReducer,\n deliverReportsReducer,\n deliverReportsToRecipientReducer,\n setDateRangeReducer,\n setLastOnlyReducer,\n addFilterParticipantReducer,\n addFilterProjectReducer,\n removeFilterParticipantReducer,\n removeFilterProjectReducer,\n setAllSelectedReducer,\n setSelectedReducer,\n\n logInfoReducer,\n];\n\nexport const rootReducer: Reducer = (state, action) => reducers.reduce(\n (running, next) => next(running, action),\n state!,\n);\n","import * as R from 'ramda';\nimport { AppState } from './appState';\nimport { ActionType } from './actionType';\nimport { Action } from 'redux';\n\n\ntype UpdateStateAction = {\n type: ActionType.UpdateStateAction;\n newState: Partial;\n}\n\n\n/**\n * Generally, you don't want to use this action, but it's useful in a handful of circumstances.\n * Deep-merges the state given here onto the current app state.\n */\nexport const updateStateAction = (\n newState: Partial,\n): UpdateStateAction => ({\n type: ActionType.UpdateStateAction,\n newState: newState,\n});\n\n\nexport const updateStateReducer = (state: AppState, action: Action): AppState => {\n if (action.type !== ActionType.UpdateStateAction) {\n return state;\n }\n\n return R.mergeDeepRight(state, (action as UpdateStateAction).newState) as AppState;\n};\n","import * as R from 'ramda';\nimport { Action } from 'redux';\nimport { ActionType } from './core/redux/actionType';\nimport { AppState } from './core/redux/appState';\n\n\ntype ShowTimedOutAction = {\n type : ActionType.ShowTimedOutAction;\n showModal: boolean;\n}\n\n\nexport const showTimedOutAction = (\n show: boolean,\n): ShowTimedOutAction => ({\n type: ActionType.ShowTimedOutAction,\n showModal: show,\n});\n\n\nexport const showTimedOutReducer = (state: AppState, action: Action): AppState => {\n if (action.type !== ActionType.ShowTimedOutAction) {\n return state;\n }\n\n return R.assoc('showTimedOut', (action as ShowTimedOutAction).showModal, state);\n};\n","import * as R from 'ramda';\nimport { Action } from 'redux';\nimport { ActionType } from './core/redux/actionType';\nimport { AppState } from './core/redux/appState';\n\n\ntype SetTimedOutHandleAction = {\n type : ActionType.SetTimedOutHandleAction;\n handle : number;\n}\n\n\nexport const setTimedOutHandleAction = (\n handle: number,\n): SetTimedOutHandleAction => ({\n type: ActionType.SetTimedOutHandleAction,\n handle: handle,\n});\n\n\nexport const setTimedOutHandleReducer = (state: AppState, action: Action): AppState => {\n if (action.type !== ActionType.SetTimedOutHandleAction) {\n return state;\n }\n\n return R.assoc('timedOutHandle', (action as SetTimedOutHandleAction).handle, state);\n};\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { AppState } from '../../../core/redux/appState';\nimport { Action } from 'redux';\nimport { Rater, RaterLevel } from './models';\nimport { Language } from '../../../localization/models';\n\n\ntype SaveEditedRaterAction = {\n type: ActionType.SaveEditedRater;\n projectId: number;\n participantId: number;\n raterId: number;\n email?: string;\n undelivered?: boolean;\n firstName?: string;\n lastName?: string;\n raterLevel?: RaterLevel;\n language?: Language;\n};\n\n\nexport const saveEditedRaterAction = (\n projectId: number,\n participantId: number,\n raterId: number,\n email?: string,\n undelivered?: boolean,\n firstName?: string,\n lastName?: string,\n raterLevel?: RaterLevel,\n language?: Language,\n): SaveEditedRaterAction => ({\n type: ActionType.SaveEditedRater,\n projectId: projectId,\n participantId: participantId,\n raterId: raterId,\n email: email,\n undelivered: undelivered,\n firstName: firstName,\n lastName: lastName,\n raterLevel: raterLevel,\n language: language,\n});\n\nexport const saveEditedRaterReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.SaveEditedRater) {\n return state;\n }\n\n const action = incomingAction as SaveEditedRaterAction;\n\n const rater = R.path(['projectRaters', `${action.projectId}`, `${action.raterId}`], state);\n\n if (!rater) {\n return state;\n }\n\n let updatedRater = R.assoc('undeliveredEmail', false, rater);\n\n if (action.email) {\n updatedRater = R.assoc('email', action.email, updatedRater);\n }\n\n if (action.undelivered) {\n updatedRater = R.assoc('undelivered', action.undelivered, updatedRater);\n }\n\n if (action.firstName) {\n updatedRater = R.assoc('firstName', action.firstName, updatedRater);\n }\n\n if (action.lastName) {\n updatedRater = R.assoc('lastName', action.lastName, updatedRater);\n }\n\n if (action.raterLevel) {\n updatedRater = R.assoc('levelId', action.raterLevel.surveyLevelId, updatedRater);\n updatedRater = R.assoc('levelName', action.raterLevel.surveyLevelName ?? action.raterLevel.fullName, updatedRater);\n }\n\n if (action.language) {\n updatedRater = R.assoc('languageId', action.language.languageId, updatedRater);\n updatedRater = R.assoc('languageNameNative', action.language.nativeName, updatedRater);\n updatedRater = R.assoc('languageNameEnglish', action.language.englishName, updatedRater);\n }\n\n return R.assocPath(\n ['projectRaters', `${action.projectId}`, `${action.raterId}`],\n updatedRater,\n state,\n );\n};\n","import * as R from 'ramda';\nimport { AppState } from './appState';\nimport { Action } from 'redux';\nimport { ActionType } from './actionType';\n\n\n/**\n * Reducer that tracks the user's activity for the logout timer\n */\nexport const raterInviteTimestampReducer = (state: AppState, action: Action): AppState => {\n if (action.type !== ActionType.SendInvitationsRequest) {\n return state;\n }\n\n return R.assoc('lastInviteRequest', new Date(), state);\n};\n","import * as R from 'ramda';\nimport { Action } from 'redux';\nimport { ActionType } from './actionType';\nimport { AppState } from './appState';\nimport { keyFor } from '../api/module';\n\n\ntype ClearLoadingStateAction = {\n type: ActionType.ClearLoadingStateAction;\n actionType: ActionType;\n requestId: string | number | undefined;\n}\n\n\nexport const clearLoadingStateAction = (\n actionType: ActionType,\n requestId: string | number | undefined,\n): ClearLoadingStateAction => ({\n type: ActionType.ClearLoadingStateAction,\n actionType: actionType,\n requestId: requestId,\n});\n\nexport const clearLoadingStateReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.ClearLoadingStateAction) {\n return state;\n }\n\n const action = incomingAction as ClearLoadingStateAction;\n\n const { actionType, requestId } = action;\n\n const key = keyFor(actionType, requestId ?? actionType);\n\n return R.dissocPath(['loading', key], state);\n};\n","import { ActionType } from '../../../core/redux/actionType';\nimport { Action } from 'redux';\nimport { AppState } from '../../../core/redux/appState';\nimport * as R from 'ramda';\n\n\n/**\n * Dispatch this action to clear the email the user last sent their dev plan to.\n */\nexport const clearLastSentEmailAction = () => ({\n type: ActionType.ClearLastSentEmail,\n});\n\n\nexport const clearLastSentEmailReducer = (state: AppState, action: Action): AppState => {\n if(action.type !== ActionType.ClearLastSentEmail) {\n return state;\n }\n\n return R.dissocPath(['devPlan', 'lastEmailRecipient'], state);\n};\n","import * as R from 'ramda';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { AppState } from '../../../core/redux/appState';\nimport { Action } from 'redux';\nimport { Map } from '../../../language/models';\nimport { DevPlanFieldListItem } from './models';\nimport { DevPlanFieldAndAnswer } from '../models';\n\n\ntype SaveFieldAnswerListAction = {\n type: ActionType.SaveFieldAnswerList;\n languageId: number,\n devItemId: number,\n devActionId: number,\n compilationCategoryListIds: number[],\n}\n\n\n/**\n * Dispatch this action to save the user's field answer list selections locally (i.e., to prevent waiting on the API\n * to update).\n *\n * @param languageId - the database Id for the language in which the answers were selected\n * @param devItemId - the database Id for the development item containing the dev action\n * @param devActionId - the database Id for the development action\n * @param compilationCategoryListIds - the database Ids for the answers which comprise the dev field's answer list\n */\nexport const saveFieldAnswerListAction = (\n languageId: number,\n devItemId: number,\n devActionId: number,\n compilationCategoryListIds: number[],\n): SaveFieldAnswerListAction => ({\n type: ActionType.SaveFieldAnswerList,\n languageId: languageId,\n devItemId: devItemId,\n devActionId: devActionId,\n compilationCategoryListIds: compilationCategoryListIds,\n});\n\n\nexport const saveFieldAnswerListReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.SaveFieldAnswerList) {\n return state;\n }\n\n const action = incomingAction as SaveFieldAnswerListAction;\n\n const { languageId, devItemId, devActionId, compilationCategoryListIds } = action;\n\n const listItems = R.path | undefined>(['devPlan', 'listItems', `${languageId}`], state);\n\n const fieldsAnswers = R.path(\n ['devPlan', 'fieldsAnswers', `${devItemId}`, `${devActionId}`],\n state,\n );\n\n const listFieldIndex = R.findIndex(f => f.list, fieldsAnswers ?? []);\n\n const answers = R.props(compilationCategoryListIds.map(compCatId => `${compCatId}`), listItems ?? {})\n .map(answer => answer.text);\n\n return R.assocPath(\n ['devPlan', 'fieldsAnswers', `${devItemId}`, `${devActionId}`, listFieldIndex, 'answers'],\n answers,\n state,\n );\n};\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { AppState } from '../../core/redux/appState';\nimport { Action } from 'redux';\n\n\ntype SetDateRangeAction = {\n type: ActionType.SetDateRange;\n dateRange: number;\n}\n\n\n/**\n * Dispatch this set the report recipient date range.\n * @param dateRange - the new date range state you want (default: 3)\n */\nexport const setDateRangeAction = (dateRange: number = 3): SetDateRangeAction => ({\n type: ActionType.SetDateRange,\n dateRange: dateRange,\n});\n\n\nexport const setDateRangeReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.SetDateRange) {\n return state;\n }\n\n const action = incomingAction as SetDateRangeAction;\n\n return R.assoc('reportRecipientDateRange', action.dateRange, state);\n};\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { AppState } from '../../core/redux/appState';\nimport { Action } from 'redux';\n\n\ntype SetLastOnlyAction = {\n type: ActionType.SetLastOnly;\n lastOnly: boolean;\n}\n\n\n/**\n * Dispatch this set the report recipient last only value.\n * @param lastOnly - the new last only state you want (default: true)\n */\nexport const setLastOnlyAction = (lastOnly: boolean = true): SetLastOnlyAction => ({\n type: ActionType.SetLastOnly,\n lastOnly: lastOnly,\n});\n\n\nexport const setLastOnlyReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.SetLastOnly) {\n return state;\n }\n \n const action = incomingAction as SetLastOnlyAction;\n\n return R.assoc('reportRecipientLastOnly', action.lastOnly, state);\n};\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { AppState } from '../../core/redux/appState';\nimport { Action } from 'redux';\nimport { ReportRecipientParticipant } from '../models';\n\n\ntype AddFilterParticipantAction = {\n type: ActionType.AddFilterParticipant;\n participant: ReportRecipientParticipant;\n}\n\n\n/**\n * Dispatch this action to add a filter participant.\n * @param participant - the participant to add\n */\nexport const addFilterParticipantAction = (participant: ReportRecipientParticipant): AddFilterParticipantAction => ({\n type: ActionType.AddFilterParticipant,\n participant: participant,\n});\n\n\nexport const addFilterParticipantReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.AddFilterParticipant) {\n return state;\n }\n \n const action = incomingAction as AddFilterParticipantAction;\n\n return R.assocPath(\n ['reportRecipientSelectedParticipants', `${action.participant.displayName}`],\n action.participant,\n state,\n );\n};\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { AppState } from '../../core/redux/appState';\nimport { Action } from 'redux';\nimport { ReportRecipientProject } from '../models';\n\n\ntype AddFilterProjectAction = {\n type: ActionType.AddFilterProject;\n project: ReportRecipientProject;\n}\n\n\n/**\n * Dispatch this action to add a filter project\n * @param project - the project to add\n */\nexport const addFilterProjectAction = (project: ReportRecipientProject): AddFilterProjectAction => ({\n type: ActionType.AddFilterProject,\n project: project,\n});\n\n\nexport const addFilterProjectReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.AddFilterProject) {\n return state;\n }\n\n const action = incomingAction as AddFilterProjectAction;\n\n return R.assocPath(\n ['reportRecipientSelectedProjects', `${action.project.displayName}`],\n action.project,\n state,\n );\n};\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { AppState } from '../../core/redux/appState';\nimport { Action } from 'redux';\n\n\ntype RemoveFilterParticipantAction = {\n type: ActionType.RemoveFilterParticipant;\n key: string;\n}\n\n\n/**\n * Dispatch this action remove a filter participant\n * @param key - the key for the participant to remove\n */\nexport const removeFilterParticipantAction = (key: string): RemoveFilterParticipantAction => ({\n type: ActionType.RemoveFilterParticipant,\n key: key,\n});\n\n\nexport const removeFilterParticipantReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.RemoveFilterParticipant) {\n return state;\n }\n \n const action = incomingAction as RemoveFilterParticipantAction;\n\n return R.dissocPath(['reportRecipientSelectedParticipants', action.key], state);\n};\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { AppState } from '../../core/redux/appState';\nimport { Action } from 'redux';\n\n\ntype RemoveFilterProjectAction = {\n type: ActionType.RemoveFilterProject;\n key: string;\n}\n\n\n/**\n * Dispatch this action to remove a filter project\n * @param key - the key for the project to remove\n */\nexport const removeFilterProjectAction = (key: string): RemoveFilterProjectAction => ({\n type: ActionType.RemoveFilterProject,\n key: key,\n});\n\n\nexport const removeFilterProjectReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.RemoveFilterProject) {\n return state;\n }\n \n const action = incomingAction as RemoveFilterProjectAction;\n\n return R.dissocPath(['reportRecipientSelectedProjects', action.key], state);\n};\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { AppState } from '../../core/redux/appState';\nimport { Action } from 'redux';\n\n\ntype SetAllSelectedAction = {\n type: ActionType.SetAllSelected;\n selected: boolean;\n}\n\n\n/**\n * Dispatch this set the selected status for all reports.\n * @param selected - the new selected state you want (default: false)\n */\nexport const setAllSelectedAction = (selected: boolean): SetAllSelectedAction => ({\n type: ActionType.SetAllSelected,\n selected: selected,\n});\n\n\nexport const setAllSelectedReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.SetAllSelected) {\n return state;\n }\n \n const action = incomingAction as SetAllSelectedAction;\n\n const reports = state.reportRecipientReports || [];\n const updatedReports = Object.values(reports).reduce(\n (map, r) => R.assoc(`${r.participantReportId}`, R.mergeRight(r, { isChecked: action.selected }), map),\n {},\n );\n\n return R.assoc('reportRecipientReports', Object.values(updatedReports), state);\n};\n","import * as R from 'ramda';\nimport { ActionType } from '../../core/redux/actionType';\nimport { AppState } from '../../core/redux/appState';\nimport { Action } from 'redux';\nimport { ReportRecipientReport } from '../models';\nimport { toIndexAwareMap } from '../../language/arrays';\n\n\ntype SetSelectedAction = {\n type: ActionType.SetSelected;\n report: ReportRecipientReport;\n selected: boolean;\n}\n\n\n/**\n * Dispatch this to update the selected status for an individual report.\n * @param selected - the new selected state you want (default: false)\n */\nexport const setSelectedAction = (report: ReportRecipientReport, selected: boolean): SetSelectedAction => ({\n type: ActionType.SetSelected,\n report: report,\n selected: selected,\n});\n\n\nexport const setSelectedReducer = (state: AppState, incomingAction: Action): AppState => {\n if (incomingAction.type !== ActionType.SetSelected) {\n return state;\n }\n \n const action = incomingAction as SetSelectedAction;\n\n const reports = toIndexAwareMap(state.reportRecipientReports || [], r => `${r.participantReportId}`);\n const selectedReport = reports[`${action.report.participantReportId}`];\n const updatedReport = R.assoc('isChecked', action.selected, selectedReport);\n const updatedReports = R.assoc(`${action.report.participantReportId}`, updatedReport, reports);\n return R.assoc('reportRecipientReports',\n Object.values(updatedReports).sort((a, b) => a.sourceIndex - b.sourceIndex),\n state); \n};","import * as React from 'react';\n\n\n/**\n * React lint is persistent about this \"use exhaustive deps\" thing -- but they don't seem to realize an empty deps\n * array is standard for running an effect once when a component mounts.\n */\nexport const useMount = (onMount: React.EffectCallback): void => React.useEffect(onMount, []);\n","import * as React from 'react';\n\n\nconst storage = ({\n setValue: (key: string, value: T): boolean => {\n try {\n sessionStorage.setItem(key, JSON.stringify(value));\n return true;\n\n } catch (ex) {\n console.log(`Failed to set session storage value for key (${key}):`, ex);\n return false;\n }\n },\n\n getValue: (key: string): T | undefined => {\n try {\n const serialized = sessionStorage.getItem(key);\n\n if (serialized === null || serialized === undefined) {\n return undefined;\n }\n\n return JSON.parse(serialized) as T;\n\n } catch (ex) {\n console.log(`Failed to get session storage value for key (${key}):`, ex);\n return undefined;\n }\n },\n\n removeValue: (key: string): void => {\n try {\n sessionStorage.removeItem(key);\n } catch (ex) {\n console.log(`Failed to remove session storage value for key (${key}):`, ex);\n }\n },\n});\n\n\n/**\n * A hook that interfaces with session storage. Does not update if session storage is updated through some means other\n * than this hook.\n */\nexport const useSessionStorage = (\n key: string,\n defaultValue?: T,\n): [T | undefined, (obj: T) => void, () => void] => {\n const [value, setValue] = React.useState(() => storage.getValue(key) ?? defaultValue);\n\n const set = React.useCallback(\n (value: T) => storage.setValue(key, value) && setValue(value),\n [key, setValue],\n );\n\n const remove = React.useCallback(() => storage.removeValue(key), [key]);\n\n return React.useMemo(() => [value, set, remove], [value, set, remove]);\n};\n","import { Map } from '../language/models';\nimport { Language } from './models';\n\n\nexport const defaultLanguages: Map = {\n 'en': {\n languageId: 1,\n projectId: 0,\n default: true,\n englishName: 'English',\n nativeName: 'English',\n codePage: 1252,\n charSet: 'UTF-8',\n rtl: false,\n code: 'en',\n },\n};\n","import { Map } from '../language/models';\nimport { Language, Message } from './models';\nimport { TextDirection } from './textDirection';\nimport { defaultLanguages } from './defaultLanguages';\n\n\nexport type LocaleState = {\n /**\n * The list of languages into which portal messages have been translated.\n */\n portalLanguages: Map;\n /**\n * BCP 47 encoded language/region string.\n */\n readonly lang: Language;\n readonly textDirection: TextDirection;\n // Object allowing lookup by language, then by translation key\n // Like so: { \"en-US\": { \"key1\": { message1 }, \"key2\": { message2 } } }\n readonly translations: Map>;\n};\n\nexport const defaultLocaleState = {\n portalLanguages: defaultLanguages,\n lang: defaultLanguages['en'],\n textDirection: TextDirection.LTR,\n} as LocaleState;\n","import { useSelector } from 'react-redux';\nimport { strictEquals } from '../../language/module';\nimport { AppState } from './appState';\n\n\n/**\n * This hook uses the given selector function to pull something out of app state. Uses strict equality to determine when\n * to re-run. This hook exists for two reasons:\n * 1. The Redux useSelector hook needs a lot of boiler (it can't even do proper type inference)\n * 1. This hook decouples Redux from app logic even more (not the main purpose, but it's a nice decoupling point)\n * @param selector - Function that pulls your value out of app state\n */\nexport const useAppState = (\n selector: (state: AppState) => T,\n): T => useSelector(selector, strictEquals);\n","import * as React from 'react';\nimport * as R from 'ramda';\nimport { useDispatch } from 'react-redux';\nimport { SessionStorageKeys } from './sessionStorageKeys';\nimport { Config } from '../featureFlags/config';\nimport { FeatureFlags } from '../featureFlags/featureFlags';\nimport { updateStateAction } from '../core/redux/updateStateAction';\nimport { useMount } from '../core/hooks/useMount';\nimport { useSessionStorage } from '../core/hooks/useSessionStorage';\nimport { AuthState } from '../auth/authState';\nimport { LocaleState, defaultLocaleState } from '../localization/localeState';\nimport { Map } from '../language/models';\nimport { EmailBody } from '../project/survey/raters/models';\nimport { useAppState } from '../core/redux/hooks';\nimport { CollaboratorAuthInfo } from '../project/devPlan/collaboration/currentCollaboratorState';\n\n\n/**\n * AppStateSessionStorageBridge: a component that is non-rendering and connects Redux AppState to the browser's\n * Session Storage API. This component will load session storage state into Redux onMount, and will store Redux Store\n * changes to Session Storage as they happen.\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst AppStateSessionStorageBridge: React.FC = () => {\n // You could make this less code by mashing everything together into a single object, but that would also mean\n // a lot of redundant setting/rendering for any change\n // Third return from `useSessionStorage` is `remove: () => void` for clearing a key\n\n // Session Storage Hooks ---------------------------------------------------------------------------------------------\n const [authValue, setAuth] = useSessionStorage(SessionStorageKeys.Auth);\n const [collabValue, setCollab] = useSessionStorage(SessionStorageKeys.Collaborator);\n const [configValue, setConfig] = useSessionStorage(SessionStorageKeys.Config);\n const [featureFlagsValue, setFeatureFlags] = useSessionStorage(SessionStorageKeys.FeatureFlags);\n const [localeValue, setLocale] = useSessionStorage(SessionStorageKeys.Locale);\n\n const [inviteTemplatesValue, setInviteTemplates] = useSessionStorage>>(\n SessionStorageKeys.InviteEmailTemplates,\n );\n\n const [approverTemplatesValue, setApproverTemplates] = useSessionStorage>>(\n SessionStorageKeys.ApproverEmailTemplates,\n );\n\n const [raterApprovalTemplatesValue, setRaterApprovalTemplates] = useSessionStorage>>(\n SessionStorageKeys.RaterEmailTemplates,\n );\n\n const [eqScoresTemplatesValue, setEqScoresTemplates] = useSessionStorage>(\n SessionStorageKeys.EQScoresEmailTemplates,\n );\n\n // Session Storage -> Redux ------------------------------------------------------------------------------------------\n const dispatch = useDispatch();\n\n useMount(() => {\n dispatch(updateStateAction({\n sessionStorageLoaded: true,\n devPlan: {\n currentCollaborator: collabValue,\n },\n auth: authValue || {},\n config: configValue,\n featureFlags: featureFlagsValue,\n locale: localeValue || defaultLocaleState,\n }));\n });\n\n // Redux -> Session Storage ------------------------------------------------------------------------------------------\n const auth = useAppState(state => state.auth);\n const collaborator = useAppState(state => state.devPlan?.currentCollaborator);\n const config = useAppState(state => state.config);\n const featureFlags = useAppState(state => state.featureFlags);\n const locale = useAppState(state => state.locale);\n\n const inviteTemplates = useAppState(state => state.inviteEmailTemplates);\n const approverTemplates = useAppState(state => state.approverEmailTemplates);\n const raterApprovalTemplates = useAppState(state => state.raterApprovalEmailTemplates);\n const eqScoresEmailTemplates = useAppState(state => state.eqScoresEmailTemplates);\n\n React.useEffect(() => auth && setAuth(auth), [auth, setAuth]);\n React.useEffect(() => collaborator && setCollab(collaborator), [collaborator, setCollab]);\n React.useEffect(() => config && setConfig(config), [config, setConfig]);\n React.useEffect(() => featureFlags && setFeatureFlags(featureFlags), [featureFlags, setFeatureFlags]);\n React.useEffect(() => locale && setLocale(locale), [locale, setLocale]);\n\n // Wrap session storage current value so we're not updating session storage when we see that session storage was\n // updated -- which would be the result of putting the session storage value directly on the dependencies of the\n // session storage update hooks down below.\n const inviteRef = React.useRef(inviteTemplatesValue);\n const approverRef = React.useRef(approverTemplatesValue);\n const raterApprovalRef = React.useRef(raterApprovalTemplatesValue);\n const eqScoresRef = React.useRef(eqScoresTemplatesValue);\n\n React.useEffect(() => { inviteRef.current = inviteTemplatesValue; }, [inviteTemplatesValue, inviteRef]);\n React.useEffect(() => { approverRef.current = approverTemplatesValue; }, [approverTemplatesValue, approverRef]);\n React.useEffect(\n () => { raterApprovalRef.current = raterApprovalTemplatesValue; },\n [raterApprovalTemplatesValue, raterApprovalRef],\n );\n React.useEffect(\n () => { eqScoresRef.current = eqScoresTemplatesValue; },\n [eqScoresTemplatesValue, eqScoresRef],\n );\n\n React.useEffect(\n () => inviteTemplates && setInviteTemplates(R.mergeDeepRight(inviteRef.current || {}, inviteTemplates)),\n [inviteTemplates, inviteRef, setInviteTemplates],\n );\n\n React.useEffect(\n () => approverTemplates && setApproverTemplates(R.mergeDeepRight(approverRef.current || {}, approverTemplates)),\n [approverTemplates, approverRef, setApproverTemplates],\n );\n\n React.useEffect(\n () => raterApprovalTemplates && setRaterApprovalTemplates(\n R.mergeDeepRight(raterApprovalRef.current || {}, raterApprovalTemplates),\n ),\n [raterApprovalTemplates, raterApprovalRef, setRaterApprovalTemplates],\n );\n\n React.useEffect(\n () => eqScoresEmailTemplates && setEqScoresTemplates(\n R.mergeDeepRight(eqScoresRef.current || {}, eqScoresEmailTemplates),\n ),\n [eqScoresEmailTemplates, eqScoresRef, setEqScoresTemplates],\n );\n\n return null; // Render nothing\n};\n\nexport default AppStateSessionStorageBridge;\n","/* eslint-disable */\n// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost'\n // [::1] is the IPv6 localhost address.\n || window.location.hostname === '[::1]'\n // 127.0.0.0/8 are considered localhost for IPv4.\n || window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/,\n ),\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n process.env.PUBLIC_URL,\n window.location.href,\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service '\n + 'worker. To learn more, visit https://bit.ly/CRA-PWA',\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all '\n + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.',\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404\n || (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.',\n );\n });\n}\n\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import { Map } from '../language/models';\nimport { TextDirection } from './textDirection';\nimport { Language } from './models';\nimport { defaultLanguages } from './defaultLanguages';\n\n\n/**\n * Gets the cross section between the user's supported languages and the languages we have translations for.\n * @param supportedLanguages - The list of languages we have translations for\n * @param languages - The list of languages the user's computer says the user speaks\n * @param defaultLang - The language to use if no translation/user language intersection is found\n */\nexport const getSupportedLanguage = (\n supportedLanguages: Map,\n languages: readonly string[],\n defaultLang: Language = defaultLanguages['en'],\n): Language => {\n const intersection = (languages || []).find(\n userLang => !!supportedLanguages[userLang],\n );\n\n return supportedLanguages[intersection || ''] ?? defaultLang;\n};\n\n\n/**\n * Predicate for whether or not the given TextDirection is TextDirection.RTL\n */\nexport const isRtl = (textDirection: TextDirection): boolean => textDirection === TextDirection.RTL;\n\n\n/**\n * Function accepting a Message from the server and performing the specified replacements on that text. If no\n * replacements are specified, then the string is just returned.\n */\nexport const doMsgReplacements = (\n text: string,\n replace: Map | undefined,\n): string => {\n if (!replace) {\n return text;\n }\n\n return Object\n .keys(replace)\n .reduce(\n (running, next) => running.replace(new RegExp('{' + next + '}', 'g'), `${replace[next] ?? ''}`),\n `${text}`,\n );\n};\n","import { useAppState } from '../core/redux/hooks';\n\n\n/**\n * Returns the current user if one is signed in\n */\nexport const useCurrentUser = () => useAppState(state => state.auth?.currentUser);\n\n/**\n * Returns the current portal space, if we are currently in one\n */\nexport const usePortalType = () => useAppState(state => state.portalType);\n","\n/* eslint-disable max-len */\n\nimport { Str } from './translationKeys';\nimport { Message } from './models';\n\nexport interface DefaultMessage extends Message {\n isDefault: boolean;\n}\n\nconst CreateMessage = (\n key: string,\n text: string,\n containsMarkup: boolean = false,\n containsToken: boolean = false,\n): DefaultMessage => ({\n key: key,\n languageId: 1, // English\n text: text,\n containsMarkup: containsMarkup,\n containsToken: containsToken,\n isDefault: true,\n});\n\n\n/**\n * The default messages, which are rendered whenever the user's current locale does not contain a translated version.\n */\nexport const defaultMessages: { [key: string]: DefaultMessage } = {\n [Str.InviteRatersParen]: CreateMessage(Str.InviteRatersParen, `[( Invite Raters )]`, false, false),\n [Str.RemindRatersParen]: CreateMessage(Str.RemindRatersParen, `[( Remind Raters )]`, false, false),\n [Str.FooterCopyrightPrivacy]: CreateMessage(Str.FooterCopyrightPrivacy, `[© TruScore. All Rights Reserved. Copyright | Privacy]`, true, false),\n [Str.NameAdded]: CreateMessage(Str.NameAdded, `[{lastCommaFirst} has been added.]`, false, true),\n [Str.ActionsAdded]: CreateMessage(Str.ActionsAdded, `[{number} Action(s) Added]`, false, true),\n [Str.RatersNotInvitedWarn]: CreateMessage(Str.RatersNotInvitedWarn, `[{number} rater(s) have not been invited.]`, false, true),\n [Str.RatersNotSentWarn]: CreateMessage(Str.RatersNotSentWarn, `[{number} rater(s) have not been sent for approval.]`, false, true),\n [Str.ReportsDelivered]: CreateMessage(Str.ReportsDelivered, `[{number} report(s) delivered]`, false, true),\n [Str.ReportsDownloaded]: CreateMessage(Str.ReportsDownloaded, `[{number} report(s) downloaded]`, false, true),\n [Str.UndeliveredRaters]: CreateMessage(Str.UndeliveredRaters, `[{number} undelivered rater(s), check their email addresses.]`, false, true),\n [Str.CustomerServicePhone]: CreateMessage(Str.CustomerServicePhone, `[800-332-6684 or +1 303-581-1408]`, false, false),\n [Str.FooterPhoneLinks]: CreateMessage(Str.FooterPhoneLinks, `[800-332-6684 or +1 303-581-1408]`, true, false),\n [Str.CustomerServiceSupportLink]: CreateMessage(Str.CustomerServiceSupportLink, `[http://www.truscoresupport.com]`, true, false),\n [Str.FooterSupportSiteLink]: CreateMessage(Str.FooterSupportSiteLink, `[Visit Support Site]`, true, false),\n [Str.CopyrightText]: CreateMessage(Str.CopyrightText, `[

1. General.

1.1 This Agreement governs your use of this web site and its associated services (the \"Web Service\"), including interactive surveys and adminstrative areas, which are owned and operated by TruScore. and its subsidiaries, affiliates, divisions and related companies (\"Clark Wilson Group\").

1.2 TruScore reserves the right, in its discretion, to change or modify all or any part of this Agreement at any time, effective immediately upon notice published on the Web Service. Your use of the Web Service constitutes your binding acceptance of these terms and conditions, including any changes or modifications made by TruScore as permitted above. If at any time the terms and conditions of this Agreement are no longer acceptable to you, you should immediately cease use of the Web Service and the Interactive Areas.

2. Use of Content.

2.1 You acknowledge that the Web Service contains information, software, photographs, audio and video clips, graphics, links and other material that are protected by copyright, trademark or other proprietary rights of TruScore or third parties, including but not limited to product names, logos, designs, titles, and words or phrases which may be registered in certain jurisdictions (collectively, the \"Content\"). You agree to comply with any additional copyright notices, information, or restrictions contained in any Content available on or accessed through the Web Service. Users of the Web Service may use the Content only for their personal, noncommercial use. Users of the Web Service wanting to use the content for commercial use must obtain prior express written permission of TruScore.

2.2 You may not modify, publish, transmit, transfer or sell, reproduce, create derivative works from, distribute, perform, display, or in any way exploit any of the content, in whole or in part, except as otherwise expressly permitted in this Agreement. Content consisting of downloadable software may not be reverse-engineered unless specifically authorized by the owner of the software's patent and or copyright.

2.3 You may not download content on this web site that is indicated to be for sale except under the terms of the sale. Such content is the protected and copyrightable property of TruScore. \"Free\" content may be downloaded for your personal use or noncommercial distribution consistent with the terms defined in this Agreement. When using both purchased and \"free\" content, you will maintain and include all copyright and other notices contained in such content. Except as expressly permitted by the copyright laws, no copying, storage, redistribution or publication of any content is permitted without the express permission of TruScore or the owners of such content or their authorized persons if other than TruScore.

3. Rules of Conduct.

You shall not post on the Web Service any content which (a) is libelous, defamatory, obscene, pornographic, abusive, harassing or threatening; (b) contains viruses or other contaminating or destructive features; (c) violates the rights of others, such as content which infringes any copyright, trademark, patent, trade secret or violates any right of privacy or publicity; or (d) otherwise violates any applicable law or reputation. You may not post on the Web Service any links to any external Internet sites that are obscene or pornographic. You shall not use the Web Service for any commercial purpose not expressly approved by TruScore, nor shall you distribute any advertising or solicitation of funds or goods and services or solicit users to join competitive online services.

4. Managing Content.

TruScore does not and cannot review the content posted by users on the Web Service and is not responsible for such content. However, TruScore reserves the right to delete, move or edit any content (including content posted in any Interactive Area) that it may determine, in its sole discretion, violates or may violate this Agreement or is otherwise unacceptable. You shall remain solely responsible for all content posted by you. TruScore shall have the right but not the obligation, to correct any errors or omissions in any content, as it may determine in its sole discretion.

5. No Endorsement.

5.1 TruScore does not represent or endorse the accuracy or reliability of any content posted on any Interactive Area and you acknowledge that any reliance upon such content shall be at your sole risk. Any content placed on any Interactive Area by users are the views of the user posting the statement, and do not represent the views of TruScore or its advertisers or sponsors.

5.2 The Web Service may contain links to sites on the Internet, which are owned and operated by third parties (the \"External Sites\"). You acknowledge that TruScore is not responsible for the availability of, or the content located on or through any External Site. You should contact the site administrator or Webmaster for those External Sites if you have any concerns regarding such links or the content located on such External Sites.

6. Indemnity.

You agree to indemnify, defend and hold TruScore and its affiliates, and their respective officers, directors, owners, agents, information providers and licensors, harmless from any and all claims, liability, losses, costs and expenses (including reasonable attorney fees), to the extent any such claims, losses, damages, costs and expenses are due to the acts or omissions of you or your officers, directors, agents and employees.

7. Termination of Service.

TruScore reserves the right, in its sole discretion, to restrict, suspend or terminate your access to all or any part of the Web Service, including the Interactive Areas, at any time for any reason without prior notice or liability. TruScore may change, suspend or discontinue all or any aspect of the Web Service at any time, including the availability of any feature, database, or Content (including the Interactive Areas), without prior notice or liability.

8. DISCLAIMER OF WARRANTIES; LIMITATION OF LIABILITY.

8.1 NEITHER TruScore NOR ANY PROVIDER OF THIRD PARTY CONTENT OR THEIR RESPECTIVE AGENTS WARRANTS THAT THE WEB SERVICE WILL BE UNINTERRUPTED OR ERROR FREE; NOR DOES TruScore, ANY THIRD PARTY CONTENT PROVIDER, OR THEIR RESPECTIVE AGENTS MAKE ANY WARRANTY AS TO THE RESULTS TO BE OBTAINED FROM USE OF THE WEB SERVICE OR THE CONTENT. THE WEB SERVICE AND THE CONTENT ARE DISTRIBUTED ON AN \"AS IS, AS AVAILABLE\" BASIS. NEITHER TruScore, THIRD PARTY CONTENT PROVIDERS, NOR THEIR RESPECTIVE AGENTS MAKE ANY WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, WARRANTIES OF TITLE OR IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, WITH RESPECT TO THE WEB SERVICE, ANY CONTENT OR ANY PRODUCTS OR SERVICES SOLD THROUGH THE WEB SERVICE. NEITHER TruScore NOR ANY THIRD PARTY CONTENT PROVIDER WARRANTS THAT ANY FILES AVAILABLE FOR DOWNLOADING THROUGH THE WEB SERVICE WILL BE FREE OF VIRUSES OR SIMILAR CONTAMINATION OR DESTRUCTIVE FEATURES. YOU EXPRESSLY AGREE THAT THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SERVICE AND THE ACCURACY OR COMPLETENESS OF THE CONTENT IS ASSUMED SOLELY BY YOU.

8.2. NEITHER TruScore NOR ANY THIRD PARTY CONTENT PROVIDER OR THEIR AGENTS SHALL BE LIABLE FOR ANY ACT, DIRECT OR INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF OR INABILITY TO USE THE SERVICE, EVEN IF SUCH PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

8.3. SOME STATES DO NOT ALLOW EXCLUSION OR IMPLIED WARRANTIES OR LIMITATION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATIONS OR EXCLUSIONS MAY NOT APPLY TO YOU. IN SUCH STATES, THE LIABILITY OF TruScore, THIRD PARTY CONTENT PROVIDERS AND THEIR RESPECTIVE AGENTS SHALL BE LIMITED TO THE GREATEST EXTENT PERMITTED BY LAW.

9. MISCELLANEOUS.

This Agreement shall be construed in accordance with the laws of the State of Colorado, and the parties irrevocably consent to bring any action to enforce this Agreement in the federal or state courts located in Boulder County in the State of Colorado. This Agreement constitutes the entire agreement between the parties with respect to the subject matter hereof, and supersedes all previous written or oral agreements between the parties with respect to such subject matter. All provisions hereof shall survive any termination of this Agreement as well as any other revisions which by their terms or sense are intended to survive.

For our customers in the EU:

The personal information contained in the responses to this survey will be transmitted to and processed in the USA. Every reasonable precaution has been taken by TruScore to ensure that the data is accurate, secure and confidential. Only authorised personnel or agents of TruScore will have access to your data.

]`, true, true),\n [Str.PrivacyText]: CreateMessage(Str.PrivacyText, `[

Online Data Collection

\n

The Booth Company, Inc. (d.b.a TruScore) will, at times, collect certain personal identifiable information (PII) as necessary, with the purpose of providing assessment related services. The PII data that we require is limited to name and corporate email address. As part of our Privacy Policy, and in an effort to adhere to US, EU and Swiss data privacy laws, TruScore shall comply with the following guidelines:

\n
    \n
  • TruScore will use PII data ONLY for the intended purposes.
  • \n
  • TruScore will notify you in the event of a breach or incident in which your PII data security is compromised.
  • \n
  • You have the right to contact TruScore to request to review, or remove your PII data or to request the limitation of use and disclosure of your PII data. (see contact info below)
  • \n
  • At times and only as necessary to support our assessment related services, authorized vendors may have visibility to PII Data. Other than authorized vendors, TruScore will NOT provide access, give away or sell PII data to any third parties.
  • \n
  • TruScore does not, and will not share, give away or sell PII data to third parties and therefore TruScore does not provide an opt-out option. If our policy changes in the future, TruScore will provide individuals with the ability to opt-out of sharing their data.
  • \n
  • TruScore may be required to disclose an individual’s personal information in response to a lawful request by public authorities, including to meet national security or law enforcement requirements.
  • \n
  • In cases of onward transfer to third parties of data of EU individuals received pursuant to the EU-US Privacy Shield, TruScore is potentially liable.
  • \n
  • TruScore will take appropriate and reasonable steps to protect PII and survey data. (see below)
  • \n

\n\n

Confidentiality and Security Safeguards

\n

TruScore takes technical, contractual, administrative and physical steps to protect against unauthorized access to, and disclosure of, personal identifiable information (PII). These steps can include firewalls, secure socket layer (SSL) encryption, physical security, password authentication, etc. To learn more, you may request a copy of our current Security Policy.

\n\n

Cookies

\n

The TruScore site makes use of a technology called session-only cookies. These cookies are deleted after the web survey session is over.

\n\n

External Links

\n

TruScore is not responsible for the privacy policies of web sites to which TruScore web site may link or for those of any downstream linkages.

\n\n

EU and Swiss Privacy Shield

\n

TruScore is subject to the investigatory and enforcement powers of the U.S. Federal Trade Commission. TruScore complies with the EU-US and Swiss-US Privacy Shield Frameworks as set forth by the US Department of Commerce regarding the collection, use, and retention of personal information from European Union member countries and Switzerland. TruScore has certified that it adheres to the Privacy Shield Principles of Notice, Choice, Accountability for Onward Transfer, Security, Data Integrity and Purpose Limitation, Access, and Recourse, Enforcement and Liability. If there is any conflict between the policies in this privacy policy and the Privacy Shield Principles, the Privacy Shield Principles shall govern. To learn more about the Privacy Shield program, and to view our certification page, please visit https://www.privacyshield.gov/

\n\n

In compliance with the EU-US and Swiss-US Privacy Shield Principles, TruScore commits to resolve complaints about your privacy and our collection or use of your personal information. European Union or Swiss individuals with inquiries or complaints regarding this privacy policy should first contact TruScore at:

\n

Call Customer Support: 303-581-1408

\n

Email Customer Support: Support@truscore.com

\n\n

TruScore has further committed to refer unresolved privacy complaints under the EU-US and Swiss-US Privacy Shield Principles to BBB EU PRIVACY SHIELD, a non-profit alternative dispute resolution provider located in the United States and operated by the Council of Better Business Bureaus. If you do not receive timely acknowledgment of your complaint, or if your complaint is not satisfactorily addressed, please visit www.bbb.org/EU-privacy-shield/for-eu-consumers/ for more information and to file a complaint. Please note that if your complaint is not resolved through these channels, under limited circumstances, a binding arbitration option may be available before a Privacy Shield Panel. The United States Federal Trade Commission (FTC) is the enforcement authority with jurisdiction over this compliance with the Privacy Shield.

\n]`, true, true),\n [Str.CopyrightRightsReserved]: CreateMessage(Str.CopyrightRightsReserved, `[© TruScore. All Rights Reserved.]`, false, false),\n [Str.DevPlanAccessMsg]: CreateMessage(Str.DevPlanAccessMsg, `[Access your development plan to aid in your growth.]`, false, false),\n [Str.Account]: CreateMessage(Str.Account, `[Account]`, false, false),\n [Str.ActionNumber]: CreateMessage(Str.ActionNumber, `[Action #{number}]`, false, true),\n [Str.Add]: CreateMessage(Str.Add, `[Add]`, false, false),\n [Str.AddDate]: CreateMessage(Str.AddDate, `[Add a Date]`, false, false),\n [Str.AddDevItem]: CreateMessage(Str.AddDevItem, `[Add a Development Item]`, false, false),\n [Str.AddAction]: CreateMessage(Str.AddAction, `[Add an Action]`, false, false),\n [Str.AddItem]: CreateMessage(Str.AddItem, `[Add Item]`, false, false),\n [Str.AddOptionalText]: CreateMessage(Str.AddOptionalText, `[Add optional text here...]`, false, false),\n [Str.AddPreviousRaters]: CreateMessage(Str.AddPreviousRaters, `[Add Previous Raters]`, false, false),\n [Str.AddRater]: CreateMessage(Str.AddRater, `[Add Rater]`, false, false),\n [Str.AddCalendar]: CreateMessage(Str.AddCalendar, `[Add to Calendar]`, false, false),\n [Str.Added]: CreateMessage(Str.Added, `[Added]`, false, false),\n [Str.AggregateReport]: CreateMessage(Str.AggregateReport, `[Aggregate Report]`, false, false),\n [Str.All]: CreateMessage(Str.All, `[All]`, false, false),\n [Str.AllDeliveries]: CreateMessage(Str.AllDeliveries, `[All Deliveries]`, false, false),\n [Str.AnswerRequired]: CreateMessage(Str.AnswerRequired, `[An answer is required.]`, false, false),\n [Str.Answer]: CreateMessage(Str.Answer, `[Answer]`, false, false),\n [Str.AnswerSecurityQuestion]: CreateMessage(Str.AnswerSecurityQuestion, `[Answer the security question below exactly as you did when you created your TruScore account. Your answer is case sensitive.]`, false, false),\n [Str.Approval]: CreateMessage(Str.Approval, `[Approval]`, false, false),\n [Str.ApprovalColon]: CreateMessage(Str.ApprovalColon, `[Approval:]`, false, false),\n [Str.ApprovalRequestSent]: CreateMessage(Str.ApprovalRequestSent, `[Approval request sent.]`, false, false),\n [Str.Approve]: CreateMessage(Str.Approve, `[Approve]`, false, false),\n [Str.ApprovalStatus3]: CreateMessage(Str.ApprovalStatus3, `[Approved]`, false, false),\n [Str.ApprovalStatus1]: CreateMessage(Str.ApprovalStatus1, `[Approver]`, false, false),\n [Str.Approver]: CreateMessage(Str.Approver, `[Approver?]`, false, false),\n [Str.ApproverColon]: CreateMessage(Str.ApproverColon, `[Approver:]`, false, false),\n [Str.RatersNotInvitedConfirm]: CreateMessage(Str.RatersNotInvitedConfirm, `[Are you sure you want to leave this page?]`, false, false),\n [Str.AutoRemindersConfirm]: CreateMessage(Str.AutoRemindersConfirm, `[Are you sure you want to remind them again?]`, false, false),\n [Str.ConfirmRemind]: CreateMessage(Str.ConfirmRemind, `[Are you sure you want to remind your raters?]`, false, false),\n [Str.ConfirmRemoveRater]: CreateMessage(Str.ConfirmRemoveRater, `[Are you sure you want to remove {email} from your rater list?]`, false, true),\n [Str.ConfirmRemoveItem]: CreateMessage(Str.ConfirmRemoveItem, `[Are you sure you want to remove {itemTitle} from your development plan?]`, false, true),\n [Str.ConfirmRemoveAction]: CreateMessage(Str.ConfirmRemoveAction, `[Are you sure you want to remove Action #{number} from {itemTitle}?]`, false, true),\n [Str.DevPlanReminders]: CreateMessage(Str.DevPlanReminders, `[Automatic reminders are sent every two weeks until all actions are completed.]`, false, false),\n [Str.Available]: CreateMessage(Str.Available, `[Available]`, false, false),\n [Str.BackToLogin]: CreateMessage(Str.BackToLogin, `[Back to the log in page]`, false, false),\n [Str.Begin]: CreateMessage(Str.Begin, `[Begin]`, false, false),\n [Str.EntryAgreement]: CreateMessage(Str.EntryAgreement, `[By entering you agree to our copyright and privacy statements.]`, true, false),\n [Str.Cancel]: CreateMessage(Str.Cancel, `[Cancel]`, false, false),\n [Str.ChangePassword]: CreateMessage(Str.ChangePassword, `[Change Password]`, false, false),\n [Str.ChangeSecurityQuestion]: CreateMessage(Str.ChangeSecurityQuestion, `[Change Security Question & Answer]`, false, false),\n [Str.ChangePasswordTitle]: CreateMessage(Str.ChangePasswordTitle, `[Change your password.]`, false, false),\n [Str.ChangeSecurityQuestionTitle]: CreateMessage(Str.ChangeSecurityQuestionTitle, `[Change your security question and answer.]`, false, false),\n [Str.ChooseLanguage]: CreateMessage(Str.ChooseLanguage, `[Choose a language]`, false, false),\n [Str.ChooseProject]: CreateMessage(Str.ChooseProject, `[Choose a Project]`, false, false),\n [Str.ChooseRater]: CreateMessage(Str.ChooseRater, `[Choose a Rater]`, false, false),\n [Str.ChooseSecurityQuestion]: CreateMessage(Str.ChooseSecurityQuestion, `[Choose a security question and enter an answer. Answers are case sensitive.]`, false, false),\n [Str.ChooseCompetency]: CreateMessage(Str.ChooseCompetency, `[Choose a survey competency]`, false, false),\n [Str.ChooseCompetencies]: CreateMessage(Str.ChooseCompetencies, `[Choose Competencies]`, false, false),\n [Str.Company]: CreateMessage(Str.Company, `[Company]`, false, false),\n [Str.Competencies]: CreateMessage(Str.Competencies, `[Competencies]`, false, false),\n [Str.DashDevPlanItemsMsg]: CreateMessage(Str.DashDevPlanItemsMsg, `[Add {number} development items to meet the development plan requirements.]`, false, true),\n [Str.DashDevPlanItemsEmailMsg]: CreateMessage(Str.DashDevPlanItemsEmailMsg, `[Add {number} development items and email your plan to your {levelName} to meet the development plan requirements.]`, false, true),\n [Str.CompleteBy]: CreateMessage(Str.CompleteBy, `[Complete by]`, false, false),\n [Str.Completed]: CreateMessage(Str.Completed, `[Completed]`, false, false),\n [Str.Composite]: CreateMessage(Str.Composite, `[Composite]`, false, false),\n [Str.ConfirmPassword]: CreateMessage(Str.ConfirmPassword, `[Confirm New Password]`, false, false),\n [Str.PasswordMismatch]: CreateMessage(Str.PasswordMismatch, `[Confirmed password does not match.]`, false, false),\n [Str.DevPlanCompleteMsg]: CreateMessage(Str.DevPlanCompleteMsg, `[Congratulations, you’ve met the development plan requirements!]`, false, false),\n [Str.Continue]: CreateMessage(Str.Continue, `[Continue]`, false, false),\n [Str.Copyright]: CreateMessage(Str.Copyright, `[Copyright]`, false, false),\n [Str.CreatePassword]: CreateMessage(Str.CreatePassword, `[Create a New Password]`, false, false),\n [Str.CreateASurvey]: CreateMessage(Str.CreateASurvey, `[Create a Survey]`, false, false),\n [Str.CreateDevPlan]: CreateMessage(Str.CreateDevPlan, `[Create Development Plan]`, false, false),\n [Str.CreateSurvey]: CreateMessage(Str.CreateSurvey, `[Create Survey]`, false, false),\n [Str.CurrentPassword]: CreateMessage(Str.CurrentPassword, `[Current password]`, false, false),\n [Str.CustomerService]: CreateMessage(Str.CustomerService, `[Customer Service]`, false, false),\n [Str.CustomerSupport]: CreateMessage(Str.CustomerSupport, `[Customer Support]`, false, false),\n [Str.CustomizeEmail]: CreateMessage(Str.CustomizeEmail, `[Customize Email?]`, false, false),\n [Str.CustomizeInvite]: CreateMessage(Str.CustomizeInvite, `[Customize Invite?]`, false, false),\n [Str.Dashboard]: CreateMessage(Str.Dashboard, `[Dashboard]`, false, false),\n [Str.DateRangeReports]: CreateMessage(Str.DateRangeReports, `[Date range of reports made available to you]`, false, false),\n [Str.Days]: CreateMessage(Str.Days, `[Days]`, false, false),\n [Str.DeadlineColon]: CreateMessage(Str.DeadlineColon, `[Deadline:]`, false, false),\n [Str.Decline]: CreateMessage(Str.Decline, `[Decline]`, false, false),\n [Str.ApprovalStatus4]: CreateMessage(Str.ApprovalStatus4, `[Declined]`, false, false),\n [Str.Deliver]: CreateMessage(Str.Deliver, `[Deliver]`, false, false),\n [Str.DeliverAll]: CreateMessage(Str.DeliverAll, `[Deliver All Reports]`, false, false),\n [Str.DeliverSelected]: CreateMessage(Str.DeliverSelected, `[Deliver Selected Reports]`, false, false),\n [Str.Delivered]: CreateMessage(Str.Delivered, `[Delivered]`, false, false),\n [Str.DeliveredParticipant]: CreateMessage(Str.DeliveredParticipant, `[Delivered to Participant?]`, false, false),\n [Str.Description]: CreateMessage(Str.Description, `[Description]`, false, false),\n [Str.DescriptionNotAdded]: CreateMessage(Str.DescriptionNotAdded, `[Description not added...]`, false, false),\n [Str.DevActions]: CreateMessage(Str.DevActions, `[Development Actions]`, false, false),\n [Str.Devitem]: CreateMessage(Str.Devitem, `[Development Item]`, false, false),\n [Str.DevPlan]: CreateMessage(Str.DevPlan, `[Development Plan]`, false, false),\n [Str.DevResources]: CreateMessage(Str.DevResources, `[Development Resources]`, false, false),\n [Str.DevTips]: CreateMessage(Str.DevTips, `[Development Tips]`, false, false),\n [Str.Done]: CreateMessage(Str.Done, `[Done]`, false, false),\n [Str.Download]: CreateMessage(Str.Download, `[Download]`, false, false),\n [Str.DownloadAll]: CreateMessage(Str.DownloadAll, `[Download All Reports]`, false, false),\n [Str.DownloadSelected]: CreateMessage(Str.DownloadSelected, `[Download Selected Reports]`, false, false),\n [Str.EditSurvey]: CreateMessage(Str.EditSurvey, `[Edit Survey]`, false, false),\n [Str.Email]: CreateMessage(Str.Email, `[Email]`, false, false),\n [Str.EmailColon]: CreateMessage(Str.EmailColon, `[Email:]`, false, false),\n [Str.EmailRater]: CreateMessage(Str.EmailRater, `[Email a Rater]`, false, false),\n [Str.EmailOther]: CreateMessage(Str.EmailOther, `[Email Other]`, false, false),\n [Str.EmailPreview]: CreateMessage(Str.EmailPreview, `[Email Preview]`, false, false),\n [Str.EmailReminders]: CreateMessage(Str.EmailReminders, `[Email Reminders]`, false, false),\n [Str.TemplateMissing]: CreateMessage(Str.TemplateMissing, `[Email template not available, please contact support at http://www.truscoresupport.com.]`, false, false),\n [Str.EmailGoals]: CreateMessage(Str.EmailGoals, `[Email Your Goals]`, false, false),\n [Str.EmailPlan]: CreateMessage(Str.EmailPlan, `[Email Your Plan]`, false, false),\n [Str.DashDevPlanEmailMsg]: CreateMessage(Str.DashDevPlanEmailMsg, `[Email your plan to your {levelName} to meet the development plan requirements.]`, false, true),\n [Str.EnterDevItem]: CreateMessage(Str.EnterDevItem, `[Enter a development item]`, false, false),\n [Str.EnterEmail]: CreateMessage(Str.EnterEmail, `[Enter the email address associated with your TruScore account.]`, false, false),\n [Str.Expired]: CreateMessage(Str.Expired, `[Expired]`, false, false),\n [Str.AddFailed]: CreateMessage(Str.AddFailed, `[Failed to add]`, false, false),\n [Str.LoadFailed]: CreateMessage(Str.LoadFailed, `[Failed to load]`, false, false),\n [Str.SecurityQuestionFather]: CreateMessage(Str.SecurityQuestionFather, `[Father's middle name?]`, false, false),\n [Str.SecurityQuestionColor]: CreateMessage(Str.SecurityQuestionColor, `[Favorite color?]`, false, false),\n [Str.SecurityQuestionDessert]: CreateMessage(Str.SecurityQuestionDessert, `[Favorite dessert?]`, false, false),\n [Str.FilterParticipant]: CreateMessage(Str.FilterParticipant, `[Filter by Participant]`, false, false),\n [Str.FilterProject]: CreateMessage(Str.FilterProject, `[Filter by Project]`, false, false),\n [Str.FirstName]: CreateMessage(Str.FirstName, `[First Name]`, false, false),\n [Str.SecurityQuestionPet]: CreateMessage(Str.SecurityQuestionPet, `[First pet's name?]`, false, false),\n [Str.ForgotPassword]: CreateMessage(Str.ForgotPassword, `[Forgot your password?]`, false, false),\n [Str.FullReport]: CreateMessage(Str.FullReport, `[Full Feedback Report]`, false, false),\n [Str.GoalsSentTo]: CreateMessage(Str.GoalsSentTo, `[Goals sent to {email}]`, false, true),\n [Str.Hours]: CreateMessage(Str.Hours, `[Hours]`, false, false),\n [Str.DashDevPlanDoneMsg]: CreateMessage(Str.DashDevPlanDoneMsg, `[How is your development going? Review your development plan.]`, false, false),\n [Str.DefaultDevPlanField2]: CreateMessage(Str.DefaultDevPlanField2, `[How will you know you're improving? (Success Indicators)]`, false, false),\n [Str.RaterApprovalMsg]: CreateMessage(Str.RaterApprovalMsg, `[If you do not complete the approval process in a timely manner {firstLast} may not receive a feedback report.]`, false, true),\n [Str.ScoredHigh]: CreateMessage(Str.ScoredHigh, `[If You Scored High]`, false, false),\n [Str.ScoredLow]: CreateMessage(Str.ScoredLow, `[If You Scored Low]`, false, false),\n [Str.InProgress]: CreateMessage(Str.InProgress, `[In Progress]`, false, false),\n [Str.CreateSurveyFootnote]: CreateMessage(Str.CreateSurveyFootnote, `[Included in your development plan]`, false, false),\n [Str.Incomplete]: CreateMessage(Str.Incomplete, `[Incomplete]`, false, false),\n [Str.InvalidEmail]: CreateMessage(Str.InvalidEmail, `[Incorrect email address format.]`, false, false),\n [Str.LoginFailure]: CreateMessage(Str.LoginFailure, `[Incorrect email and/or password.]`, false, false),\n [Str.Individual]: CreateMessage(Str.Individual, `[Individual]`, false, false),\n [Str.InviteRemindRaters]: CreateMessage(Str.InviteRemindRaters, `[Invite and Remind Raters]`, false, false),\n [Str.InviteRaters]: CreateMessage(Str.InviteRaters, `[Invite Raters]`, false, false),\n [Str.InviteRequirements]: CreateMessage(Str.InviteRequirements, `[Invite Requirements:]`, false, false),\n [Str.Invited]: CreateMessage(Str.Invited, `[Invited]`, false, false),\n [Str.InvitedColon]: CreateMessage(Str.InvitedColon, `[Invited:]`, false, false),\n [Str.InvitesSent]: CreateMessage(Str.InvitesSent, `[Invites sent.]`, false, false),\n [Str.WebReportMsg]: CreateMessage(Str.WebReportMsg, `[It is recommended to add no more than three skills to your development plan.]`, false, false),\n [Str.Language]: CreateMessage(Str.Language, `[Language]`, false, false),\n [Str.LanguageColon]: CreateMessage(Str.LanguageColon, `[Language:]`, false, false),\n [Str.Last3Months]: CreateMessage(Str.Last3Months, `[Last 3 Months]`, false, false),\n [Str.Last6Months]: CreateMessage(Str.Last6Months, `[Last 6 Months]`, false, false),\n [Str.LastMonth]: CreateMessage(Str.LastMonth, `[Last Month]`, false, false),\n [Str.LastName]: CreateMessage(Str.LastName, `[Last Name]`, false, false),\n [Str.LastYear]: CreateMessage(Str.LastYear, `[Last Year]`, false, false),\n [Str.LogIn]: CreateMessage(Str.LogIn, `[Log In]`, false, false),\n [Str.LogOut]: CreateMessage(Str.LogOut, `[Log Out]`, false, false),\n [Str.Minutes]: CreateMessage(Str.Minutes, `[Minutes]`, false, false),\n [Str.CustomerServiceHours]: CreateMessage(Str.CustomerServiceHours, `[Monday – Friday 8:30 am – 5:30 pm (USA MT)]`, false, false),\n [Str.SecurityQuestionMother]: CreateMessage(Str.SecurityQuestionMother, `[Mother's middle name?]`, false, false),\n [Str.NA]: CreateMessage(Str.NA, `[N/A]`, false, false),\n [Str.NameColon]: CreateMessage(Str.NameColon, `[Name:]`, false, false),\n [Str.Name]: CreateMessage(Str.Name, `[Name]`, false, false),\n [Str.NameOrEmail]: CreateMessage(Str.NameOrEmail, `[Name or Email]`, false, false),\n [Str.NameEmail]: CreateMessage(Str.NameEmail, `[Name/Email]`, false, false),\n [Str.ApprovalStatus2]: CreateMessage(Str.ApprovalStatus2, `[Needs Approval]`, false, false),\n [Str.NewPassword]: CreateMessage(Str.NewPassword, `[New Password]`, false, false),\n [Str.SecurityQuestionNickname]: CreateMessage(Str.SecurityQuestionNickname, `[Nickname in school?]`, false, false),\n [Str.No]: CreateMessage(Str.No, `[No]`, false, false),\n [Str.NotAvailable]: CreateMessage(Str.NotAvailable, `[Not Available]`, false, false),\n [Str.NotInvited]: CreateMessage(Str.NotInvited, `[Not Invited]`, false, false),\n [Str.NotStarted]: CreateMessage(Str.NotStarted, `[Not Started]`, false, false),\n [Str.NoteForReminders]: CreateMessage(Str.NoteForReminders, `[Note that reminders are only sent to those who have not completed their survey.]`, false, false),\n [Str.Off]: CreateMessage(Str.Off, `[Off]`, false, false),\n [Str.On]: CreateMessage(Str.On, `[On]`, false, false),\n [Str.Online]: CreateMessage(Str.Online, `[Online]`, false, false),\n [Str.OptionalComments]: CreateMessage(Str.OptionalComments, `[Optional Comments]`, false, false),\n [Str.Or]: CreateMessage(Str.Or, `[or]`, false, false),\n [Str.Password]: CreateMessage(Str.Password, `[Password]`, false, false),\n [Str.PasswordFailsRequirements]: CreateMessage(Str.PasswordFailsRequirements, `[Password does not satisfy requirements.]`, false, false),\n [Str.PasswordRequirements]: CreateMessage(Str.PasswordRequirements, `[Passwords must have at least 1 uppercase letter, 1 lowercase letter and 1 number digit, and be at least {number} characters in length. {additional}]`, false, true),\n [Str.Phone]: CreateMessage(Str.Phone, `[Phone]`, false, false),\n [Str.SelectQuestion]: CreateMessage(Str.SelectQuestion, `[Please select a question.]`, false, false),\n [Str.LoginTitle]: CreateMessage(Str.LoginTitle, `[Portal Log In]`, false, false),\n [Str.Privacy]: CreateMessage(Str.Privacy, `[Privacy]`, false, false),\n [Str.PrivacyPolicy]: CreateMessage(Str.PrivacyPolicy, `[Privacy Policy]`, false, false),\n [Str.Project]: CreateMessage(Str.Project, `[Project]`, false, false),\n [Str.Question]: CreateMessage(Str.Question, `[Question]`, false, false),\n [Str.Questions]: CreateMessage(Str.Questions, `[Questions]`, false, false),\n [Str.RaterApproval]: CreateMessage(Str.RaterApproval, `[Rater Approval]`, false, false),\n [Str.RaterStatus]: CreateMessage(Str.RaterStatus, `[Rater Status]`, false, false),\n [Str.RecommendedMinimums]: CreateMessage(Str.RecommendedMinimums, `[Recommended Minimums]`, false, false),\n [Str.Relationship]: CreateMessage(Str.Relationship, `[Relationship]`, false, false),\n [Str.RelationshipColon]: CreateMessage(Str.RelationshipColon, `[Relationship:]`, false, false),\n [Str.RemindRaters]: CreateMessage(Str.RemindRaters, `[Remind Raters]`, false, false),\n [Str.RemindersSent]: CreateMessage(Str.RemindersSent, `[Reminders sent.]`, false, false),\n [Str.Remove]: CreateMessage(Str.Remove, `[Remove]`, false, false),\n [Str.ReportPortal]: CreateMessage(Str.ReportPortal, `[Report Portal]`, false, false),\n [Str.ReportTutorial]: CreateMessage(Str.ReportTutorial, `[Report Tutorial]`, false, false),\n [Str.Reports]: CreateMessage(Str.Reports, `[Reports]`, false, false),\n [Str.RequiredMinimums]: CreateMessage(Str.RequiredMinimums, `[Required Minimums]`, false, false),\n [Str.RequiredOpenQuestions]: CreateMessage(Str.RequiredOpenQuestions, `[Required Open Ended Questions]`, false, false),\n [Str.Resources]: CreateMessage(Str.Resources, `[Resources]`, false, false),\n [Str.ResponseNotAdded]: CreateMessage(Str.ResponseNotAdded, `[Response not added…]`, false, false),\n [Str.Retry]: CreateMessage(Str.Retry, `[Retry]`, false, false),\n [Str.Review]: CreateMessage(Str.Review, `[Review]`, false, false),\n [Str.ReviewDevPlan]: CreateMessage(Str.ReviewDevPlan, `[Review Development Plan]`, false, false),\n [Str.ReviewFeedback]: CreateMessage(Str.ReviewFeedback, `[Review your feedback before creating your plan.]`, false, false),\n [Str.Save]: CreateMessage(Str.Save, `[Save]`, false, false),\n [Str.Search]: CreateMessage(Str.Search, `[Search]`, false, false),\n [Str.SearchDirectory]: CreateMessage(Str.SearchDirectory, `[Search Directory]`, false, false),\n [Str.SearchParticipants]: CreateMessage(Str.SearchParticipants, `[Search participants...]`, false, false),\n [Str.SearchProjects]: CreateMessage(Str.SearchProjects, `[Search projects...]`, false, false),\n [Str.SecurityQuestion]: CreateMessage(Str.SecurityQuestion, `[Security Question]`, false, false),\n [Str.Select]: CreateMessage(Str.Select, `[Select]`, false, false),\n [Str.SelectOne]: CreateMessage(Str.SelectOne, `[Select One]`, false, false),\n [Str.SelfSurvey]: CreateMessage(Str.SelfSurvey, `[Self Survey]`, false, false),\n [Str.Send]: CreateMessage(Str.Send, `[Send]`, false, false),\n [Str.SendGoals]: CreateMessage(Str.SendGoals, `[Send a copy of your goals to yourself or a coach/mentor]`, false, false),\n [Str.SendApproval]: CreateMessage(Str.SendApproval, `[Send Approval]`, false, false),\n [Str.SendForApproval]: CreateMessage(Str.SendForApproval, `[Send for Approval]`, false, false),\n [Str.SetGoals]: CreateMessage(Str.SetGoals, `[Set Goals]`, false, false),\n [Str.SetPassword]: CreateMessage(Str.SetPassword, `[Setup a Password]`, false, false),\n [Str.SetSecurityQuestion]: CreateMessage(Str.SetSecurityQuestion, `[Setup a Security Question and Answer]`, false, false),\n [Str.ShowMostRecent]: CreateMessage(Str.ShowMostRecent, `[Show only the most recent report for a participant]`, false, false),\n [Str.Skills]: CreateMessage(Str.Skills, `[Skills]`, false, false),\n [Str.Status]: CreateMessage(Str.Status, `[Status]`, false, false),\n [Str.Submitted]: CreateMessage(Str.Submitted, `[Submitted]`, false, false),\n [Str.Summary]: CreateMessage(Str.Summary, `[Summary]`, false, false),\n [Str.SummaryReport]: CreateMessage(Str.SummaryReport, `[Summary Feedback Report]`, false, false),\n [Str.SurveyDeadline]: CreateMessage(Str.SurveyDeadline, `[Survey Deadline]`, false, false),\n [Str.SurveyDeadlineColon]: CreateMessage(Str.SurveyDeadlineColon, `[Survey Deadline:]`, false, false),\n [Str.TakeSelfSurvey]: CreateMessage(Str.TakeSelfSurvey, `[Take Self Survey]`, false, false),\n [Str.IncorrectAnswer]: CreateMessage(Str.IncorrectAnswer, `[The answer provided does not match the registered answer.]`, false, false),\n [Str.IncorrectPassword]: CreateMessage(Str.IncorrectPassword, `[The current password provided is incorrect.]`, false, false),\n [Str.SetGoalsDefaultIntro]: CreateMessage(Str.SetGoalsDefaultIntro, `[The following questions provide you with an opportunity to clarify your career needs and direction prior to viewing your feedback results. Understanding the current view of your role will help you see how you stand to benefit, personally and professionally from this process. When you receive your results, you can re-visit the answers, which will help you decide if you need to make changes to your career direction and needs in order to assure that you achieve your goals.]`, false, false),\n [Str.ThisMonth]: CreateMessage(Str.ThisMonth, `[This Month]`, false, false),\n [Str.ThisYear]: CreateMessage(Str.ThisYear, `[This Year]`, false, false),\n [Str.Tips]: CreateMessage(Str.Tips, `[Tips]`, false, false),\n [Str.DashInviteMsg]: CreateMessage(Str.DashInviteMsg, `[To begin receiving feedback, you will need to invite raters.]`, false, false),\n [Str.Undelivered]: CreateMessage(Str.Undelivered, `[Undelivered]`, false, false),\n [Str.DevPlanDefaultInstructions]: CreateMessage(Str.DevPlanDefaultInstructions, `[Use your feedback as a strategic planning tool for learning about yourself, your impact on others and how you can improve your skills. To begin, add your items below and the actions you will take to improve or reach your goals.]`, false, false),\n [Str.ViewReport]: CreateMessage(Str.ViewReport, `[View Report]`, false, false),\n [Str.ViewRequirements]: CreateMessage(Str.ViewRequirements, `[View requirements]`, false, false),\n [Str.ViewEdit]: CreateMessage(Str.ViewEdit, `[View/Edit]`, false, false),\n [Str.ViewEditDetails]: CreateMessage(Str.ViewEditDetails, `[View/Edit Details]`, false, false),\n [Str.ApprovalStatus5]: CreateMessage(Str.ApprovalStatus5, `[Waiting for Approval]`, false, false),\n [Str.DefaultDevPlanField1]: CreateMessage(Str.DefaultDevPlanField1, `[What action are you going to take?]`, false, false),\n [Str.DefaultGoal3]: CreateMessage(Str.DefaultGoal3, `[What are your goals and objectives for your team or organization in the coming year?]`, false, false),\n [Str.DefaultGoal1]: CreateMessage(Str.DefaultGoal1, `[What do you hope to gain from this feedback?]`, false, false),\n [Str.WhatToDevelop]: CreateMessage(Str.WhatToDevelop, `[What do you want to develop?]`, false, false),\n [Str.DefaultDevPlanField3]: CreateMessage(Str.DefaultDevPlanField3, `[What resources do you need?]`, false, false),\n [Str.DefaultGoal2]: CreateMessage(Str.DefaultGoal2, `[What situations in the past 12 months might impact the way people will answer your survey?]`, false, false),\n [Str.Yes]: CreateMessage(Str.Yes, `[Yes]`, false, false),\n [Str.DevPlanNumberEmailMsg]: CreateMessage(Str.DevPlanNumberEmailMsg, `[You are required to add {number} development items and email your plan to your {levelName}.]`, false, true),\n [Str.DevPlanNumberMsg]: CreateMessage(Str.DevPlanNumberMsg, `[You are required to add {number} development items.]`, false, true),\n [Str.InviteApprovalMsg]: CreateMessage(Str.InviteApprovalMsg, `[You are required to add a {levelName} in order to send your raters for approval.]`, false, true),\n [Str.ApproveFor]: CreateMessage(Str.ApproveFor, `[You are required to approve raters for:]`, false, false),\n [Str.DashCreateSurveyMsg]: CreateMessage(Str.DashCreateSurveyMsg, `[You are required to create a survey before sending out invites.]`, false, false),\n [Str.DevPlanEmailMsg]: CreateMessage(Str.DevPlanEmailMsg, `[You are required to email your plan to your {levelName}.]`, false, true),\n [Str.InviteApprovalMsg2]: CreateMessage(Str.InviteApprovalMsg2, `[You are required to get approval of your raters. Invites are sent upon approval.]`, false, false),\n [Str.UninvitedRatersMsg]: CreateMessage(Str.UninvitedRatersMsg, `[You have {number} uninvited rater(s).]`, false, true),\n [Str.MaxRatersMsg]: CreateMessage(Str.MaxRatersMsg, `[You have already reached the maximum number of raters for {levelName}.]`, false, true),\n [Str.NoProjects]: CreateMessage(Str.NoProjects, `[You have no current or expired projects to display at this time.]`, false, false),\n [Str.PasswordRestrictDays]: CreateMessage(Str.PasswordRestrictDays, `[You may not reuse one of the passwords set within the last {number} days]`, false, true),\n [Str.PasswordLastX]: CreateMessage(Str.PasswordLastX, `[You may not reuse your previous {number} passwords]`, false, false),\n [Str.RequiredRatersApprovalMsg]: CreateMessage(Str.RequiredRatersApprovalMsg, `[You must add the required number of raters in order to send for approval.]`, false, false),\n [Str.RequiredRatersInviteMsg]: CreateMessage(Str.RequiredRatersInviteMsg, `[You must add the required number of raters in order to send invites.]`, false, false),\n [Str.AccountLocked]: CreateMessage(Str.AccountLocked, `[Your account is locked due to multiple password attempts. Use the forgot password process to unlock your account.]`, true, false),\n [Str.AutoRemindersWarn]: CreateMessage(Str.AutoRemindersWarn, `[Your raters already receive automatic reminders.]`, false, false),\n [Str.YourSurvey]: CreateMessage(Str.YourSurvey, `[Your Survey]`, false, false),\n [Str.SurveyCreated]: CreateMessage(Str.SurveyCreated, `[Your survey is created. Edits can be made until raters are invited.]`, false, false),\n [Str.SurveyFinal]: CreateMessage(Str.SurveyFinal, `[Your survey is final.]`, false, false),\n [Str.TempPasswordSent]: CreateMessage(Str.TempPasswordSent, `[Your temporary password has been sent to your email address on file.]`, false, false),\n [Str.DashMakingProgressMsg]: CreateMessage(Str.DashMakingProgressMsg, `[You're making progress, keep it up!]`, false, false),\n [Str.Pdf]: CreateMessage(Str.Pdf, `[PDF]`, false, false),\n [Str.Type]: CreateMessage(Str.Type, `[Type]`, false, false),\n [Str.Web]: CreateMessage(Str.Web, `[Web]`, false, false),\n [Str.SsoFailure]: CreateMessage(Str.SsoFailure, `[You have encountered a single sign on error. To resolve this issue, contact your identity provider or TruScore. We are sorry for the inconvenience.]`, false, false),\n [Str.ChooseApprover]: CreateMessage(Str.ChooseApprover, `[You are required to choose an approver in order to send your raters for approval.]`, false, false),\n [Str.PlanSentTo]: CreateMessage(Str.PlanSentTo, `[Plan sent to {email}]`, false, true),\n [Str.ChooseOne]: CreateMessage(Str.ChooseOne, `[Choose one]`, false, false),\n [Str.PermissionMsg]: CreateMessage(Str.PermissionMsg, `[You currently do not have permission to access this site.]`, false, false),\n [Str.OpenQuestions]: CreateMessage(Str.OpenQuestions, `[Open Ended Questions]`, false, false),\n [Str.NoReports]: CreateMessage(Str.NoReports, `[You have no reports available at this time.]`, false, false),\n [Str.UnableToProcess]: CreateMessage(Str.UnableToProcess, `[Unable to process your request. Please try again or contact customer service.]`, false, false),\n [Str.NameRequired]: CreateMessage(Str.NameRequired, `[First and last name required.]`, false, false),\n [Str.LoadMore]: CreateMessage(Str.LoadMore, `[Load More Results.]`, false, false),\n [Str.NoApprovalParticipants]: CreateMessage(Str.NoApprovalParticipants, `[No participants currently require approval.]`, false, false),\n [Str.ApprovalSent]: CreateMessage(Str.ApprovalSent, `[Approval sent.]`, false, false),\n [Str.RatersNotProcessed]: CreateMessage(Str.RatersNotProcessed, `[{number} rater(s) were not processed. Please try again.]`, false, true),\n [Str.LoginApprovalTitle]: CreateMessage(Str.LoginApprovalTitle, `[Rater Approval Log In]`, false, false),\n [Str.LoginRecipientTitle]: CreateMessage(Str.LoginRecipientTitle, `[Report Recipient Log In]`, false, false),\n [Str.NoRaters]: CreateMessage(Str.NoRaters, `[You have no raters to approve at this time.]`, false, false),\n [Str.UnknownError]: CreateMessage(Str.UnknownError, `[Unknown error]`, false, false),\n [Str.NoResults]: CreateMessage(Str.NoResults, `[No results found.]`, false, false),\n [Str.AddApproveRater]: CreateMessage(Str.AddApproveRater, `[Add and Approve Rater]`, false, false),\n [Str.TimedOutMsg]: CreateMessage(Str.TimedOutMsg, `[Your session has expired.]`, false, false),\n [Str.TimeoutMsg]: CreateMessage(Str.TimeoutMsg, `[Your session will expire in {number} minutes due to inactivity.]`, false, true),\n [Str.Ok]: CreateMessage(Str.Ok, `[Ok]`, false, false),\n [Str.DevPlanContentExists]: CreateMessage(Str.DevPlanContentExists, `[You have content added for {name} in your development plan. Removing it will delete the content. Are you sure you want to remove it?]`, false, true),\n [Str.DevPlanNumberShareMsg]: CreateMessage(Str.DevPlanNumberShareMsg, `[You are required to add {number} development items and share your plan with your {levelName}.]`, false, true),\n [Str.DevPlanShareMsg]: CreateMessage(Str.DevPlanShareMsg, `[You are required to share your plan with your {levelName}.]`, false, true),\n [Str.InviteShare]: CreateMessage(Str.InviteShare, `[Invite to Share]`, false, false),\n [Str.UnreadCommentsMsg]: CreateMessage(Str.UnreadCommentsMsg, `[{number} Unread Comment(s)]`, false, true),\n [Str.ConfirmUnshare]: CreateMessage(Str.ConfirmUnshare, `[Are you sure you want to unshare your development plan with {email}?]`, false, true),\n [Str.ConfirmShare]: CreateMessage(Str.ConfirmShare, `[Comments will be seen by anyone that has access to your plan. Are you sure you want to share with {email}?]`, false, true),\n [Str.ViewDetails]: CreateMessage(Str.ViewDetails, `[View Details]`, false, false),\n [Str.AssessmentDetail]: CreateMessage(Str.AssessmentDetail, `[Assessment Detail]`, false, false),\n [Str.EnterName]: CreateMessage(Str.EnterName, `[Enter Name]`, false, false),\n [Str.Accepted]: CreateMessage(Str.Accepted, `[Accepted]`, false, false),\n [Str.NotAccepted]: CreateMessage(Str.NotAccepted, `[Has not accepted]`, false, false),\n [Str.UnreadComments]: CreateMessage(Str.UnreadComments, `[Unread Comments]`, false, false),\n [Str.You]: CreateMessage(Str.You, `[You]`, false, false),\n [Str.DateNotAdded]: CreateMessage(Str.DateNotAdded, `[Date not added]`, false, false),\n [Str.Comments]: CreateMessage(Str.Comments, `[Comments]`, false, false),\n [Str.Other]: CreateMessage(Str.Other, `[Other]`, false, false),\n [Str.InviteSent]: CreateMessage(Str.InviteSent, `[Invite sent to {email}]`, false, true),\n [Str.SharePlan]: CreateMessage(Str.SharePlan, `[Share Your Plan]`, false, false),\n [Str.RequireSymbol]: CreateMessage(Str.RequireSymbol, `[At least one symbol is required.]`, false, false),\n [Str.RestrictPI]: CreateMessage(Str.RestrictPI, `[Personal information may not be used in the password.]`, false, false),\n [Str.InviteApprovalMsg3]: CreateMessage(Str.InviteApprovalMsg3, `[You are required to get approval of your raters by {firstLast}. Invites are sent upon approval.]`, false, true),\n [Str.Share]: CreateMessage(Str.Share, `[Share]`, false, false),\n [Str.ShareScores]: CreateMessage(Str.ShareScores, `[Share Scores]`, false, false),\n [Str.ScoresSent]: CreateMessage(Str.ScoresSent, `[Scores sent to {email}]`, false, true),\n [Str.Generating]: CreateMessage(Str.Generating, `[Generating...]`, false, false),\n [Str.Redeliver]: CreateMessage(Str.Redeliver, `[Redeliver]`, false, false),\n [Str.EnterComment]: CreateMessage(Str.EnterComment, `[Enter comment...]`, false, false),\n [Str.EBook]: CreateMessage(Str.EBook, `[Emotional Intelligence 2.0 E-Book]`, true, false),\n [Str.EBookAvailability]: CreateMessage(Str.EBookAvailability, `[You will not be able to access your eBook until you receive your report.]`, false, false),\n [Str.ReassessmentMsg]: CreateMessage(Str.ReassessmentMsg, `[You can retake the assessment to see how you are doing compared to your previous scores]`, false, false),\n [Str.RetakeAssessment]: CreateMessage(Str.RetakeAssessment, `[Retake the Assessment]`, false, false),\n [Str.ReassessmentAreYouSure]: CreateMessage(Str.ReassessmentAreYouSure, `[Are you sure? We recommend waiting at least 3 months between taking assessments.]`, false, false),\n [Str.LoginAnnouncement]: CreateMessage(Str.LoginAnnouncement, `[]`, false, false),\n};\n","import React from 'react';\nimport { defaultMessages, DefaultMessage } from './defaultMessages';\nimport { Message } from './models';\nimport { Map } from '../language/models';\nimport { doMsgReplacements } from './module';\nimport { useAppState } from '../core/redux/hooks';\n\n\n/**\n * A React Hook for retrieving a message object from the app state translations.\n * Use this if you need information about the message like whether it contains HTML markup.\n * Use `useMsgText` if you just need the message string.\n *\n * @param str - translation key that is used to look up the appropriate translation in Redux.\n * @returns the message object if found, otherwise undefined\n */\nexport const useMsg = (str: string | number): Message | DefaultMessage | undefined => {\n const translations = useAppState(state => state.locale.translations[state.locale.lang.languageId]);\n\n return React.useMemo(\n () => (translations ?? {})[str] || defaultMessages[str],\n [str, translations],\n );\n};\n\n\n/**\n * A React Hook for reading a translated string from the app state translations\n * @param str - translation key that is used to look up the appropriate translation in Redux.\n * @param defaultMsg - allows you to specify text for when a translation isn't found (defaults to empty string)\n * @param replace - Object specifying key-values to replace in the message text\n * @returns the translation if found, otherwise the app's fallback message\n */\nexport const useMsgText = (\n str: string | number,\n defaultMsg: string = '',\n replace?: Map,\n): string => {\n const msg = useMsg(str);\n\n return React.useMemo(\n () => {\n // If we have provided a fallback message, don't let it be overridden by the app default\n const text = (!msg || (defaultMsg && (msg as DefaultMessage).isDefault)) ? defaultMsg : msg.text;\n\n return doMsgReplacements(text, replace);\n },\n [replace, defaultMsg, msg],\n );\n};\n","import React from 'react';\n\n\n/**\n * A React Hook for holding toggle state.\n * @param startToggled - whether or not the hook should initialize as toggled. Default: false\n * @returns Array where first item is the toggle state, and the second item is a function that flips the toggle state\n * when called\n */\nexport const useToggle = (startToggled: boolean | (() => boolean) = false): [boolean, () => void] => {\n const [isToggled, setIsToggled] = React.useState(startToggled);\n\n return [isToggled, () => setIsToggled(!isToggled)];\n};\n","import * as React from 'react';\nimport { useState, useMemo, useCallback, Dispatch } from 'react';\nimport * as R from 'ramda';\nimport { AddDevPlanCollaboratorModalProps, DeleteDevPlanCollaboratorModalProps, DevItemComment } from './models';\nimport { addDevPlanCollaboratorAction } from './api/addDevPlanCollaboratorAction';\nimport { useMsgText } from '../../../localization/hooks';\nimport { deleteDevPlanCollaboratorAction } from './api/deleteDevPlanCollaboratorAction';\nimport { useToggle } from '../../../core/hooks/useToggle';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { useCurrentUser } from '../../../auth/hooks';\nimport { isCurrentUserComment, isParticipantComment } from './module';\nimport { useRouteMatch } from 'react-router-dom';\nimport { ProjectRouteParams } from '../../projectRouteParams';\nimport { RouteTemplates } from '../../../navigation/routes';\nimport { ProjIds } from '../../../navigation/hooks';\nimport { Str } from '../../../localization/translationKeys';\n\n\n/**\n * Returns `true` if collaboration is enabled for the user's current project, otherwise false. Added here for\n * convenience since this setting is commonly checked in the dev plan components.\n */\nexport const useDevPlanCollaborationSetting = () => useAppState(\n state => state.projectSummary?.developmentPlanCollaborate ?? false,\n);\n\n\n/**\n * Returns the object identifying the current collaborator and the projects to which they're associated. Note that this\n * will be undefined if the current user is not accessing the portal as a dev plan collaborator.\n */\nexport const useCurrentCollaborator = () => useAppState(state => state.devPlan?.currentCollaborator);\n\n\n/**\n * Returns a translated string in the event that the comment should be labeled, otherwise undefined.\n *\n * Currently this includes the case where the comment belongs to the current portal user (i.e., if it's you!).\n *\n * @param comment - the comment to check for a caption\n */\nexport const useDevCommenterLabel = (comment: DevItemComment) => {\n const user = useCurrentUser();\n const collaborator = useCurrentCollaborator();\n\n const userEmail = useMemo(() => user?.userName, [user]);\n const collabEmail = useMemo(() => collaborator?.email, [collaborator]);\n const currentEmail = useMemo(() => userEmail || collabEmail || '', [collabEmail, userEmail]);\n\n const youCaption = useMsgText(Str.You);\n\n const fromCurrentUser = useMemo(() => isCurrentUserComment(comment, currentEmail), [comment, currentEmail]);\n const fromParticipant = useMemo(() => isParticipantComment(comment), [comment]);\n\n let response = {\n commenterLabel: fromCurrentUser ? youCaption : comment.email,\n isFromCurrentUser: fromCurrentUser,\n };\n\n if (!!userEmail && fromParticipant) {\n response = {\n commenterLabel: youCaption,\n isFromCurrentUser: true,\n };\n } else if (fromParticipant) {\n response = R.assoc(\n 'commenterLabel',\n collaborator?.currentProject.participantEmail || '',\n response,\n );\n }\n\n return response;\n};\n\n/**\n * Returns the props necessary to enable the add-collaborator confirmation modal; clicking the 'Yes' option in this\n * modal sends an API request to send an invite to the provided email address.\n *\n * State management of the email address and comment values used for the invitation are handled by the hook.\n *\n * @param projId - the database Id for the project whose dev plan the invitee is being invited to view/collaborate in\n * @param participantId - the database Id for the participant whose dev plan the invitee is being invited to\n * view/collaborate in\n * @param dispatch - the dispatch used to handle the invite/add action\n */\nexport const useAddCollaboratorModalProps = (\n projId: number,\n participantId: number,\n dispatch: Dispatch,\n): AddDevPlanCollaboratorModalProps => {\n // If collaboration is enabled, rather than immediately invite a collaborator when pressing the send-email button, we\n // raise a modal to inform the user of the data sharing ramifications. If they agree, we'll use the collected email\n // address and comment text to send the prospective collaborator an invite.\n const [collaboratorEmail, setCollaboratorEmail] = useState();\n const [collaboratorComment, setCollaboratorComment] = useState();\n\n const [modalVisible, toggleModal] = useToggle();\n\n const { addCollaboratorModalVisible, showAddCollaboratorModal, dismissAddCollaboratorModal } = useMemo(\n () => ({\n addCollaboratorModalVisible: modalVisible,\n showAddCollaboratorModal: (email: string, comment?: string) => {\n setCollaboratorEmail(email);\n setCollaboratorComment(comment ?? '');\n toggleModal();\n },\n dismissAddCollaboratorModal: () => {\n toggleModal();\n setCollaboratorEmail(undefined);\n setCollaboratorComment(undefined);\n },\n }),\n [modalVisible, toggleModal],\n );\n\n const confirmAddCollaboratorMsg = useMsgText(Str.ConfirmShare, '', { 'email': collaboratorEmail });\n\n const langId = useAppState(state => state.locale.lang.languageId);\n\n const onConfirmAddCollaborator = useCallback(\n () => {\n dispatch(\n addDevPlanCollaboratorAction(projId, participantId, collaboratorEmail ?? '', collaboratorComment ?? '', langId),\n );\n toggleModal();\n },\n [dispatch, projId, participantId, collaboratorEmail, collaboratorComment, langId, toggleModal],\n );\n\n return {\n confirmAddCollaboratorMsg,\n addCollaboratorModalVisible,\n showAddCollaboratorModal,\n dismissAddCollaboratorModal,\n onConfirmAddCollaborator,\n };\n};\n\n\n/**\n * Returns the props necessary to enable the delete-collaborator confirmation modal; clicking the 'Yes' option in this\n * modal removes access to the dev plan from the collaborator with the provided email address.\n *\n * State management of the email address provided for deletion is handled by the hook.\n *\n * @param projId - the database Id for the project whose dev plan the invitee is being removed from\n * @param participantId - the database Id for the participant whose dev plan the invitee is being removed from\n * @param dispatch - the dispatch used to handle the delete action\n */\nexport const useDeleteCollaboratorModalProps = (\n projId: number,\n participantId: number,\n dispatch: Dispatch,\n): DeleteDevPlanCollaboratorModalProps => {\n // If collaboration is enabled, rather than immediately invite a collaborator when pressing the send-email button, we\n // raise a modal to inform the user of the data sharing ramifications. If they agree, we'll use the collected email\n // address and comment text to send the prospective collaborator an invite.\n const [collaboratorEmail, setCollaboratorEmail] = useState();\n\n const [modalVisible, toggleModal] = useToggle();\n\n const { deleteCollaboratorModalVisible, showDeleteCollaboratorModal, dismissDeleteCollaboratorModal } = useMemo(\n () => ({\n deleteCollaboratorModalVisible: modalVisible,\n showDeleteCollaboratorModal: (email: string) => {\n setCollaboratorEmail(email);\n toggleModal();\n },\n dismissDeleteCollaboratorModal: () => {\n toggleModal();\n setCollaboratorEmail(undefined);\n },\n }),\n [modalVisible, toggleModal],\n );\n\n const confirmDeleteCollaboratorMsg = useMsgText(Str.ConfirmUnshare, '', { 'email': collaboratorEmail });\n\n const onConfirmDeleteCollaborator = useCallback(\n () => {\n dispatch(deleteDevPlanCollaboratorAction(projId, participantId, collaboratorEmail ?? ''));\n toggleModal();\n setCollaboratorEmail(undefined);\n },\n [collaboratorEmail, dispatch, participantId, projId, toggleModal],\n );\n\n return {\n confirmDeleteCollaboratorMsg,\n deleteCollaboratorModalVisible,\n showDeleteCollaboratorModal,\n dismissDeleteCollaboratorModal,\n onConfirmDeleteCollaborator,\n };\n};\n\n\n/**\n * A hook that returns the basic project IDs as available to collaborators:\n * * Display ID\n * * ID\n * * Participant ID\n */\nexport const useCollaborationProjIds = (): ProjIds => {\n const match = useRouteMatch(RouteTemplates.Collaborator);\n\n const routePartId = React.useMemo(() => +(match?.params.participantId ?? ''), [match]);\n const routeProjDispId = React.useMemo(() => match?.params.projectId ?? '', [match]);\n\n const statePartId = useAppState(state => state.devPlan?.currentCollaborator?.currentProject.participantId);\n const stateProjDispId = useAppState(state => state.devPlan?.currentCollaborator?.currentProject.displayProjectId);\n const projId = useAppState(state => state.devPlan?.currentCollaborator?.currentProject.projectId);\n\n return {\n projId: projId || -1,\n projDisplayId: stateProjDispId || routeProjDispId || '',\n participantId: statePartId || routePartId || -1,\n };\n};\n","import * as React from 'react';\nimport { useEffect, useRef, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { loadTranslationsAction } from './loadTranslationsAction';\nimport { portalLanguagesAction } from './portalLanguagesAction';\nimport { useMount } from '../core/hooks/useMount';\nimport { setLocaleAction } from './setLocaleAction';\nimport { getSupportedLanguage } from './module';\nimport { useAppState } from '../core/redux/hooks';\nimport { loadProjMsgsAction } from '../project/messages/loadProjMsgsAction';\nimport { useRoutes } from '../navigation/routes';\nimport { passwordRequirementMessageAction } from '../auth/accountSetup/api/passwordRequirementMessageAction';\nimport { getSelectedQuestionsAction } from '../project/createSurvey/api/getSelectedQuestionsAction';\nimport { getCompetenciesAndQuestionsAction } from '../project/createSurvey/api/getCompetenciesAndQuestionsAction';\nimport { getDevPlanItemsAction } from '../project/devPlan/api/getDevPlanItemsAction';\nimport { getDevPlanFieldsAndAnswersAction } from '../project/devPlan/devPlanAction/api/getDevPlanFieldsAndAnswersAction';\nimport { loadParticipantRequirementsAction } from '../project/requirements/loadParticipantRequirementsAction';\nimport { loadProjectsAction } from '../project/loadProjectsAction';\nimport { loadProjectSummaryAction } from '../project/loadProjectSummaryAction';\nimport { loadDevResourcesAction } from '../project/resources/loadDevResourcesAction';\nimport { loadProjectResourcesAction } from '../project/resources/loadProjectResourcesAction';\nimport { participantRatersAction } from '../project/survey/raters/participantRatersAction';\nimport { goalsAnswersAction } from '../project/setGoals/goalsAnswersAction';\nimport { raterLevelsAction } from '../project/survey/raters/raterLevelsAction';\nimport { useCurrentUser } from '../auth/hooks';\nimport { useCurrentCollaborator } from '../project/devPlan/collaboration/hooks';\nimport { allLanguagesAction } from './allLanguagesAction';\n\n\n/**\n * TranslationLoader: a component that listens for Redux locale changes and loads missing translations for newly\n * selected locales.\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst TranslationLoader: React.FC = () => {\n const dispatch = useDispatch();\n const langs = useAppState(state => state.locale.portalLanguages);\n const language = useAppState(state => state.locale.lang);\n const projectId = useAppState(state => state.projectSummary?.projectId);\n const routes = useRoutes();\n\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId);\n\n const languageId = useMemo(() => language.languageId, [language.languageId]);\n const currentUser = useCurrentUser();\n\n const currentCollaborator = useCurrentCollaborator();\n\n const participantId = useMemo(\n () => currentUser?.personId ?? currentCollaborator?.currentProject.participantId ?? 0,\n [currentCollaborator, currentUser],\n );\n\n const questions = useAppState(state => state.selectedQuestions?.[`${projectId}`] ?? []);\n const compQ = useAppState(state => state.competenciesAndQuestions?.[`${projectId}`] ?? []);\n const devItems = useAppState(state => state.devPlan?.items ?? []);\n const fieldsAnswers = useAppState(state => state.devPlan?.fieldsAnswers);\n const requirements = useAppState(state => state.participantRequirements);\n const projects = useAppState(state => state.projects);\n const project = useAppState(state => state.projectSummary);\n const devResources = useAppState(state => state.devResources);\n const custResources = useAppState(state => state.projectResources);\n const raters = useAppState(state => state.projectRaters);\n const raterLevels = useAppState(state => state.projectRaterLevels);\n const goals = useAppState(state => state.goalsAnswers);\n\n const questionsRef = useRef(questions);\n useEffect(() => { questionsRef.current = questions;}, [questions, questionsRef]);\n\n const compQRef = useRef(compQ);\n useEffect(() => { compQRef.current = compQ;}, [compQ, compQRef]);\n\n const devItemsRef = useRef(devItems);\n useEffect(() => { devItemsRef.current = devItems;}, [devItems, devItemsRef]);\n\n const fieldsAnswersRef = useRef(fieldsAnswers);\n useEffect(() => { fieldsAnswersRef.current = fieldsAnswers;}, [fieldsAnswers, fieldsAnswersRef]);\n\n const requirementsRef = useRef(requirements);\n useEffect(() => { requirementsRef.current = requirements;}, [requirements, requirementsRef]);\n\n const projectsRef = useRef(projects);\n useEffect(() => { projectsRef.current = projects;}, [projects, projectsRef]);\n\n const projectRef = useRef(project);\n useEffect(() => { projectRef.current = project;}, [project, projectRef]);\n\n const devResourcesRef = useRef(devResources);\n useEffect(() => { devResourcesRef.current = devResources;}, [devResources, devResourcesRef]);\n\n const custResourcesRef = useRef(custResources);\n useEffect(() => { custResourcesRef.current = custResources;}, [custResources, custResourcesRef]);\n\n const ratersRef = useRef(raters);\n useEffect(() => { ratersRef.current = raters;}, [raters, ratersRef]);\n\n const raterLevelsRef = useRef(raterLevels);\n useEffect(() => { raterLevelsRef.current = raterLevels;}, [raterLevels, raterLevelsRef]);\n\n const goalsRef = useRef(goals);\n useEffect(() => { goalsRef.current = goals;}, [goals, goalsRef]);\n\n // Selected Language\n useMount(() => {\n dispatch(portalLanguagesAction);\n dispatch(allLanguagesAction);\n dispatch(\n setLocaleAction(getSupportedLanguage(langs, navigator.languages || [navigator.language]), undefined),\n );\n },\n );\n\n // Messages\n useEffect(\n () => { dispatch(loadTranslationsAction(routes.Root, languageId)); },\n [dispatch, language, languageId, routes.Root],\n ); // message/portal\n\n useEffect(\n () => {\n if (projectId) {\n dispatch(loadProjMsgsAction(languageId, projectId));\n }\n },\n [dispatch, languageId, projectId],\n ); // message/project\n\n useEffect(\n () => {\n if (projectId && currentUser) { dispatch(passwordRequirementMessageAction); }\n },\n [currentUser, dispatch, language, projectId],\n ); // message/passwordRequirements\n\n\n // Queries that use language id\n useEffect(\n () => {\n if (projectId && questionsRef.current) { dispatch(getSelectedQuestionsAction(projectId, participantId)); }\n },\n [dispatch, language, projectId, participantId, questionsRef],\n ); // createsurvey/getSelectedQuestions\n\n useEffect(\n () => {\n if (projectId && currentUser && compQRef.current) { dispatch(getCompetenciesAndQuestionsAction(projectId)); }\n },\n [dispatch, language, projectId, compQRef, currentUser],\n ); // createsurvey/getCompetenciesAndQuestions\n\n useEffect(\n () => {\n if (devPlanProjectId && devItemsRef.current) { dispatch(getDevPlanItemsAction(devPlanProjectId, participantId)); }\n },\n [dispatch, language, devPlanProjectId, participantId, devItemsRef],\n ); // developmentplan/items\n\n useEffect(\n () => {\n if (devPlanProjectId && fieldsAnswersRef.current) {\n dispatch(getDevPlanFieldsAndAnswersAction(devPlanProjectId, participantId));\n }\n },\n [dispatch, language, devPlanProjectId, participantId, fieldsAnswersRef],\n ); // developmentplan/fieldsAndAnswers\n\n useEffect(\n () => {\n if (projectId && requirementsRef.current) {\n dispatch(loadParticipantRequirementsAction(projectId, participantId, languageId));\n }\n },\n [dispatch, language, projectId, participantId, languageId, requirementsRef],\n ); // participant/requirements\n\n useEffect(\n () => {\n if (projectId && projectsRef.current) { dispatch(loadProjectsAction(participantId)); }\n },\n [dispatch, language, projectId, participantId, projectsRef],\n ); // project/portalProjects\n\n useEffect(\n () => {\n if (projectId && projectRef.current) { dispatch(loadProjectSummaryAction(projectId, participantId)); }\n },\n [dispatch, language, projectId, participantId, projectRef],\n ); // project/participantProject\n\n useEffect(\n () => {\n if (projectId && devResourcesRef.current) { dispatch(loadDevResourcesAction(projectId)); }\n },\n [dispatch, language, projectId, devResourcesRef],\n ); // project/participantProject\n\n useEffect(\n () => {\n if (projectId && custResourcesRef.current) { dispatch(loadProjectResourcesAction(projectId)); }\n },\n [dispatch, language, projectId, custResourcesRef],\n ); // project/customResources\n\n useEffect(\n () => {\n if (projectId && ratersRef.current) { dispatch(participantRatersAction(projectId, participantId)); }\n },\n [dispatch, language, projectId, participantId, ratersRef],\n ); // rater/participantRaters\n\n useEffect(\n () => {\n if (projectId && raterLevelsRef.current) { dispatch(raterLevelsAction(projectId)); }\n },\n [dispatch, language, projectId, raterLevelsRef],\n ); // rater/raterLevels\n\n useEffect(\n () => {\n if (projectId && goalsRef.current) { dispatch(goalsAnswersAction(projectId, participantId, languageId)); }\n },\n [dispatch, languageId, projectId, participantId, goalsRef],\n ); // setgoals/getGoals\n\n /*\n email/inviteBodyPreview (these are in AppStateSessionStorageBridge)\n email/remindBodyPreview\n email/approverBodyPreview\n email/approvalBodyPreview\n email/templateAvailability (not used)\n */\n\n // Non-rendering component\n return null;\n};\n\nexport default TranslationLoader;\n","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { loadConfigAction } from './loadConfigAction';\nimport { loadFeatureFlagsAction } from './loadFeatureFlagsAction';\nimport { showLoginAnnouncementAction } from './showLoginAnnouncementAction';\n\n\n/**\n * ConfigLoader: a component that renders nothing and retrieves configuration/feature flags from the API onMount\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst ConfigLoader: React.FC = () => {\n const dispatch = useDispatch();\n\n React.useEffect(\n () => {\n dispatch(loadConfigAction());\n dispatch(loadFeatureFlagsAction());\n dispatch(showLoginAnnouncementAction());\n },\n [dispatch],\n );\n\n return null;\n};\n\nexport default ConfigLoader;\n","/**\n * To prevent confounding Z-indexing as more components get opinionated on their Z-position, I like to organize it all\n * in one central location. Then, you can work out the global Z-indexing from one spot.\n */\nexport const Z_INDEX = {\n /**\n * The text at the bottom-left corner that shows the web app's version e.g. `v1.0.1`\n */\n APP_VERSION: 40,\n\n MOBILE_TOOLBAR: 45,\n\n COMPETENCY_LIST: 49,\n\n SIDE_MENU: 50,\n\n ABOVE_SIDE_MENU: 55,\n\n MODAL: 100,\n\n RTL_TOGGLE: 10000,\n};\n","// Responsive layout boundaries\nimport { css } from '@emotion/core';\n\n\nexport const BREAKPOINTS_PX = {\n MOBILE_SMALL: 320,\n MOBILE_MEDIUM: 500,\n MOBILE: 768,\n};\n\nconst breakpoints = [\n BREAKPOINTS_PX.MOBILE_SMALL,\n BREAKPOINTS_PX.MOBILE_MEDIUM,\n BREAKPOINTS_PX.MOBILE,\n];\n\nexport const mq = breakpoints.map(\n bp => `@media only screen and (max-width: ${bp}px)`,\n);\n\nexport const onPhone = mq[0];\nexport const onMobileMedium = mq[1];\nexport const onMobileDevice = mq[2];\n\n\nexport const HIDE_ON_PHONE = css`\n @media only screen and (max-width: ${BREAKPOINTS_PX.MOBILE_SMALL}px) {\n display: none;\n }\n`;\n\nexport const HIDE_ON_MOBILE = css`\n @media only screen and (max-width: ${BREAKPOINTS_PX.MOBILE}px) { \n display: none;\n }\n`;\n\nexport const HIDE_ON_MOBILE_MED = css`\n @media only screen and (max-width: ${BREAKPOINTS_PX.MOBILE_MEDIUM}px) {\n display: none;\n }\n`;\n\nexport const SHOW_ON_PHONE = css`\n @media only screen and (min-width: ${BREAKPOINTS_PX.MOBILE_SMALL + 1}px) {\n display: none;\n }\n`;\n\nexport const SHOW_ON_MOBILE = css`\n @media only screen and (min-width: ${BREAKPOINTS_PX.MOBILE + 1}px) { \n display: none;\n }\n`;\n","import * as React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { TextDirection } from './textDirection';\nimport { AppState } from '../core/redux/appState';\nimport { css } from '@emotion/core';\nimport { Z_INDEX } from '../globalStyle/zIndex';\nimport { COLORS } from '../globalStyle/colors';\nimport { setLocaleAction } from './setLocaleAction';\nimport { strictEquals } from '../language/module';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\n\n\nconst styles = {\n root: css`\n position: fixed;\n z-index: ${Z_INDEX.RTL_TOGGLE};\n border-color: ${COLORS.WHITE};\n border-radius: 10px;\n background-color: ${COLORS.DARK_GREY};\n color: ${COLORS.WHITE};\n right: 10px;\n bottom: 10px;\n padding: 15px 25px;\n text-transform: uppercase;\n \n ${onMobileDevice} {\n bottom: 80px;\n }\n\n &:hover { \n background-color: ${COLORS.BLUE};\n cursor:pointer;\n }\n `,\n};\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * RtlToggle: a component that renders a position-absolute toggle for RTL/LTR at the bottom-right of the screen\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst RtlToggle: React.FC = props => {\n const dispatch = useDispatch();\n const direction = useSelector(state => state.locale.textDirection, strictEquals);\n const show = useSelector(state => !!state.featureFlags?.showDebugRtlSelector, strictEquals);\n\n const toggleRtl = () => dispatch(\n setLocaleAction(undefined, direction === TextDirection.LTR ? TextDirection.RTL : TextDirection.LTR),\n );\n\n return show\n ? (\n \n {direction}\n \n )\n : null;\n};\n\nexport default RtlToggle;\n","import { css } from '@emotion/core';\nimport { onMobileDevice } from './mediaQueries';\n\n\nexport const GLOBAL_FONTS = css`\n h1 { \n font-size: 26px;\n font-weight: normal;\n }\n \n h2 { \n font-size: 16px;\n font-weight: bold;\n }\n \n h3 { \n font-size: 13px;\n font-weight: bold;\n }\n \n h4 { \n font-size: 12px;\n font-weight: bold;\n }\n \n h5 { \n font-size: 12px;\n }\n \n body { \n font-size: 12px;\n font-family: 'Arial', 'Helvetica', sans-serif, -apple-system, BlinkMacSystemFont ;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n \n * { \n font-family: 'Arial', 'Helvetica', sans-serif, -apple-system, BlinkMacSystemFont ;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n button {\n font-size: 16px;\n }\n\n ${onMobileDevice} { \n h1 { \n font-size: 18px;\n }\n }\n`;\n","import * as React from 'react';\nimport { useSelector } from 'react-redux';\nimport { AppState } from '../core/redux/appState';\nimport { TextDirection } from './textDirection';\nimport { strictEquals } from '../language/module';\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLDivElement> {\n forceDirection?: TextDirection;\n}\n\n\n/**\n * LocalDiv: a div component that accepts all the normal div props and renders in the layout direction given by\n * the Text Direction in Redux (taken from the user's locale).\n *\n * Layout direction only changes for horizontally-arranged content. If you make your div a flex column e.g., direction\n * is unchanged by layout direction changes.\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst LocalDiv: React.FC = props => {\n // React complains if you forward unknown props to HTML elements *eye-roll*\n const { forceDirection, ...rest } = props;\n\n const layoutDirection = useSelector(\n state => state.locale.textDirection,\n strictEquals,\n );\n\n return (\n
\n );\n};\n\nexport default LocalDiv;\n","import { css } from '@emotion/core';\nimport * as React from 'react';\nimport { Z_INDEX } from '../globalStyle/zIndex';\nimport { HIDE_ON_MOBILE } from '../globalStyle/mediaQueries';\nimport { IS_DEV_ENV } from '../core/windowProps';\n\n\nconst styles = {\n version: css`\n position: fixed;\n left: 10px;\n bottom: 10px;\n font-size: 16px;\n color: #777777;\n z-index: ${Z_INDEX.APP_VERSION};\n\n // Version isn't even in the designs, so we're just going to hide it on mobile to avoid render issues.\n ${HIDE_ON_MOBILE};\n `,\n hidden: css`\n visibility: hidden;\n `,\n};\n\ntype Props = {\n className?: string;\n};\n\n/**\n * AppVersion: a component that renders the app version from package.json at the bottom-left corner of the screen.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst AppVersion: React.FC = props => (\n \n v{process.env.__VERSION__}\n \n);\n\nexport default AppVersion;\n","import * as querystring from 'querystring';\n\n\n/**\n * Parses a query string into the specified type for convenient access to the props.\n * Note that, as this method's name implies, all parameters will be parsed as string keys with string values (or with\n * value undefined, in the event that they're missing from the query string). Non-string props will not be re-cast.\n *\n * @param query\n */\nexport const parseQueryToKeyedStrings = (query: string): T => {\n // Remove leading question mark\n const scrubbed = query.startsWith('?') ? query.substr(1) : query;\n const queryObj = querystring.parse(scrubbed);\n return queryObj as typeof queryObj as T;\n};\n","import * as React from 'react';\nimport { Redirect, useLocation, Switch } from 'react-router-dom';\nimport { makeRoutes } from './routes';\nimport { parseQueryToKeyedStrings } from './module';\nimport { useSelector } from 'react-redux';\nimport { AppState } from '../core/redux/appState';\nimport { strictEquals } from '../language/module';\n\n\n/**\n * OldRouteInterceptor: a component that intercepts users coming in on old routes (routes used in the old portal app)\n * and redirects those old routes to the correct new routes.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst OldRouteInterceptor: React.FC = () => {\n const location = useLocation();\n\n const queryParams = React.useMemo(\n () => parseQueryToKeyedStrings(location.search),\n [location.search],\n );\n\n const participantId = useSelector(state => state.auth.currentUser?.personId ?? 0, strictEquals);\n\n // TODO: deal with:\n // * /RaterApproval/\n // * /ReportRecipient/\n // * login with query params\n const routes = React.useMemo(\n () => makeRoutes(`${queryParams.participantid ?? participantId}`, `${queryParams.projectid}`),\n [participantId, queryParams],\n );\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\n\nexport default OldRouteInterceptor;\n","import { BREAKPOINTS_PX } from '../globalStyle/mediaQueries';\n\n\n/**\n * Returns whether or not the given window comes from a mobile device\n */\nexport const isOnMobile = (\n win: Window,\n): boolean => win.matchMedia(`only screen and (max-width: ${BREAKPOINTS_PX.MOBILE}px)`).matches;\n","import * as React from 'react';\nimport { useEffect, useCallback } from 'react';\nimport { useAppState } from '../core/redux/hooks';\nimport { useDispatch } from 'react-redux';\nimport { TIME } from '../language/time';\nimport moment from 'moment';\nimport { showTimeoutModalAction } from '../showTimeoutModalAction';\n\n\ntype Props = {};\n\n\n/**\n * LogoutTimer: a non-rendering component that logs the user out after a certain amount of inactivity.\n */\nconst LogoutTimer: React.FC = () => {\n const dispatch = useDispatch();\n\n const timeoutMin = useAppState(state => state.config?.timeout || 0);\n const isLoggedIn = useAppState(state => !!state.auth.currentUser);\n const lastActivity = useAppState(state => state.lastActivity);\n\n const showModal = useCallback(\n () => {\n dispatch(showTimeoutModalAction(true));\n },\n [dispatch],\n );\n\n const scheduleModal = useCallback(\n (lastActive) => {\n if (timeoutMin <= 0 || !isLoggedIn) {\n return;\n }\n\n const remaining = timeoutMin - moment(lastActive).diff(new Date(), 'minutes') - 5;\n\n if (remaining <= 0) {\n return;\n }\n\n const handle = window.setTimeout(showModal, remaining * TIME.M);\n\n return () => window.clearTimeout(handle);\n },\n [timeoutMin, isLoggedIn, showModal],\n );\n\n useEffect(() => scheduleModal(lastActivity), [lastActivity, scheduleModal]);\n\n return null;\n};\n\nexport default LogoutTimer;\n","import * as React from 'react';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { css } from '@emotion/core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport { COLORS } from '../../globalStyle/colors';\n\n\nconst styles = {\n root: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n `,\n title: css`\n flex-grow: 1;\n margin: 24px;\n font-weight: normal;\n font-size: 22px;\n color: ${COLORS.DARK_GREY};\n `,\n closeButton: css`\n border-radius: 0;\n border-width: 0;\n padding: 15px 20px;\n font-size: 25px;\n background-color: transparent;\n align-self: flex-start;\n justify-self: flex-end;\n \n &:hover {\n color: ${COLORS.BLUE};\n cursor: pointer;\n }\n `,\n};\n\n\ntype Props = {\n dismissable?: boolean;\n onDismiss?: () => void;\n\n title?: string;\n\n className?: string;\n};\n\n\n/**\n * ModalHeader: a component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ModalHeader: React.FC = props => (\n \n

{props.title}

\n {\n props.dismissable && (\n \n )\n }\n
\n);\n\nModalHeader.defaultProps = {\n dismissable: true,\n};\n\nexport default ModalHeader;\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { COLORS } from '../../globalStyle/colors';\nimport { css } from '@emotion/core';\nimport { Z_INDEX } from '../../globalStyle/zIndex';\nimport { motion } from 'framer-motion';\nimport { useKeyListener } from '../../core/hooks/useKeyListener';\nimport { onPhone, onMobileDevice } from '../../globalStyle/mediaQueries';\n\n\nconst styles = {\n modalBg: css`\n position: fixed;\n z-index: ${Z_INDEX.MODAL};\n \n top: 0;\n left: 0;\n height: 100vh;\n width: 100vw;\n \n display: flex;\n align-items: center;\n justify-content: center;\n \n background-color: rgba(0, 0, 0, 0.8);\n cursor: pointer;\n opacity: 0;\n `,\n modal: css`\n cursor: default;\n overflow-x: hidden;\n overflow-y: auto;\n background-color: ${COLORS.LIGHTER_GREY};\n opacity: 0;\n \n max-height: calc(100vh - 32px);\n max-width: calc(100vw - 32px);\n min-width: 550px;\n min-height: 550px;\n \n transition: all .5s ease;\n \n ${onMobileDevice} {\n min-width: 320px;\n } \n\n ${onPhone} {\n max-width: 100vw;\n max-height: 100vh;\n min-width: 0;\n min-height: 0;\n width: 100vw;\n height: 100vh;\n }\n `,\n};\n\n\ntype Props = {\n dismissable?: boolean,\n\n onDismiss?: () => void,\n\n dismissOnClickOutside?: boolean;\n dismissOnEsc?: boolean;\n\n children: React.ReactNode | React.ReactNode[];\n className?: string;\n};\n\n\n/**\n * Modal: a component that renders its children as a modal with a dark background and intuitive close functionality.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst Modal: React.FC = props => {\n const onClickToDismissModal = React.useCallback(\n () => {\n if (props.dismissOnClickOutside && props.dismissable) {\n props.onDismiss?.();\n }\n },\n [props.onDismiss, props.dismissable, props.dismissOnClickOutside],\n );\n\n const onKeyUp = React.useCallback(\n (event: KeyboardEvent) => {\n if (props.dismissable && props.dismissOnEsc && event.key === 'Escape') {\n props.onDismiss?.();\n }\n },\n [props.onDismiss, props.dismissable, props.dismissOnEsc],\n );\n\n const stopPropagation = React.useCallback(\n (event: React.MouseEvent) => event && event.stopPropagation(),\n [],\n );\n\n useKeyListener(onKeyUp);\n\n return ReactDOM.createPortal(\n \n \n {\n props.children\n }\n \n ,\n document.body,\n );\n};\n\nModal.defaultProps = {\n dismissable: true,\n dismissOnClickOutside: true,\n dismissOnEsc: true,\n};\n\nexport default Modal;\n","import { useMount } from './useMount';\n\n\nexport const useKeyListener = (\n onKeyUp: (event: KeyboardEvent) => void,\n): void => useMount(\n () => {\n window.addEventListener('keyup', onKeyUp);\n\n return () => {\n window.removeEventListener('keyup', onKeyUp);\n };\n },\n);\n\n","import * as React from 'react';\nimport { TextDirection } from './textDirection';\nimport { useSelector } from 'react-redux';\nimport { AppState } from '../core/redux/appState';\nimport { strictEquals } from '../language/module';\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLDivElement> {\n innerHtml: string;\n forceDirection?: TextDirection;\n}\n\n\n/**\n * LocalHTML: a div component that, like the LocalDiv, exposes all the properties of a normal div but renders text\n * according to the user's locale-specific text direction.\n *\n * Unlike LocalDiv, this component wraps an entire locale-specific HTML block, as many locale strings are stored in the\n * database as such.\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst LocalHTMLContainer: React.FC = props => {\n // React complains if you forward unknown props to HTML elements *eye-roll*\n const { innerHtml, forceDirection, ...rest } = props;\n\n const layoutDirection = useSelector(\n state => state.locale.textDirection,\n strictEquals,\n );\n\n return (\n \n );\n};\n\nexport default LocalHTMLContainer;\n","import * as R from 'ramda';\n\n\n/**\n * Removes the redundant backslashes on escaped quotation marks and newline characters in translation strings returned\n * from the API.\n *\n * @param str A raw HTML string containing repeated backslashes.\n */\nexport const removeRedundantBackslashes = R.memoizeWith(\n (str: String) => `${str}-deslashed`,\n (str: string) => str\n .replace(new RegExp('\\\\\\\\\"', 'g'), '\"')\n .replace(new RegExp('\\\\\\\\n', 'g'), '\\n'),\n);\n","import * as React from 'react';\nimport { useMsg } from './hooks';\nimport LocalHTMLContainer from './LocalHTMLContainer';\nimport { removeRedundantBackslashes } from './removeRedundantBackslashes';\nimport { DefaultMessage } from './defaultMessages';\nimport { Map } from '../language/models';\nimport { doMsgReplacements } from './module';\nimport { useAppState } from '../core/redux/hooks';\n\n\ntype SpanOrDiv = Extract;\ntype SpanOrDivProps = React.DetailedHTMLProps, SpanOrDiv>;\n\n\ninterface Props extends SpanOrDivProps {\n str: string | number;\n defaultMsg?: string | number;\n replace?: Map;\n}\n\n\n/**\n * LocalMsgContainer: a component that renders a translated message as either plain text or, if it contains, markup,\n * raw HTML.\n *\n * When replacing, this component automatically adds interpolation braces to your keys\n * -- use `userName` to replace `{userName}` from the raw message text.\n *\n * Props:\n * 1. The `msgKey` prop is the key for the translated message object stored in app state.\n * 1. The `defaultMsg` prop allows the user the opportunity to pass in a default string if one is preferred over the\n * fallback string. If set to the empty string, when a translated message is missing, no component will be rendered.\n * Note that this prop is ignored if a translation exists and contains HTML markup.\n * 1. The `replace` prop is an object of `{'toReplace': 'replacement'}` key-value pairs. It's recommended that you\n * memoize this object in your component, otherwise, replacement logic will run on every render XP\n *\n * PureComponent: true\n * Connected to Redux: false\n */\nconst Msg: React.FC = props => {\n const { str, defaultMsg, replace, ...rest } = props;\n\n const msg = useMsg(props.str);\n\n const msgText = React.useMemo(\n () => doMsgReplacements(msg?.text ?? `${defaultMsg}`, replace),\n [msg, defaultMsg, replace],\n );\n\n const dir = useAppState(state => state.locale.textDirection);\n\n if ((msg as DefaultMessage)?.isDefault && defaultMsg === '') {\n return null;\n }\n\n return msg && msg.containsMarkup\n ? \n : {msgText ?? defaultMsg};\n};\n\nMsg.defaultProps = {\n defaultMsg: '',\n};\n\nexport default Msg;\n","import * as R from 'ramda';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\n\n\nexport const BTN_DISABLED = css`\n &:disabled {\n opacity: .4;\n cursor: not-allowed;\n }\n`;\n\n\nexport const BTN_HOVER = css`\n &:hover {\n background-color: ${COLORS.HOVER_GREY};\n color: ${COLORS.WHITE};\n border: 1px solid ${COLORS.HOVER_GREY};\n cursor: pointer;\n }\n`;\n\n\nexport const BTN_GENERAL = css`\n box-sizing: border-box;\n font-size: 12px;\n text-align: center;\n text-decoration: none;\n border-radius: 8px;\n line-height: 34px;\n height: 35px;\n user-select: none; /* For links parading around as buttons -- no selecting that text! */\n transition: background-color .25s ease;\n padding: 0 12px;\n white-space: nowrap;\n`;\n\n\nexport const BTN_SHIMMER = css`\n animation : shimmer 1.5s infinite;\n background-image: linear-gradient(\n 45deg,\n transparent 0%,\n transparent 40%,\n rgba(255,255,255,0.01) 45%,\n rgba(255,255,255,0.35) 50%,\n rgba(255,255,255,0.01) 60%,\n transparent 65%,\n transparent 100%\n );\n background-size: 50% 60px;\n background-repeat: no-repeat;\n\n @keyframes shimmer {\n 0% {\n background-position: -100% -10px;\n }\n 100% {\n background-position: 200% 0;\n }\n }\n`;\n\n\nexport const btnStyle = {\n /**\n * Primary button, solid background, memoized\n */\n primary: R.memoizeWith(\n (color?: string) => `${color}`,\n (color?: string) => css`\n background-color: ${color};\n border: 1px solid ${color};\n \n /* If the bg color is white, don't use white text */\n color: ${color === COLORS.WHITE ? COLORS.DARK_GREY : COLORS.WHITE};\n\n ${BTN_GENERAL};\n ${BTN_HOVER};\n ${BTN_DISABLED};\n `,\n ),\n\n /**\n * Secondary button, white background, border, memoized\n */\n secondary: R.memoizeWith(\n (color?: string) => `${color}`,\n (color?: string) => css`\n background-color: ${COLORS.WHITE};\n border: 1px solid ${color};\n color: ${color};\n\n ${BTN_GENERAL};\n ${BTN_HOVER};\n ${BTN_DISABLED};\n `,\n ),\n\n /**\n * tertiary button, white background, border, memoized\n */\n tertiary: R.memoizeWith(\n (color?: string) => `${color}`,\n (color?: string) => css`\n background-color: transparent;\n border: none;\n color: ${color};\n\n ${BTN_GENERAL};\n ${BTN_HOVER};\n ${BTN_DISABLED};\n `,\n ),\n\n /**\n * Transparent button, matching text and border, memoized\n */\n transparent: R.memoizeWith(\n (color?: string) => `${color}`,\n (color?: string) => css`\n background-color: transparent;\n border: 1px solid ${color};\n color: ${color};\n\n ${BTN_GENERAL};\n ${BTN_HOVER};\n ${BTN_DISABLED};\n `,\n ),\n\n /**\n * Use this for buttons where only the label should be visible (e.g., wherever there's an action icon in the UI)\n */\n invisible: css`\n outline: none;\n color: transparent;\n background-color: transparent;\n border: 0 none;\n padding: 0;\n `,\n};\n","import * as React from 'react';\nimport { css } from '@emotion/core';\n\n\nconst rootStyle = css`\n flex-shrink: 0;\n flex-grow: 0;\n`;\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLDivElement> {\n sizePx?: number;\n}\n\n\n/**\n * Spacer: a component that renders as empty space. Sets width/height to the same value, so your localized divs can lay\n * out correct in both LTR/RTL\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst Spacer: React.FC = props => {\n const { sizePx, ...rest } = props;\n return (\n \n );\n};\n\nSpacer.defaultProps = {\n sizePx: 20,\n};\n\nexport default Spacer;\n","import { onMobileDevice, onPhone, onMobileMedium } from '../globalStyle/mediaQueries';\nimport { css } from '@emotion/core';\n\n\nexport const FLEX_COLUMN = css`\n display: flex;\n flex-direction: column;\n`;\n\nexport const FLEX_ROW = css`\n display: flex;\n flex-direction: row;\n`;\n\n/**\n * A flex row on large screens, a flex column on tablet screens and smaller\n */\nexport const FLEX_ADAPTIVE = css`\n display: flex;\n flex-direction: row;\n \n ${onMobileDevice} {\n flex-direction: column;\n }\n`;\n\n/**\n * A flex row on large screens, a flex column on small/phone-sized screens\n */\nexport const FLEX_ADAPTIVE_PHONE = css`\n display: flex;\n flex-direction: row;\n \n ${onPhone} {\n flex-direction: column;\n }\n`;\n\n\nexport const FLEX_ADAPTIVE_MED = css`\n display: flex;\n flex-direction: row;\n\n ${onMobileMedium} {\n flex-direction: column;\n }\n`;\n\nexport const FLEX_CENTERED = css`\n align-items: center;\n justify-content: center;\n`;\n\nexport const FLEX_SPACED = css`\n align-items: center;\n justify-content: space-around;\n`;\n","import * as React from 'react';\nimport { useMsgText } from './hooks';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport Spacer from '../layout/Spacer';\nimport LocalDiv from './LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../layout/flexBox';\nimport { css, SerializedStyles } from '@emotion/core';\nimport Msg from './Msg';\n\n\nconst styles = {\n content: [\n css`\n align-items: center;\n justify-content: center;\n flex-wrap: nowrap;\n `,\n ],\n label: css`\n white-space: nowrap;\n `,\n mobileToolbarLabel: css`\n overflow-wrap: break-spaces;\n text-transform: uppercase;\n `,\n};\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLButtonElement> {\n /**\n * The translation key to lookup for the button text\n */\n str: string | number;\n\n /**\n * Fallback text to be used for the translated button text can't be found\n */\n defaultText?: string;\n\n /**\n * Optional FontAwesome icon; renders left of the button text in LTR, right in RTL\n */\n icon?: IconDefinition;\n\n /**\n * Optional styling for the font awesome icon\n */\n iconStyle?: SerializedStyles;\n\n /**\n * If true, sets custom styling used for mobile toolbar buttons (icon above label, upper-cased label, etc.)\n */\n useMobileToolbarStyling?: boolean;\n\n /**\n * Optional SVG image; renders left of the button text in LTR, right in RTL\n */\n svg?: React.ReactNode;\n}\n\n\n/**\n * LocalBtn: a button component that accepts all the normal button props and renders the button's inner text in the\n * layout direction given by the Text Direction in Redux (taken from the user's locale).\n *\n * Props:\n * 1. The `str` prop is your translation key that is used to look up the appropriate translation for the button\n * text in Redux.\n * 1. The `defaultText` prop allows you to specify button text for when a translation isn't found (defaults to empty\n * string). If this prop is not defined, a default message will be used (if one has been defined).\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst LocalBtn: React.FC = (props) => {\n // Destructure to appease React\n const { str, defaultText, icon, svg, useMobileToolbarStyling, ...rest } = props;\n\n const translation = useMsgText(str, defaultText);\n\n return (\n \n );\n};\n\nLocalBtn.defaultProps = {\n defaultText: '',\n useMobileToolbarStyling: false,\n};\n\nexport default LocalBtn;\n","export enum PortalType {\n PROJECT = 'project',\n RATER_APPROVAL = 'raterApproval',\n REPORT_RECIPIENT = 'reportRecipient',\n COLLABORATOR = 'collaborator',\n}\n","import { useMemo } from 'react';\n\n\n/**\n * List of browsers that exist in the world. E.g. Chrome/Edge/IE/FF...\n */\nexport enum BROWSER {\n IE11,\n EDGE,\n FIRE_FOX,\n CHROME,\n SAFARI,\n UNKNOWN,\n}\n\n\nexport type BrowserSetting = {\n currentBrowser: BROWSER;\n onFirefox: boolean;\n onIe: boolean;\n onEdge: boolean;\n onChrome: boolean;\n onSafari: boolean;\n};\n\n\n/**\n * Parses a user agent string to figure out which browser the user is using.\n */\nexport const parseUserAgent = (agent: string): BROWSER => {\n /* The order matters! Many browsers declare compatibility with Chrome/Safari by listing it in the user agent e.g. */\n if (agent.indexOf('Firefox') > 0) {\n return BROWSER.FIRE_FOX; // Unique\n }\n\n if (agent.indexOf('Trident/') > 0) {\n return BROWSER.IE11; // Unique\n }\n\n if (agent.indexOf('Edge/') > 0) {\n return BROWSER.EDGE; // Unique\n }\n\n if (agent.indexOf('Chrome') > 0) {\n return BROWSER.CHROME; // Very not unique\n }\n\n if (agent.indexOf('Safari') > 0) {\n return BROWSER.SAFARI; // Chrome inexplicably has Safari in its agent string\n }\n\n return BROWSER.UNKNOWN;\n};\n\n\nexport const getCurrentBrowser = (agent: string): BrowserSetting => {\n const userAgent = parseUserAgent(agent);\n\n return ({\n currentBrowser: userAgent,\n onFirefox: userAgent === BROWSER.FIRE_FOX,\n onIe: userAgent === BROWSER.IE11,\n onEdge: userAgent === BROWSER.EDGE,\n onChrome: userAgent === BROWSER.CHROME,\n onSafari: userAgent === BROWSER.SAFARI,\n });\n};\n\n\nexport const useBrowser = () => useMemo(() => getCurrentBrowser(window.navigator.userAgent), []);","import * as React from 'react';\nimport ModalHeader from './layout/modal/ModalHeader';\nimport Modal from './layout/modal/Modal';\nimport Msg from './localization/Msg';\nimport { btnStyle } from './forms/styles/button';\nimport { COLORS } from './globalStyle/colors';\nimport LocalBtn from './localization/LocalBtn';\nimport LocalDiv from './localization/LocalDiv';\nimport { FLEX_COLUMN, FLEX_ROW } from './layout/flexBox';\nimport { css } from '@emotion/core';\nimport Spacer from './layout/Spacer';\nimport { onPhone, onMobileMedium } from './globalStyle/mediaQueries';\nimport { Str } from './localization/translationKeys';\nimport { useAppState } from './core/redux/hooks';\nimport { useHistory } from 'react-router-dom';\nimport { useDispatch } from 'react-redux';\nimport { logOutAction } from './auth/login/api/logoutAction';\nimport { isOnMobile } from './language/browser';\nimport { PortalType } from './navigation/portalType';\nimport { makeRoutes } from './navigation/routes';\nimport { useMemo, useCallback, useEffect } from 'react';\nimport { showTimeoutModalAction } from './showTimeoutModalAction';\nimport { showTimedOutAction } from './showTimedOutAction';\nimport { TIME } from './language/time';\nimport { setTimedOutHandleAction } from './setTimedOutHandleAction';\nimport { useBrowser } from './language/useBrowser';\n\n\nconst styles = {\n modal: css`\n min-height: 300px;\n min-width: 300px;\n max-width: 560px;\n margin: 40px;\n ${onPhone} {\n margin: 0;\n }\n `,\n content: css`\n flex-grow: 1;\n margin: 0 20px 20px;\n `,\n msgContainer: css`\n margin: auto 90px;\n flex-grow: 1;\n justify-content: center;\n ${onMobileMedium} {\n margin: auto 40px;\n }\n ${onPhone} {\n margin-bottom: 60px;\n }\n `,\n msg: css`\n font-weight: bold;\n font-size: 18px;\n line-height: 1.5;\n `,\n btnRow: css`\n width: 100%;\n flex-grow: 0;\n margin-top: auto;\n justify-content: center;\n `,\n btn: css`\n min-height: 35px;\n min-width: 132px;\n `,\n};\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * TimeoutModal: a component that shows timeout messages\n *\n * PureComponent: true\n * Redux Connected:\n */\nconst TimeoutModal = () => {\n\n const showModal = useAppState(state => state.showTimeoutModal);\n const timedOut = useAppState(state => state.showTimedOut);\n const timedOutHandle = useAppState(state => state.timedOutHandle);\n\n const history = useHistory();\n const dispatch = useDispatch();\n\n const logoutClick = useCallback(\n () => {\n dispatch(logOutAction(isOnMobile(window)));\n timedOutHandle && window.clearTimeout(timedOutHandle);\n \n if (history.location.pathname.toLowerCase().indexOf(PortalType.RATER_APPROVAL.toLowerCase()) > -1) {\n history.replace(makeRoutes().RaterApprovalLogin);\n } else if (history.location.pathname.toLowerCase().indexOf(PortalType.REPORT_RECIPIENT.toLowerCase()) > -1) {\n history.replace(makeRoutes().ReportRecipientLogin);\n } else {\n history.replace(makeRoutes().Login);\n }\n },\n [dispatch, history, timedOutHandle],\n );\n\n const { onIe } = useBrowser();\n \n const continueClick = useCallback(\n () => {\n dispatch(showTimeoutModalAction(false));\n timedOutHandle && window.clearTimeout(timedOutHandle);\n },\n [dispatch, timedOutHandle],\n ); \n\n const dismissAction = timedOut ? logoutClick : continueClick;\n\n const setTimedOut = useCallback(\n () => {\n dispatch(showTimedOutAction(true));\n },\n [dispatch],\n ); \n \n useEffect(\n () => {\n if (showModal) {\n const handle = window.setTimeout(setTimedOut, 5 * TIME.M);\n dispatch(setTimedOutHandleAction(handle));\n }\n },\n [showModal, setTimedOut, dispatch],\n );\n\n const element = useMemo(() => \n showModal || timedOut\n ? \n \n \n
\n \n
\n \n
\n {\n timedOut\n ? \n : <>\n \n \n \n \n }\n \n \n \n : null,\n [showModal, timedOut, onIe, continueClick, logoutClick, dismissAction],\n );\n\n return element;\n};\n\nexport default TimeoutModal;\n","import * as React from 'react';\nimport { useMsgText } from '../localization/hooks';\nimport { Str } from '../localization/translationKeys';\nimport { removeRedundantBackslashes } from '../localization/removeRedundantBackslashes';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../globalStyle/colors';\nimport { useBrowser } from '../language/useBrowser';\nimport { makeRoutes } from '../navigation/routes';\nimport { FLEX_ROW, FLEX_COLUMN } from '../layout/flexBox';\n\n\ntype StatementProps = {\n className?: string;\n titleKey: string;\n bodyKey: string;\n title: string;\n srcPage: string;\n}\n\n\nconst styles = {\n parent: [\n FLEX_COLUMN,\n css`\n align-items: flex-start;\n width: 100vw;\n height: 100vh;\n overflow: hidden;\n `,\n ],\n header: [\n FLEX_ROW,\n css`\n flex-grow: 1;\n font-weight: normal;\n color: ${COLORS.DARK_GREY};\n padding: 0 8px;\n `,\n ],\n iframe: css`\n width: 100%;\n height: 100vh;\n `,\n};\n\n\n/**\n * LegalStatement: a component that renders a full-page legal statement with title.\n *\n * PureComponent: true\n * Connected to Redux: true\n */\nconst Statement: React.FC = props => {\n const header = useMsgText(props.titleKey);\n const rawContent = useMsgText(props.bodyKey);\n const body = removeRedundantBackslashes(rawContent);\n const headerElement =

{header}

;\n const { onIe } = useBrowser();\n\n return (\n
\n {headerElement}\n \n
\n );\n};\n\n\ntype Props = {\n className?: string;\n}\n\nconst routes = makeRoutes();\n\nexport const CopyrightStatement = (props: Props) => (\n \n);\n\n\nexport const PrivacyStatement = (props: Props) => (\n \n);\n","export enum ProjectStatus {\n NotStarted = 'NotStarted',\n InProgress = 'InProgress',\n Expired = 'Expired'\n}\n","import * as R from 'ramda';\nimport { ActionType } from '../redux/actionType';\nimport { getLoading, getError } from './module';\nimport { useAppState } from '../redux/hooks';\nimport { ApiError } from 'redux-api-middleware';\nimport { ApiLoading } from './apiLoading';\nimport { Map } from '../../language/models';\n\n\n/**\n * Returns the loading state from AppState for the given action type and request ID\n */\nexport const useLoading = (\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n): boolean => useAppState(state => !!getLoading(state, actionType, requestId));\n\n\n/**\n * Returns whether or not any of the given action types have a loading status in app state\n */\nexport const useAnyLoading = (\n actionTypes: ActionType[],\n): boolean => useAppState(state => R.any(action => !!getLoading(state, action), actionTypes));\n\n\n/**\n * Returns all loading states of the given action type (including those with a request Id which contains more\n * information than the action type itself).\n *\n * @param actionType - the type of actions to filter\n */\nexport const useLoadingOfType = (\n actionType: ActionType,\n): Map => {\n const loadingMap = useAppState(state => state.loading);\n return R.pickBy((value, key) => key.startsWith(actionType), loadingMap);\n};\n\n\n/**\n * Returns the error from AppState for the given action type and request ID (if an error exists)\n */\nexport const useError = (\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n): string | undefined => useAppState(state => getError(state, actionType, requestId)?.errorMsg);\n\n\n/**\n * Returns whether or not any of the given action types have an error in app state\n */\nexport const useAnyError = (\n actionTypes: ActionType[],\n): boolean => useAppState(state => R.any(action => !!getError(state, action), actionTypes));\n\n\n/**\n * Returns all error states of the given action type (including those with a request Id which contains more\n * information than the action type itself).\n *\n * @param actionType - the type of actions to filter\n */\nexport const useErrorOfType = (\n actionType: ActionType,\n): Map => {\n const errorMap = useAppState(state => state.error);\n return R.pickBy((value, key) => key.startsWith(actionType), errorMap);\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { ymcaLoginAction } from './YmcaLoginAction';\nimport { ActionType } from '../../core/redux/actionType';\nimport { Route, useLocation } from 'react-router-dom';\nimport { parseQueryToKeyedStrings } from '../../navigation/module';\nimport { useError, useLoading } from '../../core/api/hooks';\nimport { useAppState } from '../../core/redux/hooks';\nimport { useMount } from '../../core/hooks/useMount';\n\n\ntype Props = {\n className?: string;\n};\n\ntype queryProps = {\n projectid?: string;\n returnURL?: string;\n};\n\n\nconst YmcaLoginPage: React.FC = props => {\n const dispatch = useDispatch();\n\n const location = useLocation();\n const queryObj = parseQueryToKeyedStrings(location.search);\n\n const loginError = !!useError(ActionType.YmcaLoginRequest);\n const isLoggingIn = useLoading(ActionType.YmcaLoginRequest);\n const ymcaSso = useAppState(state => state.auth.ssoRedirect);\n\n useMount(() => { dispatch(ymcaLoginAction(queryObj.projectid, queryObj.returnURL)); });\n\n return (\n
\n {\n isLoggingIn && (\n
Redirecting...
\n )\n }\n {\n loginError && (\n
Error
\n )\n }\n {\n !!ymcaSso && (\n (window.location.href = ymcaSso.redirectUrl)} />\n )\n }\n
\n );\n};\n\nexport default YmcaLoginPage;\n","import React from 'react';\n\n\ntype SpinnerProps = {\n fill: string\n className?: string;\n}\n\n// Taken (with modifications) from https://github.com/fakiolinho/react-loading/blob/master/lib/svg/loading-spin.svg\nexport const Spinner = (props: SpinnerProps) => (\n \n \n \n \n \n \n);\n","import React, { FC } from 'react';\nimport { Spinner } from './Spinner';\nimport { COLORS } from '../globalStyle/colors';\n\n\ntype LoaderProps = {\n className?: string;\n color?: string;\n}\n\nexport const Loader: FC = (props: LoaderProps) => (\n
\n \n
\n);\n","import { TABLE_COLORS } from '../../globalStyle/colors';\nimport { css } from '@emotion/core';\n\n\nexport const ROW_STYLE = css`\n padding: 16px 10px;\n line-height: 22px;\n text-align: start;\n \n border-left: 1px solid ${TABLE_COLORS.BORDER};\n border-top: 1px solid ${TABLE_COLORS.BORDER};\n\n &:last-of-type {\n border-right: 1px solid ${TABLE_COLORS.BORDER};\n }\n`;\n\nexport const TABLE_STYLE = css`\n border-spacing: 0;\n width: 100%;\n font-size: 12px;\n \n thead tr {\n font-weight: bold;\n align-items: center;\n background-color: ${TABLE_COLORS.DARK_BG};\n }\n \n tbody tr {\n background-color: ${TABLE_COLORS.LIGHT_BG};\n \n &:nth-of-type(odd) {\n background-color: ${TABLE_COLORS.DARK_BG};\n }\n \n &:last-of-type {\n td {\n border-bottom: 1px solid ${TABLE_COLORS.BORDER};\n }\n }\n }\n \n th {\n ${ROW_STYLE};\n }\n \n td {\n ${ROW_STYLE};\n }\n`;\n","import { useState, useMemo } from 'react';\nimport { useMount } from './useMount';\nimport { debounce } from 'lodash';\nimport { isOnMobile } from '../../language/browser';\n\n\ninterface WindowDimensions {\n innerWidth: number;\n innerHeight: number;\n outerWidth: number;\n outerHeight: number;\n isMobile: boolean;\n}\n\n\nconst getWindowSize = (): WindowDimensions => ({\n innerWidth: window.innerWidth,\n innerHeight: window.innerHeight,\n outerWidth: window.outerWidth,\n outerHeight: window.outerHeight,\n isMobile: isOnMobile(window),\n});\n\n/**\n * useWindowSize\n *\n * A hook that provides information of the dimensions of the window\n *\n * @return {WindowDimensions} Dimensions of the window\n */\nexport const useWindowSize = (): WindowDimensions => {\n const [windowSize, setWindowSize] = useState(getWindowSize());\n\n const updateDimens = useMemo(\n () => debounce(\n () => setWindowSize(getWindowSize()),\n 500, // max 1 event per N ms\n ),\n [setWindowSize],\n );\n\n useMount(updateDimens);\n\n useMount(\n () => {\n window.addEventListener('resize', updateDimens);\n\n return () => {\n window.removeEventListener('resize', updateDimens);\n };\n },\n );\n\n return windowSize;\n};\n","import { ProjectStatus } from './projectStatus';\nimport { COLORS } from '../globalStyle/colors';\nimport { Str } from '../localization/translationKeys';\nimport { Project, Requirement } from './models';\n\n\nexport const statusToColor = (status: ProjectStatus): string => {\n switch (status) {\n case ProjectStatus.NotStarted:\n return COLORS.RED;\n\n case ProjectStatus.InProgress:\n return COLORS.GREEN;\n\n case ProjectStatus.Expired:\n return COLORS.DARK_GREY;\n }\n};\n\n\nexport const getProjectStatus = (project: Project): ProjectStatus => {\n if (project.expired) {\n return ProjectStatus.Expired;\n }\n\n if (project.statusMessageKey === Str.NotStarted) {\n return ProjectStatus.NotStarted;\n }\n\n return ProjectStatus.InProgress;\n};\n\n\n/**\n * Use this to check whether a rater of the level specified by the provided maybe requirement, can be added to the\n * project.\n *\n * @param maximumsRequired - whether the project allow only adding raters up to the maximum counts specified per\n * requirement\n * @param requirement - the requirement to check against\n * @returns true if the requirement does not exist or the maximum count for the requirement has not been met, otherwise\n * false\n */\nexport const canAddRaterForLevel = (\n maximumsRequired: boolean,\n requirement?: Requirement,\n) => !maximumsRequired\n || !requirement\n || !requirement.maximumRequired\n || (!!requirement.maximumRequired && requirement.raterCount < requirement.maximumRequired);\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { TABLE_COLORS, COLORS } from '../globalStyle/colors';\nimport LocalDiv from '../localization/LocalDiv';\nimport { Link } from 'react-router-dom';\nimport { getProjectStatus, statusToColor } from './module';\nimport { useMsgText } from '../localization/hooks';\nimport { Str } from '../localization/translationKeys';\nimport Msg from '../localization/Msg';\nimport { Project } from './models';\nimport { btnStyle } from '../forms/styles/button';\nimport { useAppState } from '../core/redux/hooks';\n\n\nconst styles = {\n root: css`\n background-color: ${TABLE_COLORS.DARK_BG};\n padding: 10px 25px;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n `,\n dataRow: css`\n display: flex;\n flex-direction: row;\n margin-bottom: 5px;\n `,\n label: css`\n font-weight: bold;\n `,\n link: css`\n display: block;\n width: 180px;\n `,\n};\n\ntype Props = {\n project: Project;\n projectRoute: string;\n className?: string;\n};\n\n\nconst renderDataPoint = (labelKey: string, labelDefault: string, value: string, color: string): React.ReactNode => (\n \n \n :\n  \n {value}\n \n);\n\n\n/**\n * ProjectCard: a component that renders a summary for a project, including a link to go view that project.\n * Mostly used on mobile.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ProjectCard: React.FC = props => {\n const selectMsg = useMsgText(Str.Select);\n const status = React.useMemo(() => getProjectStatus(props.project), [props.project]);\n const statusKey = props.project.statusMessageKey;\n const color = React.useMemo(() => statusToColor(status), [status]);\n const code = useAppState(state => state.locale.lang.code);\n\n return (\n \n {\n renderDataPoint(Str.Project, 'Project', props.project.surveyName, COLORS.BLACK)\n }\n {\n renderDataPoint(\n Str.SurveyDeadline,\n 'Survey Deadline',\n new Date(props.project.surveyDeadline).toLocaleDateString(code),\n COLORS.BLACK,\n )\n }\n \n \n :\n  \n \n \n \n {selectMsg}\n \n \n );\n};\n\nexport default ProjectCard;\n","import * as React from 'react';\nimport { Loader } from '../loading/Loader';\nimport LocalDiv from '../localization/LocalDiv';\nimport { css } from '@emotion/core';\nimport { TABLE_STYLE } from '../layout/table/style';\nimport { Link } from 'react-router-dom';\nimport { COLORS } from '../globalStyle/colors';\nimport { useWindowSize } from '../core/hooks/useWindowSize';\nimport ProjectCard from './ProjectCard';\nimport { Str } from '../localization/translationKeys';\nimport { getProjectStatus, statusToColor } from './module';\nimport { makeRoutes } from '../navigation/routes';\nimport Msg from '../localization/Msg';\nimport { Project } from './models';\nimport { useSelector } from 'react-redux';\nimport { AppState } from '../core/redux/appState';\nimport { FLEX_COLUMN, FLEX_CENTERED } from '../layout/flexBox';\nimport { btnStyle } from '../forms/styles/button';\n\n\nconst styles = {\n root: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `,\n loader: css`\n width: 150px;\n height: 150px;\n `,\n error: css`\n color: ${COLORS.WHITE};\n background-color: ${COLORS.RED};\n padding: 15px 20px;\n `,\n noProjects: css`\n text-align: center;\n `,\n // The table fills this container, so size this container to size the table\n tableWrapper: css`\n `,\n table: css`\n `,\n cells: {\n name: css`\n min-width: 310px;\n `,\n deadline: css`\n min-width: 130px;\n `,\n status: css`\n width: 125px;\n `,\n navBtn: css`\n width: 145px;\n padding: 5px !important;\n `,\n },\n link: css`\n display: block;\n margin-left: 5px;\n margin-right: 5px;\n `,\n projectCard: css`\n margin-bottom: 5px;\n `,\n};\n\n\ntype Props = {\n loading?: boolean;\n error?: boolean;\n projects: Project[] | undefined;\n className?: string;\n code: string;\n};\n\n\nconst renderEdgeCase = (props: Props): React.ReactNode => {\n if (props.loading) {\n return ;\n }\n\n if (props.error) {\n return ;\n }\n\n if (!props.projects || props.projects.length <= 0) {\n return ;\n }\n\n return null;\n};\n\n\nconst renderData = (props: Props, isMobile: boolean, participantId: number): React.ReactNode => {\n const projects = props.projects ?? [];\n\n if (isMobile) {\n return
\n {\n projects!.map(project => (\n \n ))\n }\n {\n projects.length === 0 && (\n
\n \n
\n )\n }\n
;\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n {\n projects.map(\n project => {\n const status = getProjectStatus(project);\n const statusKey = project.statusMessageKey;\n const color = statusToColor(status);\n\n return (\n \n \n \n \n \n \n );\n },\n )\n }\n {\n projects.length === 0 && (\n \n \n \n )\n }\n \n
\n \n \n \n \n \n \n
{project.surveyName}\n {new Date(project.surveyDeadline).toLocaleDateString(props.code)}\n \n \n \n \n \n \n
\n \n
\n
\n );\n};\n\n\n/**\n * ProjectTable: a component that renders the given list of projects in a navigable way. Can also render loading/error\n * state.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ProjectTable: React.FC = props => {\n const { isMobile } = useWindowSize();\n const edgeCase = renderEdgeCase(props);\n const participantId = useSelector(state => state.auth.currentUser?.personId ?? 0);\n\n return (\n
\n { // Full\n edgeCase ? edgeCase : renderData(props, isMobile, participantId)\n }\n
\n );\n};\n\nexport default ProjectTable;\n","import * as React from 'react';\nimport { useHistory, Redirect } from 'react-router-dom';\nimport Modal from '../layout/modal/Modal';\nimport ModalHeader from '../layout/modal/ModalHeader';\nimport ProjectTable from './ProjectTable';\nimport { useMsgText } from '../localization/hooks';\nimport { Str } from '../localization/translationKeys';\nimport { ActionType } from '../core/redux/actionType';\nimport { useLoading, useError } from '../core/api/hooks';\nimport { useMount } from '../core/hooks/useMount';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { loadProjectsAction } from './loadProjectsAction';\nimport { AppState } from '../core/redux/appState';\nimport { useRoutes, makeRoutes } from '../navigation/routes';\nimport { logOutAction } from '../auth/login/api/logoutAction';\nimport { useAppState } from '../core/redux/hooks';\nimport { useWindowSize } from '../core/hooks/useWindowSize';\n\n\ntype Props = {\n onDismiss?: () => void,\n className?: string;\n};\n\n\n/**\n * ProjectModal: a component that renders a modal listing the user's projects and links to those projects. The user can\n * select a link to view the dashboard for that project.\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst ProjectModal: React.FC = props => {\n const dispatch = useDispatch();\n const history = useHistory();\n\n const header = useMsgText(Str.ChooseProject);\n\n const { isMobile } = useWindowSize();\n\n const isLoading = useLoading(ActionType.LoadProjectsRequest);\n const error = useError(ActionType.LoadProjectsRequest);\n const projects = useAppState(state => state.projects);\n const project = useAppState(state => state.projectSummary);\n\n const hasProjects = !!projects?.length;\n const hasOneProject = !!projects && projects?.length === 1;\n \n const personId = useSelector(state => state.auth.currentUser?.personId!);\n const code = useAppState(state => state.locale.lang.code);\n\n useMount(() => {\n if (!projects) {\n dispatch(loadProjectsAction(personId));\n }\n });\n\n const routes = useRoutes(personId, projects?.[0]?.displayProjectId ?? '');\n\n const dismiss = React.useMemo(\n () => props.onDismiss ?? (\n hasProjects\n ? () => {\n // If we're already on an active project, and the user is dismissing the modal, just stay on the current proj\n if (project) {\n history.push(makeRoutes(personId, project.displayProjectId).Project);\n return;\n }\n\n history.replace(routes.Project);\n }\n : () => {\n dispatch(logOutAction(isMobile));\n history.replace(routes.Login);\n }\n ),\n [hasProjects, props.onDismiss, history, dispatch, routes, isMobile, personId, project],\n );\n\n return (\n hasOneProject\n ? \n : (\n \n \n \n \n )\n );\n};\n\nexport default ProjectModal;\n","import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { ymcaSsoAction } from './YmcaSsoAction';\nimport { ActionType } from '../../core/redux/actionType';\nimport { Redirect, useLocation } from 'react-router-dom';\nimport { parseQueryToKeyedStrings } from '../../navigation/module';\nimport { useRoutes } from '../../navigation/routes';\nimport { useError, useLoading } from '../../core/api/hooks';\nimport ProjectModal from '../../project/ProjectModal';\nimport { useAppState } from '../../core/redux/hooks';\nimport { useMount } from '../../core/hooks/useMount';\nimport { strictEquals } from '../../language/module';\nimport { UserInfo } from '../authState';\nimport { AppState } from '../../core/redux/appState';\n\n\ntype Props = {\n className?: string;\n};\n\ntype queryProps = {\n ticket?: string;\n projectid?: string;\n returnURL?: string;\n};\n\n\nconst YmcaSsoPage: React.FC = props => {\n const dispatch = useDispatch();\n\n const location = useLocation();\n const queryObj = parseQueryToKeyedStrings(location.search);\n\n const loginError = !!useError(ActionType.YmcaSsoRequest);\n const isLoggingIn = useLoading(ActionType.YmcaSsoRequest);\n\n const userInfo = useSelector(state => state.auth.currentUser, strictEquals);\n\n const projectId = queryObj.projectid ?? queryObj.returnURL;\n const participantId = useAppState(state => state.auth.currentUser?.personId ?? 0);\n\n const routes = useRoutes(`${userInfo?.personId ?? participantId}`, projectId);\n\n useMount(() => { dispatch(ymcaSsoAction(queryObj.ticket, queryObj.projectid, queryObj.returnURL)); });\n\n return (\n
\n {\n isLoggingIn && (\n
Redirecting...
\n )\n }\n {\n !queryObj.ticket && (\n \n )\n }\n {\n loginError && (\n \n )\n }\n {\n !!userInfo && userInfo.authenticated && (\n projectId\n ? \n : \n )\n }\n
\n );\n};\n\nexport default YmcaSsoPage;\n","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { useAppState } from '../core/redux/hooks';\nimport { useMount } from '../core/hooks/useMount';\nimport { useAnyLoading } from '../core/api/hooks';\nimport { ActionType } from '../core/redux/actionType';\nimport { useRoutes } from '../navigation/routes';\nimport * as ReactDOM from 'react-dom';\nimport { Spinner } from '../loading/Spinner';\nimport { COLORS } from '../globalStyle/colors';\nimport { css } from '@emotion/core';\nimport { Z_INDEX } from '../globalStyle/zIndex';\nimport { reportRecipientReportsAction } from './api/reportRecipientReportsAction';\nimport { reportRecipientParticipantsAction } from './api/reportRecipientParticipantsAction';\nimport { useCurrentUser } from '../auth/hooks';\nimport { reportRecipientProjectsAction } from './api/reportRecipientProjectsAction';\n\n\nconst styles = {\n root: css`\n position: fixed;\n z-index: ${Z_INDEX.MODAL};\n\n top: 0;\n left: 0;\n height: 100vh;\n width: 100vw;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n background-color: rgba(0, 0, 0, 0.8);\n cursor: pointer;\n opacity: 0;\n `,\n spinner: css`\n width: 100px;\n height: 100px;\n `,\n};\n\n\n/**\n * ReportRecipientRedirect: a component that fetches data for the report recipient flow before loading its respective\n * UI.\n *\n * Shows a loading screen while data is being retrieved.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportRecipientRedirect: React.FC = () => {\n const dispatch = useDispatch();\n const history = useHistory();\n\n const currentUser = useCurrentUser();\n const recipientId = React.useMemo(() => currentUser?.personId ?? -1, [currentUser]);\n const userName = React.useMemo(() => currentUser?.userName || '', [currentUser]);\n\n const reports = useAppState(state => state.reportRecipientReports);\n const participants = useAppState(state => state.reportRecipientParticipants);\n const projects = useAppState(state => state.reportRecipientProjects);\n const routes = useRoutes();\n\n\n useMount(() => {\n if (!reports) {\n dispatch(reportRecipientReportsAction(recipientId, userName));\n }\n if (!participants) {\n dispatch(reportRecipientParticipantsAction(recipientId));\n }\n if (!projects) {\n dispatch(reportRecipientProjectsAction(recipientId));\n }\n });\n\n const isLoading = useAnyLoading([\n ActionType.ReportRecipientReportsRequest,\n ActionType.ReportRecipientParticipantsRequest,\n ActionType.ReportRecipientProjectsRequest,\n ]);\n\n if (!!reports && !!participants && !!projects) {\n history.replace(routes.ReportRecipientDashboard);\n }\n\n return (!reports || !participants || !projects || isLoading)\n ? (\n ReactDOM.createPortal(\n
\n \n
,\n document.body,\n )\n ) : null;\n};\n\nexport default ReportRecipientRedirect;\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { useHistory } from 'react-router-dom';\nimport { useAppState } from '../../core/redux/hooks';\nimport { useDispatch } from 'react-redux';\nimport { raterApprovalParticipantsAction } from '../../raterApproval/api/raterApprovalParticipantsAction';\nimport { useMount } from '../../core/hooks/useMount';\nimport { useRoutes } from '../../navigation/routes';\nimport { useLoading } from '../../core/api/hooks';\nimport { ActionType } from '../../core/redux/actionType';\nimport { Spinner } from '../../loading/Spinner';\nimport { COLORS } from '../../globalStyle/colors';\nimport { css } from '@emotion/core';\nimport { Z_INDEX } from '../../globalStyle/zIndex';\n\n\nconst styles = {\n root: css`\n position: fixed;\n z-index: ${Z_INDEX.MODAL};\n\n top: 0;\n left: 0;\n height: 100vh;\n width: 100vw;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n background-color: rgba(0, 0, 0, 0.8);\n cursor: pointer;\n opacity: 0;\n `,\n spinner: css`\n width: 100px;\n height: 100px;\n `,\n};\n\n\n/**\n * RaterApprovalRedirect: a component that fetches data for the rater approval flow before loading its respective UI.\n *\n * Shows a loading screen while data is being retrieved.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterApprovalRedirect: React.FC = () => {\n const dispatch = useDispatch();\n const history = useHistory();\n const approverId = useAppState(state => state.auth.currentUser?.personId!);\n const participants = useAppState(state => state.raterApprovalParticipants);\n\n useMount(() => {\n if (!participants) {\n dispatch(raterApprovalParticipantsAction(approverId));\n }\n });\n\n const isLoading = useLoading(ActionType.RaterApprovalParticipantsRequest, `${approverId}`);\n\n const participant = React.useMemo(() => participants?.[0], [participants]);\n const participantId = React.useMemo(() => +(participant?.participantId ?? '-1'), [participant]);\n const projectId = React.useMemo(() => (participant?.displayProjectId ?? '-'), [participant]);\n\n const routes = useRoutes(participantId, projectId);\n\n if (!!participants) {\n history.replace(routes.RaterApprovalDashboard);\n }\n\n return (!participants || isLoading)\n ? (\n ReactDOM.createPortal(\n
\n \n
,\n document.body,\n )\n ) : null;\n};\n\nexport default RaterApprovalRedirect;","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { samlAssertionAction } from './SamlAssertionAction';\nimport { ActionType } from '../../core/redux/actionType';\nimport { Redirect, useLocation } from 'react-router-dom';\nimport { useRoutes } from '../../navigation/routes';\nimport { useError, useLoading } from '../../core/api/hooks';\nimport ProjectModal from '../../project/ProjectModal';\nimport { useAppState } from '../../core/redux/hooks';\nimport { parseQueryToKeyedStrings } from '../../navigation/module';\nimport { useMount } from '../../core/hooks/useMount';\nimport { PortalType } from '../../navigation/portalType';\nimport ReportRecipientRedirect from '../../reportRecipient/ReportRecipientRedirect';\nimport RaterApprovalRedirect from '../login/RaterApprovalRedirect';\n\n\ntype Props = {\n className?: string;\n};\n\ntype queryProps = {\n email?: string;\n redirect? : string;\n};\n\nconst SamlAssertionPage: React.FC = () => {\n const dispatch = useDispatch();\n\n const routes = useRoutes();\n const location = useLocation();\n const queryObj = parseQueryToKeyedStrings(location.search);\n const redirect = queryObj.redirect || '';\n\n const loginError = !!useError(ActionType.SamlAssertionRequest);\n const isLoggingIn = useLoading(ActionType.SamlAssertionRequest);\n\n const userInfo = useAppState(state => state.auth.currentUser);\n\n const reportRecipient = redirect.toLowerCase().indexOf(PortalType.REPORT_RECIPIENT.toLowerCase(), 0) > -1;\n const raterApproval = redirect.toLowerCase().indexOf(PortalType.RATER_APPROVAL.toLowerCase() , 0) > -1;\n\n useMount(() => { dispatch(samlAssertionAction(queryObj.email)); });\n\n return (\n
\n {\n isLoggingIn && (\n
Redirecting...
\n )\n }\n {\n loginError && (\n \n )\n }\n {\n !!userInfo && userInfo.authenticated && reportRecipient && (\n \n )\n }\n {\n !!userInfo && userInfo.authenticated && raterApproval && (\n \n )\n }\n {\n !!userInfo && userInfo.authenticated && !(reportRecipient || raterApproval) && (\n \n )\n }\n
\n );\n};\n\nexport default SamlAssertionPage;\n","import { css } from '@emotion/core';\n\n\nexport const PLAIN_GREEN_LINKS = css`\na {\n color: #73C724;\n text-decoration: none;\n font-weight: bold;\n}`;\n\nexport const PLAIN_BLUE_LINKS = css`\na {\n color: #5698D6;\n text-decoration: none;\n font-weight: bold;\n}`;\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport { useAppState } from '../core/redux/hooks';\n\nimport tbcLogo from '../assets/logo_tbc.gif';\nimport zfLogo from '../assets/logo_zf.png';\nimport hrdqLogo from '../assets/logo_hrdq.gif';\nimport talentSmartLogo from '../assets/logo_talentsmart.png';\n\n\ntype Props = {\n className?: string;\n}\n\nconst LogoBox = (props: Props) => {\n const config = useAppState(state => state.config);\n const system = (config?.system || '').toLowerCase();\n const logo = useMemo (\n () => system === 'zf'\n ? zfLogo\n : system === 'hrdq'\n ? hrdqLogo\n : system === 'talentsmart'\n ? talentSmartLogo\n : tbcLogo // always default to TBC\n ,\n [system],\n );\n \n return (\n {system}\n )\n};\n\nexport default LogoBox;\n","import * as React from 'react';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { css } from '@emotion/core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faUserCircle } from '@fortawesome/free-solid-svg-icons';\nimport Msg from '../../localization/Msg';\nimport { Str } from '../../localization/translationKeys';\nimport { useSelector } from 'react-redux';\nimport { AppState } from '../../core/redux/appState';\nimport { Map } from '../../language/models';\nimport { Message } from '../../localization/models';\n\n\ntype Props = {\n className?: string;\n isMobile: boolean;\n}\n\n\nconst styles = {\n container: css`\n font-size: 12px;\n margin: auto 0 18px !important;\n line-height: 1.4;\n text-align: center;\n `,\n icon: css`font-size: 30px;`,\n csHeader: css`\n display: block;\n font-weight: bold;\n `,\n phoneLinks: css`display: block;`,\n};\n\n\nconst LoginFooter: React.FC = props => {\n const msgs = useSelector | undefined>(\n state => state.locale.translations[`${state.locale.lang.languageId}`],\n ) || {};\n\n const customerSupport = msgs[Str.CustomerSupport];\n const customerServicePhone = msgs[Str.CustomerServicePhone];\n const footerPhoneLinks = msgs[Str.FooterPhoneLinks];\n const footerSupportSiteLink = msgs[Str.FooterSupportSiteLink];\n const footerCopyrightPrivacy = msgs[Str.FooterCopyrightPrivacy];\n\n const hasContactInfo = !!customerSupport && (\n (!!customerServicePhone && !!footerPhoneLinks) || !!footerSupportSiteLink\n );\n\n const hasCopyrightPrivacy = !!footerCopyrightPrivacy;\n\n if (!hasContactInfo && !hasCopyrightPrivacy) {\n return null;\n }\n\n return (\n \n {\n hasContactInfo && (<>

)\n }\n \n \n \n {hasCopyrightPrivacy && <>
}\n \n
\n );\n};\n\n\nexport default LoginFooter;","import * as React from 'react';\nimport { FLEX_COLUMN, FLEX_CENTERED } from '../../layout/flexBox';\nimport { PLAIN_GREEN_LINKS } from '../../forms/styles/links';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\nimport LogoBox from '../../branding/LogoBox';\nimport { Loader } from '../../loading/Loader';\nimport { motion } from 'framer-motion';\nimport { useWindowSize } from '../../core/hooks/useWindowSize';\nimport LoginFooter from './LoginFooter';\nimport { onMobileDevice } from '../../globalStyle/mediaQueries';\nimport { isNilOrEmpty } from '../../language/module';\nimport Msg from '../../localization/Msg';\nimport { Str } from '../../localization/translationKeys';\n\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n FLEX_CENTERED,\n PLAIN_GREEN_LINKS,\n css`\n color: ${COLORS.DARK_GREY};\n margin-top: 120px;\n ${onMobileDevice} {\n margin-top: 0;\n }\n `,\n ],\n content: [\n FLEX_COLUMN,\n css`\n align-items: center;\n justify-content: flex-start;\n `,\n ],\n logoContainer: [\n css`display: flex;`,\n FLEX_CENTERED,\n ],\n logo: css`padding-bottom: 18px;`,\n formContainer: css`\n margin: auto 24px;\n max-width: 312px;\n `,\n announcementMsg: css`\n text-align: left;\n margin-bottom: 30px;\n font-size: 14px;\n `,\n headerMsg: css`\n font-size: 20px;\n font-weight: bold;\n margin-bottom: 12px;\n `,\n loaderContainer: [\n FLEX_COLUMN,\n FLEX_CENTERED,\n css`\n align-items: center;\n height: 14vh;\n flex-grow: 1;\n `,\n ],\n loader: css`width: 30px;`,\n};\n\ntype Props = {\n className?: string;\n isLoading: boolean;\n headerMsg?: string;\n showAnnouncement?: boolean;\n announcementMsg?: string;\n};\n\n\n/**\n * LoginLayout: a template component that encapsulates elements common to all of the various pages which comprise the\n * login flow.\n *\n * PureComponent: true\n * Connected to Redux: false\n */\nconst LoginLayout: React.FC = props => {\n const { isMobile } = useWindowSize();\n\n const showAnnouncement = (\n !isNilOrEmpty(props.announcementMsg) && props.showAnnouncement\n );\n\n return (\n
\n
\n
\n \n
\n
\n {\n showAnnouncement && (\n
\n \n
\n )\n }\n {\n !!props.headerMsg && (\n
\n {props.headerMsg}\n
\n )\n }\n {props.children}\n
\n
\n {\n props.isLoading && (\n \n \n \n )\n }\n
\n \n
\n
\n );\n};\n\n\nexport default LoginLayout;\n","import React from 'react';\nimport LoginLayout from '../login/LoginLayout';\nimport { useMsgText } from '../../localization/hooks';\nimport { Str } from '../../localization/translationKeys';\n\n\ntype Props = {\n className?: string;\n};\n\n\nconst SsoErrorPage: React.FC = props => {\n const header = useMsgText(Str.SsoFailure);\n\n\n return (\n \n \n );\n};\n\nexport default SsoErrorPage;\n","import * as R from 'ramda';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\n\n\nexport const INPUT = R.memoizeWith(\n (\n borderColor: string = COLORS.LIGHT_GREY,\n textColor: string = COLORS.DARK_GREY,\n ) => `${borderColor}${textColor}`,\n (\n borderColor: string = COLORS.LIGHT_GREY,\n textColor: string = COLORS.DARK_GREY,\n ) => css`\n height: 35px;\n padding: 0 12px;\n color: ${textColor};\n box-sizing: border-box;\n border: 1px solid ${borderColor};\n border-radius: 8px;\n \n ::placeholder {\n color: ${COLORS.FIELD_GREY};\n }\n `,\n);\n","import { css } from '@emotion/core';\n\n\n/**\n * Apply to the form root for all of its immediate children to space themselves out vertically by 12px\n */\nexport const FORM_COLUMN = css`\n & > span {\n display: block;\n }\n & > * {\n margin-bottom: 12px;\n }\n & > *:last-child {\n margin-bottom: 0;\n }\n`;\n\n/**\n * ... or horizontally by 12px\n */\nexport const FORM_ROW = css`\n & > * {\n margin-right: 12px;\n }\n & > *:last-child {\n margin-right: 0;\n }\n`;\n","import * as React from 'react';\nimport { useAppState } from '../core/redux/hooks';\nimport { useMsgText } from './hooks';\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLInputElement> {\n /**\n * The translation key to lookup for the input's placeholder value\n */\n placeholderTranslation: string;\n\n /**\n * Fallback text to be used for the translated placeholder string can't be found\n */\n placeholderDefault?: string;\n}\n\n\n/**\n * LocalInput: an input component that accepts all the normal input props and renders all placeholder and user-entered\n * text within the component, without being overridden by the Text Direction in Redux.\n *\n * Props:\n * 1. The `placeholderTranslation` prop is your translation key that is used to look up the appropriate translation for\n * the placeholder text in Redux.\n * 1. The `placeholderDefault` prop allows you to specify placeholder text for when a translation isn't found (defaults\n * to empty string). If this prop is not defined, a default message will be used (if one has been defined).\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst LocalInput: React.FC = (props) => {\n // Destructure to appease React\n const { placeholderTranslation, placeholderDefault, ...rest } = props;\n\n const translation = useMsgText(placeholderTranslation, placeholderDefault);\n\n const dir = useAppState(state => state.locale.textDirection);\n\n return (\n \n );\n};\n\nLocalInput.defaultProps = {\n placeholderDefault: '',\n};\n\nexport default LocalInput;","import * as yup from 'yup';\n\n\nexport const loginFormValidation = yup.object().shape(\n {\n username: yup\n .string().trim()\n .email()\n .required(),\n password: yup\n .string()\n .required(),\n },\n);\n\n\nexport const forgotPasswordEmailFormValidation = yup.object().shape(\n {\n email: yup\n .string().trim()\n .email()\n .required(),\n },\n);\n\n\nexport const forgotPasswordSecurityAnswerFormValidation = (answer: string) => yup.object().shape(\n {\n answer: yup\n .string().trim()\n .matches(new RegExp(`^${answer.trim()}$`))\n .required(),\n },\n);\n\n\nexport const newPasswordFormValidation = (\n reqsNotMet: string,\n fieldsDoNotMatch: string,\n minLength?: number,\n requireSymbol?: boolean,\n) => yup.object().shape(\n {\n password: yup\n .string()\n .min(minLength ?? 8, reqsNotMet) // Minimum 8 characters unless client-specified\n .matches(requireSymbol ?? false\n ? new RegExp('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[ !\"#$%&\\'()*+,-./:;<=>?@[\\\\]^_`{|}~]).*$')\n : new RegExp('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).*$')\n , reqsNotMet)\n //TODO - does this work for all languages?\n .required(reqsNotMet),\n confirmPassword: yup\n .string()\n .oneOf([yup.ref('password'), null], fieldsDoNotMatch)\n .required(fieldsDoNotMatch),\n },\n);\n\n\nexport const updatePasswordFormValidation = (\n password: string,\n invalidPassword: string,\n reqsNotMet: string,\n fieldsDoNotMatch: string,\n minLength?: number,\n) => yup.object().shape(\n {\n currentPassword: yup\n .string()\n// TODO - may want to introduce some sort of hash strategy for password that works in javascript and C#\n .oneOf([password], invalidPassword)\n .required(invalidPassword),\n password: yup\n .string()\n .min(minLength ?? 8, reqsNotMet) // Minimum 8 characters unless client-specified\n .matches(new RegExp('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).*$'), reqsNotMet)\n .required(reqsNotMet),\n confirmPassword: yup\n .string()\n .oneOf([yup.ref('password'), null], fieldsDoNotMatch)\n .required(fieldsDoNotMatch),\n },\n);\n\n\nexport const setupSecurityQuestionFormValidation = (\n questionRequired: string,\n reqsNotMet: string,\n) => yup.object().shape(\n {\n questionId: yup\n .number()\n .positive(questionRequired)\n .required(questionRequired),\n answer: yup\n .string()\n .matches(new RegExp(/(\\S)+/), reqsNotMet)\n .required(reqsNotMet),\n },\n);","import { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\n\n\nexport const ERROR_MSG = css`\n padding: 12px;\n background-color: ${COLORS.RED};\n color: ${COLORS.WHITE};\n border-radius: 8px;\n font-size: 12px;\n`;\n","import { css } from '@emotion/core';\n\n\n/**\n * default field set style\n * Chrome adds padding and margins to fieldsets by default\n */\nexport const FIELDSET_DEFAULT = css`\n padding: 0;\n margin: 0;\n border: 0 none;\n`;","import React from 'react';\nimport { css } from '@emotion/core';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { INPUT } from '../../forms/styles/input';\nimport { btnStyle } from '../../forms/styles/button';\nimport { useFormik } from 'formik';\nimport { FORM_COLUMN } from '../../forms/styles/form';\nimport { Str } from '../../localization/translationKeys';\nimport LocalInput from '../../localization/LocalInput';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { loginFormValidation } from '../formValidations';\nimport { ERROR_MSG } from '../../forms/styles/messages';\nimport Msg from '../../localization/Msg';\nimport { FIELDSET_DEFAULT } from '../../layout/fieldSetStyle';\nimport { COLORS } from '../../globalStyle/colors';\n\n\nconst styles = {\n fieldset: FIELDSET_DEFAULT,\n form: [FLEX_COLUMN, FORM_COLUMN],\n errorMsg: [FLEX_ROW, ERROR_MSG, css`align-items: center;`],\n input: INPUT(),\n btn: btnStyle.primary(COLORS.GREEN),\n};\n\n\ntype Props = {\n className?: string;\n errorMsg: Str | string;\n onLoginAttempt: (username: string, password: string) => void;\n isLoggingIn: boolean;\n initialEmail?: string;\n initialPassword?: string;\n}\n\n\nconst LoginForm = (props: Props) => {\n const { handleSubmit, handleChange, isValid, resetForm, values } = useFormik({\n initialValues: {\n username: props.initialEmail ?? '',\n password: props.initialPassword ?? '',\n },\n onSubmit: (values) => {\n props.onLoginAttempt(values.username, values.password);\n resetForm();\n },\n validationSchema: loginFormValidation,\n validateOnChange: false,\n });\n\n return (\n
\n
\n
\n {\n (!!props.errorMsg || !isValid) && (\n
\n \n
\n )\n }\n \n \n \n \n
\n
\n );\n};\n\n\nexport default LoginForm;\n","import * as R from 'ramda';\nimport { PortalType } from '../../navigation/portalType';\n\n\ntype UserPermissions = {\n hasPortalLoginPermission: boolean;\n hasRaterApprovalLoginPermission: boolean;\n hasReportRecipientLoginPermission: boolean;\n}\n\n\n/**\n * Users can access three different portal namespaces based on their permissions. This method returns the permission\n * setting that should be checked for the namespace the user is trying to enter.\n *\n * @param pathname - the sub-path of the base app URL where this check is being run (usually formatted as `/login` or\n * `//login`)\n * @param user - the user permissions we're checking\n */\nexport const loginPermission = R.memoizeWith(\n (\n pathname: string,\n user: UserPermissions,\n ) => `${pathname}`\n + `${user.hasRaterApprovalLoginPermission}`\n + `${user.hasReportRecipientLoginPermission}`\n + `${user.hasPortalLoginPermission}`,\n (\n pathname: string,\n user: {\n hasPortalLoginPermission: boolean;\n hasRaterApprovalLoginPermission: boolean;\n hasReportRecipientLoginPermission: boolean;\n },\n ) => pathname.toLowerCase().indexOf(PortalType.RATER_APPROVAL.toLowerCase()) > -1 \n ? user.hasRaterApprovalLoginPermission\n : pathname.toLowerCase().indexOf(PortalType.REPORT_RECIPIENT.toLowerCase()) > -1\n ? user.hasReportRecipientLoginPermission\n : user.hasPortalLoginPermission,\n);\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport { useMount } from '../core/hooks/useMount';\n\n\ntype Props = {\n pathname: string;\n search?: string;\n replace?: boolean;\n}\n\n\n/**\n * ExternalRedirect: a component that redirects to a third-party web address (i.e., one not managed by the app's routing\n * mechanisms)\n */\nconst ExternalRedirect: React.FC = ({ pathname, search, replace }) => {\n const route = useMemo(\n () => {\n if (!search) {\n return pathname;\n }\n\n return `${pathname}${search}`;\n },\n [pathname, search],\n );\n\n useMount(\n () => {\n if (replace) {\n window.location.replace(route);\n } else {\n window.location.assign(route);\n }\n },\n );\n\n return null;\n};\n\nExternalRedirect.defaultProps = {\n replace: true,\n};\n\nexport default ExternalRedirect;\n","import React, { useMemo, useCallback, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { css } from '@emotion/core';\nimport LoginForm from './LoginForm';\nimport { Str } from '../../localization/translationKeys';\nimport { loginAction } from './api/loginAction';\nimport { ActionType } from '../../core/redux/actionType';\nimport LoginLayout from './LoginLayout';\nimport { Link, Redirect, useLocation } from 'react-router-dom';\nimport { useError, useLoading } from '../../core/api/hooks';\nimport Msg from '../../localization/Msg';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { parseQueryToKeyedStrings } from '../../navigation/module';\nimport { useMsgText } from '../../localization/hooks';\nimport { loginPermission } from './module';\nimport { useAppState } from '../../core/redux/hooks';\nimport { PortalType } from '../../navigation/portalType';\nimport { makeRoutes } from '../../navigation/routes';\nimport { useMount } from '../../core/hooks/useMount';\nimport { isSsoAction } from '../sso/IsSsoAction';\nimport { isNilOrEmpty } from '../../language/module';\nimport { loginTalentSmartAction } from './api/loginTalentSmartAction';\nimport { loginBXAction } from './api/loginBXAction';\nimport { setLocaleAction } from '../../localization/setLocaleAction';\nimport { TextDirection } from '../../localization/textDirection';\nimport { Language } from '../../localization/models';\nimport { authenticateCollaboratorAction } from '../../project/devPlan/collaboration/api/authenticateCollaboratorAction';\nimport { useCurrentCollaborator } from '../../project/devPlan/collaboration/hooks';\nimport ExternalRedirect from '../../navigation/ExternalRedirect';\nimport { Endpoints } from '../../core/api/endpoints';\n\n\nconst styles = {\n loginForm: css`\n padding-bottom: 30px;\n `,\n forgotPasswordLink: css`\n text-decoration: underline !important;\n `,\n entryAgreement: css`\n margin-top: 12px;\n `,\n};\n\n\ntype Props = {\n className?: string;\n forgotPasswordUrl: string;\n accountSetupUrl: string;\n postLogin: React.ReactNode;\n};\n\n\ntype UserQueryObject = {\n passkey?: string;\n email?: string;\n langid?: number;\n auth?: string;\n bx_email?: string;\n bx_uid?: string;\n bx_pid?: string;\n signout_url?: string;\n setup?: string;\n};\n\n\ntype CollaboratorQueryObject = {\n projectid?: string;\n participantid?: string;\n collaboratorid?: string;\n}\n\n\n/**\n * LoginPage: a component that renders a page from which a user can enter their username and password to log in and\n * access the dashboard for their particular user type.\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst LoginPage: React.FC = props => {\n const dispatch = useDispatch();\n\n useMount(() => { dispatch(isSsoAction()); });\n\n const location = useLocation();\n\n const portalHeader = useMsgText(Str.LoginTitle);\n const raterApprovalHeader = useMsgText(Str.LoginApprovalTitle);\n const reportRecipientHeader = useMsgText(Str.LoginRecipientTitle);\n const announcement = useMsgText(Str.LoginAnnouncement);\n\n const raterApprovalLogin = location.pathname.toLowerCase().indexOf(PortalType.RATER_APPROVAL.toLowerCase()) > -1;\n const reportRecipientLogin = location.pathname.toLowerCase().indexOf(PortalType.REPORT_RECIPIENT.toLowerCase()) > -1;\n\n const showAnnouncement = useAppState(state => state.showLoginAnnouncement)\n\n const header = (\n raterApprovalLogin\n ? raterApprovalHeader\n : reportRecipientLogin\n ? reportRecipientHeader\n : portalHeader\n );\n\n const allLangs = useAppState(state => state.locale.portalLanguages ?? {});\n\n const userQueryObj = parseQueryToKeyedStrings(location.search);\n const languageId = userQueryObj?.langid;\n const setup = (userQueryObj?.setup ?? '').toLowerCase() === 'true';\n\n useEffect(\n () => {\n if (!languageId) {\n return;\n }\n\n const language = Object.values(allLangs).find((lang: Language) => lang.languageId === +languageId);\n\n if (language && language.languageId > 0) {\n dispatch(setLocaleAction(language, language.rtl ? TextDirection.RTL : TextDirection.LTR));\n }\n },\n [allLangs, dispatch, languageId],\n );\n\n const login = useCallback(\n (username: string, password: string) => dispatch(loginAction(username, password, raterApprovalLogin)),\n [dispatch, raterApprovalLogin],\n );\n\n const loginTalentSmart = useCallback(\n (auth: string) => dispatch(loginTalentSmartAction(auth)),\n [dispatch],\n );\n\n const loginBX = useCallback(\n (email: string, projectId: string, logoutUrl: string) => dispatch(loginBXAction(email, projectId, logoutUrl)),\n [dispatch],\n );\n\n const loginError = !!useError(ActionType.LoginRequest);\n const isLoggingIn = useLoading(ActionType.LoginRequest);\n\n useEffect(\n () => {\n if (loginError) {\n return;\n }\n\n if (!isNilOrEmpty(userQueryObj.email ?? '') && !isNilOrEmpty(userQueryObj.passkey ?? '')) {\n login(userQueryObj.email ?? '', userQueryObj.passkey ?? '');\n }\n\n if (!isNilOrEmpty(userQueryObj.auth ?? '')) {\n loginTalentSmart(userQueryObj.auth ?? '');\n }\n\n const em = userQueryObj.bx_email ?? '';\n\n if (!isNilOrEmpty(em)) {\n const signout = userQueryObj.signout_url ?? '';\n const uId = userQueryObj.bx_uid ?? '';\n const pId = userQueryObj.bx_pid ?? '';\n if (!raterApprovalLogin && !reportRecipientLogin && !isNilOrEmpty(uId)) {\n loginBX(em, '', signout);\n }\n if (reportRecipientLogin && !isNilOrEmpty(pId)) {\n loginBX(em, pId, signout);\n }\n }\n },\n [\n login,\n loginBX,\n loginError,\n loginTalentSmart,\n userQueryObj.auth,\n userQueryObj.bx_email,\n userQueryObj.bx_pid,\n userQueryObj.bx_uid,\n userQueryObj.email,\n userQueryObj.passkey,\n userQueryObj.signout_url,\n raterApprovalLogin,\n reportRecipientLogin,\n ],\n );\n\n const { projectid, participantid, collaboratorid } = parseQueryToKeyedStrings(\n location.search,\n );\n\n useEffect(\n () => {\n if (!!projectid && !!participantid && !!collaboratorid) {\n dispatch(authenticateCollaboratorAction(\n projectid ?? '',\n +(participantid ?? '-1'),\n collaboratorid ?? '',\n ),\n );\n }\n },\n [collaboratorid, dispatch, participantid, projectid],\n );\n\n const collaboratorInfo = useCurrentCollaborator();\n\n const userInfo = useAppState(state => state.auth.currentUser);\n const ssoInfo = useAppState(state => state.auth.ssoRedirect);\n\n const isAuthorized = useMemo(\n () => !!userInfo && !userInfo.locked && loginPermission(location.pathname, userInfo),\n [location.pathname, userInfo],\n );\n\n const notAuthorized = useMemo(\n () => !!userInfo && !loginPermission(location.pathname, userInfo),\n [location.pathname, userInfo],\n );\n\n const errorMsg = useMemo(\n () => loginError\n ? Str.LoginFailure\n : notAuthorized\n ? Str.PermissionMsg\n : !!userInfo?.locked\n ? Str.AccountLocked\n : '',\n [loginError, notAuthorized, userInfo],\n );\n\n return (\n \n \n {\n !!ssoInfo && ssoInfo.isSso && !userInfo && (\n \n )\n }\n {\n !!collaboratorInfo && (\n \n )\n }\n {\n isAuthorized && (\n userInfo!.requirePasswordChange || (setup && userInfo!.securityQuestionId === 0)\n ? \n : props.postLogin\n )\n }\n \n \n \n \n \n \n \n );\n};\n\n\nexport default LoginPage;\n","import * as React from 'react';\nimport { useFormik } from 'formik';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { FORM_COLUMN } from '../../forms/styles/form';\nimport { btnStyle } from '../../forms/styles/button';\nimport { css } from '@emotion/core';\nimport LocalInput from '../../localization/LocalInput';\nimport { INPUT } from '../../forms/styles/input';\nimport LocalBtn from '../../localization/LocalBtn';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { Str } from '../../localization/translationKeys';\nimport { forgotPasswordEmailFormValidation } from '../formValidations';\nimport { ERROR_MSG } from '../../forms/styles/messages';\nimport Msg from '../../localization/Msg';\nimport { FIELDSET_DEFAULT } from '../../layout/fieldSetStyle';\nimport { COLORS } from '../../globalStyle/colors';\n\n\nconst styles = {\n header: css`margin-bottom: 16px;`,\n fieldset: FIELDSET_DEFAULT,\n form: [FLEX_COLUMN, FORM_COLUMN],\n errorMsg: [FLEX_ROW, ERROR_MSG, css`align-items: center;`],\n input: INPUT(),\n btn: btnStyle.primary(COLORS.GREEN),\n};\n\n\ntype Props = {\n className?: string;\n getSecurityQuestion: (emailAddress: string) => void;\n setEmailAddress: (emailAddress: string) => void;\n emailAddressNotFound: boolean;\n isLoading: boolean;\n};\n\n\n/**\n * ForgotPasswordEmailForm: a component which provides a form for users to submit their email address to retrieve the\n * associated security question and initiate the process to request a password reset link.\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst ForgotPasswordEmailForm: React.FC = props => {\n\n const { handleSubmit, handleChange, isValid, values } = useFormik({\n initialValues: {\n email: '',\n },\n onSubmit: (values) => {\n props.getSecurityQuestion(values.email.trim());\n props.setEmailAddress(values.email.trim());\n },\n validationSchema: forgotPasswordEmailFormValidation,\n validateOnChange: false,\n });\n\n return (\n
\n \n \n \n
\n
\n {\n (props.emailAddressNotFound || !isValid) && (\n
\n \n
\n )\n }\n \n \n \n
\n
\n );\n};\n\nexport default ForgotPasswordEmailForm;\n","import * as React from 'react';\nimport { useFormik } from 'formik';\nimport { css } from '@emotion/core';\nimport { Str } from '../../localization/translationKeys';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport { FORM_COLUMN } from '../../forms/styles/form';\nimport { btnStyle } from '../../forms/styles/button';\nimport LocalInput from '../../localization/LocalInput';\nimport { INPUT } from '../../forms/styles/input';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { forgotPasswordSecurityAnswerFormValidation } from '../formValidations';\nimport { ERROR_MSG } from '../../forms/styles/messages';\nimport Msg from '../../localization/Msg';\nimport { FIELDSET_DEFAULT } from '../../layout/fieldSetStyle';\nimport { COLORS } from '../../globalStyle/colors';\nimport { useAppState } from '../../core/redux/hooks';\n\n\nconst styles = {\n header: css`margin-bottom: 16px;`,\n fieldset: FIELDSET_DEFAULT,\n form: [FLEX_COLUMN, FORM_COLUMN],\n errorMsg: [FLEX_ROW, ERROR_MSG, css`align-items: center;`],\n input: INPUT(),\n btn: btnStyle.primary(COLORS.GREEN),\n};\n\n\ninterface Props {\n className?: string;\n emailAddress: string;\n question: string;\n answer: string;\n sendPasswordResetEmailRequest: (email: string) => void;\n incorrectSecurityAnswer: boolean;\n isLoading: boolean;\n}\n\n\n/**\n * ForgotPasswordSecurityAnswerForm: a component that provides a form for the user to provide the answer to their\n * security question in support of their identity. If answered correctly, the app will send a request to the API to have\n * a password reset link emailed to the user.\n *\n * PureComponent: true\n * Connected to Redux: true\n */\n// TODO: compare hashed form answer rather than plaintext once returning the hashed answer is implemented in API\nconst ForgotPasswordSecurityAnswerForm: React.FC = props => {\n const { handleSubmit, handleChange, isValid, values } = useFormik({\n initialValues: {\n answer: '',\n },\n onSubmit: () => props.sendPasswordResetEmailRequest(props.emailAddress),\n validationSchema: forgotPasswordSecurityAnswerFormValidation(props.answer),\n validateOnChange: false,\n });\n\n const dir = useAppState(state => state.locale.textDirection);\n\n return (\n
\n \n

{props.question}

\n
\n
\n {\n (props.incorrectSecurityAnswer || !isValid) && (\n
\n \n
\n )\n }\n \n \n \n
\n
\n );\n};\n\nexport default ForgotPasswordSecurityAnswerForm;\n","import * as React from 'react';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { css } from '@emotion/core';\nimport { Str } from '../../localization/translationKeys';\nimport { FORM_COLUMN } from '../../forms/styles/form';\nimport { btnStyle } from '../../forms/styles/button';\nimport Msg from '../../localization/Msg';\nimport { COLORS } from '../../globalStyle/colors';\nimport { Link, useHistory } from 'react-router-dom';\nimport { useRef } from 'react';\nimport { useMount } from '../../core/hooks/useMount';\n\n\nconst styles = {\n header: [FLEX_ROW, css`margin-bottom: 16px;`],\n form: [FLEX_COLUMN, FORM_COLUMN],\n btn: [btnStyle.primary(COLORS.GREEN), css`display: block;`],\n link: [css`color:${COLORS.WHITE};`],\n};\n\n\ntype Props = {\n className?: string;\n loginUrl: string;\n};\n\nconst ForgotPasswordSuccessForm: React.FC = props => {\n const history = useHistory();\n\n const handleKeyPress = React.useCallback((e) => {\n if(e.charCode===13){\n //window.location.href = props.loginUrl;\n history.push(props.loginUrl);\n }\n },\n [props.loginUrl, history],\n );\n\n const linkRef = useRef(null);\n\n useMount(() => linkRef.current?.focus() );\n\n return (\n
handleKeyPress(e)}>\n \n \n \n \n
\n );\n};\n\n\nexport default ForgotPasswordSuccessForm;\n","import * as React from 'react';\n\n\n/**\n * When your diff function changes outputs, this hook holds on to that value until you reset it.\n * Make sure your diff function handles the case where `prev` is undefined -- that's how this hook's value is initialized\n * When calling reset, you can reset to any value you want, which will be maintained until the diff function returns a\n * new value that doesn't match.\n *\n * Useful for cases like API loading where you want to track when a call has completed successfully.\n * @code\n * ```\n * const [loaded] = useStickyDiff(\n * (prev, next) => prev?.loading !== next.loading && next.results,\n * {loading, results},\n * false,\n * );\n * ```\n * @returns [value, resetFunc]\n */\nexport const useStickyDiff = (\n diffFn: (prevProps: TIn | undefined, nextProps: TIn) => TOut,\n input: TIn,\n startingValue: TOut | undefined = undefined,\n): [TOut | undefined, (newValue: TOut) => void] => {\n const hasChanged = React.useRef(false);\n const prevInput = React.useRef(undefined);\n const returnVal = React.useRef(startingValue);\n\n React.useEffect(\n () => {\n const newOut = diffFn(prevInput.current, input);\n prevInput.current = input;\n\n // If this is the first change, keep the results\n if (!hasChanged.current && returnVal.current !== newOut) {\n returnVal.current = newOut;\n hasChanged.current = true;\n }\n },\n [input, diffFn, hasChanged, prevInput, returnVal],\n );\n\n const setState = React.useCallback(\n (newValue: TOut): TOut => {\n hasChanged.current = false;\n return returnVal.current = newValue;\n },\n [returnVal, hasChanged],\n );\n\n return [returnVal.current, setState];\n};\n\n","import { useStickyDiff } from './useStickyDiff';\nimport { useLoading, useError } from '../api/hooks';\nimport { ActionType } from '../redux/actionType';\nimport { useToggle } from './useToggle';\n\n\n/**\n * Use this to set a toggle that fires whenever the specified action returns with success status.\n *\n * @param actionType - the type of action to trigger the callback\n * @param requestId - the request Id (if any) of the specific action which should trigger the callback\n */\nexport const useToggleOnSuccess = (\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n): [boolean, () => void] => {\n const [value, setValue] = useToggle();\n const isLoading = useLoading(actionType, requestId);\n const hasError = !!useError(actionType, requestId);\n\n useStickyDiff(\n (prev, next) => !!prev?.isLoading && !next.isLoading && !next.hasError && setValue(),\n {\n isLoading: isLoading,\n hasError: hasError,\n },\n );\n\n return [value, setValue];\n};\n","import * as React from 'react';\nimport { useState, useMemo, useCallback, useEffect } from 'react';\nimport * as R from 'ramda';\nimport { useDispatch } from 'react-redux';\nimport LoginLayout from '../login/LoginLayout';\nimport { securityQuestionAction } from './api/securityQuestionAction';\nimport ForgotPasswordEmailForm from './ForgotPasswordEmailForm';\nimport { SecurityQuestionKey } from '../securityQuestion/models';\nimport { ActionType } from '../../core/redux/actionType';\nimport ForgotPasswordSecurityAnswerForm from './ForgotPasswordSecurityAnswerForm';\nimport { FLEX_ROW } from '../../layout/flexBox';\nimport { css } from '@emotion/core';\nimport { Str } from '../../localization/translationKeys';\nimport { useLoading, useError } from '../../core/api/hooks';\nimport { useMsgText } from '../../localization/hooks';\nimport ForgotPasswordSuccessForm from './ForgotPasswordSuccessForm';\nimport { useMount } from '../../core/hooks/useMount';\nimport { securityQuestionKeysAction } from './api/securityQuestionKeysAction';\nimport Msg from '../../localization/Msg';\nimport { useToggleOnSuccess } from '../../core/hooks/useToggleOnSuccess';\nimport { useAppState } from '../../core/redux/hooks';\nimport { parseQueryToKeyedStrings } from '../../navigation/module';\nimport { setLocaleAction } from '../../localization/setLocaleAction';\nimport { Language } from '../../localization/models';\nimport { TextDirection } from '../../localization/textDirection';\nimport { useLocation } from 'react-router-dom';\n\n\nconst styles = {\n header: [FLEX_ROW, css`min-height: 35px; font-size: 18px; font-weight: bold;`],\n};\n\n\ntype Props = {\n className?: string;\n loginUrl: string;\n requestActionType: ActionType;\n requestPasswordResetEmail: (email: string, languageId: number) => void;\n};\n\ntype UserQueryObject = {\n langid?: number;\n};\n\n/**\n * ForgotPasswordPage: a component that allows users to request a reset link for their TruScore account password by\n * submitting their account email address to retrieve the security question they submitted on account creation and\n * answering their security question correctly.\n *\n * Upon successfully answering their security question, users are notified that an email containing the reset link has\n * been sent.\n *\n * PureComponent: true\n * Connected to Redux: true\n */\nconst ForgotPasswordPage: React.FC = props => {\n const [emailAddress, setEmailAddress] = useState('');\n const dispatch = useDispatch();\n\n useMount(() => { dispatch(securityQuestionKeysAction); });\n\n const pwResetInfo = useAppState(state => state.auth.passwordReset);\n const securityQuestionKeys = useAppState(state => state.auth.securityQuestionKeys ?? []);\n const stateLangId = useAppState(state => state.locale.lang.languageId);\n\n // check if there is a langid on the query string\n const location = useLocation();\n const userQueryObj = parseQueryToKeyedStrings(location.search);\n const allLangs = useAppState(state => state.locale.portalLanguages ?? {});\n\n const paramLangId = userQueryObj?.langid;\n\n useEffect(\n () => {\n if (paramLangId) {\n const language = Object.values(allLangs).find((lang: Language) => lang.languageId === +paramLangId);\n\n if (language && language.languageId > 0) {\n dispatch(setLocaleAction(language, language.rtl ? TextDirection.RTL : TextDirection.LTR));\n }\n }\n },\n [allLangs, dispatch, paramLangId],\n );\n\n const languageId = paramLangId ?? stateLangId;\n\n const getSecurityQuestion = useCallback(\n (emailAddress: string) => dispatch(securityQuestionAction(emailAddress)),\n [dispatch],\n );\n\n const sendPasswordResetEmailRequest = useCallback(\n (email: string) => dispatch(props.requestPasswordResetEmail(email, languageId)),\n [dispatch, languageId, props],\n );\n\n const awaitingSecurityQuestion = useLoading(ActionType.SecurityQuestionRequest);\n const emailAddressNotFound = !!useError(ActionType.SecurityQuestionRequest);\n\n const resetRequestMetaTag = useMemo(() => `${emailAddress}-${languageId}`, [emailAddress, languageId]);\n\n const awaitingEmailRequestResult = useLoading(props.requestActionType, resetRequestMetaTag);\n const errorRequestingEmail = !!useError(props.requestActionType, resetRequestMetaTag);\n\n const [requestSubmitted] = useToggleOnSuccess(props.requestActionType, resetRequestMetaTag);\n\n const securityQuestionKey = useMemo(\n () => R.find(\n R.propEq<'questionId', number | undefined>('questionId', pwResetInfo?.securityQuestionId),\n securityQuestionKeys,\n ),\n [pwResetInfo, securityQuestionKeys],\n );\n\n const securityQuestion = useMsgText(securityQuestionKey?.key || '');\n\n const enteringEmail = !requestSubmitted && !securityQuestion;\n const answeringSecurityQuestion = !requestSubmitted && !!securityQuestion;\n const forgotPasswordSuccess = !answeringSecurityQuestion && !enteringEmail;\n\n return (\n \n \n {\n enteringEmail && (\n \n )\n }\n {\n answeringSecurityQuestion && (\n \n )\n }\n {\n forgotPasswordSuccess && (\n \n )\n }\n \n );\n};\n\nexport default ForgotPasswordPage;\n","import { onMobileDevice } from '../globalStyle/mediaQueries';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../globalStyle/colors';\n\n\n/**\n * The standard, responsive page padding\n */\nexport const PAGE_PADDING = css`\n padding: 60px 50px;\n \n ${onMobileDevice} {\n padding: 48px 0 0;\n }\n`;\n\n\n/**\n * Page should fill viewport height at a minimum\n */\nexport const PAGE_HEIGHT = css`\n min-height: 100vh;\n`;\n\n\n/**\n * Page should have a fabulous background color\n */\nexport const PAGE_BG = css`\n background-color: ${COLORS.PAGE_BG};\n`;\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport { Redirect, Route, RouteComponentProps, RouteProps } from 'react-router-dom';\nimport { useCurrentUser } from './hooks';\nimport { useRoutes, Routes } from '../navigation/routes';\nimport { PortalType } from '../navigation/portalType';\nimport { useAppState } from '../core/redux/hooks';\nimport { Spinner } from '../loading/Spinner';\nimport { COLORS } from '../globalStyle/colors';\nimport { css } from '@emotion/core';\nimport { PAGE_BG, PAGE_HEIGHT } from '../layout/pageStyle';\nimport { FLEX_COLUMN, FLEX_CENTERED } from '../layout/flexBox';\n\n\nconst styles = {\n spinner: css`\n width: 100px;\n height: 100px;\n `,\n};\n\n\ninterface Props extends RouteProps {\n component: React.ComponentType> | React.ComponentType;\n path: string;\n}\n\n\nconst loginUrlFor = (pathName: string, routes: Routes) => {\n if (pathName.toLowerCase().indexOf(PortalType.RATER_APPROVAL.toLowerCase()) > -1) {\n return routes.RaterApprovalLogin;\n }\n if (pathName.toLowerCase().indexOf(PortalType.REPORT_RECIPIENT.toLowerCase()) > -1) {\n return routes.ReportRecipientLogin;\n }\n return routes.Login;\n};\n\n\n/**\n * ProtectedRoute: a component that acts like a normal react-router Route, but checks if the user is logged in before\n * routing. If the user is not logged in, the user is redirected to the Login Page\n */\nconst ProtectedRoute: React.FC = props => {\n const isLoggedIn = useCurrentUser();\n const routes = useRoutes();\n\n const sessionStorageLoaded = useAppState(state => state.sessionStorageLoaded);\n\n const { component, ...rest } = props;\n\n const renderFunc = useCallback(\n (routeProps: any) => isLoggedIn\n ? \n : ,\n // Eslint apparently doesn't see JSX tags as a usage...\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isLoggedIn, props.component],\n );\n\n return sessionStorageLoaded\n ? \n : (\n
\n \n
\n );\n};\n\nexport default ProtectedRoute;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { FORM_COLUMN } from '../../forms/styles/form';\nimport { ERROR_MSG } from '../../forms/styles/messages';\nimport LocalInput from '../../localization/LocalInput';\nimport { INPUT } from '../../forms/styles/input';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { btnStyle } from '../../forms/styles/button';\nimport { useFormik } from 'formik';\nimport { newPasswordFormValidation } from '../formValidations';\nimport { useMsgText } from '../../localization/hooks';\nimport { Str } from '../../localization/translationKeys';\nimport { COLORS } from '../../globalStyle/colors';\n\n\ntype Props = {\n className?: string;\n minPwLength?: number;\n requireSymbol?: boolean;\n serverSideValidationError: boolean;\n isLoading: boolean;\n createPassword: (password: string) => void;\n pwRequirements?: string;\n};\n\n\n/**\n * NewPasswordForm: a component that provides the user with a form in which to enter:\n *\n * * a new password\n * * a re-iteration of the first form's value, confirming their new password\n *\n * The form will only send the reset request once both input values match and the supplied value satisfies the portal's\n * password strength requirements.\n *\n * PureComponent: true\n * Connected to Redux: true\n */\nconst NewPasswordForm: React.FC = props => {\n const pwReqsNotMet = useMsgText(Str.PasswordFailsRequirements);\n const pwsDoNotMatch = useMsgText(Str.PasswordMismatch);\n\n const { handleSubmit, handleChange, isValid, errors, values } = useFormik({\n initialValues: {\n password: '',\n confirmPassword: '',\n },\n onSubmit: (values) => {\n props.createPassword(values.password);\n },\n validationSchema: newPasswordFormValidation(pwReqsNotMet, pwsDoNotMatch, props.minPwLength, props.requireSymbol),\n validateOnChange: false,\n });\n\n return (\n \n \n {props.pwRequirements}\n
\n \n \n {\n (props.serverSideValidationError || !isValid) && (\n \n {\n props.serverSideValidationError\n ? `${pwReqsNotMet}`\n : `${errors.password ?? errors.confirmPassword}`\n }\n
\n )\n }\n \n \n \n \n \n \n );\n};\n\n\nexport default NewPasswordForm;\n","import { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\nimport arrow from '../../assets/triangle-down.svg';\n\n\nexport const SELECT_GENERAL = css`\n height: 35px;\n border: 1px solid ${COLORS.LIGHT_GREY};\n color: ${COLORS.DARK_GREY};\n border-radius: 8px;\n padding: 0 12px;\n \n &:hover { \n cursor: pointer;\n }\n\n & > option {\n color: ${COLORS.DARK_GREY};\n }\n\n &:invalid {\n color: ${COLORS.FIELD_GREY};\n }\n \n &:disabled {\n cursor: not-allowed;\n } \n`;\n\nexport const SELECT_ARROW = css`\n appearance: none;\n background-image: url(${arrow});\n background-repeat: no-repeat;\n \n &[dir=\"ltr\"] {\n padding-right: 30px;\n background-position: right 12px center;\n }\n \n &[dir=\"rtl\"] {\n padding-left: 30px;\n background-position: left 12px center;\n }\n\n &::-ms-expand {\n display: none;\n }\n`;\n\nexport const SELECT = css`\n ${SELECT_GENERAL};\n ${SELECT_ARROW};\n`;\n","import * as React from 'react';\nimport { DetailedHTMLProps } from 'react';\nimport { useMsgText } from './hooks';\n\n\ninterface Props extends DetailedHTMLProps, HTMLOptionElement> {\n labelKey: string;\n labelText?: string;\n}\n\n\n/**\n * LocalDropdownOption: a component that renders an option element for a select box, with translated content.\n *\n * PureComponent: true\n * Connected to Redux: true\n */\nconst LocalDropdownOption: React.FC = props => {\n const { labelKey, labelText, ...rest } = props;\n\n const label = useMsgText(labelKey, labelText);\n\n return (\n /*\n * Support for the `label` attribute on options has landed in Firefox in time for v77, meaning we should\n * be able to drop the nested values in early June 2020\n * See https://bugzilla.mozilla.org/show_bug.cgi?id=40545\n */\n \n );\n};\n\n\nexport default LocalDropdownOption;\n","import * as React from 'react';\nimport { TextDirection } from './textDirection';\nimport { useSelector } from 'react-redux';\nimport { AppState } from '../core/redux/appState';\nimport { strictEquals } from '../language/module';\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLSelectElement> {\n forceDirection?: TextDirection;\n}\n\n/**\n * LocalSelect: a component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst LocalSelect: React.FC = props => {\n const { forceDirection, ...rest } = props;\n\n const layoutDirection = useSelector(\n state => state.locale.textDirection,\n strictEquals,\n );\n\n return(\n \n );\n};\n\nexport default LocalSelect;","import * as React from 'react';\nimport { useMemo } from 'react';\nimport * as R from 'ramda';\nimport { useMsgText } from '../../localization/hooks';\nimport { useFormik } from 'formik';\nimport { setupSecurityQuestionFormValidation } from '../formValidations';\nimport { css } from '@emotion/core';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { FORM_COLUMN } from '../../forms/styles/form';\nimport { ERROR_MSG } from '../../forms/styles/messages';\nimport LocalInput from '../../localization/LocalInput';\nimport { INPUT } from '../../forms/styles/input';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { btnStyle } from '../../forms/styles/button';\nimport { Str } from '../../localization/translationKeys';\nimport { SELECT } from '../../forms/styles/select';\nimport { SecurityQuestionKey } from '../securityQuestion/models';\nimport LocalDropdownOption from '../../localization/LocalDropdownOption';\nimport Msg from '../../localization/Msg';\nimport LocalSelect from '../../localization/LocalSelect';\nimport { COLORS } from '../../globalStyle/colors';\nimport { useAppState } from '../../core/redux/hooks';\n\n\ntype Props = {\n className?: string;\n securityQuestionKeys: SecurityQuestionKey[];\n createSecurityChallenge: (questionId: number, answer: string) => void;\n isLoadingCreationQuestionResponse: boolean;\n errorCreatingSecurityChallenge: boolean;\n};\n\n\n/**\n * SecurityQuestionSetupForm: a component that provides a form for the user to select a security question and provide a\n * (non-empty) answer.\n *\n * PureComponent: true\n * Connected to Redux: true\n */\nconst CreateSecurityQuestionForm: React.FC = props => {\n const questionMsg = useMsgText(Str.Question);\n const questionRequired = useMsgText(Str.SelectQuestion);\n const ansReqsNotMet = useMsgText(Str.AnswerRequired);\n\n const { handleSubmit, handleChange, isValid, errors, values } = useFormik({\n initialValues: {\n questionId: 0,\n answer: '',\n },\n // Parse the question Id explicitly as a number here to prevent it from being passed as a string\n onSubmit: (values) => {\n props.createSecurityChallenge(Number(values.questionId), values.answer);\n },\n validationSchema: setupSecurityQuestionFormValidation(questionRequired, ansReqsNotMet),\n validateOnChange: false,\n });\n\n const renderQuestionOptions = useMemo(\n () => R.map(\n key => (\n ),\n props.securityQuestionKeys,\n ),\n [props.securityQuestionKeys],\n );\n \n const dir = useAppState(state => state.locale.textDirection);\n\n return (\n
\n
\n \n
\n \n \n {\n (props.errorCreatingSecurityChallenge || !isValid) && (\n \n {\n props.errorCreatingSecurityChallenge\n ? `${ansReqsNotMet}`\n : `${errors.questionId ?? errors.answer}`\n }\n
\n )\n }\n \n \n {renderQuestionOptions}\n \n \n \n \n \n \n );\n};\n\nexport default CreateSecurityQuestionForm;\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport NewPasswordForm from './NewPasswordForm';\nimport { useDispatch } from 'react-redux';\nimport { newPasswordAction } from './api/newPasswordAction';\nimport { ActionType } from '../../core/redux/actionType';\nimport LoginLayout from '../login/LoginLayout';\nimport { useLoading, useError } from '../../core/api/hooks';\nimport { useMount } from '../../core/hooks/useMount';\nimport { passwordRequirementMessageAction } from './api/passwordRequirementMessageAction';\nimport { Str } from '../../localization/translationKeys';\nimport { useMsgText } from '../../localization/hooks';\nimport CreateSecurityQuestionForm from './CreateSecurityQuestionForm';\nimport { createSecurityChallengeAction } from './api/createSecurityChallengeAction';\nimport { securityQuestionKeysAction } from '../forgotPassword/api/securityQuestionKeysAction';\nimport { useStickyDiff } from '../../core/hooks/useStickyDiff';\nimport { useAppState } from '../../core/redux/hooks';\n\n\ntype Props = {\n className?: string;\n postSetup: React.ReactNode;\n};\n\n\n/**\n * AccountSetupPage: a component to which the user is automatically directed after their first login or whenever logging\n * in from a password reset invite link. Here the user will set and confirm their first or new password and, if they\n * haven't already, configure their security question and answer.\n *\n * PureComponent: true\n * Connected to Redux: true\n */\nconst AccountSetupPage: React.FC = props => {\n const dispatch = useDispatch();\n\n useMount(() => { dispatch(passwordRequirementMessageAction); });\n\n const createPassword = useCallback((passwordHash: string) => dispatch(newPasswordAction(passwordHash)), [dispatch]);\n\n const createPasswordLoading = useLoading(ActionType.NewPasswordRequest);\n const isLoadingSecurityQuestionResult = useLoading(ActionType.CreateSecurityChallengeRequest);\n\n const createPasswordError = !!useError(ActionType.NewPasswordRequest);\n const errorCreatingSecurityChallenge = !!useError(ActionType.CreateSecurityChallengeRequest);\n\n const questionId = useAppState(state => state.auth.currentUser?.securityQuestionId);\n const answer = useAppState(state => state.auth.currentUser?.securityAnswer);\n const questionKeys = useAppState(state => state.auth.securityQuestionKeys ?? []);\n\n const pwReqMsg = useAppState(state => state.auth.passwordRequirementMessage);\n const minPwLength = useAppState(state => state.auth.currentUser?.passwordRequirements.passwordLength);\n const requireSymbol = useAppState(state => state.auth.currentUser?.passwordRequirements.requireSymbol);\n const needsNewPassword = useAppState(\n state => !!state.auth.currentUser?.requirePasswordChange || state.auth.currentUser?.passwordDigest === null,\n );\n\n const createSecurityChallenge = useCallback(\n (questionId: number, answer: string) => dispatch(createSecurityChallengeAction(questionId, answer)),\n [dispatch],\n );\n\n const hasSecurityChallenge = !!questionId && !!answer;\n\n const pwFormHeaderMsg = useMsgText(hasSecurityChallenge ? Str.CreatePassword : Str.SetPassword);\n const questionFormHeaderMsg = useMsgText(Str.SetSecurityQuestion);\n const headerMsg = needsNewPassword ? pwFormHeaderMsg : questionFormHeaderMsg;\n\n useStickyDiff(\n (prev, next) => prev?.needsNewPassword\n && !next.needsNewPassword\n && !next.hasSecurityChallenge\n && dispatch(securityQuestionKeysAction),\n {\n needsNewPassword: needsNewPassword,\n hasSecurityChallenge: hasSecurityChallenge,\n },\n );\n\n return (\n \n {\n needsNewPassword && (\n \n )\n }\n {\n !needsNewPassword && !hasSecurityChallenge && (\n \n )\n }\n { // Project Select Modal\n !needsNewPassword && hasSecurityChallenge && props.postSetup\n }\n \n );\n};\n\n\nexport default AccountSetupPage;\n","import * as React from 'react';\nimport { MouseEventHandler } from 'react';\nimport { css, SerializedStyles } from '@emotion/core';\nimport LocalDiv from '../localization/LocalDiv';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport Spacer from './Spacer';\nimport Msg from '../localization/Msg';\n\n\nconst styles = {\n root: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n `,\n spacer: css`\n margin: 0;\n `,\n};\n\ntype Props = {\n icon: IconDefinition;\n msg: string | number;\n spacePx?: number;\n onClick?: MouseEventHandler;\n iconStyle?: SerializedStyles;\n role?: string;\n className?: string;\n};\n\n\n/**\n * BulletedMsg: a component that renders a localized bullet point -- basically. It's a FontAwesome image next to some\n * text, and the direction is set from the current locale.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst BulletedMsg: React.FC = props => (\n \n \n \n \n \n);\n\nBulletedMsg.defaultProps = {\n spacePx: 5,\n};\n\nexport default BulletedMsg;\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport BulletedMsg from '../../layout/BulletedMsg';\nimport { faGlobeAfrica, faQuestionCircle, faTimesCircle, faUserCircle } from '@fortawesome/free-solid-svg-icons';\nimport { Str } from '../../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\nimport { logOutAction } from '../../auth/login/api/logoutAction';\nimport { useHistory, Link } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useAppState } from '../../core/redux/hooks';\nimport { useWindowSize } from '../../core/hooks/useWindowSize';\nimport { isNilOrEmpty, strictEquals } from '../../language/module';\nimport { useCurrentUser } from '../../auth/hooks';\nimport { logInfoAction } from '../../traceLogging/api/logInfoAction';\nimport { ActionType } from '../../core/redux/actionType';\nimport { AppState } from '../../core/redux/appState';\n\n\nconst styles = {\n root: css`\n padding: 20px;\n border-radius: 8px;\n background-color: ${COLORS.LIGHTER_GREY};\n \n & > * {\n display: block;\n margin-bottom: 10px;\n }\n \n & > *:last-child {\n margin-bottom: 0;\n }\n `,\n option: css`\n font-size: 12px;\n color: ${COLORS.DARK_GREY} !important;\n \n &:hover { \n cursor: pointer;\n color: ${COLORS.BLUE} !important;\n }\n `,\n optionIcon: css`\n font-size: 20px;\n `,\n silentLink: css`\n text-decoration: none;\n `,\n};\n\n\ntype Props = {\n className?: string;\n loginUrl: string;\n accountUrl: string;\n languageUrl: string;\n customerServiceUrl: string;\n};\n\n\n/**\n * AppActions: a component that renders the list of actions in the side menu, including: logout, language, account...\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst AppActions: React.FC = props => {\n const history = useHistory();\n const dispatch = useDispatch();\n const logoutUrl = useAppState(state => state.auth.logoutUrl) ?? '';\n const log = useSelector(state => !!state.featureFlags?.logLogoutUrl, strictEquals);\n const currentUser = useCurrentUser();\n\n const { isMobile } = useWindowSize();\n\n const languages = useAppState(state => state.projectLanguages?.[`${state.projectSummary?.projectId}`] ?? []);\n\n const logLogoutUrl = useCallback(\n (url) => dispatch(logInfoAction('LogoutUrl = ' + url, ActionType.LogOut)),\n [dispatch],\n );\n\n const logout = useCallback(\n () => {\n dispatch(logOutAction(isMobile));\n if (!isNilOrEmpty(logoutUrl)) {\n if (log) {\n logLogoutUrl(logoutUrl);\n }\n window.location.replace(logoutUrl)\n } else {\n if (log) {\n logLogoutUrl(isNilOrEmpty(currentUser?.logoutUrl) ? 'Not Set' : currentUser?.logoutUrl);\n }\n isNilOrEmpty(currentUser?.logoutUrl) \n ? history.push(props.loginUrl) \n : window.location.replace(currentUser?.logoutUrl || '');\n }\n },\n [dispatch, isMobile, history, props.loginUrl, logoutUrl, currentUser, log, logLogoutUrl],\n );\n\n return (\n
\n \n \n \n {\n languages.length > 1 && (\n \n \n \n )\n }\n \n \n \n \n
\n );\n};\n\nexport default AppActions;\n","import { useRouteMatch } from 'react-router-dom';\nimport { ProjectRouteParams } from '../project/projectRouteParams';\nimport { RouteTemplates } from './routes';\nimport * as React from 'react';\nimport { useMemo } from 'react';\nimport { useAppState } from '../core/redux/hooks';\nimport { RaterApprovalRouteParams } from '../raterApproval/raterApprovalRouteParams';\nimport { useCollaborationProjIds } from '../project/devPlan/collaboration/hooks';\nimport { useCurrentUser } from '../auth/hooks';\n\n\nexport type ProjIds = {\n projId: number;\n projDisplayId: string;\n participantId: number;\n}\n\n/**\n * A hook that returns the basic project IDs we care about:\n * Display ID\n * ID\n * Participant ID\n */\nexport const useProjIds = (): ProjIds => {\n const match = useRouteMatch(RouteTemplates.Project);\n\n const routePartId = React.useMemo(() => +(match?.params.participantId ?? ''), [match]);\n const routeProjDispId = React.useMemo(() => match?.params.projectId ?? '', [match]);\n\n const statePartId = useAppState(state => state.auth.currentUser?.personId);\n const projId = useAppState(state => state.displayIdMapping[routeProjDispId]);\n\n return {\n projId: projId || -1,\n projDisplayId: routeProjDispId || '',\n participantId: statePartId || routePartId || -1,\n };\n};\n\n\nexport type RaterApprovalIds = {\n participantId: number;\n projDisplayId: string;\n}\n\n/**\n * A hook that returns the basic rater approval IDs:\n * Participant ID\n * Project Display ID\n */\nexport const useRaterApprovalIds = (): RaterApprovalIds => {\n const match = useRouteMatch(RouteTemplates.RaterApprovalDashboard);\n\n const routePartId = React.useMemo(() => +(match?.params.participantId ?? ''), [match]);\n const routeProjDispId = React.useMemo(() => match?.params.projectId ?? '', [match]);\n\n const stateProjDispId = useAppState(state => state.projectSummary?.displayProjectId);\n\n return {\n participantId: routePartId || -1,\n projDisplayId: routeProjDispId || stateProjDispId || '',\n };\n};\n\n\nexport const useProjIdsForUserType = () => {\n const isParticipant = !!useCurrentUser();\n const participantProjIds = useProjIds();\n const collaboratorProjIds = useCollaborationProjIds();\n\n return useMemo(\n () => isParticipant ? participantProjIds : collaboratorProjIds,\n [collaboratorProjIds, isParticipant, participantProjIds],\n );\n};\n","import * as React from 'react';\nimport { useBrowser } from '../language/useBrowser';\nimport { Link } from 'react-router-dom';\nimport { useRoutes } from '../navigation/routes';\nimport LocalDiv from '../localization/LocalDiv';\nimport { FLEX_COLUMN } from '../layout/flexBox';\nimport AppActions from '../project/sideMenu/AppActions';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../globalStyle/colors';\nimport BulletedMsg from '../layout/BulletedMsg';\nimport { faCircle } from '@fortawesome/free-solid-svg-icons';\nimport truScoreLogo from '../assets/logo_tbc.svg';\nimport hrdqLogo from '../assets/logo_hrdq.gif';\nimport zfLogo from '../assets/logo_zf.svg';\nimport talentSmartLogo from '../assets/logo_talentsmart.png';\nimport { useRaterApprovalIds } from '../navigation/hooks';\nimport { useAppState } from '../core/redux/hooks';\n\n\nconst styles = {\n root: css`\n padding: 0 10px 15px;\n box-sizing: border-box;\n\n overflow-y: scroll;\n -ms-overflow-style: none; // IE-specific\n scrollbar-width: none; // Firefox-specific\n\n ::-webkit-scrollbar {\n width: 0;\n background: transparent;\n }\n `,\n logo: css`\n width: 184px;\n margin: 20px auto; \n padding: 0;\n `,\n appActions: css`\n margin-top: 15px;\n margin-bottom: 15px;\n `,\n footer: css`\n font-size: 11.5px;\n color: ${COLORS.MEDIUM_GREY};\n \n & > a { \n text-decoration: none;\n color: ${COLORS.BLUE}\n }\n \n & > a:hover { \n text-decoration: underline;\n }\n \n @supports (-webkit-touch-callout: none) {\n margin-bottom: 60px;\n }\n `,\n linkContainer: css`\n border: 1px solid ${COLORS.LIGHTER_GREY};\n border-radius: 8px;\n \n & > * {\n border-bottom: 1px solid ${COLORS.LIGHTER_GREY};\n }\n \n & > *:last-child {\n border-bottom: none;\n }\n `,\n link: css`\n display: block;\n padding: 18px 15px;\n text-decoration: none;\n \n &:hover {\n cursor: pointer;\n }\n `,\n inactiveLink: css`\n color: ${COLORS.MEDIUM_GREY};\n \n &:hover {\n background-color: ${COLORS.LIGHTEST_GREY};\n }\n `,\n activeLink: css`\n color: ${COLORS.DARK_GREY};\n background-color: ${COLORS.LIGHTER_GREY};\n \n &:hover {\n background-color: ${COLORS.LIGHTEST_GREY};\n }\n `,\n iconMediumGrey: css`\n font-size: 15px;\n color: ${COLORS.MEDIUM_GREY};\n `,\n iconGreen: css`\n font-size: 15px;\n color: ${COLORS.GREEN};\n `,\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\nconst activeLink = (route: string) => window.location.pathname.endsWith(route);\n\n\n/**\n * RaterApprovalMenu: a component that renders the contents of the side menu on rater approval pages.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterApprovalMenu: React.FC = props => {\n const { onIe } = useBrowser();\n\n const routeIds = useRaterApprovalIds();\n const routes = useRoutes(routeIds.participantId, routeIds.projDisplayId);\n\n const config = useAppState(state => state.config);\n const system = (config?.system || '').toLowerCase();\n const projectLogo = React.useMemo (\n () => system === 'zf'\n ? zfLogo\n : system === 'hrdq'\n ? hrdqLogo\n : system === 'talentsmart'\n ? talentSmartLogo\n : truScoreLogo // always default to TBC\n ,\n [system],\n ); \n\n return (\n \n {\n \n }\n\n {\n onIe\n ? (\n
\n Project Logo\n
\n )\n : (\n Project Logo\n )\n }\n\n {/* Links */}\n
\n \n \n \n
\n\n {/* Options */}\n \n\n {/* Footer: Copyright/Privacy Policy */}\n \n
\n );\n};\n\n\nexport default RaterApprovalMenu;\n","import { css } from '@emotion/core';\n\n\nexport const LTR_SHADOW = css`\n box-shadow: rgba(0,0,0,0.15) 10px 4px 8px 2px\n`;\n\nexport const RTL_SHADOW = css`\n box-shadow: rgba(0, 0, 0, 0.15) -10px 4px 8px 2px;\n`;\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { css, SerializedStyles } from '@emotion/core';\nimport { Z_INDEX } from '../globalStyle/zIndex';\nimport * as Localization from '../localization/module';\nimport LocalDiv from '../localization/LocalDiv';\nimport { RTL_SHADOW, LTR_SHADOW } from '../globalStyle/shadows';\nimport { COLORS } from '../globalStyle/colors';\nimport { faBars, faChevronLeft, faChevronRight, IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { HIDE_ON_MOBILE, onMobileDevice } from '../globalStyle/mediaQueries';\nimport { useAppState } from '../core/redux/hooks';\nimport { useDispatch } from 'react-redux';\nimport { openMenuAction } from '../project/sideMenu/openMenuAction';\n\n\nconst styles = {\n root: css`\n position: fixed;\n top: 0;\n height: 100vh;\n z-index: ${Z_INDEX.SIDE_MENU};\n \n display: flex;\n flex-direction: row;\n transition: transform .5s ease;\n `,\n displaceDiv: css`\n flex-shrink: 0;\n height: 1px;\n transition: all .5s ease;\n `,\n menuContentWrapper: css`\n background-color: ${COLORS.WHITE};\n `,\n openCloseBtns: css`\n height: 50vh;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n ${onMobileDevice} {\n width: 0;\n height: 50px;\n }\n `,\n hamburgerBtn: css`\n height: 48px;\n width: 50px;\n background-color: ${COLORS.WHITE};\n border-radius: 0;\n border: none;\n padding: 10px;\n font-size: 18px;\n \n &:hover { \n cursor: pointer;\n color: ${COLORS.BLUE}\n }\n `,\n chevronBtn: css`\n height: 40px;\n width: 40px;\n font-size: 15px;\n background-color: ${COLORS.WHITE};\n border-radius: 100%;\n border: none;\n transition: padding, margin .5s ease;\n \n /* \n This button is a circle, centered-ish on the edge of the side menu. \n We want the part outside the menu; but we don't want the part inside the menu to overlap the menu contents. \n So, we clip off the part of the button on the inside of the menu. \n */\n &[dir=\"ltr\"] {\n clip-path: inset(0px 0px 0px 14px);\n }\n \n &[dir=\"rtl\"] {\n clip-path: inset(0px 14px 0px 0px);\n }\n \n margin-left: -24px;\n padding: 0 0 0 10px;\n \n &:hover { \n cursor: pointer;\n color: ${COLORS.BLUE}\n }\n \n &:focus { \n outline: none; /* Sorry visually-impaired people, but you get the hamburger button */\n }\n \n /* When the menu is especially short, this little tab button thing encroaches on the the hamburger button */\n @media only screen and (max-height: 500px) {\n display: none;\n } \n `,\n};\n\n\nconst getChevronInset = (isOpen: boolean): string => isOpen ? '-24px' : '-14px';\n\n\nconst getChevronOffset = (\n isOpen: boolean,\n isRtl: boolean,\n): SerializedStyles => isRtl\n ? css` margin-right: ${getChevronInset(isOpen)}; padding: 0 10px 0 0;`\n : css` margin-left: ${getChevronInset(isOpen)}; padding: 0 0 0 10px;`;\n\n\nconst getChevronImg = (\n isOpen: boolean,\n isRtl: boolean,\n): IconDefinition => isOpen\n ? isRtl ? faChevronRight : faChevronLeft\n : isRtl ? faChevronLeft : faChevronRight;\n\n\nconst getShadow = (\n isOpen: boolean,\n isRtl: boolean,\n): SerializedStyles | undefined => isOpen ? isRtl ? RTL_SHADOW : LTR_SHADOW : undefined;\n\n\ntype Props = {\n /**\n * Whether or not the menu should displace sibling content in the DOM where it's added\n */\n displace?: boolean;\n\n /**\n * The width of the content in the menu (buttons hanging off the menu are an extra 50px)\n */\n contentWidthPx: number;\n\n /**\n * Whether or not the menu should start in the open position\n */\n startOpen?: boolean;\n\n closeOnClickInside?: boolean;\n\n className?: string;\n};\n\n\n/**\n * SideMenu: a component that renders a menu on the side of the screen (which side depends on the user's locale).\n * This component doesn't have any content itself, you should wrap your menu content with this component to render it\n * in a fancy pull-out menu on the side of the screen\n *\n * If using displacement option (props.displace), you will need to put this menu and its siblings in a LocalDiv.\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst SideMenu: React.FC = props => {\n const dispatch = useDispatch();\n\n const isRtl = useAppState(state => Localization.isRtl(state.locale.textDirection));\n const isOpen = useAppState(state => state.openSideMenu);\n\n const toggleMenu = React.useCallback(() => dispatch(openMenuAction(!isOpen)), [isOpen, dispatch]);\n const toggleMenuDelayed = React.useCallback(() => window.setTimeout(toggleMenu, 250), [toggleMenu]);\n\n const shadow = React.useMemo(() => getShadow(isOpen, isRtl), [isOpen, isRtl]);\n const chevronOffset = React.useMemo(() => getChevronOffset(isOpen, isRtl), [isOpen, isRtl]);\n\n const menuOffset = React.useMemo(\n () => isOpen ? 0 : isRtl ? props.contentWidthPx : -props.contentWidthPx,\n [props.contentWidthPx, isRtl, isOpen],\n );\n\n const menuDisplacement = React.useMemo(() => isOpen ? props.contentWidthPx : 0, [props.contentWidthPx, isOpen]);\n\n const onClick = React.useCallback(\n (\n event: React.MouseEvent,\n ) => props.closeOnClickInside\n && isOpen\n && (event.target as HTMLElement | undefined)?.tagName.toLowerCase() !== 'div'\n && toggleMenuDelayed(),\n [props.closeOnClickInside, isOpen, toggleMenuDelayed],\n );\n\n return (\n \n { // Div to sit in the DOM where the menu was added and displace content (if props says to do so)\n props.displace && (\n \n )\n }\n { // Menu\n ReactDOM.createPortal(\n \n {/* Menu Content */}\n \n {\n props.children\n }\n \n\n {/* Open/Close Buttons */}\n
\n \n \n \n \n
\n
,\n document.getElementById('root') || document.getElementById('react-root') || document.body,\n )\n }\n \n );\n};\n\nexport default SideMenu;\n","import * as React from 'react';\nimport { css, SerializedStyles } from '@emotion/core';\nimport { useWindowSize } from '../core/hooks/useWindowSize';\nimport { useBrowser } from '../language/useBrowser';\nimport { motion } from 'framer-motion';\nimport LocalDiv from '../localization/LocalDiv';\nimport { PAGE_BG, PAGE_HEIGHT, PAGE_PADDING } from './pageStyle';\nimport SideMenu from '../navigation/SideMenu';\n\n\nconst styles = {\n root: css`\n display: flex;\n flex-direction: row;\n `,\n pageContent: css`\n flex-grow: 1;\n max-width: 1200px;\n margin-left: auto;\n margin-right: auto;\n `,\n};\n\n\ntype Props = {\n children: React.ReactNode;\n floatMenu?: boolean;\n className?: string;\n contentStyle?: SerializedStyles;\n menu: React.ReactNode;\n};\n\n\n/**\n * DashboardLayout: a component that renders content with standard portal dash padding/margins and a slide-out side\n * menu.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst DashboardLayout: React.FC = props => {\n const { isMobile } = useWindowSize();\n const { onIe } = useBrowser();\n\n return (\n \n \n \n {props.menu}\n \n \n {props.children}\n \n \n \n );\n};\n\nexport default DashboardLayout;\n","import * as React from 'react';\nimport { SerializedStyles } from '@emotion/core';\nimport RaterApprovalMenu from './RaterApprovalMenu';\nimport DashboardLayout from '../layout/DashboardLayout';\n\n\ntype Props = {\n children: React.ReactNode;\n floatMenu?: boolean;\n className?: string;\n contentStyle?: SerializedStyles;\n};\n\n\n/**\n * RaterApprovalLayout: a component that renders the root layout of approver pages with the side menu containing\n * approver area links and the main content area.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterApprovalLayout: React.FC = props => (\n }>\n {props.children}\n \n);\n\nexport default RaterApprovalLayout;\n","import * as React from 'react';\nimport { btnStyle } from '../forms/styles/button';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconProp, SizeProp } from '@fortawesome/fontawesome-svg-core';\nimport { SerializedStyles } from '@emotion/core';\nimport Msg from '../localization/Msg';\nimport { Map } from '../language/models';\n\n\ntype CaptionProps = {\n str: string | number;\n defaultMsg?: string | number;\n replace?: Map;\n captionStyle?: SerializedStyles;\n}\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLButtonElement> {\n icon: IconProp;\n iconStyle: SerializedStyles;\n iconSize?: SizeProp;\n caption?: CaptionProps;\n}\n\n\n/**\n * ActionIcon: a component that renders an icon which behaves as a button.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ActionIcon: React.FC = props => {\n const { icon, iconStyle, iconSize, caption, ...rest } = props;\n\n return (\n \n );\n};\n\nexport default ActionIcon;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { RaterApprovalRater } from './models';\nimport { faCircle } from '@fortawesome/free-regular-svg-icons';\nimport { faCircle as faCircleSolid, faCheck } from '@fortawesome/free-solid-svg-icons';\nimport { COLORS } from '../globalStyle/colors';\nimport ActionIcon from '../layout/ActionIcon';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { FLEX_COLUMN } from '../layout/flexBox';\nimport { lastCommaFirstLocal } from '../project/survey/raters/module';\nimport { TextDirection } from '../localization/textDirection';\nimport Spacer from '../layout/Spacer';\nimport LocalDiv from '../localization/LocalDiv';\n\n\nconst styles = {\n nameEmailCell: FLEX_COLUMN,\n greenIcon: css`\n font-size: 18px;\n height: 1em;\n vertical-align: 0;\n color: ${COLORS.GREEN};\n `,\n grayIcon: css`\n font-size: 18px;\n height: 1em;\n vertical-align: 0;\n color: ${COLORS.DARK_GREY};\n `,\n};\n\n\ntype Props = {\n className?: string;\n rater: RaterApprovalRater;\n textDirection: TextDirection;\n\n showName: boolean;\n approved: boolean;\n declined: boolean;\n canEdit: boolean;\n\n markRaterApproved: () => void;\n markRaterDeclined: () => void;\n};\n\n\n/**\n * RaterApprovalTableRow: a component that presents information about a yet-to-be-approved project rater, as a table row\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterApprovalTableRow: React.FC = props => {\n const onClickApproveIcon = (event: React.MouseEvent) => {\n event.preventDefault();\n props.markRaterApproved();\n };\n\n const onClickDeclineIcon = (event: React.MouseEvent) => {\n event.preventDefault();\n props.markRaterDeclined();\n };\n\n return (\n \n \n \n {\n props.showName && (\n <>\n \n {lastCommaFirstLocal(props.textDirection, props.rater)}\n \n \n \n )\n }\n {props.rater.email}\n \n \n \n {props.rater.levelName}\n \n \n {\n props.canEdit\n ? (\n \n ) : (\n props.approved\n ? (\n \n ) : null\n )\n }\n \n \n {\n props.canEdit\n ? (\n \n ) : (\n props.declined\n ? (\n \n ) : null\n )\n }\n \n \n );\n};\n\nexport default RaterApprovalTableRow;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../globalStyle/colors';\nimport LocalDiv from '../localization/LocalDiv';\nimport { FLEX_COLUMN, FLEX_ROW, FLEX_CENTERED } from '../layout/flexBox';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport { faCircle as faCircleSolid, faCheck } from '@fortawesome/free-solid-svg-icons';\nimport Spacer from '../layout/Spacer';\nimport { RaterApprovalRater } from './models';\nimport ActionIcon from '../layout/ActionIcon';\nimport { faCircle } from '@fortawesome/free-regular-svg-icons';\nimport { doNothing } from '../language/module';\nimport { TextDirection } from '../localization/textDirection';\nimport { lastCommaFirstLocal } from '../project/survey/raters/module';\n\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n css`\n margin-top: 10px;\n padding: 18px;\n `,\n ],\n infoRow: [\n FLEX_ROW,\n css`\n display: flex;\n flex-direction: row;\n `,\n ],\n label: css`font-weight: bold;`,\n iconRow: [\n FLEX_ROW,\n css`\n width: 100%;\n justify-content: flex-start;\n margin-top: 18px;\n `,\n ],\n actionIcon: {\n root: [\n FLEX_COLUMN,\n FLEX_CENTERED,\n css`\n font-size: 18px;\n color: ${COLORS.ICON_GREY};\n cursor: pointer;\n `,\n ],\n icon: css`\n font-size: 18px;\n margin-bottom: 8px;\n `,\n caption: css`font-weight: bold; font-size: 12px;`,\n green: css`color: ${COLORS.GREEN};`,\n gray: css`color: ${COLORS.DARK_GREY};`,\n translucent: css`opacity: 0.4;`,\n },\n};\n\n\ntype Props = {\n className?: string;\n rater: RaterApprovalRater;\n textDirection: TextDirection;\n\n showName: boolean;\n approved: boolean;\n declined: boolean;\n canEdit: boolean;\n\n markRaterApproved: () => void;\n markRaterDeclined: () => void;\n};\n\n\n/**\n * RaterApprovalCard: a component that presents information about a yet-to-be-approved project rater, as a card\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterApprovalCard: React.FC = props => {\n const { markRaterApproved, markRaterDeclined, ...rest } = props;\n\n const onClickApproveIcon = React.useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n markRaterApproved();\n },\n [markRaterApproved],\n );\n\n const onClickDeclineIcon = React.useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n markRaterDeclined();\n },\n [markRaterDeclined],\n );\n\n const approveIconProps = React.useMemo(\n () => rest.canEdit\n ? {\n icon: rest.approved ? faCircleSolid : faCircle,\n onClick: onClickApproveIcon,\n captionMsg: Str.Approve,\n css: rest.approved ? styles.actionIcon.green : styles.actionIcon.gray,\n }\n : {\n icon: faCheck,\n onClick: doNothing,\n captionMsg: Str.ApprovalStatus3,\n css: [\n rest.approved\n ? styles.actionIcon.green\n : [styles.actionIcon.gray, styles.actionIcon.translucent],\n ],\n },\n [onClickApproveIcon, rest.approved, rest.canEdit],\n );\n\n const declineIconProps = React.useMemo(\n () => rest.canEdit\n ? {\n icon: rest.declined ? faCircleSolid : faCircle,\n onClick: onClickDeclineIcon,\n captionMsg: Str.Decline,\n css: undefined,\n }\n : {\n icon: faCheck,\n onClick: doNothing,\n captionMsg: Str.ApprovalStatus4,\n css: !rest.declined && styles.actionIcon.translucent,\n },\n [onClickDeclineIcon, rest.canEdit, rest.declined],\n );\n\n return (\n \n\n {\n props.showName && (\n <>\n \n \n \n \n \n\n \n \n )\n }\n\n \n \n \n \n \n\n \n\n \n \n \n \n \n\n \n \n\n \n\n \n \n\n \n );\n};\n\nexport default RaterApprovalCard;\n","import * as R from 'ramda';\nimport { RaterApprovalParticipant, RaterApprovalRater } from './models';\nimport { RaterApprovalStatus } from './raterApprovalStatus';\n\n\n/**\n * The collection of all rater statuses which can be edited by the approver in the UI\n */\nconst editableStatuses = [\n RaterApprovalStatus.None, RaterApprovalStatus.NeedApproval, RaterApprovalStatus.WaitingForApproval,\n];\n\n\n/**\n * Returns the participant with the provided `projectParticipant` prop (or undefined if none)\n *\n * @param projectParticipantKey - the value of the maybe participant's `projectParticipant` prop\n * @param participants - the list of participants to search\n */\nexport const participantByUniqueIdentifier = (\n projectParticipantKey: string,\n participants: RaterApprovalParticipant[],\n) => participants.find(p => p.projectParticipant === projectParticipantKey);\n\n\n/**\n * Returns the rater with the provided `email` prop (or undefined if none)\n *\n * @param email - the value of the maybe rater's `email` prop\n * @param raters - the list of raters to search\n */\nexport const raterByEmailAddress = (\n email: string,\n raters: RaterApprovalRater[],\n) => raters.find(rater => rater.email === email);\n\n\n/**\n * Returns all raters from the provided collection, whose current approval status matches the one provided\n *\n * @param approvalStatus - the approval status for which to retrieve all matching raters\n * @param raters - the list of raters to search\n */\nexport const ratersByApprovalStatus = (\n approvalStatus: number,\n raters?: RaterApprovalRater[],\n) => raters?.filter(rater => rater.approvalStatus === approvalStatus);\n\n\n/**\n * Returns all raters from the provided collection, whose current approval status matches one of the values in the list\n * provided\n *\n * @param approvalStatuses - the collection of approval statuses for which to retrieve all matching raters\n * @param raters - the list of raters to search\n */\nexport const ratersByApprovalStatuses = (\n approvalStatuses: RaterApprovalStatus[],\n raters?: RaterApprovalRater[],\n) => raters?.filter(rater => R.contains(rater.approvalStatus, approvalStatuses));\n\n\n/**\n * Use this to check whether the provided rater's approval status matches the one provided\n *\n * @param approvalStatus - the approval status to check for\n * @param approvable - the rater (or other object with an `approvalStatus` prop) whose 'editability' we wish to check\n */\nexport const hasStatus = (\n approvalStatus: RaterApprovalStatus,\n approvable: { approvalStatus: number },\n) => approvable.approvalStatus === approvalStatus;\n\n/**\n * Use this to check whether the provided rater's approval status matches any of the ones provided\n *\n * @param approvalStatuses - collection of approval statuses to check against\n * @param approvable - the rater (or other object with an `approvalStatus` prop) whose 'editability' we wish to check\n */\nexport const hasStatusIn = (\n approvalStatuses: RaterApprovalStatus[],\n approvable: { approvalStatus: number },\n) => R.indexOf(approvable.approvalStatus, approvalStatuses) > -1;\n\n\n/**\n * Use this to determine whether a rater approver has permission to edit the rater's approver status\n *\n * @param approvable - the rater (or other object with an `approvalStatus` prop) whose 'editability' we wish to check\n * @returns false if the status indicates that prior approval or denial has already been decided, otherwise true\n */\nexport const canEditRater = (\n approvable: { approvalStatus: number },\n) => hasStatusIn(editableStatuses, approvable);\n\n\n/**\n * Use this to check whether the current rater has been previously approved\n *\n * @param approvable - the rater (or other object with an `approvalStatus` prop) whose 'editability' we wish to check\n */\nexport const isApproved = (\n approvable: { approvalStatus: number },\n) => hasStatus(RaterApprovalStatus.Approved, approvable);\n\n\n/**\n * Use this to check whether the current rater has been previously declined\n *\n * @param approvable - the rater (or other object with an `approvalStatus` prop) whose 'editability' we wish to check\n */\nexport const isDeclined = (\n approvable: { approvalStatus: number },\n) => hasStatus(RaterApprovalStatus.Declined, approvable);\n\n\n/**\n * Use this to return the database sort value associated with the provided rater\n *\n * This is used for a few niche applications, like setting a mapping key with this value as a coefficient to maintain\n * the default sort when extracting raters back into an array\n *\n * @param approvable - the rater (or other object with an `approvalStatus` prop) whose 'editability' we wish to check\n */\nexport const sortValueFor = (\n approvable: { approvalStatus: number },\n) => R.indexOf(approvable.approvalStatus, editableStatuses) > -1 ? 1 : 2;\n","import * as React from 'react';\nimport { RaterApprovalRater } from './models';\nimport RaterApprovalTableRow from './RaterApprovalTableRow';\nimport { FIELDSET_DEFAULT } from '../layout/fieldSetStyle';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../globalStyle/colors';\nimport { TextDirection } from '../localization/textDirection';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport { useWindowSize } from '../core/hooks/useWindowSize';\nimport RaterApprovalCard from './RaterApprovalCard';\nimport { Map } from '../language/models';\nimport { canEditRater, isApproved, isDeclined } from './module';\nimport LocalDiv from '../localization/LocalDiv';\n\n\nconst styles = {\n table: {\n root: css`\n table-layout: auto;\n width: 100%;\n border-collapse: collapse;\n\n & th, & td {\n padding: 18px 4px;\n border: 1px solid;\n border-color: ${COLORS.LIGHTER_GREY} ${COLORS.LIGHTEST_GREY};\n\n &:first-child:dir(rtl), &:last-child:dir(ltr) {\n padding-right: 12px;\n }\n\n &:first-child:dir(ltr), &:last-child:dir(rtl) {\n padding-left: 12px;\n }\n }\n `,\n row: css`\n color: ${COLORS.DARK_GREY};\n background-color: ${COLORS.LIGHTEST_GREY};\n `,\n },\n cardsContainer: css`\n margin-bottom: 72px; // Prevents the last card from being partially hidden behind the mobile toolbar\n `,\n};\n\n\ntype Props = {\n className?: string;\n raters: RaterApprovalRater[];\n textDirection: TextDirection;\n\n ratersToApprove: Map;\n ratersToDecline: Map;\n\n showRaterNames: boolean;\n\n markRaterApproved: (rater: RaterApprovalRater) => void;\n markRaterDeclined: (rater: RaterApprovalRater) => void;\n}\n\n\n/**\n * RaterApprovalList: a component that presents information about the raters to be approved for a given project and\n * participant.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterApprovalList: React.FC = props => {\n const { markRaterApproved, markRaterDeclined, ...rest } = props;\n\n const mapRatersToRows = React.useMemo(\n () => rest.raters.map(rater => (\n markRaterApproved(rater)}\n markRaterDeclined={() => markRaterDeclined(rater)}\n />\n )),\n [\n rest.raters,\n rest.ratersToApprove,\n rest.ratersToDecline,\n rest.showRaterNames,\n rest.textDirection,\n markRaterApproved,\n markRaterDeclined,\n ],\n );\n\n const mapRatersToCards = React.useMemo(\n () => rest.raters.map(rater => (\n markRaterApproved(rater)}\n markRaterDeclined={() => markRaterDeclined(rater)}\n />\n )),\n [\n rest.raters,\n rest.ratersToApprove,\n rest.ratersToDecline,\n rest.showRaterNames,\n rest.textDirection,\n markRaterApproved,\n markRaterDeclined,\n ],\n );\n\n const isRtl = React.useMemo(() => rest.textDirection === TextDirection.RTL, [rest.textDirection]);\n\n const { isMobile } = useWindowSize();\n\n return (\n
\n
\n {\n isMobile\n ? (\n \n {mapRatersToCards}\n \n )\n : (\n \n \n \n \n \n \n \n \n \n \n {mapRatersToRows}\n \n
\n \n \n \n \n \n \n \n
\n )\n }\n
\n
\n );\n};\n\nexport default RaterApprovalList;\n","import * as R from 'ramda';\nimport * as yup from 'yup';\n\n\nexport const addRaterByEmailFormValidation = (\n invalidEmailMsg: string,\n nameRequiredMsg: string,\n requiresNameToAdd: boolean,\n) => yup.object().shape(\n {\n firstName: requiresNameToAdd\n ? yup\n .string()\n .required(nameRequiredMsg)\n : yup\n . string(),\n lastName: requiresNameToAdd\n ? yup\n .string()\n .required(nameRequiredMsg)\n : yup\n .string(),\n email: yup\n .string()\n .email(invalidEmailMsg)\n .required(invalidEmailMsg),\n levelId: yup\n .number()\n .positive()\n .required(),\n },\n);\n\nexport const editRaterWithNamesFormValidation = (\n invalidEmail: string,\n invalidLevelId: (levelId: number) => string,\n acceptableLevelIds?: number[],\n) => yup.object().shape(\n {\n firstName: yup\n .string(),\n lastName: yup\n .string(),\n email: yup\n .string()\n .email(invalidEmail),\n levelId: acceptableLevelIds\n ? yup\n .number()\n .test('is-valid-level-id',\n (input) => invalidLevelId(input.value),\n n => R.contains(n, acceptableLevelIds))\n : yup\n .number()\n .positive(),\n languageId: yup\n .number()\n .positive(),\n },\n);\n\nexport const editRaterFormValidation = (\n invalidEmail: string,\n invalidLevelId: (levelId: number) => string,\n acceptableLevelIds?: number[],\n) => yup.object().shape(\n {\n email: yup\n .string()\n .email(invalidEmail),\n levelId: acceptableLevelIds\n ? yup\n .number()\n .test('is-valid-level-id',\n (input) => invalidLevelId(input.value),\n n => R.contains(n, acceptableLevelIds))\n : yup\n .number()\n .positive(),\n languageId: yup\n .number()\n .positive(),\n },\n);\n\n\nexport const customizeMessageFormValidation = yup.object().shape(\n {\n customText: yup.string(),\n },\n);\n","import * as React from 'react';\nimport { useEffect, useMemo } from 'react';\nimport { css } from '@emotion/core';\nimport LocalInput from '../../../localization/LocalInput';\nimport { INPUT } from '../../../forms/styles/input';\nimport { Str } from '../../../localization/translationKeys';\nimport { SELECT } from '../../../forms/styles/select';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport { btnStyle } from '../../../forms/styles/button';\nimport { COLORS } from '../../../globalStyle/colors';\nimport LocalDropdownOption from '../../../localization/LocalDropdownOption';\nimport { RaterLevel } from './models';\nimport * as R from 'ramda';\nimport { useFormik } from 'formik';\nimport { addRaterByEmailFormValidation } from './formValidations';\nimport { FLEX_COLUMN, FLEX_ADAPTIVE_MED } from '../../../layout/flexBox';\nimport { onMobileMedium } from '../../../globalStyle/mediaQueries';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { useMsgText } from '../../../localization/hooks';\nimport LocalSelect from '../../../localization/LocalSelect';\nimport { Requirement } from '../../models';\nimport { isNilOrEmpty } from '../../../language/module';\nimport { canAddRaterForLevel } from '../../module';\nimport { useAppState } from '../../../core/redux/hooks';\n\n\nconst styles = {\n root: css`\n ${onMobileMedium} {\n width: 100%;\n }\n `,\n input: css`\n margin: 4px;\n min-width: 192px;\n font-size: 12px;\n border-color: ${COLORS.WHITE};\n\n ${onMobileMedium} {\n width: 100%;\n }\n `,\n essentialFields: css`\n flex-wrap: wrap;\n `,\n dropdownBtnContainer: {\n root: css`\n flex-basis: min-content;\n `,\n dropdown: css`\n margin: 4px;\n width: 192px;\n font-size: 12px;\n border-color: ${COLORS.WHITE};\n\n ${onMobileMedium} {\n width: 100%;\n }\n `,\n btnContainer: css`\n margin: 4px;\n ${onMobileMedium} {\n width: 100%;\n }\n `,\n button: css`\n ${onMobileMedium} {\n width: 100%;\n }\n `,\n },\n};\n\n\ntype Props = {\n className?: string;\n raterLevels: RaterLevel[];\n requirements?: Requirement[];\n addRater: (levelId: number, email: string, firstName: string, lastName: string) => void;\n addingRater?: boolean;\n setEmailAddress: (email: string) => void;\n setErrorMsg: (errorMsg?: string) => void;\n showNameFields: boolean;\n requireNamesOnAdd: boolean;\n maximumsRequired: boolean;\n approver: boolean;\n}\n\n\nconst renderRaterLevelOptions = (levels: RaterLevel[]) => R.map(\n level => (\n \n ),\n levels,\n);\n\n\n/**\n * AddRaterForm: a component that enables users to add raters by email address (and, where required, their full name).\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst AddRaterForm: React.FC = props => {\n const invalidEmail = useMsgText(Str.InvalidEmail);\n const includeName = useMsgText(Str.NameRequired);\n\n const relationshipMsg = useMsgText(Str.Relationship);\n const maximumRatersAdded = useMsgText(Str.MaxRatersMsg);\n\n const hideLevelSelect = useMemo(() => props.raterLevels.length === 1, [props.raterLevels]);\n\n const { handleSubmit, handleChange, resetForm, isValid, errors, values, setErrors } = useFormik({\n initialValues: {\n firstName: '',\n lastName: '',\n email: '',\n levelId: hideLevelSelect ? `${props.raterLevels[0]?.surveyLevelId}` : '',\n },\n onSubmit: (values) => {\n if (!!props.requirements) {\n const requirement = props.requirements.find(req => req.surveyLevelId === +values.levelId!);\n\n // If we have a requirement for the selected level, make sure we're allowed to add a rater for it.\n if (!!requirement && !canAddRaterForLevel(props.maximumsRequired, requirement)) {\n setErrors({ email: maximumRatersAdded.replace('{levelName}', requirement.fullName) });\n return;\n }\n }\n\n props.addRater(+values.levelId!, values.email, values.firstName, values.lastName);\n props.setEmailAddress(values.email);\n\n resetForm();\n setErrors({});\n },\n validationSchema: addRaterByEmailFormValidation(invalidEmail, includeName, props.requireNamesOnAdd),\n validateOnChange: false,\n enableReinitialize: true,\n });\n\n const errorMsg = errors.email || errors.firstName || errors.lastName || errors.levelId;\n \n const dir = useAppState(state => state.locale.textDirection);\n \n useEffect(\n () => props.setErrorMsg(errorMsg),\n [errorMsg, props, setErrors],\n );\n\n return (\n
\n \n
\n {\n props.showNameFields && (\n \n \n \n \n )\n }\n \n \n {\n !hideLevelSelect && (\n \n {\n isNilOrEmpty(values.levelId) && (\n \n
\n \n
\n );\n};\n\nexport default AddRaterForm;\n","import * as React from 'react';\nimport { RaterApprovalRater } from './models';\nimport LocalDiv from '../localization/LocalDiv';\nimport { FLEX_COLUMN, FLEX_ROW } from '../layout/flexBox';\nimport RaterApprovalList from './RaterApprovalList';\nimport { TextDirection } from '../localization/textDirection';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../globalStyle/colors';\nimport LocalBtn from '../localization/LocalBtn';\nimport { Str } from '../localization/translationKeys';\nimport { btnStyle } from '../forms/styles/button';\nimport { faEnvelope, faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\nimport Spacer from '../layout/Spacer';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport Msg from '../localization/Msg';\nimport { RaterLevel } from '../project/survey/raters/models';\nimport AddRaterForm from '../project/survey/raters/AddRaterForm';\nimport { HIDE_ON_MOBILE } from '../globalStyle/mediaQueries';\nimport { Map } from '../language/models';\n\n\nconst styles = {\n root: FLEX_COLUMN,\n toolbar: [\n FLEX_ROW,\n css`\n min-height: 35px;\n padding: 15px 12px;\n `,\n ],\n msgBar: [\n css`\n justify-content: space-between;\n background-color: ${COLORS.WHITE};\n `,\n ],\n actionsBar: [\n css`\n background-color: ${COLORS.LIGHTEST_GREY};\n border-top: 1px solid ${COLORS.LIGHTER_GREY};\n justify-content: space-between;\n `,\n ],\n msgContainer: [\n FLEX_ROW,\n css`\n align-items: center;\n `,\n ],\n approverMsg: css`\n color: ${COLORS.GREEN};\n `,\n errorMsg: css`\n color: ${COLORS.RED};\n `,\n btnContainer: [\n FLEX_ROW,\n HIDE_ON_MOBILE,\n ],\n button: css`\n width: max-content;\n padding-left: 12px;\n padding-right: 12px;\n `,\n customizeApprovalBtn: btnStyle.secondary(COLORS.GREEN),\n sendApprovalBtn: btnStyle.primary(COLORS.GREEN),\n};\n\n\ntype Props = {\n className?: string;\n\n raters: RaterApprovalRater[];\n raterLevels: RaterLevel[];\n\n ratersToApprove: Map;\n ratersToDecline: Map;\n\n textDirection: TextDirection;\n participantName: string;\n\n showNameFields: boolean;\n requireNamesOnAdd: boolean;\n\n addErrorMsg?: string;\n ratersNotUpdatedCount: number;\n showProcessingErrorMsg: boolean;\n showApprovalSentMsg: boolean;\n\n disableCustomizeModalButton: boolean;\n disableSendApprovalButton: boolean;\n\n toggleCustomizeEmailModal: () => void;\n setEmailAddress: (emailAddress: string) => void;\n setAddErrorMsg: (errorMsg?: string) => void;\n\n addRater: (levelId: number, email: string, firstName: string, lastName: string) => void;\n markRaterApproved: (rater: RaterApprovalRater) => void;\n markRaterDeclined: (rater: RaterApprovalRater) => void;\n sendApprovalEmail: () => void;\n};\n\n\n/**\n * RaterApprovalTable: a component that renders a list of raters for a given project and participant, as well as tools\n * to enable the user to add, approve, or decline raters\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterApprovalTable: React.FC = props => {\n const { notifMsg, msgStyle, msgData } = React.useMemo(\n () => ({\n notifMsg:\n props.showProcessingErrorMsg\n ? Str.UnableToProcess\n : !!props.ratersNotUpdatedCount\n ? Str.RatersNotProcessed\n : !!props.addErrorMsg\n ? ''\n : props.showApprovalSentMsg\n ? Str.ApprovalSent\n : props.raters.some(i => i.approvalStatus === 0 || i.approvalStatus === 2)\n ? Str.RaterApprovalMsg\n : '',\n msgStyle:\n props.showProcessingErrorMsg || !!props.ratersNotUpdatedCount || !!props.addErrorMsg\n ? styles.errorMsg\n : styles.approverMsg,\n msgData:\n !!props.ratersNotUpdatedCount\n ? { 'number': props.ratersNotUpdatedCount }\n : { 'firstLast': `${props.participantName}` },\n }),\n [\n props.addErrorMsg,\n props.participantName,\n props.ratersNotUpdatedCount,\n props.showApprovalSentMsg,\n props.showProcessingErrorMsg,\n props.raters,\n ],\n );\n\n const showIcon = React.useMemo(() => notifMsg !== '', [notifMsg]);\n\n return (\n \n \n \n {\n (showIcon) && (\n \n )\n }\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default RaterApprovalTable;\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { FLEX_ROW } from '../flexBox';\nimport { COLORS } from '../../globalStyle/colors';\nimport { css } from '@emotion/core';\nimport { Z_INDEX } from '../../globalStyle/zIndex';\nimport { SHOW_ON_MOBILE } from '../../globalStyle/mediaQueries';\nimport LocalDiv from '../../localization/LocalDiv';\n\n\nconst styles = {\n root: [\n SHOW_ON_MOBILE,\n FLEX_ROW,\n css`\n justify-content: flex-end;\n width: 100vw;\n height: 72px;\n position: fixed;\n bottom: 0;\n z-index: ${Z_INDEX.MOBILE_TOOLBAR};\n background-color: ${COLORS.WHITE};\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * MobileToolbar: a component that renders the little toolbar of buttons that often appears at the bottom of pages in\n * the mobile version of the site. The toolbar floats on top of the page content\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst MobileToolbar: React.FC = props => ReactDOM.createPortal(\n \n {props.children}\n ,\n document.getElementById('root') || document.getElementById('react-root') || document.body,\n);\n\nexport default MobileToolbar;\n","import * as React from 'react';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport LocalBtn from './LocalBtn';\nimport { SerializedStyles } from '@emotion/core';\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLButtonElement> {\n /**\n * The translation key to lookup for the button text\n */\n str: string | number;\n\n /**\n * Fallback text to be used for the translated button text can't be found\n */\n defaultText?: string;\n\n /**\n * Optional FontAwesome icon; renders left of the button text in LTR, right in RTL\n */\n icon?: IconDefinition;\n\n /**\n * Optional styling for the font awesome icon\n */\n iconStyle?: SerializedStyles;\n}\n\n\n/**\n * MobileToolbarBtn: a component that renders a button styled specifically for mobile toolbars\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst MobileToolbarBtn: React.FC = props => (\n \n);\n\nexport default MobileToolbarBtn;\n","import * as React from 'react';\nimport { btnStyle } from '../forms/styles/button';\nimport { COLORS } from '../globalStyle/colors';\nimport { Str } from '../localization/translationKeys';\nimport { faEnvelope, faWrench } from '@fortawesome/free-solid-svg-icons';\nimport { css } from '@emotion/core';\nimport { Z_INDEX } from '../globalStyle/zIndex';\nimport MobileToolbar from '../layout/mobile/MobileToolbar';\nimport MobileToolbarBtn from '../localization/MobileToolbarBtn';\n\n\nconst styles = {\n root: css`\n justify-content: flex-end;\n width: 100vw;\n height: 72px;\n position: fixed;\n bottom: 0;\n z-index: ${Z_INDEX.MOBILE_TOOLBAR};\n background-color: ${COLORS.WHITE};\n `,\n button: css`\n height: auto;\n line-height: 12px;\n font-size: 9px;\n border-radius: 0;\n flex-basis: 80px;\n border-color: transparent;\n & > span {\n overflow-wrap: break-spaces;\n text-transform: uppercase;\n }\n `,\n};\n\n\ntype Props = {\n className?: string;\n\n disableCustomizeModalButton: boolean;\n disableSendApprovalButton: boolean;\n\n onClickCustomizeModalButton: () => void;\n onClickSendMsgButton: () => void;\n}\n\n\n/**\n * MobileRaterApprovalToolbar: a tool bar which houses the action buttons associated with the rater approval flow on\n * mobile screens.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst MobileRaterApprovalToolbar: React.FC = props => (\n \n \n \n \n);\n\nexport default MobileRaterApprovalToolbar;\n","import * as React from 'react';\nimport { TextDirection } from './textDirection';\nimport { useMsgText } from './hooks';\nimport { useAppState } from '../core/redux/hooks';\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLTextAreaElement> {\n forceDirection?: TextDirection;\n /**\n * The translation key to lookup for the input's placeholder value\n */\n placeholderTranslation: string;\n\n /**\n * Fallback text to be used for the translated placeholder string can't be found\n */\n placeholderDefault?: string;\n}\n\n\n/**\n * LocalTextArea: a component that renders a textarea with explicitly set text direction (either as provided by the user\n * or otherwise sourced from app state).\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst LocalTextArea: React.FC = props => {\n const { placeholderTranslation, placeholderDefault, ...rest } = props;\n\n const translation = useMsgText(placeholderTranslation, placeholderDefault);\n\n const dir = useAppState(state => state.locale.textDirection);\n\n return (\n \n );\n};\n\nexport default LocalTextArea;","import * as React from 'react';\nimport { useEffect, useMemo } from 'react';\nimport Modal from '../../../layout/modal/Modal';\nimport ModalHeader from '../../../layout/modal/ModalHeader';\nimport { useMsgText } from '../../../localization/hooks';\nimport { Str } from '../../../localization/translationKeys';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../../layout/flexBox';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { btnStyle } from '../../../forms/styles/button';\nimport { css } from '@emotion/core';\nimport LocalTextArea from '../../../localization/LocalTextArea';\nimport Spacer from '../../../layout/Spacer';\nimport { useFormik } from 'formik';\nimport { customizeMessageFormValidation } from './formValidations';\nimport { EmailBody } from './models';\nimport { onMobileMedium, onPhone } from '../../../globalStyle/mediaQueries';\nimport { FIELDSET_DEFAULT } from '../../../layout/fieldSetStyle';\nimport { useProjIds, useRaterApprovalIds } from '../../../navigation/hooks';\nimport { useSessionStorage } from '../../../core/hooks/useSessionStorage';\nimport { SessionStorageKeys } from '../../../localStorage/sessionStorageKeys';\nimport { useMount } from '../../../core/hooks/useMount';\nimport { usePortalType } from '../../../auth/hooks';\nimport { PortalType } from '../../../navigation/portalType';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { participantByUniqueIdentifier } from '../../../raterApproval/module';\n\n\nconst styles = {\n root: css`\n min-width: 780px;\n\n @media only screen and (max-width: 812px) {\n min-width: calc(100vw - 32px);\n }\n\n ${onMobileMedium} {\n max-width: 100vw;\n max-height: 100vh;\n min-width: 0;\n min-height: 0;\n width: 100vw;\n height: 100vh;\n }\n `,\n contentContainer: css`\n margin: 18px;\n\n ${onMobileMedium} {\n margin: 12px;\n }\n `,\n content: css`\n justify-content: center;\n align-items: stretch;\n margin: auto 42px;\n\n ${onMobileMedium} {\n margin: auto 12px;\n }\n\n ${onPhone} {\n margin: 0;\n }\n `,\n textArea: css`\n padding: 8px;\n border: 0 none;\n resize: none;\n font-size: 12px;\n `,\n previewContainer: css`\n margin-top: 30px;\n margin-bottom: 45px;\n\n ${onMobileMedium} {\n margin-top: 15px;\n margin-bottom: 15px;\n }\n `,\n emailPreview: css`\n margin-top: auto;\n background-color: ${COLORS.WHITE};\n border: 0 none;\n min-height: 300px;\n width: 100%;\n\n ${onMobileMedium} {\n min-height: calc(100vh - 270px);\n }\n `,\n btnSpacer: css`\n ${onPhone} {\n display: none;\n }\n `,\n button: css`\n min-height: 35px;\n min-width: 132px;\n `,\n};\n\n\ntype Props = {\n modalTitle: Str;\n\n emailBody?: EmailBody;\n emailComment: string;\n setEmailComment: (comment: string) => void;\n ieIframeRoute: string;\n\n dismiss: () => void;\n className?: string;\n\n emailLogo: string;\n participant: string;\n survey: string;\n dateDue: string;\n ratersApproved: string;\n ratersDeclined: string;\n ratersAdded: string;\n};\n\n\n/**\n * CustomizeEmailModal: a component that displays an HTML preview of the provided email and (except in IE) the custom\n * comment text added to that message by the user.\n *\n * This comment is stored until the users navigates away from the invite-raters view.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CustomizeEmailModal: React.FC = props => {\n const portalType = usePortalType();\n\n const portalProjectId = useProjIds().projId;\n \n const participantId = useRaterApprovalIds().participantId;\n const projDisplayId = useRaterApprovalIds().projDisplayId;\n const participants = useAppState(state => state.raterApprovalParticipants ?? []);\n const participant = useMemo(\n () => participantByUniqueIdentifier(`${(projDisplayId)}|${(participantId)}`, participants),\n [participants, participantId, projDisplayId],\n );\n const raterApprovalProjectId = (participant?.projectId ?? 0) > 0 ? participant?.projectId : 0;\n\n const projectId = portalType === PortalType.RATER_APPROVAL ? raterApprovalProjectId : portalProjectId;\n\n const [, setCustomEmailTxt] = useSessionStorage(\n `${SessionStorageKeys.CustomEmailTxt}-${projectId}`,\n ); //<@ExtraText>\n const [, setCustomEmailLogo] = useSessionStorage(\n `${SessionStorageKeys.CustomEmailLogo}-${projectId}`,\n ); //<@PrimaryLogo>\n const [, setCustomEmailParticipant] = useSessionStorage(\n `${SessionStorageKeys.CustomEmailParticipant}-${projectId}`,\n ); //<@cRateeName>\n const [, setCustomEmailSurvey] = useSessionStorage(\n `${SessionStorageKeys.CustomEmailSurvey}-${projectId}`,\n ); //<@cSurveyName>\n const [, setCustomEmailDateDue] = useSessionStorage(\n `${SessionStorageKeys.CustomEmailDateDue}-${projectId}`,\n ); //<@cDateDueToBooth>\n const [, setCustomEmailRatersApproved] = useSessionStorage(\n `${SessionStorageKeys.CustomEmailRatersApproved}-${projectId}`,\n ); //<@cRatersApproved>\n const [, setCustomEmailRatersDeclined] = useSessionStorage(\n `${SessionStorageKeys.CustomEmailRatersDeclined}-${projectId}`,\n ); //<@cRatersDeclined>\n const [, setCustomEmailRatersAdded] = useSessionStorage(\n `${SessionStorageKeys.CustomEmailRatersAdded}-${projectId}`,\n ); //<@cRatersAddedBySupervisor>\n\n useMount(() => {\n setCustomEmailLogo(props.emailLogo);\n setCustomEmailParticipant(props.participant);\n setCustomEmailSurvey(props.survey);\n setCustomEmailDateDue(props.dateDue);\n setCustomEmailRatersApproved(props.ratersApproved);\n setCustomEmailRatersDeclined(props.ratersDeclined);\n setCustomEmailRatersAdded(props.ratersAdded);\n });\n\n const title = useMsgText(props.modalTitle);\n const previewBoxTitle = useMsgText(Str.EmailPreview);\n\n const { handleSubmit, handleChange, resetForm, values } = useFormik({\n initialValues: {\n customText: props.emailComment,\n },\n\n onSubmit: (values) => {\n props.setEmailComment(values.customText);\n props.dismiss();\n resetForm();\n },\n\n validationSchema: customizeMessageFormValidation,\n validateOnChange: false,\n enableReinitialize: true,\n });\n\n useEffect(\n () => {\n // Set dirty comment state into session storage for iFrame to read out\n setCustomEmailTxt(values.customText.replace(/\\n/g, '
'));\n\n // Return cleanup function to clear out dirty state onUnmount\n return () => setCustomEmailTxt(undefined);\n },\n [values.customText, setCustomEmailTxt],\n );\n\n return (\n \n \n
\n
\n \n \n \n \n {previewBoxTitle}\n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n );\n};\n\nexport default CustomizeEmailModal;\n","import { useState, useCallback } from 'react';\nimport * as R from 'ramda';\nimport { Map } from '../../language/models';\n\n\n/**\n * Use this to store a collection of unique local data values as a map.\n *\n * @param initialMap - the initial state data\n * @returns a getter for the map, a function to add an element to the map, and a function to remove an element from the\n * map\n */\nexport const useMap = (\n initialMap: Map,\n): [Map, (key: string, value: T) => void, (key: string) => void] => {\n const [map, setMap] = useState>(initialMap);\n\n const addElement = useCallback(\n (key: string, value: T) => setMap(R.assoc(key, value, map)),\n [map],\n );\n\n const removeElement = useCallback(\n (key: string) => setMap(R.dissoc(key, map)),\n [map],\n );\n\n return [map, addElement, removeElement];\n};\n","import React, { useEffect } from 'react';\n\n\n/**\n * A React Hook for holding toggle state for a set amount of time.\n * @param startToggled - whether or not the hook should initialize as toggled. Default: `false`\n * @param delay - the duration in milliseconds for which the state should remain toggled. Default: `15000`\n * @returns Array where first item is the toggle state, and the second item is a function that flips the toggle state\n * when called\n */\nexport const useTimedToggle = (\n startToggled: boolean | (() => boolean) = false,\n delay: number = 15000,\n): [boolean, () => void] => {\n const [isToggled, setIsToggled] = React.useState(startToggled);\n\n useEffect(\n () => {\n if (isToggled !== startToggled) {\n const handle = setTimeout(() => setIsToggled(!isToggled), delay);\n // Return a function to React that it can call when the component is unmounting to clean up this effect\n return () => clearTimeout(handle);\n }\n },\n [delay, isToggled, startToggled],\n );\n\n return [isToggled, () => setIsToggled(!isToggled)];\n};\n","import React from 'react';\n\n\n/**\n * A React Hook that sets a value which is incremented with every setter call.\n * @param startValue - the counter's initial value. Defaults to `0`.\n * @param setterFn - defines the behavior of the setter function. Defaults to incrementing the current value by\n * `1`.\n * @returns Array where first item is the initial value, the second item is a function that increments the count when\n * called, and the third item is a function that resets the count to its initial value\n */\nexport const useCounter = (\n startValue: number | (() => number) = 0,\n setterFn: (value: number) => number = value => value + 1,\n): [number, () => void, () => void] => {\n const [value, setValue] = React.useState(startValue);\n\n return [value, () => setValue(setterFn(value)), () => setValue(startValue)];\n};\n","import { useCounter } from './useCounter';\nimport { ActionType } from '../redux/actionType';\nimport { useStickyDiff } from './useStickyDiff';\nimport { useLoadingOfType, useErrorOfType } from '../api/hooks';\nimport * as R from 'ramda';\n\n\n/**\n * A React Hook that keeps a count of successfully returned API actions of the provided types\n *\n * @param actionType - the type of API actions to track for success; with each success, the counter increments by 1\n */\nexport const useCounterOnAnySuccess = (\n actionType: ActionType,\n): [number, () => void] => {\n const [successCount, incrementSuccessCount, resetSuccessCount] = useCounter();\n\n const loadingMap = useLoadingOfType(actionType);\n const errorMap = useErrorOfType(actionType);\n\n useStickyDiff(\n (prev, next) => {\n const returnedReqs = R.difference(Object.keys(prev?.loadingObjs ?? []), Object.keys(next.loadingObjs));\n\n R.forEach(\n key => {\n if (!R.has(key, next.errorObjs)) {\n incrementSuccessCount();\n }\n },\n returnedReqs,\n );\n },\n {\n loadingObjs: loadingMap,\n errorObjs: errorMap,\n },\n );\n\n return [successCount, resetSuccessCount];\n};\n","import { useCounter } from './useCounter';\nimport { ActionType } from '../redux/actionType';\nimport { useStickyDiff } from './useStickyDiff';\nimport { useErrorOfType } from '../api/hooks';\nimport * as R from 'ramda';\n\n\n/**\n * A React Hook that keeps a count of API actions of the provided types, that return with an error\n *\n * @param actionType - the type of API actions to track for success; with each error, the counter increments by 1\n */\nexport const useCounterOnAnyError = (\n actionType: ActionType,\n): [number, () => void] => {\n const [errorCount, incrementErrorCount, resetErrorCount] = useCounter();\n\n const errorMap = useErrorOfType(actionType);\n\n useStickyDiff(\n (prev, next) => {\n const returnedReqs = R.difference(Object.keys(next.errorObjs ?? []), Object.keys(prev?.errorObjs ?? []));\n\n R.forEach(() => incrementErrorCount(), returnedReqs);\n },\n {\n errorObjs: errorMap,\n },\n );\n\n return [errorCount, resetErrorCount];\n};\n","import * as React from 'react';\nimport * as R from 'ramda';\nimport RaterApprovalLayout from './RaterApprovalLayout';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport LocalDiv from '../localization/LocalDiv';\nimport LocalSelect from '../localization/LocalSelect';\nimport { FLEX_ROW, FLEX_COLUMN, FLEX_CENTERED, FLEX_ADAPTIVE } from '../layout/flexBox';\nimport { SELECT } from '../forms/styles/select';\nimport { useAppState } from '../core/redux/hooks';\nimport { useHistory } from 'react-router-dom';\nimport { makeRoutes, useRoutes } from '../navigation/routes';\nimport { useDispatch } from 'react-redux';\nimport { RaterApprovalParticipant, RaterApprovalRater } from './models';\nimport { raterApprovalRatersAction } from './api/raterApprovalRatersAction';\nimport RaterApprovalTable from './RaterApprovalTable';\nimport { useLoading, useLoadingOfType } from '../core/api/hooks';\nimport { ActionType } from '../core/redux/actionType';\nimport { Spinner } from '../loading/Spinner';\nimport { COLORS } from '../globalStyle/colors';\nimport { loadProjectSummaryAction } from '../project/loadProjectSummaryAction';\nimport Spacer from '../layout/Spacer';\nimport { participantByUniqueIdentifier, ratersByApprovalStatuses } from './module';\nimport { firstLastLocal, lastCommaFirstLocal } from '../project/survey/raters/module';\nimport { raterLevelsAction } from '../project/survey/raters/raterLevelsAction';\nimport MobileRaterApprovalToolbar from './MobileRaterApprovalToolbar';\nimport { useToggle } from '../core/hooks/useToggle';\nimport { SendTo } from '../project/survey/raters/models';\nimport { sendRaterApprovalAction } from './api/sendRaterApprovalAction';\nimport { raterApprovalEmailPreviewAction } from './api/raterApprovalEmailPreviewAction';\nimport CustomizeEmailModal from '../project/survey/raters/CustomizeEmailModal';\nimport { RaterApprovalStatus } from './raterApprovalStatus';\nimport { useMap } from '../core/hooks/useMap';\nimport { useRaterApprovalIds } from '../navigation/hooks';\nimport { isNilOrEmpty } from '../language/module';\nimport { useTimedToggleOnSuccess } from '../core/hooks/useTimedToggleOnSuccess';\nimport { useCounterOnAnySuccess } from '../core/hooks/useCounterOnAnySuccess';\nimport { useCounterOnAnyError } from '../core/hooks/useCounterOnAnyError';\nimport { useToggleOnError } from '../core/hooks/useToggleOnError';\nimport { addRaterByEmailAsApproverAction } from './api/addRaterByEmailAsApproverAction';\nimport { approveRaterAction } from './api/approveRaterAction';\nimport { declineRaterAction } from './api/declineRaterAction';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\n\n\nconst styles = {\n header: css`\n margin: 20px auto 40px;\n font-size: 26px;\n \n ${onMobileDevice} {\n padding-top: 25px;\n }\n `,\n infoRow: [\n FLEX_ADAPTIVE,\n css`\n justify-content: space-between;\n margin-bottom: 12px;\n `,\n ],\n selectMsgContainer: {\n root: FLEX_COLUMN,\n caption: FLEX_ROW,\n singleParticipantName: css`font-weight: bold;`,\n select: [SELECT, css`border-color: ${COLORS.WHITE}`],\n },\n deadline: {\n root: [FLEX_ROW, css`align-items: center`],\n label: css`font-weight: bold;`,\n },\n table: css``,\n};\n\n\ntype Props = {\n className?: string;\n}\n\n\nconst mapParticipantsToOptions = (\n participants: RaterApprovalParticipant[],\n) => participants.map(\n p => (\n \n {p.displayName}\n \n ),\n);\n\n\n/**\n * RaterApproval: a component that enables rater approvers to approve and decline raters for projects, and to invite\n * approved raters to complete the respective survey(s).\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterApprovalDashboard: React.FC = () => {\n const dispatch = useDispatch();\n const history = useHistory();\n\n const routes = useRoutes();\n\n // Local State\n const [addErrorMsg, setAddErrorMsg] = React.useState(undefined);\n const [, setEmailAddress] = React.useState(''); //TODO - passed back from add raters form but never used?\n const [emailComment, setEmailComment] = React.useState('');\n\n // Normally we would just check whether the number of returned update-status requests matches the number of edited\n // raters to determine whether to send the approval email, but since the approver can auto-approved raters and\n // potentially never even have to edit a rater, we have to explicitly indicate when we can send.\n const [readyToSend, toggleSendSignal] = useToggle();\n\n const [customizeModalVisible, toggleCustomizeModal] = useToggle();\n\n const [addedRaterCount, resetAddedRaterCount] = useCounterOnAnySuccess(ActionType.AddRaterByEmailAsApproverRequest);\n const [approvalCount, resetApprovalCount] = useCounterOnAnySuccess(ActionType.ApproveRaterRequest);\n const [declineCount, resetDeclineCount] = useCounterOnAnySuccess(ActionType.DeclineRaterRequest);\n\n const { decisionCount, resetDecisionCount } = React.useMemo(\n () => ({\n decisionCount: approvalCount + declineCount,\n resetDecisionCount: () => {\n resetApprovalCount();\n resetDeclineCount();\n },\n }),\n [approvalCount, declineCount, resetApprovalCount, resetDeclineCount],\n );\n\n const [approvalErrorCount, resetApprovalErrorCount] = useCounterOnAnyError(ActionType.ApproveRaterRequest);\n const [declineErrorCount, resetDeclineErrorCount] = useCounterOnAnyError(ActionType.DeclineRaterRequest);\n\n const { updateErrorCount, resetUpdateErrorCount } = React.useMemo(\n () => ({\n updateErrorCount: approvalErrorCount + declineErrorCount,\n resetUpdateErrorCount: () => {\n resetApprovalErrorCount();\n resetDeclineErrorCount();\n },\n }),\n [approvalErrorCount, declineErrorCount, resetApprovalErrorCount, resetDeclineErrorCount],\n );\n\n const [ratersToApprove, markRaterToApprove, cancelApprovingRater] = useMap({});\n const [ratersToDecline, markRaterToDecline, cancelDecliningRater] = useMap({});\n\n // Props from state\n const { projDisplayId, participantId } = useRaterApprovalIds();\n\n const approverId = useAppState(state => state.auth.currentUser?.personId ?? -1);\n const textDirection = useAppState(state => state.locale.textDirection);\n const langInfo = useAppState(state => state.locale.lang);\n const project = useAppState(state => state.projectSummary);\n\n const raterLevels = useAppState(state => state.projectRaterLevels?.[`${project?.projectId}`] ?? []);\n\n const participants = useAppState(state => state.raterApprovalParticipants ?? []);\n\n const emailBody = useAppState(\n state => state.raterApprovalEmailTemplates[`${(projectId)}`]?.[`${langInfo.languageId}`] || '',\n );\n\n const participant = React.useMemo(\n () => participantByUniqueIdentifier(`${(projDisplayId)}|${(participantId)}`, participants),\n [participants, participantId, projDisplayId],\n );\n\n const raters = useAppState(\n state => state.raterApprovalRaters?.[`${participant?.participantId}`]?.[`${participant?.projectId}`],\n );\n\n // Convenience props\n const { hasParticipants, hasOneParticipant, hasMultipleParticipants } = React.useMemo(\n () => ({\n hasParticipants: !!participants?.length,\n hasOneParticipant: participants?.length === 1,\n hasMultipleParticipants: participants?.length > 1,\n }),\n [participants],\n );\n\n const selectMsg = React.useMemo(\n () => hasParticipants ? Str.ApproveFor : Str.NoApprovalParticipants,\n [hasParticipants],\n );\n\n const projectId = React.useMemo(() => participant?.projectId ?? -1, [participant]);\n\n const participantName = React.useMemo(\n () => participant ? firstLastLocal(textDirection, participant) : undefined,\n [participant, textDirection],\n );\n\n const pendingRaters = React.useMemo(\n () => ratersByApprovalStatuses(\n [RaterApprovalStatus.None, RaterApprovalStatus.NeedApproval, RaterApprovalStatus.WaitingForApproval],\n raters,\n ),\n [raters],\n );\n\n const editableRaterMarked = React.useMemo(\n () => !!pendingRaters?.length\n && (!!(Object.keys(ratersToApprove)).length || !!(Object.keys(ratersToDecline)).length),\n [pendingRaters, ratersToApprove, ratersToDecline],\n );\n\n const allUpdateRequestsReturned = React.useMemo(\n () => !!decisionCount\n && (Object.keys(ratersToApprove).length + Object.keys(ratersToDecline).length)\n === decisionCount + updateErrorCount,\n [decisionCount, ratersToApprove, ratersToDecline, updateErrorCount],\n );\n\n const participantEmailInfo = React.useMemo(\n () => ({\n toAddress: participant?.email || '',\n languageId: langInfo.languageId,\n }),\n [langInfo.languageId, participant],\n );\n\n // Props-dependent functions\n const loadingRaters = useLoading(\n ActionType.RaterApprovalRatersRequest,\n `${participant?.participantId}-${participant?.projectId}`,\n );\n\n const approvalSent = useTimedToggleOnSuccess(\n ActionType.SendRaterApprovalRequest,\n `${approverId}-${participantId}-${projectId}`,\n );\n\n const [errorSendingApproval, resetSendingApprovalError] = useToggleOnError(\n ActionType.SendRaterApprovalRequest,\n `${approverId}-${participantId}-${projectId}`,\n );\n\n // If the backend is already doing work related to approving raters,\n // then we should disable the send approval functionality until we gain back performance capacity\n const sendLoading = useLoadingOfType(\n ActionType.SendRaterApprovalRequest,\n );\n const approveLoading = useLoadingOfType(\n ActionType.ApproveRaterRequest,\n );\n const declineLoading = useLoadingOfType(\n ActionType.DeclineRaterRequest,\n );\n\n // UI functions\n const disableSendApprovalBtn = React.useMemo(\n () => !isNilOrEmpty(sendLoading)\n || !isNilOrEmpty(approveLoading)\n || !isNilOrEmpty(declineLoading)\n || (!editableRaterMarked && !addedRaterCount),\n [addedRaterCount, editableRaterMarked, sendLoading, approveLoading, declineLoading],\n );\n\n const onSelectParticipant = React.useCallback(\n event => {\n const identifiers = event.target.value.split('|');\n const projectId = identifiers[0];\n const participantId = +identifiers[1];\n history.push(makeRoutes(participantId, projectId).RaterApprovalDashboard);\n },\n [history],\n );\n\n // Approve/deny flow functions\n const markRaterApproved = React.useCallback(\n (rater: RaterApprovalRater) => {\n cancelDecliningRater(`${rater.raterId}`);\n markRaterToApprove(`${rater.raterId}`, rater);\n },\n [markRaterToApprove, cancelDecliningRater],\n );\n\n const markRaterDeclined = React.useCallback(\n (rater: RaterApprovalRater) => {\n cancelApprovingRater(`${rater.raterId}`);\n markRaterToDecline(`${rater.raterId}`, rater);\n },\n [markRaterToDecline, cancelApprovingRater],\n );\n\n const addRater = React.useCallback(\n async (levelId: number, email: string, firstName: string, lastName: string) => {\n await dispatch(addRaterByEmailAsApproverAction(projectId, participantId, levelId, email, firstName, lastName));\n },\n [dispatch, participantId, projectId],\n );\n\n const approveRater = React.useCallback(\n (raterId: number) => dispatch(approveRaterAction(\n participantId,\n projectId,\n raterId,\n )),\n [dispatch, participantId, projectId],\n );\n\n const declineRater = React.useCallback(\n (raterId: number) => dispatch(declineRaterAction(\n participantId,\n projectId,\n raterId,\n )),\n [dispatch, participantId, projectId],\n );\n\n const sendApprovalEmail = React.useCallback(\n () => dispatch(\n sendRaterApprovalAction(\n approverId,\n participantId,\n projectId,\n emailComment,\n [participantEmailInfo],\n approvalCount,\n declineCount,\n addedRaterCount,\n ),\n ),\n [\n addedRaterCount,\n approvalCount,\n approverId,\n declineCount,\n dispatch,\n emailComment,\n participantEmailInfo,\n participantId,\n projectId,\n ],\n );\n\n const sendAllUpdates = React.useCallback(\n () => {\n if (errorSendingApproval) { resetSendingApprovalError(); }\n resetUpdateErrorCount();\n if (!isNilOrEmpty(ratersToApprove) || !isNilOrEmpty(ratersToDecline)) {\n R.forEach(raterId => approveRater(+raterId), Object.keys(ratersToApprove));\n R.forEach(raterId => declineRater(+raterId), Object.keys(ratersToDecline));\n } else {\n toggleSendSignal();\n }\n },\n [\n approveRater,\n declineRater,\n errorSendingApproval,\n ratersToApprove,\n ratersToDecline,\n resetSendingApprovalError,\n resetUpdateErrorCount,\n toggleSendSignal,\n ],\n );\n\n // Effects\n React.useEffect(\n () => {\n if (projectId > 0 && !!langInfo && !emailBody) {\n dispatch(raterApprovalEmailPreviewAction(projectId, langInfo.languageId));\n }\n },\n [dispatch, emailBody, langInfo, projectId],\n );\n\n React.useEffect(\n () => {\n if (!!participant && !raters) {\n dispatch(raterApprovalRatersAction(participant.participantId, participant.projectId));\n }\n },\n [dispatch, participant, raters],\n );\n\n React.useEffect(\n () => {\n if (!!participant && project?.projectId !== participant.projectId) {\n dispatch(loadProjectSummaryAction(participant.projectId, participant.participantId));\n }\n },\n [dispatch, participant, project],\n );\n\n React.useEffect(\n () => {\n if (!!project && isNilOrEmpty(raterLevels)) {\n dispatch(raterLevelsAction(projectId));\n }\n },\n [ dispatch, project, projectId, raterLevels],\n );\n\n React.useEffect(\n () => {\n if (allUpdateRequestsReturned || readyToSend) {\n toggleSendSignal();\n resetDecisionCount();\n sendApprovalEmail();\n resetAddedRaterCount();\n }\n },\n [\n allUpdateRequestsReturned,\n readyToSend,\n resetAddedRaterCount,\n resetDecisionCount,\n sendApprovalEmail,\n toggleSendSignal,\n ],\n );\n\n return (\n \n\n \n \n \n\n \n \n \n \n {\n hasOneParticipant && (\n <>\n \n \n {lastCommaFirstLocal(textDirection, participants[0])}\n \n \n )\n }\n \n {\n hasMultipleParticipants && (\n <>\n \n \n {mapParticipantsToOptions(participants)}\n \n \n )\n }\n \n {\n !!project && (\n <>\n \n \n \n \n {new Date(project.surveyDeadline).toLocaleString(langInfo.code)}\n \n \n )\n }\n \n\n {\n !!raters && (\n \n )\n }\n\n {\n loadingRaters && (\n
\n \n
\n )\n }\n\n {\n customizeModalVisible && (\n \n )\n }\n\n \n
\n );\n};\n\nexport default RaterApprovalDashboard;\n","import { useStickyDiff } from './useStickyDiff';\nimport { useLoading, useError } from '../api/hooks';\nimport { ActionType } from '../redux/actionType';\nimport { useTimedToggle } from './useTimedToggle';\n\n\n/**\n * Use this to set a temporary toggle that fires whenever the specified action returns with success status.\n *\n * @param actionType - the type of action to trigger the callback\n * @param requestId - the request Id (if any) of the specific action which should trigger the callback\n * @param startToggled - whether or not the hook should initialize as toggled. Default: `false`\n * @param delay - the duration in milliseconds for which the state should remain toggled. Default: `15000`\n */\nexport const useTimedToggleOnSuccess = (\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n startToggled?: boolean | (() => boolean),\n delay?: number,\n): boolean => {\n const [value, setValue] = useTimedToggle(startToggled, delay);\n const isLoading = useLoading(actionType, requestId);\n const hasError = !!useError(actionType, requestId);\n\n useStickyDiff(\n (prev, next) => {\n if (!!prev?.isLoading && !next.isLoading && !next.hasError)\n setValue();\n },\n {\n isLoading: isLoading,\n hasError: hasError,\n },\n );\n\n return value;\n};\n","import { useStickyDiff } from './useStickyDiff';\nimport { useError, useLoading } from '../api/hooks';\nimport { ActionType } from '../redux/actionType';\nimport { useToggle } from './useToggle';\n\n\n/**\n * Use this to set a toggle that fires whenever the specified action returns with an error.\n *\n * @param actionType - the type of action to trigger the callback\n * @param requestId - the request Id (if any) of the specific action which should trigger the callback\n */\nexport const useToggleOnError = (\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n): [boolean, () => void] => {\n const [value, setValue] = useToggle();\n const isLoading = useLoading(actionType, requestId);\n const hasError = !!useError(actionType, requestId);\n\n useStickyDiff(\n (prev, next) => {\n if (!!prev?.isLoading && !next.isLoading && next.hasError) {\n setValue();\n }\n },\n {\n isLoading: isLoading,\n hasError: hasError,\n },\n );\n\n return [value, setValue];\n};\n","import { useEffect, useRef } from 'react';\n\n\n/**\n * React hook that handles making an interval (`window.setInterval`), and cleans up the interval when the component\n * unmounts.\n * @param callback - The action perform on a regular interval\n * @param delayMs - The duration of the regular interval in milliseconds\n */\nexport const useInterval = (callback: () => void, delayMs: number): void => {\n const savedCallback = useRef<() => void>();\n\n // Remember the latest callback.\n useEffect(() => savedCallback.current = callback, [callback]);\n\n // Set up the interval.\n useEffect(\n () => {\n const id = setInterval(() => savedCallback.current?.(), delayMs);\n\n // Return cleanup func to React\n return () => clearInterval(id);\n },\n [delayMs],\n );\n};\n","import * as React from 'react';\nimport { Str } from '../localization/translationKeys';\nimport { css, SerializedStyles } from '@emotion/core';\nimport Msg from '../localization/Msg';\n\n\nconst styles = {\n root: css`\n display: flex;\n flex-direction: column;\n `,\n value: css`\n font-size: 30px;\n font-weight: bold;\n text-align: center;\n `,\n label: css`\n font-size: 11px;\n text-align: center;\n `,\n};\n\n\ntype Props = {\n value: string | number;\n label: Str;\n defaultLabel?: string | number;\n valueStyle?: SerializedStyles;\n labelStyle?: SerializedStyles;\n className?: string;\n};\n\n\n/**\n * Metric: a component that renders a value with a label underneath.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst Metric: React.FC = props => (\n
\n {props.value}\n \n {props.children}\n
\n);\n\nexport default Metric;\n","import * as React from 'react';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { Str } from '../../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport { useInterval } from '../../core/hooks/useInterval';\nimport { TIME, diffMs } from '../../language/time';\nimport Metric from '../../layout/Metric';\n\n\nconst styles = {\n root: css`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n flex-grow: 1;\n `,\n unitContainer: css`\n display: flex;\n flex-direction: column;\n `,\n value: css`\n font-size: 30px;\n font-weight: bold;\n text-align: center;\n `,\n unit: css`\n font-size: 11px;\n text-align: center;\n `,\n};\n\ntype Props = {\n deadline: Date;\n onTick?: (diff: number) => void;\n className?: string;\n};\n\nconst pad = (time: string): string => time.length === 1 ? `0${time}` : time;\nconst toStr = (time: number): string => pad(`${Math.max(0, Math.floor(time))}`);\n\n/**\n * CountDown: a component that renders a countdown from a target datetime in days, hours, minutes\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CountDown: React.FC = props => {\n const [remainingMs, setRemainingMs] = React.useState(props.deadline.getTime() - new Date().getTime());\n\n const callback = React.useCallback(\n () => {\n const diff = diffMs(props.deadline, new Date());\n props.onTick?.(diff);\n setRemainingMs(diff);\n },\n [props.deadline, props.onTick],\n );\n\n useInterval(callback, 10 * TIME.S);\n\n const remainingDays = React.useMemo(() => toStr(remainingMs / TIME.D), [remainingMs]);\n const remainingHours = React.useMemo(() => toStr(remainingMs / TIME.H % 24), [remainingMs]);\n const remainingMinutes = React.useMemo(() => toStr(remainingMs / TIME.M % 60), [remainingMs]);\n\n return (\n \n \n \n \n \n );\n};\n\nexport default CountDown;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { Str } from '../../localization/translationKeys';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport CountDown from './CountDown';\nimport { COLORS } from '../../globalStyle/colors';\nimport { diffMs, TIME } from '../../language/time';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { HIDE_ON_MOBILE } from '../../globalStyle/mediaQueries';\nimport Msg from '../../localization/Msg';\nimport { faClock } from '@fortawesome/free-regular-svg-icons';\nimport { useAppState } from '../../core/redux/hooks';\n\n\nconst styles = {\n root: css`\n align-items: stretch;\n text-align: end;\n `,\n deadline: css`\n justify-content: flex-end;\n margin-bottom: 9px;\n `,\n deadlineTitle: css`\n font-weight: bold;\n `,\n countdown: css`\n flex-grow: 1;\n ${HIDE_ON_MOBILE};\n `,\n clockImg: css`\n font-size: 18px;\n margin-top: 6px; /* font has funny padding, this compensates the image to align with that */\n margin-left: 14px;\n margin-right: 14px;\n `,\n};\n\n\ntype Props = {\n deadline: string | Date | undefined;\n className?: string;\n};\n\nconst getColor = (\n deadline: string | Date | undefined,\n now: Date,\n): string => deadline && diffMs(deadline, now) > 0 && diffMs(deadline, now) < 2 * TIME.D ? COLORS.RED : COLORS.BLACK;\n\n\n/**\n * DeadlineCounter: a component that renders a deadline message along with a countdown. Text turns read when the\n * deadline is less than 2 days out.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst DeadlineCounter: React.FC = props => {\n const deadline = React.useMemo(() => new Date(props.deadline ?? new Date()), [props.deadline]);\n const [txtColor, setTxtColor] = React.useState(getColor(props.deadline, new Date()));\n\n const onTick = React.useCallback(\n () => setTxtColor(getColor(props.deadline, new Date())),\n [props.deadline, setTxtColor],\n );\n\n const code = useAppState(state => state.locale.lang.code);\n\n // Can't render a deadline that doesn't exist\n if (!props.deadline) {\n return null;\n }\n\n return (\n
\n {/* Deadline */}\n \n \n  {deadline.toLocaleDateString(code)}\n  {deadline.toLocaleTimeString(code)}\n \n\n {/* Time Remaining */}\n \n \n \n \n
\n );\n};\n\nexport default DeadlineCounter;\n","import * as React from 'react';\nimport LocalDiv from '../../localization/LocalDiv';\nimport DeadlineCounter from './DeadlineCounter';\nimport { css } from '@emotion/core';\nimport { FLEX_ROW } from '../../layout/flexBox';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faHome } from '@fortawesome/free-solid-svg-icons';\nimport { Link } from 'react-router-dom';\nimport { useRoutes } from '../../navigation/routes';\nimport { onMobileDevice } from '../../globalStyle/mediaQueries';\nimport { COLORS } from '../../globalStyle/colors';\nimport { useAppState } from '../../core/redux/hooks';\nimport LocalHTMLContainer from '../../localization/LocalHTMLContainer';\nimport { removeRedundantBackslashes } from '../../localization/removeRedundantBackslashes';\n\n\nconst styles = {\n root: css`\n align-items: center;\n justify-content: space-between;\n \n ${onMobileDevice} {\n flex-direction: column-reverse;\n }\n `,\n breadcrumb: css`\n align-items: baseline;\n margin-top: 20px;\n color: ${COLORS.DARK_GREY};\n \n ${onMobileDevice} {\n align-self: flex-start;\n }\n `,\n homeLink: css`\n text-decoration: none;\n color: ${COLORS.DARK_GREY};\n \n &:hover { \n opacity: .6;\n cursor:pointer;\n }\n `,\n homeImg: css`\n font-size: 18px;\n ${onMobileDevice} {\n font-size: 16px;\n }\n margin-bottom: 2px;\n `,\n title: css`\n font-weight: normal;\n font-size: 26px;\n ${onMobileDevice} {\n font-size: 18px;\n }\n margin: 0 5px;\n `,\n deadlineCounter: css`\n width: 200px;\n color: ${COLORS.DARK_GREY};\n \n ${onMobileDevice} {\n align-self: flex-end;\n }\n `,\n};\n\n\ntype Props = {\n title: string;\n deadline: string | Date | undefined;\n className?: string;\n};\n\n\n/**\n * SurveyHeader: a component that renders a link home, survey deadline and page title.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst SurveyHeader: React.FC = props => {\n const participantId = useAppState(state => state.auth.currentUser?.personId ?? -1);\n const projectId = useAppState(state => state.projectSummary?.displayProjectId ?? '');\n\n const routes = useRoutes(participantId, projectId);\n\n return (\n \n \n \n \n \n

\n \n

\n
\n\n \n
\n );\n};\n\nexport default SurveyHeader;\n","import * as React from 'react';\nimport { useBrowser } from '../language/useBrowser';\nimport { useProjIds } from '../navigation/hooks';\nimport { useRoutes } from '../navigation/routes';\nimport truScoreLogo from '../assets/logo_tbc.svg';\nimport hrdqLogo from '../assets/logo_hrdq.gif';\nimport zfLogo from '../assets/logo_zf.svg';\nimport talentSmartLogo from '../assets/logo_talentsmart.png';\nimport LocalDiv from '../localization/LocalDiv';\nimport { FLEX_COLUMN } from '../layout/flexBox';\nimport { css } from '@emotion/core';\nimport { Link } from 'react-router-dom';\nimport BulletedMsg from '../layout/BulletedMsg';\nimport { faCircle } from '@fortawesome/free-solid-svg-icons';\nimport { Str } from '../localization/translationKeys';\nimport AppActions from '../project/sideMenu/AppActions';\nimport Msg from '../localization/Msg';\nimport { COLORS } from '../globalStyle/colors';\nimport { useAppState } from '../core/redux/hooks';\n\n\nconst styles = {\n root: css`\n padding: 0 10px 15px;\n box-sizing: border-box;\n\n overflow-y: scroll;\n -ms-overflow-style: none; // IE-specific\n scrollbar-width: none; // Firefox-specific\n\n ::-webkit-scrollbar {\n width: 0;\n background: transparent;\n }\n `,\n logo: css`\n width: 184px;\n margin: 20px auto; \n padding: 0;\n `,\n appActions: css`\n margin-top: 15px;\n margin-bottom: 15px;\n `,\n footer: css`\n font-size: 11.5px;\n color: ${COLORS.MEDIUM_GREY};\n \n & > a { \n text-decoration: none;\n color: ${COLORS.BLUE}\n }\n \n & > a:hover { \n text-decoration: underline;\n }\n \n @supports (-webkit-touch-callout: none) {\n margin-bottom: 60px;\n }\n `,\n linkContainer: css`\n border: 1px solid ${COLORS.LIGHTER_GREY};\n border-radius: 8px;\n \n & > * {\n border-bottom: 1px solid ${COLORS.LIGHTER_GREY};\n }\n \n & > *:last-child {\n border-bottom: none;\n }\n `,\n link: css`\n display: block;\n padding: 18px 15px;\n text-decoration: none;\n \n &:hover {\n cursor: pointer;\n }\n `,\n inactiveLink: css`\n color: ${COLORS.MEDIUM_GREY};\n \n &:hover {\n background-color: ${COLORS.LIGHTEST_GREY};\n }\n `,\n activeLink: css`\n color: ${COLORS.DARK_GREY};\n background-color: ${COLORS.LIGHTER_GREY};\n \n &:hover {\n background-color: ${COLORS.LIGHTEST_GREY};\n }\n `,\n iconMediumGrey: css`\n font-size: 15px;\n color: ${COLORS.MEDIUM_GREY};\n `,\n iconGreen: css`\n font-size: 15px;\n color: ${COLORS.GREEN};\n `,\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\nconst activeLink = (route: string) => window.location.pathname.endsWith(route);\n\n// TODO - refactor common code out of `RaterApprovalMenu`, hoist props to implement for each flow\n/**\n * RaterApprovalMenu: a component that renders the contents of the side menu on report recipient pages.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportRecipientMenu: React.FC = props => {\n const { onIe } = useBrowser();\n\n const projIds = useProjIds();\n const routes = useRoutes(projIds.participantId, projIds.projDisplayId);\n\n const config = useAppState(state => state.config);\n const system = (config?.system || '').toLowerCase();\n const projectLogo = React.useMemo (\n () => system === 'zf'\n ? zfLogo\n : system === 'hrdq'\n ? hrdqLogo\n : system === 'talentsmart'\n ? talentSmartLogo\n : truScoreLogo // always default to TBC\n ,\n [system],\n ); \n\n return (\n \n {\n \n }\n\n {\n onIe\n ? (\n
\n Project Logo\n
\n )\n : (\n Project Logo\n )\n }\n\n {/* Links */}\n
\n \n \n \n
\n\n {/* Options */}\n \n\n {/* Footer: Copyright/Privacy Policy */}\n \n
\n );\n};\n\nexport default ReportRecipientMenu;\n","import * as React from 'react';\nimport DashboardLayout from '../layout/DashboardLayout';\nimport { SerializedStyles } from '@emotion/core';\nimport ReportRecipientMenu from './ReportRecipientMenu';\n\n\ntype Props = {\n children: React.ReactNode;\n floatMenu?: boolean;\n className?: string;\n contentStyle?: SerializedStyles;\n};\n\n\n/**\n * ReportRecipientLayout: a component that renders the root layout of report recipient pages with the side menu\n * containing recipient area links and the main content area.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportRecipientLayout: React.FC = props => (\n }>\n {props.children}\n \n);\n\nexport default ReportRecipientLayout;\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport { css } from '@emotion/core';\nimport { Link, useHistory } from 'react-router-dom';\nimport BulletedMsg from '../../layout/BulletedMsg';\nimport { faHome, faCheckCircle, faHistory } from '@fortawesome/free-solid-svg-icons';\nimport { Str } from '../../localization/translationKeys';\nimport { Routes } from '../../navigation/routes';\nimport { COLORS } from '../../globalStyle/colors';\nimport { faCircle as faCircleHollow } from '@fortawesome/free-regular-svg-icons/faCircle';\nimport { faCircle as faCircleSolid } from '@fortawesome/free-solid-svg-icons/faCircle';\nimport { ParticipantProject } from '../models';\nimport { useAppState } from '../../core/redux/hooks';\nimport { pathCombine } from '../../core/api/module';\nimport { BaseUrl } from '../../core/api/endpoints';\n\n\nconst styles = {\n root: css`\n border: 1px solid ${COLORS.LIGHTER_GREY};\n border-radius: 8px;\n \n & > * {\n border-bottom: 1px solid ${COLORS.LIGHTER_GREY};\n }\n \n & > *:last-child {\n border-bottom: none;\n }\n `,\n link: css`\n display: block;\n padding: 18px 15px;\n text-decoration: none;\n \n &:hover {\n cursor: pointer;\n }\n `,\n stepLink: css`\n color: ${COLORS.MEDIUM_GREY};\n \n &:hover {\n background-color: ${COLORS.LIGHTEST_GREY};\n }\n `,\n activeLink: css`\n color: ${COLORS.DARK_GREY};\n background-color: ${COLORS.LIGHTER_GREY};\n \n &:hover {\n background-color: ${COLORS.LIGHTEST_GREY};\n }\n `,\n disabledLink: css`\n opacity: .4;\n border-bottom: 1px solid ${COLORS.LIGHT_GREY};\n `,\n iconBlue: css`\n font-size: 15px;\n color: ${COLORS.BLUE};\n `,\n iconGreen: css`\n font-size: 15px;\n color: ${COLORS.GREEN};\n `,\n iconMediumGrey: css`\n font-size: 15px;\n color: ${COLORS.MEDIUM_GREY};\n `,\n iconDarkGrey: css`\n font-size: 15px;\n color: ${COLORS.DARK_GREY};\n `,\n};\n\n\nconst activeLink = (route: string) => (\n window.location.pathname.endsWith(route)\n);\n\nconst iconFor = (\n nextStep: boolean,\n started: boolean,\n complete: boolean,\n) => (\n complete\n ? faCheckCircle\n : nextStep\n ? faCircleSolid\n : started\n ? faHistory\n : faCircleHollow\n);\n\nconst iconColorFor = (\n nextStep: boolean,\n started: boolean,\n complete: boolean,\n active: boolean,\n) => (\n complete\n ? styles.iconBlue\n : nextStep || started\n ? styles.iconGreen\n : active\n ? styles.iconDarkGrey\n : styles.iconMediumGrey\n);\n\ntype Props = {\n routes: Routes;\n proj: ParticipantProject | undefined;\n participantId: number;\n className?: string;\n};\n\n\n/**\n * ProjectSteps: a component that displays menu items\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ProjectSteps: React.FC = props => {\n const project = props.proj;\n const routes = props.routes;\n\n const requirements = useAppState(state => state.participantRequirements);\n const requirementsMet = useMemo(\n () => (requirements || []).length > 0 && requirements?.every(s => s.invitedCount >= s.minimumRequired),\n [requirements],\n );\n\n /* memoize all the project settings */\n const followupSurveyStep = useMemo(() => project?.followupSurveyStep, [project]);\n const followupSurveyStarted = useMemo(() => project?.followupSurveyStarted, [project]);\n const followupSurveyCreated = useMemo(() => project?.followupSurveyCreated, [project]);\n const inviteRatersStep = useMemo(() => project?.inviteRatersStep, [project]);\n const approval = useMemo(() => project?.inviteRatersRaterApprovalOption, [project]);\n const raterInvited = useMemo(() => project?.raterInvited, [project]);\n const sentForApproval = useMemo(() => project?.approverEmailSent, [project]);\n const selfSurveyStep = useMemo(() => project?.selfSurveyStep, [project]);\n const selfSurveyInProgress = useMemo(() => (project?.selfSurveyAmountComplete ?? 0) > 0, [project]);\n const selfSurveyCompleted = useMemo(() => project?.selfSurveyCompleted, [project]);\n const setGoalsStep = useMemo(() => project?.setGoalsStep, [project]);\n const setGoalsAmountComplete = useMemo(() => project?.setGoalsAmountComplete, [project]);\n const viewReportStep = useMemo(() => project?.viewReportStep, [project]);\n const reportAvailable = useMemo(() => project?.reportAvailable, [project]);\n const devPlanInteractive = useMemo(() => project?.developmentPlanUseInteractive, [project]);\n const devPlanStaticUrl = useMemo(() => project?.developmentPlanPageUrl, [project]);\n const developmentPlanStep = useMemo(() => project?.developmentPlanStep, [project]);\n const devPlanAmountComplete = useMemo(() => project?.devPlanAmountComplete, [project]);\n const developmentPlanEmailLevelId = useMemo(() => project?.developmentPlanEmailLevelId, [project]);\n const developmentPlanGoalsToTrack = useMemo(() => project?.developmentPlanGoalsToTrack, [project]);\n const devPlanEmailSent = useMemo(() => project?.devPlanEmailSent, [project]);\n const devPlanItemCount = useMemo(() => project?.devPlanItemCount, [project]);\n const devPlanViewed = useAppState(state => state.devPlan?.viewed ?? false);\n const pastDue = useMemo(() => project?.surveyPastDue, [project]);\n const passkeyExpired = useMemo(() => project?.passkeyExpired, [project]);\n\n const history = useHistory();\n\n const lowerCasePath = history.location.pathname.toLowerCase();\n const viewReportActive = lowerCasePath.indexOf(routes.FeedbackReport.toLowerCase()) > -1;\n\n const inviteStarted = useMemo(\n () => approval ? sentForApproval : raterInvited,\n [approval, sentForApproval, raterInvited],\n );\n\n /* Create Survey */\n const createSurveyNextStep = useMemo(\n () => followupSurveyStep && !followupSurveyStarted,\n [followupSurveyStep, followupSurveyStarted],\n );\n /* Invite Raters */\n const inviteRatersNextStep = useMemo(\n () => !createSurveyNextStep\n && inviteRatersStep && !inviteStarted,\n [createSurveyNextStep, inviteRatersStep, inviteStarted],\n );\n const inviteRatersDisabled = useMemo(\n () => followupSurveyStep && !followupSurveyCreated,\n [followupSurveyStep, followupSurveyCreated],\n );\n const inviteRatersComplete = useMemo(\n () => inviteStarted && requirementsMet,\n [inviteStarted, requirementsMet],\n );\n /* Self Survey */\n const selfSurveyNextStep = useMemo(\n () => !createSurveyNextStep && !inviteRatersNextStep\n && selfSurveyStep && !selfSurveyInProgress,\n [\n createSurveyNextStep,\n inviteRatersNextStep,\n selfSurveyStep,\n selfSurveyInProgress,\n ],\n );\n const selfSurveyDisabled = useMemo(\n () => passkeyExpired\n || (followupSurveyStep && !followupSurveyCreated)\n || selfSurveyCompleted!,\n [\n passkeyExpired,\n followupSurveyStep,\n followupSurveyCreated,\n selfSurveyCompleted,\n ],\n );\n /* Set Goals */\n const setGoalsNextStep = useMemo(\n () => !createSurveyNextStep && !inviteRatersNextStep && !selfSurveyNextStep\n && setGoalsStep && (setGoalsAmountComplete || 0) === 0,\n [\n createSurveyNextStep,\n inviteRatersNextStep,\n selfSurveyNextStep,\n setGoalsStep,\n setGoalsAmountComplete,\n ],\n );\n /* DevPlan */\n const noDevPlanRequirements = useMemo(\n () => developmentPlanEmailLevelId === 0\n && developmentPlanGoalsToTrack === 0,\n [developmentPlanEmailLevelId, developmentPlanGoalsToTrack],\n );\n const devPlanStarted = useMemo(\n () => followupSurveyStep\n ? devPlanViewed\n : noDevPlanRequirements\n ? devPlanEmailSent || devPlanItemCount! > 0\n : devPlanAmountComplete! > 0,\n [\n noDevPlanRequirements,\n devPlanEmailSent,\n devPlanItemCount,\n devPlanAmountComplete,\n devPlanViewed,\n followupSurveyStep,\n ],\n );\n const devPlanNextStep = useMemo(\n () => !createSurveyNextStep && !inviteRatersNextStep && !selfSurveyNextStep\n && !setGoalsNextStep && reportAvailable\n && developmentPlanStep && !devPlanStarted,\n [\n createSurveyNextStep,\n inviteRatersNextStep,\n selfSurveyNextStep,\n setGoalsNextStep,\n reportAvailable,\n developmentPlanStep,\n devPlanStarted,\n ],\n );\n const devPlanComplete = useMemo(\n () => followupSurveyStep\n ? devPlanViewed\n : noDevPlanRequirements && devPlanAmountComplete === 1 && devPlanStarted\n ,\n [noDevPlanRequirements, devPlanAmountComplete, devPlanStarted, followupSurveyStep, devPlanViewed],\n );\n\n const staticDevPlanUrl = useMemo(\n () => {\n const staticUrl = devPlanStaticUrl || '';\n if (staticUrl === '') {\n return '#';\n }\n if (staticUrl.toLowerCase().startsWith('http')) {\n return staticUrl\n }\n const baseUrl = BaseUrl.substring(0, BaseUrl.length - 4); // ends with '/api'\n const lcUrl = staticUrl.toLowerCase();\n\n return lcUrl.startsWith('developmentplans/') || lcUrl.startsWith('resources/')\n ? pathCombine(baseUrl, staticUrl)\n : pathCombine(baseUrl, 'DevelopmentPlans/', staticUrl)\n },\n [devPlanStaticUrl],\n );\n\n return (\n
\n \n \n \n\n {\n (followupSurveyStep) && (\n \n \n \n )\n } {\n (inviteRatersStep) && (\n \n \n \n )\n }\n {\n (selfSurveyStep) && (\n \n \n \n )\n }\n {\n (setGoalsStep) && (\n \n 0,\n setGoalsAmountComplete! === 1,\n )\n }\n msg={Str.SetGoals}\n iconStyle={\n iconColorFor(\n setGoalsNextStep!,\n setGoalsAmountComplete! > 0,\n setGoalsAmountComplete! === 1,\n activeLink(routes.SetGoals),\n )\n }\n spacePx={14}\n />\n \n )\n }\n\n {\n (viewReportStep) && (\n viewReportActive && window.location.reload()}\n css={[\n styles.link,\n activeLink(routes.FeedbackReport) ? styles.activeLink : styles.stepLink,\n !reportAvailable && styles.disabledLink,\n ]}\n >\n \n \n )\n }\n {\n (developmentPlanStep) && (\n devPlanInteractive \n ? \n \n \n : \n \n \n )\n }\n
\n );\n};\n\nexport default ProjectSteps;\n","export enum KnownResources {\n DevResources = 'Development Resources',\n Tutorial = 'Report Interpretation Tutorial',\n EBook = 'VitalSource EBook'\n}\n\n\nexport interface CustomResource {\n projectId: number;\n introTextMessageId: number;\n bodyTextMessageId: number;\n nameMessageId: number;\n introText: string;\n bodyText: string;\n nameText: string;\n}\n\nexport interface DevResource {\n surveyId: number;\n competencyId: number;\n parentCompetencyId: number;\n level: number;\n name: string;\n acronym: string;\n interpreted: boolean;\n visibilityOn: boolean;\n order: number;\n description: string;\n scoreHighMessage: string;\n scoreLowMessage: string;\n developmentTips: string;\n instructions: string;\n letterCode: string;\n}\n","import { CustomResource, KnownResources } from './models';\n\n\n/**\n * Curried function, returns a predicate that checks whether or not the given resource is of the given type AKA \"name\"\n */\nexport const isSpecificResource = (\n resourceName: string,\n) => (\n resource: CustomResource,\n): boolean => resource.nameText.toLowerCase() === resourceName.toLowerCase();\n\n\nexport const isDevResources = isSpecificResource(KnownResources.DevResources);\nexport const isTutorialResource = isSpecificResource(KnownResources.Tutorial);\nexport const isEBookResource = isSpecificResource(KnownResources.EBook);\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { Str } from '../../localization/translationKeys';\nimport Msg from '../../localization/Msg';\nimport { COLORS } from '../../globalStyle/colors';\nimport { Routes } from '../../navigation/routes';\nimport { CustomResource } from '../resources/models';\nimport { isDevResources, isTutorialResource, isEBookResource } from '../resources/module';\nimport { Link } from 'react-router-dom';\nimport BulletedMsg from '../../layout/BulletedMsg';\nimport { faBook } from '@fortawesome/free-solid-svg-icons';\n\n\nconst styles = {\n root: css`\n \n `,\n title: css`\n display: block;\n font-size: 11px;\n color: ${COLORS.DARK_GREY};\n margin-bottom: 8px;\n text-transform: uppercase;\n `,\n resourceLinks: css`\n border: 1px solid ${COLORS.LIGHTER_GREY};\n border-radius: 8px;\n \n & > * {\n border-bottom: 1px solid ${COLORS.LIGHTER_GREY};\n }\n \n & > *:last-child {\n border-bottom: none;\n }\n `,\n resourceLink: css`\n display: block;\n color: ${COLORS.MEDIUM_GREY};\n text-decoration: none;\n padding: 18px 15px;\n \n &:hover {\n background-color: ${COLORS.LIGHTEST_GREY};\n }\n `,\n linkIcon: css`\n font-size: 15px;\n `,\n};\n\nconst renderResource = (\n routes: Routes,\n resource: CustomResource): React.ReactNode => {\n if (isDevResources(resource)) {\n return (\n \n \n \n );\n }\n\n if (isEBookResource(resource)) {\n return (\n \n \n \n );\n }\n\n if (isTutorialResource(resource)) {\n return (\n \n \n \n );\n }\n\n return (\n \n \n \n );\n};\n\n\ntype Props = {\n routes: Routes;\n resources: CustomResource[];\n className?: string;\n};\n\n\n/**\n * ResourceMenu: a component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ResourceMenu: React.FC = props => (\n
\n \n
\n {\n props.resources.map(res => renderResource(props.routes, res))\n }\n
\n
\n);\n\nexport default ResourceMenu;\n","import * as React from 'react';\nimport { Link, LinkProps } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { AppState } from '../core/redux/appState';\nimport { TextDirection } from './textDirection';\nimport { strictEquals } from '../language/module';\n\n\ninterface Props extends LinkProps {\n forceDirection?: TextDirection;\n}\n\n\n/**\n * LocalLink: a component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst LocalLink: React.FC = props => {\n const { forceDirection, ...rest } = props;\n\n const layoutDirection = useSelector(\n state => state.locale.textDirection,\n strictEquals,\n );\n\n return (\n \n {props.children}\n \n );\n};\n\nexport default LocalLink;\n","import * as React from 'react';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { css } from '@emotion/core';\nimport { FLEX_COLUMN } from '../../layout/flexBox';\n//TODO - at some point, delete '../assets/logo.svg';\nimport truScoreLogo from '../../assets/logo_tbc.svg';\nimport hrdqLogo from '../../assets/logo_hrdq.gif';\nimport zfLogo from '../../assets/logo_zf.png';\nimport talentSmartLogo from '../../assets/logo_talentsmart.png';\nimport { COLORS } from '../../globalStyle/colors';\nimport Msg from '../../localization/Msg';\nimport { Str } from '../../localization/translationKeys';\nimport { useRoutes } from '../../navigation/routes';\nimport { useAppState } from '../../core/redux/hooks';\nimport AppActions from './AppActions';\nimport ProjectSteps from './ProjectSteps';\nimport ResourceMenu from './ResourceMenu';\nimport { SELECT } from '../../forms/styles/select';\nimport { addImgEncoding } from '../../language/module';\nimport { useBrowser } from '../../language/useBrowser';\nimport LocalLink from '../../localization/LocalLink';\nimport { useProjIds } from '../../navigation/hooks';\nimport Spacer from '../../layout/Spacer';\n\n\nconst styles = {\n root: css`\n align-items: stretch;\n padding: 0 10px 15px;\n height: 100%;\n box-sizing: border-box;\n\n overflow-y: scroll;\n -ms-overflow-style: none; // IE-specific\n scrollbar-width: none; // Firefox-specific\n\n ::-webkit-scrollbar {\n width: 0;\n background: transparent;\n }\n `,\n logo: css`\n width: 184px;\n margin: 20px auto; \n padding: 0;\n `,\n projectSelect: css`\n height: 48px;\n flex-basis: 48px;\n flex-shrink: 0;\n margin: 0 -10px;\n border-radius: 0;\n border-color: ${COLORS.LIGHTER_GREY};\n background-color: transparent;\n text-decoration: none;\n `,\n mockSelectDiv: css`\n border-top: 0 none;\n justify-content: center;\n padding: 0 15px;\n border-bottom: 1px solid ${COLORS.LIGHTER_GREY};\n border-right: 1px solid ${COLORS.LIGHTER_GREY};\n `,\n mockSelectSpan: css`\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n realSelect: css`\n padding: 0 20px;\n \n &:hover { \n color: ${COLORS.BLUE};\n }\n `,\n spacer: css`\n flex-basis: 30px;\n flex-shrink: 0;\n `,\n projectResources: css`\n margin-bottom: 60px;\n `,\n appActions: css`\n margin-top: auto;\n margin-bottom: 15px;\n `,\n footer: css`\n font-size: 11.5px;\n color: ${COLORS.MEDIUM_GREY};\n \n & > a { \n text-decoration: none;\n color: ${COLORS.BLUE}\n }\n \n & > a:hover { \n text-decoration: underline;\n }\n \n @supports (-webkit-touch-callout: none) {\n margin-bottom: 60px;\n }\n `,\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * ProjectMenu: a component that renders the contents of the side menu on project pages -- survey steps, project name\n * etc.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ProjectMenu: React.FC = props => {\n const { onIe } = useBrowser();\n\n const projIds = useProjIds();\n const projects = useAppState(state => state.projects || []);\n const project = useAppState(state => state.projectSummary);\n const resources = useAppState(state => state.projectResources || []);\n\n const routes = useRoutes(projIds.participantId, projIds.projDisplayId);\n\n const config = useAppState(state => state.config);\n const system = (config?.system || '').toLowerCase();\n const defaultLogo = React.useMemo (\n () => system === 'zf'\n ? zfLogo\n : system === 'hrdq'\n ? hrdqLogo\n : system === 'talentsmart'\n ? talentSmartLogo\n : truScoreLogo // always default to TBC\n ,\n [system],\n );\n\n const projectLogo = React.useMemo(\n () => project?.clientImageData ? addImgEncoding(project.clientImageData) : defaultLogo,\n [project, defaultLogo],\n );\n\n if (!project) {\n return
;\n }\n\n return (\n \n { // Survey Select\n projects.length > 1\n ? (\n \n {project?.surveyName || projects[0]?.surveyName}\n \n )\n : (\n
\n {project?.surveyName || projects[0]?.surveyName}\n
\n )\n }\n\n {\n /* Project Logo */\n onIe\n ? (\n
\n Project Logo\n
\n )\n : (\n Project Logo\n )\n }\n\n {/* Links */}\n \n\n {/* Spacer */}\n \n\n { // Resources\n !!resources?.length && (\n \n )\n }\n\n {/* Options */}\n \n\n {/* Footer: Copyright/Privacy Policy */}\n \n
\n );\n};\n\nexport default ProjectMenu;\n","import * as React from 'react';\nimport { SerializedStyles } from '@emotion/core';\nimport ProjectMenu from './sideMenu/ProjectMenu';\nimport DashboardLayout from '../layout/DashboardLayout';\nimport { useProjIds } from '../navigation/hooks';\n\n\ntype Props = {\n children: React.ReactNode;\n floatMenu?: boolean;\n className?: string;\n contentStyle?: SerializedStyles;\n};\n\n\n/**\n * ProjectLayout: a component that renders the root layout of project pages with the side menu containing project links\n * and the main content area. Pass your page content as this component's children.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ProjectLayout: React.FC = props => {\n const projIds = useProjIds();\n\n return (\n } key={projIds.projDisplayId}>\n {props.children}\n \n );\n};\n\n\nexport default ProjectLayout;\n","import * as React from 'react';\nimport { Link } from 'react-router-dom';\nimport BulletedMsg from '../../../../layout/BulletedMsg';\nimport { faQuestionCircle } from '@fortawesome/free-solid-svg-icons';\nimport { Str } from '../../../../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../../../globalStyle/colors';\n\n\nconst styles = {\n root: css`\n padding: 20px;\n border-radius: 8px;\n background-color: ${COLORS.LIGHTER_GREY};\n \n & > * {\n display: block;\n margin-bottom: 10px;\n }\n \n & > *:last-child {\n margin-bottom: 0;\n }\n `,\n option: css`\n font-size: 12px;\n color: ${COLORS.DARK_GREY} !important;\n \n &:hover { \n cursor: pointer;\n color: ${COLORS.BLUE} !important;\n }\n `,\n optionIcon: css`\n font-size: 20px;\n `,\n silentLink: css`\n text-decoration: none;\n `,\n};\n\n\ntype Props = {\n className?: string;\n customerServiceUrl: string;\n};\n\n\n/**\n * CollaboratorAppActions: a component that renders the list of actions in the side menu for the collaborator view\n * (currently customer service)\n */\nconst CollaboratorAppActions: React.FC = ({ className, customerServiceUrl }) => (\n
\n \n \n \n
\n);\n\nexport default CollaboratorAppActions;\n","import * as React from 'react';\nimport { Link } from 'react-router-dom';\nimport BulletedMsg from '../../../../layout/BulletedMsg';\nimport { Str } from '../../../../localization/translationKeys';\nimport { Routes } from '../../../../navigation/routes';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../../../globalStyle/colors';\nimport { faCircle as faCircleSolid } from '@fortawesome/free-solid-svg-icons/faCircle';\n\n\nconst styles = {\n root: css`\n border: 1px solid ${COLORS.LIGHTER_GREY};\n border-radius: 8px;\n \n & > * {\n border-bottom: 1px solid ${COLORS.LIGHTER_GREY};\n }\n \n & > *:last-child {\n border-bottom: none;\n }\n `,\n link: css`\n display: block;\n padding: 18px 15px;\n text-decoration: none;\n \n &:hover {\n cursor: pointer;\n }\n `,\n stepLink: css`\n color: ${COLORS.MEDIUM_GREY};\n \n &:hover {\n background-color: ${COLORS.LIGHTEST_GREY};\n }\n `,\n activeLink: css`\n color: ${COLORS.DARK_GREY};\n background-color: ${COLORS.LIGHTER_GREY};\n \n &:hover {\n background-color: ${COLORS.LIGHTEST_GREY};\n }\n `,\n iconGreen: css`\n font-size: 15px;\n color: ${COLORS.GREEN};\n `,\n};\n\n\ntype Props = {\n routes: Routes;\n className?: string;\n};\n\n\nconst activeLink = (route: string) => (\n window.location.pathname.endsWith(route)\n);\n\n\n/**\n * CollaboratorProjectSteps: a component that displays menu items for collaborators (currently just a link back to the\n * dev plan)\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CollaboratorProjectSteps: React.FC = ({ routes, className }) => (\n
\n \n \n \n
\n);\n\nexport default CollaboratorProjectSteps;\n","import * as React from 'react';\nimport LocalDiv from '../../../../localization/LocalDiv';\nimport { FLEX_COLUMN } from '../../../../layout/flexBox';\nimport Spacer from '../../../../layout/Spacer';\nimport Msg from '../../../../localization/Msg';\nimport { Str } from '../../../../localization/translationKeys';\nimport { useAppState } from '../../../../core/redux/hooks';\nimport zfLogo from '../../../../assets/logo_zf.png';\nimport hrdqLogo from '../../../../assets/logo_hrdq.gif';\nimport talentSmartLogo from '../../../../assets/logo_talentsmart.png';\nimport truScoreLogo from '../../../../assets/logo.svg';\nimport { css } from '@emotion/core';\nimport { useBrowser } from '../../../../language/useBrowser';\nimport { addImgEncoding } from '../../../../language/module';\nimport { useRoutes } from '../../../../navigation/routes';\nimport { useCollaborationProjIds } from '../hooks';\nimport CollaboratorAppActions from './CollaboratorAppActions';\nimport { COLORS } from '../../../../globalStyle/colors';\nimport CollaboratorProjectSteps from './CollaboratorProjectSteps';\n\n\nconst styles = {\n root: css`\n align-items: stretch;\n padding: 0 10px 15px;\n height: 100%;\n box-sizing: border-box;\n\n overflow-y: scroll;\n -ms-overflow-style: none; // IE-specific\n scrollbar-width: none; // Firefox-specific\n\n ::-webkit-scrollbar {\n width: 0;\n background: transparent;\n }\n `,\n logo: css`\n width: 184px;\n margin: 20px auto; \n padding: 0;\n `,\n spacer: css`\n flex-basis: 30px;\n flex-shrink: 0;\n `,\n appActions: css`\n margin-top: auto;\n margin-bottom: 15px;\n `,\n footer: css`\n font-size: 11.5px;\n color: ${COLORS.MEDIUM_GREY};\n \n & > a { \n text-decoration: none;\n color: ${COLORS.BLUE}\n }\n \n & > a:hover { \n text-decoration: underline;\n }\n \n @supports (-webkit-touch-callout: none) {\n margin-bottom: 60px;\n }\n `,\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * CollaboratorMenu: a component that renders the contents of the side menu on project pages in the collaborator view\n */\nconst CollaboratorMenu: React.FC = ({ className }) => {\n const { onIe } = useBrowser();\n\n const project = useAppState(state => state.projectSummary);\n\n const projIds = useCollaborationProjIds();\n const routes = useRoutes(projIds.participantId, projIds.projDisplayId);\n\n const config = useAppState(state => state.config);\n const system = (config?.system || '').toLowerCase();\n const defaultLogo = React.useMemo(\n () => system === 'zf'\n ? zfLogo\n : system === 'hrdq'\n ? hrdqLogo\n : system === 'talentsmart'\n ? talentSmartLogo\n : truScoreLogo // always default to TBC\n ,\n [system],\n );\n\n const projectLogo = React.useMemo(\n () => project?.clientImageData ? addImgEncoding(project.clientImageData) : defaultLogo,\n [project, defaultLogo],\n );\n\n if (!project) {\n return
;\n }\n\n return (\n \n {\n /* Project Logo */\n onIe\n ? (\n
\n Project Logo\n
\n )\n : (\n Project Logo\n )\n }\n\n {/* Links */}\n \n\n {/* Spacer */}\n \n\n {/* Options */}\n \n\n {/* Footer: Copyright/Privacy Policy */}\n \n
\n );\n};\n\nexport default CollaboratorMenu;\n","import * as React from 'react';\nimport DashboardLayout from '../../../layout/DashboardLayout';\nimport CollaboratorMenu from './sideMenu/CollaboratorMenu';\nimport { SerializedStyles } from '@emotion/core';\n\n\ntype Props = {\n children: React.ReactNode;\n floatMenu?: boolean;\n className?: string;\n contentStyle?: SerializedStyles;\n};\n\n\n/**\n * CollaboratorLayout: a component that renders the root layout of collaborator pages with the side menu containing a\n * a dev plan link and the main content area. Pass your collaborator view page content as this component's children.\n */\nconst CollaboratorLayout: React.FC = props => (\n }>\n {props.children}\n \n);\n\nexport default CollaboratorLayout;\n","import * as React from 'react';\nimport { SerializedStyles } from '@emotion/core';\nimport RaterApprovalLayout from '../raterApproval/RaterApprovalLayout';\nimport ReportRecipientLayout from '../reportRecipient/ReportRecipientLayout';\nimport ProjectLayout from '../project/ProjectLayout';\nimport { PortalType } from '../navigation/portalType';\nimport { usePortalType } from '../auth/hooks';\nimport CollaboratorLayout from '../project/devPlan/collaboration/CollaboratorLayout';\n\n\ntype Props = {\n children: React.ReactNode;\n floatMenu?: boolean;\n className?: string;\n contentStyle?: SerializedStyles;\n}\n\n\nconst renderLayout = (props: Props, portalType?: PortalType) => {\n switch (portalType) {\n case PortalType.RATER_APPROVAL:\n return (\n \n {props.children}\n \n );\n case PortalType.REPORT_RECIPIENT:\n return (\n \n {props.children}\n \n );\n case PortalType.COLLABORATOR:\n return (\n \n {props.children}\n \n );\n default:\n return (\n \n {props.children}\n \n );\n }\n};\n\n\n/**\n * PortalAutoLayout: a component that sets the proper page layout based on which portal the user is currently logged in\n * to.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst PortalAutoLayout: React.FC = props => {\n const portalType = usePortalType();\n\n return (\n <>\n {renderLayout(props, portalType)}\n \n );\n};\n\nexport default PortalAutoLayout;\n","import * as React from 'react';\nimport SurveyHeader from '../project/survey/SurveyHeader';\nimport { useMsgText } from '../localization/hooks';\nimport { Str } from '../localization/translationKeys';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\nimport { css } from '@emotion/core';\nimport LocalBtn from '../localization/LocalBtn';\nimport { btnStyle } from '../forms/styles/button';\nimport { COLORS } from '../globalStyle/colors';\nimport Msg from '../localization/Msg';\nimport { useAppState } from '../core/redux/hooks';\nimport { useHistory } from 'react-router-dom';\nimport { useRoutes } from '../navigation/routes';\nimport LocalDiv from '../localization/LocalDiv';\nimport { useProjIds, useRaterApprovalIds } from '../navigation/hooks';\nimport PortalAutoLayout from '../layout/PortalAutoLayout';\nimport { PortalType } from '../navigation/portalType';\n\n\nconst styles = {\n content: css`\n margin-top: 57px;\n ${onMobileDevice} {\n margin-top: 20px;\n }\n `,\n header: css`\n ${onMobileDevice} {\n margin-top: 37px;\n } \n `,\n labels: {\n title: css`\n font-weight: bold;\n `,\n value: css`\n margin-bottom: 20px;\n `,\n },\n buttons: {\n button: css`\n min-width: 250px;\n margin-top: 10px;\n `,\n },\n};\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * Account: a component that shows current account information\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst Account: React.FC = props => {\n const history = useHistory();\n\n const pageTitle = useMsgText(Str.Account);\n\n const user = useAppState(state => state.auth.currentUser);\n \n const lowerCasePath = history.location.pathname.toLowerCase();\n const raterApproval = lowerCasePath.indexOf(PortalType.RATER_APPROVAL.toLowerCase()) > -1;\n const reportRecipient = lowerCasePath.indexOf(PortalType.REPORT_RECIPIENT.toLowerCase()) > -1;\n\n const projIds = useProjIds();\n const routeIds = useRaterApprovalIds();\n\n const projectId = raterApproval ? routeIds.projDisplayId : projIds.projDisplayId;\n const participantId = raterApproval ? routeIds.participantId : projIds.participantId;\n\n const routes = useRoutes(participantId, projectId);\n\n const passwordClicked = React.useCallback(\n () =>\n history.push(\n raterApproval\n ? routes.RaterApprovalChangePassword\n : reportRecipient\n ? routes.ReportRecipientChangePassword\n : routes.ChangePassword,\n ),\n [\n history,\n raterApproval,\n reportRecipient,\n routes.ChangePassword,\n routes.RaterApprovalChangePassword,\n routes.ReportRecipientChangePassword,\n ],\n );\n\n const questionClicked = React.useCallback(\n () =>\n history.push(\n raterApproval\n ? routes.RaterApprovalChangeSecurityQuestion\n : reportRecipient\n ? routes.ReportRecipientChangeSecurityQuestion\n : routes.ChangeSecurityQuestion,\n ),\n [\n history,\n raterApproval,\n reportRecipient,\n routes.ChangeSecurityQuestion,\n routes.RaterApprovalChangeSecurityQuestion,\n routes.ReportRecipientChangeSecurityQuestion,\n ],\n );\n\n return (\n \n \n \n \n
\n {user?.personName}\n
\n \n
\n {user?.clientName}\n
\n \n
\n {user?.userName}\n
\n
\n passwordClicked()}\n />\n
\n
\n questionClicked()}\n />\n
\n
\n
\n );\n};\n\nexport default Account;\n","import * as React from 'react';\nimport { useMsgText } from '../localization/hooks';\nimport { Str } from '../localization/translationKeys';\nimport SurveyHeader from '../project/survey/SurveyHeader';\nimport Msg from '../localization/Msg';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\nimport { css } from '@emotion/core';\nimport { PLAIN_BLUE_LINKS } from '../forms/styles/links';\nimport LocalDiv from '../localization/LocalDiv';\nimport PortalAutoLayout from '../layout/PortalAutoLayout';\n\n\nconst styles = {\n content: css`\n margin-top: 57px;\n ${onMobileDevice} {\n margin-top: 20px;\n }\n `,\n header: css`\n ${onMobileDevice} {\n margin-top: 37px;\n } \n `,\n labels: {\n title: css`\n font-weight: bold;\n `,\n value: css`\n margin-bottom: 20px;\n `,\n },\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * CustomerService: a component that shows customer service information\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CustomerService: React.FC = props => {\n const pageTitle = useMsgText(Str.CustomerService);\n\n return (\n \n \n \n \n
\n \n
\n \n
\n \n
\n \n
\n \n
\n
\n
\n );\n};\n\nexport default CustomerService;\n","import * as React from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLDivElement> {\n show?: any;\n}\n\n\n/**\n * ClamShell: a component that renders its children in/out with an expanding/collapsing animation.\n * If you want to add margin to the clamshell component, you'll want to wrap the children you're giving it in another\n * div, and give padding to that div. Margin doesn't animate well, unfortunately.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ClamShell: React.FC = props => {\n const { show, ...rest } = props;\n\n return (\n \n {\n !!props.show && (\n \n )\n }\n \n );\n};\n\nexport default ClamShell;\n","import * as React from 'react';\nimport { css, SerializedStyles } from '@emotion/core';\nimport LocalDiv from './LocalDiv';\nimport { FLEX_ROW } from '../layout/flexBox';\nimport { COLORS } from '../globalStyle/colors';\nimport { btnStyle } from '../forms/styles/button';\nimport Msg from './Msg';\nimport { Str } from './translationKeys';\nimport Spacer from '../layout/Spacer';\n\n\nconst styles = {\n root: css`\n justify-content: space-between;\n align-items: center;\n padding: 10px 20px;\n border-radius: 10px; \n font-size: 12px;\n color: ${COLORS.WHITE}; \n background-color: ${COLORS.GREEN}; \n `,\n button: css`\n font-size: 12px;\n min-width: 152px;\n `,\n};\n\ntype Props = {\n msg: Str | string | number | undefined;\n\n showBtn?: boolean;\n btnStyle?: SerializedStyles;\n btnMsg?: Str;\n onClick?: () => void;\n\n className?: string;\n};\n\n\n/**\n * ActionMsg: a component that shows an RTL/LTR-friendly message in a box with an optional button.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ActionMsg: React.FC = props => (\n \n \n {\n props.showBtn && \n }\n {\n props.showBtn && (\n \n \n \n )\n }\n \n);\n\nexport default ActionMsg;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport ClamShell from '../layout/ClamShell';\nimport ActionMsg from '../localization/ActionMsg';\nimport { Str } from '../localization/translationKeys';\nimport { COLORS } from '../globalStyle/colors';\n\n\nconst styles = {\n root: css`\n background-color: ${COLORS.RED};\n `,\n button: css`\n min-width: 80px;\n `,\n};\n\n\ntype Props = {\n error: Str | string | number | undefined;\n showRetry?: boolean;\n onRetry?: () => void;\n className?: string;\n};\n\n\n/**\n * ErrorMsg: a component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ErrorMsg: React.FC = props => (\n \n \n \n);\n\nexport default ErrorMsg;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport Modal from '../layout/modal/Modal';\nimport ModalHeader from '../layout/modal/ModalHeader';\nimport { useHistory } from 'react-router-dom';\nimport { useMsgText } from '../localization/hooks';\nimport { Str } from '../localization/translationKeys';\nimport LocalDiv from '../localization/LocalDiv';\nimport { FLEX_COLUMN, FLEX_ROW } from '../layout/flexBox';\nimport { COLORS } from '../globalStyle/colors';\nimport { btnStyle } from '../forms/styles/button';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\nimport Spacer from '../layout/Spacer';\nimport LocalInput from '../localization/LocalInput';\nimport { INPUT } from '../forms/styles/input';\nimport LocalBtn from '../localization/LocalBtn';\nimport { ERROR_MSG } from '../forms/styles/messages';\nimport { updatePasswordFormValidation } from '../auth/formValidations';\nimport { useFormik } from 'formik';\nimport { useAppState } from '../core/redux/hooks';\nimport { useError } from '../core/api/hooks';\nimport { ActionType } from '../core/redux/actionType';\nimport { useDispatch } from 'react-redux';\nimport { useMount } from '../core/hooks/useMount';\nimport { passwordRequirementMessageAction } from '../auth/accountSetup/api/passwordRequirementMessageAction';\nimport { newPasswordAction } from '../auth/accountSetup/api/newPasswordAction';\n\n\nconst BTN_STYLE = css`\n min-width: 140px;\n`;\n\nconst styles = {\n modal: [\n FLEX_COLUMN,\n css`\n min-height: 312px;\n \n ${onMobileDevice} {\n height: 100vh;\n }\n `,\n ],\n root: [\n FLEX_COLUMN,\n css`\n flex-grow: 1;\n align-items: stretch;\n justify-content: flex-end;\n margin: 30px auto;\n max-width: 300px;\n `,\n ],\n pwInput: [\n css`\n margin-bottom: 5px;\n `,\n ],\n message: [\n css`\n margin-bottom: 15px;\n `,\n ],\n buttonRow: [\n FLEX_ROW,\n css`\n margin: 20px 16px;\n justify-content: flex-end;\n `,\n ],\n submitButton: [\n btnStyle.primary(COLORS.BLUE),\n BTN_STYLE,\n ],\n cancelButton: [\n btnStyle.secondary(COLORS.BLUE),\n BTN_STYLE,\n css`\n background-color: transparent;\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * ChangePasswordModal: a component that allows a user to update the password.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ChangePasswordModal: React.FC = props => {\n const dispatch = useDispatch();\n\n useMount(() => { dispatch(passwordRequirementMessageAction);});\n\n const createPassword = React.useCallback(\n (passwordHash: string) => dispatch(newPasswordAction(passwordHash)),\n [dispatch],\n );\n\n const title = useMsgText(Str.ChangePasswordTitle);\n\n const pwReqMsg = useAppState(state => state.auth.passwordRequirementMessage);\n const minPwLength = useAppState(state => state.auth.currentUser?.passwordRequirements.passwordLength);\n\n const history = useHistory();\n const dismiss = React.useCallback(() => history.goBack(), [history]);\n\n const invalidCurrentPw = useMsgText(Str.IncorrectPassword);\n const pwReqsNotMet = useMsgText(Str.PasswordFailsRequirements);\n const pwsDoNotMatch = useMsgText(Str.PasswordMismatch);\n const validationError = !!useError(ActionType.NewPasswordRequest);\n const password = useAppState(state => state.auth.currentUser?.passwordUsed);\n\n const { handleSubmit, handleChange, isValid, errors, values } = useFormik({\n initialValues: {\n currentPassword: '',\n password: '',\n confirmPassword: '',\n },\n onSubmit: (values) => {\n createPassword(values.password);\n dismiss();\n },\n validationSchema: updatePasswordFormValidation(\n `${password}`,\n invalidCurrentPw,\n pwReqsNotMet,\n pwsDoNotMatch,\n minPwLength,\n ),\n validateOnChange: false,\n });\n\n return (\n \n \n
\n \n \n \n {pwReqMsg}\n \n {\n (validationError || !isValid) && (\n \n {\n validationError\n ? `${pwReqsNotMet}`\n : `${errors.currentPassword ?? errors.password ?? errors.confirmPassword}`\n }\n
\n )\n }\n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default ChangePasswordModal;\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport * as R from 'ramda';\nimport { css } from '@emotion/core';\nimport { useDispatch } from 'react-redux';\nimport Modal from '../layout/modal/Modal';\nimport ModalHeader from '../layout/modal/ModalHeader';\nimport { useHistory } from 'react-router-dom';\nimport { useMsgText } from '../localization/hooks';\nimport { Str } from '../localization/translationKeys';\nimport LocalDiv from '../localization/LocalDiv';\nimport { FLEX_COLUMN, FLEX_ROW } from '../layout/flexBox';\nimport { SELECT } from '../forms/styles/select';\nimport { COLORS } from '../globalStyle/colors';\nimport { btnStyle } from '../forms/styles/button';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\nimport Spacer from '../layout/Spacer';\nimport LocalDropdownOption from '../localization/LocalDropdownOption';\nimport { setupSecurityQuestionFormValidation } from '../auth/formValidations';\nimport { useFormik } from 'formik';\nimport LocalBtn from '../localization/LocalBtn';\nimport LocalInput from '../localization/LocalInput';\nimport { INPUT } from '../forms/styles/input';\nimport { ERROR_MSG } from '../forms/styles/messages';\nimport { useAppState } from '../core/redux/hooks';\nimport { createSecurityChallengeAction } from '../auth/accountSetup/api/createSecurityChallengeAction';\nimport { useError } from '../core/api/hooks';\nimport { ActionType } from '../core/redux/actionType';\nimport { securityQuestionKeysAction } from '../auth/forgotPassword/api/securityQuestionKeysAction';\nimport { useMount } from '../core/hooks/useMount';\nimport LocalSelect from '../localization/LocalSelect';\n\n\nconst BTN_STYLE = css`\n min-width: 140px;\n`;\n\nconst styles = {\n modal: [\n FLEX_COLUMN,\n css`\n min-height: 312px;\n \n ${onMobileDevice} {\n height: 100vh;\n }\n `,\n ],\n root: [\n FLEX_COLUMN,\n css`\n flex-grow: 1;\n align-items: stretch;\n justify-content: flex-end;\n margin: 30px auto;\n max-width: 300px;\n `,\n ],\n message: [\n css`\n margin-bottom: 15px;\n `,\n ],\n select: [\n css`\n background-color: ${COLORS.WHITE};\n color: ${COLORS.DARK_GREY};\n `, \n ],\n buttonRow: [\n FLEX_ROW,\n css`\n margin: 20px 16px;\n justify-content: flex-end;\n `,\n ],\n submitButton: [\n btnStyle.primary(COLORS.BLUE),\n BTN_STYLE,\n ],\n cancelButton: [\n btnStyle.secondary(COLORS.BLUE),\n BTN_STYLE,\n css`\n background-color: transparent;\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * ChangeSecurityQuestionModal: a component that allows a user to update the security question and answer.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ChangeSecurityQuestionModal: React.FC = props => {\n const questionId = useAppState(state => state.auth.currentUser?.securityQuestionId);\n const answer = useAppState(state => state.auth.currentUser?.securityAnswer);\n\n const dispatch = useDispatch();\n\n useMount(\n () => {\n dispatch(securityQuestionKeysAction);\n },\n );\n\n const questionKeys = useAppState(state => state.auth.securityQuestionKeys || []);\n\n const createSecurityChallenge = (questionId: number, answer: string) => dispatch(\n createSecurityChallengeAction(questionId, answer),\n );\n\n const errorCreatingSecurityChallenge = !!useError(ActionType.CreateSecurityChallengeRequest);\n\n const title = useMsgText(Str.ChangeSecurityQuestionTitle);\n const questionFormHeaderMsg = useMsgText(Str.ChooseSecurityQuestion);\n\n const history = useHistory();\n const dismiss = React.useCallback(() => history.goBack(), [history]);\n\n const questionMsg = useMsgText(Str.Question);\n const questionRequired = useMsgText(Str.SelectQuestion);\n const ansReqsNotMet = useMsgText(Str.AnswerRequired);\n\n const { handleSubmit, handleChange, isValid, errors, values } = useFormik({\n initialValues: {\n questionId: questionId,\n answer: answer,\n },\n // Parse the question Id explicitly as a number here to prevent it from being passed as a string\n onSubmit: (values) => {\n createSecurityChallenge(Number(values.questionId), values.answer || '');\n dismiss();\n },\n validationSchema: setupSecurityQuestionFormValidation(questionRequired, ansReqsNotMet),\n validateOnChange: false,\n });\n\n const renderQuestionOptions = useMemo(\n () => R.map(\n key => (\n ),\n questionKeys,\n ),\n [questionKeys],\n );\n\n const dir = useAppState(state => state.locale.textDirection);\n\n return (\n \n \n
\n \n \n \n {questionFormHeaderMsg}\n \n {\n (errorCreatingSecurityChallenge || !isValid) && (\n \n {\n errorCreatingSecurityChallenge\n ? `${ansReqsNotMet}`\n : `${errors.questionId ?? errors.answer}`\n }\n
\n )\n }\n \n \n {renderQuestionOptions}\n \n \n \n
\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ChangeSecurityQuestionModal;\n","import * as React from 'react';\nimport { useMemo, useEffect } from 'react';\nimport { Route, Switch } from 'react-router-dom';\nimport { RouteTemplates } from '../navigation/routes';\nimport RaterApprovalDashboard from './RaterApprovalDashboard';\nimport { useCurrentUser } from '../auth/hooks';\nimport Account from '../account/Account';\nimport CustomerService from '../customerService/CustomerService';\nimport { useDispatch } from 'react-redux';\nimport { raterApprovalParticipantsAction } from './api/raterApprovalParticipantsAction';\nimport { useAppState } from '../core/redux/hooks';\nimport { Dispatch } from 'redux';\nimport { useWindowSize } from '../core/hooks/useWindowSize';\nimport { useAnyLoading, useAnyError } from '../core/api/hooks';\nimport { ActionType } from '../core/redux/actionType';\nimport { PAGE_BG, PAGE_HEIGHT } from '../layout/pageStyle';\nimport { FLEX_COLUMN, FLEX_CENTERED } from '../layout/flexBox';\nimport { Spinner } from '../loading/Spinner';\nimport { COLORS } from '../globalStyle/colors';\nimport ErrorMsg from '../error/ErrorMsg';\nimport { Str } from '../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport { logOutAction } from '../auth/login/api/logoutAction';\nimport { useMount } from '../core/hooks/useMount';\nimport { PortalType } from '../navigation/portalType';\nimport { setPortalTypeAction } from '../core/redux/setPortalTypeAction';\nimport ChangePasswordModal from '../account/ChangePasswordModal';\nimport ChangeSecurityQuestionModal from '../account/ChangeSecurityQuestionModal';\n\n\nconst styles = {\n spinner: css`\n width: 100px;\n height: 100px;\n `,\n};\n\n\nconst loadParticipantInfo = (\n dispatch: Dispatch,\n) => (\n approverId: number | undefined,\n hasParticipants: boolean,\n) => {\n if (approverId === undefined) {\n return;\n }\n\n if (!hasParticipants) {\n dispatch(raterApprovalParticipantsAction(approverId));\n }\n};\n\n\n/**\n * RaterApprovalProjectRouter: a component that routes to pages in the rater approver portal experience.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterApprovalRouter: React.FC = () => {\n const { isMobile } = useWindowSize();\n const dispatch = useDispatch();\n const currentUser = useCurrentUser();\n\n useMount(() => { dispatch(setPortalTypeAction(PortalType.RATER_APPROVAL)); });\n\n if (!currentUser?.hasRaterApprovalLoginPermission) {\n dispatch(logOutAction(isMobile));\n }\n\n const participants = useAppState(state => state.raterApprovalParticipants);\n\n const approverId = useMemo(() => currentUser?.personId, [currentUser]);\n\n const actionTypes = [\n ActionType.RaterApprovalParticipantsRequest,\n ActionType.RaterApprovalRatersRequest,\n ];\n\n const isLoading = useAnyLoading(actionTypes);\n const hasError = useAnyError(actionTypes);\n\n const loadParticipants = React.useCallback(\n () => loadParticipantInfo(dispatch)(approverId, !!participants),\n [approverId, dispatch, participants],\n );\n\n useEffect(loadParticipants, [approverId]);\n\n if (isLoading || hasError) {\n return (\n
\n {\n isLoading\n ? \n : \n }\n
\n );\n }\n\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default RaterApprovalRouter;\n","import * as React from 'react';\n\n\ntype Props = {\n className?: string;\n fill?: string;\n sizePx: number;\n};\n\n// TODO - this begins to look blurred at resolutions above ~15px, but needs to be used at least once at ~24px.\n/**\n * FilterIcon: a component that renders an abstract, funnel-like icon, typically used to denote filter functions in the\n * app.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst FilterIcon: React.FC = props => (\n \n \n \n);\n\nexport default FilterIcon;\n","import * as React from 'react';\nimport LocalDiv from '../localization/LocalDiv';\nimport Spacer from '../layout/Spacer';\nimport { SerializedStyles } from '@emotion/core';\nimport { COLORS } from '../globalStyle/colors';\nimport FilterIcon from '../icons/FilterIcon';\nimport { btnStyle } from '../forms/styles/button';\n\n\ntype Props = {\n className?: string;\n\n contentStyle?: SerializedStyles;\n iconStyle?: SerializedStyles;\n\n useDarkIconColor?: boolean;\n useDisabledIconColor?: boolean;\n\n onClickFilterIcon?: () => void;\n};\n\n\n/**\n * FilterBar: a convenience component that renders a styled bar with a filter icon and optional child elements.\n *\n * Used to simplify UI setup for e.g. `ReportRecipientTable`.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst FilterBar: React.FC = props => {\n const fillColor = props.useDisabledIconColor\n ? COLORS.DARK_GREY\n : props.useDarkIconColor\n ? COLORS.DARK_BLUE\n : COLORS.BLUE\n\n return (\n \n \n \n \n {props.children}\n \n \n)\n};\n\nexport default FilterBar;\n","import * as React from 'react';\n\n\ntype Props = {\n className?: string;\n fill?: string;\n sizePx: number;\n};\n\n\n/**\n * DownloadIcon: a component that renders a downward-pointing arrow icon with a thick underline below, typically used to\n * denote download functions in the app.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst DownloadIcon: React.FC = props => (\n \n \n \n);\n\nexport default DownloadIcon;\n","import * as React from 'react';\n\n\ntype Props = {\n className?: string;\n fill?: string;\n sizePx: number;\n};\n\n\n/**\n * SendIcon: a component that renders a custom paper airplane-styled icon, typically used to denote send functions in\n * the app.\n */\nconst SendIcon: React.FC = props => (\n \n \n \n);\n\nexport default SendIcon;\n","import * as React from 'react';\nimport { ReportRecipientReport } from './models';\nimport { lastCommaFirstLocal } from '../project/survey/raters/module';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport DownloadIcon from '../icons/DownloadIcon';\nimport { COLORS } from '../globalStyle/colors';\nimport { TextDirection } from '../localization/textDirection';\nimport SendIcon from '../icons/SendIcon';\nimport { btnStyle } from '../forms/styles/button';\nimport Spacer from '../layout/Spacer';\nimport { css } from '@emotion/core';\nimport LocalDiv from '../localization/LocalDiv';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faUserAlt, faUsers } from '@fortawesome/free-solid-svg-icons';\nimport { FLEX_ROW, FLEX_COLUMN } from '../layout/flexBox';\nimport { pathCombine } from '../core/api/module';\nimport { BaseUrl } from '../core/api/endpoints';\nimport { useMount } from '../core/hooks/useMount';\nimport { useBrowser } from '../language/useBrowser';\nimport { useAppState } from '../core/redux/hooks';\n\n\nconst styles = {\n deliverText: css`\n color: ${COLORS.BLUE};\n font-size: 12px;\n `,\n link: css`\n text-decoration: none;\n color: ${COLORS.BLUE};\n\n &:hover { \n text-decoration: underline;\n }\n `,\n linkDisabled: css`\n cursor: default;\n opacity: .6;\n\n &:hover { \n text-decoration: none;\n cursor: default;\n }\n `,\n button: css`\n color: ${COLORS.BLUE};\n\n &:hover { \n text-decoration: underline;\n cursor: pointer;\n }\n `,\n}\n\ntype Props = {\n className?: string;\n report: ReportRecipientReport;\n textDirection: TextDirection;\n hasDeliverPermission: boolean;\n deliverClicked: (report: ReportRecipientReport) => void;\n redeliverClicked: (report: ReportRecipientReport) => void;\n downloadClicked: () => void;\n reportClicked: (report: ReportRecipientReport, selected: boolean) => void;\n singleReport: boolean;\n differentLanguages: boolean;\n};\n\n/**\n * ReportTableRow: a component that presents information about a report, as a table row\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportTableRow: React.FC = props => {\n const delivered = React.useMemo(\n () => new Date(props.report.deliveryDate ?? new Date()),\n [props.report.deliveryDate],\n );\n\n const fileURL = (report: ReportRecipientReport) => {\n const baseUrl = pathCombine(BaseUrl, '/report/reportFile');\n return report?.fileExists ? baseUrl + '/' + encodeURIComponent(report!.reportFile) : undefined\n };\n\n const downloadURL = (report: ReportRecipientReport) => {\n const baseUrl = pathCombine(BaseUrl, '/report/reportDownload');\n return report?.fileExists ? baseUrl + '/' + encodeURIComponent(report!.reportFile) : undefined\n };\n\n const reportType = (report: ReportRecipientReport, differentLanguages: boolean) => {\n const typeStr = report.isComposite ? Str.Composite : report.isSummary ? Str.Summary: Str.Individual;\n return differentLanguages\n ? <> ({report.languageName})\n : \n };\n\n const code = useAppState(state => state.locale.lang.code);\n\n useMount(() => {\n props.singleReport && props.reportClicked(props.report, true)\n });\n\n const { onIe } = useBrowser();\n \n return (\n \n \n \n \n \n \n {lastCommaFirstLocal(props.textDirection, props.report)}\n \n \n \n \n {\n props.report.isComposite\n ? \n : props.report.email\n }\n \n \n {delivered.toLocaleDateString(code)} {delivered.toLocaleTimeString(code)}\n \n \n {\n props.report.isComposite\n ? \n : props.report.portalDelivered\n ? \n \n \n (\n \n )\n \n : props.hasDeliverPermission\n ? \n : \n }\n \n \n { props.report.webReport\n ? \n {reportType(props.report, props.differentLanguages)}\n \n : onIe\n ? reportType(props.report, props.differentLanguages)\n : \n {reportType(props.report, props.differentLanguages)}\n \n }\n \n \n props.downloadClicked}\n >\n \n \n \n \n !props.singleReport && props.reportClicked(props.report, event.target.checked)}\n disabled={props.singleReport}\n />\n \n \n )\n};\n\nexport default ReportTableRow;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../globalStyle/colors';\nimport { useAppState } from '../core/redux/hooks';\nimport { TextDirection } from '../localization/textDirection';\n\n\nconst styles = {\n root: css`\n table-layout: auto;\n width: 100%;\n border-collapse: collapse;\n color: ${COLORS.DARK_GREY};\n background-color: ${COLORS.LIGHTEST_GREY};\n\n & th, & td {\n padding: 18px 12px;\n border: 1px solid;\n border-color: ${COLORS.LIGHTER_GREY} ${COLORS.LIGHTEST_GREY};\n }\n\n & th {\n font-size: 13px;\n }\n `,\n};\n\n\ntype Props = {\n className?: string;\n headers: React.ReactNode[];\n}\n\n/**\n * DataTable: a component that renders a table using the provided header elements (mapped according to their order in\n * the array). The table is setup with the styling common to all table elements (including for data rows), but this can\n * be overridden as needed.\n *\n * Note that you're still responsible for constructing your own data rows.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst DataTable: React.FC = props => {\n const { headers, className } = props;\n const dir = useAppState(state => state.locale.textDirection);\n const isRtl = React.useMemo(() => dir === TextDirection.RTL, [dir]);\n\n // Include text direction on the headers so that we can pad appropriately\n const mapHeaders = React.useMemo(\n () => headers.map(header => {header}),\n [dir, headers],\n );\n\n return (\n \n \n \n {mapHeaders}\n \n \n \n {props.children}\n \n
\n );\n};\n\nexport default DataTable;\n","import * as React from 'react';\nimport { COLORS } from '../globalStyle/colors';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport DownloadIcon from '../icons/DownloadIcon';\nimport { ReportRecipientReport } from './models';\nimport ReportTableRow from './ReportTableRow';\nimport { TextDirection } from '../localization/textDirection';\nimport DataTable from '../layout/DataTable';\nimport Spacer from '../layout/Spacer';\nimport { FLEX_ROW, FLEX_COLUMN } from '../layout/flexBox';\nimport LocalDiv from '../localization/LocalDiv';\nimport { css } from '@emotion/core';\nimport { btnStyle } from '../forms/styles/button';\nimport { useEffect, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setAllSelectedAction } from './actions/setAllSelectedAction';\nimport { useToggle } from '../core/hooks/useToggle';\nimport { setSelectedAction } from './actions/setSelectedAction';\nimport { pathCombine } from '../core/api/module';\nimport { BaseUrl } from '../core/api/endpoints';\nimport * as R from 'ramda';\nimport { lastCommaFirstLocal } from '../project/survey/raters/module';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faSortDown, faSortUp } from '@fortawesome/free-solid-svg-icons';\n\n\nconst styles = {\n tableContainer: css`\n max-height: 300px;\n overflow-y: scroll;\n `,\n allColumnHeader: {\n root: FLEX_ROW,\n },\n button: css`\n font-size: 13px;\n font-weight: bold;\n text-decoration: none;\n color: ${COLORS.BLUE};\n\n &:hover { \n text-decoration: underline;\n cursor: pointer;\n }\n `,\n linkDisabled: css`\n cursor: default;\n opacity: .6;\n\n &:hover { \n text-decoration: none;\n cursor: default;\n }\n `,\n headerButton: css`\n font-size: 12px;\n font-weight: bold;\n padding: 0;\n border: none;\n color: ${COLORS.DARK_GREY};\n background-color: transparent;\n\n &:hover { \n text-decoration: underline;\n cursor: pointer;\n }\n `,\n iconStyle: css`\n padding-left: 5px;\n font-size: 16px;\n `,\n};\n\n\ntype Props = {\n reports: ReportRecipientReport[];\n textDirection: TextDirection;\n downloadAllClicked: () => void;\n hasDeliverPermission: boolean;\n deliverClicked: (report: ReportRecipientReport) => void;\n redeliverClicked: (report: ReportRecipientReport) => void;\n downloadClicked: () => void;\n recipientId: number;\n dateRange: number | 0;\n projectIds: number[];\n participantIds: number[];\n lastOnly: boolean;\n};\n\n\n/**\n * ReportList: a component that presents information about the reports to be handled by the report recipient.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportRecipientReportList: React.FC = props => {\n const dispatch = useDispatch();\n\n const [allSelected, toggleSelected] = useToggle();\n\n useEffect(\n () => {\n dispatch(setAllSelectedAction(allSelected));\n },\n [dispatch, allSelected],\n );\n\n const [sortField, setSortField] = React.useState('available');\n const [sortOrder, setSortOrder] = React.useState('desc');\n\n const mapReportsToRows = React.useMemo(\n () => {\n const reportClicked = (report: ReportRecipientReport, selected: boolean) => {\n dispatch(setSelectedAction(report, selected));\n };\n\n const sortVal = (sortField: string, a: ReportRecipientReport, b: ReportRecipientReport) => {\n switch(sortField) {\n case 'name':\n const name1 = lastCommaFirstLocal(props.textDirection, a) || '';\n const name2 = lastCommaFirstLocal(props.textDirection, b) || '';\n return name1.localeCompare(name2, 'en');\n case 'email':\n const email1 = a.email || '';\n const email2 = b.email || '';\n return email1.localeCompare(email2, 'en');\n case 'available':\n const delivery1 = (a.deliveryDate ?? new Date()).toString();\n const delivery2 = (b.deliveryDate ?? new Date()).toString();\n return delivery1.localeCompare(delivery2, 'en');\n case 'deliveredParticipant':\n const delivered1 = a.isComposite || !a.deliveryDate ? 0 : 1;\n const delivered2 = b.isComposite || !b.deliveryDate ? 0 : 1;\n return delivered1 - delivered2;\n case 'reports':\n const reportType1 = a.isComposite ? Str.Composite : a.isSummary ? Str.Summary: Str.Individual;\n const reportType2 = b.isComposite ? Str.Composite : b.isSummary ? Str.Summary: Str.Individual;\n return reportType1.localeCompare(reportType2, 'en');\n default: return 0;\n }\n };\n\n const sortedReports = (sortField: string, sortOrder: string) => (\n [...props.reports].sort((a, b) => (\n sortVal(sortField, a, b) * (sortOrder === 'asc' ? 1 : -1)\n ))\n );\n\n const reportsSorted = sortField === '' ? [...props.reports] : sortedReports(sortField, sortOrder);\n\n return reportsSorted.map(\n report =>\n 1 && !R.all(r => r.languageId === props.reports[0].languageId, props.reports)\n }\n />,\n )\n },\n [\n dispatch,\n props.reports,\n props.textDirection,\n props.hasDeliverPermission,\n props.deliverClicked,\n props.redeliverClicked,\n props.downloadClicked,\n sortField,\n sortOrder,\n ],\n );\n\n const availableDownload = useMemo(\n () => props.reports.filter(r => r.fileExists).length > 0,\n [props.reports],\n );\n\n const downloadURL = useMemo(\n () => {\n if (!availableDownload) {\n return '#';\n }\n\n const baseUrl = pathCombine(BaseUrl, '/report/downloadAll');\n const recipientId = `/${props.recipientId}`; \n const dateRange = `/${props.dateRange}`; \n const projectIdStr = `/${props.projectIds.length === 0 ? '0' : props.projectIds.join('|') }`; \n const participantIdStr = `/${props.participantIds.length === 0 ? '0' : props.participantIds.join('|') }`; \n const lastOnly = `/${props.lastOnly}`; \n\n return baseUrl + recipientId + dateRange + projectIdStr + participantIdStr + lastOnly;\n },\n [availableDownload, props],\n );\n\n const requestSort = (key: string) => {\n if (key === sortField) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortField(key);\n if (key === 'available') {\n setSortOrder('desc');\n } else {\n setSortOrder('asc');\n }\n }\n };\n\n const sortAsc = (key: string) => (\n (sortField ?? '') === key && sortOrder === 'asc'\n );\n \n const sortDesc = (key: string) => (\n (sortField ?? '') === key && sortOrder === 'desc'\n );\n\n return (\n \n requestSort('name')}\n css={styles.headerButton}\n >\n \n {sortAsc('name') && }\n {sortDesc('name') && }\n ,\n requestSort('email')}\n css={styles.headerButton}\n >\n \n {sortAsc('email') && }\n {sortDesc('email') && }\n , \n requestSort('available')}\n css={styles.headerButton}\n >\n \n {sortAsc('available') && }\n {sortDesc('available') && }\n ,\n requestSort('deliveredParticipant')}\n css={styles.headerButton}\n >\n \n {sortAsc('deliveredParticipant') && }\n {sortDesc('deliveredParticipant') && }\n ,\n requestSort('reports')}\n css={styles.headerButton}\n >\n \n {sortAsc('reports') && }\n {sortDesc('reports') && }\n ,\n \n props.downloadAllClicked()}\n css={[btnStyle.invisible, styles.button, !availableDownload && styles.linkDisabled ]}\n >\n \n \n \n \n \n \n ,\n ,\n ]}\n >\n {mapReportsToRows}\n \n \n );\n};\n\nexport default ReportRecipientReportList;\n","import * as React from 'react';\nimport LocalDiv from '../localization/LocalDiv';\nimport LocalInput from '../localization/LocalInput';\nimport { Str } from '../localization/translationKeys';\nimport ActionIcon from './ActionIcon';\nimport { faSearch } from '@fortawesome/free-solid-svg-icons';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../globalStyle/colors';\nimport { INPUT } from '../forms/styles/input';\nimport { FIELDSET_DEFAULT } from './fieldSetStyle';\nimport { FLEX_COLUMN } from './flexBox';\nimport { useMemo, useState } from 'react';\nimport { isNilOrEmpty } from '../language/module';\n\n\nconst styles = {\n root: css`background-color: ${COLORS.WHITE};`,\n inputRow: {\n root: css`padding: 12px;`,\n input: [\n INPUT(COLORS.LIGHT_GREY),\n css`\n min-width: 300px;\n `,\n ],\n },\n searchIcon: {\n root: css`\n transform: translateX(-24px);\n `,\n icon: css`\n color: ${COLORS.LIGHT_GREY};\n `,\n },\n dataRows: {\n root: [\n FLEX_COLUMN,\n css`\n background-color: ${COLORS.WHITE};\n max-height: 224px;\n overflow-y: auto;\n `,\n ],\n row: css`\n outline: none;\n border: 0 none transparent;\n border-top: 1px solid ${COLORS.LIGHTER_GREY};\n padding: 20px 12px;\n text-align: left;\n font-size: 12px;\n `,\n },\n};\n\n\ntype ModelViewData = {\n key: string;\n displayValue: string | number;\n}\n\n\ntype Props = {\n className?: string;\n\n dataValues: ModelViewData[];\n\n isChecked: (key: string) => boolean;\n toggleChecked: (key: string) => void;\n isProject: boolean;\n}\n\n\n/**\n * SearchableDataModelList: a component that renders a collection of data models as a simple list, as well as a search\n * bar which enables easy filtering of the list.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst SearchableDataModelList: React.FC = props => {\n const { isChecked, toggleChecked, ...rest } = props;\n\n const [currentText, setCurrentText] = useState('');;\n const [searchText, setSearchText] = useState('');;\n\n const searchData = useMemo(\n () => (\n isNilOrEmpty(searchText)\n ? rest.dataValues\n : rest.dataValues.filter(d => d.displayValue.toString().toLowerCase().search(searchText.toLowerCase()) !== -1)\n ),\n [rest.dataValues, searchText],\n );\n\n const options = useMemo(\n () => searchData.map(\n model => {\n const checked = isChecked(model.key);\n\n return (\n toggleChecked(model.key)}\n >\n {model.displayValue}\n \n );\n },\n ),\n [isChecked, searchData, toggleChecked],\n );\n\n const onSearchClick = (event: React.MouseEvent | React.KeyboardEvent) => {\n event.preventDefault();\n setSearchText(currentText);\n };\n\n const searchStr = useMemo(\n () => props.isProject ? Str.SearchProjects : Str.SearchParticipants,\n [props],\n );\n\n return (\n \n {\n options.length > 15 && (\n \n
\n
\n setCurrentText(event.target.value)}\n />\n \n \n
\n
\n )\n }\n \n {options}\n \n
\n );\n};\n\nexport default SearchableDataModelList;\n","import * as React from 'react';\nimport { ReportRecipientProject } from './models';\nimport SearchableDataModelList from '../layout/SearchableDataModelList';\nimport { Map } from '../language/models';\n\n\ntype Props = {\n className?: string;\n projects: ReportRecipientProject[];\n checkedProjects: Map;\n isChecked: (displayName: string) => boolean;\n toggleCheck: (displayName: string) => void;\n}\n\n/**\n * ReportRecipientProjectList: a component that renders a searchable list of report recipient projects.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportRecipientProjectList: React.FC = props => {\n const projectViewData = React.useMemo(\n () => props.projects.map(project => ({ key: project.displayName, displayValue: project.displayName })),\n [props.projects],\n );\n\n return (\n \n );\n};\n\nexport default ReportRecipientProjectList;\n","import * as React from 'react';\nimport { ReportRecipientParticipant } from './models';\nimport SearchableDataModelList from '../layout/SearchableDataModelList';\nimport { Map } from '../language/models';\n\n\ntype Props = {\n className?: string;\n participants: ReportRecipientParticipant[];\n checkedParticipants: Map;\n isChecked: (displayName: string) => boolean;\n toggleCheck: (displayName: string) => void;\n}\n\n\n/**\n * ReportRecipientParticipantList: a component that renders a searchable list of report recipient participants.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportRecipientParticipantList: React.FC = props => {\n const participantViewData = React.useMemo(\n () => props.participants.map(\n participant => ({ \n key: participant.displayName,\n displayValue: participant.displayName + ' (' + participant.email + ')',\n }),\n ),\n [props.participants],\n );\n\n return (\n \n );\n};\n\nexport default ReportRecipientParticipantList;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\nimport { useSelector } from 'react-redux';\nimport { AppState } from '../../core/redux/appState';\nimport { TextDirection } from '../../localization/textDirection';\nimport { strictEquals } from '../../language/module';\n\n\nconst styles = {\n root: css`\n background-color: ${COLORS.WHITE};\n border-radius: 10px;\n padding: 25px;\n `,\n};\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLDivElement> {\n localizeDir?: boolean;\n}\n\n\n/**\n * Card: a component that renders a div with TruScore card styling. Localizes direction by default.\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst Card: React.FC = props => {\n const layoutDirection = useSelector(\n state => state.locale.textDirection,\n strictEquals,\n );\n\n // React complains if you forward unknown props to HTML elements >.>\n const { localizeDir, ...rest } = props;\n\n const dirProps = React.useMemo(\n () => localizeDir ? { dir: layoutDirection } : {},\n [localizeDir, layoutDirection],\n );\n\n return (\n
\n );\n};\n\nCard.defaultProps = {\n localizeDir: true,\n};\n\nexport default Card;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { TABLE_COLORS, COLORS } from '../globalStyle/colors';\nimport { ReportRecipientProject } from './models';\nimport Card from '../layout/card/Card';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport LocalDiv from '../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../layout/flexBox';\n\n\nconst styles = {\n root: css`\n background-color: ${TABLE_COLORS.DARK_BG};\n padding: 10px;\n display: flex;\n flex-direction: row;\n align-items: stretch;\n max-width: 260px;\n background-color: ${COLORS.BLUE};\n align-items: flex-start;\n `,\n text: css`\n max-width: 240px;\n color: ${COLORS.WHITE};\n `,\n closeButton: css`\n border-radius: 0;\n border-width: 0;\n color: ${COLORS.WHITE};\n font-size: 16px;\n background-color: transparent;\n align-self: flex-start;\n justify-self: flex-end;\n padding: 0;\n \n &:hover {\n color: ${COLORS.LIGHT_GREY};\n cursor: pointer;\n }\n `,\n};\n\ntype Props = {\n project: ReportRecipientProject;\n onDelete: (project: ReportRecipientProject) => void;\n className?: string;\n};\n\n/**\n * ProjectCard: a component that renders a recipient project.\n * Mostly used on mobile.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RecipientProjectCard: React.FC = props => (\n \n \n {props.project.displayName}\n \n\n props.onDelete(props.project)}\n css={[FLEX_COLUMN, styles.closeButton]}\n >\n \n \n \n);\n\nexport default RecipientProjectCard;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { TABLE_COLORS, COLORS } from '../globalStyle/colors';\nimport { ReportRecipientParticipant } from './models';\nimport Card from '../layout/card/Card';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport LocalDiv from '../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../layout/flexBox';\nimport Spacer from '../layout/Spacer';\n\n\nconst styles = {\n root: css`\n background-color: ${TABLE_COLORS.DARK_BG};\n padding: 10px;\n display: flex;\n flex-direction: row;\n align-items: stretch;\n max-width: 260px;\n background-color: ${COLORS.BLUE};\n align-items: flex-start;\n `,\n text: css`\n max-width: 240px;\n color: ${COLORS.WHITE};\n `,\n closeButton: css`\n border-radius: 0;\n border-width: 0;\n color: ${COLORS.WHITE};\n font-size: 16px;\n background-color: transparent;\n align-self: flex-start;\n justify-self: flex-end;\n padding: 0;\n \n &:hover {\n color: ${COLORS.LIGHT_GREY};\n cursor: pointer;\n }\n `,\n};\n\ntype Props = {\n participant: ReportRecipientParticipant;\n onDelete: (participant: ReportRecipientParticipant) => void;\n className?: string;\n};\n\n/**\n * ProjectCard: a component that renders a recipient participant.\n * Mostly used on mobile.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RecipientParticipantCard: React.FC = props => (\n \n \n {props.participant.displayName}\n \n \n \n \n);\n\nexport default RecipientParticipantCard;\n","import * as R from 'ramda';\nimport * as React from 'react';\nimport { useMemo, useEffect, FC, useCallback } from 'react';\nimport LocalDiv from '../localization/LocalDiv';\nimport { css } from '@emotion/core';\nimport LocalSelect from '../localization/LocalSelect';\nimport { useMsgText } from '../localization/hooks';\nimport { Str } from '../localization/translationKeys';\nimport Msg from '../localization/Msg';\nimport { FLEX_ROW, FLEX_COLUMN } from '../layout/flexBox';\nimport { COLORS } from '../globalStyle/colors';\nimport { SELECT } from '../forms/styles/select';\nimport Spacer from '../layout/Spacer';\nimport FilterBar from './FilterBar';\nimport { ReportRecipientParticipant, ReportRecipientProject, ReportRecipientReport } from './models';\nimport ReportRecipientReportList from './ReportRecipientReportList';\nimport { TextDirection } from '../localization/textDirection';\nimport { useToggle } from '../core/hooks/useToggle';\nimport ReportRecipientProjectList from './ReportRecipientProjectList';\nimport ClamShell from '../layout/ClamShell';\nimport ReportRecipientParticipantList from './ReportRecipientParticipantList';\nimport { useDispatch } from 'react-redux';\nimport { reportRecipientProjectsAction } from './api/reportRecipientProjectsAction';\nimport { reportRecipientParticipantsAction } from './api/reportRecipientParticipantsAction';\nimport { reportRecipientReportsAction } from './api/reportRecipientReportsAction';\nimport RecipientProjectCard from './RecipientProjectCard';\nimport RecipientParticipantCard from './RecipientParticipantCard';\nimport { useAppState } from '../core/redux/hooks';\nimport { toMap } from '../language/arrays';\nimport { setDateRangeAction } from './actions/setDateRangeAction';\nimport { setLastOnlyAction } from './actions/setLastOnlyAction';\nimport { addFilterProjectAction } from './actions/addFilterProjectAction';\nimport { removeFilterProjectAction } from './actions/removeFilterProjectAction';\nimport { addFilterParticipantAction } from './actions/addFilterParticipantAction';\nimport { removeFilterParticipantAction } from './actions/removeFilterParticipantAction';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faCheck } from '@fortawesome/free-solid-svg-icons';\nimport { useMount } from '../core/hooks/useMount';\nimport { isNilOrEmpty } from '../language/module';\n\n\nconst styles = {\n root: css``,\n filterBar: {\n root: [\n FLEX_ROW,\n css`\n padding: 18px 30px;\n flex-wrap: wrap;\n `,\n ],\n icon: css`\n cursor: pointer;\n `,\n dateRangeBar: css`\n background-color: ${COLORS.LIGHT_GREY};\n `,\n projectBar: css`\n background-color: ${COLORS.PROJECTBAR_GREY};\n border-top: 1px solid ${COLORS.WHITE};\n border-bottom: 1px solid ${COLORS.WHITE};\n `,\n participantBar: css`\n background-color: ${COLORS.PARTICIPANTBAR_GREY};\n `,\n dateContent: css`\n display: flex;\n flex-direction: row;\n flex-basis: 92%; /* 100% causes content to wrap */\n justify-content: space-between;\n `,\n content: css`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n `,\n },\n table: css``,\n selectContainer: {\n root: FLEX_COLUMN,\n caption: css``,\n select: SELECT,\n },\n checkBoxContainer: {\n root: [\n FLEX_ROW,\n css`\n align-items: flex-start;\n `,\n ],\n checkBox: css``,\n label: css`\n display: inline-block;\n max-width: 150px;\n `,\n },\n filterCaption: css`\n line-height: 28px;\n `,\n msgBar: {\n root: css`\n background-color: ${COLORS.WHITE};\n padding: 0 30px;\n border: 0 none;\n `,\n icon: css`\n color: ${COLORS.BLUE};\n line-height: 50px;\n margin: auto 0;\n `,\n msgText: css`\n color: ${COLORS.DARK_GREY};\n background-color: transparent;\n line-height: 50px;\n `,\n }, \n};\n\n\ntype Props = {\n className?: string;\n textDirection: TextDirection;\n recipientId: number;\n userName: string;\n hasDeliverPermission: boolean;\n deliverClicked: (report: ReportRecipientReport) => void;\n redeliverClicked: (report: ReportRecipientReport) => void;\n downloadClicked: () => void;\n downloadAllClicked: () => void;\n delivered: number;\n downloaded: number;\n messageVisible: boolean;\n}\n\n\n/**\n * ReportRecipientTable: a component that renders the report recipient's list of reports to be handled, as well as tools\n * to enable filtering the report list by project or participant\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportRecipientTable: FC = props => {\n const dispatch = useDispatch();\n\n const dateRange = useAppState(state => state.reportRecipientDateRange || 3);\n const setDateRange = useCallback(\n (range: number) => dispatch(setDateRangeAction(range)),\n [dispatch],\n );\n\n const projectArr = useAppState(state => state.reportRecipientProjects);\n const participantArr = useAppState(state => state.reportRecipientParticipants);\n\n const projects = React.useMemo(() => toMap(projectArr || [], proj => proj.displayName), [projectArr]);\n const participants = React.useMemo(() => toMap(participantArr || [], part => part.displayName), [participantArr]);\n const reports = useAppState(state => state.reportRecipientReports || []);\n\n const lastOnly = useAppState(state => state.reportRecipientLastOnly);\n const toggleLastOnly = useCallback(() => dispatch(setLastOnlyAction(!lastOnly)), [lastOnly, dispatch]);\n\n\n const [projectListVisible, showProjectList] = useToggle();\n const [participantListVisible, showParticipantList] = useToggle();\n\n const stateFilterProjects = useAppState(state => state.reportRecipientSelectedProjects);\n const filterProjects = useMemo(() => stateFilterProjects || {}, [stateFilterProjects]);\n const projectId = useAppState(state => state.auth.defaultRecipientProjectId);\n\n const addFilterProject = useCallback(\n (project: ReportRecipientProject) => {\n dispatch(addFilterProjectAction(project))\n showProjectList()\n },\n [showProjectList, dispatch],\n );\n\n const removeFilterProject = useCallback(\n (key: string) => dispatch(removeFilterProjectAction(key)),\n [dispatch],\n );\n\n useMount(\n () => {\n const project = Object.values(projects).find(\n proj => `${(proj.projectId)}` === projectId || proj.displayProjectId === projectId);\n\n if (!isNilOrEmpty(projectId) && Object.keys(filterProjects).length === 0 && project) {\n addFilterProject(project);\n }\n },\n );\n\n const stateFilterParticipants = useAppState(state => state.reportRecipientSelectedParticipants);\n const filterParticipants = useMemo(() => stateFilterParticipants || {}, [stateFilterParticipants]);\n\n const addFilterParticipant = useCallback(\n (participant: ReportRecipientParticipant) => {\n dispatch(addFilterParticipantAction(participant))\n showParticipantList()\n },\n [showParticipantList, dispatch],\n );\n\n const removeFilterParticipant = useCallback(\n (key: string) => dispatch(removeFilterParticipantAction(key)),\n [dispatch],\n );\n\n const isProjectChecked = useCallback(\n (displayName: string) => !!filterProjects[displayName],\n [filterProjects],\n );\n\n const toggleCheckProject = useCallback(\n (displayName: string) =>\n !!filterProjects[displayName]\n ? removeFilterProject(displayName)\n : addFilterProject(projects[displayName]),\n [addFilterProject, filterProjects, projects, removeFilterProject],\n );\n\n const isParticipantChecked = useCallback(\n (participantIdString: string) => !!filterParticipants[participantIdString],\n [filterParticipants],\n );\n\n const toggleCheckParticipant = useCallback(\n (participantIdString: string) => !!filterParticipants[participantIdString]\n ? removeFilterParticipant(participantIdString)\n : addFilterParticipant(participants[participantIdString]),\n [addFilterParticipant, filterParticipants, participants, removeFilterParticipant],\n );\n\n const thisMonthStr = useMsgText(Str.ThisMonth);\n const lastMonthStr = useMsgText(Str.LastMonth);\n const last3MonthsStr = useMsgText(Str.Last3Months);\n const last6MonthsStr = useMsgText(Str.Last6Months);\n const thisYearStr = useMsgText(Str.ThisYear);\n const lastYearStr = useMsgText(Str.LastYear);\n const allDeliveriesStr = useMsgText(Str.AllDeliveries);\n\n const projectIds = useMemo(\n () => Object.values(filterProjects || {}).map(a => a.projectId),\n [filterProjects],\n );\n const participantIds = useMemo(\n () => Object.values(filterParticipants || {}).map(a => a.participantId),\n [filterParticipants],\n );\n\n useEffect(\n () => {\n dispatch(reportRecipientProjectsAction(props.recipientId, dateRange));\n },\n [props.recipientId, dateRange, dispatch],\n );\n\n useEffect(\n () => {\n dispatch(reportRecipientParticipantsAction(props.recipientId, projectIds, dateRange));\n },\n [props.recipientId, projectIds, dateRange, dispatch],\n );\n\n useEffect(\n () => {\n dispatch(reportRecipientReportsAction(\n props.recipientId,\n props.userName,\n projectIds,\n participantIds,\n dateRange,\n lastOnly));\n },\n [props.recipientId, props.userName, projectIds, participantIds, dateRange, lastOnly, dispatch],\n );\n\n const projectCards = useMemo(\n () => R.map(\n (project: ReportRecipientProject) => (\n <>\n removeFilterProject(project.displayName)}\n />\n \n \n ),\n Object.values(filterProjects ?? {}) || [],\n ),\n [filterProjects, removeFilterProject],\n );\n\n const participantCards = useMemo(\n () => R.map(\n (participant: ReportRecipientParticipant) => (\n <>\n removeFilterParticipant(participant.displayName)}\n />\n \n \n ),\n Object.values(filterParticipants ?? {}) || [],\n ),\n [filterParticipants, removeFilterParticipant],\n );\n\n const showProjects = useMemo(\n () => Object.values(filterProjects ?? {}).length > 0,\n [filterProjects],\n );\n\n const showParticipants = useMemo(\n () => Object.values(filterParticipants ?? {}).length > 0,\n [filterParticipants],\n );\n\n return (\n \n\n \n \n \n \n setDateRange(+event.target.value)}\n value={dateRange}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n {!showProjects && }\n {filterProjects && projectCards}\n \n\n \n \n \n\n \n {!showParticipants && }\n {filterParticipants && participantCards}\n \n\n \n \n \n\n 0 || props.downloaded > 0)}\n css={[FLEX_ROW, styles.msgBar.root]}\n >\n \n \n \n {\n 0 ? Str.ReportsDelivered : Str.ReportsDownloaded}\n replace={{ 'number': props.delivered > 0 ? props.delivered : props.downloaded }}\n css={styles.msgBar.msgText}\n /> \n }\n \n \n\n \n \n );\n};\n\nexport default ReportRecipientTable;\n","import * as React from 'react';\nimport * as R from 'ramda';\nimport ReportRecipientLayout from './ReportRecipientLayout';\nimport ReportRecipientTable from './ReportRecipientTable';\nimport LocalDiv from '../localization/LocalDiv';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport { FLEX_ROW, FLEX_COLUMN } from '../layout/flexBox';\nimport LocalBtn from '../localization/LocalBtn';\nimport { btnStyle } from '../forms/styles/button';\nimport { COLORS } from '../globalStyle/colors';\nimport Spacer from '../layout/Spacer';\nimport { useAppState } from '../core/redux/hooks';\nimport SendIcon from '../icons/SendIcon';\nimport DownloadIcon from '../icons/DownloadIcon';\nimport { useCurrentUser } from '../auth/hooks';\nimport { ReportRecipientReport, ReportDeliveryRequest } from './models';\nimport { useDispatch } from 'react-redux';\nimport { deliverReportsAction } from './api/deliverReportsAction';\nimport { useMemo, useState } from 'react';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\nimport { useTimedToggle } from '../core/hooks/useTimedToggle';\nimport { pathCombine } from '../core/api/module';\nimport { BaseUrl } from '../core/api/endpoints';\n\n\nconst styles = {\n header: css`\n margin: 20px auto 40px;\n font-size: 26px;\n \n ${onMobileDevice} {\n padding-top: 25px;\n }\n `,\n btnRow: {\n root: [\n FLEX_ROW,\n css`\n justify-content: flex-end;\n margin-top: 12px;\n `,\n ],\n deliverBtn: btnStyle.transparent(COLORS.BLUE),\n downloadBtn: btnStyle.primary(COLORS.BLUE),\n },\n icon: css`\n padding-top: 10px;\n `,\n linkDisabled: css`\n cursor: default;\n opacity: .6;\n\n &:hover { \n text-decoration: none;\n cursor: default;\n }\n `,\n};\n\n\ntype Props = {\n className?: string;\n}\n\n\n/**\n * ReportRecipientDashboard: a component that enables report recipients to handle reports.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportRecipientDashboard: React.FC = props => {\n const dir = useAppState(state => state.locale.textDirection);\n\n const currentUser = useCurrentUser();\n const hasDeliverPermission = useMemo(() => currentUser?.hasReportRecipientDeliverPermission || false, [currentUser]); \n const recipientId = useMemo(() => currentUser?.personId ?? -1, [currentUser]);\n const userName = useMemo(() => currentUser?.userName || '', [currentUser]);\n\n const [delivered, setDelivered] = useState(0);\n const [downloaded, setDownloaded] = useState(0);\n\n const [messageVisible, showMessage] = useTimedToggle(false, 5000);\n\n const dispatch = useDispatch();\n \n const deliverClicked = (report: ReportRecipientReport) => {\n const request = new Array();\n request.push(\n {\n projectId: report.projectId,\n reportSetId: report.reportSetId,\n participantId: report.participantId,\n archiveDir: report.archiveDir,\n languageId: report.languageId,\n firstName: report.firstName,\n lastName: report.lastName,\n reportId: report.reportId,\n },\n );\n dispatch(deliverReportsAction(request));\n setDownloaded(0);\n setDelivered(1);\n showMessage();\n };\n\n //TODO - we can implement a redeliverClicked function if needed\n\n const downloadClicked = () => {\n setDelivered(0);\n setDownloaded(1);\n showMessage();\n };\n\n const reports = useAppState(state => state.reportRecipientReports || []);\n\n const selected = useMemo(\n () => reports.filter(r => r.isChecked),\n [reports],\n );\n\n const downloadAllCount = useMemo(\n () => reports.filter(report => report.fileExists).length,\n [reports],\n ); \n\n const downloadAllClicked = () => {\n setDelivered(0);\n setDownloaded(downloadAllCount);\n showMessage();\n };\n\n const downloadSelectedCount = useMemo(\n () => selected.filter(report => report.fileExists).length,\n [selected],\n ); \n\n const downloadSelectedClicked = () => {\n setDelivered(0);\n setDownloaded(downloadSelectedCount);\n showMessage();\n };\n\n const deliverRequest = useMemo(\n () => selected.map(report => ({ \n projectId: report.projectId,\n reportSetId: report.reportSetId,\n participantId: report.participantId,\n archiveDir: report.archiveDir,\n languageId: report.languageId,\n firstName: report.firstName,\n lastName: report.lastName,\n reportId: report.reportId,\n })),\n [selected],\n );\n \n const deliverSelectedClicked = () => {\n const selectedRequest = deliverRequest;\n dispatch(deliverReportsAction(deliverRequest));\n setDownloaded(0);\n setDelivered(selectedRequest.length);\n showMessage();\n };\n\n const allSelected = R.all(r => r.isChecked, reports);\n\n const last = useAppState(state => state.reportRecipientLastOnly);\n const dates = useAppState(state => state.reportRecipientDateRange || 3);\n const projects = useAppState(state => state.reportRecipientSelectedProjects || {});\n const participants = useAppState(state => state.reportRecipientSelectedParticipants || {});\n\n const downloadURL = useMemo(\n () => {\n if (selected.length === 0) {\n return '#';\n }\n\n if (allSelected) {\n const projectIds = Object.values(projects || {}).map(a => a.projectId);\n const participantIds = Object.values(participants || {}).map(a => a.participantId); \n\n const baseUrl = pathCombine(BaseUrl, '/report/downloadAll');\n const recipient = `/${recipientId}`; \n const dateRange = `/${dates}`; \n const projectIdStr = `/${projectIds.length === 0 ? '0' :projectIds.join('|') }`; \n const participantIdStr = `/${participantIds.length === 0 ? '0' : participantIds.join('|') }`; \n const lastOnly = `/${last}`; \n\n return baseUrl + recipient + dateRange + projectIdStr + participantIdStr + lastOnly;\n } else {\n const baseUrl = pathCombine(BaseUrl, '/report/downloadSelected');\n const selectedFiles = selected.map(r => r.fileOnly).join('|');\n\n return baseUrl + '/' + encodeURIComponent(selectedFiles);\n }\n },\n [selected, allSelected, recipientId, last, dates, projects, participants],\n );\n\n const deliverDisabled = useMemo(\n () => allSelected\n ? reports.length === 0\n : selected.length === 0,\n [allSelected, reports, selected],\n );\n\n const downloadDisabled = useMemo(\n () => allSelected\n ? reports.filter(r => r.fileExists).length === 0\n : selected.filter(r => r.fileExists).length === 0,\n [allSelected, reports, selected],\n );\n\n return (\n \n\n \n \n \n\n \n\n \n {\n hasDeliverPermission && (\n }\n css={styles.btnRow.deliverBtn}\n onClick={deliverSelectedClicked}\n disabled={deliverDisabled}\n />\n )\n }\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ReportRecipientDashboard;\n","import * as React from 'react';\nimport { Switch, Route } from 'react-router-dom';\nimport { RouteTemplates } from '../navigation/routes';\nimport Account from '../account/Account';\nimport CustomerService from '../customerService/CustomerService';\nimport ReportRecipientDashboard from './ReportRecipientDashboard';\nimport { useDispatch } from 'react-redux';\nimport { useCurrentUser } from '../auth/hooks';\nimport { logOutAction } from '../auth/login/api/logoutAction';\nimport { useWindowSize } from '../core/hooks/useWindowSize';\nimport { useMount } from '../core/hooks/useMount';\nimport { PortalType } from '../navigation/portalType';\nimport { setPortalTypeAction } from '../core/redux/setPortalTypeAction';\nimport ChangePasswordModal from '../account/ChangePasswordModal';\nimport ChangeSecurityQuestionModal from '../account/ChangeSecurityQuestionModal';\n\n\n/**\n * ReportRecipientRouter: a component that routes to pages in the report recipient portal experience.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportRecipientRouter: React.FC = () => {\n const { isMobile } = useWindowSize();\n const dispatch = useDispatch();\n const currentUser = useCurrentUser();\n\n useMount(() => { dispatch(setPortalTypeAction(PortalType.REPORT_RECIPIENT)); });\n\n if (!currentUser?.hasReportRecipientLoginPermission) {\n dispatch(logOutAction(isMobile));\n }\n\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ReportRecipientRouter;\n","import * as React from 'react';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\nimport { css, SerializedStyles } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\n\n\nconst styles = {\n root: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n `,\n title: css`\n text-align: start;\n margin: 0;\n color: ${COLORS.DARK_GREY};\n `,\n icon: css`\n font-size: 22px;\n color: ${COLORS.DARK_GREY};\n `,\n};\n\ntype Props = {\n title: string;\n icon?: IconProp;\n iconStyle?: SerializedStyles;\n className?: string;\n};\n\n\n/**\n * CardHeader: a component that renders the normal TruScore card header in the correct style etc.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CardHeader: React.FC = props => (\n \n

{props.title}

\n {\n props.icon && \n }\n
\n);\n\nexport default CardHeader;\n\n","import * as R from 'ramda';\nimport * as React from 'react';\nimport { css } from '@emotion/core';\nimport { FLEX_ROW } from './flexBox';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faUser, IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport { CHART_COLORS, COLORS } from '../globalStyle/colors';\nimport LocalDiv from '../localization/LocalDiv';\n\n\nconst styles = {\n root: css`\n font-size: 18px;\n color: ${CHART_COLORS.PERSON};\n \n &[dir=\"ltr\"] > * {\n margin-right: 5px;\n }\n \n &[dir=\"rtl\"] > * {\n margin-left: 5px;\n }\n `,\n active: css`\n color: ${COLORS.DARK_GREY};\n `,\n iconOverflow: css`\n font-weight: bold;\n `,\n};\n\n\ntype Props = {\n numberOfIcons: number;\n iconMax?: number;\n numberOfActive?: number;\n icon?: IconDefinition;\n className?: string;\n};\n\n\n/**\n * PeopleCounter: a component that renders a row of people icons (or any icons really). Use className to set `color` and\n * `font-size` (These are font awesome icons). Default is a person icon with grey color.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst IconRow: React.FC = props => (\n \n {\n R.range(0, Math.min(props.iconMax!, props.numberOfIcons))\n .map(i => (\n \n ))\n }\n {\n props.numberOfIcons > props.iconMax! && +\n }\n {\n props.numberOfIcons > props.iconMax! && (\n {props.numberOfIcons - props.iconMax!}\n )\n }\n \n);\n\nIconRow.defaultProps = {\n icon: faUser,\n iconMax: Number.MAX_VALUE,\n numberOfActive: 0,\n};\n\nexport default IconRow;\n","import * as React from 'react';\nimport Msg from '../../localization/Msg';\nimport { Str } from '../../localization/translationKeys';\nimport IconRow from '../../layout/IconRow';\nimport BulletedMsg from '../../layout/BulletedMsg';\nimport { faCircle } from '@fortawesome/free-regular-svg-icons';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\nimport { onMobileDevice } from '../../globalStyle/mediaQueries';\nimport { Requirement } from '../models';\nimport { faCheckCircle } from '@fortawesome/free-solid-svg-icons';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { FLEX_COLUMN } from '../../layout/flexBox';\n\n\nconst styles = {\n title: css`\n margin: 0 0 20px;\n text-align: start;\n color: ${COLORS.DARK_GREY};\n ${onMobileDevice} {\n border-bottom: 1px solid ${COLORS.LIGHT_GREY};\n }\n `,\n label: css`\n margin-top: 5px;\n margin-bottom: 20px;\n color: ${COLORS.DARK_GREY};\n `,\n completed: css`\n color: ${COLORS.BLUE};\n `,\n notCompleted: css`\n color: ${COLORS.DISABLED};\n `,\n};\n\n\ntype Props = {\n minimumsRequired: boolean;\n requirements: Requirement[] | undefined;\n className?: string;\n};\n\n\n/**\n * RequirementSummary: a component that renders the list of project requirements, just wrapping down and down. If you\n * want to limit the number rendered, then you'll have to limit the props you give this thing. Each requirement is a\n * people row with a label row + label underneath. Requirements with more than 7 people render with a `+n` where n is\n * the remainder.\n *\n * You'll see this mostly on the Dashboard.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RequirementSummary: React.FC = props => (\n \n

\n {\n props.requirements?.map(\n requirement => {\n const isCompleted = requirement.completedCount >= requirement.minimumRequired;\n\n return (\n
\n \n \n
\n );\n },\n )\n }\n
\n);\n\nexport default RequirementSummary;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { COLORS } from '../globalStyle/colors';\nimport { FLEX_CENTERED, FLEX_COLUMN } from './flexBox';\n\n\nconst styles = {\n root: css`\n width: 70px;\n height: 70px;\n border-radius: 100%;\n color: ${COLORS.WHITE};\n background-color: ${COLORS.GREEN};\n font-size: 25px;\n text-align: center;\n flex-shrink: 0;\n `,\n icon: css`\n margin-top: -3px; // Exactly centered looks weird, like there's more space on top (even though there isn't) \n `,\n};\n\n\ninterface Props extends React.DetailedHTMLProps, HTMLDivElement> {\n icon: IconDefinition;\n}\n\n\n/**\n * CircleImg: a component that renders a font awesome image in a circle\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CircleImg: React.FC = props => {\n const { icon, ...rest } = props;\n\n return (\n
\n \n
\n );\n};\n\nexport default CircleImg;\n","import * as React from 'react';\nimport { Requirement } from '../../../models';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../../../layout/flexBox';\nimport LocalDiv from '../../../../localization/LocalDiv';\nimport { css } from '@emotion/core';\nimport CircleImg from '../../../../layout/CircleImg';\nimport { faUserPlus, faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\nimport Spacer from '../../../../layout/Spacer';\nimport Metric from '../../../../layout/Metric';\nimport { Str } from '../../../../localization/translationKeys';\nimport { Link } from 'react-router-dom';\nimport { Routes } from '../../../../navigation/routes';\nimport { countInvited, countIncomplete } from '../../../requirements/module';\nimport { COLORS } from '../../../../globalStyle/colors';\nimport Msg from '../../../../localization/Msg';\n\n\nconst styles = {\n root: css`\n justify-content: space-between;\n `,\n raterRow: css`\n justify-content: center;\n `,\n metric: css`\n width: 100px;\n flex-basis: 100px;\n color: ${COLORS.DARK_GREY};\n `,\n metricValue: css`\n font-size: 33px;\n `,\n metricLabel: css`\n font-size: 12px;\n `,\n link: css`\n font-size: 12px;\n text-align: center;\n text-decoration: none;\n `,\n};\n\ntype Props = {\n routes: Routes;\n surveyPastDue: boolean;\n inviteRatersEnabled: boolean;\n requirements: Requirement[] | undefined;\n className?: string;\n};\n\n\n/**\n * RaterCounts: a component that shows the number of incomplete/invited raters for the given project\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterCounts: React.FC = props => {\n const invited = React.useMemo(() => countInvited(props.requirements), [props.requirements]);\n const incomplete = React.useMemo(() => countIncomplete(props.requirements), [props.requirements]);\n\n const allowLinking = React.useMemo(() => !props.surveyPastDue && props.inviteRatersEnabled, [props]);\n\n const inviteLink = React.useMemo(() => allowLinking ? props.routes.InviteRaters : '#', [allowLinking, props.routes]);\n\n const remindLink = React.useMemo(\n () => allowLinking ? props.routes.RemindRatersProjDash : '#',\n [allowLinking, props.routes],\n );\n\n const color = React.useMemo(() => allowLinking ? COLORS.GREEN : COLORS.DISABLED, [allowLinking]);\n\n const linkStyle = React.useMemo(\n () => css`\n color: ${color}; \n cursor: ${allowLinking ? 'pointer' : 'default'};\n margin-top: 5px;\n \n &:hover {\n text-decoration: ${allowLinking ? 'underline' : 'none'};\n }\n `,\n [color, allowLinking],\n );\n\n const circleStyle = React.useMemo(\n () => css`\n background-color: ${color};\n cursor: ${allowLinking ? 'pointer' : 'default'};\n transition: all .2s ease;\n font-size: 20px;\n \n &:hover {\n background-color: ${allowLinking ? COLORS.HOVER_GREY : color};\n }\n `,\n [color, allowLinking],\n );\n\n return (\n \n \n \n \n \n \n \n {\n props.inviteRatersEnabled && (\n \n \n \n )\n }\n \n \n \n \n \n \n \n \n {\n props.inviteRatersEnabled && (\n \n \n \n )\n }\n \n \n \n );\n};\n\nexport default RaterCounts;\n","import { Requirement } from '../models';\n\n\n/**\n * Returns the number of invited raters in the list of maybe requirements.\n * No requirements -> 0\n */\nexport const countInvited = (\n requirements: Requirement[] | undefined,\n): number => (requirements || []).reduce((running, next) => running + next.invitedCount, 0);\n\n\n/**\n * Returns the number of incomplete surveys in the list of maybe requirements.\n * No requirements -> 0\n */\nexport const countIncomplete = (\n requirements: Requirement[] | undefined,\n): number => (requirements || []).reduce((running, next) => running + next.invitedCount - next.completedCount, 0);\n","import * as React from 'react';\nimport { css, keyframes, SerializedStyles } from '@emotion/core';\nimport { COLORS, CHART_COLORS } from '../globalStyle/colors';\nimport { useBrowser } from '../language/useBrowser';\n\n\nconst styles = {\n root: css`\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `,\n svgRoot: css`\n position: absolute;\n z-index: 1;\n transform: rotate(-90deg); /* The unit circle starts at 3 o'clock, this rotates it over to 12 o'clock */\n `,\n childContainer: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 2;\n `,\n};\n\n\nexport type RingConfig = {\n /**\n * Used to uniquely ID the ring\n */\n name: string | number;\n color: string;\n progress: number;\n};\n\n\ntype SvgConfig = {\n normalizedProgress: number;\n strokeDashoffset: number;\n style: SerializedStyles\n};\n\n\ntype Props = {\n ringConfig: RingConfig[];\n radius: number;\n\n // Default Props\n stroke?: number;\n ringBg?: string;\n insideColor?: string;\n\n className?: string;\n};\n\n\nconst toSvgConfig = (circumference: number) => (config: RingConfig): RingConfig & SvgConfig => {\n const normalizedProgress = config.progress > 1 ? config.progress / 100 : config.progress;\n const strokeDashOffest = circumference - normalizedProgress * circumference;\n\n const circleAnimation = keyframes`\n from {\n stroke-dashoffset: ${circumference};\n }\n to {\n stroke-dashoffset: ${strokeDashOffest};\n }\n `;\n\n return ({\n ...config,\n normalizedProgress: normalizedProgress,\n strokeDashoffset: strokeDashOffest,\n style: css`\n animation: ${circleAnimation} 600ms ease-in;\n transition: all 600ms ease; /* In case the value changes */\n `,\n });\n};\n\n\n/**\n * ProgressCircle: a component that renders progress in the form of a circle, and children inside that progress circle.\n * involves some position: absolute sorcery, unfortunately...\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ProgressCircle: React.FC = props => {\n const { onIe } = useBrowser();\n\n // IE11 needs lots of help to properly position the outer rings\n const ieSvgContainerFix = onIe\n ? css`\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n margin: auto;\n width: ${2 * props.radius}px;\n height: ${2 * props.radius}px;\n `\n : undefined;\n\n // The circle stroke centers over the circle border -- we have to subtract out the half-stroke that will poke out from\n // the circle's edge to make the total width/height match 2 * radius\n const normalizedRadius = React.useMemo(() => props.radius - props.stroke! / 2, [props.radius, props.stroke]);\n const circumference = React.useMemo(() => 2 * Math.PI * normalizedRadius, [normalizedRadius]);\n\n const rings = React.useMemo(\n () => props.ringConfig.sort((a, b) => b.progress - a.progress).map(toSvgConfig(circumference)),\n [props.ringConfig, circumference],\n );\n\n return (\n
\n \n \n {\n rings.map(\n ring => (\n \n ),\n )\n }\n \n
\n {props.children}\n
\n
\n );\n};\n\nProgressCircle.defaultProps = {\n insideColor: COLORS.WHITE,\n ringBg: CHART_COLORS.RING_BG,\n stroke: 10,\n};\n\nexport default ProgressCircle;\n","import { Requirement } from '../../../models';\nimport { CHART_COLORS } from '../../../../globalStyle/colors';\nimport { RingConfig } from '../../../../loading/ProgressCircle';\nimport { loopIndex } from '../../../../language/arrays';\n\n\n/**\n * Sums the total number of completed surveys\n */\nexport const sumCompleted = (\n requirements: Requirement[] | undefined,\n): number => requirements?.reduce((running, next) => running + next.completedCount, 0) ?? 0;\n\n\nexport const getSurveyLevelColor = loopIndex(CHART_COLORS.LEVELS);\n\n\nexport const mapRingConfig = (completed: number, requirements: Requirement[] | undefined): RingConfig[] => {\n if (!requirements || completed === 0) {\n return [{ name: 'None Completed', progress: 0, color: 'transparent' }];\n }\n\n return requirements.reduce(\n (running, next, i) => ({\n sum: running.sum + next.completedCount,\n config: running.config.concat({\n name: next.fullName,\n progress: (next.completedCount + running.sum) / completed,\n color: getSurveyLevelColor(i),\n }),\n }),\n { sum: 0, config: [] as RingConfig[] },\n ).config;\n};\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { FLEX_COLUMN, FLEX_CENTERED, FLEX_ROW } from '../../../../layout/flexBox';\nimport ProgressCircle from '../../../../loading/ProgressCircle';\nimport Metric from '../../../../layout/Metric';\nimport { Str } from '../../../../localization/translationKeys';\nimport { Requirement } from '../../../models';\nimport { sumCompleted, mapRingConfig, getSurveyLevelColor } from './module';\nimport { CHART_COLORS, COLORS } from '../../../../globalStyle/colors';\nimport LocalDiv from '../../../../localization/LocalDiv';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faUserCheck, faCircle } from '@fortawesome/free-solid-svg-icons';\nimport BulletedMsg from '../../../../layout/BulletedMsg';\nimport { useAppState } from '../../../../core/redux/hooks';\nimport { isRtl } from '../../../../localization/module';\n\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n css`\n justify-content: flex-start;\n `,\n ],\n\n circle: css`\n width: 210px; \n height: 210px; \n margin: 0 auto;\n `,\n metric: css`\n margin-bottom: 6px;\n `,\n metricValue: css`\n font-size: 33px;\n `,\n metricLabel: css`\n font-size: 12px;\n `,\n metricIcon: css`\n font-size: 20px; \n margin-top: 7px; \n margin-left: 7px;\n `,\n};\n\n\nconst mkCountMsg = (\n isRtl: boolean,\n count: number,\n msg: string,\n): string => isRtl ? `${msg} ${count}` : `${count} ${msg}`;\n\n\ntype Props = {\n requirements: Requirement[] | undefined;\n circleDiameterPx?: number;\n className?: string;\n};\n\n\n/**\n * RaterSummaryChart: a component that renders the number of completed surveys including a doughnut chart showing the\n * proportions of completed surveys from specific rater \"levels\" (groups).\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterSummaryChart: React.FC = props => {\n const rtl = useAppState(state => isRtl(state.locale.textDirection));\n\n const requirements = React.useMemo(\n () => props.requirements\n ?.filter(req => req.completedCount > 0)\n .sort((a, b) => a.completedCount - b.completedCount)\n ?? [],\n [props.requirements],\n );\n\n const numCompleted = React.useMemo(() => sumCompleted(requirements), [requirements]);\n const chartConfig = React.useMemo(() => mapRingConfig(numCompleted, requirements), [numCompleted, requirements]);\n\n return (\n
\n \n 0 ? COLORS.BLUE : CHART_COLORS.RING_BG};`,\n ]}\n >\n \n \n \n {\n numCompleted > 0 && (\n \n {\n requirements?.map((req, i) => (\n \n ))\n }\n \n )\n }\n
\n );\n};\n\nRaterSummaryChart.defaultProps = {\n circleDiameterPx: 210,\n};\n\nexport default RaterSummaryChart;\n","import * as React from 'react';\nimport Card from '../../../../layout/card/Card';\nimport { css } from '@emotion/core';\nimport CardHeader from '../../../../layout/card/CardHeader';\nimport { FLEX_ADAPTIVE } from '../../../../layout/flexBox';\nimport { COLORS } from '../../../../globalStyle/colors';\nimport { Str } from '../../../../localization/translationKeys';\nimport { onMobileDevice } from '../../../../globalStyle/mediaQueries';\nimport { Routes } from '../../../../navigation/routes';\nimport { ParticipantProject, Requirement } from '../../../models';\nimport RequirementSummary from '../../../requirements/RequirementSummary';\nimport { useMsgText } from '../../../../localization/hooks';\nimport RaterCounts from './RaterCounts';\nimport RaterSummaryChart from './RaterSummaryChart';\nimport { isNilOrEmpty } from '../../../../language/module';\nimport { withValidMinOrMax, withValidMinimum } from '../module';\n\n\nconst styles = {\n root: css`\n `,\n content: css`\n margin-top: 20px;\n justify-content: space-between;\n `,\n raterCounts: css`\n height: 180px;\n padding-top: 15px;\n \n &[dir=\"ltr\"] {\n padding-left: 4%;\n }\n \n &[dir=\"rtl\"] {\n padding-right: 4%;\n }\n \n ${onMobileDevice} { \n margin-bottom: 40px;\n padding: 0 !important;\n }\n `,\n completed: css`\n flex-grow: 1;\n flex-shrink: 0;\n margin: 0 20px;\n \n ${onMobileDevice} { \n margin-bottom: 70px;\n }\n `,\n requirements: css`\n padding: 5px 30px;\n \n &[dir=\"ltr\"] {\n border-left: 1px solid ${COLORS.LIGHT_GREY};\n }\n \n &[dir=\"rtl\"] {\n border-right: 1px solid ${COLORS.LIGHT_GREY};\n }\n \n ${onMobileDevice} {\n border: none !important;\n padding: 5px;\n }\n `,\n};\n\n\ntype Props = {\n routes: Routes;\n proj: ParticipantProject | undefined;\n requirements: Requirement[] | undefined;\n className?: string;\n};\n\n\n/**\n * RaterStatusCard: a component that renders the card on the dashboard that shows the status of the project's raters\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterStatusCard: React.FC = props => {\n const cardTitle = useMsgText(Str.RaterStatus);\n\n const nonEmptyRequirements = React.useMemo(\n () => !!props.proj?.maximumsRequired ? withValidMinOrMax(props.requirements) : withValidMinimum(props.requirements),\n [props.proj, props.requirements],\n );\n\n if (!props.proj) {\n return
;\n }\n\n const inviteRemindDisabled = props.proj?.surveyPastDue\n || (props.proj?.followupSurveyStep && !props.proj?.followupSurveyCreated)\n || !props.proj?.inviteRatersStep;\n\n return (\n \n \n
\n {/* Invite/Remind Raters w/ Counts */}\n \n\n {/* Completed Surveys Chart */}\n \n\n {/* Recommended/Required Rater Minimums */}\n {\n !isNilOrEmpty(props.requirements) && (\n \n )\n }\n
\n
\n );\n};\n\nexport default RaterStatusCard;\n\n","import * as React from 'react';\nimport LocalDiv from '../localization/LocalDiv';\nimport { FLEX_SPACED, FLEX_ROW, FLEX_COLUMN, FLEX_CENTERED } from '../layout/flexBox';\nimport { css } from '@emotion/core';\nimport ProgressCircle from '../loading/ProgressCircle';\nimport { COLORS, CHART_COLORS } from '../globalStyle/colors';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faPaste } from '@fortawesome/free-solid-svg-icons';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport { ParticipantProject } from './models';\nimport { Link } from 'react-router-dom';\nimport { Routes } from '../navigation/routes';\n\nimport goalFlagGreenImg from '../assets/goal_flag_green.svg';\nimport goalFlagBlueImg from '../assets/goal_flag_blue.svg';\nimport chartImg from '../assets/chart.svg';\nimport processingImg from '../assets/processing.svg';\n\n\nconst styles = {\n root: css`\n flex-wrap: wrap;\n `,\n linkLayout: [\n FLEX_COLUMN,\n FLEX_CENTERED,\n css`\n margin: auto;\n text-decoration: none;\n \n &:hover { \n opacity: .6;\n }\n \n ${onMobileDevice}{ \n margin-bottom: 20px;\n }\n `,\n ],\n linkDisabled: css`\n cursor: default;\n opacity: .6;\n `,\n stepTitle: css`\n font-size: 13px;\n color: ${COLORS.DARK_GREY};\n font-weight: bold;\n margin-bottom: 5px;\n `,\n statusTitle: css`\n color: ${COLORS.DARK_GREY};\n `,\n img: css`\n width: 35px;\n height: 35px;\n `,\n processImg: css`\n width: 75px;\n height: 75px;\n `,\n icon: css`\n font-size: 30px;\n `,\n iconDisabled: css`\n color: ${COLORS.WHITE}\n `,\n iconInProgress: css`\n color: ${COLORS.GREEN}\n `,\n iconComplete: css`\n color: ${COLORS.BLUE}\n `,\n circle: css`\n width: 130px;\n height: 130px;\n font-size: 30px;\n margin-bottom: 5px;\n `,\n nonChartCircle: css`\n width: 124px;\n height: 124px;\n margin-top: 3px;\n margin-bottom: 8px;\n border-radius: 100%;\n flex-shrink: 0;\n `,\n};\n\n\nconst colorForCompletion = {\n chart: (isCompleted: boolean): string => isCompleted ? COLORS.BLUE : COLORS.GREEN,\n};\n\nconst msgFor = (\n completed: boolean,\n progress: number,\n completedMsg: Str = Str.Completed,\n): Str => completed ? completedMsg : progress === 0 ? Str.NotStarted : Str.InProgress;\n\n\ntype Props = {\n routes: Routes;\n proj: ParticipantProject | undefined;\n className?: string;\n};\n\n\n/**\n * ProjectSteps: a component that renders the middle step circles from the dashboard\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ProjectSteps: React.FC = props => {\n const selfSurveyStatus = React.useMemo(\n () => msgFor(!!props.proj?.selfSurveyCompleted, props.proj?.selfSurveyAmountComplete ?? 0, Str.Submitted),\n [props.proj],\n );\n\n const selfSurveyDisabled = React.useMemo(\n () => props.proj?.selfSurveyCompleted\n || props.proj?.passkeyExpired\n || (props.proj?.followupSurveyStep && !props.proj?.followupSurveyCreated),\n [props.proj],\n );\n const reportAvailable = React.useMemo(() => props.proj?.reportAvailable, [props.proj]);\n const reportProcessing = React.useMemo(() => props.proj?.reportProcessing, [props.proj]);\n\n const setGoalsStatus = React.useMemo(\n () => msgFor(props.proj?.setGoalsAmountComplete === 1, props.proj?.setGoalsAmountComplete ?? 0),\n [props.proj],\n );\n\n if (!props.proj) {\n return
;\n }\n\n return (\n \n {/* Self Survey */}\n {\n props.proj.selfSurveyStep && (\n \n \n \n \n \n \n \n )\n }\n\n {/* Set Goals */}\n {\n props.proj.setGoalsStep && (\n \n \n \n \n \n \n \n )\n }\n\n {/* View Report */}\n {\n props.proj.viewReportStep && (\n \n \n \n Chart\n
\n \n \n )\n }\n \n );\n};\n\nexport default ProjectSteps;\n","import * as React from 'react';\nimport Card from '../../layout/card/Card';\nimport { css } from '@emotion/core';\nimport CardHeader from '../../layout/card/CardHeader';\nimport { FLEX_COLUMN } from '../../layout/flexBox';\nimport { Link } from 'react-router-dom';\nimport { Routes } from '../../navigation/routes';\nimport { btnStyle } from '../../forms/styles/button';\nimport { COLORS } from '../../globalStyle/colors';\nimport { useMsgText } from '../../localization/hooks';\nimport { Str } from '../../localization/translationKeys';\nimport Msg from '../../localization/Msg';\nimport { isDevResources, isEBookResource, isTutorialResource } from './module';\nimport { CustomResource } from './models';\n\n\nconst styles = {\n root: css`\n `,\n header: css`\n margin-bottom: 20px;\n `,\n cardContent: css`\n align-items: stretch; \n margin-top: 20px;\n `,\n btnContainer: css`\n & > span {\n display: block;\n }\n & > * {\n margin-bottom: 6px;\n }\n & > *:last-child {\n margin-bottom: 0;\n }\n `,\n resourceLink: btnStyle.primary(COLORS.BLUE),\n};\n\ntype Props = {\n routes: Routes;\n resources: CustomResource[] | undefined;\n className?: string;\n};\n\nconst renderResource = (routes: Routes, resource: CustomResource): React.ReactNode => {\n if (isDevResources(resource)) {\n return (\n \n \n \n );\n }\n\n if (isEBookResource(resource)) {\n return (\n \n \n \n );\n } \n\n if (isTutorialResource(resource)) {\n return (\n \n \n \n );\n }\n\n return (\n \n {resource.nameText}\n \n );\n};\n\n/**\n * ProjectResources: a component that renders a card with a list of resource links, including special cases for Dev\n * Resources and Video Tutorial\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ProjectResources: React.FC = props => {\n const title = useMsgText(Str.Resources);\n\n if (!props.resources || props.resources.length === 0) {\n return
;\n }\n\n return (\n \n \n
\n {\n props.resources.map(res => renderResource(props.routes, res))\n }\n
\n
\n );\n};\n\nexport default ProjectResources;\n","import * as React from 'react';\nimport Card from '../../layout/card/Card';\nimport { css } from '@emotion/core';\nimport CardHeader from '../../layout/card/CardHeader';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport ProgressCircle from '../../loading/ProgressCircle';\nimport { COLORS } from '../../globalStyle/colors';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faWrench } from '@fortawesome/free-solid-svg-icons';\nimport Spacer from '../../layout/Spacer';\nimport { Link } from 'react-router-dom';\nimport { btnStyle } from '../../forms/styles/button';\nimport { useMsgText } from '../../localization/hooks';\nimport { Str } from '../../localization/translationKeys';\nimport Msg from '../../localization/Msg';\nimport {\n ctaMsgForProgress,\n subtitleMsgForProgress,\n colorForProgress,\n routeForProgress,\n requirementsMsgFor,\n requirementsMsgSubstitutionsFor,\n} from './module';\nimport { DevPlan } from './models';\nimport { Routes } from '../../navigation/routes';\nimport { useBrowser } from '../../language/useBrowser';\nimport { pathCombine } from '../../core/api/module';\nimport { BaseUrl } from '../../core/api/endpoints';\n\n\nconst styles = {\n header: css`\n margin-bottom: 20px;\n `,\n content: css`\n align-items: stretch;\n min-height: 150px;\n flex-basis: 150px;\n `,\n leftSide: css`\n color: ${COLORS.GREEN};\n text-decoration: none;\n align-items: center;\n `,\n rightSide: [\n FLEX_COLUMN,\n css`\n flex-grow: 1;\n `,\n ],\n fullWidth: css`\n width: 100%;\n `,\n subtitle: css`\n font-weight: bold; \n font-size: 16px;\n margin-bottom: 10px;\n `,\n reqText: css`\n margin-bottom: 10px;\n `,\n progress: css`\n flex-basis: 130px; \n flex-shrink: 0; \n width: 130px; \n height: 130px;\n margin: auto;\n `,\n progressCircleIcon: css` \n font-size: 30px;\n `,\n progressText: css`\n color: ${COLORS.GREEN};\n margin-top: 5px;\n `,\n link: css`\n margin-top: auto;\n min-width: 102px; \n font-size: 12px;\n align-self: flex-end;\n `,\n};\n\n\ntype Props = {\n routes: Routes;\n plan: DevPlan | undefined;\n projectId: number;\n className?: string;\n};\n\n\n/**\n * DevPlanSummary: a component that renders the given dev plan state along with links to pages to adjust/complete dev\n * plans. This summary seen mainly on the dashboard\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst DevPlanSummary: React.FC = props => {\n const previousDevPlan = (props.plan?.devPlanProjectId || props.projectId) < props.projectId\n const devPlanInteractive = props.plan?.developmentPlanUseInteractive;\n const devPlanStaticUrl = props.plan?.developmentPlanPageUrl;\n\n const title = useMsgText(previousDevPlan ? Str.ReviewDevPlan : Str.DevPlan);\n\n const staticDevPlanUrl = React.useMemo(\n () => {\n const staticUrl = devPlanStaticUrl || '';\n if (staticUrl === '') {\n return '#';\n }\n if (staticUrl.toLowerCase().startsWith('http')) {\n return staticUrl\n }\n const baseUrl = BaseUrl.substring(0, BaseUrl.length - 4); // ends with '/api'\n const lcUrl = staticUrl.toLowerCase();\n\n return lcUrl.startsWith('developmentplans/') || lcUrl.startsWith('resources/')\n ? pathCombine(baseUrl, staticUrl)\n : pathCombine(baseUrl, 'DevelopmentPlans/', staticUrl)\n },\n [devPlanStaticUrl],\n );\n\n const linkRoute = React.useMemo(\n () => devPlanInteractive ? routeForProgress(props.plan, props.routes) : staticDevPlanUrl,\n [props.plan, props.routes, devPlanInteractive, staticDevPlanUrl],\n );\n\n const linkMsg = React.useMemo(() => ctaMsgForProgress(props.plan), [props.plan]);\n const statusMsg = React.useMemo(() => subtitleMsgForProgress(props.plan), [props.plan]);\n\n const reqMsg = React.useMemo(() => requirementsMsgFor(props.plan), [props.plan]);\n const reqSubs = React.useMemo(() => requirementsMsgSubstitutionsFor(props.plan), [props.plan]);\n\n const color = React.useMemo(() => colorForProgress(props.plan), [props.plan]);\n const colorStyle = React.useMemo(() => css`color: ${color};`, [color]);\n\n const isTrackingGoals = React.useMemo(() => props.plan?.developmentPlanGoalsToTrack !== 0, [props.plan]);\n \n const { onIe } = useBrowser();\n\n\n if (!props.plan) {\n return
;\n }\n\n return (\n \n \n {\n devPlanInteractive && !previousDevPlan\n ? (\n \n { // Left Side\n isTrackingGoals && (\n \n \n \n \n \n \n )\n }\n { // Space\n isTrackingGoals && \n }\n {/* Right Side */}\n
\n \n {\n isTrackingGoals && \n }\n \n \n \n
\n
\n )\n : (\n devPlanInteractive\n ? \n
\n \n \n \n \n
\n
\n : \n
\n \n \n \n \n
\n
\n )\n }\n
\n );\n};\n\nexport default DevPlanSummary;\n","import * as React from 'react';\nimport { Str } from '../../localization/translationKeys';\nimport ModalHeader from '../../layout/modal/ModalHeader';\nimport Modal from '../../layout/modal/Modal';\nimport Msg from '../../localization/Msg';\nimport { btnStyle } from '../../forms/styles/button';\nimport { COLORS } from '../../globalStyle/colors';\nimport LocalBtn from '../../localization/LocalBtn';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { css } from '@emotion/core';\nimport Spacer from '../../layout/Spacer';\nimport { onPhone, onMobileMedium } from '../../globalStyle/mediaQueries';\nimport { useBrowser } from '../../language/useBrowser';\n\n\nconst styles = {\n modal: css`\n min-height: 300px;\n min-width: 300px;\n max-width: 560px;\n margin: 40px;\n ${onPhone} {\n margin: 0;\n }\n `,\n content: css`\n flex-grow: 1;\n margin: 0 20px 20px;\n `,\n msgContainer: css`\n margin: auto 90px;\n flex-grow: 1;\n justify-content: center;\n ${onMobileMedium} {\n margin: auto 40px;\n }\n ${onPhone} {\n margin-bottom: 60px;\n }\n `,\n msg: css`\n font-weight: bold;\n font-size: 18px;\n line-height: 1.5;\n `,\n btnRow: css`\n width: 100%;\n flex-grow: 0;\n margin-top: auto;\n justify-content: center;\n `,\n btn: css`\n min-height: 35px;\n min-width: 132px;\n `,\n};\n\ntype Props = {\n className?: string;\n onClickYes: () => void;\n onDismiss: () => void;\n};\n\n\n/**\n * ReassessmentModal: a component that\n *\n * PureComponent: true\n * Redux Connected:\n */\nconst ReassessmentModal: React.FC = props => {\n const { onIe } = useBrowser();\n\n return (\n \n \n \n
\n \n
\n \n
\n \n \n \n \n \n \n )\n};\n\nexport default ReassessmentModal;\n","import * as React from 'react';\nimport LocalDiv from '../localization/LocalDiv';\nimport { css } from '@emotion/core';\nimport SurveyHeader from './survey/SurveyHeader';\nimport { FLEX_ADAPTIVE } from '../layout/flexBox';\nimport ClamShell from '../layout/ClamShell';\nimport RaterStatusCard from './survey/raters/raterSummary/RaterStatusCard';\nimport Spacer from '../layout/Spacer';\nimport ProjectSteps from './ProjectSteps';\nimport ActionMsg from '../localization/ActionMsg';\nimport { Str } from '../localization/translationKeys';\nimport ProjectResources from './resources/ProjectResources';\nimport DevPlanSummary from './devPlan/DevPlanSummary';\nimport { useHistory } from 'react-router-dom';\nimport { useRoutes } from '../navigation/routes';\nimport ProjectLayout from './ProjectLayout';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\nimport { useMsgText } from '../localization/hooks';\nimport { useAppState } from '../core/redux/hooks';\nimport { useProjIds } from '../navigation/hooks';\nimport ErrorMsg from '../error/ErrorMsg';\nimport ReassessmentModal from './survey/ReassessmentModal';\nimport { useToggle } from '../core/hooks/useToggle';\nimport { useDispatch } from 'react-redux';\nimport { reassessmentAction } from './api/reassessmentAction';\nimport { isNilOrEmpty } from '../language/module';\nimport { useEffect } from 'react';\n\n\nconst styles = {\n devPlan: css`\n flex-grow: 1;\n flex-basis: 1px;\n `,\n customResources: css`\n flex-basis: 1px;\n flex-grow: 1;\n `,\n header: css`\n margin-bottom: 40px;\n \n ${onMobileDevice} {\n margin-bottom: 35px;\n }\n `,\n actionBanner: css`\n padding-bottom: 20px;\n `,\n projectSteps: css`\n & > a { \n margin-top: 80px; \n }\n `,\n};\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * ProjectSummary: a component that renders a basic overview of a project's status plus links out to the various bits\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ProjectSummary: React.FC = props => {\n const history = useHistory();\n const dispatch = useDispatch();\n\n const projIds = useProjIds();\n\n const pageTitle = useMsgText(Str.Dashboard);\n\n const project = useAppState(state => state.projectSummary);\n const resources = useAppState(state => state.projectResources);\n const projReqs = useAppState(state => state.participantRequirements || []);\n\n const routes = useRoutes(projIds.participantId, projIds.projDisplayId);\n\n const showSurveyBanner = !project?.expired && !!project?.followupSurveyStep && !project?.followupSurveyCreated;\n const showInviteBanner = !showSurveyBanner\n && !project?.expired\n && project?.inviteRatersStep\n && !project?.raterInvited\n && !project.surveyPastDue;\n const showProjectSteps = project?.selfSurveyStep || project?.setGoalsStep || project?.viewReportStep;\n const showRaterStatus = project?.inviteRatersStep;\n const showReassessmentBanner = project?.reassessmentProject \n && project?.reassessmentTriggerOwn \n && project?.reportAvailable \n && (!project?.hasReassessmentRater || !project.reassessmentSurveyCompleted)\n\n const [confirmReassessment, toggleConfirmReassessment] = useToggle();\n\n const onCreateSurveyClick = React.useCallback(\n () => history.push(routes.CreateSurvey),\n [history, routes.CreateSurvey],\n );\n\n const onInviteRatersClick = React.useCallback(\n () => history.push(routes.InviteRaters),\n [history, routes.InviteRaters],\n );\n\n const reassessmentSurveyUrl = useAppState(state => state.reassessmentSurveyUrl);\n\n const onConfirmReassessmentClick = React.useCallback(\n () => {\n dispatch(reassessmentAction(projIds.projDisplayId, projIds.participantId));\n // close the modal\n toggleConfirmReassessment();\n },\n [projIds.projDisplayId, projIds.participantId, dispatch, toggleConfirmReassessment],\n );\n\n useEffect(\n () => {\n // open survey in new tab if successful\n if (!isNilOrEmpty(reassessmentSurveyUrl)) {\n window.open(reassessmentSurveyUrl, '_self');\n }\n },\n [reassessmentSurveyUrl],\n );\n // may also want to use useOnSuccess\n\n if (!project) {\n return ;\n }\n\n return (\n \n \n\n { // Invite Raters Banner\n \n
\n \n
\n
\n }\n { // Create Survey Banner\n \n
\n \n
\n
\n }\n { // Reassessment Banner\n \n
\n \n
\n
\n }\n {\n confirmReassessment && (\n \n )\n }\n {\n (showRaterStatus) && (\n \n )\n }\n\n {\n (showProjectSteps) && (\n a { margin-top: 80px; }`}\n />\n )\n }\n\n {/* Development Plan & Project Resources */}\n \n {\n (project.developmentPlanStep) && (\n <>\n \n \n \n )\n }\n \n \n
\n );\n};\n\nexport default ProjectSummary;\n","import * as React from 'react';\nimport { useMemo, useState } from 'react';\nimport * as R from 'ramda';\nimport { useHistory } from 'react-router-dom';\nimport { Str } from '../../localization/translationKeys';\nimport { useMsgText } from '../../localization/hooks';\nimport ModalHeader from '../../layout/modal/ModalHeader';\nimport Modal from '../../layout/modal/Modal';\nimport LocalSelect from '../../localization/LocalSelect';\nimport { SELECT } from '../../forms/styles/select';\nimport LocalDropdownOption from '../../localization/LocalDropdownOption';\nimport { useAppState } from '../../core/redux/hooks';\nimport LocalDiv from '../../localization/LocalDiv';\nimport Msg from '../../localization/Msg';\nimport { css } from '@emotion/core';\nimport { DevResource } from './models';\nimport Spacer from '../../layout/Spacer';\nimport LocalHTMLContainer from '../../localization/LocalHTMLContainer';\nimport { COLORS } from '../../globalStyle/colors';\nimport { isNilOrEmpty } from '../../language/module';\nimport { useWindowSize } from '../../core/hooks/useWindowSize';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport { btnStyle } from '../../forms/styles/button';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faCaretLeft, faCaretRight } from '@fortawesome/free-solid-svg-icons';\n\n\nconst styles = {\n root: css`\n max-width: 530px;\n `,\n content: [\n FLEX_COLUMN,\n css`\n margin: 0 24px 24px;\n `,\n ],\n select: css`\n background-color: ${COLORS.WHITE}; \n `,\n selectRow: [\n FLEX_ROW,\n css`\n justify-content: flex-start;\n `,\n ],\n button: [\n btnStyle.primary(COLORS.DARK_GREY),\n css`\n font-size: 24px;\n height: 35px;\n width: 35px;\n `,\n ],\n whiteBottom: css`\n border-bottom 1px solid ${COLORS.WHITE};\n width: 100%;\n `,\n labels: {\n title: css`\n font-weight: bold;\n `,\n value: css`\n margin-bottom: 20px;\n display: block;\n `,\n },\n};\n\n\ntype Props = {\n onDismiss?: () => void,\n className?: string;\n};\n\n\n/**\n * DevResourceModal: a component that renders a project's development resources\n *\n * PureComponent: true\n * Redux Connected: true\n */\nconst DevResourceModal: React.FC = props => {\n const history = useHistory();\n\n const { isMobile } = useWindowSize();\n\n const header = useMsgText(Str.DevResources);\n\n const compCats = useAppState(state => state.devResources || []);\n const [resource, setResource] = useState(compCats?.[0] ?? undefined);\n\n const dismiss = props.onDismiss ?? (() => history.goBack());\n\n const options = useMemo(\n () => R.map(\n compCat => compCat.visibilityOn && (\n \n ),\n compCats,\n ),\n [compCats],\n );\n\n const disablePreviousBtn = !compCats.length || resource?.competencyId === compCats[0].competencyId;\n const disableNextBtn = !compCats.length || resource?.competencyId === compCats[compCats.length - 1].competencyId;\n\n const selectedIndex = () => R.findIndex(R.propEq('competencyId', resource?.competencyId))(compCats);\n\n const setPrevious = (selectedIndex: number) => selectedIndex > 0 && setResource(compCats[selectedIndex - 1]);\n\n const setNext = (\n selectedIndex: number,\n ) => selectedIndex > -1 && selectedIndex < compCats.length && setResource(compCats[selectedIndex + 1]);\n\n const renderInfo = useMemo(\n () => (\n \n {!isNilOrEmpty(resource?.description) && (\n <>\n \n \n \n )}\n {!isNilOrEmpty(resource?.scoreHighMessage) && (\n <>\n \n \n \n )}\n {!isNilOrEmpty(resource?.scoreLowMessage) && (\n <>\n \n \n \n )}\n {!isNilOrEmpty(resource?.developmentTips) && (\n <>\n \n \n \n )}\n ),\n [resource],\n );\n\n const dir = useAppState(state => state.locale.textDirection);\n\n return (\n \n \n \n \n \n \n \n setResource(compCats.find(c => c.competencyId === +event.target.value))}\n dir={dir}\n >\n {options}\n \n {\n !isMobile && (\n <>\n \n setPrevious(selectedIndex())}\n disabled={disablePreviousBtn}\n >\n \n \n \n setNext(selectedIndex())}\n disabled={disableNextBtn}\n >\n \n \n \n )\n }\n \n \n \n {renderInfo}\n \n \n );\n};\n\nexport default DevResourceModal;\n","/**\n * For project-specific messages/translations, these are the keys in the key-value pairs for a given language.\n */\nexport enum ProjStr {\n ConfidentialityMessageTitle = 'Portal-ConfidentialityMessageTitle',\n ConfidentialityMessageAgreement = 'Portal-ConfidentialityMessageAgreement',\n ConfidentialityMessageAcknowledgement = 'Portal-ConfidentialityMessageAcknowledgement',\n ConfidentialityMessageFooter = 'Portal-ConfidentialityMessageFooter',\n\n AddToSurvey = 'Portal-AddToSurvey',\n CreateSurveyMsg = 'Portal-CreateSurveyMsg',\n CreateSurveyMinMaxMsg = 'Portal-CreateSurveyMinMaxMsg',\n CreateSurveyMinMsg = 'Portal-CreateSurveyMinMsg',\n CreateSurveyMaxMsg = 'Portal-CreateSurveyMaxMsg',\n CreateSurveyReadyMsg = 'Portal-CreateSurveyReadyMsg',\n CreateSurveyMaxErrMsg = 'Portal-CreateSurveyMaxErrMsg',\n NoSurveyItemsAdded = 'Portal-NoSurveyItemsAdded',\n RequiredForSurvey = 'Portal-RequiredForSurvey',\n\n DevPlanInstructions = 'Portal-DevPlanInstructions',\n SetGoalsIntro = 'Portal-SetGoalsIntro',\n InviteRatersIntro = 'Portal-InviteRatersIntro',\n}\n","import React from 'react';\nimport { useAppState } from '../../core/redux/hooks';\nimport { Message } from '../../localization/models';\n\n\n/**\n * A React Hook for retrieving a message object from the app state project translations/messages.\n * Use this if you need information about the message like whether it contains HTML markup.\n * Use `useProjMsgText` if you just need the message string.\n */\nexport const useProjMsg = (str: string | number): Message | undefined => {\n const translations = useAppState(state => (state.projectMsgs || {})[state.locale.lang.languageId]);\n return React.useMemo(() => (translations ?? {})[str], [str, translations]);\n};\n\n\n/**\n * A React Hook for reading a translated string from the app state project translations/messages\n */\nexport const useProjMsgText = (\n str: string | number,\n defaultMsg: string = '',\n): string => useProjMsg(str)?.text ?? defaultMsg;\n","import * as React from 'react';\nimport { useProjMsg } from './hooks';\nimport LocalHTMLContainer from '../../localization/LocalHTMLContainer';\nimport { removeRedundantBackslashes } from '../../localization/removeRedundantBackslashes';\nimport { useAppState } from '../../core/redux/hooks';\n\n\ntype SpanOrDiv = Extract;\ntype SpanOrDivProps = React.DetailedHTMLProps, SpanOrDiv>;\n\n\ninterface Props extends SpanOrDivProps {\n str: string | number;\n defaultMsg?: string | number;\n curlyTokens?: { [key: string]: string | number | undefined; };\n pointyTokens?: { [key: string]: string | number | undefined; };\n}\n\n\n/**\n * LocalMsgContainer: a component that renders a translated message as either plain text or, if it contains, markup,\n * raw HTML.\n *\n * When replacing with 'curlyTokens', this component automatically adds interpolation braces to your keys\n * -- use `userName` to replace `{userName}` from the raw message text.\n *\n * When replacing with `pointyTokens`, this component automatically adds TruScore-specific tag boundaries to your keys\n * -- use `userName` to replace `<@userName>` from the raw message text.\n *\n * Props:\n * 1. The `msgKey` prop is the key for the translated message object stored in app state.\n * 1. The `defaultMsg` prop allows the user the opportunity to pass in a default string if one is preferred over the\n * fallback string. If set to the empty string, when a translated message is missing, no component will be rendered.\n * Note that this prop is ignored if a translation exists and contains HTML markup.\n * 1. The `curlyTokens` and `pointyTokens` props are both objects of `{'toReplace': 'replacement'}` key-value pairs.\n * It's recommended that you memoize this object in your component, otherwise, replacement logic will run on every\n * render XP\n *\n * PureComponent: true\n * Connected to Redux: false\n */\nconst ProjMsg: React.FC = props => {\n const { str, defaultMsg, curlyTokens, pointyTokens, ...rest } = props;\n\n const msg = useProjMsg(props.str);\n\n const msgText = React.useMemo(\n () => {\n const text = msg?.text ?? defaultMsg;\n\n if (!text) {\n return;\n }\n\n const withTokensReplaced = curlyTokens\n ? Object\n .keys(curlyTokens!)\n .reduce(\n (running, next) => running.replace(new RegExp('{' + next + '}', 'g'), `${curlyTokens![next] ?? ''}`),\n `${text}`,\n )\n : text;\n\n return pointyTokens\n ? Object\n .keys(pointyTokens!)\n .reduce(\n (running, next) => running.replace(new RegExp('<@' + next + '>', 'g'), `${pointyTokens![next] ?? ''}`),\n `${withTokensReplaced}`,\n )\n : withTokensReplaced;\n },\n [msg, defaultMsg, curlyTokens, pointyTokens],\n );\n \n const dir = useAppState(state => state.locale.textDirection);\n\n if (!msgText) {\n return null;\n }\n\n return msg && msg.containsMarkup\n ? \n : {msgText ?? defaultMsg};\n};\n\nexport default ProjMsg;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport Card from '../../layout/card/Card';\nimport { Str } from '../../localization/translationKeys';\nimport LocalDiv from '../../localization/LocalDiv';\nimport LocalBtn from '../../localization/LocalBtn';\nimport Spacer from '../../layout/Spacer';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { COLORS } from '../../globalStyle/colors';\nimport { btnStyle } from '../../forms/styles/button';\nimport { GoalAnswer } from './models';\nimport { useFormik } from 'formik';\nimport LocalTextArea from '../../localization/LocalTextArea';\nimport { FIELDSET_DEFAULT } from '../../layout/fieldSetStyle';\n\n\nconst BTN_STYLE = css`\n min-width: 80px;\n`;\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n css`\n padding: 0;\n margin-bottom: 20px;\n background-color: transparent;\n `,\n ],\n textArea: [\n css`\n width: 100%; \n padding: 10px;\n color: #474747;\n box-sizing: border-box;\n border: none;\n border-radius: 8px;\n `,\n ],\n buttonRow: [\n FLEX_ROW,\n css`\n margin: 10px 16px 0 0;\n justify-content: flex-start;\n `,\n ],\n submitButton: [\n btnStyle.primary(COLORS.BLUE),\n BTN_STYLE,\n ],\n cancelButton: [\n btnStyle.transparent(COLORS.BLUE),\n BTN_STYLE,\n css`\n border: none;\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n goalAnswer: GoalAnswer;\n saveAnswer: (answer: string) => void;\n handleClick: () => void;\n handleCancel: () => void;\n inEditMode: boolean;\n};\n\n\n/**\n * Answer: a component that handles a goal answer\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst Answer: React.FC = props => {\n const editMode = props.inEditMode;\n\n const { handleSubmit, handleChange, resetForm, values } = useFormik({\n initialValues: {\n answer: props.goalAnswer.questionAnswer,\n },\n onSubmit: (values) => {\n props.saveAnswer(values.answer);\n },\n validateOnChange: false,\n });\n\n // TODO - this is all going to change based on Slack conversation 6/12\n // will hold for now until Kellen works out strategy for Dev Plan\n\n return (\n \n
\n
\n \n {\n editMode && (\n \n \n \n {props.handleCancel(); resetForm();}}\n css={styles.cancelButton} str={Str.Cancel}\n />\n \n )\n }\n \n
\n
\n )\n};\n\nexport default Answer;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport Answer from './Answer';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { GoalAnswer } from './models';\n\n\nconst styles = {\n root: css`\n `,\n question: css`\n font-weight: bold;\n margin-bottom: 10px;\n `,\n};\n\n\ntype Props = {\n className?: string;\n goalAnswer: GoalAnswer;\n saveAnswer: (answer: string) => void;\n handleClick: () => void;\n handleCancel: () => void;\n inEditMode: boolean;\n};\n\n\n/**\n * Goal: a component that shows a goal and answer\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst Goal: React.FC = props => (\n \n \n {props.goalAnswer.questionText}\n \n \n \n);\n\nexport default Goal;\n","import * as yup from 'yup';\n\n\nexport const emailGoalsFormValidation = yup.object().shape(\n {\n email: yup\n .string()\n .email()\n .required(),\n comment: yup\n .string(),\n },\n);","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { btnStyle } from '../../forms/styles/button';\nimport { COLORS } from '../../globalStyle/colors';\nimport { useDispatch } from 'react-redux';\nimport { useFormik } from 'formik';\nimport LocalDiv from '../../localization/LocalDiv';\nimport Msg from '../../localization/Msg';\nimport { Str } from '../../localization/translationKeys';\nimport LocalInput from '../../localization/LocalInput';\nimport { INPUT } from '../../forms/styles/input';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { ERROR_MSG } from '../../forms/styles/messages';\nimport { useError, useLoading } from '../../core/api/hooks';\nimport { ActionType } from '../../core/redux/actionType';\nimport { sendGoalsAction } from './sendGoalsAction';\nimport { SendTo } from './models';\nimport { emailGoalsFormValidation } from './formValidations';\nimport { faCheck } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport Spacer from '../../layout/Spacer';\nimport { FIELDSET_DEFAULT } from '../../layout/fieldSetStyle';\nimport LocalTextArea from '../../localization/LocalTextArea';\nimport { useToggle } from '../../core/hooks/useToggle';\nimport { useStickyDiff } from '../../core/hooks/useStickyDiff';\nimport { onPhone } from '../../globalStyle/mediaQueries';\nimport { useProjIds } from '../../navigation/hooks';\n\n\nconst styles = {\n root: [\n css`\n width: 320px;\n ${onPhone} {\n width: auto;\n } `,\n ],\n msgRow: [\n css`\n margin: 0 0 20px;\n `,\n ],\n input: [\n css`\n margin-bottom: 10px;\n border: none;\n width: 100%;\n `,\n ],\n textArea: [\n css`\n margin-bottom: 15px;\n padding: 10px;\n color: #474747;\n box-sizing: border-box;\n border: none;\n border-radius: 8px;\n width: 100%;\n `,\n ],\n submitButton: [\n btnStyle.primary(COLORS.DARK_GREY),\n css`\n width: 100%;\n `,\n ],\n};\n\ntype Props = {\n className?: string;\n languageId: number;\n allAnswered: boolean;\n};\n\n\n/**\n * EmailGoalsForm: a component that allows goals to be sent via email\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst EmailGoalsForm: React.FC = props => {\n const dispatch = useDispatch();\n\n const projIds = useProjIds();\n\n const sendingGoals = useLoading(ActionType.SendGoalsRequest, `${(projIds.projId)}`);\n const errorSendingGoals = !!useError(ActionType.SendGoalsRequest, `${(projIds.projId)}`);\n\n const [goalsSent, toggleSentAlert] = useToggle();\n\n useStickyDiff(\n (prev, next) => prev?.isLoading && !next.isLoading && !next.hasError && toggleSentAlert(),\n {\n isLoading: sendingGoals,\n hasError: errorSendingGoals,\n },\n );\n\n const sendGoals = React.useCallback(\n (\n comment: string,\n to: SendTo[],\n ) => dispatch(sendGoalsAction(\n projIds.projId,\n projIds.participantId,\n comment,\n to,\n )),\n [dispatch, projIds.projId, projIds.participantId],\n );\n\n const validationError = !!useError(ActionType.SendGoalsError);\n\n const sendTo = (email: string) => (\n [\n {\n toAddress: email,\n languageId: props.languageId,\n },\n ]\n );\n\n const { handleSubmit, handleChange, isValid, values } = useFormik({\n initialValues: {\n comment: '',\n email: '',\n },\n onSubmit: (values) => {\n sendGoals(values.comment, sendTo(values.email));\n },\n validationSchema: emailGoalsFormValidation,\n validateOnChange: false,\n });\n\n return (\n
\n
\n {\n (goalsSent) && (\n \n \n \n \n \n )\n }\n \n \n \n {\n (!isValid) && (\n \n \n
\n )\n }\n \n \n \n \n \n );\n};\n\nexport default EmailGoalsForm;\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { css } from '@emotion/core';\nimport { FLEX_ROW } from '../../layout/flexBox';\nimport { Str } from '../../localization/translationKeys';\nimport { faEnvelope } from '@fortawesome/free-solid-svg-icons';\nimport { Z_INDEX } from '../../globalStyle/zIndex';\nimport { COLORS } from '../../globalStyle/colors';\nimport { btnStyle } from '../../forms/styles/button';\nimport MobileToolbarBtn from '../../localization/MobileToolbarBtn';\n\n\nconst styles = {\n root: css`\n justify-content: flex-end;\n width: 100vw;\n height: 72px;\n position: fixed;\n bottom: 0;\n z-index: ${Z_INDEX.MOBILE_TOOLBAR};\n background-color: ${COLORS.WHITE};\n `,\n button: css`\n font-size: 9px;\n border-radius: 0;\n flex-basis: 80px;\n border-color: transparent;\n height: 72px;\n line-height: normal;\n & > span {\n overflow-wrap: break-spaces;\n text-transform: uppercase;\n }\n `,\n};\n\n\ntype Props = {\n className?: string;\n allAnswered: boolean;\n languageId: number;\n openSendGoalsModal: () => void;\n}\n\n\n/**\n * MobileSetGoalsActionsBar: a tool bar which houses the action button associated with the set goals flow on mobile\n * screens.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst MobileSetGoalsActionsBar: React.FC = props => (\n ReactDOM.createPortal(\n
\n \n
\n ,\n document.getElementById('root') || document.getElementById('react-root') || document.body,\n )\n);\n\nexport default MobileSetGoalsActionsBar;\n","import * as React from 'react';\nimport Modal from '../../layout/modal/Modal';\nimport ModalHeader from '../../layout/modal/ModalHeader';\nimport { css } from '@emotion/core';\nimport { onMobileDevice } from '../../globalStyle/mediaQueries';\nimport { useMsgText } from '../../localization/hooks';\nimport { Str } from '../../localization/translationKeys';\nimport EmailGoalsForm from './EmailGoalsForm';\nimport LocalDiv from '../../localization/LocalDiv';\n\n\nconst styles = {\n root: css`\n ${onMobileDevice} {\n width: 100vw;\n height: 100vh;\n margin: 0;\n }\n `,\n form: css`\n margin: 20px;\n `,\n};\n\n\ntype Props = {\n className?: string;\n languageId: number;\n allAnswered: boolean;\n dismiss: () => void;\n};\n\n\n/**\n * SendGoalsEmailModal: a component allows user to send goals email\n *\n \n * PureComponent: true\n * Redux Connected: false\n */\nconst SendGoalsEmailModal: React.FC = props => {\n const title = useMsgText(Str.EmailGoals);\n\n return (\n \n \n \n \n \n \n );\n};\n\nexport default SendGoalsEmailModal;\n","import * as R from 'ramda';\nimport * as React from 'react';\nimport { useMemo, useState } from 'react';\nimport ProjectLayout from '../ProjectLayout';\nimport SurveyHeader from '../survey/SurveyHeader';\nimport { onMobileDevice, onPhone } from '../../globalStyle/mediaQueries';\nimport { css } from '@emotion/core';\nimport { useMsgText } from '../../localization/hooks';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { useAppState } from '../../core/redux/hooks';\nimport { Str } from '../../localization/translationKeys';\nimport { ProjStr } from '../messages/ProjStr';\nimport ProjMsg from '../messages/ProjMsg';\nimport Goal from './Goal';\nimport EmailGoalsForm from './EmailGoalsForm';\nimport { useMount } from '../../core/hooks/useMount';\nimport { useDispatch } from 'react-redux';\nimport { goalsAnswersAction } from './goalsAnswersAction';\nimport { GoalAnswer } from './models';\nimport { setGoalAnswerAction } from './setGoalAnswerAction';\nimport { COLORS } from '../../globalStyle/colors';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport { isNilOrEmpty } from '../../language/module';\nimport MobileSetGoalsActionsBar from './MobileSetGoalsActionsBar';\nimport { useWindowSize } from '../../core/hooks/useWindowSize';\nimport { useToggle } from '../../core/hooks/useToggle';\nimport SendGoalsEmailModal from './SendGoalsEmailModal';\nimport Card from '../../layout/card/Card';\nimport CardHeader from '../../layout/card/CardHeader';\nimport { faEnvelope } from '@fortawesome/free-solid-svg-icons';\nimport { useProjIds } from '../../navigation/hooks';\n\n\nconst styles = {\n header: css`\n margin-bottom: 40px;\n ${onMobileDevice} {\n margin-bottom: 35px;\n }\n `,\n intro: css`\n margin: 40px 0;\n display: block;\n ${onMobileDevice} {\n margin: 10px 0;\n }\n `,\n content: css`\n color: ${COLORS.DARK_GREY};\n `,\n container: css`\n flex-wrap: wrap;\n `,\n goals: css`\n flex-wrap: wrap;\n flex-grow: 1;\n flex-basis: 50%;\n ${onPhone} {\n margin: 0;\n }\n\n &[dir=\"ltr\"] {\n margin-right: 25px;\n }\n \n &[dir=\"rtl\"] {\n margin-left: 25px;\n } \n `,\n\n\n card: [\n FLEX_COLUMN,\n css`\n background-color: ${COLORS.LIGHTEST_GREY};\n `,\n ],\n cardTitle: [\n css`\n margin: 0 0 20px;\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * SetGoals: a component that renders the page where the user can set their project goals -- what they want to achieve\n * by getting feedback from others, completing their self-survey etc.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst SetGoals: React.FC = props => {\n const dispatch = useDispatch();\n\n const { isMobile } = useWindowSize();\n\n const pageTitle = useMsgText(Str.SetGoals);\n const cardTitle = useMsgText(Str.EmailGoals);\n\n const [underEdit, setUnderEdit] = useState(undefined);\n const [sendingGoals, toggleSendGoalsModal] = useToggle();\n\n const projIds = useProjIds();\n\n const project = useAppState(state => state.projectSummary);\n const languages = useAppState(state => state.projectLanguages?.[`${projIds.projId}`]);\n const languageId = useAppState(state => state.locale.lang.languageId);\n\n useMount(() => { dispatch(goalsAnswersAction(projIds.projId, projIds.participantId, languageId)); });\n\n const goalsAndAnswers = useAppState(state => (state.goalsAnswers || {})[projIds.projId]);\n\n const allAnswered = useMemo(\n () => Object.values(goalsAndAnswers || {}).every(s => !isNilOrEmpty(s.questionAnswer)),\n [goalsAndAnswers],\n );\n\n const projDefaultLang = useMemo(\n () => languages?.find(lang => lang.default)?.languageId ?? languages?.[0]?.languageId ?? 1,\n [languages],\n );\n\n const saveAnswer = React.useCallback(\n (answer: string) => {\n dispatch(setGoalAnswerAction(projIds.projId, projIds.participantId, underEdit?.questionId || 0, answer));\n setUnderEdit(undefined);\n },\n [dispatch, projIds.projId, projIds.participantId, underEdit],\n );\n\n const handleClick = React.useCallback(\n (goalAnswer: GoalAnswer) => goalAnswer !== underEdit && setUnderEdit(goalAnswer),\n [setUnderEdit, underEdit],\n );\n\n const goalCards = useMemo(\n () => {\n const inEditMode = (questionId: number) => underEdit?.questionId === questionId;\n const handleCancel = () => setUnderEdit(undefined);\n\n return R.map(\n (goal: GoalAnswer) => (\n handleClick(goal)}\n handleCancel={handleCancel}\n inEditMode={inEditMode(goal.questionId)}\n />\n ),\n Object.values(goalsAndAnswers ?? {}),\n );\n },\n [underEdit, goalsAndAnswers, saveAnswer, handleClick],\n );\n\n return (\n \n \n \n \n
\n \n {goalCards}\n \n {\n !isMobile && (\n \n \n \n \n )\n }\n
\n
\n {\n isMobile && (\n \n )\n }\n {\n sendingGoals && (\n \n )\n }\n
\n );\n};\n\nexport default SetGoals;\n","import * as React from 'react';\nimport { useEffect } from 'react';\nimport ProjectLayout from '../../ProjectLayout';\nimport { useDispatch } from 'react-redux';\nimport { useMount } from '../../../core/hooks/useMount';\nimport { openMenuAction } from '../../sideMenu/openMenuAction';\nimport { css } from '@emotion/core';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { useHistory } from 'react-router-dom';\nimport { isRtl } from '../../../localization/module';\nimport { makeRoutes } from '../../../navigation/routes';\nimport { useProjIds } from '../../../navigation/hooks';\n\n\nconst styles = {\n iframe: css`\n width: 100%;\n height: calc(100vh - 51px);\n `,\n};\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * SelfSurvey: a component that displays the survey application\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst SelfSurvey: React.FC = props => {\n const selfSurveyUrl = useAppState(state => state.projectSummary?.selfSurveyUrl);\n const dispatch = useDispatch();\n const history = useHistory();\n\n useMount(() => { window.setTimeout(() => dispatch(openMenuAction(false)), 200); });\n\n const projIds = useProjIds();\n\n useEffect(\n () => {\n //on survey complete or 'finish later', go back to dashboard\n const handleFinish = (event: MessageEvent) => {\n if (event.data === 'finish') {\n dispatch(openMenuAction(true));\n history.push(makeRoutes(projIds.participantId, projIds.projDisplayId).Project);\n }\n };\n\n window.addEventListener('message', handleFinish, false);\n\n // Return cleanup function to unregister the event listener when the component unmounts\n return () => window.removeEventListener('message', handleFinish, false);\n },\n [projIds.participantId, projIds.projDisplayId, history, dispatch],\n );\n\n const rtl = useAppState(state => isRtl(state.locale.textDirection));\n const langId = useAppState(state => state.locale.lang.languageId);\n \n\n return (\n \n \n \n );\n};\n\nexport default SelfSurvey;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { COLORS } from '../../globalStyle/colors';\nimport ClamShell from '../../layout/ClamShell';\nimport Spacer from '../../layout/Spacer';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\n\n\nconst styles = {\n msgBar: css`\n background-color: ${COLORS.WHITE};\n padding: 8px;\n border: 0 none;\n min-height: 50px;\n border-radius: 8px;\n margin-bottom: 20px;\n `,\n msgContainer: css`\n align-items: center;\n margin: auto 8px;\n `,\n};\n\n\ntype Props = {\n show: boolean;\n iconImage: IconProp;\n iconColor: string;\n message: React.ReactNode;\n className?: string;\n};\n\n\n/**\n * CreateSurvey: a component that shows messages regarding the creation of a feedback survey\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CreateSurveyMessageBar: React.FC = props => (\n
\n \n \n \n \n {props.message}\n \n \n
\n);\n\n\nexport default CreateSurveyMessageBar;\n","import * as React from 'react';\nimport { useMemo, useState } from 'react';\nimport * as R from 'ramda';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport { COLORS } from '../../globalStyle/colors';\nimport { css } from '@emotion/core';\nimport { FeedbackSurveyQuestion } from './models';\nimport { DevPlanItem } from '../devPlan/models';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faWrench, faTrash, faMinusSquare, faPlusSquare } from '@fortawesome/free-solid-svg-icons';\nimport ActionIcon from '../../layout/ActionIcon';\nimport { useAppState } from '../../core/redux/hooks';\nimport { Z_INDEX } from '../../globalStyle/zIndex';\n\n\nconst styles = {\n competency: css`\n justify-content: space-between;\n min-height: 28px;\n `,\n hide: css`\n display: none;\n `,\n question: css`\n justify-content: space-between;\n `,\n greenBg: css`\n background-color: rgba(210, 232, 190, 1); /* based on ${COLORS.LIGHT_GREEN} */\n `,\n lightGreenBg: css`\n background-color: rgba(210, 232, 190, .5); /* based on ${COLORS.LIGHT_GREEN} */\n `,\n blueBg: css`\n background-color: rgba(143, 193, 255, 1); /* based on ${COLORS.LIGHT_BLUE} */\n `,\n lightBlueBg: css`\n background-color: rgba(143, 193, 255, .5); /* based on ${COLORS.LIGHT_BLUE} */\n `,\n borderTop: css `\n border-top: 1px solid ${COLORS.WHITE};\n `,\n questionText: css`\n padding: 7px 26px;\n overflow: auto;\n `,\n wrenchIcon: css`\n margin-top: 7px;\n `,\n competencyOpen: css `\n margin-top: 5px;\n `,\n competencyName: css `\n margin: 7px 10px 0;\n `,\n deleteBtn: css`\n border: none;\n background-color: transparent;\n text-decoration: none;\n color: ${COLORS.DARK_GREY};\n margin-top: 5px;\n\n &:hover { \n opacity: .6;\n cursor:pointer;\n }\n `,\n deleteIcon: css`\n font-size: 16px;\n margin-bottom: 2px;\n `,\n iconWhite: css`\n color: ${COLORS.WHITE};\n `,\n iconDarkGrey: css`\n color: ${COLORS.DARK_GREY};\n `,\n plusMinus: css`\n font-size: 1.1em;\n cursor: pointer;\n text-align: center;\n color: ${COLORS.DARK_GREY};\n `,\n plusMinusDarkBg: css`\n font-size: 1.1em;\n cursor: pointer;\n text-align: center;\n color: ${COLORS.WHITE};\n `, center: css`\n justify-content: center;\n `,\n padEnds: css`\n padding: 0 14px;\n `,\n italicized: css`\n font-style: italic;\n `,\n};\n\n\ntype Props = {\n className?: string;\n questions: FeedbackSurveyQuestion[];\n devItems: DevPlanItem[];\n addByCompetency: boolean;\n showDelete: boolean;\n deleteQuestion: (questionId: number) => void;\n deleteQuestionsForCompetency: (competencyId: number) => void;\n darkBackground: boolean;\n addedStyle: boolean;\n createdMode: boolean;\n};\n\n\n/**\n * CreateSurveyViewAccordian: a component that shows subset of questions\n * PureComponent: true\n * Redux Connected: false\n */\nconst CreateSurveyViewAccordian: React.FC = props => {\n const competencies = Array.from(new Set(props.questions.map((item: FeedbackSurveyQuestion) => item.competencyId)))\n const [open, setOpen] = useState(undefined);\n const menuOpen = useAppState(state => state.openSideMenu); \n\n const accordian = useMemo(\n () => { \n const showWrench = (competencyId: number) => (\n competencyId > 0 && props.devItems.some(x => x.devItemCompetencyId === competencyId)\n );\n \n const questionSelected = (questionId: number) => (\n props.questions.some(x => x.questionId === questionId)\n );\n \n const competencySelected = (competencyId: number) => (\n props.questions.some(x => x.competencyId === competencyId)\n );\n \n const questionRequired = (questionId: number) => (\n props.questions.some(x => x.questionId === questionId && x.required)\n );\n \n const competencyRequired = (competencyId: number) => (\n props.questions.some(x => x.competencyId === competencyId && x.required)\n );\n\n const wrenchColor = () => (\n props.darkBackground\n ? styles.iconWhite\n : styles.iconDarkGrey\n );\n\n const showDeleteCompetency = (props.showDelete && props.addByCompetency);\n const showDeleteQuestion = (props.showDelete && !props.addByCompetency);\n \n const addedStyle = (competencyId: number) => (\n props.addedStyle\n ? [\n styles.padEnds,\n open === competencyId\n ? (props.createdMode ? styles.lightBlueBg : styles.lightGreenBg)\n : (props.createdMode ? styles.blueBg : styles.greenBg),\n styles.borderTop,\n ]\n : undefined\n );\n\n const openStyle = (competencyId: number) => (\n competencyId === 0 ? styles.italicized : undefined\n );\n\n const competency = (competencyId: number) => {\n const question = props.questions.find(q => q.competencyId === competencyId);\n\n return(\n \n \n \n setOpen(undefined)\n : () => setOpen(competencyId)\n }\n icon={open === competencyId ? faMinusSquare : faPlusSquare}\n iconStyle={props.darkBackground ? styles.plusMinusDarkBg : styles.plusMinus}\n type='button'\n />\n \n {question?.competencyName}\n \n {\n showWrench(competencyId || 0) && (\n \n )\n }\n \n \n {\n showDeleteCompetency && competencySelected(competencyId) && !competencyRequired(competencyId) && (\n \n \n \n )\n } \n \n )\n };\n \n const questions = (competencyId: number) => {\n const questionsForCompetency = props.questions.filter(q => q.competencyId === competencyId)\n \n return (\n \n {questionMap(questionsForCompetency)}\n \n )\n };\n \n const questionKey = (question: FeedbackSurveyQuestion) => (\n `${question.competencyId}|${question.questionId}`\n );\n \n const questionMap = (questionsForCompetency: FeedbackSurveyQuestion[]) => (\n R.map(\n (question: FeedbackSurveyQuestion) => (\n \n \n {question.questionText}\n \n {\n showDeleteQuestion && questionSelected(question.questionId)\n && !questionRequired(question.questionId) && (\n \n \n \n )\n }\n \n ),\n questionsForCompetency,\n )\n ); \n\n return R.map(\n (competencyId: number) => (\n \n {competency(competencyId)}\n {questions(competencyId)}\n \n ),\n competencies,\n )\n },\n [\n competencies,\n open,\n props,\n menuOpen,\n ],\n );\n\n return (\n <>\n {accordian}\n \n );\n};\n\nexport default CreateSurveyViewAccordian;\n","import * as React from 'react';\nimport { Str } from '../../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { COLORS } from '../../globalStyle/colors';\nimport Msg from '../../localization/Msg';\nimport Spacer from '../../layout/Spacer';\nimport { faWrench } from '@fortawesome/free-solid-svg-icons';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\n\nconst styles = {\n\n footnote: css`\n margin: 10px 15px 0;\n `,\n footnoteIcon: css`\n color: ${COLORS.DARK_GREY};\n `,\n footnoteMsg: css`\n color: ${COLORS.DARK_GREY};\n `,\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * CreateSurvey: a component that shows the footnote message\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CreateSurveyFootnote: React.FC = props => (\n \n \n \n \n \n);\n\nexport default CreateSurveyFootnote;\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { css } from '@emotion/core';\nimport { FLEX_ROW } from '../../layout/flexBox';\nimport { Str } from '../../localization/translationKeys';\nimport { faCheck, faPlus } from '@fortawesome/free-solid-svg-icons';\nimport { Z_INDEX } from '../../globalStyle/zIndex';\nimport { COLORS } from '../../globalStyle/colors';\nimport { btnStyle } from '../../forms/styles/button';\nimport MobileToolbarBtn from '../../localization/MobileToolbarBtn';\n\n\nconst styles = {\n root: css`\n justify-content: flex-end;\n width: 100vw;\n height: 72px;\n position: fixed;\n bottom: 0;\n z-index: ${Z_INDEX.MOBILE_TOOLBAR};\n background-color: ${COLORS.WHITE};\n `,\n button: css`\n font-size: 9px;\n border-radius: 0;\n flex-basis: 80px;\n border-color: transparent;\n height: 72px;\n line-height: normal;\n & span {\n overflow-wrap: break-spaces;\n text-transform: uppercase;\n }\n `,\n hide: css`\n display: none;\n `,\n};\n\n\ntype Props = {\n className?: string;\n addDisabled: boolean;\n addCaption: string;\n addClicked: () => void;\n createDisabled: boolean;\n createdMode: boolean;\n unsetCreated: () => void;\n applyPendingChanges: () => void;\n}\n\n\n/**\n * MobileCreateSurveyActionsBar: a tool bar housint action buttons associated with the create survey flow\n * screens.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst MobileCreateSurveyActionsBar: React.FC = props => (\n ReactDOM.createPortal(\n
\n props.addClicked()}\n disabled={props.addDisabled}\n />\n props.createdMode ? props.unsetCreated() : props.applyPendingChanges()}\n disabled={props.createDisabled}\n />\n
\n ,\n document.getElementById('root') || document.getElementById('react-root') || document.body,\n )\n);\n\nexport default MobileCreateSurveyActionsBar;\n","import * as React from 'react';\nimport Card from '../../layout/card/Card';\nimport { Str } from '../../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { COLORS } from '../../globalStyle/colors';\nimport Msg from '../../localization/Msg';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport { ProjStr } from '../messages/ProjStr';\nimport ProjMsg from '../messages/ProjMsg';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { useProjMsgText } from '../messages/hooks';\nimport { btnStyle } from '../../forms/styles/button';\nimport { FeedbackSurveyQuestion } from './models';\nimport { DevPlanItem } from '../devPlan/models';\nimport CreateSurveyViewAccordian from './CreateSurveyViewAccordian';\nimport CreateSurveyFootnote from './CreateSurveyFootnote';\nimport { useWindowSize } from '../../core/hooks/useWindowSize';\nimport MobileCreateSurveyActionsBar from './MobileCreateSurveyActionsBar';\nimport { useMemo } from 'react';\nimport { useAppState } from '../../core/redux/hooks';\nimport { useProjIds } from '../../navigation/hooks';\nimport { useMount } from '../../core/hooks/useMount';\nimport { useDispatch } from 'react-redux';\nimport { getDevPlanItemsAction } from '../devPlan/api/getDevPlanItemsAction';\n\n\nconst styles = {\n card: css`\n padding: 0;\n border: 3px solid ${COLORS.DARK_GREY};\n height: min-content;\n `,\n halfWidth: css`\n flex-basis: 50%;\n `,\n fullWidth: css`\n flex-basis: 100%;\n `,\n header: css`\n border-radius: 8px 8px 0 0;\n background-color: ${COLORS.DARK_GREY};\n justify-content: space-between;\n `,\n headerText: css`\n padding: 14px;\n font-size: 12px;\n font-weight: bold;\n color: ${COLORS.WHITE};\n `,\n addButton: css`\n font-size: 12px;\n margin: 4px 14px 7px;\n padding: 0 10px;\n `,\n hide: css`\n display: none;\n `,\n noneAdded: css`\n color: ${COLORS.DARK_GREY};\n background-color: ${COLORS.LIGHT_GREEN};\n text-align: center;\n padding: 15px 0;\n `,\n createBtnContainer: css`\n justify-content: flex-end;\n `,\n createButton: css`\n font-size: 12px;\n padding: 0 10px;\n margin: 14px;\n `,\n accordian: css`\n margin: 0;\n `,\n};\n\n\ntype Props = {\n addDisabled: boolean;\n count: number;\n createDisabled: boolean;\n createdMode: boolean;\n addedQuestions: FeedbackSurveyQuestion[];\n className?: string;\n deleteQuestion: (questionId: number) => void;\n deleteQuestionsForCompetency: (competencyId: number) => void;\n applyPendingChanges: () => void;\n addByCompetency: boolean;\n toggleAddModal: () => void;\n devItems: DevPlanItem[];\n unsetCreated: () => void;\n fullWidth: boolean;\n};\n\n\n/**\n * CreateSurvey: a component that shows the selected items for a feedback survey\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CreateSurveySelected: React.FC = props => {\n const dispatch = useDispatch();\n\n const { isMobile } = useWindowSize();\n\n const addCaption = useProjMsgText(ProjStr.AddToSurvey);\n\n const projIds = useProjIds();\n const devItems = useAppState(state => state.devPlan?.items ?? []);\n\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || projIds.projId);\n\n useMount(\n () => {\n if (!devPlanProjectId || !projIds.participantId) {\n return;\n }\n !devItems && dispatch(getDevPlanItemsAction(devPlanProjectId, projIds.participantId));\n },\n ); \n\n const showFootnote = useMemo(\n () => devItems.filter(i => i.devItemCompetencyId > 0).length > 0,\n [devItems],\n )\n\n return (\n \n \n \n \n {\n !isMobile && (\n props.toggleAddModal()}\n />\n )\n }\n \n {\n props.count === 0\n ? (\n \n \n \n )\n : (\n \n \n \n )\n }\n \n {\n !isMobile && (\n props.createdMode ? props.unsetCreated() : props.applyPendingChanges()}\n />\n ) \n } \n \n {\n isMobile && (\n \n )\n }\n \n {\n showFootnote && \n }\n \n )\n};\n\nexport default CreateSurveySelected;\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport * as R from 'ramda';\nimport Card from '../../layout/card/Card';\nimport { Str } from '../../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\nimport Msg from '../../localization/Msg';\nimport { ProjStr } from '../messages/ProjStr';\nimport ProjMsg from '../messages/ProjMsg';\nimport { FLEX_COLUMN } from '../../layout/flexBox';\nimport { FeedbackSurveyQuestion } from './models';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { DevPlanItem } from '../devPlan/models';\nimport CreateSurveyViewAccordian from './CreateSurveyViewAccordian';\n\n\nconst styles = {\n card: css`\n padding: 14px;\n border: 3px solid ${COLORS.DARK_GREY};\n flex-basis: 50%;\n height: min-content;\n `,\n darkbg: css`\n background-color: ${COLORS.DARK_GREY};\n `,\n headerText: css`\n padding: 0 0 14px;\n font-size: 12px;\n font-weight: bold;\n color: ${COLORS.WHITE};\n `,\n separator: css`\n margin: 5px 0 20px;\n border-bottom: 1px solid ${COLORS.MEDIUM_GREY}\n `,\n requiredQuestion: css`\n margin: 0 0 14px;\n color: ${COLORS.WHITE};\n `,\n accordian: css`\n color: ${COLORS.WHITE};\n margin-bottom: 14px;\n `,\n};\n\n\ntype Props = {\n requiredQuestions: FeedbackSurveyQuestion[];\n devItems: DevPlanItem[];\n addByCompetency: boolean;\n className?: string;\n deleteQuestion: (questionId: number) => void;\n deleteQuestionsForCompetency: (competencyId: number) => void;\n};\n\n\n/**\n * CreateSurvey: a component that required items for a feedback survey\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CreateSurveyRequired: React.FC = props => {\n\n const { numericQuestions, textQuestions } = useMemo(\n () => ({\n numericQuestions: props.requiredQuestions.filter(q => !q.textQuestion),\n textQuestions: props.requiredQuestions.filter(q => q.textQuestion),\n }),\n [props],\n );\n\n const requiredText = useMemo(\n () => (\n R.map(\n (question: FeedbackSurveyQuestion) => (\n \n {question.questionText}\n \n ),\n textQuestions,\n )\n ),\n [textQuestions],\n );\n\n return (\n \n {\n numericQuestions.length > 0 && (\n <>\n \n \n \n \n \n )\n }\n {\n numericQuestions.length > 0 && textQuestions.length > 0 && (\n \n )\n }\n {\n textQuestions.length > 0 && (\n <>\n \n \n {requiredText}\n \n \n )\n }\n\n \n )\n};\n\nexport default CreateSurveyRequired;\n","import * as React from 'react';\nimport { useMemo, useState } from 'react';\nimport * as R from 'ramda';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport { COLORS } from '../../globalStyle/colors';\nimport { css } from '@emotion/core';\nimport { FeedbackSurveyQuestion, CompetencyAndQuestion } from './models';\nimport { DevPlanItem } from '../devPlan/models';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faWrench, faMinusSquare, faPlusSquare } from '@fortawesome/free-solid-svg-icons';\nimport ActionIcon from '../../layout/ActionIcon';\nimport { Z_INDEX } from '../../globalStyle/zIndex';\nimport { useAppState } from '../../core/redux/hooks';\n\n\nconst styles = {\n container: css`\n border: 1px solid ${COLORS.WHITE};\n border-bottom: none;\n `,\n competency: css`\n justify-content: space-between;\n padding: 0 14px;\n min-height: 28px;\n border-bottom: 1px solid ${COLORS.WHITE};\n `,\n hide: css`\n display: none;\n `,\n question: css`\n justify-content: space-between;\n padding: 0 14px;\n min-height: 28px;\n border-bottom: 1px solid ${COLORS.WHITE};\n `,\n questionText: css`\n padding: 7px 26px;\n `,\n wrenchIcon: css`\n color: ${COLORS.DARK_GREY};\n margin-top: 7px;\n `,\n checkbox: css`\n width: 22px;\n height: 22px;\n `,\n competencyOpen: css `\n margin-top: 5px;\n `,\n competencyName: css `\n margin: 7px 10px 0;\n `,\n selected: css `\n color: ${COLORS.MEDIUM_GREY};\n `,\n plusMinus: css`\n font-size: 1.1em;\n color: ${COLORS.DARK_GREY};\n cursor: pointer;\n text-align: center;\n `,\n italicized: css`\n font-style: italic;\n `,\n};\n\n\ntype Props = {\n className?: string;\n allQuestions: CompetencyAndQuestion[];\n selectedQuestions: FeedbackSurveyQuestion[];\n devItems: DevPlanItem[];\n addByCompetency: boolean;\n checkboxOnClick: (question: CompetencyAndQuestion) => void;\n};\n\n\n/**\n * CreateSurveyAddAccordian: a component that shows subset of questions\n * PureComponent: true\n * Redux Connected: false\n */\nconst CreateSurveyAddAccordian: React.FC = props => {\n const competencies = Array.from(new Set(props.allQuestions.map((item: CompetencyAndQuestion) => item.competencyId)));\n const [open, setOpen] = useState(undefined);\n const menuOpen = useAppState(state => state.openSideMenu);\n\n const accordian = useMemo(\n () => {\n const showWrench = (competencyId: number) => (\n competencyId > 0 && props.devItems.some(x => x.devItemCompetencyId === competencyId)\n );\n\n const questionSelected = (questionId: number) => (\n props.selectedQuestions.some(x => x.questionId === questionId)\n );\n\n const competencySelected = (competencyId: number) => (\n props.selectedQuestions.some(x => x.competencyId === competencyId)\n );\n\n const openStyle = (competencyId: number) => (\n competencyId === 0 ? styles.italicized : undefined\n );\n\n const competency = (competencyId: number) => {\n const question = props.allQuestions.find(q => q.competencyId === competencyId);\n\n return(\n \n \n \n setOpen(undefined)\n : () => setOpen(competencyId)\n }\n icon={open === competencyId ? faMinusSquare : faPlusSquare}\n iconStyle={styles.plusMinus}\n type='button'\n />\n \n {question?.name}\n \n {\n showWrench(competencyId || 0) && (\n \n )\n }\n \n \n {\n props.addByCompetency && !competencySelected(competencyId) && (\n \n {if (!!question) { props.checkboxOnClick(question)}}}\n />\n \n )\n }\n \n )\n };\n\n const questions = (competencyId: number) => {\n const questionsForCompetency = props.allQuestions.filter(q => q.competencyId === competencyId)\n\n return (\n \n {questionMap(questionsForCompetency)}\n
\n )\n };\n\n const questionKey = (question: CompetencyAndQuestion) => (\n `${question.competencyId}|${question.questionId}`\n );\n\n const questionMap = (questionsForCompetency: CompetencyAndQuestion[]) => (\n R.map(\n (question: CompetencyAndQuestion) => (\n \n \n {question.questionText}\n \n {\n !props.addByCompetency && !questionSelected(question.questionId) && (\n \n props.checkboxOnClick(question)}\n />\n \n )\n }\n \n ),\n questionsForCompetency,\n )\n );\n\n return R.map(\n (competencyId: number) => (\n \n {competency(competencyId)}\n {questions(competencyId)}\n \n ),\n competencies,\n )\n },\n [\n competencies,\n open,\n props,\n menuOpen,\n ],\n );\n\n return (\n \n {accordian}\n \n );\n};\n\nexport default CreateSurveyAddAccordian;\n","import * as React from 'react';\nimport * as R from 'ramda';\nimport Modal from '../../layout/modal/Modal';\nimport ModalHeader from '../../layout/modal/ModalHeader';\nimport { Str } from '../../localization/translationKeys';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { COLORS } from '../../globalStyle/colors';\nimport { btnStyle } from '../../forms/styles/button';\nimport { css } from '@emotion/core';\nimport Spacer from '../../layout/Spacer';\nimport { useFormik } from 'formik';\nimport { onMobileMedium, onPhone } from '../../globalStyle/mediaQueries';\nimport { FIELDSET_DEFAULT } from '../../layout/fieldSetStyle';\nimport { useProjMsgText } from '../messages/hooks';\nimport { ProjStr } from '../messages/ProjStr';\nimport CreateSurveyFootnote from './CreateSurveyFootnote';\nimport { FeedbackSurveyQuestion, CompetencyAndQuestion } from './models';\nimport { DevPlanItem } from '../devPlan/models';\n\nimport CreateSurveyAddAccordian from './CreateSurveyAddAccordian';\nimport { useMap } from '../../core/hooks/useMap';\nimport { useAppState } from '../../core/redux/hooks';\nimport { useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useProjIds } from '../../navigation/hooks';\nimport { useMount } from '../../core/hooks/useMount';\nimport { getDevPlanItemsAction } from '../devPlan/api/getDevPlanItemsAction';\n\n\nconst styles = {\n root: css`\n min-width: 780px;\n\n @media only screen and (max-width: 812px) {\n min-width: calc(100vw - 32px);\n }\n\n ${onMobileMedium} {\n max-width: 100vw;\n max-height: 100vh;\n min-width: 0;\n min-height: 0;\n width: 100vw;\n height: 100vh;\n }\n `,\n content: css`\n justify-content: center;\n align-items: stretch;\n margin: auto 24px;\n\n ${onMobileMedium} {\n margin: auto 12px;\n }\n\n ${onPhone} {\n margin: 0;\n }\n `,\n buttonRow: css`\n margin: 10px 24px 24px;\n\n ${onMobileMedium} {\n margin: 10px 12px 12px;\n } \n `,\n btnSpacer: css`\n ${onPhone} {\n display: none;\n }\n `,\n button: css`\n min-height: 35px;\n min-width: 132px;\n `,\n};\n\n\ntype Props = {\n className?: string;\n dismiss: () => void;\n modalTitle: ProjStr;\n allQuestions: CompetencyAndQuestion[];\n selectedQuestions: FeedbackSurveyQuestion[];\n devItems: DevPlanItem[];\n addByCompetency: boolean;\n addQuestion: (questionId: number) => void;\n addQuestionsForCompetency: (competencyId: number) => void;\n};\n\n\n/**\n * CreateSurveyAddModal: a component that allows user to add questions to the feedback survey\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CreateSurveyAddModal: React.FC = props => {\n const dispatch = useDispatch();\n const title = useProjMsgText(props.modalTitle)\n\n const [questionsToAdd, addQuestion, removeQuestion] = useMap({});\n const checkboxOnClick = (question: CompetencyAndQuestion) => {\n if (!!questionsToAdd[`${question.questionId}`]) {\n removeQuestion(`${question.questionId}`);\n } else {\n addQuestion(`${question.questionId}`, question);\n }\n };\n\n const { handleSubmit, resetForm } = useFormik({\n initialValues: {\n },\n onSubmit: () => {\n R.forEach(question => props.addByCompetency\n ? props.addQuestionsForCompetency(question.competencyId)\n : props.addQuestion(question.questionId),\n Object.values(questionsToAdd),\n );\n props.dismiss();\n resetForm();\n },\n validateOnChange: false,\n enableReinitialize: true,\n });\n\n const projIds = useProjIds();\n const devItems = useAppState(state => state.devPlan?.items ?? []);\n\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || projIds.projId);\n\n useMount(\n () => {\n if (!projIds.projId || !projIds.participantId) {\n return;\n }\n !devItems && dispatch(getDevPlanItemsAction(devPlanProjectId, projIds.participantId));\n },\n ); \n\n const showFootnote = useMemo(\n () => devItems.filter(i => i.devItemCompetencyId > 0).length > 0,\n [devItems],\n ) \n\n return (\n \n \n
\n
\n \n \n {\n showFootnote && \n }\n \n \n
\n \n \n \n \n \n
\n
\n );\n};\n\nexport default CreateSurveyAddModal;\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport * as R from 'ramda';\nimport ProjectLayout from '../ProjectLayout';\nimport SurveyHeader from '../survey/SurveyHeader';\nimport { onMobileDevice } from '../../globalStyle/mediaQueries';\nimport { useMsgText } from '../../localization/hooks';\nimport { Str } from '../../localization/translationKeys';\nimport { useAppState } from '../../core/redux/hooks';\nimport { css } from '@emotion/core';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { COLORS } from '../../globalStyle/colors';\nimport Msg from '../../localization/Msg';\nimport Spacer from '../../layout/Spacer';\nimport { faExclamationTriangle, faCheck } from '@fortawesome/free-solid-svg-icons';\nimport { FLEX_ADAPTIVE } from '../../layout/flexBox';\nimport { ProjStr } from '../messages/ProjStr';\nimport ProjMsg from '../messages/ProjMsg';\nimport { useDispatch } from 'react-redux';\nimport { useMount } from '../../core/hooks/useMount';\nimport { getSelectedQuestionsAction } from './api/getSelectedQuestionsAction';\nimport { getCompetenciesAndQuestionsAction } from './api/getCompetenciesAndQuestionsAction';\nimport { addQuestionAction } from './api/addQuestionAction';\nimport { addQuestionsForCompetencyAction } from './api/addQuestionsForCompetencyAction';\nimport { deleteQuestionAction } from './api/deleteQuestionAction';\nimport { deleteQuestionsForCompetencyAction } from './api/deleteQuestionsForCompetencyAction';\nimport { applyPendingChangesAction } from './api/applyPendingChangesAction';\nimport CreateSurveyMessageBar from './CreateSurveyMessageBar';\nimport CreateSurveyAdded from './CreateSurveyAdded';\nimport CreateSurveyRequired from './CreateSurveyRequired';\nimport CreateSurveyAddModal from './CreateSurveyAddModal';\nimport { useToggle } from '../../core/hooks/useToggle';\nimport { getDevPlanItemsAction } from '../devPlan/api/getDevPlanItemsAction';\nimport { unsetCreatedSurveyAction } from './api/unsetCreatedSurveyAction';\nimport { useProjIds } from '../../navigation/hooks';\n\n\nconst styles = {\n header: css`\n margin: auto 25px 40px;\n ${onMobileDevice} {\n margin: auto 10px 35px;\n }\n `,\n content: css`\n color: ${COLORS.DARK_GREY};\n margin-top: 75px;\n `,\n errorMsg: css`\n color: ${COLORS.RED};\n background-color: transparent;\n `,\n infoMsg: css`\n color: ${COLORS.GREEN};\n background-color: transparent;\n `,\n finishMsg: css`\n color: ${COLORS.DARK_GREY};\n background-color: transparent;\n `,\n added: css`\n min-width: 300px;\n `,\n required: css`\n min-width: 300px;\n `,\n};\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * CreateSurvey: a component that allows the user to create a feedback survey\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CreateSurvey: React.FC = props => {\n const dispatch = useDispatch();\n\n const project = useAppState(state => state.projectSummary);\n\n const projIds = useProjIds();\n const projectId = projIds.projId;\n const participantId = projIds.participantId;\n\n const devPlanProjectId = project?.devPlanProjectId || projectId;\n\n const pageTitle = useMsgText(Str.CreateSurvey);\n\n const addByCompetency = project?.followupSurveyAddByCompetency!;\n\n useMount(() => { dispatch(getSelectedQuestionsAction(projectId, participantId)); });\n\n const questions = useAppState(state => state.selectedQuestions?.[`${projectId}`] ?? []);\n\n const { addedQuestions, requiredQuestions, addedQuestionsForCount } = useMemo(\n () => ({\n addedQuestions: R.filter(item => !item.required, questions),\n requiredQuestions: R.filter(item => item.required, questions),\n addedQuestionsForCount: R.filter(item => !item.required && item.competencyId > 0, questions),\n }),\n [questions],\n );\n\n const count = useMemo(\n () => addByCompetency\n ? R.uniqBy(({ competencyId }) => competencyId, addedQuestionsForCount).length || 0\n : addedQuestionsForCount.length || 0,\n [addByCompetency, addedQuestionsForCount],\n );\n\n const itemMin = project?.followupSurveyMinimumQuestion ?? 0;\n const itemMax = project?.followupSurveyMaximumQuestion ?? 0;\n\n const surveyCreated = project?.followupSurveyCreated ?? false;\n const raterInvited = project?.raterInvited ?? false;\n const selfSurveyStarted = (project?.selfSurveyStep && project?.selfSurveyAmountComplete > 0) ?? false;\n\n const showMaxErr = itemMax > 0 && count > itemMax;\n const showReady = !showMaxErr && count > 0 && count >= itemMin;\n const showCreated = surveyCreated && !raterInvited && !selfSurveyStarted;\n const showFinal = surveyCreated && (raterInvited || selfSurveyStarted);\n const showAdd = !(showReady || showCreated || showFinal);\n\n const iconColor = (\n showMaxErr\n ? COLORS.RED\n : showCreated || showFinal\n ? COLORS.BLUE\n : COLORS.GREEN\n );\n\n const iconImage = (showCreated || showFinal ? faCheck : faExclamationTriangle);\n\n const addProjMsgStr = (\n project?.followupSurveyMaximumQuestion !== 0 && project?.followupSurveyMinimumQuestion !== 0\n ? ProjStr.CreateSurveyMinMaxMsg\n : project?.followupSurveyMaximumQuestion !== 0\n ? ProjStr.CreateSurveyMaxMsg\n : project?.followupSurveyMinimumQuestion !== 0\n ? ProjStr.CreateSurveyMinMsg\n : ProjStr.CreateSurveyMsg\n );\n\n const message = (\n showMaxErr\n ? \n : showFinal\n ? \n : showCreated\n ? \n : showReady\n ? \n : showAdd && ()\n );\n\n useMount(() => { dispatch(getCompetenciesAndQuestionsAction(projectId)); });\n\n const allQuestions = useAppState(state => (state.competenciesAndQuestions?.[`${projectId}`] || []));\n\n const addQuestion = React.useCallback(\n (questionId: number) => dispatch(addQuestionAction(projectId, participantId, questionId)),\n [dispatch, projectId, participantId],\n );\n\n const addQuestionsForCompetency = React.useCallback(\n (competencyId: number) => dispatch(addQuestionsForCompetencyAction(projectId, participantId, competencyId)),\n [dispatch, projectId, participantId],\n );\n const deleteQuestion = React.useCallback(\n (questionId: number) => dispatch(deleteQuestionAction(projectId, participantId, questionId)),\n [dispatch, projectId, participantId],\n );\n\n const deleteQuestionsForCompetency = React.useCallback(\n (competencyId: number) =>\n dispatch(deleteQuestionsForCompetencyAction(projectId, participantId, competencyId)),\n [dispatch, projectId, participantId],\n );\n\n const applyPendingChanges = React.useCallback(\n () => dispatch(applyPendingChangesAction(projectId, participantId)),\n [dispatch, projectId, participantId],\n );\n\n const unsetCreated = React.useCallback(\n () => dispatch(unsetCreatedSurveyAction(projectId, participantId)),\n [dispatch, projectId, participantId],\n );\n\n const [showingAddModal, toggleAddModal] = useToggle();\n\n useMount(() => { dispatch(getDevPlanItemsAction(devPlanProjectId, participantId)); });\n const devItems = useAppState(state => state.devPlan?.items ?? []);\n\n\n return (\n \n \n \n \n \n \n {\n requiredQuestions.length > 0 && (\n <>\n \n \n \n )\n }\n \n \n {\n showingAddModal && (\n \n )\n }\n \n );\n};\n\nexport default CreateSurvey;\n","import * as React from 'react';\nimport { Str } from '../../../localization/translationKeys';\nimport ModalHeader from '../../../layout/modal/ModalHeader';\nimport Modal from '../../../layout/modal/Modal';\nimport Msg from '../../../localization/Msg';\nimport { btnStyle } from '../../../forms/styles/button';\nimport { COLORS } from '../../../globalStyle/colors';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../../layout/flexBox';\nimport { css } from '@emotion/core';\nimport Spacer from '../../../layout/Spacer';\nimport { onPhone, onMobileMedium } from '../../../globalStyle/mediaQueries';\nimport { useBrowser } from '../../../language/useBrowser';\n\n\nconst styles = {\n modal: css`\n min-height: 300px;\n min-width: 300px;\n max-width: 560px;\n margin: 40px;\n ${onPhone} {\n margin: 0;\n }\n `,\n content: css`\n flex-grow: 1;\n margin: 0 20px 20px;\n `,\n msgContainer: css`\n margin: auto 90px;\n flex-grow: 1;\n justify-content: center;\n ${onMobileMedium} {\n margin: auto 40px;\n }\n ${onPhone} {\n margin-bottom: 60px;\n }\n `,\n msg: css`\n font-weight: bold;\n font-size: 18px;\n line-height: 1.5;\n `,\n btnRow: css`\n width: 100%;\n flex-grow: 0;\n margin-top: auto;\n justify-content: center;\n `,\n btn: css`\n min-height: 35px;\n min-width: 132px;\n `,\n};\n\ntype Props = {\n className?: string;\n raterEmail: string;\n onClickYes: () => void;\n onDismiss: () => void;\n};\n\n\n/**\n * DeleteRaterModal: a component that\n *\n * PureComponent: true\n * Redux Connected:\n */\nconst DeleteRaterModal: React.FC = props => {\n const { onIe } = useBrowser();\n\n return (\n \n \n \n
\n \n
\n \n
\n \n \n \n \n \n \n )\n};\n\nexport default DeleteRaterModal;\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport { Rater } from './models';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { FLEX_ROW } from '../../../layout/flexBox';\nimport { faPen, faTrash } from '@fortawesome/free-solid-svg-icons';\nimport { css, SerializedStyles } from '@emotion/core';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { lastCommaFirstLocal } from './module';\nimport { useAppState } from '../../../core/redux/hooks';\nimport DeleteRaterModal from './DeleteRaterModal';\nimport { useToggle } from '../../../core/hooks/useToggle';\nimport { isValidDate } from '../../../language/time';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { doNothing } from '../../../language/module';\n\n\nconst styles = {\n actionIcon: css`\n font-size: 18px;\n color: ${COLORS.ICON_GREY};\n cursor: pointer;\n `,\n disabledIcon: css`\n cursor: default;\n `,\n nameAndEmail: css`\n line-height: 20px;\n `,\n};\n\n\ntype Props = {\n className?: string;\n rater: Rater;\n showNames: boolean;\n showRelationship: boolean;\n showLanguage: boolean;\n approval: boolean;\n disableEditBtn: boolean;\n disableDeleteBtn: boolean;\n inviteStatus: React.ReactNode;\n approvalElements: React.ReactNode;\n setRater: (rater: Rater) => void;\n onConfirmDelete: () => void;\n iconStyle?: SerializedStyles;\n approverEmailSent: boolean;\n}\n\n\nconst RaterTableRow: React.FC = props => {\n const dir = useAppState(state => state.locale.textDirection);\n const [confirmDeleting, toggleConfirmDeleting] = useToggle();\n\n const raterNameTxt = useMemo(() => lastCommaFirstLocal(dir, props.rater) || '---', [dir, props.rater]);\n\n const approver = useMemo(() =>\n props.approval && props.rater.approvalStatus === 1,\n [props.approval, props.rater.approvalStatus],\n );\n const canEdit = useMemo(() =>\n props.rater.undeliveredEmail\n || (approver && !props.approverEmailSent)\n || (!approver && !isValidDate(props.rater.invitedDate)),\n [props.rater.undeliveredEmail, approver, props.approverEmailSent, props.rater.invitedDate],\n );\n\n const project = useAppState(state => state.projectSummary);\n const pastDue = useMemo(() => project?.surveyPastDue, [project]);\n\n return (\n \n \n \n {props.showNames &&
{raterNameTxt}
}\n
{props.rater.email}
\n
\n \n {\n props.showRelationship && (\n \n {props.rater.levelName || ''}\n \n )\n }\n {\n props.showLanguage && (\n \n {props.rater.languageNameNative || ''}\n \n )\n }\n \n {props.inviteStatus}\n \n {props.approval && props.approvalElements}\n \n {\n canEdit && !pastDue && (\n props.disableEditBtn ? doNothing() : props.setRater(props.rater)}\n />\n )\n }\n \n \n { !pastDue && (\n \n ) \n }\n \n {\n confirmDeleting && (\n \n )\n }\n \n );\n};\n\nexport default RaterTableRow;\n","import * as React from 'react';\nimport { Rater, RaterLevel } from './models';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faSave, faTimes } from '@fortawesome/free-solid-svg-icons';\nimport { css, SerializedStyles } from '@emotion/core';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { Str } from '../../../localization/translationKeys';\nimport LocalInput from '../../../localization/LocalInput';\nimport { INPUT } from '../../../forms/styles/input';\nimport { SELECT } from '../../../forms/styles/select';\nimport * as R from 'ramda';\nimport LocalDropdownOption from '../../../localization/LocalDropdownOption';\nimport { Language } from '../../../localization/models';\nimport { FormikValues } from 'formik';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport LocalSelect from '../../../localization/LocalSelect';\n\n\nconst styles = {\n actionIcon: css`\n font-size: 18px;\n color: ${COLORS.ICON_GREY};\n cursor: pointer;\n `,\n submitBtn: css`\n color: transparent;\n background-color: transparent;\n border: 0 none;\n padding: 0;\n `,\n disabledSaveIcon: css`\n color: ${COLORS.ICON_GREY};\n cursor: default;\n `,\n saveIcon: css`\n font-size: 22px;\n color: ${COLORS.GREEN};\n `,\n trashIcon: css`\n font-size: 22px;\n `,\n input: css`\n margin: 4px;\n padding-left: 12px;\n font-size: 12px;\n `,\n errorInput: css`\n border-color: ${COLORS.RED};\n `,\n dropdown: css`\n font-size: 12px;\n `,\n};\n\ntype Props = {\n className?: string;\n rater: Rater;\n showNames: boolean;\n approval: boolean;\n inviteStatus: React.ReactNode;\n approvalElements: React.ReactNode;\n setRater: (rater?: Rater) => void;\n cancelSetRater: () => void;\n raterLevels?: RaterLevel[];\n projectLanguages?: Language[];\n formValues: FormikValues;\n iconStyle?: SerializedStyles;\n disableSubmitBtn: boolean;\n emailFieldError: boolean;\n}\n\n\nconst renderLevels = (levels: RaterLevel[]) => R.map(\n level => (\n ),\n levels,\n);\n\n\nconst renderLanguages = (languages: Language[]) => R.map(\n lang => (\n \n ),\n languages,\n);\n\n\nconst RaterEditableTableRow: React.FC = props => (\n \n \n {\n props.showNames && (\n \n )\n }\n {\n props.showNames && (\n \n )\n }\n \n \n {\n !!props.raterLevels && (\n \n \n {renderLevels(props.raterLevels)}\n \n \n )\n }\n {\n !!props.projectLanguages && (\n \n \n {renderLanguages(props.projectLanguages)}\n \n \n )\n }\n \n {props.inviteStatus}\n \n {props.approval && props.approvalElements}\n \n \n \n \n \n \n \n \n \n);\n\n\nexport default RaterEditableTableRow;\n","import * as React from 'react';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../../layout/flexBox';\nimport LocalInput from '../../../localization/LocalInput';\nimport { INPUT } from '../../../forms/styles/input';\nimport { Str } from '../../../localization/translationKeys';\nimport { SELECT } from '../../../forms/styles/select';\nimport Msg from '../../../localization/Msg';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faSave, faTimes } from '@fortawesome/free-solid-svg-icons';\nimport { css, SerializedStyles } from '@emotion/core';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { Rater, RaterLevel } from './models';\nimport { FormikValues } from 'formik';\nimport { Language } from '../../../localization/models';\nimport * as R from 'ramda';\nimport LocalDropdownOption from '../../../localization/LocalDropdownOption';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { TextDirection } from '../../../localization/textDirection';\nimport Spacer from '../../../layout/Spacer';\nimport { onMobileMedium } from '../../../globalStyle/mediaQueries';\nimport LocalSelect from '../../../localization/LocalSelect';\n\n\nconst styles = {\n label: css`\n font-weight: bold;\n `,\n formContainer: css`\n width: 192px;\n\n ${onMobileMedium} {\n width: auto;\n }\n `,\n iconRow: css`\n width: 100%;\n justify-content: flex-end;\n margin-top: 18px;\n `,\n actionIcon: css`\n font-size: 26px;\n color: ${COLORS.ICON_GREY};\n cursor: pointer;\n `,\n greenIcon: css`\n color: ${COLORS.GREEN};\n `,\n submitBtn: css`\n color: transparent;\n background-color: transparent;\n border: 0 none;\n padding: 0;\n height: min-content;\n `,\n disabledSaveIcon: css`\n color: ${COLORS.ICON_GREY};\n cursor: default;\n `,\n saveIcon: css`\n color: ${COLORS.GREEN};\n `,\n input: css`\n font-size: 12px;\n `,\n errorInput: css`\n border-color: ${COLORS.RED};\n `,\n dropdown: css`\n font-size: 12px;\n `,\n};\n\n\ntype Props = {\n className?: string;\n rater: Rater;\n showNames: boolean;\n approval: boolean;\n inviteStatus: React.ReactNode;\n approvalElements: React.ReactNode;\n setRater: (rater?: Rater) => void;\n cancelSetRater: () => void;\n raterLevels?: RaterLevel[];\n projectLanguages?: Language[];\n formValues: FormikValues;\n iconStyle?: SerializedStyles;\n disableSubmitBtn: boolean;\n emailFieldError: boolean;\n};\n\n\nconst renderLevels = (levels: RaterLevel[]) => R.map(\n level => (\n ),\n levels,\n);\n\n\nconst renderLanguages = (languages: Language[]) => R.map(\n lang => (\n \n ),\n languages,\n);\n\n\n/**\n * RaterEditableCard: a component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterEditableCard: React.FC = props => (\n \n \n {\n props.showNames && (\n \n \n \n \n \n )\n }\n \n \n \n {\n !!props.raterLevels && (\n \n \n {renderLevels(props.raterLevels)}\n \n \n \n )\n }\n {\n !!props.projectLanguages && (\n \n {renderLanguages(props.projectLanguages)}\n \n )\n }\n \n \n \n \n \n {props.inviteStatus}\n \n \n \n \n \n \n \n \n \n \n);\n\nexport default RaterEditableCard;\n","import * as React from 'react';\nimport { useState, useMemo } from 'react';\nimport Msg from '../../../localization/Msg';\nimport { Str } from '../../../localization/translationKeys';\nimport { FLEX_ROW } from '../../../layout/flexBox';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faPen, faTrash } from '@fortawesome/free-solid-svg-icons';\nimport { css, SerializedStyles } from '@emotion/core';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { Rater } from './models';\nimport { lastCommaFirstLocal } from './module';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { TextDirection } from '../../../localization/textDirection';\nimport { useAppState } from '../../../core/redux/hooks';\nimport DeleteRaterModal from './DeleteRaterModal';\nimport Spacer from '../../../layout/Spacer';\nimport { isValidDate } from '../../../language/time';\nimport { doNothing } from '../../../language/module';\n\n\nconst styles = {\n infoRow: css`\n display: flex;\n flex-direction: row;\n margin: 10px;\n `,\n label: css`\n font-weight: bold;\n `,\n inviteStatus: css`\n `,\n iconRow: css`\n width: 100%;\n justify-content: flex-end;\n margin-top: 18px;\n `,\n actionIcon: css`\n font-size: 18px;\n color: ${COLORS.ICON_GREY};\n cursor: pointer;\n `,\n disabledIcon: css`\n cursor: default;\n `,\n};\n\n\ntype Props = {\n className?: string;\n rater: Rater;\n showNames: boolean;\n showRelationship: boolean;\n showLanguage: boolean;\n approval: boolean;\n disableEditBtn: boolean;\n disableDeleteBtn: boolean;\n inviteStatus: React.ReactNode;\n approvalElements: React.ReactNode;\n setRater: (rater: Rater) => void;\n onConfirmDelete: () => void;\n iconStyle?: SerializedStyles;\n approverEmailSent: boolean;\n};\n\n\n/**\n * RaterCard: a component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterCard: React.FC = props => {\n const dir = useAppState(state => state.locale.textDirection);\n const [deleting, toggleDeleting] = useState(false);\n\n const raterNameTxt = useMemo(() => lastCommaFirstLocal(dir, props.rater) || '---', [dir, props.rater]);\n\n const approver = useMemo(() =>\n props.approval && props.rater.approvalStatus === 1,\n [props.approval, props.rater.approvalStatus],\n );\n const canEdit = useMemo(() =>\n props.rater.undeliveredEmail\n || (approver && !props.approverEmailSent)\n || (!approver && !isValidDate(props.rater.invitedDate)),\n [props.rater.undeliveredEmail, approver, props.approverEmailSent, props.rater.invitedDate],\n );\n\n const dismissModal = () => toggleDeleting(false);\n\n const project = useAppState(state => state.projectSummary);\n const pastDue = useMemo(() => project?.surveyPastDue, [project]);\n\n return (\n \n {\n props.showNames && (\n \n \n \n {raterNameTxt}\n \n )\n }\n \n \n \n {props.rater.email}\n \n {\n props.showRelationship && (\n \n \n \n {props.rater.levelName}\n \n )\n }\n {\n props.showLanguage && (\n \n \n \n {props.rater.languageNameNative}\n \n )\n }\n \n \n \n \n {props.inviteStatus}\n \n \n {props.approval && props.approvalElements}\n {\n !pastDue && (\n \n \n {\n canEdit && (\n props.disableEditBtn ? doNothing() : props.setRater(props.rater)}\n />\n )\n }\n \n props.disableDeleteBtn ? doNothing() : toggleDeleting(true)}\n />\n \n \n )\n }\n {\n deleting && (\n \n )\n }\n \n );\n};\n\nexport default RaterCard;\n","import * as R from 'ramda';\nimport * as React from 'react';\nimport { useMemo, useEffect, useCallback } from 'react';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../../globalStyle/colors';\nimport Msg from '../../../localization/Msg';\nimport { Str } from '../../../localization/translationKeys';\nimport { Rater, RaterLevel } from './models';\nimport { isValidDate } from '../../../language/time';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\nimport { useWindowSize } from '../../../core/hooks/useWindowSize';\nimport { onMobileDevice } from '../../../globalStyle/mediaQueries';\nimport RaterTableRow from './RaterTableRow';\nimport RaterEditableTableRow from './RaterEditableTableRow';\nimport { Language } from '../../../localization/models';\nimport { useFormik } from 'formik';\nimport { editRaterFormValidation, editRaterWithNamesFormValidation } from './formValidations';\nimport RaterEditableCard from './RaterEditableCard';\nimport RaterCard from './RaterCard';\nimport { FLEX_ROW } from '../../../layout/flexBox';\nimport { useMsgText } from '../../../localization/hooks';\nimport Spacer from '../../../layout/Spacer';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { toMap } from '../../../language/arrays';\nimport { isNilOrEmpty } from '../../../language/module';\nimport { Requirement } from '../../models';\nimport { canAddRaterForLevel } from '../../module';\n\n\nconst styles = {\n table: {\n root: css`\n table-layout: auto;\n width: 100%;\n border-collapse: collapse;\n\n & th, & td {\n padding: 18px 4px;\n border: 1px solid;\n border-color: ${COLORS.LIGHTER_GREY} ${COLORS.LIGHTEST_GREY};\n\n &:first-child:dir(rtl), &:last-child:dir(ltr) {\n padding-right: 12px;\n }\n\n &:first-child:dir(ltr), &:last-child:dir(rtl) {\n padding-left: 12px;\n }\n }\n `,\n headerWithData: css`\n & th {\n border-bottom: 0;\n }\n `,\n row: css`\n color: ${COLORS.DARK_GREY};\n background-color: ${COLORS.LIGHTEST_GREY};\n `,\n errorRow: css`\n color: ${COLORS.RED};\n `,\n editableRow: css`\n background-color: ${COLORS.WHITE};\n & th, & td {\n border-color: ${COLORS.LIGHTER_GREY} ${COLORS.WHITE};\n }\n `,\n },\n cells: {\n emailOrName: css`\n min-width: min-content;\n `,\n edit: css`\n max-width: 50px;\n min-width: 30px;\n `,\n delete: css`\n max-width: 50px;\n min-width: 30px;\n `,\n },\n errorMsg: {\n root: css`\n align-items: center;\n ${onMobileDevice} {\n display: inline;\n margin: 0;\n }\n `,\n icon: css`\n font-size: 18px;\n ${onMobileDevice} {\n font-size: unset;\n }\n `,\n msgText: css`\n background-color: transparent;\n padding: 10px 5px;\n font-style: italic;\n ${onMobileDevice} {\n font-size: unset;\n }\n `,\n },\n infoRow: css`\n display: flex;\n flex-direction: row;\n `,\n cardInfoRow: css`\n display: flex;\n flex-direction: row;\n margin: 10px;\n`, radio: css`\n margin: 0;\n `,\n card: css`\n margin: 8px 0;\n padding: 15px;\n border: 1px solid transparent;\n background-color: ${COLORS.LIGHTEST_GREY};\n font-size: 12px;\n `,\n errorCard: css`\n color: ${COLORS.RED};\n `,\n editableCard: css`\n margin: 8px 0;\n padding: 16px;\n background-color: ${COLORS.WHITE};\n * {\n font-size: 12px;\n }\n `,\n label: css`\n font-weight: bold;\n `,\n};\n\n\ntype Props = {\n className?: string;\n raters: Rater[];\n raterLevels: RaterLevel[];\n projectLanguages: Language[];\n undeliveredEmails: string[];\n code: string;\n\n // Edit rater data state\n raterUnderEdit: Rater | undefined;\n markRaterForEdit: (rater: Rater | undefined) => void;\n cancelRaterEdit: () => void;\n desyncedRaterId?: number;\n requirements?: Requirement[];\n maximumsRequired: boolean;\n\n showNameFields: boolean;\n approval: boolean;\n hideApproverColumn: boolean;\n approvalLevelId: number;\n approvalLevelCount: number;\n approverEmailSent: boolean;\n\n setErrorMsg: (errorMsg?: string) => void;\n updateRater: (\n raterId: number,\n email?: string,\n undelivered?: boolean,\n firstName?: string,\n lastName?: string,\n raterLevel?: RaterLevel,\n language?: Language,\n ) => void;\n deleteRater: (raterId: number) => void;\n tableAlign: string;\n setApprover: (raterId: number) => void;\n};\n\n// TODO: set date from app locale, not browser locale\nconst inviteStatus = (\n inviteDate: string | Date,\n emailBounced: boolean,\n statusMsgKey: string,\n approval: boolean,\n approvalStatus: number,\n code: string,\n) => {\n const fallbackMsgColor = approval ? COLORS.BLACK : COLORS.GREEN;\n\n // Text for special status messages is black with no icon if rater approval is required\n // Undelivered status messages are red in both cases\n return (\n emailBounced\n ? \n \n \n \n : approval && approvalStatus === 1\n ? ---\n : isValidDate(inviteDate)\n ? {new Date(inviteDate).toLocaleDateString(code)}\n : \n {!approval && ()}\n \n \n );\n};\n\nconst msgForApprovalStatus = (status: number) => (\n status === 5 // waiting for approval\n ? Str.ApprovalStatus5\n : status === 3 // approved\n ? Str.ApprovalStatus3\n : status === 4 // declined\n ? Str.ApprovalStatus4\n : Str.ApprovalStatus1 // approver\n);\n\nconst approvalStatus = (status: number, potentialApprover: boolean) => (\n <>\n {\n status === 1\n ? '---'\n : (\n status === 2 || status === 0 // needs approval\n ? (\n \n \n \n \n )\n : (\n \n )\n )\n }\n \n);\n\nconst approverOption = (\n selected: boolean,\n raterId: number,\n setApprover: (raterId: number) => void,\n approverEmailSent: boolean,\n) => (\n \n {\n !approverEmailSent && (\n <>\n setApprover(raterId)}\n />\n \n \n )\n }\n \n \n);\n\nconst approver = (\n status: number,\n level: number,\n approvalLevel: number,\n levelCount: number,\n raterId: number,\n setApprover: (raterId: number) => void,\n approverEmailSent: boolean,\n) => status === 1\n ? (\n levelCount === 1\n ? \n : approverOption(true, raterId, setApprover, approverEmailSent)\n )\n : (\n levelCount > 1 && level === approvalLevel\n ? approverOption(false, raterId, setApprover, approverEmailSent)\n : '---'\n );\n\n\nconst approvalCardElements = (\n approval: boolean,\n hideApproverColumn: boolean,\n status: number,\n level: number,\n approvalLevel: number,\n levelCount: number,\n raterId: number,\n setApprover: (raterId: number) => void,\n approverEmailSent: boolean,\n) =>\n (\n approval && (\n <>\n \n \n \n {approvalStatus(\n status,\n approvalLevel === level,\n )}\n \n {\n !hideApproverColumn && (\n \n \n \n {\n approver(\n status,\n level,\n approvalLevel,\n levelCount,\n raterId,\n setApprover,\n approverEmailSent,\n )\n }\n \n )\n }\n \n )\n );\n\nconst approvalTableElements = (\n approval: boolean,\n hideApproverColumn: boolean,\n status: number,\n level: number,\n approvalLevel: number,\n levelCount: number,\n raterId: number,\n setApprover: (raterId: number) => void,\n approverEmailSent: boolean,\n) =>\n (\n approval && (\n <>\n \n {approvalStatus(\n status,\n approvalLevel === level,\n )}\n \n {\n !hideApproverColumn && (\n \n {\n approver(\n status,\n level,\n approvalLevel,\n levelCount,\n raterId,\n setApprover,\n approverEmailSent,\n )\n }\n \n )\n }\n \n )\n );\n\n/**\n * ViewRaters: a component that renders a table for the user to view their raters\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterList: React.FC = props => {\n const { setErrorMsg } = props;\n\n const [underEdit, setUnderEdit] = [props.raterUnderEdit, props.markRaterForEdit];\n\n const { isMobile } = useWindowSize();\n\n const invalidEmail = useMsgText(Str.InvalidEmail);\n\n const languagesById = React.useMemo(\n () => toMap(props.projectLanguages ?? [], lang => `${lang.languageId}`),\n [props.projectLanguages],\n );\n\n const raterLevelsById = React.useMemo(\n () => toMap(props.raterLevels ?? [], lang => `${lang.surveyLevelId}`),\n [props.raterLevels],\n );\n\n const raterUpdateFailedFor = useCallback(\n (rater: Rater) => rater.raterId === props.desyncedRaterId,\n [props.desyncedRaterId]);\n\n const maximumRatersAdded = useMsgText(Str.MaxRatersMsg);\n\n const acceptableRaterLevelIds = useMemo(\n () => {\n if (isNilOrEmpty(props.requirements)) {\n return undefined;\n }\n\n const applicableRequirements = R.filter(\n req => canAddRaterForLevel(props.maximumsRequired, req),\n props.requirements,\n );\n\n return R.map(req => req.surveyLevelId, applicableRequirements);\n },\n [props.maximumsRequired, props.requirements],\n );\n\n const maxRatersErrMsg = useCallback(\n (levelId?: number) => {\n if (!levelId) {\n return '';\n }\n\n const currentRequirement = props.requirements?.find(req => req.surveyLevelId === levelId);\n const reqName = currentRequirement?.fullName ?? '';\n\n return maximumRatersAdded.replace('{levelName}', reqName);\n },\n [maximumRatersAdded, props.requirements],\n );\n\n const { resetForm, errors, handleSubmit, handleChange, values } = useFormik({\n initialValues: props.showNameFields ? {\n email: underEdit?.email || '',\n undelivered: underEdit?.undeliveredEmail || false,\n firstName: underEdit?.firstName || '',\n lastName: underEdit?.lastName || '',\n levelId: underEdit?.levelId || 0,\n languageId: underEdit?.languageId || 0,\n } : {\n email: underEdit?.email || '',\n undelivered: underEdit?.undeliveredEmail || false,\n levelId: underEdit?.levelId || 0,\n languageId: underEdit?.languageId || 0,\n },\n onSubmit: (values) => {\n props.updateRater(\n underEdit!.raterId,\n values.email || undefined,\n values.undelivered || undefined,\n props.showNameFields ? values.firstName : undefined,\n props.showNameFields ? values.lastName : undefined,\n raterLevelsById[`${values.levelId ?? -1}`],\n languagesById[`${values.languageId ?? -1}`],\n );\n resetForm();\n setUnderEdit(undefined);\n },\n validationSchema: props.showNameFields\n ? editRaterWithNamesFormValidation(\n invalidEmail,\n (levelId) => maxRatersErrMsg(levelId),\n acceptableRaterLevelIds,\n )\n : editRaterFormValidation(\n invalidEmail,\n (levelId) => maxRatersErrMsg(levelId),\n acceptableRaterLevelIds,\n ),\n validateOnChange: false,\n validateOnBlur: false,\n enableReinitialize: true,\n });\n\n useEffect(\n () => setErrorMsg(\n errors.email || errors.firstName || errors.lastName || errors.levelId || errors.languageId || undefined,\n ),\n [errors.email, errors.firstName, errors.languageId, errors.lastName, errors.levelId, setErrorMsg],\n );\n\n const showRelationshipColumn = props.raterLevels?.length > 1;\n const showLanguageColumn = props.projectLanguages?.length > 1;\n\n const highlightEmailInput = useMemo(\n () => props.undeliveredEmails.indexOf(values.email) > -1,\n [props.undeliveredEmails, values.email],\n );\n\n const disableSubmitEditBtn = useMemo(\n () => props.undeliveredEmails.indexOf(values.email) > -1,\n [props.undeliveredEmails, values.email],\n );\n\n const mapRatersToCards = useMemo(\n () => {\n const inEditMode = (raterId: number) => underEdit?.raterId === raterId;\n\n return R.map(\n (rater: Rater) =>\n inEditMode(rater.raterId) ? (\n \n ) : (\n props.deleteRater(rater.raterId)}\n approverEmailSent={props.approverEmailSent}\n />\n ),\n props.raters,\n );\n },\n [\n props,\n underEdit,\n raterUpdateFailedFor,\n setUnderEdit,\n showRelationshipColumn,\n showLanguageColumn,\n values,\n disableSubmitEditBtn,\n highlightEmailInput,\n ],\n );\n\n const mapRatersToRows = useMemo(\n () => {\n const inEditMode = (raterId: number) => underEdit?.raterId === raterId;\n\n return R.map(\n (rater: Rater) =>\n inEditMode(rater.raterId) ? (\n \n ) : (\n props.deleteRater(rater.raterId)}\n approverEmailSent={props.approverEmailSent}\n />\n ),\n props.raters,\n );\n },\n [\n props,\n underEdit,\n raterUpdateFailedFor,\n setUnderEdit,\n showRelationshipColumn,\n showLanguageColumn,\n values,\n disableSubmitEditBtn,\n highlightEmailInput,\n ],\n );\n\n return isMobile\n ? (\n
\n
\n
\n {mapRatersToCards}\n
\n
\n
\n )\n : (\n
\n
\n \n \n \n \n {showRelationshipColumn && }\n {showLanguageColumn && }\n \n {props.approval && }\n {props.approval && !props.hideApproverColumn && }\n \n \n \n {mapRatersToRows}\n \n
\n \n \n \n
\n
\n
\n );\n};\n\nexport default RaterList;\n","import * as React from 'react';\nimport { useState, useMemo } from 'react';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../../globalStyle/colors';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../../layout/flexBox';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport { Str } from '../../../localization/translationKeys';\nimport { btnStyle, BTN_SHIMMER } from '../../../forms/styles/button';\nimport Spacer from '../../../layout/Spacer';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faExclamationTriangle, faEnvelope } from '@fortawesome/free-solid-svg-icons';\nimport AddRaterForm from './AddRaterForm';\nimport { RaterLevel, Rater } from './models';\nimport { TextDirection } from '../../../localization/textDirection';\nimport RaterList from './RaterList';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { Language } from '../../../localization/models';\nimport { HIDE_ON_MOBILE } from '../../../globalStyle/mediaQueries';\nimport { isValidDate } from '../../../language/time';\nimport Msg from '../../../localization/Msg';\nimport ClamShell from '../../../layout/ClamShell';\nimport { isNilOrEmpty } from '../../../language/module';\nimport { Requirement } from '../../models';\nimport { Link } from 'react-router-dom';\nimport { Routes } from '../../../navigation/routes';\n\n\nconst styles = {\n root: css`\n & > * { padding-top: 8px; }\n `,\n msgBar: {\n root: css`\n background-color: ${COLORS.WHITE};\n padding: 8px;\n border: 0 none;\n min-height: 50px;\n `,\n },\n addFormContainer: css`\n background-color: ${COLORS.LIGHTEST_GREY};\n border-top: 1px solid ${COLORS.LIGHTER_GREY};\n padding: 8px;\n justify-content: space-between;\n `,\n button: css`\n min-width: 132px;\n justify-content: center;\n align-items: center;\n `,\n inviteButtons: css` //Buttons, forms, etc.\n & > * {\n margin: 4px;\n }\n `,\n errorMsg: {\n root: css`\n align-items: center;\n margin: auto 8px;\n `,\n icon: css`\n color: ${COLORS.RED};\n height: min-content;\n padding: 0 8px;\n `,\n msgText: css`\n color: ${COLORS.RED};\n background-color: transparent;\n `,\n },\n infoMsg: {\n msgText: css`\n color: ${COLORS.GREEN};\n background-color: transparent;\n `,\n },\n};\n\n\ntype Props = {\n className?: string;\n\n routes: Routes;\n\n code: string;\n\n // Rater list data\n raters: Rater[];\n raterLevels: RaterLevel[];\n projectLanguages: Language[];\n requirements: Requirement[];\n undeliveredEmails: string[];\n\n // Edit rater data state\n raterUnderEdit: Rater | undefined;\n markRaterForEdit: (rater: Rater | undefined) => void;\n cancelRaterEdit: () => void;\n desyncedRaterId?: number;\n updatingRater: boolean;\n\n // Messaging\n addingRater?: boolean;\n errorAddingRater?: boolean;\n\n errorAddingPreviousRater: boolean;\n\n sendingInvitations: boolean;\n invitationsSent: boolean;\n\n sendingForApproval: boolean;\n approverSent: boolean;\n\n // Approval feature\n approval: boolean;\n approverIsAdminSelected: boolean;\n adminSelectedApproverName?: string;\n approvalLevelId: number;\n approverEmailSent: boolean;\n\n // Rater names\n showNameFields: boolean;\n requireNamesOnAdd: boolean;\n\n // Rater Roster Parameters\n minimumsRequired: boolean;\n maximumsRequired: boolean;\n\n // Feature visibility\n enableAddPreviousRaters: boolean;\n enableDirectorySearch: boolean;\n enableManualEntry: boolean;\n\n // Button disables\n surveyPastDue: boolean;\n disableCustomizeInviteButton: boolean;\n disableCustomizeEmailButton: boolean;\n disableAddPreviousRatersButton: boolean;\n\n // UI state actions\n setEmail: (email: string) => void;\n toggleCustomizeInviteModal: () => void;\n toggleCustomizeApproverEmailModal: () => void;\n toggleMobileRequirements: () => void;\n\n // API actions\n addPreviousRaters: () => void;\n addRater: (levelId: number, email: string, firstName: string, lastName: string) => void;\n updateRater: (\n raterId: number,\n email?: string,\n undelivered?: boolean,\n firstName?: string,\n lastName?: string,\n raterLevel?: RaterLevel,\n language?: Language,\n ) => void;\n deleteRater: (raterId: number) => void;\n sendInvitations: () => void;\n setApprover: (raterId: number) => void;\n sendForApproval: () => void;\n};\n\n\n/**\n * RaterTable: a component that renders a list of raters and their invitation status. Also presents the tools necessary\n * to add raters to the roster and send out invites.\n *\n * PureComponent: true\n * Connected to Redux: true\n */\nconst RaterTable: React.FC = props => {\n const [addRaterErrorMsg, setAddRaterErrorMsg] = useState(undefined);\n const [editRaterErrorMsg, setEditRaterErrorMsg] = useState(undefined);\n\n const dir = useAppState(state => state.locale.textDirection);\n const tableAlign = dir === TextDirection.LTR ? 'left' : 'right';\n\n const validationErrorMsg = addRaterErrorMsg || editRaterErrorMsg;\n const hasValidationError = !!validationErrorMsg;\n\n const uninvitedRaters = useMemo(() => props.raters.filter(rater => !isValidDate(rater.invitedDate)), [props.raters]);\n const bouncedRaters = useMemo(() => props.raters.filter(rater => rater.undeliveredEmail), [props.raters]);\n const approvalReady = useMemo(\n () => props.raters.filter(rater => rater.approvalStatus === 0 || rater.approvalStatus === 2),\n [props.raters],\n );\n\n const approvalLevel = useMemo(\n () => props.raterLevels.find(level => level.surveyLevelId === props.approvalLevelId),\n [props.raterLevels, props.approvalLevelId],\n );\n const approvalLevelName = approvalLevel?.fullName ?? '';\n\n const levelCount = useMemo(\n () => props.raters.filter(rater => rater.levelId === props.approvalLevelId).length,\n [props.raters, props.approvalLevelId],\n );\n const approverCount = useMemo(() => props.raters.filter(rater => rater.approvalStatus === 1).length, [props.raters]);\n const notApproved = useMemo(\n () => props.raters.filter(rater => rater.approvalStatus === 0 || rater.approvalStatus === 2).length,\n [props.raters],\n );\n\n const projReqs = props.requirements;\n\n const needMoreRaters = useMemo(\n () => props.minimumsRequired && projReqs.filter(req => req.raterCount < req.minimumRequired).length > 0,\n [projReqs, props.minimumsRequired],\n );\n\n const showReqInvite = !props.approval && needMoreRaters;\n const showInvite = !props.approval && !isNilOrEmpty(uninvitedRaters);\n const showLevel = props.approval && props.approvalLevelId > 0 && levelCount === 0;\n const showSelApprover = props.approval && props.approvalLevelId > 0 && approverCount === 0;\n const showReqApproval = props.approval && needMoreRaters;\n const showApproval = props.approval && notApproved > 0;\n\n const showReqApprovalAdminSelected = props.approverIsAdminSelected && notApproved > 0;\n\n const requiredInviteAlertMsg = (showReqInvite) && (\n \n );\n\n const uninvitedAlertMsg = (showInvite) && (\n \n );\n\n const levelAlertMsg = (showLevel) && (\n \n );\n\n const selAppoverMsg = (showSelApprover) && (\n \n );\n\n const requiredApprovalAlertMsg = (showReqApproval) && (\n \n );\n\n const adminSelectedApprovalAlertMsg = (showReqApprovalAdminSelected) && (\n \n );\n\n const approvalAlertMsg = (showApproval) && (\n \n );\n\n const showInviteSuccess = props.invitationsSent;\n const showApproverSuccess = props.approverSent;\n\n const showError = hasValidationError\n || props.errorAddingRater\n || props.errorAddingPreviousRater\n || !!props.desyncedRaterId;\n\n const showPrompt = showReqInvite\n || showInvite\n || showLevel\n || showSelApprover\n || showReqApproval\n || showReqApprovalAdminSelected\n || showApproval;\n\n const showBounced = !isNilOrEmpty(bouncedRaters);\n\n const msgIconColor = showError ? COLORS.RED : COLORS.GREEN;\n\n const errorMsgTxt = hasValidationError\n ? ''\n : props.errorAddingPreviousRater || !!props.desyncedRaterId\n ? Str.UnableToProcess\n : Str.AddFailed;\n\n /* first prompt message appears in the following priority order */\n const promptAlertMsg = (showPrompt) && (\n showReqInvite\n ? requiredInviteAlertMsg\n : showInvite\n ? uninvitedAlertMsg\n : showLevel\n ? levelAlertMsg\n : showSelApprover\n ? selAppoverMsg\n : showReqApproval\n ? requiredApprovalAlertMsg\n : showReqApprovalAdminSelected\n ? adminSelectedApprovalAlertMsg\n : approvalAlertMsg\n );\n\n /* undelivered message always shows up - 2nd item if prompt is shown */\n const bouncedAlertMsg = (showBounced) && (\n \n );\n\n const project = useAppState(state => state.projectSummary);\n const pastDue = useMemo(() => project?.surveyPastDue, [project]);\n\n return (\n \n\n {/* Top bar (error/info message, invite actions) */}\n {\n !pastDue && (\n
\n \n \n \n \n {\n showInviteSuccess\n ? \n : showApproverSuccess\n ? \n : showError\n ? \n : (\n <>\n {promptAlertMsg}\n {bouncedAlertMsg}\n \n )\n }\n \n \n \n \n \n
\n \n
\n {\n (props.approval)\n ? (\n \n )\n : (\n \n )\n }\n
\n
\n
\n )\n }\n {/* Add rater actions (new and previous) */}\n {\n !pastDue && (\n
\n { props.enableManualEntry && (\n \n )\n }\n \n {\n props.enableDirectorySearch && !pastDue && (\n \n \n \n )\n }\n {\n props.enableAddPreviousRaters && !pastDue && (\n \n )\n }\n \n
\n )\n }\n \n
\n );\n};\n\nexport default RaterTable;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { Str } from '../../../localization/translationKeys';\nimport { faUserPlus, faExclamationTriangle, faWrench, faEnvelope, faSearch } from '@fortawesome/free-solid-svg-icons';\nimport { Z_INDEX } from '../../../globalStyle/zIndex';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { btnStyle } from '../../../forms/styles/button';\nimport MobileToolbar from '../../../layout/mobile/MobileToolbar';\nimport MobileToolbarBtn from '../../../localization/MobileToolbarBtn';\n\n\nconst styles = {\n root: css`\n justify-content: flex-end;\n width: 100vw;\n height: 72px;\n position: fixed;\n bottom: 0;\n z-index: ${Z_INDEX.MOBILE_TOOLBAR};\n background-color: ${COLORS.WHITE};\n `,\n button: css`\n height: auto;\n line-height: 12px;\n font-size: 9px;\n border-radius: 0;\n flex-basis: 80px;\n border-color: transparent;\n & > span {\n overflow-wrap: break-spaces;\n text-transform: uppercase;\n }\n `,\n};\n\n\ntype Props = {\n className?: string;\n\n showPreviousRatersButton: boolean;\n showDirectorySearchButton: boolean;\n\n disableAddPreviousRatersButton: boolean;\n disableSearchDirectoryButton: boolean;\n disableCustomizeModalButton: boolean;\n disableRemindRatersButton: boolean;\n disableInviteOrApproveButton: boolean;\n\n customizeModalButtonLabel: Str;\n sendMsgButtonLabel: Str;\n\n onClickSearchDirectoryButton: () => void;\n onClickAddPreviousRatersButton: () => void;\n onClickSendRemindersButton: () => void;\n onClickCustomizeModalButton: () => void;\n onClickSendMsgButton: () => void;\n}\n\n\n/**\n * MobileRaterActionsBar: a tool bar which houses the action buttons associated with the invite-raters flow on mobile\n * screens.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst MobileRaterActionsBar: React.FC = props => (\n \n {\n props.showPreviousRatersButton && (\n \n )\n }\n {\n props.showDirectorySearchButton && (\n \n )\n }\n \n \n \n \n);\n\nexport default MobileRaterActionsBar;\n","import * as React from 'react';\nimport { Str } from '../../../localization/translationKeys';\nimport ModalHeader from '../../../layout/modal/ModalHeader';\nimport Modal from '../../../layout/modal/Modal';\nimport Msg from '../../../localization/Msg';\nimport { btnStyle } from '../../../forms/styles/button';\nimport { COLORS } from '../../../globalStyle/colors';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../../layout/flexBox';\nimport { css } from '@emotion/core';\nimport Spacer from '../../../layout/Spacer';\nimport { onPhone, onMobileMedium } from '../../../globalStyle/mediaQueries';\n\n\nconst styles = {\n modal: css`\n min-height: 300px;\n min-width: 300px;\n max-width: 560px;\n margin: 40px;\n ${onPhone} {\n margin: 0;\n }\n `,\n content: css`\n flex-grow: 1;\n margin: 0 20px 20px;\n `,\n msgContainer: css`\n margin: auto 90px;\n flex-grow: 1;\n justify-content: center;\n ${onMobileMedium} {\n margin: auto 40px;\n }\n ${onPhone} {\n margin-bottom: 60px;\n }\n `,\n msg: css`\n font-weight: bold;\n font-size: 18px;\n line-height: 1.5;\n `,\n warning: css`\n color: ${COLORS.RED};\n `,\n btnRow: css`\n width: 100%;\n flex-grow: 0;\n margin-top: auto;\n justify-content: center;\n `,\n btn: css`\n min-height: 35px;\n min-width: 132px;\n `,\n};\n\ntype Props = {\n className?: string;\n approval: boolean;\n unhandledRaters: number;\n onClickYes: () => void;\n onDismiss: () => void;\n};\n\n\n/**\n * LeaveInviteModal: a component that\n *\n * PureComponent: true\n * Redux Connected:\n */\nconst LeaveInviteModal: React.FC = props => (\n \n \n \n
\n \n \n
\n \n
\n \n \n \n \n \n \n);\n\nexport default LeaveInviteModal;\n","import * as React from 'react';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { FLEX_ROW } from '../../layout/flexBox';\nimport { css } from '@emotion/core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faUser, faCheck } from '@fortawesome/free-solid-svg-icons';\nimport Spacer from '../../layout/Spacer';\nimport { Requirement } from '../models';\nimport { COLORS } from '../../globalStyle/colors';\n\n\ntype Props = {\n className?: string;\n title?: string;\n requirement: Requirement;\n showMaximum: boolean;\n spacerSize?: number;\n};\n\n\n/**\n * RequirementMenuItem: a component that displays the required minimum (and, if applicable, maximum) number of raters\n * for a given rater level, similarly to the `RequirementsSummary` rows in the project dashboard.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RequirementMenuItem: React.FC = props => {\n const isComplete = props.requirement.raterCount >= props.requirement.minimumRequired;\n const maxString = props.showMaximum ? `-${props.requirement.maximumRequired}` : '';\n const spacerSize = props.spacerSize || 8;\n\n return (\n \n \n \n \n {`${props.requirement.minimumRequired}${maxString} ${props.requirement.fullName}`}\n \n {isComplete && }\n \n \n );\n};\n\nexport default RequirementMenuItem;\n","import * as React from 'react';\nimport Msg from '../../../localization/Msg';\nimport { Str } from '../../../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { Requirement } from '../../models';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { FLEX_ROW } from '../../../layout/flexBox';\nimport Spacer from '../../../layout/Spacer';\nimport RequirementMenuItem from '../../requirements/RequirementMenuItem';\n\n\nconst styles = {\n root: css`\n margin: 18px 0;\n align-items: center;\n color: ${COLORS.DARK_GREY};\n `,\n reqsContainer: css`\n flex-wrap: wrap;\n `,\n};\n\n\ntype Props = {\n className?: string;\n minimumsRequired: boolean;\n maximumsRequired: boolean;\n requirements: Requirement[];\n};\n\n\n/**\n * RequirementBar: a component that displays text descriptions of project requirements with simple visual progress cues\n * (e.g., icons and colored text)\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RequirementBar: React.FC = props => (\n \n \n \n \n {\n props.requirements.map(\n requirement => (\n \n ),\n )\n }\n \n \n);\n\nexport default RequirementBar;\n","import * as React from 'react';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_ADAPTIVE, FLEX_COLUMN } from '../../../layout/flexBox';\nimport Msg from '../../../localization/Msg';\nimport { Str } from '../../../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons';\nimport { Requirement } from '../../models';\nimport { COLORS } from '../../../globalStyle/colors';\nimport RequirementMenuItem from '../../requirements/RequirementMenuItem';\nimport { btnStyle } from '../../../forms/styles/button';\n\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n css`\n margin: 18px 0;\n align-items: stretch;\n color: ${COLORS.DARK_GREY};\n `,\n ],\n padded20Px: css`\n padding: 20px;\n `,\n title: [\n FLEX_ROW,\n css`\n justify-content: space-between;\n background-color: ${COLORS.MENU_GREY};\n color: ${COLORS.WHITE};\n font-size: 12px;\n `,\n ],\n reqsContainer: [\n FLEX_ADAPTIVE,\n css`\n background-color: ${COLORS.LIGHT_GREY};\n `,\n ],\n reqItem: FLEX_ROW,\n completed: css`\n color: ${COLORS.BLUE};\n `,\n};\n\n\ntype Props = {\n minimumsRequired: boolean;\n maximumsRequired: boolean;\n\n isOpen?: boolean;\n toggleOpen: () => void;\n\n requirements: Requirement[];\n\n className?: string;\n};\n\n\n/**\n * RequirementMobileMenu: a component that displays text descriptions of project requirements via an animated dropdown\n * menu\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RequirementMobileMenu: React.FC = props => (\n \n \n {\n props.isOpen && (\n props.requirements.map(\n requirement => (\n \n ),\n )\n )\n }\n \n);\n\nexport default RequirementMobileMenu;\n","export enum RaterApprovalOption {\n NotRequired = 0,\n SelectedByParticipant = 1,\n SelectedByAdmin = 2,\n}\n","import { useRef, useEffect } from 'react';\n\n\n/**\n * Returns the previous value (or undefined if there is no previous value) -- gives you a len(1) history of the given\n * value.\n */\nexport const usePrevious = (value: T): T | undefined => {\n const prevRef = useRef(undefined);\n\n useEffect(() => {prevRef.current = value;}, [value]);\n\n return prevRef.current;\n};\n","import { useLoading, useError } from '../api/hooks';\nimport { useEffect } from 'react';\nimport { usePrevious } from './usePrevious';\nimport { ActionType } from '../redux/actionType';\n\n\n/**\n * Triggers its callback when the given API action (and optional request ID) is successfully completed -- i.e. no error.\n */\nexport const useOnSuccess = (\n callback: (() => void) | undefined,\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n) => {\n const loading = useLoading(actionType, requestId);\n const error = useError(actionType, requestId);\n const prevLoading = usePrevious(loading);\n\n useEffect(\n () => {\n if (prevLoading && !loading && !error) {\n callback?.();\n }\n },\n [prevLoading, loading, error, callback],\n );\n};\n","import { addRaterByEmailAction } from './addRaterByEmailAction';\nimport { deleteRaterAction } from './deleteRaterAction';\nimport { setApproverAction } from './setApproverAction';\nimport { RaterLevel } from './models';\nimport { Language } from '../../../localization/models';\nimport { saveEditedRaterAction } from './saveEditedRaterAction';\nimport { updateRaterAction } from './updateRaterAction';\nimport { useMemo, Dispatch } from 'react';\nimport { useAppState } from '../../../core/redux/hooks';\n\n\n/**\n * Returns the actions used to handle CRUD operations on individual raters.\n *\n * @param projId - the database Id for the project whose raters we're working on\n * @param participantId - the database Id for the participant whose raters we're working on\n * @param dispatch - the function which dispatches the API actions in these functions (usually just the default function\n * returned by `useDispatch`)\n */\nexport const useRaterActions = (projId: number, participantId: number, dispatch: Dispatch) => useMemo(\n () => ({\n addRater: (levelId: number, email: string, firstName: string, lastName: string) => dispatch(\n addRaterByEmailAction(projId, participantId, levelId, email, firstName, lastName),\n ),\n deleteRater: (raterId: number) => dispatch(deleteRaterAction(projId, participantId, raterId)),\n setApprover: (raterId: number) => dispatch(setApproverAction(projId, participantId, raterId)),\n\n updateRater: (\n raterId: number,\n email?: string,\n undelivered?: boolean,\n firstName?: string,\n lastName?: string,\n raterLevel?: RaterLevel,\n language?: Language,\n ) => {\n dispatch(\n saveEditedRaterAction(\n projId,\n participantId,\n raterId,\n email,\n undelivered,\n firstName,\n lastName,\n raterLevel,\n language,\n ),\n );\n dispatch(\n updateRaterAction(\n projId,\n participantId,\n raterId,\n email,\n undelivered,\n firstName,\n lastName,\n raterLevel?.surveyLevelId,\n language?.languageId,\n ),\n );\n },\n }),\n [participantId, projId, dispatch],\n);\n\n\nexport const useRaterData = (projId: number) => useAppState(state => ({\n previousRaters: state.previousRaters?.[`${projId}`],\n raters: state.projectRaters?.[`${projId}`],\n raterLevels: state.projectRaterLevels?.[`${projId}`],\n languages: state.projectLanguages?.[`${projId}`],\n}));\n","import * as React from 'react';\nimport { useState, useCallback, useMemo } from 'react';\nimport RaterTable from './RaterTable';\nimport ProjectLayout from '../../ProjectLayout';\nimport SurveyHeader from '../SurveyHeader';\nimport { css } from '@emotion/core';\nimport { FLEX_ROW } from '../../../layout/flexBox';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport { Str } from '../../../localization/translationKeys';\nimport { btnStyle } from '../../../forms/styles/button';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { useHistory } from 'react-router-dom';\nimport { useRoutes } from '../../../navigation/routes';\nimport { useDispatch } from 'react-redux';\nimport { HIDE_ON_MOBILE, onMobileDevice, SHOW_ON_MOBILE } from '../../../globalStyle/mediaQueries';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { participantRatersAction } from './participantRatersAction';\nimport { useLoading, useError, useErrorOfType } from '../../../core/api/hooks';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { useMsgText } from '../../../localization/hooks';\nimport { sendInvitationsAction } from './sendInvitationsAction';\nimport { Loader } from '../../../loading/Loader';\nimport { useWindowSize } from '../../../core/hooks/useWindowSize';\nimport MobileRaterActionsBar from './MobileRaterActionsBar';\nimport { previousRatersAction } from './previousRatersAction';\nimport { useToggle } from '../../../core/hooks/useToggle';\nimport { sendForApprovalAction } from './sendForApprovalAction';\nimport LeaveInviteModal from './LeaveInviteModal';\nimport { isValidDate, diffS, TIME } from '../../../language/time';\nimport RequirementBar from './RequirementBar';\nimport RequirementMobileMenu from './RequirementMobileMenu';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { inviteEmailPreviewAction } from './inviteEmailPreviewAction';\nimport CustomizeEmailModal from './CustomizeEmailModal';\nimport { approverEmailPreviewAction } from './approverEmailPreviewAction';\nimport { isNilOrEmpty } from '../../../language/module';\nimport { useToggleOnSuccess } from '../../../core/hooks/useToggleOnSuccess';\nimport { addRaterByIdAction } from './addRaterByIdAction';\nimport { undeliveredEmailsAction } from './undeliveredEmailsAction';\nimport { useProjIds } from '../../../navigation/hooks';\nimport { withValidMinOrMax, withValidMinimum } from './module';\nimport { Rater } from './models';\nimport NavigationPrompt from 'react-router-navigation-prompt';\nimport { ProjStr } from '../../messages/ProjStr';\nimport ProjMsg from '../../messages/ProjMsg';\nimport { useOnSuccess } from '../../../core/hooks/useOnSuccess';\nimport { RaterApprovalOption } from '../../../raterApproval/raterApprovalOption';\nimport { useRaterActions, useRaterData } from './hooks';\nimport { useInterval } from '../../../core/hooks/useInterval';\nimport { logInfoAction } from '../../../traceLogging/api/logInfoAction';\nimport { clearLoadingStateAction } from '../../../core/redux/clearLoadingStateAction';\n\n\nconst styles = {\n header: css`\n margin-bottom: 40px;\n ${onMobileDevice} {\n margin-bottom: 35px;\n }\n `,\n content: css`\n `,\n breakLine: css`\n height: 1px;\n background-color: ${COLORS.LIGHT_GREY};\n border: 0 none;\n `,\n introBar: {\n root: css`\n justify-content: space-between;\n align-items: center;\n margin: 16px;\n `,\n separator: css`\n margin: auto;\n flex-basis: 25%;\n `,\n remindBtn: css`\n flex-basis: 132px;\n flex-shrink: 0;\n `,\n introMsg: css`\n a {\n // Like PLAIN_GREEN_LINKS, but not bolded\n color: #73C724;\n text-decoration: none;\n }\n `,\n },\n loader: {\n root: css`\n margin-top: 240px;\n justify-content: center;\n align-items: center;\n ${onMobileDevice} {\n margin-top: 120px;\n }\n `,\n spinner: css`\n width: 60px;\n `,\n },\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * InviteRaters: a component that renders a table showing the raters currently associated to the current project, as\n * well as several UI elements which allow manipulation of the rater set (adding, removing, requesting approval for\n * raters, etc.).\n *\n * TODO: this component is too large -- it should be broken out\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst InviteRaters: React.FC = props => {\n const history = useHistory();\n const dispatch = useDispatch();\n\n const { isMobile } = useWindowSize();\n\n const projIds = useProjIds();\n const project = useAppState(state => state.projectSummary);\n\n // Local data\n const [email, setEmail] = React.useState('');\n const [inviteComment, setInviteComment] = React.useState('');\n const [approverComment, setApproverComment] = React.useState('');\n\n // Modals/toggled components\n const [showingApproverEmailModal, toggleApproverEmailModal] = useToggle();\n const [showingInviteModal, toggleInviteModal] = useToggle();\n const [showingMobileRequirements, toggleMobileRequirements] = useToggle();\n\n // Messaging\n const pageTitle = useMsgText(Str.InviteRemindRaters);\n\n const [approverEmailSent] = useToggleOnSuccess(ActionType.SendForApprovalRequest, `${projIds.projId}`);\n const [invitationsSent] = useToggleOnSuccess(ActionType.SendInvitationsRequest, `${projIds.projId}`);\n\n // Edit rater data state\n // This lives here so we can track the rater Id and proj Id to trigger error messaging\n const [underEdit, setUnderEdit] = useState(undefined);\n const [underUpdate, setUnderUpdate] = useState(undefined);\n\n const markRaterForEdit = useCallback(\n (rater: Rater | undefined) => {\n setUnderEdit(rater);\n\n // Don't un-mark the rater as under update until the API request returns with success\n if (rater === undefined) {\n return;\n }\n\n setUnderUpdate(rater);\n },\n [],\n );\n\n const cancelRaterEdit = useCallback(\n () => {\n setUnderEdit(undefined);\n setUnderUpdate(undefined);\n },\n [],\n );\n\n const updatingRater = useLoading(ActionType.UpdateRaterRequest, `${projIds.projId}-${underUpdate?.raterId}`);\n const errorUpdatingRater = !!useError(ActionType.UpdateRaterRequest, `${projIds.projId}-${underUpdate?.raterId}`);\n const desyncedRaterId = useMemo(\n () => errorUpdatingRater ? underUpdate?.raterId : undefined,\n [errorUpdatingRater, underUpdate],\n );\n\n useOnSuccess(\n () => setUnderUpdate(undefined),\n ActionType.UpdateRaterRequest,\n `${projIds.projId}-${underUpdate?.raterId}`,\n );\n\n const requirements = useAppState(state => state.participantRequirements);\n const languages = useAppState(state => state.projectLanguages?.[`${projIds.projId}`] ?? []);\n const currentLanguage = useAppState(state => state.locale.lang);\n \n const { previousRaters, raters, raterLevels } = useRaterData(projIds.projId);\n\n React.useEffect(\n () => {\n if (projIds.participantId < 0 || projIds.projId < 0) {\n return;\n }\n\n if (!raters) {\n dispatch(participantRatersAction(projIds.projId, projIds.participantId));\n }\n\n if (!previousRaters) {\n dispatch(previousRatersAction(projIds.projId, projIds.participantId));\n }\n },\n [dispatch, previousRaters, projIds.participantId, projIds.projId, raters],\n );\n\n React.useEffect(\n () => {\n if ((!currentLanguage) || projIds.projId < 0) {\n return;\n }\n\n dispatch(inviteEmailPreviewAction(projIds.projId, currentLanguage.languageId));\n },\n [currentLanguage, dispatch, projIds.projId],\n );\n\n const undeliveredEmails = useAppState(state => state.undeliveredEmails);\n\n React.useEffect(\n () => {\n // For reasons currently unclear, if the undelivered email address list is returned before the rater set,\n // undelivered raters are never properly marked as such. Hence, until a more durable fix can be delivered, we\n // wait for raters to be returned.\n if (!raters) {\n return;\n }\n\n if (projIds.projId < 0 || projIds.participantId < 0) {\n return;\n }\n\n if (!undeliveredEmails) {\n dispatch(undeliveredEmailsAction(projIds.projId, projIds.participantId));\n }\n },\n [dispatch, projIds.participantId, projIds.projId, raters, undeliveredEmails],\n );\n\n const inviteBody = useAppState(\n state => state.inviteEmailTemplates[`${(projIds.projId)}`]?.[`${currentLanguage.languageId}`] || '',\n );\n\n const approverEmailBody = useAppState(\n state => state.approverEmailTemplates[`${(projIds.projId)}`]?.[`${currentLanguage.languageId}`] || '',\n );\n\n const routes = useRoutes(projIds.participantId, projIds.projDisplayId);\n\n const approval = !!project?.inviteRatersRaterApprovalOption;\n\n const raterArr = useMemo(() => Object.values(raters ?? {}), [raters]);\n\n const { notInvited, invited, notApproved, approvers } = React.useMemo(\n () => ({\n notInvited: raterArr\n .filter(rater => !isValidDate(rater.invitedDate))\n .sort((rater1, rater2) => rater2.raterId - rater1.raterId),\n invited: raterArr\n .filter(rater => isValidDate(rater.invitedDate))\n .sort((rater1, rater2) => rater2.raterId - rater1.raterId),\n notApproved: raterArr.filter(rater => rater.approvalStatus === 0 || rater.approvalStatus === 2),\n approvers: raterArr.filter(rater => rater.approvalStatus === 1),\n }),\n [raterArr],\n );\n\n //region Approver-selected admin handling\n\n const approverIsAdminSelected = React.useMemo(\n () => project?.inviteRatersRaterApprovalOption === RaterApprovalOption.SelectedByAdmin,\n [project],\n );\n\n const approverSelectedAdminEmail = React.useMemo(() => project?.inviteRatersApproverEmail, [project]);\n\n //endregion Approver-selected admin handling\n\n const approverEmail = React.useMemo(() => approvers.length > 0 ? approvers[0].email : '', [approvers]);\n React.useEffect(\n () => {\n if (projIds.projId < 0) {\n return;\n }\n\n if (!currentLanguage) {\n return;\n }\n\n dispatch(approverEmailPreviewAction(projIds.projId, currentLanguage.languageId, approverEmail));\n },\n [dispatch, projIds.projId, currentLanguage.languageId, approverEmail, currentLanguage],\n );\n\n // Used for `sendTo` parameter when requesting approval for raters\n const approverAddresses = React.useMemo(\n () => approverIsAdminSelected\n ? [{ toAddress: approverSelectedAdminEmail ?? '', languageId: currentLanguage.languageId }]\n : approvers.map(r => ({ toAddress: r.email, languageId: r.languageId })),\n [approverIsAdminSelected, approverSelectedAdminEmail, approvers, currentLanguage.languageId],\n );\n // ... and when inviting raters...\n const addressesToInvite = React.useMemo(\n () => notInvited.map(r => ({ toAddress: r.email, languageId: r.languageId })),\n [notInvited],\n );\n\n const directorySearchEnabled = React.useMemo(\n () => project?.inviteRatersRaterSelectionOption === 2 || project?.inviteRatersRaterSelectionOption === 3,\n [project],\n );\n\n const manualEntryEnabled = React.useMemo(\n () => project?.inviteRatersRaterSelectionOption === 1 || project?.inviteRatersRaterSelectionOption === 3,\n [project],\n );\n\n const searchDirectory = React.useCallback(\n () => history.push(routes.SearchDirectory),\n [routes.SearchDirectory, history],\n );\n\n const nonAssociatedPreviousRaterIds = React.useMemo(\n () => !!previousRaters && Object.keys(previousRaters).filter(r => !raters?.[r]),\n [previousRaters, raters],\n );\n\n const nonAssociatedPreviousRaters = React.useMemo(\n () => !!nonAssociatedPreviousRaterIds && nonAssociatedPreviousRaterIds.map(raterId => previousRaters?.[raterId]),\n [nonAssociatedPreviousRaterIds, previousRaters],\n );\n\n const addPreviousRaters = React.useCallback(\n () => Object\n .values(nonAssociatedPreviousRaters)\n .map(rater => dispatch(addRaterByIdAction(\n projIds.projId,\n projIds.participantId,\n rater.raterId,\n rater.surveyLevelId,\n ))),\n [nonAssociatedPreviousRaters, projIds.participantId, projIds.projId, dispatch],\n );\n\n const { addRater, deleteRater, setApprover, updateRater } = useRaterActions(\n projIds.projId,\n projIds.participantId,\n dispatch,\n );\n\n const sendInvitations = React.useCallback(\n () => dispatch(sendInvitationsAction(projIds.projId, projIds.participantId, inviteComment, addressesToInvite)),\n [addressesToInvite, inviteComment, projIds.participantId, projIds.projId, dispatch],\n );\n\n const sendForApproval = React.useCallback(\n () => dispatch(sendForApprovalAction(projIds.projId, projIds.participantId, approverComment, approverAddresses)),\n [approverAddresses, approverComment, projIds.participantId, projIds.projId, dispatch],\n );\n\n const loadingRaters = useLoading(ActionType.ParticipantRatersRequest, `${projIds.projId}`);\n const addingRater = useLoading(ActionType.AddRaterByEmailRequest, `${email}-${projIds.projId}`);\n const sendingInvitations = useLoading(ActionType.SendInvitationsRequest, `${projIds.projId}`);\n const sendingForApproval = useLoading(ActionType.SendForApprovalRequest, `${projIds.projId}`);\n\n const isLoading = loadingRaters || addingRater || updatingRater || sendingInvitations || sendingForApproval;\n\n const errorAddingRater = !!useError(ActionType.AddRaterByEmailRequest, `${email}-${projIds.projId}`);\n const addPreviousRaterErrors = useErrorOfType(ActionType.AddRaterByIdRequest);\n const errorAddingPreviousRater = React.useMemo(() => !isNilOrEmpty(addPreviousRaterErrors), [addPreviousRaterErrors]);\n\n const showPreviousRatersBtn = React.useMemo(\n () => !!project?.inviteRatersAutoPopulateRaters && !isNilOrEmpty(previousRaters),\n [previousRaters, project],\n );\n\n const disableCustomizeEmailBtn = React.useMemo(\n () => project?.surveyPastDue || !approverEmailBody,\n [approverEmailBody, project],\n );\n\n const disableCustomizeInviteBtn = React.useMemo(\n () => project?.surveyPastDue || !inviteBody,\n [inviteBody, project],\n );\n\n const nonEmptyRequirements = React.useMemo(\n () => !!project?.maximumsRequired ? withValidMinOrMax(requirements) : withValidMinimum(requirements),\n [project, requirements],\n );\n\n const { disableApproveBtn, disableInviteBtn } = React.useMemo(\n () => {\n const minReq = !!project?.minimumsRequired;\n const raterArr = Object.values(raters || {}) as Rater[];\n const needMoreRaters = minReq && requirements!.filter(r => r.raterCount < r.minimumRequired).length > 0;\n\n const approvalReady = raterArr.filter(rater => rater.approvalStatus === 0 || rater.approvalStatus === 2);\n\n const uninvitedRaters = raterArr.filter(rater => !isValidDate(rater.invitedDate));\n\n return {\n disableInviteBtn: !uninvitedRaters.length || needMoreRaters || !!project?.surveyPastDue || sendingInvitations,\n disableApproveBtn: !approvalReady.length || needMoreRaters || !!project?.surveyPastDue,\n };\n },\n [project, raters, requirements, sendingInvitations],\n );\n\n const user = useAppState(state => state.auth.currentUser);\n const code = useAppState(state => state.locale.lang.code);\n\n const dateDue = React.useMemo(\n () => project && project.surveyDeadline\n ? (new Date(project.surveyDeadline)).toLocaleDateString(code)\n : '',\n [project, code],\n );\n const pastDue = useMemo(() => project?.surveyPastDue, [project]);\n\n const remindRaters = () => {\n history.push(routes.RemindRaters);\n };\n\n // Insert the self-survey pass key into the passkey generator link\n const introTagMapping = React.useMemo(() => ({ 'cRaterPW': project?.selfSurveyPasskey }), [project]);\n\n //region sendInvitationsAction Debug Fix\n\n const lastInviteRequestStamp = useAppState(state => state.lastInviteRequest);\n\n const logSlowInviteRequest = useCallback(\n () => dispatch(logInfoAction(\n 'Send rater invites request has exceeded 30 seconds',\n ActionType.SendInvitationsRequest,\n )),\n [dispatch],\n );\n\n const clearLoadingState = useCallback(\n () => { dispatch(clearLoadingStateAction(ActionType.SendInvitationsRequest, `${projIds.projId}`)); },\n [dispatch, projIds.projId],\n );\n\n useInterval(\n () => {\n if (!sendingInvitations) {\n return;\n }\n\n if (!lastInviteRequestStamp) {\n return;\n }\n\n const delta = diffS(lastInviteRequestStamp ?? new Date(), new Date());\n if (sendingInvitations && !!lastInviteRequestStamp && Math.abs(delta) >= 30) {\n logSlowInviteRequest();\n clearLoadingState();\n sendInvitations();\n }\n },\n 15 * TIME.S,\n );\n\n //endregion\n\n return (\n \n \n \n
\n \n
\n { !pastDue && (\n remindRaters()}\n />\n )}\n
\n {\n !isNilOrEmpty(nonEmptyRequirements) && (\n <>\n
\n \n \n \n )\n }\n \n
\n {isLoading && }\n
\n {\n isMobile && !pastDue && (\n \n )\n }\n {\n showingInviteModal && (\n \n )\n }\n {\n showingApproverEmailModal && (\n \n )\n }\n \n !nextLocation?.pathname?.includes('inviteRaters')\n && !nextLocation?.pathname?.toLowerCase().includes('modal')\n && !nextLocation?.pathname?.toLowerCase().includes('searchdirectory')\n && (approval ? notApproved.length : notInvited.length) > 0\n }\n >\n {\n ({ onCancel, onConfirm }) => (\n \n )\n }\n \n \n \n );\n};\n\nexport default InviteRaters;\n","import { Report } from './models';\nimport { pathCombine } from '../../core/api/module';\nimport { BaseUrl } from '../../core/api/endpoints';\n\n\nexport const downloadURL = (report: Report) => {\n const baseUrl = pathCombine(BaseUrl, '/report/reportDownload');\n return report?.fileExists ? baseUrl + '/' + encodeURIComponent(report!.reportFile) : undefined;\n};\n","import * as React from 'react';\nimport Msg from '../../localization/Msg';\nimport { Str } from '../../localization/translationKeys';\nimport { downloadURL } from './module';\nimport { btnStyle } from '../../forms/styles/button';\nimport { COLORS } from '../../globalStyle/colors';\nimport { Link } from 'react-router-dom';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { Report } from './models';\nimport { css } from '@emotion/core';\nimport { isNilOrEmpty } from '../../language/module';\n\n\nconst styles = {\n cells: {\n reports: css`\n min-width: 200px;\n `,\n delivered: css`\n min-width: 130px;\n `,\n language: css`\n min-width: 125px;\n `,\n type: css`\n min-width: 50px;\n `,\n navBtn: css`\n min-width: 145px;\n padding: 5px !important;\n `,\n },\n link: css`\n display: block;\n margin-left: 5px;\n margin-right: 5px;\n `,\n disabled: css`\n cursor: default;\n opacity: .6;\n\n &:hover {\n text-decoration: none;\n cursor: default;\n }\n `,\n};\n\n\ntype Props = {\n report: Report;\n language: string;\n code: string;\n\n showShareScoresBtn: boolean;\n showDownloadReportBtn: boolean;\n\n setReport: () => void;\n onClickShareScoresBtn: () => void;\n\n className?: string;\n};\n\nconst reportType = (report: Report) => (\n report.reportTypeMessageKey !== 'Portal-AggregateReport'\n ? \n : isNilOrEmpty(report.groupReportTitle)\n ? \n : {report.groupReportTitle}\n);\n\n/**\n * FeedbackReportTableRow: a component that renders an individual row/report item in the feedback report table.\n */\nconst FeedbackReportTableRow: React.FC = (\n {\n report,\n language,\n code,\n showShareScoresBtn,\n showDownloadReportBtn,\n setReport,\n onClickShareScoresBtn,\n className,\n },\n) => (\n \n {reportType(report)}\n \n {new Date(report.effectiveDate).toLocaleDateString(code)}\n \n \n {language}\n \n \n {\n showDownloadReportBtn\n ? (\n \n \n \n )\n : (\n \n \n \n )\n }\n \n {\n showShareScoresBtn && (\n \n \n \n )\n }\n \n);\n\nexport default FeedbackReportTableRow;\n","import * as React from 'react';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { TABLE_STYLE } from '../../layout/table/style';\nimport Msg from '../../localization/Msg';\nimport { Str } from '../../localization/translationKeys';\nimport { Language } from '../../localization/models';\nimport { css } from '@emotion/core';\nimport { Report } from './models';\nimport FeedbackReportTableRow from './FeedbackReportTableRow';\n\n\nconst styles = {\n cells: {\n reports: css`\n min-width: 200px;\n `,\n delivered: css`\n min-width: 130px;\n `,\n language: css`\n min-width: 125px;\n `,\n type: css`\n min-width: 50px;\n `,\n navBtn: css`\n min-width: 145px;\n padding: 5px !important;\n `,\n },\n link: css`\n display: block;\n margin-left: 5px;\n margin-right: 5px;\n `,\n disabled: css`\n cursor: default;\n opacity: .6;\n\n &:hover {\n text-decoration: none;\n cursor: default;\n }\n `,\n};\n\n\ntype Props = {\n reports: Report[];\n showShareScoresColumn: boolean;\n code: string;\n\n showShareScoresBtn: (report: Report) => boolean;\n showDownloadReportBtn: (report: Report) => boolean;\n setReport: (report: Report) => void;\n onClickShareScoresBtn: (report: Report) => void;\n getLanguage: (languageId: number) => Language;\n\n className?: string;\n};\n\n\n/**\n * FeedbackReportTableData: a component that renders the feedback report table's report items as rows in the table.\n */\nconst FeedbackReportTableData: React.FC = (\n {\n reports,\n showShareScoresColumn,\n showShareScoresBtn,\n showDownloadReportBtn,\n setReport,\n onClickShareScoresBtn,\n getLanguage,\n code,\n className,\n },\n) => (\n \n \n \n \n \n \n \n \n \n \n {\n reports.map(\n report => (\n setReport(report)}\n onClickShareScoresBtn={() => onClickShareScoresBtn(report)}\n />\n ),\n )\n }\n {\n reports.length === 0 && (\n \n \n \n )\n }\n \n
\n \n \n \n \n \n \n {\n showShareScoresColumn && (\n \n )\n }\n
\n \n
\n
\n);\n\nexport default FeedbackReportTableData;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { TABLE_COLORS, COLORS } from '../../globalStyle/colors';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { Link } from 'react-router-dom';\nimport { useMsgText } from '../../localization/hooks';\nimport { Str } from '../../localization/translationKeys';\nimport Msg from '../../localization/Msg';\nimport { Report } from './models';\nimport { btnStyle } from '../../forms/styles/button';\nimport { pathCombine } from '../../core/api/module';\nimport { BaseUrl } from '../../core/api/endpoints';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { FLEX_ADAPTIVE_MED } from '../../layout/flexBox';\nimport Spacer from '../../layout/Spacer';\nimport { isNilOrEmpty } from '../../language/module';\nimport { useAppState } from '../../core/redux/hooks';\n\n\nconst styles = {\n root: css`\n background-color: ${TABLE_COLORS.DARK_BG};\n padding: 25px 25px 15px;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n `,\n dataRow: css`\n display: flex;\n flex-direction: row;\n margin-bottom: 5px;\n `,\n btnRow: {\n root: [\n FLEX_ADAPTIVE_MED,\n css`\n align-items: flex-start;\n `,\n ],\n btn: css`\n min-width: 192px;\n `,\n },\n label: css`\n font-weight: bold;\n `,\n link: css`\n display: block;\n width: 180px;\n `,\n disabled: css`\n cursor: default;\n opacity: .6;\n\n &:hover {\n text-decoration: none;\n cursor: default;\n }\n `,\n};\n\n\ntype Props = {\n report: Report;\n language: string;\n\n showShareScoresBtn: boolean;\n showDownloadReportBtn: boolean;\n\n setReport: () => void;\n onClickShareScoresBtn: () => void;\n\n className?: string;\n};\n\n\n/**\n * ReportCard: a component that renders a summary for a report, including a link to view that report.\n * Mostly used on mobile.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportCard: React.FC = props => {\n const btnText = useMsgText(props.showDownloadReportBtn && !props.report.webReport ? Str.Download : Str.ViewReport);\n\n const downloadURL = (report: Report) => {\n const baseUrl = pathCombine(BaseUrl, '/report/reportDownload');\n return report?.fileExists ? baseUrl + '/' + encodeURIComponent(report!.reportFile) : undefined;\n };\n\n const reportType = (report: Report) => (\n report.reportTypeMessageKey !== 'Portal-AggregateReport'\n ? \n : isNilOrEmpty(report.groupReportTitle)\n ? \n : {report.groupReportTitle}\n );\n \n const code = useAppState(state => state.locale.lang.code);\n \n return (\n \n \n \n :\n  \n {reportType(props.report)}\n \n \n \n :\n  \n {new Date(props.report.effectiveDate).toLocaleDateString(code)}\n \n \n \n :\n  \n {props.language}\n \n \n \n {\n props.showDownloadReportBtn && !props.report.webReport\n ? (\n \n {btnText}\n \n ) : (\n \n {btnText}\n \n )\n }\n {\n props.showShareScoresBtn && (\n <>\n \n \n \n )\n }\n \n \n );\n};\n\nexport default ReportCard;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { Report } from './models';\nimport ReportCard from './ReportCard';\nimport { Language } from '../../localization/models';\nimport { FLEX_COLUMN, FLEX_CENTERED } from '../../layout/flexBox';\nimport Msg from '../../localization/Msg';\nimport { Str } from '../../localization/translationKeys';\n\n\nconst styles = {\n card: css`\n flex-basis: 100%;\n margin-bottom: 5px;\n `,\n noReports: css`\n text-align: center;\n `,\n};\n\n\ntype Props = {\n reports: Report[];\n\n showShareScoresBtn: (report: Report) => boolean;\n showDownloadReportBtn: (report: Report) => boolean;\n setReport: (report: Report) => void;\n onClickShareScoresBtn: (report: Report) => void;\n getLanguage: (languageId: number) => Language;\n\n className?: string;\n};\n\n\n/**\n * ReportCards: a component that\n */\nconst ReportCards: React.FC = (\n {\n reports,\n showShareScoresBtn,\n showDownloadReportBtn,\n setReport,\n onClickShareScoresBtn,\n getLanguage,\n className,\n },\n) => (\n
\n {\n reports!.map(report => (\n // eslint-disable-next-line react/jsx-no-undef\n setReport(report)}\n onClickShareScoresBtn={() => onClickShareScoresBtn(report)}\n language={getLanguage(report.languageId)?.nativeName ?? ''}\n css={styles.card}\n />\n ))\n }\n {\n !reports.length && (\n
\n \n
\n )\n }\n
\n);\n\nexport default ReportCards;\n","import * as React from 'react';\nimport { Loader } from '../../loading/Loader';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\nimport { useWindowSize } from '../../core/hooks/useWindowSize';\nimport { Str } from '../../localization/translationKeys';\nimport Msg from '../../localization/Msg';\nimport { Report } from './models';\nimport { useSelector } from 'react-redux';\nimport { AppState } from '../../core/redux/appState';\nimport { ParticipantProject } from '../models';\nimport { useAppState } from '../../core/redux/hooks';\nimport { Language } from '../../localization/models';\nimport FeedbackReportTableData from './FeedbackReportTableData';\nimport ReportCards from './ReportCards';\nimport { FLEX_COLUMN } from '../../layout/flexBox';\n\n\nconst styles = {\n root: css`\n display: flex;\n `,\n loader: css`\n width: 150px;\n height: 150px;\n margin: auto;\n `,\n error: css`\n color: ${COLORS.WHITE};\n background-color: ${COLORS.RED};\n padding: 15px 20px;\n `,\n noReports: css`\n text-align: center;\n `,\n table: css`\n width: 100%;\n `,\n cards: [\n FLEX_COLUMN,\n css`\n align-items: stretch;\n align-self: stretch;\n flex-basis: 100%;\n `,\n ],\n};\n\n\ntype Props = {\n project: ParticipantProject | undefined;\n reports: Report[] | undefined;\n code: string;\n\n showShareScoresColumn: boolean;\n loading?: boolean;\n error?: boolean;\n\n showShareScoresBtn: (report: Report) => boolean;\n enableReportDownload: (report: Report) => boolean;\n setReport: (report: Report) => void;\n onClickShareScoresBtn: (report: Report) => void;\n\n className?: string;\n};\n\nconst renderEdgeCase = (props: Props): React.ReactNode => {\n if (props.loading) {\n return ;\n }\n\n if (props.error) {\n return ;\n }\n\n if (!props.reports || props.reports.length <= 0) {\n return ;\n }\n\n return null;\n};\n\nconst renderData = (\n props: Props,\n isMobile: boolean,\n participantId: number,\n getLanguage: (languageId: number) => Language,\n): React.ReactNode => {\n const reports = props.reports ?? [];\n\n return isMobile\n ? (\n \n ) : (\n \n );\n};\n\n\n/**\n * ReportTable: a component that renders the given list of reports in a navigable way. Can also render loading/error\n * state.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportTable: React.FC = props => {\n const { isMobile } = useWindowSize();\n const edgeCase = renderEdgeCase(props);\n const participantId = useSelector(state => state.auth.currentUser?.personId ?? 0);\n\n const allLangs = useAppState(state => state.allLanguages ?? []);\n\n const getLanguage = (languageId: number) => (\n allLangs.find(lang => lang.languageId === languageId)!\n );\n\n return (\n
\n { // Full\n edgeCase ?? renderData(props, isMobile, participantId, getLanguage)\n }\n
\n );\n};\n\nexport default ReportTable;\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport * as ReactDOM from 'react-dom';\nimport * as R from 'ramda';\nimport { css } from '@emotion/core';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { Str } from '../../localization/translationKeys';\nimport { Z_INDEX } from '../../globalStyle/zIndex';\nimport { COLORS } from '../../globalStyle/colors';\nimport { DevResource } from '../resources/models';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { btnStyle } from '../../forms/styles/button';\nimport Msg from '../../localization/Msg';\nimport Spacer from '../../layout/Spacer';\nimport { DevPlanItem } from '../devPlan/models';\nimport { useAppState } from '../../core/redux/hooks';\nimport * as Localization from '../../localization/module';\n\n\nconst styles = {\n root: css`\n justify-content: flex-end;\n position: absolute;\n top: 45px;\n z-index: ${Z_INDEX.COMPETENCY_LIST};\n background-color: ${COLORS.WHITE};\n `,\n right: css`\n right: 10px;\n `,\n left: css`\n left: 10px;\n `,\n list: css`\n list-style: none;\n padding: 0;\n margin: 0;\n border: 1px solid ${COLORS.LIGHT_GREY};\n height: 300px;\n overflow: auto;\n `,\n listItem: css`\n padding: 5px 15px;\n border-bottom: 1px solid ${COLORS.LIGHTER_GREY}\n `,\n name: css`\n justify-content: flex-start;\n margin-top: 12px;\n `,\n selectedName: css`\n color: ${COLORS.MEDIUM_GREY};\n `,\n unselectedName: css`\n color: ${COLORS.DARK_GREY};\n`,\n between: css`\n justify-content: space-between;\n `,\n added: css`\n margin-top: 12px;\n `,\n button: css`\n & > span {\n padding: 0 12px;\n }\n `,\n spacer: css`\n height: 10px;\n `,\n};\n\n\ntype Props = {\n className?: string;\n competencies: DevResource[];\n devItems: DevPlanItem[];\n addItem: (competencyId: number) => void;\n deleteItem: (competencyId: number) => void;\n}\n\nconst added = (id: number, devItems: DevPlanItem[]) => (\n devItems.filter(itm => itm.devItemCompetencyId === id).length > 0\n);\n\n/**\n * CompetencyList: a list of competencies that can be added to the dev plan\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CompetencyList: React.FC = props => {\n const {competencies, devItems, ...rest} = props;\n const isRtl = useAppState(state => Localization.isRtl(state.locale.textDirection));\n\n const competencyRows = useMemo(\n () => R.map( compCat => {\n const isAdded = added(compCat.competencyId, devItems);\n\n return (\n
  • \n \n \n {compCat.letterCode + '.' + compCat.name}\n \n \n \n \n {\n isAdded && (\n <>\n \n \n \n )\n }\n rest.deleteItem(compCat.competencyId)\n : () => rest.addItem(compCat.competencyId)\n }\n />\n \n \n \n
  • \n )\n },\n competencies,\n ),\n [competencies, devItems, rest],\n );\n\n return (\n ReactDOM.createPortal(\n
    \n
      \n {competencyRows}\n
    \n
    \n ,\n document.getElementById('root') || document.getElementById('react-root') || document.body,\n )\n )\n};\n\nexport default CompetencyList;\n","import * as React from 'react';\nimport { useMount } from '../core/hooks/useMount';\n\n\ntype Props = {\n toggleFn: () => void;\n}\n\n\n/**\n * ToggleSwitch: a non-rendering component that invokes the enclosed toggle function on mount\n */\nconst ToggleSwitch: React.FC = props => {\n useMount(() => props.toggleFn());\n return null;\n};\n\nexport default ToggleSwitch;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport Modal from './Modal';\nimport ModalHeader from './ModalHeader';\nimport LocalDiv from '../../localization/LocalDiv';\nimport LocalBtn from '../../localization/LocalBtn';\nimport Spacer from '../Spacer';\nimport { btnStyle } from '../../forms/styles/button';\nimport { COLORS } from '../../globalStyle/colors';\nimport { FLEX_ROW, FLEX_COLUMN } from '../flexBox';\n\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n css`\n min-height: 300px;\n max-width: 565px;\n `,\n ],\n modalContent: [\n FLEX_COLUMN,\n css`\n flex-grow: 1;\n justify-content: space-between;\n `,\n ],\n confirmationTxt: css`\n display: block;\n font-size: 18px;\n color: ${COLORS.DARK_GREY};\n font-weight: bold;\n line-height: 23px;\n overflow-wrap: break-word;\n margin: 65px 85px 85px;\n \n @media only screen and (max-width: 470px) {\n margin: 65px 20px 85px;\n }\n `,\n btnRow: [\n FLEX_ROW,\n css`\n justify-content: flex-end;\n margin: 0 20px 20px;\n `,\n ],\n secondaryBtn: [\n btnStyle.secondary(COLORS.BLUE),\n css`\n min-width: 135px;\n `,\n ],\n primaryBtn: [\n btnStyle.primary(COLORS.BLUE),\n css`\n min-width: 135px;\n `,\n ],\n};\n\n\ntype Props = {\n confirmationTxt: string;\n\n primaryActionStr: string;\n secondaryActionStr: string;\n\n onSelectPrimary: () => void;\n onSelectSecondary: () => void;\n\n onDismiss: () => void;\n\n className?: string;\n};\n\n\n/**\n * ConfirmationModal: a component that renders a modal with confirmation text and a primary/secondary button.\n * When the user makes a selection, the appropriate action handler is called.\n */\nconst ConfirmationModal: React.FC = props => (\n \n \n
    \n {props.confirmationTxt}\n \n \n \n \n \n
    \n
    \n);\n\nexport default ConfirmationModal;\n","import { Dispatch, useState, useCallback, useMemo, useEffect } from 'react';\nimport { useToggle } from '../../core/hooks/useToggle';\nimport { useAppState } from '../../core/redux/hooks';\nimport { sendEQScoresAction } from './api/sendEQScoresAction';\nimport { SendEQScoresModalProps, Report, EQScores } from './models';\nimport { getEQScoresAction } from './api/getEQScoresAction';\nimport { useSessionStorage } from '../../core/hooks/useSessionStorage';\nimport { SessionStorageKeys } from '../../localStorage/sessionStorageKeys';\nimport { useRoutes } from '../../navigation/routes';\nimport { useCurrentUser } from '../../auth/hooks';\nimport { useMount } from '../../core/hooks/useMount';\nimport { ProjectCSContact } from '../models';\nimport { getProjectCSContactAction } from '../api/getProjectCSContactAction';\n\n\nexport const useSendEQScoresModalProps = (\n projId: number,\n participantId: number,\n dispatch: Dispatch,\n): SendEQScoresModalProps => {\n // If collaboration is enabled, rather than immediately invite a collaborator when pressing the send-email button, we\n // raise a modal to inform the user of the data sharing ramifications. If they agree, we'll use the collected email\n // address and comment text to send the prospective collaborator an invite.\n const [comment, setComment] = useState('');\n const [recipientEmail, setRecipientEmail] = useState();\n const [currentReport, setCurrentReport] = useState();\n const currentReleaseId = useMemo(() => currentReport?.releaseId ?? -1, [currentReport]);\n\n const [modalVisible, toggleModal] = useToggle();\n\n const proj = useAppState(state => state.projectSummary);\n const logo = useMemo(() => proj?.clientImageUrl, [proj]);\n\n const csContact = useAppState(state => state.projectCSContacts[`${projId}`]);\n\n const participant = useCurrentUser();\n\n const [, setCustomEmailTxt] = useSessionStorage(\n `${SessionStorageKeys.EQScoresEmailTxt}-${currentReleaseId}`,\n ); //<@ExtraText>;\n\n const [, setReportScores] = useSessionStorage(\n `${SessionStorageKeys.EQScores}-${currentReleaseId}`,\n ); //<@cEQScore>, etc;\n\n const [, setCustomEmailLogo] = useSessionStorage(\n `${SessionStorageKeys.CustomEmailLogo}-${projId}`,\n ); //<@PrimaryLogo>\n\n const [, setCustomEmailParticipant] = useSessionStorage(\n `${SessionStorageKeys.CustomEmailParticipant}-${projId}`,\n ); //<@cRateeName>\n\n const [, setProjectCSContact] = useSessionStorage(\n `${SessionStorageKeys.ProjectCSContact}-${projId}`,\n ); //<@cClientSupportFirstLast>, <@cClientSupportEmail>\n\n const routes = useRoutes(projId, participantId);\n\n const sendEQScoresEmailPreviewRoute = useMemo(\n () => routes.SendEQScoresEmailPreview + `#${projId}#${currentReleaseId}`,\n [currentReleaseId, projId, routes.SendEQScoresEmailPreview],\n );\n\n const eqScores = useAppState(state => state.eqScores?.[`${currentReleaseId}`]);\n\n useMount(\n () => {\n setCustomEmailLogo(logo);\n setCustomEmailParticipant(participant?.personName ?? '');\n },\n );\n\n useEffect(\n () => {\n // Set dirty comment state into session storage for iFrame to read out\n setCustomEmailTxt(comment?.replace(/\\n/g, '
    '));\n\n // Return cleanup function to clear out dirty state onUnmount\n return () => setCustomEmailTxt(undefined);\n },\n [setCustomEmailTxt, comment],\n );\n\n useEffect(\n () => {\n if (currentReleaseId < 0) {\n return;\n }\n\n if (!eqScores) {\n return;\n }\n\n setReportScores(eqScores);\n },\n [currentReleaseId, eqScores, setReportScores],\n );\n\n useEffect(\n () => {\n if (!!csContact) {\n setProjectCSContact(csContact);\n }\n },\n [csContact, setProjectCSContact],\n );\n\n const {\n sendEQScoresModalVisible,\n showSendEQScoresModal,\n dismissSendEQScoresModal,\n setEQScoresRecipientEmail,\n setEQScoresRecipientComment,\n } = useMemo(\n () => ({\n sendEQScoresModalVisible: modalVisible,\n showSendEQScoresModal: (report: Report) => {\n dispatch(getProjectCSContactAction(projId));\n dispatch(getEQScoresAction(participantId, report.releaseId));\n setCurrentReport(report);\n toggleModal();\n },\n dismissSendEQScoresModal: toggleModal,\n setEQScoresRecipientEmail: (email: string) => setRecipientEmail(email),\n setEQScoresRecipientComment: (comment: string) => setComment(comment),\n }),\n [dispatch, modalVisible, participantId, projId, toggleModal],\n );\n\n const langId = useAppState(state => state.locale.lang.languageId);\n\n const onConfirmShareEQScores = useCallback(\n () => {\n if (!recipientEmail) {\n return;\n }\n\n dispatch(sendEQScoresAction(\n projId,\n participantId,\n recipientEmail,\n comment ?? '',\n langId,\n currentReport!.releaseId, // We'll never get this far without a report set\n ));\n\n toggleModal();\n },\n [comment, dispatch, langId, participantId, projId, recipientEmail, currentReport, toggleModal],\n );\n\n return {\n sendEQScoresModalVisible,\n sendEQScoresEmailPreviewRoute,\n showSendEQScoresModal,\n dismissSendEQScoresModal,\n setEQScoresRecipientComment,\n setEQScoresRecipientEmail,\n onConfirmShareEQScores,\n };\n};\n","import { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\n\n\nexport const TEXT_AREA_PLACEHOLDER = css`\n ::placeholder {\n opacity: 1;\n color: ${COLORS.FIELD_GREY};\n }\n`;\n\n\nexport const TEXT_AREA_DISABLED = css`\n &:disabled {\n background-color: transparent;\n border-radius: 0;\n resize: none;\n padding: 0;\n pointer-events: none;\n }\n`;\n\n\nexport const TEXT_AREA_DEFAULT = css`\n padding: 10px;\n color: ${COLORS.DARK_GREY};\n box-sizing: border-box;\n resize: vertical;\n border: none;\n border-radius: 8px;\n transition: all .5s ease;\n`;\n\n\nexport const TEXT_AREA = css`\n ${TEXT_AREA_DEFAULT};\n ${TEXT_AREA_PLACEHOLDER};\n ${TEXT_AREA_DISABLED};\n`;\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport Modal from '../../layout/modal/Modal';\nimport { Str } from '../../localization/translationKeys';\nimport LocalTextArea from '../../localization/LocalTextArea';\nimport LocalInput from '../../localization/LocalInput';\nimport ModalHeader from '../../layout/modal/ModalHeader';\nimport LocalDiv from '../../localization/LocalDiv';\nimport LocalBtn from '../../localization/LocalBtn';\nimport Spacer from '../../layout/Spacer';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport { css } from '@emotion/core';\nimport { btnStyle } from '../../forms/styles/button';\nimport { COLORS } from '../../globalStyle/colors';\nimport { useMsgText } from '../../localization/hooks';\nimport { INPUT } from '../../forms/styles/input';\nimport { TEXT_AREA } from '../../forms/styles/textarea';\nimport { BREAKPOINTS_PX, onMobileMedium, HIDE_ON_MOBILE } from '../../globalStyle/mediaQueries';\n\n\nconst styles = {\n root: [\n css`\n @media only screen and (min-width: ${BREAKPOINTS_PX.MOBILE + 1}px) {\n min-width: 780px;\n }\n `,\n ],\n form: [\n FLEX_COLUMN,\n css`\n margin: 16px 60px;\n\n ${onMobileMedium} {\n margin-left: 40px;\n margin-right: 40px;\n }\n `,\n ],\n input: [\n INPUT(COLORS.WHITE),\n ],\n textArea: [\n TEXT_AREA,\n css`\n font-size: 13px;\n `,\n ],\n previewContainer: css`\n margin-top: 30px;\n margin-bottom: 45px;\n\n ${onMobileMedium} {\n margin-top: 15px;\n margin-bottom: 15px;\n }\n `,\n emailPreview: css`\n margin-top: auto;\n background-color: ${COLORS.WHITE};\n border: 0 none;\n min-height: 300px;\n width: 100%;\n\n ${onMobileMedium} {\n min-height: calc(100vh - 270px);\n }\n `,\n btnRow: [\n FLEX_ROW,\n css`\n justify-content: flex-end;\n `,\n ],\n secondaryBtn: [\n btnStyle.secondary(COLORS.BLUE),\n css`\n min-width: 135px;\n `,\n ],\n primaryBtn: [\n btnStyle.primary(COLORS.BLUE),\n css`\n min-width: 135px;\n `,\n ],\n};\n\n\ntype Props = {\n dismissModal: () => void;\n setEQScoresRecipientEmail: (email: string) => void;\n setEQScoresRecipientComment: (comment: string) => void;\n onConfirmShareEQScores: () => void;\n templatePreviewRoute: string;\n className?: string;\n};\n\n/**\n * SendEQScoresModal: a component that\n */\nconst SendEQScoresModal: React.FC = (\n {\n dismissModal,\n setEQScoresRecipientEmail,\n setEQScoresRecipientComment,\n onConfirmShareEQScores,\n templatePreviewRoute,\n className,\n },\n) => {\n const handleChangeRecipientEmail = useCallback(\n event => setEQScoresRecipientEmail(event.target.value),\n [setEQScoresRecipientEmail],\n );\n\n const handleChangeComment = useCallback(\n event => setEQScoresRecipientComment(event.target.value),\n [setEQScoresRecipientComment],\n );\n\n const handleConfirmShareEmailScores = useCallback(\n event => {\n event.preventDefault();\n onConfirmShareEQScores();\n },\n [onConfirmShareEQScores],\n );\n\n const modalCaptionMsg = useMsgText(Str.ShareScores);\n const emailPreviewCaptionMsg = useMsgText(Str.EmailPreview);\n\n return (\n \n \n
    \n \n \n \n \n \n {emailPreviewCaptionMsg}\n \n \n \n \n \n \n \n \n \n \n
    \n );\n};\n\nexport default SendEQScoresModal;\n","import * as React from 'react';\nimport { useMemo, useState, useEffect, useCallback } from 'react';\nimport * as R from 'ramda';\nimport ProjectLayout from '../ProjectLayout';\nimport { useDispatch } from 'react-redux';\nimport { useMount } from '../../core/hooks/useMount';\nimport { openMenuAction } from '../sideMenu/openMenuAction';\nimport { onMobileDevice } from '../../globalStyle/mediaQueries';\nimport { useWindowSize } from '../../core/hooks/useWindowSize';\nimport { css } from '@emotion/core';\nimport { useMsgText } from '../../localization/hooks';\nimport { useAppState } from '../../core/redux/hooks';\nimport { Str } from '../../localization/translationKeys';\nimport SurveyHeader from '../survey/SurveyHeader';\nimport LocalDiv from '../../localization/LocalDiv';\nimport ReportTable from './ReportTable';\nimport { useLoading, useError } from '../../core/api/hooks';\nimport { ActionType } from '../../core/redux/actionType';\nimport { loadReportsAction } from './api/loadReportsAction';\nimport { Report } from './models';\nimport { Loader } from '../../loading/Loader';\nimport { useToggle } from '../../core/hooks/useToggle';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faWrench } from '@fortawesome/free-solid-svg-icons';\nimport { COLORS } from '../../globalStyle/colors';\nimport Spacer from '../../layout/Spacer';\nimport Msg from '../../localization/Msg';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport CompetencyList from './CompetencyList';\nimport { getDevPlanItemsAction } from '../devPlan/api/getDevPlanItemsAction';\nimport { addDevPlanItemAction } from '../devPlan/api/addDevPlanItemAction';\nimport { deleteDevPlanItemAction } from '../devPlan/api/deleteDevPlanItemAction';\nimport { DevPlanItem } from '../devPlan/models';\nimport { SELECT } from '../../forms/styles/select';\nimport { useProjIds } from '../../navigation/hooks';\nimport ToggleSwitch from '../../layout/ToggleSwitch';\nimport { pathCombine } from '../../core/api/module';\nimport { BaseUrl } from '../../core/api/endpoints';\nimport ConfirmationModal from '../../layout/modal/ConfirmationModal';\nimport { isRtl } from '../../localization/module';\nimport { useBrowser } from '../../language/useBrowser';\nimport { eqScoresEmailPreviewAction } from './api/eqScoresEmailPreviewAction';\nimport { useSendEQScoresModalProps } from './hooks';\nimport SendEQScoresModal from './SendEQScoresModal';\nimport { IS_DEV_ENV } from '../../core/windowProps';\n\n\nconst styles = {\n content: css`\n margin-top: 57px;\n\n ${onMobileDevice} {\n margin-top: 20px;\n }\n `,\n header: css`\n ${onMobileDevice} {\n margin-top: 37px;\n }\n `,\n reportContent: css`\n margin-top: 0;\n `,\n iframe: css`\n width: 100%;\n height: calc(100vh - 53px);\n `,\n loader: css`\n width: 150px;\n height: 150px;\n margin: auto;\n `,\n msgRow: css`\n flex-grow: 1;\n align-items: stretch;\n justify-content: flex-end;\n margin: 10px 10px 5px;\n `,\n icon: css`\n color: ${COLORS.DARK_GREY};\n margin-top: 8px;\n `,\n msg: css`\n margin-top: 8px;\n `,\n select: css`\n padding: 9px 15px;\n background-color: ${COLORS.WHITE};\n height: auto;\n `,\n notFoundRow: css`\n margin: 70px 50px;\n `,\n notFound: css`\n font-size: 16px;\n `,\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * FeedbackReport: a component that renders the report of feedback a survey has received\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst FeedbackReport: React.FC = props => {\n const dispatch = useDispatch();\n\n const projIds = useProjIds();\n const participantId = projIds.participantId;\n const projectId = projIds.projId;\n\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || projectId);\n\n useMount(() => { dispatch(getDevPlanItemsAction(devPlanProjectId, participantId)); });\n\n const locale = useAppState(state => state.locale);\n const langId = useMemo(() => locale.lang.languageId, [locale]);\n const rtl = useMemo(() => isRtl(locale.textDirection), [locale]);\n const code = useAppState(state => state.locale.lang.code);\n\n useEffect(\n () => {\n if (!!langId) {\n dispatch(eqScoresEmailPreviewAction(langId));\n }\n },\n [dispatch, langId],\n );\n\n const pageTitle = useMsgText(Str.ViewReport);\n const project = useAppState(state => state.projectSummary);\n const reports = useAppState(state => state.reports);\n const userName = useAppState(state => state.auth.currentUser?.userName);\n const compCats = useAppState(state => state.devResources || []);\n const devItems = useAppState(state => state.devPlan?.items ?? []);\n\n const [loadingReport, toggleLoadingReport] = useToggle();\n const [iFrameFirstLoad, setIframeLoaded] = useToggle();\n\n const [oneReport, setReport] = useState(undefined);\n\n const isLoading = useLoading(ActionType.LoadReportsRequest);\n const error = useError(ActionType.LoadReportsRequest);\n\n const reportsNotQueried = useMemo(() => R.isNil(reports), [reports]);\n const oldCount = useMemo(() => !reports ? 0 : reports.length, [reports]);\n const newCount = useMemo(() => project?.reportCount, [project]);\n\n useMount(() => {\n toggleLoadingReport();\n\n if (reportsNotQueried || (oldCount !== newCount)) {\n dispatch(loadReportsAction(projectId, participantId, userName!));\n }\n });\n\n //region UI switches\n\n const { onIe, onSafari } = useBrowser();\n const { isMobile } = useWindowSize();\n const system = useAppState(state => state.config?.system.toLocaleLowerCase() ?? '');\n const portalIsTSEQ = useMemo(() => system === 'talentsmart', [system]);\n\n // Fall back to download function if no web report and using legacy browser\n const enableReportDownload = useCallback((report: Report) => \n (onIe || (onSafari && isMobile)) && !report.webReport, [onIe, onSafari, isMobile],\n );\n\n // Determines whether to show the share button on individual report rows in the table\n const isMEReport = useCallback((report: Report) => report.surveyId === 1, []);\n const hasMEReport = useMemo(() => !!reports?.find(r => isMEReport(r)), [isMEReport, reports]);\n\n // Determines whether to show the share button column in the table\n // Currently this is a TSEQ-only feature and is only applicable to ME reports\n const enableSharingScores = useMemo(() => hasMEReport && portalIsTSEQ, [hasMEReport, portalIsTSEQ]);\n\n const hasOneReport = useMemo(() => reports?.length === 1, [reports]);\n\n const autoLoadReport = useMemo(\n () => {\n if (!hasOneReport) {\n return false;\n }\n\n const report = R.path([0], reports)!;\n\n if (enableReportDownload(report)) {\n return false;\n }\n\n return !enableSharingScores;\n },\n [enableReportDownload, enableSharingScores, hasOneReport, reports],\n );\n\n useEffect(\n () => {\n if (autoLoadReport) {\n setReport(reports![0]);\n }\n },\n [setReport, reports, onIe, onSafari, autoLoadReport],\n );\n\n // endregion UI switches\n\n const [idToDelete, setIdToDelete] = useState(0);\n const competenciesText = useMsgText(Str.ChooseCompetencies);\n\n const showCompetencies = oneReport\n && oneReport.webReport\n && project?.developmentPlanAddCompetenciesFromWebReport\n && project?.developmentPlanStep;\n\n const [showList, toggleList] = useToggle();\n\n const [showDeleteConfirmation, toggleShowDeleteConfirmation] = useToggle(false);\n\n const { addItem, deleteItem } = useMemo(\n () => ({\n addItem: (competencyId: number) => dispatch(\n addDevPlanItemAction(participantId, devPlanProjectId, competencyId, undefined),\n ),\n deleteItem: (competencyId: number) => {\n const devPlanItem = R.find(item => item.devItemCompetencyId === competencyId, devItems);\n const devItemId = devPlanItem?.devItemId ?? 0;\n\n if (devPlanItem?.hasContent && competencyId > 0) {\n setIdToDelete(competencyId);\n toggleShowDeleteConfirmation();\n } else {\n dispatch(deleteDevPlanItemAction(participantId, devPlanProjectId, devItemId));\n }\n },\n }),\n [dispatch, participantId, devPlanProjectId, devItems, toggleShowDeleteConfirmation],\n );\n\n const checkMenu = () => {\n // Close the side menu when showing a web report to maximize space\n if (oneReport && oneReport.webReport) {\n window.setTimeout(() => dispatch(openMenuAction(false)), 200);\n }\n\n return oneReport && oneReport.webReport;\n };\n\n const fileURL = useMemo(\n () => {\n const baseUrl = pathCombine(BaseUrl, '/report/reportFile');\n\n return oneReport?.fileExists ? baseUrl + '/' + encodeURIComponent(oneReport!.reportFile) : undefined;\n },\n [oneReport],\n );\n\n const competencyName = useMemo(\n () => {\n const competencyId = idToDelete;\n const devPlanItem = R.find(item => item.devItemCompetencyId === competencyId, devItems);\n\n return devPlanItem?.title ?? '';\n },\n [idToDelete, devItems],\n );\n const deleteConfirmationMsg = useMsgText(Str.DevPlanContentExists, '', { 'name': competencyName });\n\n const onConfirmDelete = useCallback(\n () => {\n const competencyId = idToDelete;\n const devPlanItem = R.find(item => item.devItemCompetencyId === competencyId, devItems);\n const devItemId = devPlanItem?.devItemId ?? 0;\n\n dispatch(deleteDevPlanItemAction(participantId, devPlanProjectId, devItemId));\n toggleShowDeleteConfirmation();\n },\n [idToDelete, devItems, devPlanProjectId, participantId, toggleShowDeleteConfirmation, dispatch],\n );\n\n const showHeader = useMemo(\n () => (!oneReport || (!oneReport.webReport && !oneReport.fileExists)),\n [oneReport],\n );\n\n const reportWebUrl = useCallback(\n (report: Report) => IS_DEV_ENV\n ? report.reportUrl.replace(\n 'http://localhost:81/logi',\n 'https://report.truscore.com/LogiTSEQstage',\n )\n : report.reportUrl,\n [],\n );\n\n const {\n sendEQScoresModalVisible,\n sendEQScoresEmailPreviewRoute,\n showSendEQScoresModal,\n dismissSendEQScoresModal,\n setEQScoresRecipientComment,\n setEQScoresRecipientEmail,\n onConfirmShareEQScores,\n } = useSendEQScoresModalProps(projectId, participantId, dispatch);\n\n return (\n \n {\n showHeader && \n }\n \n {\n oneReport\n ? (\n <>\n {\n loadingReport && \n }\n {\n showCompetencies && !loadingReport && (\n \n \n \n \n \n \n {competenciesText}\n \n {\n showList && (\n \n )\n }\n \n )\n }\n\n {\n oneReport.webReport || oneReport.fileExists\n ? {\n if (!iFrameFirstLoad) {\n setIframeLoaded();\n toggleLoadingReport();\n }\n }\n }\n />\n : \n \n \n \n }\n\n { // Delete Confirmation Modal\n showDeleteConfirmation && (\n \n )\n }\n \n )\n : (\n \n )\n }\n \n {\n sendEQScoresModalVisible && (\n \n )\n }\n \n );\n};\n\nexport default FeedbackReport;\n","import * as React from 'react';\nimport ProjectLayout from '../ProjectLayout';\nimport { useMsgText } from '../../localization/hooks';\nimport { Str } from '../../localization/translationKeys';\nimport SurveyHeader from '../survey/SurveyHeader';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\nimport { onMobileDevice } from '../../globalStyle/mediaQueries';\n\n\nconst styles = {\n content: css`\n margin-top: 62px;\n background-color: ${COLORS.WHITE};\n width: 100%;\n\n ${onMobileDevice} {\n margin-top: 20px;\n }\n `,\n header: css`\n ${onMobileDevice} {\n margin-top: 37px;\n } \n `,\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * ReportTutorial: a component that displays a report tutorial video\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ReportTutorial: React.FC = props => {\n const pageTitle = useMsgText(Str.ReportTutorial);\n\n //TODO - video won't play. Could play local with Windows Media Player but not Movies & TV or Photos\n\n return (\n \n \n \n \n )\n\n};\n\nexport default ReportTutorial;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport Modal from '../layout/modal/Modal';\nimport ModalHeader from '../layout/modal/ModalHeader';\nimport { useHistory } from 'react-router-dom';\nimport { useMsgText } from './hooks';\nimport { Str } from './translationKeys';\nimport LocalDiv from './LocalDiv';\nimport { FLEX_COLUMN, FLEX_ROW } from '../layout/flexBox';\nimport { useDispatch } from 'react-redux';\nimport { Language } from './models';\nimport { useAppState } from '../core/redux/hooks';\nimport { SELECT } from '../forms/styles/select';\nimport { setLocaleAction } from './setLocaleAction';\nimport { TextDirection } from './textDirection';\nimport { COLORS } from '../globalStyle/colors';\nimport { btnStyle } from '../forms/styles/button';\nimport Msg from './Msg';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\nimport Spacer from '../layout/Spacer';\n\n\nconst BTN_STYLE = css`\n width: 145px;\n`;\n\nconst styles = {\n modal: [\n FLEX_COLUMN,\n css`\n min-height: 0;\n height: 312px;\n \n ${onMobileDevice} {\n height: 100vh;\n }\n `,\n ],\n root: [\n FLEX_COLUMN,\n css`\n /* IE apparently needs this */\n height: 238px;\n flex-basis: 238px;\n align-items: stretch;\n `,\n ],\n select: [\n SELECT,\n css`\n margin: auto;\n width: 320px;\n color: ${COLORS.DARK_GREY};\n `,\n ],\n buttonRow: [\n FLEX_ROW,\n css`\n margin: 20px 16px;\n justify-content: flex-end;\n `,\n ],\n submitButton: [\n btnStyle.primary(COLORS.BLUE),\n BTN_STYLE,\n ],\n cancelButton: [\n btnStyle.secondary(COLORS.BLUE),\n BTN_STYLE,\n css`\n background-color: transparent;\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * ChangeLanguageModal: a component that reads the list of supported languages off the current portal project and allows\n * the user to set their locale from that list of languages.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ChangeLanguageModal: React.FC = props => {\n const title = useMsgText(Str.ChooseLanguage);\n\n const history = useHistory();\n const dispatch = useDispatch();\n\n const dir = useAppState(state => state.locale.textDirection);\n const currentLang = useAppState(state => state.locale.lang);\n const allLangs = useAppState(state => state.projectLanguages?.[`${state.projectSummary?.projectId}`] ?? []);\n\n const [language, setLanguage] = React.useState(currentLang);\n\n const dismiss = React.useCallback(() => history.goBack(), [history]);\n\n const onChange = React.useCallback(\n event => setLanguage(allLangs.find(lang => `${lang.languageId}` === `${event.target.value}`)!),\n [allLangs, setLanguage],\n );\n\n const onSubmit = React.useCallback(\n () => {\n if (!language) {\n dismiss();\n return;\n }\n\n dispatch(setLocaleAction(language, language.rtl ? TextDirection.RTL : TextDirection.LTR));\n dismiss();\n },\n [dispatch, dismiss, language],\n );\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default ChangeLanguageModal;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport Modal from '../layout/modal/Modal';\nimport ModalHeader from '../layout/modal/ModalHeader';\nimport LocalDiv from '../localization/LocalDiv';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport Spacer from '../layout/Spacer';\nimport { useHistory } from 'react-router-dom';\nimport { useDispatch } from 'react-redux';\nimport { useAppState } from '../core/redux/hooks';\nimport { FLEX_COLUMN, FLEX_ROW } from '../layout/flexBox';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\nimport { COLORS } from '../globalStyle/colors';\nimport { btnStyle } from '../forms/styles/button';\nimport { useProjMsgText } from '../project/messages/hooks';\nimport { ProjStr } from '../project/messages/ProjStr';\nimport { useToggle } from '../core/hooks/useToggle';\nimport ProjMsg from '../project/messages/ProjMsg';\nimport { updateConfidentialityAction } from './updateConfidentialityAction';\nimport { useLoading, useError } from '../core/api/hooks';\nimport { ActionType } from '../core/redux/actionType';\nimport { Loader } from '../loading/Loader';\nimport ErrorMsg from '../error/ErrorMsg';\nimport { useRoutes } from '../navigation/routes';\n\n\nconst BTN_STYLE = css`width: 145px;`;\n\nconst styles = {\n modal: [\n FLEX_COLUMN,\n css`\n min-height: 0;\n max-width: 700px;\n \n ${onMobileDevice} {\n height: 100vh;\n }\n `,\n ],\n root: [\n FLEX_COLUMN,\n css`\n flex-grow: 1;\n align-items: stretch;\n padding-left: 24px;\n padding-right: 24px;\n padding-bottom: 24px;\n color: ${COLORS.DARK_GREY};\n `,\n ],\n loader: css`\n width: 100px; \n height: 100px;\n margin: auto;\n `,\n agreementText: css`\n max-height: 320px;\n line-height: 14px;\n overflow: auto;\n margin-bottom: 25px;\n `,\n acceptRow: [\n FLEX_ROW,\n css`\n align-items: center;\n font-size: 13px;\n `,\n ],\n checkbox: css`\n width: 22px;\n height: 22px;\n `,\n checkboxDiv: css`\n flex-direction: column;\n justify-content: center;\n align-items: center;\n `,\n error: css`\n margin-top: 20px;\n `,\n buttonRow: [\n FLEX_ROW,\n css`\n justify-content: flex-end;\n margin-top: 40px;\n `,\n ],\n submitButton: [\n btnStyle.primary(COLORS.BLUE),\n BTN_STYLE,\n ],\n cancelButton: [\n btnStyle.secondary(COLORS.BLUE),\n BTN_STYLE,\n css`\n background-color: transparent;\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * ConfidentialityAgreementModal: a component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ConfidentialityAgreementModal: React.FC = props => {\n const title = useProjMsgText(ProjStr.ConfidentialityMessageTitle);\n\n const history = useHistory();\n const dispatch = useDispatch();\n\n const participantId = useAppState(state => state.auth.currentUser?.personId ?? -1);\n const projectId = useAppState(state => state.projectSummary?.projectId ?? -1);\n const routes = useRoutes();\n\n const loading = useLoading(ActionType.UpdateConfidentialityRequest);\n const error = !!useError(ActionType.UpdateConfidentialityRequest);\n\n const [isAccepted, toggleAccepted] = useToggle(false);\n\n const dismiss = React.useCallback(() => history.replace(routes.Login), [routes, history]);\n\n const onSubmit = React.useCallback(\n () => { dispatch(updateConfidentialityAction(participantId, projectId)); },\n [participantId, projectId, dispatch],\n );\n\n return (\n \n \n \n {\n loading\n ? \n : (\n <>\n {/* Agreement Text */}\n \n\n {/* Accept Checkbox */}\n \n
    \n \n
    \n \n \n
    \n\n \n\n {/* Cancel/Submit buttons */}\n \n \n \n \n \n \n \n \n )\n }\n
    \n
    \n );\n};\n\nexport default ConfidentialityAgreementModal;\n","import * as React from 'react';\nimport { useCallback, useState, useMemo } from 'react';\nimport { css } from '@emotion/core';\nimport { Str } from '../../localization/translationKeys';\nimport { useMsgText } from '../../localization/hooks';\nimport ModalHeader from '../../layout/modal/ModalHeader';\nimport LocalDiv from '../../localization/LocalDiv';\nimport Modal from '../../layout/modal/Modal';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { useHistory } from 'react-router-dom';\nimport LocalBtn from '../../localization/LocalBtn';\nimport Spacer from '../../layout/Spacer';\nimport { useRoutes } from '../../navigation/routes';\nimport { useAppState } from '../../core/redux/hooks';\nimport { useDispatch } from 'react-redux';\nimport { COLORS } from '../../globalStyle/colors';\nimport { btnStyle } from '../../forms/styles/button';\nimport { SELECT } from '../../forms/styles/select';\nimport { INPUT } from '../../forms/styles/input';\nimport { addDevPlanItemAction } from './api/addDevPlanItemAction';\nimport Msg from '../../localization/Msg';\n\n\nconst styles = {\n modal: [\n FLEX_COLUMN,\n css`\n min-height: 0;\n `,\n ],\n root: [\n FLEX_COLUMN,\n css`\n transition: opacity .5s ease;\n justify-content: space-between;\n `,\n ],\n formInputs: [\n FLEX_COLUMN,\n css`\n align-items: stretch;\n margin: 0 40px;\n `,\n ],\n loadingForm: css`\n opacity: .4;\n `,\n radioBtn: css`\n width: 18px;\n height: 18px;\n flex-basis: 18px;\n flex-shrink: 0;\n flex-grow: 0;\n `,\n inputGroup: [\n FLEX_COLUMN,\n css`\n align-items: stretch;\n margin-bottom: 35px;\n `,\n ],\n label: [\n FLEX_ROW,\n css`\n transition: opacity .5s ease;\n align-items: center;\n color: ${COLORS.DARK_GREY};\n font-size: 12px;\n `,\n ],\n select: [\n SELECT,\n css`\n flex-grow: 1;\n flex-shrink: 1;\n flex-basis: 320px;\n min-width: 0;\n max-width: 320px;\n `,\n ],\n orMsg: css`\n margin: 0 50px; /* weird margin is to align this text with the text boxes... */\n `,\n txtBox: [\n INPUT(),\n css`\n flex-grow: 1;\n flex-shrink: 1;\n flex-basis: 320px;\n min-width: 0;\n max-width: 320px;\n `,\n ],\n disabled: css`\n opacity: .4;\n `,\n btnRow: [\n FLEX_ROW,\n css`\n justify-content: flex-end;\n margin: 50px 20px 20px;\n `,\n ],\n saveBtn: [\n btnStyle.primary(COLORS.BLUE),\n css`\n min-width: 145px;\n `,\n ],\n cancelBtn: [\n btnStyle.secondary(COLORS.BLUE),\n css`\n min-width: 145px;\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * AddDevPlanItemModal: a modal component that renders a form for adding a new development plan item.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst AddDevPlanItemModal: React.FC = props => {\n const history = useHistory();\n const dispatch = useDispatch();\n\n const title = useMsgText(Str.WhatToDevelop);\n const txtPlaceholder = useMsgText(Str.EnterDevItem);\n const selPlaceholder = useMsgText(Str.ChooseCompetency);\n\n const dir = useAppState(state => state.locale.textDirection);\n const competencies = useAppState(state => state.devResources || []);\n\n const participantId = useAppState(state => state.auth.currentUser?.personId ?? -1);\n const displayId = useAppState(state => state.projectSummary?.displayProjectId || '');\n const projectId = useAppState(state => state.projectSummary?.projectId ?? -1);\n const routes = useRoutes(participantId, displayId);\n\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || projectId);\n\n const allowAddByCompetency = useAppState(state => !!state.projectSummary?.developmentPlanAddCompetenciesFromDevPlan);\n const allowAddManual = useAppState(state => !!state.projectSummary?.developmentPlanAddManual);\n\n const [txt, setTxt] = useState(undefined);\n const [competency, setCompetency] = useState(undefined);\n const [addByCompetency, setAddByCompetency] = useState(allowAddByCompetency && !!competencies.length);\n\n const allowSubmit = useMemo(\n () => addByCompetency ? !!competencies.length && competency !== undefined && competency >= 0 : !!txt?.trim().length,\n [competency, txt, addByCompetency, competencies],\n );\n\n const dismiss = React.useCallback(() => history.push(routes.DevPlan), [routes, history]);\n\n const onChangeTxt = React.useCallback(event => setTxt(event.target.value), [setTxt]);\n const onChangeSelect = React.useCallback(event => setCompetency(+event.target.value), [setCompetency]);\n\n const onCancel = useCallback(\n event => {\n event.preventDefault();\n dismiss();\n },\n [dismiss],\n );\n\n const onSubmit = useCallback(\n event => {\n event.preventDefault();\n\n dispatch(addDevPlanItemAction(participantId, devPlanProjectId, competency ?? -1, txt));\n\n dismiss();\n },\n [txt, competency, participantId, devPlanProjectId, dismiss, dispatch],\n );\n\n return (\n \n \n \n \n {\n allowAddByCompetency && (\n <>\n setAddByCompetency(true)}\n >\n {\n allowAddManual && (\n <>\n \n \n \n )\n }\n \n \n \n )\n }\n {\n allowAddByCompetency && allowAddManual && (\n <>\n \n \n \n \n )\n }\n {\n allowAddManual && (\n setAddByCompetency(false)}\n >\n {\n allowAddByCompetency && (\n <>\n \n \n \n )\n }\n \n \n )\n }\n \n\n {/* Submit/Cancel */}\n \n \n \n \n \n \n \n );\n};\n\nexport default AddDevPlanItemModal;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { Str } from '../../localization/translationKeys';\nimport { useMsgText } from '../../localization/hooks';\nimport ModalHeader from '../../layout/modal/ModalHeader';\nimport LocalDiv from '../../localization/LocalDiv';\nimport Modal from '../../layout/modal/Modal';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { useHistory } from 'react-router-dom';\nimport { useDispatch } from 'react-redux';\nimport { useAppState } from '../../core/redux/hooks';\nimport { useRoutes } from '../../navigation/routes';\nimport { useState, useMemo, useCallback } from 'react';\nimport { updateDevPlanItemTitleAction } from './api/updateDevPlanItemTitleAction';\nimport Spacer from '../../layout/Spacer';\nimport Msg from '../../localization/Msg';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { COLORS } from '../../globalStyle/colors';\nimport { SELECT } from '../../forms/styles/select';\nimport { INPUT } from '../../forms/styles/input';\nimport { btnStyle } from '../../forms/styles/button';\nimport { useMount } from '../../core/hooks/useMount';\n\n\nconst styles = {\n modal: [\n FLEX_COLUMN,\n css`\n min-height: 0;\n `,\n ],\n root: [\n FLEX_COLUMN,\n css`\n transition: opacity .5s ease;\n justify-content: space-between;\n `,\n ],\n formInputs: [\n FLEX_COLUMN,\n css`\n align-items: stretch;\n margin: 0 40px;\n `,\n ],\n loadingForm: css`\n opacity: .4;\n `,\n radioBtn: css`\n width: 18px;\n height: 18px;\n flex-basis: 18px;\n flex-shrink: 0;\n flex-grow: 0;\n `,\n inputGroup: [\n FLEX_COLUMN,\n css`\n align-items: stretch;\n margin-bottom: 35px;\n `,\n ],\n label: [\n FLEX_ROW,\n css`\n transition: opacity .5s ease;\n align-items: center;\n color: ${COLORS.DARK_GREY};\n font-size: 12px;\n `,\n ],\n select: [\n SELECT,\n css`\n flex-grow: 1;\n flex-shrink: 1;\n flex-basis: 320px;\n min-width: 0;\n max-width: 320px;\n `,\n ],\n orMsg: css`\n margin: 0 50px; /* weird margin is to align this text with the text boxes... */\n `,\n txtBox: [\n INPUT(),\n css`\n flex-grow: 1;\n flex-shrink: 1;\n flex-basis: 320px;\n min-width: 0;\n max-width: 320px;\n `,\n ],\n disabled: css`\n opacity: .4;\n `,\n btnRow: [\n FLEX_ROW,\n css`\n justify-content: flex-end;\n margin: 50px 20px 20px;\n `,\n ],\n saveBtn: [\n btnStyle.primary(COLORS.BLUE),\n css`\n min-width: 145px;\n `,\n ],\n cancelBtn: [\n btnStyle.secondary(COLORS.BLUE),\n css`\n min-width: 145px;\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * EditDevPlanItemModal: a modal component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst EditDevPlanItemModal: React.FC = props => {\n const itemId = window.location.href.substring(window.location.href.lastIndexOf('/') + 1);\n const items = useAppState(state => state.devPlan?.items);\n const item = items?.find(i => `${i.devItemId}` === itemId);\n\n const history = useHistory();\n const dispatch = useDispatch();\n\n const title = useMsgText(Str.WhatToDevelop);\n const txtPlaceholder = useMsgText(Str.EnterDevItem);\n const selPlaceholder = useMsgText(Str.ChooseCompetency);\n\n const dir = useAppState(state => state.locale.textDirection);\n const competencies = useAppState(state => state.devResources || []);\n\n const participantId = useAppState(state => state.auth.currentUser?.personId ?? -1);\n const displayId = useAppState(state => state.projectSummary?.displayProjectId || '');\n const projectId = useAppState(state => state.projectSummary?.projectId ?? -1);\n const routes = useRoutes(participantId, displayId);\n\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || projectId);\n\n const allowAddByCompetency = useAppState(state => !!state.projectSummary?.developmentPlanAddCompetenciesFromDevPlan);\n const allowAddManual = useAppState(state => !!state.projectSummary?.developmentPlanAddManual);\n\n const [txt, setTxt] = useState(undefined);\n const [competency, setCompetency] = useState(undefined);\n const [addByCompetency, setAddByCompetency] = useState(allowAddByCompetency && !!competencies.length);\n\n const allowSubmit = useMemo(\n () => addByCompetency ? !!competencies.length && competency !== undefined && competency >= 0 : !!txt?.trim().length,\n [competency, txt, addByCompetency, competencies],\n );\n\n const dismiss = React.useCallback(() => {\n history.push(routes.ViewPlanItem.replace(':itemId', itemId));\n }, [routes, history, itemId]);\n\n const onChangeTxt = React.useCallback(event => setTxt(event.target.value), [setTxt]);\n const onChangeSelect = React.useCallback(event => setCompetency(+event.target.value), [setCompetency]);\n\n const onCancel = useCallback(\n event => {\n event.preventDefault();\n dismiss();\n },\n [dismiss],\n );\n\n const isCompetency = item?.devItemCompetencyId! > 0;\n useMount(() => {\n !isCompetency && setTxt(item?.title);\n isCompetency && setCompetency(item?.devItemCompetencyId);\n setAddByCompetency(isCompetency);\n });\n\n const onSubmit = useCallback(\n event => {\n event.preventDefault();\n\n const devItemId = Number(itemId);\n const title = !addByCompetency ? txt ?? '' : '';\n const competencyId = addByCompetency ? competency ?? 0 : 0;\n const competencyName = competencyId > 0\n ? competencies.find(c => c.competencyId === competencyId)?.name ?? ''\n : '';\n\n dispatch(\n updateDevPlanItemTitleAction(participantId, devPlanProjectId, devItemId, title, competencyId, competencyName),\n );\n\n dismiss();\n },\n [txt, competency, competencies, itemId, participantId, devPlanProjectId, addByCompetency, dismiss, dispatch],\n );\n\n return (\n \n \n \n \n {\n allowAddByCompetency && (\n <>\n setAddByCompetency(true)}\n >\n {\n allowAddManual && (\n <>\n \n \n \n )\n }\n \n \n \n )\n }\n {\n allowAddByCompetency && allowAddManual && (\n <>\n \n \n \n \n )\n }\n {\n allowAddManual && (\n setAddByCompetency(false)}\n >\n {\n allowAddByCompetency && (\n <>\n \n \n \n )\n }\n \n \n )\n }\n \n\n {/* Submit/Cancel */}\n \n \n \n \n \n \n \n );\n\n};\n\nexport default EditDevPlanItemModal;\n","import { useToggle } from '../../../core/hooks/useToggle';\nimport { useArray } from '../../../core/hooks/useArray';\nimport { useCallback } from 'react';\nimport { DevPlanFieldListItem, UpdateFieldAnswerListModalProps } from './models';\nimport { useDispatch } from 'react-redux';\nimport { updateFieldAnswerListAction } from './api/updateFieldAnswerListAction';\nimport { saveFieldAnswerListAction } from './saveFieldAnswerListAction';\n\n\nexport const useUpdateFieldAnswerListModalProps = (\n projectId: number,\n participantId: number,\n languageId: number,\n devItemId: number,\n devActionId: number,\n devFieldId: number,\n devFieldAnswerId: number,\n disableModal: boolean,\n): UpdateFieldAnswerListModalProps => {\n const dispatch = useDispatch();\n\n const [modalVisible, toggleModal] = useToggle();\n\n const [selectedItemIds, addItemId, removeItemId] = useArray();\n\n const isSelected = useCallback(\n (item: DevPlanFieldListItem) => selectedItemIds.indexOf(item.compilationCategoryListItemId) >= 0,\n [selectedItemIds],\n );\n\n const onClickListItemCheckbox = useCallback(\n (item: DevPlanFieldListItem) => {\n selectedItemIds.indexOf(item.compilationCategoryListItemId) >= 0\n ? removeItemId(item.compilationCategoryListItemId)\n : addItemId(item.compilationCategoryListItemId);\n },\n [addItemId, removeItemId, selectedItemIds],\n );\n\n const onClickConfirmAdd = useCallback(\n () => {\n dispatch(saveFieldAnswerListAction(\n languageId,\n devItemId,\n devActionId,\n selectedItemIds,\n ));\n\n dispatch(updateFieldAnswerListAction(\n projectId,\n participantId,\n languageId,\n devItemId,\n devActionId,\n devFieldId,\n devFieldAnswerId,\n selectedItemIds,\n ));\n\n !disableModal && toggleModal();\n },\n [\n devActionId,\n devFieldAnswerId,\n disableModal,\n devFieldId,\n devItemId,\n dispatch,\n languageId,\n participantId,\n projectId,\n selectedItemIds,\n toggleModal,\n ],\n );\n\n return {\n modalVisible,\n toggleModal,\n isSelected,\n onClickListItemCheckbox,\n onClickConfirmAdd,\n };\n};\n","import { useState, useCallback } from 'react';\nimport * as R from 'ramda';\n\n\n/**\n * Use this to store a collection of unique local data values as an array.\n *\n * This hook is restricted to handling text data types for performance. For more complex types, use hash maps.\n *\n * @param initialData - the initial data to populate the map\n * @returns a getter for the map, a function to add an element to the map, and a function to remove an element from the\n * map\n */\nexport const useArray = (\n initialData: T[] = [],\n): [T[], (value: T) => void, (value: T) => void] => {\n const [arr, setArr] = useState(initialData);\n\n const addElement = useCallback(\n (value: T) => setArr(arr.concat(value)),\n [arr],\n );\n\n const removeElement = useCallback(\n (value: T) => {\n const valueIndex = arr.indexOf(value);\n\n if (valueIndex > -1) {\n setArr(R.remove(valueIndex, 1, arr));\n }\n },\n [arr],\n );\n\n return [arr, addElement, removeElement];\n};\n","import * as React from 'react';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { DevPlanFieldListItem } from './models';\nimport { css } from '@emotion/core';\nimport { FLEX_ROW } from '../../../layout/flexBox';\nimport LocalHTMLContainer from '../../../localization/LocalHTMLContainer';\n\n\nconst styles = {\n root: [\n FLEX_ROW,\n css`\n align-items: center;\n font-size: 13px;\n `,\n ],\n itemTxt: css`\n flex-basis: 85%;\n `,\n checkbox: css`\n width: 22px;\n height: 22px;\n `,\n};\n\n\ntype Props = {\n listItem: DevPlanFieldListItem;\n isSelected: boolean;\n toggleSelected: () => void;\n className?: string;\n}\n\n/**\n * DevActionListItem: a component that renders one of the choices used to answer dev action list items in the current\n * project\n */\nconst DevActionListItem: React.FC = ({ listItem, isSelected, toggleSelected, className }) => (\n \n \n \n \n);\n\nexport default DevActionListItem;\n","import * as React from 'react';\nimport { useCallback, useMemo } from 'react';\nimport Modal from '../../../layout/modal/Modal';\nimport { DevPlanFieldListItem } from './models';\nimport ModalHeader from '../../../layout/modal/ModalHeader';\nimport DevActionListItem from './DevActionListItem';\nimport { useAppState } from '../../../core/redux/hooks';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport Spacer from '../../../layout/Spacer';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../../layout/flexBox';\nimport { css } from '@emotion/core';\nimport { btnStyle } from '../../../forms/styles/button';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { Str } from '../../../localization/translationKeys';\n\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n ],\n content: [\n FLEX_COLUMN,\n css`\n justify-content: space-between;\n flex-grow: 1;\n flex-basis: 100%;\n margin: 30px;\n `,\n ],\n listItems: [\n FLEX_COLUMN,\n ],\n listItem: [\n FLEX_ROW,\n css`\n justify-content: space-between;\n padding: 8px;\n border: 1px solid ${COLORS.WHITE};\n `,\n ],\n spacer: [\n FLEX_COLUMN,\n css`\n flex-grow: 0;\n flex-shrink: 0;\n flex-basis: 100%;\n `,\n ],\n btnRow: [\n FLEX_ROW,\n css`\n justify-content: flex-end;\n `,\n ],\n secondaryBtn: [\n btnStyle.secondary(COLORS.BLUE),\n css`\n min-width: 135px;\n `,\n ],\n primaryBtn: [\n btnStyle.primary(COLORS.BLUE),\n css`\n min-width: 135px;\n `,\n ],\n};\n\n\ntype Props = {\n devItemCompetencyId?: number;\n dismiss: () => void;\n isSelected: (item: DevPlanFieldListItem) => boolean;\n onClickListItemCheckbox: (item: DevPlanFieldListItem) => void;\n onClickConfirmAdd: () => void;\n className?: string;\n}\n\n\nconst renderItems = (\n listItems: DevPlanFieldListItem[],\n isSelected: (item: DevPlanFieldListItem) => boolean,\n toggleSelected: (item: DevPlanFieldListItem) => void,\n) => listItems.map(\n item => (\n toggleSelected(item)}\n css={styles.listItem}\n />\n ),\n);\n\n\n/**\n * DevActionListModal: a component that\n */\nconst DevActionListModal: React.FC = (\n {\n devItemCompetencyId,\n dismiss,\n isSelected,\n onClickListItemCheckbox,\n onClickConfirmAdd,\n className,\n },\n) => {\n const langId = useAppState(state => state.locale.lang.languageId);\n const listItems = useAppState(state => state.devPlan?.listItems?.[`${langId}`] ?? {});\n\n // Show only those list items that apply to this dev item's competency.\n const filteredListItems = useMemo(\n () => Object.values(listItems).filter(li => li.compilationCategoryId === devItemCompetencyId),\n [devItemCompetencyId, listItems],\n );\n\n const handleClickConfirmAdd = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n onClickConfirmAdd();\n },\n [onClickConfirmAdd],\n );\n\n return (\n \n \n \n \n {renderItems(filteredListItems, isSelected, onClickListItemCheckbox)}\n \n \n \n \n \n \n \n \n );\n};\n\nexport default DevActionListModal;\n","import * as React from 'react';\nimport { DevPlanFieldAndAnswer } from '../models';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { isNilOrEmpty } from '../../../language/module';\nimport { useProjIds } from '../../../navigation/hooks';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { useUpdateFieldAnswerListModalProps } from './hooks';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../../globalStyle/colors';\nimport DevActionListModal from './DevActionListModal';\nimport LocalHTMLContainer from '../../../localization/LocalHTMLContainer';\n\n\nconst styles = {\n label: css`\n color: ${COLORS.DARK_GREY};\n font-size: 12px;\n line-height: 15px;\n font-weight: bold;\n `,\n placeholder: [\n css`\n font-size: 13px;\n font-style: italic;\n color: ${COLORS.FIELD_GREY};\n `,\n ],\n};\n\ntype Props = {\n field: DevPlanFieldAndAnswer;\n devItemCompetencyId?: number;\n disableModal: boolean;\n placeholder: string;\n className?: string;\n}\n\n/**\n * DevPlanListField: a component that renders the user's answer(s) to the provided dev action list field\n *\n * * Note that this component is not used for fields that take an open-ended answer - only list fields. See\n * `DevActionField` for handling open-ended answer fields.\n */\nconst DevActionListField: React.FC = ({ field, devItemCompetencyId, disableModal, placeholder, className }) => {\n const { projId, participantId } = useProjIds();\n\n const langId = useAppState(state => state.locale.lang.languageId);\n\n const { devItemId, devActionId, devPlanFieldId, devPlanFieldAnswerId } = field;\n\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || projId);\n\n const {\n modalVisible, toggleModal, isSelected, onClickListItemCheckbox, onClickConfirmAdd,\n } = useUpdateFieldAnswerListModalProps(\n devPlanProjectId,\n participantId,\n langId,\n devItemId,\n devActionId,\n devPlanFieldId,\n devPlanFieldAnswerId,\n disableModal,\n );\n\n return (\n \n {field.question}\n \n {\n isNilOrEmpty(field.answers)\n ? {placeholder}\n : field.answers.map(answer => )\n }\n {\n modalVisible && (\n \n )\n }\n \n \n );\n};\n\nexport default DevActionListField;\n","import * as React from 'react';\nimport { css, SerializedStyles } from '@emotion/core';\nimport { DevPlanFieldAndAnswer } from './models';\nimport { COLORS } from '../../globalStyle/colors';\n\n\ntype ConditionalStyle = false | SerializedStyles;\n\n\nconst styles = {\n label: css`\n color: ${COLORS.DARK_GREY};\n font-size: 12px;\n line-height: 15px;\n font-weight: bold;\n `,\n};\n\n\ntype Props = {\n item: DevPlanFieldAndAnswer;\n placeholder?: string;\n rows?: number;\n value: string;\n onClick?: () => void;\n onChangeAnswer?: (event: React.ChangeEvent) => void;\n disableTextArea?: boolean;\n textAreaStyle?: ConditionalStyle | (ConditionalStyle)[];\n className?: string;\n}\n\n\n/**\n * DevActionField: a component that renders a text-area where users can enter an answer for the provided development\n * action field\n *\n * Note that this component is not used for list fields - only fields that take an open-ended answer. See\n * `DevActionListField` for handling list fields.\n */\nconst DevActionField: React.FC = (\n {\n item,\n placeholder,\n rows,\n value,\n onClick,\n onChangeAnswer,\n disableTextArea,\n textAreaStyle,\n className,\n },\n) => (\n \n {item.question}\n \n \n);\n\nexport default DevActionField;\n","import * as React from 'react';\nimport { useState, useCallback, useMemo } from 'react';\nimport * as R from 'ramda';\nimport { css } from '@emotion/core';\nimport { Str } from '../../../localization/translationKeys';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../../layout/flexBox';\nimport { useMsgText } from '../../../localization/hooks';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { Map } from '../../../language/models';\nimport { DevPlanFieldAndAnswer } from '../models';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport { btnStyle } from '../../../forms/styles/button';\nimport Spacer from '../../../layout/Spacer';\nimport { useDispatch } from 'react-redux';\nimport { calcUpdateFieldAnswerApiState, dispatchFieldAnswerUpdates } from './module';\nimport { useAppState } from '../../../core/redux/hooks';\nimport DevActionListField from '../listItems/DevActionListField';\nimport DevActionField from '../DevActionField';\nimport { TEXT_AREA } from '../../../forms/styles/textarea';\n\n\nconst styles = {\n root: css`\n transition: opacity .5s ease;\n `,\n loadingForm: css`\n opacity: .4;\n `,\n clickable: css`\n cursor: pointer;\n `,\n inputGroup: [\n FLEX_COLUMN,\n css`\n align-items: stretch;\n margin-bottom: 35px;\n `,\n ],\n label: css`\n color: ${COLORS.DARK_GREY};\n font-size: 12px;\n line-height: 15px;\n font-weight: bold;\n `,\n textArea: css`\n width: 100%;\n background-color: ${COLORS.WHITE};\n font-size: 13px;\n ::placeholder {\n font-style: italic;\n }\n `,\n btnRow: [\n FLEX_ROW,\n css`\n transition: all .5s ease;\n overflow: hidden;\n `,\n ],\n open: css`\n padding-top: 10px;\n height: 35px;\n opacity: 1;\n `,\n closed: css`\n height: 0;\n opacity: 0;\n `,\n saveBtn: [\n btnStyle.primary(COLORS.BLUE),\n css`\n min-width: 80px;\n `,\n ],\n cancelBtn: [\n btnStyle.tertiary(COLORS.BLUE),\n css`\n min-width: 80px;\n `,\n ],\n};\n\n\n/**\n * Returns the number of new lines in the given maybe string. If the maybe string isn't a string, then you get back 1.\n */\nconst calcLines = R.memoizeWith(\n (s: string | undefined): string => `${s}`,\n (s: string | undefined): number => s?.split('\\n')?.length ?? 1,\n);\n\n\ntype Props = {\n fieldsAnswers: DevPlanFieldAndAnswer[];\n devItemCompetencyId?: number;\n isParticipant: boolean;\n className?: string;\n};\n\n\n/**\n * DevActionForm: a component that takes a list of fields and answers and allows the user to view/edit them. This\n * component handles saving changes to the API.\n *\n * PureComponent: true\n */\nconst DevActionForm: React.FC = props => {\n const dispatch = useDispatch();\n\n const placeholder = useMsgText(Str.ResponseNotAdded);\n\n const [dirty, setDirtyObj] = useState>({});\n const [editing, setEditingObj] = useState>({});\n const isEditing = useMemo(() => !!Object.keys(editing).length, [editing]);\n\n const getLoading = useCallback(calcUpdateFieldAnswerApiState(props.fieldsAnswers), [props.fieldsAnswers]);\n const loading = useAppState(state => getLoading(state.loading));\n\n const reset = useCallback(\n () => {\n setDirtyObj({});\n setEditingObj({});\n },\n [setDirtyObj, setEditingObj],\n );\n\n const setEditing = useCallback(\n (key: string) => {\n if (loading) {\n return;\n }\n\n setEditingObj(R.assoc(key, true, editing));\n\n // Not all browsers properly focus the text area, and some even override focus for the click event.\n // This line: \"After the event is processed, set focus on the clicked text area\"\n setTimeout(() => document.getElementById(`${key}`)?.focus(), 0);\n },\n [loading, editing, setEditingObj],\n );\n\n const setDirty = useCallback(\n (key: string, value: string | undefined) => setDirtyObj(R.assoc(key, value, dirty)),\n [dirty, setDirtyObj],\n );\n\n const onCancel = useCallback(\n event => {\n event.preventDefault();\n reset();\n },\n [reset],\n );\n\n const onSubmit = useCallback(\n event => {\n event.preventDefault();\n\n if (loading) {\n return;\n }\n\n dispatchFieldAnswerUpdates(dispatch, props.fieldsAnswers, dirty);\n\n reset();\n },\n [loading, props, dirty, reset, dispatch],\n );\n\n return (\n \n { // Questions / Answers\n props.fieldsAnswers.map((item, i) => item.list\n ? (\n \n )\n : (\n setEditing(`${item.devPlanFieldId}`)}\n onChangeAnswer={event => setDirty(`${item.devPlanFieldId}`, event.target.value)}\n disableTextArea={!props.isParticipant || !editing[`${item.devPlanFieldId}`]}\n textAreaStyle={[TEXT_AREA, styles.textArea, !editing[`${item.devPlanFieldId}`] && styles.clickable]}\n css={[\n styles.inputGroup,\n !editing[`${item.devPlanFieldId}`] && styles.clickable,\n i === props.fieldsAnswers.length - 1 && css`margin-bottom: 0;`,\n ]}\n />\n ),\n )\n }\n\n {\n /* Submit/Cancel */\n props.isParticipant\n && \n \n \n \n \n }\n \n );\n};\n\nexport default DevActionForm;\n","import * as React from 'react';\nimport { useMemo, useCallback } from 'react';\nimport AddToCalendar from 'react-add-to-calendar';\nimport { css } from '@emotion/core';\nimport LocalDiv from '../localization/LocalDiv';\nimport moment from 'moment';\nimport { SELECT } from './styles/select';\nimport { COLORS } from '../globalStyle/colors';\nimport arrow from '../assets/triangle-down-white.svg';\nimport { useMsgText } from '../localization/hooks';\nimport { Str } from '../localization/translationKeys';\nimport { BENCHMARKS } from '../language/time';\nimport { doNothing } from '../language/module';\n\n\nconst CALENDARS = [\n { google: 'Google' },\n { outlook: 'Outlook' },\n { yahoo: 'Yahoo' },\n];\n\n\nconst styles = {\n root: [\n SELECT,\n css`\n background-color: ${COLORS.BLUE};\n background-image: url(${arrow});\n `,\n ],\n disabled: css`\n opacity: 0.4;\n color: ${COLORS.WHITE};\n line-height: 34px;\n `,\n};\n\n\ntype Props = {\n selectedDate: Date;\n className?: string;\n};\n\n\n/**\n * AddToCalendar: a component that renders a dropdown of calendar options for adding a date to the user's calendar\n */\nconst AddToCalendarBtn: React.FC = props => {\n const btnText = useMsgText(Str.AddCalendar);\n\n // We hack the calendar button into a select, but we still have to register a click when the whole mock select is\n // clicked. This finds the link inside the calendar button and clicks it.\n const onClick = useCallback(event => event.target?.children[0]?.getElementsByTagName?.('a')?.[0]?.click?.(), []);\n\n const event = useMemo(\n () => ({\n title: '',\n description: '',\n location: '',\n startTime: props.selectedDate,\n endTime: moment(props.selectedDate).add(1, 'days').toDate(),\n }),\n [props.selectedDate],\n );\n\n const noDate = useMemo(\n () => (\n props.selectedDate.valueOf() === BENCHMARKS.Y2K.valueOf()\n ),\n [props.selectedDate],\n );\n\n return (\n \n {/* NOTE: you can't style AddToCalendar normally -- you have to use globalStyles/react-add-to-calendar.css */}\n {\n noDate\n ? (\n {btnText} \n )\n : (\n \n )\n }\n\n \n );\n};\n\nexport default AddToCalendarBtn;\n","import { useWindowSize } from '../../../core/hooks/useWindowSize';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { isRtl } from '../../../localization/module';\nimport { useMsgText } from '../../../localization/hooks';\nimport { Str } from '../../../localization/translationKeys';\nimport { useMemo, useState, useCallback, useEffect } from 'react';\nimport { colorForStatus } from './module';\nimport { useLoading } from '../../../core/api/hooks';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { isDotNetDefault, BENCHMARKS } from '../../../language/time';\nimport { updateDevPlanActionCompleteByDateAction } from './api/updateActionCompleteByAction';\nimport { useDispatch } from 'react-redux';\nimport { updateDevPlanActionStatusAction } from './api/updateDevPlanActionStatusAction';\n\n\nexport type CompletionDate = {\n selectedDate: Date,\n onChangeDate: (newDate: Date) => void,\n loading: boolean,\n};\n\n\n/**\n * Hook for Dev Plan's Item's Action's Completion Date read/write logic.\n */\nexport const useCompletionDate = (\n devPlanItemId: number,\n actionId: number,\n completeBy: string | Date,\n): CompletionDate => {\n const dispatch = useDispatch();\n\n const [selectedDate, setSelectedDate] = useState(\n isDotNetDefault(completeBy) ? BENCHMARKS.Y2K : new Date(completeBy),\n );\n\n const loading = useLoading(ActionType.UpdateDevPlanActionCompleteByDateRequest, actionId);\n\n const onChangeDate = useCallback(\n newDate => {\n setSelectedDate(newDate);\n dispatch(updateDevPlanActionCompleteByDateAction(devPlanItemId, actionId, newDate));\n },\n [actionId, devPlanItemId, setSelectedDate, dispatch],\n );\n\n return { selectedDate, onChangeDate, loading };\n};\n\n\nexport type StatusOption = {\n statusId: number;\n txt: string;\n};\n\ntype ActionStatus = {\n color: string;\n statuses: StatusOption[];\n selected: number;\n onChange: (event: any) => void;\n loading: boolean;\n};\n\n/**\n * Hook for Dev Plan's Item's Action's status read/write/render logic.\n */\nexport const useActionStatus = (\n itemId: number,\n actionId: number,\n status: number,\n): ActionStatus => {\n const dispatch = useDispatch();\n\n const { isMobile } = useWindowSize();\n\n const translations = useAppState(state => state.locale.translations[state.locale.lang.languageId]);\n const rtl = useAppState(state => isRtl(state.locale.textDirection));\n\n const title = useMsgText(Str.Status);\n const statusMsgs = useAppState(state => state.devPlan?.actionStatuses || []);\n\n const [selected, setSelected] = useState(status);\n const color = useMemo(() => colorForStatus(selected), [selected]);\n\n const loading = useLoading(ActionType.UpdateDevPlanActionStatusRequest, actionId);\n\n const projectId = useAppState(state => state.projectSummary?.projectId ?? 0);\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || projectId);\n\n const statuses = useMemo(\n () => {\n const getStr = (str: Str): string => {\n const translation = translations[str]?.text || '';\n\n // On mobile, stick the header on each of the drop-down options, honoring RTL reversal\n return isMobile\n ? rtl\n ? `${translation} :${title}`\n : `${title}: ${translation}`\n : translation;\n };\n\n return statusMsgs.map(msg => ({\n statusId: msg.statusId,\n txt: getStr(msg.key),\n }));\n },\n [title, isMobile, rtl, statusMsgs, translations],\n );\n\n useEffect(\n () => {\n if (status !== selected) {\n dispatch(updateDevPlanActionStatusAction(devPlanProjectId, itemId, actionId, selected));\n }\n },\n [status, devPlanProjectId, itemId, actionId, selected, dispatch],\n );\n\n const onChange = useCallback(event => setSelected(+event.target.value), [setSelected]);\n\n return { color, statuses, selected, onChange, loading };\n};\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport Card from '../../../layout/card/Card';\nimport CardHeader from '../../../layout/card/CardHeader';\nimport { useMsgText } from '../../../localization/hooks';\nimport { Str } from '../../../localization/translationKeys';\nimport { faCalendar } from '@fortawesome/free-regular-svg-icons';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../../layout/flexBox';\nimport '../../../globalStyle/react-add-to-calendar.css';\nimport '../../../globalStyle/react-datepicker.min.css';\nimport DatePicker from 'react-datepicker';\nimport { BENCHMARKS } from '../../../language/time';\nimport { onMobileDevice } from '../../../globalStyle/mediaQueries';\nimport AddToCalendarBtn from '../../../forms/AddToCalendarBtn';\nimport { useCompletionDate } from './hooks';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport Msg from '../../../localization/Msg';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faPen } from '@fortawesome/free-solid-svg-icons';\nimport Spacer from '../../../layout/Spacer';\nimport { useToggle } from '../../../core/hooks/useToggle';\nimport { useAppState } from '../../../core/redux/hooks';\n\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n css`\n padding: 15px;\n align-items: stretch;\n `,\n ],\n header: css`\n margin-bottom: 30px;\n `,\n headerIcon: css`\n font-size: 20px;\n `,\n date: css`\n color: ${COLORS.BLUE};\n border: none;\n padding: 10px 0;\n text-align: center;\n width: 100%;\n font-size: 12px;\n \n &:hover { \n cursor: pointer;\n color: ${COLORS.HOVER_GREY};\n }\n `,\n addToCalBtn: [\n css`\n margin: 30px 10px 10px;\n \n ${onMobileDevice} {\n margin-top: 0;\n } \n `,\n ],\n disabled: css`\n opacity: .4;\n `,\n addDate: css`\n margin: 0 auto;\n color: ${COLORS.BLUE};\n\n &:hover { \n cursor: pointer;\n color: ${COLORS.HOVER_GREY};\n }\n `,\n collaboratorDate: css`\n margin: 35px auto 65px;\n `,\n};\n\n\ntype Props = {\n devPlanItemId: number;\n actionId: number;\n completeBy: Date;\n isParticipant: boolean;\n className?: string;\n};\n\n\n/**\n * CompletionCard: a component that shows and updates the Complete By date for an action.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst CompletionCard: React.FC = props => {\n const title = useMsgText(Str.CompleteBy);\n\n const { selectedDate, onChangeDate, loading } = useCompletionDate(\n props.devPlanItemId,\n props.actionId,\n props.completeBy,\n );\n\n const [startOpen, toggleStartOpen] = useToggle(false);\n\n const initializeDate = () => {\n onChangeDate(new Date());\n toggleStartOpen();\n };\n \n const code = useAppState(state => state.locale.lang.code);\n\n return (\n \n \n {\n props.isParticipant\n ? selectedDate.valueOf() === BENCHMARKS.Y2K.valueOf()\n ? (\n \n \n \n \n \n ) : (\n \n ) : (\n \n \n \n )\n }\n {startOpen && toggleStartOpen}\n {\n props.isParticipant && (\n \n )\n }\n \n );\n};\n\nexport default CompletionCard;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport Card from '../../../layout/card/Card';\nimport CardHeader from '../../../layout/card/CardHeader';\nimport { useMsgText } from '../../../localization/hooks';\nimport { Str } from '../../../localization/translationKeys';\nimport { faThermometerHalf } from '@fortawesome/free-solid-svg-icons';\nimport LocalSelect from '../../../localization/LocalSelect';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../../layout/flexBox';\nimport { SELECT } from '../../../forms/styles/select';\nimport { DevPlanAction } from '../models';\nimport { COLORS } from '../../../globalStyle/colors';\nimport arrow from '../../../assets/triangle-down-white.svg';\nimport { onMobileDevice } from '../../../globalStyle/mediaQueries';\nimport { useActionStatus } from './hooks';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport Msg from '../../../localization/Msg';\n\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n css`\n padding: 15px;\n align-items: stretch;\n `,\n ],\n mobileRoot: [\n FLEX_COLUMN,\n css`align-items: stretch;`,\n ],\n headerIcon: css`\n font-size: 20px;\n `,\n select: [\n SELECT,\n css`\n margin: 10px;\n color: ${COLORS.WHITE};\n background-image: url(${arrow});\n user-select: none;\n font-size: 12px;\n \n ${onMobileDevice} { \n margin: 0; \n }\n `,\n ],\n collaboratorStatusView: [\n FLEX_ROW,\n css`\n align-items: center;\n background-image: none;\n\n &:hover {\n cursor: default;\n }\n `,\n ],\n dropDownOptions: css`\n background-color: ${COLORS.WHITE};\n `,\n};\n\n\ntype Props = {\n action: DevPlanAction;\n isParticipant: boolean;\n className?: string;\n};\n\n\n/**\n * StatusCard: a component that renders a drop-down for the user to change the action's status.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst StatusCard: React.FC = props => {\n const title = useMsgText(Str.Status);\n\n const { color, statuses, selected, onChange, loading } = useActionStatus(\n props.action.devItemId,\n props.action.devActionId,\n props.action.status,\n );\n\n return (\n \n \n {\n props.isParticipant\n ? (\n \n {\n statuses.map(status => (\n {status.txt}\n ))\n }\n \n ) : (\n \n \n \n )\n }\n \n );\n};\n\nexport default StatusCard;\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport { css } from '@emotion/core';\nimport LocalDiv from '../localization/LocalDiv';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport Spacer from '../layout/Spacer';\nimport DatePicker from 'react-datepicker';\nimport { BENCHMARKS } from '../language/time';\nimport { BTN_GENERAL, BTN_HOVER } from './styles/button';\nimport { COLORS } from '../globalStyle/colors';\n\n\nconst styles = {\n wrapper: [\n css`\n /* Btn hover adds a border which moves contents onHover... this fixes that. */\n border: 1px solid transparent;\n `,\n BTN_GENERAL,\n BTN_HOVER,\n css`\n display: flex;\n flex-direction: row;\n align-items: center;\n background-color: ${COLORS.BLUE};\n color: ${COLORS.WHITE};\n padding: 0 12px;\n flex-grow: 1;\n `,\n ],\n picker: css`\n color: ${COLORS.WHITE};\n background-color: transparent;\n border: none;\n outline: none;\n text-align: start;\n `,\n};\n\n\ntype Props = {\n msg: string | Str;\n selectedDate: Date,\n onChangeDate: (newDate: Date) => void,\n disabled: boolean,\n className?: string;\n startOpen: boolean;\n};\n\n\n/**\n * MobileAddToCalendarBtn: a component that renders a date picker in a button-like format, forwarding clicks through to\n * the underlying component... It's ugly, and encapsulated here.\n */\nconst MobileDatePicker: React.FC = props => {\n const onClick = useCallback(event => event.target?.getElementsByTagName?.('input')?.[0]?.click?.(), []);\n\n return (\n \n \n \n \n \n );\n};\n\nexport default MobileDatePicker;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { FLEX_COLUMN, FLEX_CENTERED, FLEX_ROW } from '../../../layout/flexBox';\nimport { DevPlanAction } from '../models';\nimport LocalSelect from '../../../localization/LocalSelect';\nimport { SELECT } from '../../../forms/styles/select';\nimport { COLORS } from '../../../globalStyle/colors';\nimport arrow from '../../../assets/triangle-down-white.svg';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { useActionStatus, useCompletionDate } from './hooks';\nimport AddToCalendarBtn from '../../../forms/AddToCalendarBtn';\nimport Spacer from '../../../layout/Spacer';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faThermometerHalf, faHourglassEnd } from '@fortawesome/free-solid-svg-icons';\nimport { faCalendar } from '@fortawesome/free-regular-svg-icons';\nimport { Str } from '../../../localization/translationKeys';\nimport { BTN_HOVER, BTN_GENERAL } from '../../../forms/styles/button';\nimport MobileDatePicker from '../../../forms/MobileDatePicker';\nimport { useToggle } from '../../../core/hooks/useToggle';\nimport Msg from '../../../localization/Msg';\nimport { BENCHMARKS } from '../../../language/time';\n\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n css`\n align-items: stretch;\n padding-bottom: 30px;\n `,\n ],\n disabled: css`\n opacity: .4;\n `,\n btnRow: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n `,\n icons: {\n wrapper: [\n FLEX_ROW,\n FLEX_CENTERED,\n css`\n width: 22px;\n `,\n ],\n hourGlass: css`\n color: ${COLORS.BLUE};\n width: 22px;\n font-size: 18px;\n `,\n cal: css`\n color: ${COLORS.BLUE};\n width: 22px;\n font-size: 18px;\n `,\n status: css`\n font-size: 22px;\n `,\n },\n datePicker: {\n wrapper: [\n css`\n /* Btn hover adds a border which moves contents onHover... this fixes that. */\n border: 1px solid transparent;\n `,\n BTN_GENERAL,\n BTN_HOVER,\n css`\n display: flex;\n flex-direction: row;\n align-items: center;\n background-color: ${COLORS.BLUE};\n color: ${COLORS.WHITE};\n padding: 0 12px;\n flex-grow: 1;\n `,\n ],\n picker: css`\n color: ${COLORS.WHITE};\n background-color: ${COLORS.BLUE};\n border: none;\n outline: none;\n text-align: start;\n \n &:hover {\n cursor: pointer;\n color: ${COLORS.HOVER_GREY};\n }\n `,\n },\n addToCalBtn: [\n css`\n flex-grow: 1;\n `,\n ],\n statusSelect: [\n SELECT,\n css`\n color: ${COLORS.WHITE};\n background-image: url(${arrow});\n user-select: none;\n flex-grow: 1;\n `,\n ],\n addDate: [\n css`\n /* Btn hover adds a border which moves contents onHover... this fixes that. */\n border: 1px solid transparent;\n `,\n BTN_GENERAL,\n BTN_HOVER,\n css`\n display: flex;\n flex-direction: row;\n align-items: center;\n background-color: ${COLORS.BLUE};\n color: ${COLORS.WHITE};\n padding: 0 12px;\n flex-grow: 1;\n `,\n ],\n};\n\n\ntype Props = {\n action: DevPlanAction;\n className?: string;\n};\n\n\n/**\n * MobileActionBtns: a component that renders the mobile version of the buttons for each dev plan item action. These\n * buttons do things like change the goal date, add the goal date to calendar and change the action status.\n */\nconst MobileActionBtns: React.FC = props => {\n const actionStatus = useActionStatus(props.action.devItemId, props.action.devActionId, props.action.status);\n const completeBy = useCompletionDate(props.action.devItemId, props.action.devActionId, props.action.goalDate);\n\n const [startOpen, toggleStartOpen] = useToggle(false);\n\n const initializeDate = () => {\n completeBy.onChangeDate(new Date());\n toggleStartOpen();\n };\n \n return (\n
    \n \n {\n completeBy.selectedDate.valueOf() === BENCHMARKS.Y2K.valueOf()\n ? (\n \n \n \n ) : (\n \n )\n }\n \n
    \n \n
    \n
    \n \n\n \n \n \n
    \n \n
    \n
    \n \n\n \n \n {\n actionStatus.statuses.map(status => (\n {status.txt}\n ))\n }\n \n \n
    \n \n
    \n
    \n
    \n );\n};\n\nexport default MobileActionBtns;\n","import * as React from 'react';\n\n\ntype Props = {\n className?: string;\n fill?: string;\n sizePx: number;\n}\n\n\n/**\n * FaceIcon: a component that\n */\nconst FaceIcon: React.FC = props => (\n \n \n \n );\n\nexport default FaceIcon;\n","import * as React from 'react';\nimport { useState, useCallback } from 'react';\nimport { DevItemComment } from './models';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { css } from '@emotion/core';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport { Str } from '../../../localization/translationKeys';\nimport LocalTextArea from '../../../localization/LocalTextArea';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { useDevCommenterLabel } from './hooks';\nimport { TEXT_AREA } from '../../../forms/styles/textarea';\nimport Spacer from '../../../layout/Spacer';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../../layout/flexBox';\nimport { btnStyle } from '../../../forms/styles/button';\nimport FaceIcon from '../../../icons/FaceIcon';\n\n\nconst styles = {\n root: [\n FLEX_ROW,\n css`\n align-items: flex-start;\n `,\n ],\n form: {\n root: [\n FLEX_COLUMN,\n css`\n align-items: flex-start;\n flex-basis: 100%;\n `,\n ],\n textArea: {\n default: [\n TEXT_AREA,\n css`\n width: 100%;\n font-size: 12px;\n ::placeholder {\n font-style: italic;\n }\n `,\n ],\n disabled: [\n css`\n background-color: transparent;\n padding: 0;\n `,\n ],\n },\n actionBtns: {\n root: [\n FLEX_ROW,\n ],\n saveBtn: [\n btnStyle.primary(COLORS.BLUE),\n ],\n cancelBtn: [\n btnStyle.transparent(COLORS.BLUE),\n css`\n border-color: transparent;\n `,\n ],\n },\n },\n green: [\n css`color: ${COLORS.GREEN};`,\n ],\n};\n\n\ntype Props = {\n comment: DevItemComment;\n inEditMode: boolean;\n handleClick: () => void;\n handleCancel: () => void;\n updateComment: (comment: string) => void;\n className?: string;\n};\n\n\n/**\n * DevItemCommentView: a component that renders a comment from a participant or collaborator, with facilities to edit or\n * delete that comment (available only to the comment author)\n */\nconst DevItemCommentView: React.FC = (\n {\n comment,\n inEditMode,\n handleClick,\n handleCancel,\n updateComment,\n className,\n },\n) => {\n const [commentText, setCommentText] = useState();\n\n const handleClickTextArea = useCallback(\n () => {\n !commentText && setCommentText(comment.comment);\n handleClick();\n },\n [comment.comment, commentText, handleClick],\n );\n\n const handleClickCancelBtn = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n handleCancel();\n },\n [handleCancel],\n );\n\n const handleClickSaveBtn = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n updateComment(commentText ?? '');\n handleCancel();\n setCommentText(undefined);\n },\n [commentText, handleCancel, updateComment],\n );\n\n const handleChangeCommentText = useCallback(\n (event: React.ChangeEvent) => {\n setCommentText(event.target.value);\n },\n [],\n );\n\n const { commenterLabel, isFromCurrentUser } = useDevCommenterLabel(comment);\n\n return (\n \n \n \n
    \n \n {commenterLabel} - {new Date(comment.lastUpdated).toLocaleString()}\n \n \n \n \n {\n inEditMode && (\n \n \n \n \n \n )\n }\n \n
    \n );\n};\n\nexport default DevItemCommentView;\n","import * as React from 'react';\nimport { useCallback, useState, useMemo } from 'react';\nimport { Str } from '../../../localization/translationKeys';\nimport LocalTextArea from '../../../localization/LocalTextArea';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport { FLEX_ROW, FLEX_ADAPTIVE } from '../../../layout/flexBox';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { css } from '@emotion/core';\nimport Spacer from '../../../layout/Spacer';\nimport { btnStyle } from '../../../forms/styles/button';\nimport { TEXT_AREA } from '../../../forms/styles/textarea';\nimport FaceIcon from '../../../icons/FaceIcon';\nimport { useLoading } from '../../../core/api/hooks';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { useOnSuccess } from '../../../core/hooks/useOnSuccess';\n\n\nconst styles = {\n root: [\n FLEX_ROW,\n css`\n align-items: flex-start;\n `,\n ],\n form: {\n root: [\n FLEX_ADAPTIVE,\n css`\n align-items:flex-start;\n flex-basis: 100%;\n `,\n ],\n textArea: [\n TEXT_AREA,\n css`\n width: 100%;\n font-size: 12px;\n ::placeholder {\n font-style: italic;\n }\n `,\n ],\n submitBtn: [\n btnStyle.primary(COLORS.BLUE),\n ],\n },\n};\n\n\ntype Props = {\n projectId: number;\n devItemId: number;\n devActionId: number;\n addComment: (comment: string) => void;\n onCommentAdded: (comment: string) => void;\n className?: string;\n};\n\n\n/**\n * AddDevItemCommentForm: a component that allows collaborators and participants to add comments to dev item actions\n */\nconst AddDevItemCommentForm: React.FC = (\n {\n projectId,\n devItemId,\n devActionId,\n addComment,\n onCommentAdded,\n className,\n },\n) => {\n const [comment, setComment] = useState(undefined);\n\n const onClickAddBtn = useCallback(\n event => {\n event.preventDefault();\n addComment(comment!);\n },\n [addComment, comment],\n );\n\n const onChangeComment = useCallback(event => setComment(event.target.value), []);\n\n const addCommentReqId = useMemo(\n () => `${projectId}-${devItemId}-${devActionId}`,\n [devActionId, devItemId, projectId],\n );\n\n const addingComment = useLoading(ActionType.AddDevItemCommentRequest, addCommentReqId);\n\n useOnSuccess(\n () => {\n onCommentAdded(comment!);\n setComment('');\n },\n ActionType.AddDevItemCommentRequest,\n addCommentReqId,\n );\n\n return (\n
    \n \n \n
    \n \n \n \n \n
    \n );\n};\n\nexport default AddDevItemCommentForm;\n","import * as React from 'react';\nimport { useState, useCallback, useMemo } from 'react';\nimport * as R from 'ramda';\nimport { DevItemComment } from './models';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport DevItemCommentView from './DevItemCommentView';\nimport Msg from '../../../localization/Msg';\nimport AddDevItemCommentForm from './AddDevItemCommentForm';\nimport { css } from '@emotion/core';\nimport Spacer from '../../../layout/Spacer';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { useCurrentCollaborator } from './hooks';\nimport { useCurrentUser } from '../../../auth/hooks';\nimport { isCurrentUserComment, isParticipantComment } from './module';\nimport { Str } from '../../../localization/translationKeys';\n\n\nconst styles = {\n header: [\n css`font-weight: bold;`,\n ],\n form: [\n css`\n padding: 12px;\n justify-content: stretch;\n `,\n ],\n comment: [\n css`\n border-top: 1px solid;\n border-image-slice: 1;\n border-image-source: linear-gradient(to right, transparent, ${COLORS.PROJECTBAR_GREY} 3% 97%, transparent);\n `,\n ],\n};\n\n\ntype Props = {\n projectId: number;\n devItemId: number;\n devActionId: number;\n comments: DevItemComment[];\n addComment: (comment: string) => void;\n updateComment: (commentId: number, comment: string) => void;\n onCommentAdded: (comment: string) => void;\n className?: string;\n};\n\n\nconst renderComments = (\n comments: DevItemComment[],\n inEditMode: (comment: DevItemComment) => boolean,\n handleClick: (comment: DevItemComment) => void,\n handleCancel: () => void,\n updateComment: (commentId: number, comment: string) => void,\n) => comments.map(\n comment => (\n handleClick(comment)}\n handleCancel={handleCancel}\n updateComment={(editedComment: string) => updateComment(comment.commentId, editedComment)}\n css={[styles.form, styles.comment]}\n />\n ),\n);\n\n\n/**\n * DevItemComments: a component that renders comments added by collaborators and the participant, to the current dev\n * item action\n */\nconst DevItemComments: React.FC = (\n {\n projectId,\n devItemId,\n devActionId,\n comments,\n addComment,\n updateComment,\n onCommentAdded,\n className,\n },\n) => {\n const [underEdit, setUnderEdit] = useState();\n\n const currentUser = useCurrentUser();\n\n const currentCollaborator = useCurrentCollaborator();\n\n const currentEmail = useMemo(\n () => currentUser?.userName || currentCollaborator?.email || '',\n [currentCollaborator, currentUser],\n );\n\n const isUnderEdit = useCallback(\n (comment: DevItemComment) => comment === underEdit,\n [underEdit],\n );\n\n const canEditComment = useCallback(\n (comment: DevItemComment) => isCurrentUserComment(comment, currentEmail)\n || (isParticipantComment(comment) && !!currentUser),\n [currentEmail, currentUser],\n );\n\n const handleClick = useCallback(\n (comment: DevItemComment) => {\n if (comment !== underEdit && canEditComment(comment)) {\n setUnderEdit(comment);\n }\n },\n [canEditComment, underEdit],\n );\n\n const handleCancel = () => setUnderEdit(undefined);\n\n const sortedComments = useMemo(() => R.sort(R.descend(R.prop('commentId')), comments), [comments]);\n\n return (\n \n \n \n \n \n {renderComments(sortedComments, isUnderEdit, handleClick, handleCancel, updateComment)}\n \n );\n};\n\nexport default DevItemComments;\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport { css } from '@emotion/core';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport DevActionForm from './DevActionForm';\nimport CompletedCard from './CompletionCard';\nimport StatusCard from './StatusCard';\nimport { DevPlanAction, DevPlanFieldAndAnswer } from '../models';\nimport { FLEX_ADAPTIVE } from '../../../layout/flexBox';\nimport { FORM_COLUMN } from '../../../forms/styles/form';\nimport Card from '../../../layout/card/Card';\nimport { useMsgText } from '../../../localization/hooks';\nimport { Str } from '../../../localization/translationKeys';\nimport Spacer from '../../../layout/Spacer';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faTrash } from '@fortawesome/free-solid-svg-icons';\nimport { useToggle } from '../../../core/hooks/useToggle';\nimport ConfirmationModal from '../../../layout/modal/ConfirmationModal';\nimport { useDispatch } from 'react-redux';\nimport { deleteDevPlanActionAction } from './api/deleteDevPlanActionAction';\nimport { Routes } from '../../../navigation/routes';\nimport { onMobileDevice } from '../../../globalStyle/mediaQueries';\nimport { useWindowSize } from '../../../core/hooks/useWindowSize';\nimport MobileActionBtns from './MobileActionBtns';\nimport { useAppState } from '../../../core/redux/hooks';\nimport DevItemComments from '../collaboration/DevItemComments';\nimport { DevItemComment } from '../collaboration/models';\n\n\nconst styles = {\n root: [\n FLEX_ADAPTIVE,\n css`\n transition: all .5s ease;\n\n ${onMobileDevice} {\n background-color: ${COLORS.LIGHTEST_GREY};\n }\n `,\n ],\n actionForm: css`\n flex-grow: 1;\n background-color: ${COLORS.LIGHTEST_GREY};\n padding: 15px;\n `,\n formHeader: {\n root: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-bottom: 35px;\n `,\n title: css`\n text-align: start;\n margin: 0;\n color: ${COLORS.DARK_GREY};\n `,\n iconBtn: css`\n border: none;\n padding: 0;\n transition: opacity .25s ease;\n \n &:hover { \n opacity: .4;\n cursor: pointer;\n }\n `,\n icon: css`\n font-size: 14px;\n color: ${COLORS.DARK_GREY};\n `,\n },\n actionCards: [\n FORM_COLUMN,\n css`\n width: 255px;\n flex-basis: 255px;\n `,\n ],\n mobileActionBtns: css`\n margin: 0 15px 20px;\n `,\n};\n\n\ntype Props = {\n routes: Routes;\n itemTitle: string;\n actionNumber: number;\n action: DevPlanAction | undefined;\n fieldsAnswers: DevPlanFieldAndAnswer[];\n\n collaborationEnabled: boolean;\n isParticipant: boolean;\n comments: DevItemComment[];\n addComment: (comment: string) => void;\n updateComment: (commentId: number, comment: string) => void;\n onCommentAdded: (commentId: string) => void;\n\n devItemCompetencyId?: number;\n\n className?: string;\n};\n\n\n/**\n * DevActionView: a component that renders a dev plan's dev item's action including form to update that action.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst DevActionView: React.FC = props => {\n const dispatch = useDispatch();\n\n const { isMobile } = useWindowSize();\n\n const title = useMsgText(Str.ActionNumber, '', { 'number': props.actionNumber });\n\n const deleteConfirmation = useMsgText(\n Str.ConfirmRemoveAction,\n '',\n { 'number': props.actionNumber, 'itemTitle': props.itemTitle },\n );\n\n const projectId = useAppState(state => state.projectSummary?.projectId ?? 0);\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || projectId);\n\n const [confirmDelete, toggleConfirmDelete] = useToggle(false);\n\n const onConfirmDelete = useCallback(\n () => {\n dispatch(deleteDevPlanActionAction(\n devPlanProjectId, props.action?.devItemId || -1, props.action?.devActionId || -1,\n ));\n toggleConfirmDelete();\n },\n [props, devPlanProjectId, dispatch, toggleConfirmDelete],\n );\n\n const dir = useAppState(state => state.locale.textDirection);\n\n if (!props.action) {\n return
    ;\n }\n\n return (\n \n {/* Action Form */}\n \n \n

    {title}

    \n \n {\n props.isParticipant && props.comments.length === 0 && (\n \n )\n }\n
    \n \n {\n props.collaborationEnabled && (\n <>\n \n \n \n )\n }\n
    \n\n \n\n {\n isMobile\n ? \n : (\n
    \n \n \n
    \n )\n }\n\n {\n confirmDelete && (\n \n )\n }\n\n
    \n );\n};\n\nexport default DevActionView;\n","import * as React from 'react';\nimport { useState, useCallback } from 'react';\nimport { css } from '@emotion/core';\nimport LocalDiv from '../../localization/LocalDiv';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { Str } from '../../localization/translationKeys';\nimport Spacer from '../../layout/Spacer';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { COLORS } from '../../globalStyle/colors';\nimport { btnStyle } from '../../forms/styles/button';\nimport { useDispatch } from 'react-redux';\nimport { useMsgText } from '../../localization/hooks';\nimport { useToggle } from '../../core/hooks/useToggle';\nimport { useLoading } from '../../core/api/hooks';\nimport { ActionType } from '../../core/redux/actionType';\nimport Msg from '../../localization/Msg';\nimport * as R from 'ramda';\nimport { updateDevPlanItemDescriptionAction } from './api/updateDevPlanItemDescriptionAction';\nimport { useAppState } from '../../core/redux/hooks';\nimport { TEXT_AREA } from '../../forms/styles/textarea';\n\n\nconst TEXT_AREA_ID = 'item_desc_text_area';\n\nconst styles = {\n root: css`\n background-color: ${COLORS.LIGHTEST_GREY};\n transition: opacity .5s ease;\n border-radius: 10px;\n padding: 30px;\n `,\n loadingForm: css`\n opacity: .4;\n `,\n clickable: css`\n cursor: pointer;\n `,\n inputGroup: [\n FLEX_COLUMN,\n css`\n align-items: stretch;\n `,\n ],\n label: css`\n align-self: flex-start;\n color: ${COLORS.DARK_GREY};\n font-size: 12px;\n line-height: 15px;\n font-weight: bold;\n margin-bottom: 5px;\n `,\n textArea: [\n TEXT_AREA,\n css`\n width: 100%;\n font-size: 13px;\n background-color: ${COLORS.WHITE};\n ::placeholder {\n font-style: italic;\n }\n `,\n ],\n btnRow: [\n FLEX_ROW,\n css`\n transition: all .5s ease;\n overflow: hidden;\n `,\n ],\n open: css`\n padding-top: 10px;\n height: 35px;\n opacity: 1;\n `,\n closed: css`\n height: 0;\n opacity: 0;\n `,\n saveBtn: [\n btnStyle.primary(COLORS.BLUE),\n css`\n min-width: 80px;\n `,\n ],\n cancelBtn: [\n btnStyle.tertiary(COLORS.BLUE),\n css`\n min-width: 80px;\n `,\n ],\n};\n\n\n/**\n * Returns the number of new lines in the given maybe string. If the maybe string isn't a string, then you get back 1.\n */\nconst calcLines = R.memoizeWith(\n (s: string | undefined): string => `${s}`,\n (s: string | undefined): number => s?.split('\\n')?.length ?? 1,\n);\n\n\ntype Props = {\n participantId: number;\n projectId: number;\n itemId: number;\n desc: string | undefined;\n className?: string;\n};\n\n\n/**\n * DevPlanSummaryText: a component that renders a development item's summary along with form logic to update it.\n */\nconst DevPlanDescText: React.FC = props => {\n const dispatch = useDispatch();\n\n const placeholder = useMsgText(Str.DescriptionNotAdded);\n\n const [isEditing, toggleIsEditing] = useToggle(false);\n const [desc, setDesc] = useState(props.desc || '');\n\n const loading = useLoading(ActionType.UpdateDevPlanItemDescriptionRequest, props.itemId);\n\n const setEditing = useCallback(\n () => {\n if (isEditing || loading) {\n return;\n }\n\n toggleIsEditing();\n\n // Not all browsers properly focus the text area, and some even override focus for the click event.\n // This line: \"After the event is processed, set focus on the clicked text area\"\n setTimeout(() => document.getElementById(TEXT_AREA_ID)?.focus(), 0);\n },\n [isEditing, loading, toggleIsEditing],\n );\n\n const onUpdate = React.useCallback(event => setDesc(event.target.value), [setDesc]);\n\n const onCancel = useCallback(\n event => {\n event.preventDefault();\n\n if (isEditing) {\n toggleIsEditing();\n }\n\n setDesc(props.desc || '');\n },\n [isEditing, setDesc, props, toggleIsEditing],\n );\n\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || props.projectId);\n\n const onSubmit = useCallback(\n event => {\n event.preventDefault();\n\n if (loading) {\n return;\n }\n\n dispatch(updateDevPlanItemDescriptionAction(props.participantId, devPlanProjectId, props.itemId, desc));\n\n if (isEditing) {\n toggleIsEditing();\n }\n },\n [desc, isEditing, toggleIsEditing, loading, props, devPlanProjectId, dispatch],\n );\n\n return (\n \n \n \n\n {/* Submit/Cancel */}\n \n \n \n \n \n \n \n );\n};\n\nexport default DevPlanDescText;\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport { css } from '@emotion/core';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_ADAPTIVE } from '../../layout/flexBox';\nimport { Link, useHistory } from 'react-router-dom';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faTrash } from '@fortawesome/free-solid-svg-icons';\nimport { onMobileDevice, HIDE_ON_MOBILE } from '../../globalStyle/mediaQueries';\nimport { COLORS } from '../../globalStyle/colors';\nimport { Routes } from '../../navigation/routes';\nimport { DevPlanItem } from './models';\nimport Spacer from '../../layout/Spacer';\nimport { useDispatch } from 'react-redux';\nimport { useToggle } from '../../core/hooks/useToggle';\nimport { deleteDevPlanItemAction } from './api/deleteDevPlanItemAction';\nimport ConfirmationModal from '../../layout/modal/ConfirmationModal';\nimport { Str } from '../../localization/translationKeys';\nimport Msg from '../../localization/Msg';\nimport { btnStyle } from '../../forms/styles/button';\nimport { useMsgText } from '../../localization/hooks';\nimport { useAppState } from '../../core/redux/hooks';\n\n\nconst styles = {\n root: [\n FLEX_ADAPTIVE,\n css`\n align-items: center;\n justify-content: space-between;\n \n ${onMobileDevice} {\n align-items: flex-start;\n justify-content: stretch;\n }\n `,\n ],\n titleContainer: [\n FLEX_ROW,\n css`\n align-items: baseline;\n color: ${COLORS.DARK_GREY};\n \n ${onMobileDevice} {\n align-self: flex-start;\n }\n `,\n ],\n title: css`\n font-weight: normal;\n font-size: 26px;\n margin: 0;\n `,\n titleLink: css`\n text-decoration: none;\n color: ${COLORS.DARK_GREY};\n\n &:hover { \n opacity: .6;\n cursor:pointer;\n }\n `, \n deleteBtn: css`\n border: none;\n background-color: transparent;\n text-decoration: none;\n color: ${COLORS.DARK_GREY};\n \n &:hover { \n opacity: .6;\n cursor:pointer;\n }\n `,\n deleteIcon: css`\n font-size: 16px;\n margin-bottom: 2px;\n `,\n resourcesLink: [\n btnStyle.primary(COLORS.DARK_GREY),\n css`\n min-width: 205px;\n ${HIDE_ON_MOBILE};\n `,\n ],\n};\n\n\ntype Props = {\n participantId: number;\n projectId: number;\n item: DevPlanItem;\n routes: Routes;\n showResourcesLink: boolean;\n isParticipant: boolean;\n className?: string;\n};\n\n\n/**\n * DevItemHeader: a component that renders the Dev Plan Item Header which shows the item's title, gives an option to\n * delete the item, and gives a link to the development resources.\n */\nconst DevItemHeader: React.FC = props => {\n const history = useHistory();\n const dispatch = useDispatch();\n\n const deleteConfirmationMsg = useMsgText(Str.ConfirmRemoveItem, '', { 'itemTitle': props.item.title });\n\n const [showDeleteConfirmation, toggleShowDeleteConfirmation] = useToggle(false);\n\n const hasDevResources = useAppState(state => !!state.devResources?.length);\n\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || props.projectId);\n\n const onConfirmDelete = useCallback(\n () => {\n dispatch(deleteDevPlanItemAction(props.participantId, devPlanProjectId, props.item.devItemId));\n toggleShowDeleteConfirmation();\n history.replace(props.routes.DevPlan);\n },\n [props, devPlanProjectId, toggleShowDeleteConfirmation, dispatch, history],\n );\n\n return (\n \n \n \n

    {props.item.title}

    \n \n \n { props.isParticipant && (\n \n )\n }\n
    \n\n {\n hasDevResources && props.showResourcesLink && (\n \n \n \n )\n }\n\n { // Delete Confirmation Modal\n showDeleteConfirmation && (\n \n )\n }\n
    \n );\n};\n\nexport default DevItemHeader;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport MobileToolbar from '../../layout/mobile/MobileToolbar';\nimport { Str } from '../../localization/translationKeys';\nimport { faBook, faPlus } from '@fortawesome/free-solid-svg-icons';\nimport { Link } from 'react-router-dom';\nimport { Routes } from '../../navigation/routes';\nimport Msg from '../../localization/Msg';\nimport { FLEX_COLUMN, FLEX_CENTERED } from '../../layout/flexBox';\nimport { BTN_HOVER } from '../../forms/styles/button';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport Spacer from '../../layout/Spacer';\nimport { COLORS } from '../../globalStyle/colors';\nimport { useAppState } from '../../core/redux/hooks';\n\n\nconst ACTION_BTN = css`\n width: 100px;\n height: 100%;\n font-size: 9px;\n text-decoration: none;\n text-align: center;\n overflow-wrap: break-spaces;\n text-transform: uppercase;\n box-sizing: border-box;\n transition: all .2s ease;\n`;\n\nconst styles = {\n root: css`\n \n `,\n icon: css`\n font-size: 22px;\n `,\n devResourceBtn: [\n FLEX_COLUMN,\n FLEX_CENTERED,\n ACTION_BTN,\n BTN_HOVER,\n css`\n color: ${COLORS.DARK_GREY};\n `,\n ],\n addBtn: [\n FLEX_COLUMN,\n FLEX_CENTERED,\n ACTION_BTN,\n BTN_HOVER,\n css`\n border: none !important;\n background-color: ${COLORS.BLUE};\n color: ${COLORS.WHITE};\n `,\n ],\n};\n\n\ntype Props = {\n routes: Routes;\n onClickToAdd: () => void;\n className?: string;\n};\n\n\n/**\n * MobileDevPlanItemActions: a component that renders a bar at the bottom of the screen with Dev Resources and Add Action\n * buttons.\n */\nconst MobileDevPlanItemActions: React.FC = props => {\n const hasDevResources = useAppState(state => !!state.devResources?.length);\n\n return (\n \n {\n hasDevResources && (\n \n \n \n \n \n )\n }\n \n \n );\n};\n\nexport default MobileDevPlanItemActions;\n","import * as React from 'react';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../../layout/flexBox';\nimport { css } from '@emotion/core';\nimport { onMobileDevice } from '../../../globalStyle/mediaQueries';\nimport { COLORS } from '../../../globalStyle/colors';\nimport Spacer from '../../../layout/Spacer';\n\n\nconst styles = {\n root: css`\n align-items: center;\n justify-content: space-between;\n\n ${onMobileDevice} {\n flex-direction: column-reverse;\n }\n `,\n content: css`\n align-items: baseline;\n margin-top: 20px;\n color: ${COLORS.DARK_GREY};\n\n ${onMobileDevice} {\n align-self: flex-start;\n }\n `,\n homeLink: css`\n text-decoration: none;\n color: ${COLORS.DARK_GREY};\n\n &:hover {\n opacity: .6;\n cursor:pointer;\n }\n `,\n title: css`\n font-weight: normal;\n font-size: 26px;\n ${onMobileDevice} {\n font-size: 18px;\n }\n margin: 0 5px;\n `,\n subtitle: css`\n font-size: 13px;\n margin: 0 5px;\n `,\n};\n\n\ntype Props = {\n title: string;\n subtitle: string;\n className?: string;\n};\n\n\n/**\n * CollaboratorPageHeader: a component that renders the page header used on all pages for dev plan collaborators\n */\nconst CollaboratorPageHeader: React.FC = props => (\n \n \n

    {props.title}

    \n \n

    {props.subtitle}

    \n
    \n
    \n);\n\nexport default CollaboratorPageHeader;\n","import * as React from 'react';\nimport { useMemo, useCallback } from 'react';\nimport * as R from 'ramda';\nimport { Str } from '../../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport { btnStyle } from '../../forms/styles/button';\nimport { COLORS } from '../../globalStyle/colors';\nimport { useRouteMatch, Link } from 'react-router-dom';\nimport { useRoutes, RouteTemplates } from '../../navigation/routes';\nimport { useAppState } from '../../core/redux/hooks';\nimport DevActionView from './devPlanAction/DevActionView';\nimport SurveyHeader from '../survey/SurveyHeader';\nimport { useMsgText } from '../../localization/hooks';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../layout/flexBox';\nimport { useDispatch } from 'react-redux';\nimport { addDevPlanActionAction } from './devPlanAction/api/addDevPlanActionAction';\nimport { useLoading } from '../../core/api/hooks';\nimport LocalBtn from '../../localization/LocalBtn';\nimport { ActionType } from '../../core/redux/actionType';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport DevPlanDescText from './DevPlanDescText';\nimport { onMobileDevice, HIDE_ON_MOBILE, SHOW_ON_MOBILE } from '../../globalStyle/mediaQueries';\nimport Msg from '../../localization/Msg';\nimport DevItemHeader from './DevItemHeader';\nimport MobileDevPlanItemActions from './MobileDevPlanItemActions';\nimport { useProjIdsForUserType } from '../../navigation/hooks';\nimport Spacer from '../../layout/Spacer';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faReply } from '@fortawesome/free-solid-svg-icons';\nimport { Z_INDEX } from '../../globalStyle/zIndex';\nimport { addDevItemCommentAction } from './collaboration/api/addDevItemCommentAction';\nimport { useCurrentUser } from '../../auth/hooks';\nimport { updateDevItemCommentAction } from './collaboration/api/updateDevItemCommentAction';\nimport { useCurrentCollaborator, useDevPlanCollaborationSetting } from './collaboration/hooks';\nimport { ParticipantEmailTag } from './collaboration/constants';\nimport CollaboratorPageHeader from './collaboration/CollaboratorPageHeader';\nimport { devItemSubtitleLocal, unreadCommentCount } from './collaboration/module';\nimport PortalAutoLayout from '../../layout/PortalAutoLayout';\nimport { sendDevItemCommentNotificationAction } from './collaboration/api/sendDevItemCommentNotificationAction';\nimport { useMount } from '../../core/hooks/useMount';\nimport { setDevItemCommentsReadAction } from './collaboration/api/setDevItemCommentsReadAction';\nimport { sendParticipantCommentNotificationAction } from './collaboration/api/sendParticipantCommentNotificationAction';\n\n\nconst styles = {\n root: css`\n `,\n headerContainer: css`\n flex-grow: 1;\n `,\n header: css`\n margin-bottom: 40px;\n\n ${onMobileDevice} {\n margin-top: 35px;\n margin-bottom: 35px;\n }\n `,\n itemHeader: css`\n margin-bottom: 15px;\n `,\n planDesc: css`\n margin-bottom: 35px;\n `,\n actionsTitle: css`\n color: ${COLORS.DARK_GREY};\n font-size: 12px;\n line-height: 15px;\n font-weight: bold;\n\n ${onMobileDevice} {\n display: block;\n margin-bottom: 10px;\n }\n `,\n horizRule: css`\n height: 1px;\n margin: 10px 0;\n border: none;\n background-color: ${COLORS.LIGHT_GREY};\n ${HIDE_ON_MOBILE};\n `,\n addActionBtn: [\n btnStyle.primary(COLORS.BLUE),\n css`\n display: inline-block;\n min-width: 190px;\n ${HIDE_ON_MOBILE};\n `,\n ],\n actionCards: [\n FLEX_COLUMN,\n css`\n align-items: stretch;\n\n ${onMobileDevice} {\n margin-bottom: 70px;\n }\n `,\n ],\n actionCard: css`\n margin-bottom: 35px;\n `,\n icon: css`\n color: ${COLORS.BLUE};\n font-size: 26px;\n padding-top: 8px;\n `,\n};\n\nconst itemAnimation = {\n initial: { opacity: 0, height: 0, overflow: 'hidden' },\n animate: { opacity: 1, height: 'auto', overflow: 'hidden' },\n exit: { opacity: 0, height: 0, overflow: 'hidden' },\n transition: { duration: 0.6 },\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * DevPlanItem: a component that renders the dev plan item page\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst DevPlanItem: React.FC = props => {\n const dispatch = useDispatch();\n const currentUser = useCurrentUser();\n const isParticipant = useMemo(() => !!currentUser, [currentUser]);\n\n const routeTemplate = useMemo(\n () => isParticipant\n ? RouteTemplates.ViewPlanItem\n : RouteTemplates.CollaboratorViewPlanItem,\n [isParticipant],\n );\n\n const match = useRouteMatch<{ itemId?: string }>(routeTemplate);\n const itemId = React.useMemo(() => +(match?.params.itemId ?? ''), [match]);\n\n const item = useAppState(state => state.devPlan?.items?.find(planItem => itemId === planItem.devItemId));\n const stateActions = useAppState(state => state.devPlan?.actionsByItemId?.[`${itemId}`] || []);\n const actionFields = useAppState(state => state.devPlan?.fieldsAnswers?.[`${item?.devItemId}`]);\n\n const actions = useMemo(() => R.sort((a, b) => b.devActionId - a.devActionId, stateActions), [stateActions]);\n\n const projIds = useProjIdsForUserType();\n const routes = useRoutes(projIds.participantId, projIds.projDisplayId, itemId);\n\n const project = useAppState(state => state.projectSummary);\n\n const devPlanProjectId = useMemo(() => project?.devPlanProjectId || projIds.projId, [projIds.projId, project]);\n\n const loading = useLoading(ActionType.AddDevPlanActionRequest);\n\n const title = useMsgText(Str.DevPlan);\n\n const onClickToAdd = React.useCallback(\n () => dispatch(addDevPlanActionAction(devPlanProjectId, item?.devItemId ?? -1)),\n [devPlanProjectId, item, dispatch],\n );\n\n const { DevPlan, CollaboratorDevPlan } = useRoutes(projIds.participantId, projIds.projDisplayId);\n\n const menuOpen = useAppState(state => state.openSideMenu);\n\n const locale = useAppState(state => state.locale);\n\n const currentCollaborator = useCurrentCollaborator();\n\n const collaborators = useAppState(state => state.devPlan?.collaborators?.[`${devPlanProjectId}`]);\n\n const currentCollaboratorEmail = useMemo(\n () => currentCollaborator?.email,\n [currentCollaborator],\n );\n\n const collaboratorEmails = useMemo(\n () => (collaborators ?? []).filter(c => c.accepted).map(c => c.email),\n [collaborators],\n );\n\n const onCommentAdded = useCallback(\n (devActionId: number, comment: string) => {\n if (!isParticipant) {\n dispatch(sendDevItemCommentNotificationAction(\n projIds.projId,\n projIds.participantId,\n itemId,\n devActionId,\n currentCollaborator?.currentProject.participantEmail || '',\n currentCollaborator?.email ?? '',\n R.without([currentCollaboratorEmail!], collaboratorEmails),\n comment,\n locale.lang.languageId,\n ));\n } else {\n dispatch(sendParticipantCommentNotificationAction(\n projIds.projId,\n projIds.participantId,\n itemId,\n devActionId,\n collaboratorEmails,\n comment,\n locale.lang.languageId,\n ));\n }\n },\n [\n collaboratorEmails,\n currentCollaborator,\n currentCollaboratorEmail,\n dispatch,\n isParticipant,\n itemId,\n locale.lang.languageId,\n projIds.participantId,\n projIds.projId,\n ],\n );\n\n\n const headerSubtitle = useMemo(\n () => devItemSubtitleLocal(locale.textDirection, currentCollaborator?.currentProject) || '',\n [currentCollaborator, locale.textDirection],\n );\n\n const commenterLabel = useMemo(\n () => isParticipant ? ParticipantEmailTag : (currentCollaborator?.email || ''),\n [currentCollaborator, isParticipant],\n );\n\n const collaborationEnabled = useDevPlanCollaborationSetting();\n\n const addComment = useCallback(\n (actionId: number, comment: string) => dispatch(\n addDevItemCommentAction(devPlanProjectId, projIds.participantId, itemId, actionId, commenterLabel, comment),\n ),\n [devPlanProjectId, dispatch, commenterLabel, itemId, projIds.participantId],\n );\n\n const updateComment = useCallback(\n (commentId: number, comment: string) => dispatch(\n updateDevItemCommentAction(devPlanProjectId, projIds.participantId, itemId, commentId, comment)),\n [devPlanProjectId, dispatch, itemId, projIds.participantId],\n );\n\n const comments = useAppState(state => state.devPlan?.comments?.[`${devPlanProjectId}`]?.[`${itemId}`] ?? []);\n const commentsById = useMemo(() => R.groupBy(c => `${c.devActionId}`, comments), [comments]);\n\n useMount(\n () => {\n if (isParticipant && unreadCommentCount(comments) > 0) {\n dispatch(setDevItemCommentsReadAction(projIds.projId, itemId));\n }\n },\n );\n\n if (!item) {\n return
    ;\n }\n\n return (\n \n {\n /* Header */\n isParticipant\n ? (\n \n ) : (\n <>\n \n \n \n )\n }\n\n \n \n \n \n \n \n \n \n \n \n\n {\n isParticipant ? (\n \n ) : (\n \n )\n }\n\n {/* Add Action */}\n \n\n
    \n {\n isParticipant && (\n <>\n \n
    \n \n )\n }\n\n {/* Actions */}\n \n { // Actions\n actions.map(\n (action, i) => (\n \n addComment(action.devActionId, comment)}\n onCommentAdded={comment => onCommentAdded(action.devActionId, comment)}\n updateComment={updateComment}\n devItemCompetencyId={item?.devItemCompetencyId}\n />\n \n ),\n )\n }\n \n\n \n\n {\n isParticipant && (\n \n )\n }\n
    \n );\n};\n\nexport default DevPlanItem;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faPlus } from '@fortawesome/free-solid-svg-icons';\nimport { COLORS } from '../../globalStyle/colors';\nimport { FLEX_ROW } from '../../layout/flexBox';\nimport Msg from '../../localization/Msg';\nimport { Str } from '../../localization/translationKeys';\nimport Spacer from '../../layout/Spacer';\nimport { Routes } from '../../navigation/routes';\nimport { Link } from 'react-router-dom';\n\n\nconst styles = {\n link: [\n FLEX_ROW,\n css`\n background-color: ${COLORS.WHITE};\n border-radius: 10px;\n padding: 25px;\n\n color: ${COLORS.MEDIUM_GREY};\n align-items: center;\n text-decoration: none;\n \n &:hover { \n color: ${COLORS.BLUE};\n }\n `,\n ],\n addIcon: css`\n font-size: 20px;\n `,\n msg: css`\n font-size: 12px;\n `,\n\n};\n\n\ntype Props = {\n routes: Routes;\n className?: string;\n};\n\n\n/**\n * AddDevItemCard: a component that renders a pretty link to the new plan item modal.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst AddDevItemCard: React.FC = props => (\n \n \n \n \n \n);\n\nexport default AddDevItemCard;\n","import * as R from 'ramda';\nimport { css, SerializedStyles } from '@emotion/core';\nimport { onMobileDevice } from '../globalStyle/mediaQueries';\n\n\n/**\n * This function makes a style you can apply to a container to give it mobile-friendly margins both in row and column\n * configurations.\n */\nexport const makeAdaptiveSpacing = (horizMarginPx: number, vertMarginPx?: number) => css`\n & > * {\n margin-right: ${horizMarginPx}px;\n }\n & > *:last-child {\n margin-right: 0;\n }\n\n ${onMobileDevice} {\n & > * {\n margin-right: 0;\n margin-bottom: ${vertMarginPx ?? horizMarginPx}px;\n }\n & > *:last-child {\n margin-right: 0;\n margin-bottom: 0;\n }\n }\n`;\n\n/**\n * Default layout margins\n */\nexport const ADAPTIVE_SPACING = makeAdaptiveSpacing(25);\n\n\n/**\n * Makes a style that truncates text at the given number of lines in webkit browsers\n */\nexport const ellipsizeAt = R.memoizeWith(\n (lines: number): string => `${lines}`,\n (lines: number): SerializedStyles => css`\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-line-clamp: ${lines}; \n -webkit-box-orient: vertical;\n word-break: break-word;\n hyphens: auto;\n overflow-wrap: break-word;\n `,\n);\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport { css } from '@emotion/core';\nimport Card from '../../layout/card/Card';\nimport CardHeader from '../../layout/card/CardHeader';\nimport { Str } from '../../localization/translationKeys';\nimport { useMsgText } from '../../localization/hooks';\nimport { FLEX_COLUMN } from '../../layout/flexBox';\nimport { btnStyle } from '../../forms/styles/button';\nimport { COLORS } from '../../globalStyle/colors';\nimport { Link } from 'react-router-dom';\nimport Msg from '../../localization/Msg';\nimport { ellipsizeAt } from '../../layout/styles';\nimport { DevPlanItem } from './models';\nimport LocalDiv from '../../localization/LocalDiv';\n\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n css`\n padding: 0;\n overflow: hidden;\n align-items: stretch;\n `,\n ],\n header: css`\n padding-top: 14px;\n margin-left: 14px;\n margin-right: 14px;\n margin-bottom: 40px;\n \n * { \n font-size: 12px !important;\n color: ${COLORS.MEDIUM_GREY} !important;\n } \n `,\n itemTitle: css`\n font-size: 14px;\n font-weight: bold;\n margin-left: 28px;\n margin-right: 28px;\n color: ${COLORS.DARK_GREY};\n `,\n itemDesc: [\n css`\n height: 85px;\n padding: 0 10px 10px; /* Inexplicably, not having padding breaks ellipsizing */\n margin: 0 18px 30px;\n \n font-size: 12px;\n line-height: 16px;\n color: ${COLORS.DARK_GREY};\n `,\n ellipsizeAt(6),\n ],\n itemDescPlaceholder: css`\n color: ${COLORS.FIELD_GREY};\n `,\n footer: [\n FLEX_COLUMN,\n css`\n align-items: stretch;\n `,\n ],\n actions: [\n css`\n font-size: 12px;\n text-align: center;\n padding: 10px;\n `,\n ],\n link: css`\n text-decoration: none;\n `,\n hasUnreadCommentsBtn: [\n btnStyle.primary(COLORS.RED),\n css`\n border-radius: 0;\n `,\n ],\n noUnreadCommentsBtn: [\n btnStyle.primary(COLORS.UNREAD_GREY),\n css`\n border-radius: 0;\n `,\n ],\n viewDetailsBtn: [\n btnStyle.primary(COLORS.DARK_GREY),\n css`\n border-radius: 0;\n `,\n ],\n};\n\n\ntype Props = {\n item: DevPlanItem;\n itemLocation: string;\n actionCount: number;\n\n collaborationEnabled: boolean;\n isParticipant: boolean;\n unreadCommentCount: number;\n\n className?: string;\n};\n\n\n/**\n * DevItemCard: a component that renders a summary of a dev plan item (title/desc + action count and a link to view)\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst DevItemCard: React.FC = props => {\n const title = useMsgText(Str.Devitem);\n const descPlaceholder = useMsgText(Str.DescriptionNotAdded);\n const unreadDefault = useMsgText(Str.UnreadCommentsMsg);\n const viewDefault = useMsgText(props.isParticipant ? Str.ViewEditDetails : Str.ViewDetails)\n\n const actionColors = useMemo(\n () => css`\n background-color: ${props.actionCount > 0 ? COLORS.LIGHTEST_GREY : COLORS.GREEN};\n color: ${props.actionCount > 0 ? COLORS.DARK_GREY : COLORS.WHITE};\n `,\n [props.actionCount],\n );\n\n return (\n \n \n\n {props.item.title}\n

    \n {props.item.description || descPlaceholder}\n

    \n\n
    \n \n \n {\n // TODO - the current design of the database only allows tracking read status for the participant\n // This will later be re-implemented to track unread comments for collaborators as well\n props.collaborationEnabled && (\n 0 ? styles.hasUnreadCommentsBtn : styles.noUnreadCommentsBtn}\n >\n \n \n )\n }\n \n \n \n \n
    \n
    \n );\n};\n\nexport default DevItemCard;\n","import * as React from 'react';\nimport { useMemo, useCallback } from 'react';\nimport { css } from '@emotion/core';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport { COLORS } from '../globalStyle/colors';\nimport Spacer from '../layout/Spacer';\nimport { useAppState } from '../core/redux/hooks';\n\n\nconst THUMB_COLOR = COLORS.WHITE;\nconst CHECKED_BG_COLOR = COLORS.BLUE;\nconst UNCHECKED_BG_COLOR = COLORS.LIGHT_GREY;\nconst TEXT_COLOR = COLORS.DARK_GREY;\n\nconst styles = {\n label: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n \n user-select: none;\n cursor: pointer;\n `,\n hiddenInput: css`\n opacity: 0;\n width: 0;\n height: 0;\n margin: 0;\n padding: 0;\n `,\n visibleInputContainer: css`\n position: relative;\n width: 34px;\n height: 20px;\n flex-basis: 34px;\n flex-shrink: 0;\n flex-grow: 0;\n `,\n visibleInput: css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n \n border-radius: 45px;\n transition: .4s;\n pointer-events: none;\n \n background-color: ${UNCHECKED_BG_COLOR};\n\n /* The little thumb circle */ \n &:before {\n position: absolute;\n left: 2px;\n bottom: 2px;\n width: 16px;\n height: 16px;\n \n border-radius: 50%;\n background-color: ${THUMB_COLOR};\n transition: .4s;\n content: \"\";\n }\n `,\n checked: css`\n background-color: ${CHECKED_BG_COLOR};\n\n /* Moves the little thumb when checked */\n &:before {\n transform: translateX(14px);\n }\n `,\n disabled: css`\n opacity: .4;\n `,\n onOffMsg: css`\n font-size: 13px;\n color: ${TEXT_COLOR}\n `,\n};\n\n\nconst defaultGetTxt = (isOn: boolean): Str => isOn ? Str.On : Str.Off;\n\n\ntype Props = {\n value: boolean;\n onChange: (newValue: boolean) => void;\n disable?: boolean;\n getTxt?: (isOn: boolean) => Str;\n className?: string;\n}\n\n\n/**\n * Toggle: a component that renders a little thumb toggle element looking similar to an iOS toggle.\n */\nconst Toggle: React.FC = props => {\n const dir = useAppState(state => state.locale.textDirection);\n\n const msg = useMemo(() => (props.getTxt ?? defaultGetTxt)(props.value), [props.getTxt, props.value]);\n const onChange = useCallback((event) => props.onChange(event.target.checked), [props]);\n\n return (\n \n );\n};\n\nexport default Toggle;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport Card from '../../../layout/card/Card';\nimport CardHeader from '../../../layout/card/CardHeader';\nimport { useMsgText } from '../../../localization/hooks';\nimport { Str } from '../../../localization/translationKeys';\nimport { faBell } from '@fortawesome/free-solid-svg-icons';\nimport Msg from '../../../localization/Msg';\nimport { COLORS } from '../../../globalStyle/colors';\nimport Toggle from '../../../forms/Toggle';\n\n\nconst styles = {\n root: css`\n padding: 0;\n overflow: hidden;\n `,\n header: css`\n padding-top: 14px;\n margin-left: 14px;\n margin-right: 14px;\n margin-bottom: 28px;\n `,\n reminderTxt: css`\n display: block;\n margin-left: 28px;\n margin-right: 28px;\n margin-bottom: 14px;\n color: ${COLORS.DARK_GREY};\n `,\n reminderToggle: css`\n margin-left: 28px;\n margin-right: 28px;\n margin-bottom: 28px;\n `,\n};\n\n\ntype Props = {\n remindersEnabled: boolean;\n onChangeRemindersEnabled: (newValue: boolean) => void;\n className?: string;\n};\n\n\n/**\n * DevPlanRemindersCard: a component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst DevPlanRemindersCard: React.FC = props => {\n const title = useMsgText(Str.EmailReminders);\n\n return (\n \n \n\n \n\n \n \n );\n};\n\nexport default DevPlanRemindersCard;\n","import * as React from 'react';\nimport { useState, useCallback, useEffect } from 'react';\nimport * as yup from 'yup';\nimport { css } from '@emotion/core';\nimport { FLEX_COLUMN } from '../../../layout/flexBox';\nimport { SELECT } from '../../../forms/styles/select';\nimport { btnStyle } from '../../../forms/styles/button';\nimport { COLORS } from '../../../globalStyle/colors';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport { Str } from '../../../localization/translationKeys';\nimport { INPUT } from '../../../forms/styles/input';\nimport { useMsgText } from '../../../localization/hooks';\nimport LocalSelect from '../../../localization/LocalSelect';\nimport { useDispatch } from 'react-redux';\nimport { useLoading } from '../../../core/api/hooks';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { Rater } from '../../survey/raters/models';\nimport LocalDropdownOption from '../../../localization/LocalDropdownOption';\nimport { clearLastSentEmailAction } from '../devPlanAction/clearLastSentEmailAction';\nimport { TIME } from '../../../language/time';\nimport { useAppState } from '../../../core/redux/hooks';\n\n\nconst DROP_DOWN_OPTION_ID_OTHER = -2;\n\nconst VERT_MARGIN = css`\n margin-bottom: 14px;\n`;\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n css`\n padding: 14px;\n background-color: ${COLORS.LIGHTEST_GREY};\n border-radius: 0 0 10px 10px;\n `,\n ],\n selectPlaceholder: css`\n color: ${COLORS.FIELD_GREY};\n `,\n levelSelect: [\n SELECT,\n VERT_MARGIN,\n css`\n border: none;\n `,\n ],\n emailInput: [\n VERT_MARGIN,\n INPUT(),\n css`\n border: none;\n `,\n ],\n commentsInput: [\n VERT_MARGIN,\n INPUT(),\n css`\n height: 160px;\n padding: 10px;\n resize: none;\n border: none;\n `,\n ],\n submitBtn: [\n btnStyle.primary(COLORS.DARK_GREY),\n css`\n\n `,\n ],\n};\n\n\ntype Props = {\n participantId: number;\n projectId: number;\n emailingRequired: boolean;\n raters: Rater[];\n onSent?: (email: string) => void;\n\n onClickSubmitBtn: (email: string, comment?: string) => void;\n submitBtnMsg: string;\n\n className?: string;\n};\n\n\n/**\n * EmailDevPlanForm: a component that handles emailing dev plans to reviewers\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst EmailDevPlanForm: React.FC = props => {\n const dispatch = useDispatch();\n\n const selectPlaceholder = useMsgText(Str.ChooseOne);\n const emailPlaceholder = useMsgText(Str.Email);\n const commentPlaceholder = useMsgText(Str.OptionalComments);\n\n const loading = useLoading(ActionType.SendDevPlanRequest);\n\n const [selection, setSelection] = useState(undefined);\n const [email, setEmail] = useState(undefined);\n const [comments, setComments] = useState(undefined);\n const [enableSubmit, setEnableSubmit] = useState(false);\n const [enableEmail, setEnableEmail] = useState(!props.emailingRequired);\n\n const onChangeSelection = useCallback(\n event => {\n const raterId = +event.target.value;\n setSelection(raterId);\n\n if (raterId === DROP_DOWN_OPTION_ID_OTHER) {\n setEnableEmail(true);\n setEmail('');\n return;\n }\n\n setEnableEmail(false);\n const rater = props.raters.find(r => r.raterId === raterId);\n rater && setEmail(rater.email);\n },\n [props.raters, setSelection],\n );\n\n const onChangeEmail = useCallback(event => setEmail(event.target.value), [setEmail]);\n const onChangeComments = useCallback(event => setComments(event.target.value), [setComments]);\n\n const onSubmit = useCallback(\n event => {\n event.preventDefault();\n\n if (loading || !email) {\n return;\n }\n\n props.onClickSubmitBtn(email, comments);\n\n // Clear the sent message after 5 seconds\n window.setTimeout(() => dispatch(clearLastSentEmailAction()), 5 * TIME.S);\n\n props.onSent?.(email);\n },\n [email, comments, props, loading, dispatch],\n );\n\n useEffect(\n () => {\n yup\n .string()\n .email()\n .required()\n .validate(email)\n .then(() => setEnableSubmit(true))\n .catch(() => setEnableSubmit(false));\n },\n [email, setEnableSubmit],\n );\n \n const dir = useAppState(state => state.locale.textDirection);\n\n return (\n \n { // Show rater level drop-down when emailing is required\n props.emailingRequired && (\n \n \n {\n props.raters.map(rater => )\n }\n \n \n )\n }\n\n \n\n \n\n \n \n );\n};\n\nexport default EmailDevPlanForm;\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport { css } from '@emotion/core';\nimport Card from '../../../layout/card/Card';\nimport CardHeader from '../../../layout/card/CardHeader';\nimport { faExclamationTriangle, faEnvelope, faCheck } from '@fortawesome/free-solid-svg-icons';\nimport { useMsgText } from '../../../localization/hooks';\nimport { Str } from '../../../localization/translationKeys';\nimport BulletedMsg from '../../../layout/BulletedMsg';\nimport { COLORS } from '../../../globalStyle/colors';\nimport EmailDevPlanForm from './EmailDevPlanForm';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { isNilOrEmpty } from '../../../language/module';\nimport ClamShell from '../../../layout/ClamShell';\nimport { Rater } from '../../survey/raters/models';\n\n\nconst contentSideMargin = css`\n margin-left: 14px;\n margin-right: 14px;\n`;\n\nconst styles = {\n root: css`\n padding: 0;\n overflow: hidden;\n `,\n header: css`\n padding-top: 14px;\n margin-left: 14px;\n margin-right: 14px;\n margin-bottom: 28px;\n `,\n emailRequired: {\n icon: css`\n font-size: 24px;\n `,\n txt: [\n contentSideMargin,\n css`\n color: ${COLORS.GREEN};\n margin-bottom: 18px;\n `,\n ],\n },\n emailSent: {\n icon: css`\n font-size: 24px;\n color: ${COLORS.BLUE};\n `,\n txt: [\n contentSideMargin,\n css`\n color: ${COLORS.DARK_GREY};\n margin-bottom: 18px;\n `,\n ],\n },\n emailForm: [\n contentSideMargin,\n css`\n margin-bottom: 14px;\n `,\n ],\n};\n\n\ntype Props = {\n participantId: number;\n projectId: number;\n emailingRequired: boolean;\n raters: Rater[];\n\n onClickSubmitBtn: (email: string, comment?: string) => void;\n submitBtnMsg: string;\n\n collaborationEnabled: boolean;\n\n className?: string;\n};\n\n\n/**\n * EmailDevPlanCard: a component that renders a form and header in a card for sending dev plans to people by email.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst EmailDevPlanCard: React.FC = props => {\n const title = useMsgText(props.collaborationEnabled ? Str.SharePlan : Str.EmailPlan);\n\n const lastEmailed = useAppState(state => state.devPlan?.lastEmailRecipient);\n\n const requiredLevelId = useAppState(state => state.projectSummary?.developmentPlanEmailLevelId);\n const levelName = useAppState(state => state.projectSummary?.devPlanEmailLevelName ?? '');\n const raters = useMemo(\n () => props.raters.filter(rater => rater.levelId === requiredLevelId && !isNilOrEmpty(rater.email)),\n [requiredLevelId, props],\n );\n\n const showSentMsg = useMemo(\n () => !isNilOrEmpty(lastEmailed),\n [lastEmailed],\n );\n\n const sentMsg = useMsgText(\n props.collaborationEnabled ? Str.InviteSent : Str.PlanSentTo,\n '',\n { 'email': lastEmailed },\n );\n\n const reqMsg = useMsgText(\n props.collaborationEnabled ? Str.DevPlanShareMsg : Str.DevPlanEmailMsg,\n '',\n { 'levelName': levelName },\n );\n\n return (\n \n \n\n {/* Email Required */}\n \n \n \n\n { /* Email Sent */}\n \n \n \n\n \n \n );\n};\n\nexport default EmailDevPlanCard;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport MobileToolbar from '../../layout/mobile/MobileToolbar';\nimport { Str } from '../../localization/translationKeys';\nimport { faPlus, faBell, faEnvelope } from '@fortawesome/free-solid-svg-icons';\nimport { Link } from 'react-router-dom';\nimport { Routes } from '../../navigation/routes';\nimport Msg from '../../localization/Msg';\nimport { FLEX_COLUMN, FLEX_CENTERED } from '../../layout/flexBox';\nimport { BTN_HOVER } from '../../forms/styles/button';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport Spacer from '../../layout/Spacer';\nimport { COLORS } from '../../globalStyle/colors';\n\n\nconst ACTION_BTN = css`\n width: 100px;\n height: 100%;\n font-size: 9px;\n text-decoration: none;\n text-align: center;\n overflow-wrap: break-spaces;\n text-transform: uppercase;\n box-sizing: border-box;\n transition: all .2s ease;\n`;\n\nconst styles = {\n root: css`\n \n `,\n icon: css`\n font-size: 22px;\n `,\n devResourceBtn: [\n FLEX_COLUMN,\n FLEX_CENTERED,\n ACTION_BTN,\n BTN_HOVER,\n css`\n color: ${COLORS.DARK_GREY};\n `,\n ],\n addBtn: [\n FLEX_COLUMN,\n FLEX_CENTERED,\n ACTION_BTN,\n BTN_HOVER,\n css`\n border: none !important;\n background-color: ${COLORS.BLUE};\n color: ${COLORS.WHITE};\n `,\n ],\n};\n\n\ntype Props = {\n collaborationEnabled: boolean;\n routes: Routes;\n onClickToAdd: () => void;\n className?: string;\n};\n\n\n/**\n * MobileDevPlanActionBar: a component that renders a bar at the bottom of the screen with Dev Resources and Add Action\n * buttons.\n */\nconst MobileDevPlanActionBar: React.FC = props => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n);\n\nexport default MobileDevPlanActionBar;\n","import * as React from 'react';\nimport { useMemo, useCallback } from 'react';\nimport { css } from '@emotion/core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { DevPlanCollaborator } from './models';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { faCheck, faBan, faTrash } from '@fortawesome/free-solid-svg-icons';\nimport Msg from '../../../localization/Msg';\nimport ActionIcon from '../../../layout/ActionIcon';\nimport { FLEX_COLUMN } from '../../../layout/flexBox';\nimport Spacer from '../../../layout/Spacer';\nimport { useMsgText } from '../../../localization/hooks';\nimport { Str } from '../../../localization/translationKeys';\nimport ClamShell from '../../../layout/ClamShell';\nimport { useLoading } from '../../../core/api/hooks';\nimport { ActionType } from '../../../core/redux/actionType';\n\n\nconst styles = {\n emailAndStatus: {\n root: [\n FLEX_COLUMN,\n ],\n },\n separator: css`\n margin: 0 auto;\n `,\n deleteIcon: {\n root: [\n css`\n cursor: pointer;\n `,\n ],\n icon: css`\n color: ${COLORS.DARK_GREY};\n `,\n },\n red: css`\n color: ${COLORS.RED};\n `,\n green: css`\n color: ${COLORS.GREEN};\n `,\n};\n\n\ntype Props = {\n projectId: number;\n collaborator: DevPlanCollaborator;\n deleteCollaborator: () => void;\n className?: string;\n}\n\n\n/**\n * CollaboratorListItem: a component that represents a dev plan collaborator and provides visual feedback regarding\n * their current invitation acceptance status (i.e., whether they've accessed the dev plan yet)\n */\nconst CollaboratorListItem: React.FC = ({ projectId, collaborator, deleteCollaborator, className }) => {\n const handleClick = useCallback(\n event => {\n event.preventDefault();\n deleteCollaborator();\n },\n [deleteCollaborator],\n );\n\n const acceptedMsg = useMsgText(Str.Accepted);\n const notAcceptedMsg = useMsgText(Str.NotAccepted);\n\n const { statusColor, statusIcon, statusMsg } = useMemo(\n () =>\n collaborator.accepted\n ? ({\n statusColor: styles.green,\n statusIcon: faCheck,\n statusMsg: acceptedMsg,\n }) : ({\n statusColor: styles.red,\n statusIcon: faBan,\n statusMsg: notAcceptedMsg,\n }),\n [acceptedMsg, collaborator.accepted, notAcceptedMsg],\n );\n\n const deletingCollaborator = useLoading(\n ActionType.DeleteDevPlanCollaboratorRequest,\n `${projectId}-${collaborator.email}`,\n );\n\n return (\n \n \n \n \n \n \n {collaborator.email}\n \n \n \n
    \n \n \n \n \n );\n};\n\nexport default CollaboratorListItem;\n","import * as React from 'react';\nimport { css } from '@emotion/core';\nimport { DevPlanCollaborator } from './models';\nimport CollaboratorListItem from './CollaboratorListItem';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport { FLEX_ROW } from '../../../layout/flexBox';\nimport { COLORS } from '../../../globalStyle/colors';\n\n\nconst styles = {\n listItem: [\n FLEX_ROW,\n css`\n height: 72px;\n align-items: center;\n justify-content: stretch;\n border-bottom: 1px solid;\n border-image-slice: 1;\n border-image-source: linear-gradient(to right, transparent, ${COLORS.PROJECTBAR_GREY} 3% 97%, transparent);\n `,\n ],\n};\n\n\ntype Props = {\n projectId: number;\n collaborators: DevPlanCollaborator[];\n deleteCollaborator: (email: string) => void;\n className?: string;\n}\n\n\nconst renderItems = (\n projectId: number,\n collaborators: DevPlanCollaborator[],\n deleteCollaborator: (email: string) => void,\n) => collaborators.map(c => (\n deleteCollaborator(c.email)}\n css={styles.listItem}\n />\n ),\n);\n\n\n/**\n * CollaboratorsList: a component that provides a list of all current dev plan collaborators and indicates whether they\n * have utilized their invitation to view the dev plan\n */\nconst CollaboratorsList: React.FC = ({ projectId, collaborators, deleteCollaborator, className }) => (\n \n {\n renderItems(projectId, collaborators, deleteCollaborator)\n }\n \n);\n\nexport default CollaboratorsList;\n","import * as React from 'react';\nimport { useCallback, useMemo } from 'react';\nimport * as R from 'ramda';\nimport AddDevItemCard from './AddDevItemCard';\nimport SurveyHeader from '../survey/SurveyHeader';\nimport { useMsgText } from '../../localization/hooks';\nimport { Str } from '../../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport DevItemCard from './DevItemCard';\nimport DevPlanRemindersCard from './reminders/DevPlanRemindersCard';\nimport EmailDevPlanCard from './emailPlan/EmailDevPlanCard';\nimport { useRoutes, Routes } from '../../navigation/routes';\nimport { useAppState } from '../../core/redux/hooks';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../layout/flexBox';\nimport LocalDiv from '../../localization/LocalDiv';\nimport { useDispatch } from 'react-redux';\nimport { setRemindersOnAction } from './reminders/setRemindersOnAction';\nimport { onMobileDevice } from '../../globalStyle/mediaQueries';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { useWindowSize } from '../../core/hooks/useWindowSize';\nimport MobileDevPlanActionBar from './MobileDevPlanActionBar';\nimport ClamShell from '../../layout/ClamShell';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\nimport Spacer from '../../layout/Spacer';\nimport Msg from '../../localization/Msg';\nimport { COLORS } from '../../globalStyle/colors';\nimport { ProjStr } from '../messages/ProjStr';\nimport ProjMsg from '../messages/ProjMsg';\nimport { useMount } from '../../core/hooks/useMount';\nimport { setDevPlanViewedAction } from './api/setDevPlanViewedAction';\nimport { unreadCommentCount, devItemSubtitleLocal } from './collaboration/module';\nimport { useProjIdsForUserType } from '../../navigation/hooks';\nimport { Map } from '../../language/models';\nimport { DevItemComment } from './collaboration/models';\nimport { DevPlanItem, DevPlanAction } from './models';\nimport {\n useAddCollaboratorModalProps,\n useDeleteCollaboratorModalProps,\n useDevPlanCollaborationSetting, useCurrentCollaborator,\n} from './collaboration/hooks';\nimport ConfirmationModal from '../../layout/modal/ConfirmationModal';\nimport CollaboratorsList from './collaboration/CollaboratorsList';\nimport { sendDevPlanAction } from './devPlanAction/api/sendDevPlanAction';\nimport { useCurrentUser } from '../../auth/hooks';\nimport CollaboratorPageHeader from './collaboration/CollaboratorPageHeader';\nimport PortalAutoLayout from '../../layout/PortalAutoLayout';\nimport { setDevPlanCollaboratorAcceptedAction } from './collaboration/api/setDevPlanCollaboratorAcceptedAction';\n\n\nconst itemAnimation = {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.6, ease: [0.04, 0.62, 0.23, 0.98] },\n};\n\n\nconst styles = {\n root: css`\n `,\n header: css`\n margin-bottom: 40px;\n \n ${onMobileDevice} {\n margin-top: 35px;\n margin-bottom: 35px;\n }\n `,\n allCards: [\n FLEX_ROW,\n css`\n align-items: flex-start;\n flex-wrap: wrap;\n \n ${onMobileDevice} { \n margin-bottom: 70px;\n }\n `,\n ],\n itemCards: [\n FLEX_ROW,\n css`\n align-items: flex-start;\n flex-wrap: wrap;\n flex-shrink: 1;\n flex-grow: 1;\n flex-basis: 0;\n `,\n ],\n sharingCol: css`\n width: 290px;\n flex-basis: 290px;\n flex-shrink: 0;\n `,\n card: css`\n width: 270px;\n flex-basis: 270px;\n margin: 10px;\n flex-shrink: 0;\n flex-grow: 0;\n box-sizing: border-box;\n \n transition: all .5s ease;\n `,\n msgBar: css`\n background-color: ${COLORS.WHITE};\n padding: 8px;\n border: 0 none;\n min-height: 35px;\n align-items: center;\n margin: auto 8px;\n border-radius: 8px;\n `,\n infoMsg: css`\n color: ${COLORS.GREEN};\n background-color: transparent;\n `,\n instructions: css`\n margin: 0 0 20px 8px;\n `,\n collaborators: [\n FLEX_COLUMN,\n css`\n margin: 10px;\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\nconst renderDevItemCards = (\n devItems: DevPlanItem[],\n projectComments: Map,\n actions: Map,\n routes: Routes,\n collaborationEnabled: boolean,\n isParticipant: boolean,\n) => devItems.map(item => {\n const itemComments: DevItemComment[] | undefined = R.path([`${item.devItemId}`], projectComments);\n const itemActions: DevPlanAction[] | undefined = R.path([`${item.devItemId}`], actions);\n\n const itemRouteTemplate = isParticipant ? routes.ViewPlanItem : routes.CollaboratorViewPlanItem;\n\n return (\n \n \n \n );\n },\n);\n\n\n/**\n * DevPlanView: a component that renders the dev plan page\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst DevPlanView: React.FC = props => {\n const dispatch = useDispatch();\n\n const isParticipant = !!useCurrentUser();\n\n const { isMobile } = useWindowSize();\n\n const pageTitle = useMsgText(Str.DevPlan);\n\n const { participantId, projDisplayId, projId } = useProjIdsForUserType();\n\n const routes = useRoutes(participantId, projDisplayId);\n\n // Reminders\n const remindersOn = useAppState(state => !!state.devPlan?.emailRemindersOn);\n const setRemindersOn = useCallback(\n (newValue: boolean) => dispatch(setRemindersOnAction(projId, participantId, newValue)),\n [participantId, projId, dispatch],\n );\n\n // Dev Items\n const devItems = useAppState(state => state.devPlan?.items ?? []);\n const actions = useAppState(state => state.devPlan?.actionsByItemId);\n\n // Email Dev Plan\n const emailRequired = useAppState(\n state => !state.projectSummary?.devPlanEmailSent && !!state.projectSummary?.developmentPlanEmailLevelId,\n );\n\n const raterMap = useAppState(state => state.projectRaters?.[`${projId}`] ?? []);\n const raters = useMemo(() => Object.values(raterMap), [raterMap]);\n\n const project = useAppState(state => state.projectSummary);\n const itemsToTrack = project?.developmentPlanGoalsToTrack ?? 0;\n const showItems = itemsToTrack > 0 && devItems.length < itemsToTrack;\n const showEmail = (project?.developmentPlanEmailLevelId ?? 0) > 0 && !project?.devPlanEmailSent;\n\n const devPlanProjectId = project?.devPlanProjectId ?? projId;\n\n useMount(() => {\n dispatch(setDevPlanViewedAction(true));\n\n if (!currentCollaborator) {\n return;\n }\n\n if (currentCollaborator.currentProject.accepted) {\n return;\n }\n\n dispatch(setDevPlanCollaboratorAcceptedAction(projId, participantId, currentCollaborator.email));\n });\n\n // Collaboration\n const collaborationEnabled = useDevPlanCollaborationSetting();\n const collaborators = useAppState(state => state.devPlan?.collaborators?.[`${devPlanProjectId}`]);\n const comments = useAppState(state => state.devPlan?.comments?.[`${devPlanProjectId}`]);\n\n const {\n addCollaboratorModalVisible,\n showAddCollaboratorModal,\n dismissAddCollaboratorModal,\n confirmAddCollaboratorMsg,\n onConfirmAddCollaborator,\n } = useAddCollaboratorModalProps(devPlanProjectId, participantId, dispatch);\n\n const {\n deleteCollaboratorModalVisible,\n showDeleteCollaboratorModal,\n dismissDeleteCollaboratorModal,\n confirmDeleteCollaboratorMsg,\n onConfirmDeleteCollaborator,\n } = useDeleteCollaboratorModalProps(devPlanProjectId, participantId, dispatch);\n\n const sendDevPlan = useCallback(\n (email: string, comment?: string) => {\n dispatch(sendDevPlanAction(projId, participantId, email, comment));\n },\n [dispatch, participantId, projId],\n );\n\n const onClickSendEmailBtn = useCallback(collaborationEnabled ? showAddCollaboratorModal : sendDevPlan, []);\n\n const sendEmailBtnMsg = useMemo(() => collaborationEnabled ? Str.InviteShare : Str.Send, [collaborationEnabled]);\n\n const participantCanAdd = useMemo(() => \n project?.developmentPlanAddManual || project?.developmentPlanAddCompetenciesFromDevPlan,\n [project],\n )\n\n const dir = useAppState(state => state.locale.textDirection);\n\n const currentCollaborator = useCurrentCollaborator();\n\n const headerSubtitle = useMemo(\n () => devItemSubtitleLocal(dir, currentCollaborator?.currentProject) || '',\n [currentCollaborator, dir],\n );\n\n return (\n \n
    \n {\n /* Page Header */\n isParticipant\n ? (\n <>\n \n \n \n \n \n \n \n \n {\n showItems && showEmail\n ? \n : showItems\n ? \n : \n }\n \n \n \n ) : (\n <>\n \n \n \n )\n }\n \n
    \n \n {\n renderDevItemCards(\n devItems,\n comments ?? {},\n actions ?? {},\n routes,\n collaborationEnabled,\n isParticipant,\n )\n }\n {\n isParticipant && participantCanAdd && (\n \n \n \n )\n }\n \n
    \n\n {\n isParticipant && (\n isMobile\n ? (\n \n )\n : (\n
    \n \n \n \n
    \n )\n )\n }\n
    \n
    \n {\n addCollaboratorModalVisible && (\n \n )\n }\n {\n deleteCollaboratorModalVisible && (\n \n )\n }\n
    \n );\n};\n\nexport default DevPlanView;\n","import * as React from 'react';\nimport { useCallback, useMemo } from 'react';\nimport { css } from '@emotion/core';\nimport { useMsgText } from '../../../localization/hooks';\nimport { Str } from '../../../localization/translationKeys';\nimport ModalHeader from '../../../layout/modal/ModalHeader';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport Modal from '../../../layout/modal/Modal';\nimport { FLEX_COLUMN } from '../../../layout/flexBox';\nimport { useHistory } from 'react-router-dom';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { isNilOrEmpty, doNothing } from '../../../language/module';\nimport { useProjIds } from '../../../navigation/hooks';\nimport EmailDevPlanForm from './EmailDevPlanForm';\nimport { sendDevPlanAction } from '../devPlanAction/api/sendDevPlanAction';\nimport { useDispatch } from 'react-redux';\nimport { useAddCollaboratorModalProps, useDevPlanCollaborationSetting } from '../collaboration/hooks';\nimport ConfirmationModal from '../../../layout/modal/ConfirmationModal';\n\n\nconst styles = {\n modal: [\n FLEX_COLUMN,\n css`\n min-height: 0;\n height: auto;\n `,\n ],\n root: [\n FLEX_COLUMN,\n css`\n\n `,\n ],\n formRoot: css`\n background-color: transparent;\n `,\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * EmailDevPlanModal: a modal component that renders a modal with the email form\n */\nconst EmailDevPlanModal: React.FC = props => {\n const history = useHistory();\n\n const dispatch = useDispatch();\n\n const projIds = useProjIds();\n\n const emailRequired = useAppState(state => !!state.projectSummary?.developmentPlanEmailLevelId);\n const requiredLevelId = useAppState(state => state.projectSummary?.developmentPlanEmailLevelId);\n const raterMap = useAppState(state => state.projectRaters?.[`${projIds.projId}`] ?? []);\n\n const raters = useMemo(\n () => Object.values(raterMap).filter(rater => rater.levelId === requiredLevelId && !isNilOrEmpty(rater.email)),\n [raterMap, requiredLevelId],\n );\n\n const dismiss = useCallback(() => history.goBack(), [history]);\n\n const collaborationEnabled = useDevPlanCollaborationSetting();\n\n const title = useMsgText(collaborationEnabled ? Str.SharePlan : Str.EmailPlan);\n const sendEmailBtnMsg = useMemo(() => collaborationEnabled ? Str.InviteShare : Str.Send, [collaborationEnabled]);\n\n const sendDevPlan = useCallback(\n (email: string, comment?: string) => {\n dispatch(sendDevPlanAction(projIds.projId, projIds.participantId, email, comment));\n },\n [dispatch, projIds.participantId, projIds.projId],\n );\n\n const project = useAppState(state => state.projectSummary);\n const devPlanProjectId = project?.devPlanProjectId ?? projIds.projId;\n\n const {\n addCollaboratorModalVisible,\n showAddCollaboratorModal,\n dismissAddCollaboratorModal,\n confirmAddCollaboratorMsg,\n onConfirmAddCollaborator,\n } = useAddCollaboratorModalProps(devPlanProjectId, projIds.participantId, dispatch);\n\n const onClickSendEmailBtn = useCallback(collaborationEnabled ? showAddCollaboratorModal : sendDevPlan, []);\n\n const addCollaborator = useCallback(\n () => {\n onConfirmAddCollaborator();\n dismiss();\n },\n [dismiss, onConfirmAddCollaborator],\n );\n\n const cancelAddCollaborator = useCallback(\n () => {\n dismissAddCollaboratorModal();\n dismiss();\n },\n [dismiss, dismissAddCollaboratorModal],\n );\n\n return (\n \n \n \n \n \n {\n addCollaboratorModalVisible && (\n \n )\n }\n \n );\n};\n\nexport default EmailDevPlanModal;\n","import * as React from 'react';\nimport { useCallback, useState } from 'react';\nimport { css } from '@emotion/core';\nimport { useMsgText } from '../../../localization/hooks';\nimport Toggle from '../../../forms/Toggle';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { setRemindersOnAction } from './setRemindersOnAction';\nimport { useHistory } from 'react-router-dom';\nimport { useDispatch } from 'react-redux';\nimport { useProjIds } from '../../../navigation/hooks';\nimport { Str } from '../../../localization/translationKeys';\nimport Msg from '../../../localization/Msg';\nimport ModalHeader from '../../../layout/modal/ModalHeader';\nimport LocalDiv from '../../../localization/LocalDiv';\nimport Modal from '../../../layout/modal/Modal';\nimport { FLEX_COLUMN } from '../../../layout/flexBox';\nimport { COLORS } from '../../../globalStyle/colors';\nimport LocalBtn from '../../../localization/LocalBtn';\nimport { btnStyle } from '../../../forms/styles/button';\n\n\nconst styles = {\n modal: [\n FLEX_COLUMN,\n css`\n min-height: 0;\n height: auto;\n `,\n ],\n root: [\n FLEX_COLUMN,\n css`\n padding: 15px;\n\n `,\n ],\n reminderTxt: css`\n display: block;\n margin-left: 28px;\n margin-right: 28px;\n margin-bottom: 14px;\n color: ${COLORS.DARK_GREY};\n `,\n reminderToggle: css`\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 28px;\n `,\n saveBtn: [\n btnStyle.primary(COLORS.BLUE),\n css`\n align-self: flex-end;\n min-width: 135px;\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * DevPlanRemindersModal: a modal component that renders the dev plan reminders on/off toggle\n */\nconst DevPlanRemindersModal: React.FC = props => {\n const history = useHistory();\n const dispatch = useDispatch();\n\n const projIds = useProjIds();\n\n const title = useMsgText(Str.EmailReminders);\n\n const remindersOn = useAppState(state => !!state.devPlan?.emailRemindersOn);\n const [dirtyOn, setDirtyOn] = useState(remindersOn);\n\n const dismiss = useCallback(() => history.goBack(), [history]);\n\n const dispatchNewValue = useCallback(\n (newValue) => dispatch(setRemindersOnAction(projIds.projId, projIds.participantId, newValue)),\n [projIds.participantId, projIds.projId, dispatch],\n );\n\n const setRemindersOn = useCallback(\n () => {\n dispatchNewValue(dirtyOn);\n dismiss();\n },\n [dirtyOn, dispatchNewValue, dismiss],\n );\n\n return (\n \n \n \n \n\n \n\n \n \n \n );\n};\n\nexport default DevPlanRemindersModal;\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport { css } from '@emotion/core';\nimport { Switch, Route } from 'react-router-dom';\nimport { RouteTemplates } from '../../../navigation/routes';\nimport AddDevPlanItemModal from '../AddDevPlanItemModal';\nimport EditDevPlanItemModal from '../EditDevPlanItemModal';\nimport DevPlanItem from '../DevPlanItem';\nimport DevPlanView from '../DevPlanView';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { Dispatch } from 'redux';\nimport { getRemindersOnAction } from '../reminders/getRemindersOnAction';\nimport { getDevPlanItemsAction } from '../api/getDevPlanItemsAction';\nimport { getDevPlanActionsAction } from './api/getDevPlanActionsAction';\nimport { useMount } from '../../../core/hooks/useMount';\nimport { useDispatch } from 'react-redux';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { PAGE_BG, PAGE_HEIGHT } from '../../../layout/pageStyle';\nimport { FLEX_COLUMN, FLEX_CENTERED } from '../../../layout/flexBox';\nimport { Spinner } from '../../../loading/Spinner';\nimport { COLORS } from '../../../globalStyle/colors';\nimport ErrorMsg from '../../../error/ErrorMsg';\nimport { Str } from '../../../localization/translationKeys';\nimport { useAnyLoading, useAnyError } from '../../../core/api/hooks';\nimport { getDevPlanFieldsAndAnswersAction } from './api/getDevPlanFieldsAndAnswersAction';\nimport { getDevPlanStatusesAction } from './api/getDevPlanStatusesAction';\nimport { participantRatersAction } from '../../survey/raters/participantRatersAction';\nimport { useProjIds } from '../../../navigation/hooks';\nimport EmailDevPlanModal from '../emailPlan/EmailDevPlanModal';\nimport DevPlanRemindersModal from '../reminders/DevPlanRemindersModal';\nimport { getDevPlanCollaboratorsAction } from '../collaboration/api/getDevPlanCollaboratorsAction';\nimport { getDevItemCommentsAction } from '../collaboration/api/getDevItemCommentsAction';\nimport { useDevPlanCollaborationSetting } from '../collaboration/hooks';\nimport { getDevActionListItemsAction } from '../listItems/api/getDevActionListItemsAction';\n\n\nconst styles = {\n root: css`\n \n `,\n spinner: css`\n width: 100px;\n height: 100px;\n `,\n};\n\n\nconst API_ACTIONS = [\n ActionType.GetRemindersOnRequest,\n ActionType.GetDevPlanItemsRequest,\n ActionType.GetDevPlanActionsRequest,\n ActionType.ParticipantRatersRequest,\n ActionType.GetDevPlanFieldsAndAnswersRequest,\n ActionType.GetStatusKeysRequest,\n ActionType.GetDevActionListItemsRequest,\n ActionType.GetDevPlanCollaboratorsRequest,\n ActionType.GetDevItemCommentsRequest,\n];\n\n\nconst loadPlanInfo = (dispatch: Dispatch) => (\n devPlanProjectId: number,\n projectId: number,\n participantId: number,\n languageId: number,\n hasRaters: boolean,\n collaborationEnabled: boolean,\n) => {\n if (!hasRaters) {\n dispatch(participantRatersAction(projectId, participantId));\n }\n\n dispatch(getDevPlanItemsAction(devPlanProjectId, participantId));\n dispatch(getDevPlanActionsAction(devPlanProjectId, participantId));\n dispatch(getDevPlanFieldsAndAnswersAction(devPlanProjectId, participantId));\n dispatch(getDevPlanStatusesAction());\n dispatch(getRemindersOnAction(projectId, participantId));\n dispatch(getDevActionListItemsAction(devPlanProjectId, languageId));\n\n if (collaborationEnabled) {\n dispatch(getDevPlanCollaboratorsAction(devPlanProjectId, participantId));\n dispatch(getDevItemCommentsAction(devPlanProjectId, participantId));\n }\n};\n\n\ntype Props = {};\n\n\n/**\n * DevPlanRouter: a component that routes URLs for all the dev plan pages\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst DevPlanRouter: React.FC = () => {\n const dispatch = useDispatch();\n\n const projIds = useProjIds();\n\n const collaborationEnabled = useDevPlanCollaborationSetting();\n\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || projIds.projId);\n\n const hasRaters = useAppState(state => !!state.projectRaters?.[`${projIds.projId}`]);\n\n const langId = useAppState(state => state.locale.lang.languageId);\n\n const loadPlanDetails = useCallback(\n () => loadPlanInfo(dispatch)(\n devPlanProjectId,\n projIds.projId,\n projIds.participantId,\n langId,\n hasRaters,\n collaborationEnabled,\n ),\n [dispatch, devPlanProjectId, projIds.projId, projIds.participantId, langId, hasRaters, collaborationEnabled],\n );\n\n useMount(loadPlanDetails);\n\n const isLoading = useAnyLoading(API_ACTIONS);\n const hasError = useAnyError(API_ACTIONS);\n\n if (isLoading || hasError) {\n return (\n
    \n {\n isLoading\n ? \n : \n }\n
    \n );\n }\n\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default DevPlanRouter;\n","import * as yup from 'yup';\n\n\nexport const searchDirectoryFormValidation = yup.object().shape(\n {\n searchTerm: yup.string(),\n },\n);\n","import * as React from 'react';\nimport LocalDiv from '../../../../localization/LocalDiv';\nimport LocalInput from '../../../../localization/LocalInput';\nimport { Str } from '../../../../localization/translationKeys';\nimport LocalBtn from '../../../../localization/LocalBtn';\nimport { btnStyle } from '../../../../forms/styles/button';\nimport { COLORS } from '../../../../globalStyle/colors';\nimport { css } from '@emotion/core';\nimport { INPUT } from '../../../../forms/styles/input';\nimport { FLEX_ADAPTIVE_MED, FLEX_COLUMN } from '../../../../layout/flexBox';\nimport { useFormik } from 'formik';\nimport { searchDirectoryFormValidation } from './formValidations';\nimport { FIELDSET_DEFAULT } from '../../../../layout/fieldSetStyle';\nimport { onMobileMedium } from '../../../../globalStyle/mediaQueries';\n\n\nconst styles = {\n root: css`\n flex-wrap: wrap;\n & input, & button {\n margin: 4px;\n }\n `,\n input: css`\n width: 320px;\n height: 35px;\n\n ${onMobileMedium} {\n width: unset;\n }\n `,\n button: css`\n min-width: 144px;\n height: 35px;\n `,\n};\n\n\ntype Props = {\n className?: string;\n setSearchTerm: (searchTerm: string) => void;\n};\n\n\n/**\n * SearchDirectoryForm: a component that provides a form to search the rater directory for raters by name, email, or Id.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst SearchDirectoryForm: React.FC = props => {\n const { handleSubmit, handleChange, resetForm, values } = useFormik({\n initialValues: {\n searchTerm: '',\n },\n onSubmit: (values) => {\n props.setSearchTerm(values.searchTerm);\n resetForm();\n },\n validationSchema: searchDirectoryFormValidation,\n validateOnChange: false,\n enableReinitialize: true,\n });\n\n return (\n \n
    \n
    \n \n \n \n \n
    \n
    \n
    \n );\n};\n\nexport default SearchDirectoryForm;\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { css } from '@emotion/core';\nimport { RaterLevel } from '../models';\nimport LocalDiv from '../../../../localization/LocalDiv';\nimport { FLEX_COLUMN } from '../../../../layout/flexBox';\nimport { lastCommaFirstLocal } from '../module';\nimport LocalSelect from '../../../../localization/LocalSelect';\nimport LocalDropdownOption from '../../../../localization/LocalDropdownOption';\nimport { Str } from '../../../../localization/translationKeys';\nimport LocalBtn from '../../../../localization/LocalBtn';\nimport { btnStyle } from '../../../../forms/styles/button';\nimport { COLORS } from '../../../../globalStyle/colors';\nimport { SELECT } from '../../../../forms/styles/select';\nimport Msg from '../../../../localization/Msg';\nimport { DirectoryRaterViewModelProps } from './props';\n\n\nconst styles = {\n root: css`\n background-color: ${COLORS.LIGHTEST_GREY};\n `,\n raterInfo: css`\n &[dir=\"ltr\"] {\n text-align: left;\n }\n\n &[dir=\"rtl\"] {\n text-align: right;\n }\n `,\n dropdownContainer: {\n root: css``,\n dropdown: css`\n border-color: ${COLORS.WHITE};\n `,\n },\n addBtnContainer: {\n root: css`\n &[dir=\"ltr\"] {\n text-align: right;\n }\n\n &[dir=\"rtl\"] {\n text-align: left;\n }\n `,\n button: css`\n padding-left: 12px;\n padding-right: 12px;\n `,\n },\n};\n\n\ntype Props = DirectoryRaterViewModelProps;\n\n\nconst renderRaterLevelOptions = (levels: RaterLevel[]) => levels.map(\n level => (\n \n ),\n);\n\n\n/**\n * RaterSearchTableRow: a component that renders a form enabling the user to set a rater level for the associated rater\n * and add them to the project.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterSearchTableRow: React.FC = props => {\n const [levelId, setLevelId] = useState(undefined);\n\n const onClickSubmitBtn = (event: React.MouseEvent) => {\n event.preventDefault();\n props.setAddedRater(levelId!);\n };\n\n return (\n \n \n \n \n \n \n \n \n \n setLevelId(+event.target.value)}\n value={levelId}\n >\n {\n !levelId && (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default RaterSearchTableRow;\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { DirectoryRaterViewModelProps } from './props';\nimport LocalDiv from '../../../../localization/LocalDiv';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../../../layout/flexBox';\nimport Msg from '../../../../localization/Msg';\nimport { lastCommaFirstLocal } from '../module';\nimport LocalSelect from '../../../../localization/LocalSelect';\nimport { SELECT } from '../../../../forms/styles/select';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../../../globalStyle/colors';\nimport LocalDropdownOption from '../../../../localization/LocalDropdownOption';\nimport { Str } from '../../../../localization/translationKeys';\nimport LocalBtn from '../../../../localization/LocalBtn';\nimport { btnStyle } from '../../../../forms/styles/button';\nimport { RaterLevel } from '../models';\nimport Spacer from '../../../../layout/Spacer';\n\n\nconst styles = {\n root: css`\n `,\n infoAndButton: {\n root: css`\n justify-content: space-between;\n `,\n raterInfo: css`\n &[dir=\"ltr\"] {\n text-align: left;\n }\n\n &[dir=\"rtl\"] {\n text-align: right;\n }\n `,\n button: css`\n padding-left: 12px;\n padding-right: 12px;\n `,\n },\n dropdownContainer: {\n root: css`\n align-content: stretch;\n `,\n dropdown: css`\n border-color: ${COLORS.WHITE};\n `,\n },\n};\n\n\ntype Props = DirectoryRaterViewModelProps;\n\n\nconst renderRaterLevelOptions = (levels: RaterLevel[]) => levels.map(\n level => (\n \n ),\n);\n\n\n/**\n * RaterSearchCard: a component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterSearchCard: React.FC = props => {\n const [levelId, setLevelId] = useState(undefined);\n\n const onClickSubmitBtn = (event: React.MouseEvent) => {\n event.preventDefault();\n props.setAddedRater(levelId!);\n };\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n setLevelId(+event.target.value)}\n value={levelId}\n >\n {\n !levelId && (\n \n \n \n );\n};\n\nexport default RaterSearchCard;\n","import * as React from 'react';\n\n\ntype Props = {\n pageSize: number;\n currentPage: number;\n children: React.ReactNode[];\n};\n\n\n/**\n * PaginateScroll: a component that loads results in chunks of a preset size.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst PaginatedScroll: React.FC = props => {\n const renderedItems = props.children.slice(0, (props.pageSize * props.currentPage));\n\n return (\n <>\n {renderedItems}\n \n );\n};\n\nexport default PaginatedScroll;","import * as React from 'react';\nimport { useMemo } from 'react';\nimport { DirectoryRater, RaterLevel, AddedDirectoryRater } from '../models';\nimport { TextDirection } from '../../../../localization/textDirection';\nimport { css } from '@emotion/core';\nimport RaterSearchTableRow from './RaterSearchTableRow';\nimport { COLORS } from '../../../../globalStyle/colors';\nimport { FIELDSET_DEFAULT } from '../../../../layout/fieldSetStyle';\nimport LocalDiv from '../../../../localization/LocalDiv';\nimport { useWindowSize } from '../../../../core/hooks/useWindowSize';\nimport RaterSearchCard from './RaterSearchCard';\nimport PaginatedScroll from '../../../../layout/PaginatedScroll';\nimport LocalBtn from '../../../../localization/LocalBtn';\nimport { btnStyle } from '../../../../forms/styles/button';\nimport { FLEX_ROW } from '../../../../layout/flexBox';\nimport { onMobileMedium } from '../../../../globalStyle/mediaQueries';\nimport { useMsgText } from '../../../../localization/hooks';\nimport { Str } from '../../../../localization/translationKeys';\n\n\nconst styles = {\n table: css`\n table-layout: auto;\n width: 100%;\n border-collapse: collapse;\n background-color: ${COLORS.LIGHTEST_GREY};\n\n & td {\n padding: 18px;\n border: 1px solid;\n border-color: ${COLORS.LIGHTER_GREY} ${COLORS.LIGHTEST_GREY};\n }\n `,\n cards: css`\n padding: 18px 12px;\n background-color: ${COLORS.LIGHTEST_GREY};\n border: 1px solid;\n border-color: ${COLORS.LIGHTER_GREY} ${COLORS.LIGHTEST_GREY} ${COLORS.LIGHTEST_GREY};\n `,\n loadButtonContainer: {\n root: css`\n ${onMobileMedium} {\n justify-content: stretch;\n }\n `,\n button: css`\n padding-right: 30px;\n padding-left: 30px;\n\n ${onMobileMedium} {\n flex-basis: 100%;\n }\n `,\n },\n};\n\n\ntype Props = {\n className?: string;\n dir: TextDirection;\n raterLevels: RaterLevel[];\n searchResults: DirectoryRater[];\n setAddedRater: (addedRater?: AddedDirectoryRater) => void;\n resultsPageSize: number;\n lastLoadedResultsPage: number;\n loadMoreResults: () => void;\n};\n\n\n/**\n * RaterSearchResultList: a component that renders the list of raters returned from search, as rows in a table.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterSearchResultList: React.FC = props => {\n // Destructure to resolve a linting warning in the useMemo call below\n const { setAddedRater, ...rest } = props;\n\n const loadMoreBtnText = useMsgText(Str.LoadMore);\n\n const { isMobile } = useWindowSize();\n const lastPage = useMemo(\n () => props.searchResults.length / props.resultsPageSize,\n [props.resultsPageSize, props.searchResults.length],\n );\n\n const mapResultsToRows = useMemo(\n () => rest.searchResults.map(result => (\n setAddedRater({ levelId, ...result })}\n />\n ),\n ),\n [rest.dir, rest.raterLevels, rest.searchResults, setAddedRater],\n );\n\n const mapResultsToCards = useMemo(\n () => rest.searchResults.map(result => (\n setAddedRater({ levelId, ...result })}\n css={styles.cards}\n />\n ),\n ),\n [rest.dir, rest.raterLevels, rest.searchResults, setAddedRater],\n );\n\n const onClickLoadBtn = (event: React.MouseEvent) => {\n event.preventDefault();\n props.loadMoreResults();\n };\n\n return (\n \n
    \n
    \n {\n isMobile\n ? (\n <>\n \n {mapResultsToCards}\n \n {\n props.searchResults.length > props.resultsPageSize && (\n \n lastPage}\n />\n \n )\n }\n \n ) : (\n \n \n \n {mapResultsToRows}\n \n {\n props.searchResults.length > props.resultsPageSize && (\n \n \n \n )\n }\n \n
    \n \n lastPage}\n />\n \n
    \n )\n }\n \n
    \n
    \n );\n};\n\nexport default RaterSearchResultList;\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport { TextDirection } from '../../../../localization/textDirection';\nimport { DirectoryRater, RaterLevel, AddedDirectoryRater } from '../models';\nimport LocalDiv from '../../../../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../../../layout/flexBox';\nimport SearchDirectoryForm from './SearchDirectoryForm';\nimport RaterSearchResultList from './RaterSearchResultList';\nimport { css } from '@emotion/core';\nimport ClamShell from '../../../../layout/ClamShell';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faCheck, faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\nimport Msg from '../../../../localization/Msg';\nimport { Str } from '../../../../localization/translationKeys';\nimport { COLORS } from '../../../../globalStyle/colors';\nimport Spacer from '../../../../layout/Spacer';\nimport { nameOrEmail } from '../module';\nimport { Requirement } from '../../../models';\n\n\nconst styles = {\n root: css`\n align-content: stretch;\n `,\n msgBar: css`\n align-items: center;\n min-height: 60px;\n background-color: ${COLORS.WHITE};\n padding-left: 16px;\n padding-right: 16px;\n `,\n formContainer: css`\n align-items: center;\n background-color: ${COLORS.LIGHTEST_GREY};\n padding: 16px 4px;\n `,\n userMsg: {\n root: css`\n align-items: flex-end;\n font-size: 12px;\n `,\n icon: css`\n font-size: 22px;\n `,\n msgText: css``,\n },\n};\n\n\ntype Props = {\n className?: string;\n textDirection: TextDirection;\n raterLevels: RaterLevel[];\n searchResults: DirectoryRater[];\n maxedOutRequirement?: Requirement;\n setSearchTerm: (searchTerm: string) => void;\n lastAddedRater?: AddedDirectoryRater;\n addedRater?: AddedDirectoryRater;\n setAddedRater: (addedRater?: AddedDirectoryRater) => void;\n resultsPageSize: number;\n lastLoadedResultsPage: number;\n loadMoreResults: () => void;\n showSuccessMsg: boolean;\n showNoResultsMsg: boolean;\n showSearchErrorMsg: boolean;\n showAddErrorMsg: boolean;\n};\n\n/**\n * RaterSearchTable: a component that renders a message/feedback bar, search form, and result list for the directory\n * search feature.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterSearchTable: React.FC = props => {\n const raterNameOrEmail = useMemo(\n () => !!props.lastAddedRater ? nameOrEmail(props.textDirection, props.lastAddedRater) : '',\n [props.lastAddedRater, props.textDirection],\n );\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default RaterSearchTable;\n","import * as React from 'react';\nimport { useState, useEffect, useMemo } from 'react';\nimport ProjectLayout from '../../../ProjectLayout';\nimport SurveyHeader from '../../SurveyHeader';\nimport { css } from '@emotion/core';\nimport { onMobileDevice, HIDE_ON_MOBILE_MED } from '../../../../globalStyle/mediaQueries';\nimport { useMsgText } from '../../../../localization/hooks';\nimport { Project, Requirement } from '../../../models';\nimport { Str } from '../../../../localization/translationKeys';\nimport LocalDiv from '../../../../localization/LocalDiv';\nimport { FLEX_ROW, FLEX_COLUMN } from '../../../../layout/flexBox';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faReply } from '@fortawesome/free-solid-svg-icons';\nimport Msg from '../../../../localization/Msg';\nimport { useAppState } from '../../../../core/redux/hooks';\nimport LocalBtn from '../../../../localization/LocalBtn';\nimport { btnStyle } from '../../../../forms/styles/button';\nimport { COLORS } from '../../../../globalStyle/colors';\nimport RaterSearchTable from './RaterSearchTable';\nimport { AddedDirectoryRater } from '../models';\nimport Spacer from '../../../../layout/Spacer';\nimport { useDispatch } from 'react-redux';\nimport { directoryRatersAction } from './directoryRatersAction';\nimport { addRaterByIdAction } from '../addRaterByIdAction';\nimport { useHistory, Link } from 'react-router-dom';\nimport { useCounter } from '../../../../core/hooks/useCounter';\nimport { useLoading, useError } from '../../../../core/api/hooks';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { Loader } from '../../../../loading/Loader';\nimport { useTimedToggle } from '../../../../core/hooks/useTimedToggle';\nimport { useStickyDiff } from '../../../../core/hooks/useStickyDiff';\nimport { toMap } from '../../../../language/arrays';\nimport { canAddRaterForLevel } from '../../../module';\nimport { useTimedState } from '../../../../core/hooks/useTimedState';\nimport { useRoutes } from '../../../../navigation/routes';\nimport { withValidMinOrMax, withValidMinimum } from '../module';\n\n\nconst styles = {\n header: css`\n margin-bottom: 40px;\n\n ${onMobileDevice} {\n margin-bottom: 35px;\n }\n `,\n subtitleRow: {\n root: css`\n justify-content: space-between;\n padding: 16px 8px;\n `,\n subtitle: css`\n font-size: 26px;\n `,\n icon: css`\n color: ${COLORS.BLUE};\n `,\n },\n bottomBtnRow: {\n root: css`\n justify-content: flex-end;\n padding: 16px 8px;\n `,\n button: css`\n min-width: 144px;\n height: 35px;\n `,\n },\n loader: {\n root: css`\n flex-basis: 480px;\n justify-content: center;\n align-items: center;\n ${onMobileDevice} {\n margin-top: 120px;\n }\n `,\n spinner: css`\n width: 60px;\n `,\n },\n};\n\n\ntype Props = {\n className?: string;\n project?: Project;\n};\n\n/**\n * RaterDirectorySearch: a component that\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RaterDirectorySearch: React.FC = props => {\n const dispatch = useDispatch();\n const history = useHistory();\n\n const [searchTerm, setSearchTerm] = useState(undefined);\n const [addedRater, setAddedRater] = useState(undefined);\n const [lastAddedRater, setLastAddedRater] = useState(undefined);\n\n const [showSuccessMsg, toggleSuccessMsg] = useTimedToggle(false, 3000);\n const [showNoResultsMsg, toggleNoResultsMsg] = useTimedToggle();\n const [showAddErrorMsg, toggleAddErrorMsg] = useTimedToggle(false, 3000);\n const [showSearchErrorMsg, toggleSearchErrorMsg] = useTimedToggle();\n const [maxedOutReq, setMaxedOutReqMsg] = useTimedState(undefined);\n\n const [lastLoadedResultsPage, loadMoreResults] = useCounter(1);\n\n const pageTitle = useMsgText(Str.InviteRemindRaters);\n const textDirection = useAppState(state => state.locale.textDirection);\n const project = useAppState(state => state.projectSummary);\n const participantId = useAppState(state => state.auth.currentUser?.personId);\n const raterLevels = useAppState(state => state.projectRaterLevels?.[`${project?.projectId}`] || []);\n const lang = useAppState(state => state.locale.lang);\n const raters = useAppState(state => state.projectRaters);\n const searchResults = useAppState(\n state => state.directoryRaters\n ?.[`${project?.projectId}`]\n ?.[searchTerm?.toLocaleLowerCase(lang.code) || ''],\n );\n\n const requirements = useAppState(state => state.participantRequirements);\n const nonEmptyRequirements = React.useMemo(\n () => !!project?.maximumsRequired ? withValidMinOrMax(requirements) : withValidMinimum(requirements),\n [project, requirements],\n );\n\n const nonEmptyRequirementMap = React.useMemo(\n () => toMap(\n nonEmptyRequirements ?? [],\n req => `${req.surveyLevelId}`,\n ),\n [nonEmptyRequirements],\n );\n\n const addedRaterRequirement: Requirement | undefined = nonEmptyRequirementMap[`${addedRater?.levelId}`];\n\n const searchActionTag = useMemo(\n () => `${project?.projectId ?? 0}-${participantId}-${searchTerm?.toLocaleLowerCase(lang.code) || ''}`,\n [lang.code, participantId, project, searchTerm],\n );\n const searchingDirectory = useLoading(ActionType.DirectoryRatersRequest, searchActionTag);\n const searchError = !!useError(ActionType.DirectoryRatersRequest, searchActionTag);\n\n const addActionTag = useMemo(() => `${addedRater?.personId || 0}-${project?.projectId || 0}`, [addedRater, project]);\n const addingRater = useLoading(ActionType.AddRaterByIdRequest, addActionTag);\n const addError = !!useError(ActionType.AddRaterByIdRequest, addActionTag);\n\n const isLoading = searchingDirectory || addingRater;\n\n useStickyDiff(\n (prev, next) => !prev?.results && !!next.results && next.results.length === 0 && toggleNoResultsMsg(),\n {\n results: searchResults,\n },\n );\n\n useStickyDiff(\n (prev, next) => !prev?.error && next.error && toggleSearchErrorMsg(),\n {\n error: searchError,\n },\n );\n\n useStickyDiff(\n (prev, next) => !prev?.error && next.error && toggleAddErrorMsg(),\n {\n error: addError,\n },\n );\n\n const toggleSuccess = function() {\n toggleSuccessMsg();\n setLastAddedRater(addedRater);\n setAddedRater(undefined);\n return true;\n };\n\n useStickyDiff(\n (prev, next) => !!prev?.loading && !next.loading && !next.error && toggleSuccess(),\n {\n loading: addingRater,\n error: addError,\n },\n );\n\n useEffect(\n () => {\n (!!searchTerm && !!project)\n && dispatch(directoryRatersAction(project.projectId, participantId || 0, searchTerm));\n },\n [dispatch, participantId, project, searchTerm, raters],\n );\n\n useStickyDiff(\n (prev, next) => {\n !prev?.hasRater && !!next.hasRater && !!project && !!participantId\n && (\n canAddRaterForLevel(project.maximumsRequired, addedRaterRequirement)\n ? dispatch(addRaterByIdAction(project.projectId, participantId, addedRater!.personId, addedRater!.levelId))\n : setMaxedOutReqMsg(addedRaterRequirement)\n );\n },\n {\n hasRater: addedRater,\n },\n );\n\n const { InviteRaters } = useRoutes(participantId, project?.displayProjectId);\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {\n isLoading && (\n \n \n \n )\n }\n \n );\n};\n\nexport default RaterDirectorySearch;\n","import React, { useEffect } from 'react';\n\n\n/**\n * A React Hook for holding a state value for a set amount of time.\n * @param initialValue - the starting value, and the value to which the state shall revert after a pre-defined delay\n * whenever set.\n * @param delay - the duration in milliseconds for which the state should remain set. Default: `3000`\n * @returns Array where first item is the state value, and the second item is a function that temporarily sets a new\n * state value when called\n */\nexport const useTimedState = (\n initialValue: T,\n delay: number = 3000,\n): [T, (newValue: T) => void] => {\n const [value, setValue] = React.useState(initialValue);\n\n useEffect(\n () => {\n if (value !== initialValue) {\n const handle = setTimeout(() => setValue(initialValue), delay);\n // Return a function to React that it can call when the component is unmounting to clean up this effect\n return () => clearTimeout(handle);\n }\n },\n [delay, initialValue, value],\n );\n\n return [value, setValue];\n};\n","import * as React from 'react';\nimport ProjectLayout from '../ProjectLayout';\nimport SurveyHeader from '../survey/SurveyHeader';\nimport { css } from '@emotion/core';\nimport { onMobileDevice } from '../../globalStyle/mediaQueries';\nimport { useAppState } from '../../core/redux/hooks';\nimport { COLORS } from '../../globalStyle/colors';\nimport LocalHTMLContainer from '../../localization/LocalHTMLContainer';\nimport { BaseUrl } from '../../core/api/endpoints';\nimport { pathCombine } from '../../core/api/module';\n\n\nconst styles = {\n content: css`\n margin-top: 62px;\n background-color: ${COLORS.WHITE};\n padding: 20px;\n\n ${onMobileDevice} {\n margin-top: 20px;\n }\n `,\n header: css`\n ${onMobileDevice} {\n margin-top: 37px;\n } \n `,\n};\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * CustomResource: a component that renders a Custom Resource\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst Resource: React.FC = props => {\n const id = window.location.href.substring(window.location.href.lastIndexOf('/') + 1);\n const resources = useAppState(state => state.projectResources);\n const resource = resources?.find(r => `${r.nameMessageId}` === id);\n const pageTitle = resource?.nameText;\n\n const bodyText = () => {\n let text = resource?.bodyText || '';\n\n const updatedText = () => {\n const baseUrl = BaseUrl.substring(0, BaseUrl.length - 4); // ends with '/api'\n let idx = text.toLowerCase().indexOf('href=\"developmentplans/');\n while (idx > -1) {\n text = text.substr(0, idx)\n + 'href=\"'\n + pathCombine(baseUrl, 'DevelopmentPlans/')\n + text.substr(idx + 22);\n idx = text.toLowerCase().indexOf('href=\"developmentplans/');\n }\n idx = text.toLowerCase().indexOf('href=\"resources/');\n while (idx > -1) {\n text = text.substr(0, idx)\n + 'href=\"'\n + pathCombine(baseUrl, 'Resources/')\n + text.substr(idx + 15);\n idx = text.toLowerCase().indexOf('href=\"resources/');\n }\n return text;\n }\n \n const lcText = text.toLowerCase();\n\n return lcText.indexOf('href=\"developmentplans/') === -1 && lcText.indexOf('href=\"resources/') === -1\n ? text\n : updatedText();\n };\n\n return (\n \n \n \n \n )\n};\n\nexport default Resource;\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport { useInterval } from '../core/hooks/useInterval';\nimport { useDispatch } from 'react-redux';\nimport { useAppState } from '../core/redux/hooks';\nimport { TIME } from '../language/time';\nimport { loadCurrentStatusAction } from './loadCurrentStatusAction';\nimport { IS_DEV_ENV } from '../core/windowProps';\n\n\ntype Props = {};\n\n\n/**\n * ProjectStatusPoller: a non-rendering component that polls the server for project status changes so that the portal\n * renders the most up-to-date information about the current project\n */\nconst ProjectStatusPoller: React.FC = props => {\n const dispatch = useDispatch();\n\n const participantId = useAppState(state => state.auth.currentUser?.personId ?? 0);\n const projectId = useAppState(state => state.projectSummary?.projectId ?? 0);\n let refreshMs = useAppState(state => (state.config?.refreshSeconds || 5) * TIME.S);\n\n // When testing locally, it's irritating when this is running every 5 seconds\n if (IS_DEV_ENV) {\n refreshMs = 200 * TIME.M;\n }\n\n const doRefresh = useCallback(\n () => (refreshMs > 0 && projectId > 0 && participantId > 0) && (\n dispatch(loadCurrentStatusAction(projectId, participantId))\n ),\n [projectId, participantId, refreshMs, dispatch],\n );\n \n useInterval(doRefresh, refreshMs);\n\n return null;\n};\n\nexport default ProjectStatusPoller;\n","import * as React from 'react';\nimport { sendRemindersAction } from './sendRemindersAction';\nimport { useDispatch } from 'react-redux';\nimport { useAppState } from '../../../../core/redux/hooks';\nimport { raterIsInvited } from '../module';\nimport { participantRatersAction } from '../participantRatersAction';\nimport { useMount } from '../../../../core/hooks/useMount';\nimport { useLoading } from '../../../../core/api/hooks';\nimport { ActionType } from '../../../../core/redux/actionType';\nimport { useToggleOnComplete } from '../../../../core/hooks/useToggleOnComplete';\n\n\n/**\n * Hook returning general Remind Raters state and actions\n */\nexport const useRemindRaters = (projectId: number, participantId: number) => {\n const dispatch = useDispatch();\n\n const autoRemindersOn = useAppState(state => state.projectSummary?.autoReminders);\n const raterInvited = useAppState(state => state.projectSummary?.raterInvited);\n const sendingReminders = useLoading(ActionType.SendRemindersRequest, `${projectId}`);\n const raters = useAppState(state => (state.projectRaters || {})[projectId]);\n\n useMount(\n () => {\n if (!raters) {\n dispatch(participantRatersAction(projectId, participantId));\n }\n },\n );\n\n const raterArr = Object.values(raters || {});\n\n const invited = React.useMemo(\n () => raterArr.filter(raterIsInvited).sort((rater1, rater2) => rater2.raterId - rater1.raterId),\n [raterArr],\n );\n\n const addressesToRemind = React.useMemo(\n () => invited.map(rater => ({ toAddress: rater.email, languageId: rater.languageId })),\n [invited],\n );\n\n const [remindersSent, toggleRemindersSent] = useToggleOnComplete(ActionType.SendRemindersRequest, `${projectId}`);\n\n const sendReminders = React.useCallback(\n () => {\n dispatch(sendRemindersAction(projectId, participantId, '', addressesToRemind));\n },\n [addressesToRemind, participantId, projectId, dispatch],\n );\n\n return { autoRemindersOn, raterInvited, sendingReminders, sendReminders, remindersSent, toggleRemindersSent };\n};\n\n","import { useLoading } from '../api/hooks';\nimport { ActionType } from '../redux/actionType';\nimport { useStickyDiff } from './useStickyDiff';\nimport { useToggle } from './useToggle';\n\n\n/**\n * Use this to set a toggle that fires whenever the specified action returns a response (whether success or error).\n *\n * Make sure this is really the behavior you want before using this hook; with very exceptions, you probably want to use\n * `useToggleOnSuccess` in place of this.\n *\n * @param actionType - the type of action to trigger the callback\n * @param requestId - the request Id (if any) of the specific action which should trigger the callback\n */\nexport const useToggleOnComplete = (\n actionType: ActionType,\n requestId: string | number | undefined = undefined,\n): [boolean, () => void] => {\n const [isToggled, setIsToggled] = useToggle();\n const isLoading = useLoading(actionType, requestId);\n\n useStickyDiff(\n (prev, next) => !!prev?.isLoading && !next.isLoading && setIsToggled(),\n {\n isLoading: isLoading,\n },\n );\n\n return [isToggled, setIsToggled];\n};\n","import * as React from 'react';\nimport { useMemo, useCallback } from 'react';\nimport Modal from '../../../../layout/modal/Modal';\nimport ModalHeader from '../../../../layout/modal/ModalHeader';\nimport LocalDiv from '../../../../localization/LocalDiv';\nimport LocalBtn from '../../../../localization/LocalBtn';\nimport Spacer from '../../../../layout/Spacer';\nimport { FLEX_COLUMN, FLEX_ROW } from '../../../../layout/flexBox';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../../../globalStyle/colors';\nimport { btnStyle, BTN_SHIMMER } from '../../../../forms/styles/button';\nimport { Str } from '../../../../localization/translationKeys';\nimport Msg from '../../../../localization/Msg';\nimport { useProjIds } from '../../../../navigation/hooks';\nimport { useRemindRaters } from './hooks';\nimport { useHistory } from 'react-router-dom';\n\n\nconst styles = {\n root: [\n FLEX_COLUMN,\n css`\n min-height: 300px;\n max-width: 565px;\n `,\n ],\n modalContent: [\n FLEX_COLUMN,\n css`\n flex-grow: 1;\n justify-content: space-between;\n `,\n ],\n modalText: [\n FLEX_COLUMN,\n css`\n margin: 65px 85px 85px;\n\n @media only screen and (max-width: 470px) {\n margin: 65px 20px 85px;\n }\n `,\n ],\n confirmationTxt: {\n root: css`\n display: block;\n font-size: 18px;\n color: ${COLORS.DARK_GREY};\n font-weight: bold;\n line-height: 23px;\n overflow-wrap: break-word;\n `,\n spacer: css`\n padding: 0 5px;\n `,\n warningMsg: css`\n display: inline;\n color: ${COLORS.RED}\n `,\n question: css`\n display: inline;\n `,\n },\n additionalNoteText: css`\n display: block;\n font-size: 12px;\n color: ${COLORS.DARK_GREY};\n overflow-wrap: break-word;\n `,\n btnRow: [\n FLEX_ROW,\n css`\n justify-content: flex-end;\n margin: 0 20px 20px;\n `,\n ],\n secondaryBtn: [\n btnStyle.transparent(COLORS.BLUE),\n css`\n min-width: 135px;\n `,\n ],\n primaryBtn: [\n btnStyle.primary(COLORS.BLUE),\n css`\n min-width: 135px;\n `,\n ],\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * RemindRaters: a component that renders a modal asking the participant to confirm that they wish to send reminders to\n * all raters currently associated with their survey.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst RemindRatersModal: React.FC = props => {\n const history = useHistory();\n const projIds = useProjIds();\n const remindRaters = useRemindRaters(projIds.projId, projIds.participantId);\n\n const primaryMsgStr = useMemo(\n () => remindRaters.remindersSent\n ? Str.RemindersSent\n : remindRaters.autoRemindersOn\n ? Str.AutoRemindersConfirm\n : Str.ConfirmRemind,\n [remindRaters.remindersSent, remindRaters.autoRemindersOn],\n );\n\n const onDismiss = useCallback(() => history.goBack(), [history]);\n\n // If the user opts to send reminders, we don't want them to be able to close the modal before they receive\n // confirmation of success. Hence, we disable dismissing the modal except via the provided buttons.\n return (\n \n \n
    \n \n \n {\n !remindRaters.remindersSent && remindRaters.autoRemindersOn && (\n <>\n \n \n \n )\n }\n \n \n \n \n \n \n \n\n \n {\n remindRaters.remindersSent\n ? \n : (\n <>\n {remindRaters.sendReminders()}}\n str={Str.Yes}\n css={[styles.secondaryBtn, remindRaters.sendingReminders && BTN_SHIMMER]}\n disabled={remindRaters.sendingReminders \n || !remindRaters.raterInvited \n || remindRaters.remindersSent\n }\n />\n \n \n \n )\n }\n \n
    \n
    \n );\n};\n\nexport default RemindRatersModal;\n","import * as React from 'react';\nimport ProjectLayout from '../ProjectLayout';\nimport { useMsgText } from '../../localization/hooks';\nimport { Str } from '../../localization/translationKeys';\nimport SurveyHeader from '../survey/SurveyHeader';\nimport { css } from '@emotion/core';\nimport { COLORS } from '../../globalStyle/colors';\nimport { onMobileDevice } from '../../globalStyle/mediaQueries';\nimport { useAppState } from '../../core/redux/hooks';\nimport * as R from 'ramda';\nimport { useMount } from '../../core/hooks/useMount';\nimport { useDispatch } from 'react-redux';\nimport { getEBookUrlAction } from '../api/getEBookUrlAction';\nimport { useProjIds } from '../../navigation/hooks';\nimport { Loader } from '../../loading/Loader';\nimport Msg from '../../localization/Msg';\n\n\nconst styles = {\n content: css`\n margin-top: 62px;\n background-color: ${COLORS.WHITE};\n width: 100%;\n\n ${onMobileDevice} {\n margin-top: 20px;\n }\n `,\n header: css`\n ${onMobileDevice} {\n margin-top: 37px;\n } \n `,\n loader: css`\n width: 150px;\n height: 150px;\n margin: auto;\n `,\n iframe: css`\n width: 100%;\n height: calc(100vh - 53px);\n `, \n notFoundRow: css`\n margin: 70px 50px;\n `,\n notFound: css`\n font-size: 16px;\n `,\n availabilityMessage: css`\n margin-top: 37px;\n display: block;\n `,\n};\n\n\ntype Props = {\n className?: string;\n};\n\n\n/**\n * EBook: a component that displays an EBook from VitalSource\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst EBook: React.FC = props => {\n const pageTitle = useMsgText(Str.EBook);\n\n const dispatch = useDispatch();\n\n const projIds = useProjIds();\n const participantId = projIds.participantId;\n const project = useAppState(state => state.projectSummary);\n const projectId = projIds.projId;\n const url = useAppState(state => state.eBookUrl);\n\n const useUrl = React.useMemo(() => url, [url]);\n\n useMount(() => {\n // always get new URL since they are only valid for 2 minutes\n dispatch(getEBookUrlAction(projectId, participantId));\n });\n\n return (\n \n \n\n {\n project?.reportAvailable\n ? R.isNil(useUrl)\n ? \n : \n : \n }\n \n )\n\n};\n\nexport default EBook;\n","import * as React from 'react';\nimport { useEffect } from 'react';\nimport ProjectSummary from './ProjectSummary';\nimport { Route, Switch } from 'react-router-dom';\nimport { RouteTemplates } from '../navigation/routes';\nimport DevResourceModal from './resources/DevResourceModal';\nimport SetGoals from './setGoals/SetGoals';\nimport SelfSurvey from './survey/selfSurvey/SelfSurvey';\nimport CreateSurvey from './createSurvey/CreateSurvey';\nimport InviteRaters from './survey/raters/InviteRaters';\nimport FeedbackReport from './viewReport/FeedbackReport';\nimport ReportTutorial from './resources/ReportTutorial';\nimport { useDispatch } from 'react-redux';\nimport { useLoading, useError } from '../core/api/hooks';\nimport { ActionType } from '../core/redux/actionType';\nimport { PAGE_BG, PAGE_HEIGHT } from '../layout/pageStyle';\nimport { FLEX_COLUMN, FLEX_CENTERED } from '../layout/flexBox';\nimport { Spinner } from '../loading/Spinner';\nimport { COLORS } from '../globalStyle/colors';\nimport { css } from '@emotion/core';\nimport ErrorMsg from '../error/ErrorMsg';\nimport { Str } from '../localization/translationKeys';\nimport { Dispatch } from 'redux';\nimport { loadProjectSummaryAction } from './loadProjectSummaryAction';\nimport { loadProjectResourcesAction } from './resources/loadProjectResourcesAction';\nimport { loadParticipantRequirementsAction } from './requirements/loadParticipantRequirementsAction';\nimport { loadProjectIdAction } from './loadProjectIdAction';\nimport { useAppState } from '../core/redux/hooks';\nimport { projectLanguagesAction } from './messages/projectLanguagesAction';\nimport Account from '../account/Account';\nimport CustomerService from '../customerService/CustomerService';\nimport ChangeLanguageModal from '../localization/ChangeLanguageModal';\nimport { loadProjectsAction } from './loadProjectsAction';\nimport ProjectModal from './ProjectModal';\nimport ConfidentialityAgreementModal from '../legal/ConfidentialityAgreementModal';\nimport ChangePasswordModal from '../account/ChangePasswordModal';\nimport ChangeSecurityQuestionModal from '../account/ChangeSecurityQuestionModal';\nimport DevPlanRouter from './devPlan/devPlanAction/DevPlanRouter';\nimport RaterDirectorySearch from './survey/raters/directorySearch/RaterDirectorySearch';\nimport { raterLevelsAction } from './survey/raters/raterLevelsAction';\nimport Resource from './resources/CustomResource';\nimport { loadDevResourcesAction } from './resources/loadDevResourcesAction';\nimport ProjectStatusPoller from './ProjectStatusPoller';\nimport { useProjIds } from '../navigation/hooks';\nimport { PortalType } from '../navigation/portalType';\nimport { useMount } from '../core/hooks/useMount';\nimport { setPortalTypeAction } from '../core/redux/setPortalTypeAction';\nimport RemindRatersModal from './survey/raters/remindRaters/RemindRatersModal';\nimport { setDevPlanViewedAction } from './devPlan/api/setDevPlanViewedAction';\nimport { loadReportsAction } from './viewReport/api/loadReportsAction';\nimport { useCurrentUser } from '../auth/hooks';\nimport { logOutAction } from '../auth/login/api/logoutAction';\nimport { useWindowSize } from '../core/hooks/useWindowSize';\nimport EBook from './resources/EBook';\n\n\nconst styles = {\n spinner: css`\n width: 100px;\n height: 100px;\n `,\n};\n\n\ntype Props = {};\n\nconst loadProjectInfo = (\n dispatch: Dispatch,\n) => (\n projectId: number | undefined,\n participantId: number | undefined,\n languageId: number | undefined,\n hasProjects: boolean,\n userName: string | undefined,\n): void => {\n if (\n projectId === undefined\n || participantId === undefined\n || languageId === undefined\n || projectId === -1\n || participantId === -1\n || languageId === -1\n ) {\n return;\n }\n\n if (!hasProjects) {\n dispatch(loadProjectsAction(participantId));\n }\n\n dispatch(loadProjectSummaryAction(projectId, participantId));\n dispatch(loadProjectResourcesAction(projectId));\n dispatch(loadParticipantRequirementsAction(projectId, participantId, languageId));\n dispatch(projectLanguagesAction(projectId));\n dispatch(raterLevelsAction(projectId));\n dispatch(loadDevResourcesAction(projectId));\n dispatch(setDevPlanViewedAction(false));\n dispatch(loadReportsAction(projectId, participantId, userName!));\n};\n\n\n/**\n * ProjectRouter: a component that routes to different project pages\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst ProjectRouter: React.FC = props => {\n const { isMobile } = useWindowSize();\n const dispatch = useDispatch();\n const projIds = useProjIds();\n const currentUser = useCurrentUser();\n\n useMount(() => { dispatch(setPortalTypeAction(PortalType.PROJECT)); });\n\n if (!currentUser?.hasPortalLoginPermission) {\n dispatch(logOutAction(isMobile));\n }\n\n let isLoading = useLoading(ActionType.LoadProjectSummaryRequest);\n isLoading = useLoading(ActionType.LoadParticipantRequirementsRequest) || isLoading;\n isLoading = useLoading(ActionType.LoadProjectResourcesRequest) || isLoading;\n isLoading = useLoading(ActionType.LoadProjectIdRequest, projIds.projDisplayId) || isLoading;\n isLoading = useLoading(ActionType.LoadProjectsRequest) || isLoading;\n isLoading = useLoading(ActionType.LoadDevResourcesRequest) || isLoading;\n\n let hasError = useError(ActionType.LoadProjectSummaryRequest);\n hasError = useError(ActionType.LoadParticipantRequirementsRequest) || hasError;\n hasError = useError(ActionType.LoadProjectResourcesRequest) || hasError;\n hasError = useError(ActionType.LoadProjectIdRequest, projIds.projDisplayId) || hasError;\n hasError = useError(ActionType.LoadProjectsRequest) || hasError;\n hasError = useError(ActionType.LoadDevResourcesRequest) || hasError;\n\n const hasProjects = useAppState(state => !!state.projects?.length);\n\n const languageId = useAppState(state => state.locale.lang.languageId);\n const project = useAppState(state => state.projectSummary);\n const userName = useAppState(state => state.auth.currentUser?.userName);\n\n const loadProjects = React.useCallback(\n () => loadProjectInfo(dispatch)(projIds.projId, projIds.participantId, languageId, hasProjects, userName),\n [projIds.projId, projIds.participantId, hasProjects, languageId, userName, dispatch],\n );\n\n useEffect(() => {dispatch(loadProjectIdAction(projIds.projDisplayId));}, [projIds.projDisplayId, dispatch]);\n useEffect(loadProjects, [loadProjects]);\n\n const completeResponses = project?.completeResponses || 0;\n useEffect(\n () => {\n dispatch(loadParticipantRequirementsAction(projIds.projId, projIds.participantId, languageId));\n },\n [projIds.projId, projIds.participantId, languageId, completeResponses, dispatch],\n );\n\n if (isLoading || hasError) {\n return (\n
    \n {\n isLoading\n ? \n : \n }\n
    \n );\n }\n\n if (project?.confidentialRequired) {\n return ;\n }\n\n return (\n <>\n \n \n \n\n {/* Dev Plan */}\n \n\n \n \n \n \n\n \n \n \n \n \n\n \n \n\n {/* Modals */}\n \n \n \n\n {/*Dev Resources*/}\n \n \n\n \n \n\n {/* Raters */}\n \n \n \n\n {/* Non-Rendering */}\n \n \n );\n};\n\nexport default ProjectRouter;\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport { useRoutes } from '../../../navigation/routes';\nimport { useAppState } from '../../../core/redux/hooks';\nimport { Redirect, Route, RouteProps, RouteComponentProps } from 'react-router-dom';\nimport { PAGE_BG, PAGE_HEIGHT } from '../../../layout/pageStyle';\nimport { FLEX_COLUMN, FLEX_CENTERED } from '../../../layout/flexBox';\nimport { Spinner } from '../../../loading/Spinner';\nimport { COLORS } from '../../../globalStyle/colors';\nimport { css } from '@emotion/core';\nimport { useCurrentCollaborator } from './hooks';\n\n\nconst styles = {\n spinner: css`\n width: 100px;\n height: 100px;\n `,\n};\n\n\ninterface Props extends RouteProps {\n component: React.ComponentType> | React.ComponentType;\n path: string;\n}\n\n\n/**\n * CollaboratorRoute: a component that renders the requested route, when the user is a dev plan collaborator, otherwise\n * redirects the user to project login\n */\nconst CollaboratorRoute: React.FC = props => {\n const isCollaborator = !!useCurrentCollaborator();\n const routes = useRoutes();\n\n const sessionStorageLoaded = useAppState(state => state.sessionStorageLoaded);\n\n const { component, ...rest } = props;\n\n const renderFunc = useCallback(\n (routeProps: any) => isCollaborator\n ? \n : ,\n // Eslint apparently doesn't see JSX tags as a usage...\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isCollaborator, props.component],\n );\n\n return sessionStorageLoaded\n ? \n : (\n
    \n \n
    \n );\n};\n\nexport default CollaboratorRoute;\n","import * as React from 'react';\nimport { useEffect, useCallback } from 'react';\nimport { Switch, Route } from 'react-router-dom';\nimport { RouteTemplates } from '../../../navigation/routes';\nimport DevPlanItem from '../DevPlanItem';\nimport DevPlanView from '../DevPlanView';\nimport { Dispatch } from 'redux';\nimport { getDevPlanItemsAction } from '../api/getDevPlanItemsAction';\nimport { getDevPlanActionsAction } from '../devPlanAction/api/getDevPlanActionsAction';\nimport { getDevPlanCollaboratorsAction } from './api/getDevPlanCollaboratorsAction';\nimport { getDevItemCommentsAction } from './api/getDevItemCommentsAction';\nimport { useDispatch } from 'react-redux';\nimport { useMount } from '../../../core/hooks/useMount';\nimport { setPortalTypeAction } from '../../../core/redux/setPortalTypeAction';\nimport { PortalType } from '../../../navigation/portalType';\nimport { loadProjectSummaryAction } from '../../loadProjectSummaryAction';\nimport { useCollaborationProjIds } from './hooks';\nimport { PAGE_BG, PAGE_HEIGHT } from '../../../layout/pageStyle';\nimport { FLEX_COLUMN, FLEX_CENTERED } from '../../../layout/flexBox';\nimport { Spinner } from '../../../loading/Spinner';\nimport { COLORS } from '../../../globalStyle/colors';\nimport ErrorMsg from '../../../error/ErrorMsg';\nimport { Str } from '../../../localization/translationKeys';\nimport { css } from '@emotion/core';\nimport { getDevPlanStatusesAction } from '../devPlanAction/api/getDevPlanStatusesAction';\nimport CustomerService from '../../../customerService/CustomerService';\nimport { useAnyLoading, useAnyError } from '../../../core/api/hooks';\nimport { ActionType } from '../../../core/redux/actionType';\nimport { getDevPlanFieldsAndAnswersAction } from '../devPlanAction/api/getDevPlanFieldsAndAnswersAction';\nimport { useAppState } from '../../../core/redux/hooks';\n\n\nconst styles = {\n spinner: css`\n width: 100px;\n height: 100px;\n `,\n};\n\n\nconst API_ACTIONS = [\n ActionType.LoadProjectSummaryRequest,\n ActionType.GetDevPlanItemsRequest,\n ActionType.GetDevPlanActionsRequest,\n ActionType.GetDevPlanFieldsAndAnswersRequest,\n ActionType.GetDevPlanCollaboratorsRequest,\n ActionType.GetDevItemCommentsRequest,\n ActionType.GetStatusKeysRequest,\n];\n\n\nconst loadProjectInfo = (dispatch: Dispatch) => (\n projectId: number,\n participantId: number,\n) => {\n dispatch(loadProjectSummaryAction(projectId, participantId));\n};\n\nconst loadPlanInfo = (dispatch: Dispatch) => (\n devPlanProjectId: number,\n participantId: number,\n) => {\n dispatch(getDevPlanItemsAction(devPlanProjectId, participantId));\n dispatch(getDevPlanActionsAction(devPlanProjectId, participantId));\n dispatch(getDevPlanFieldsAndAnswersAction(devPlanProjectId, participantId));\n dispatch(getDevPlanStatusesAction());\n dispatch(getDevPlanCollaboratorsAction(devPlanProjectId, participantId));\n dispatch(getDevItemCommentsAction(devPlanProjectId, participantId));\n};\n\n/**\n * CollaboratorDevPlanRouter: a component that renders the dev plan views available to collaborators\n */\nconst CollaboratorDevPlanRouter: React.FC = () => {\n const dispatch = useDispatch();\n\n const { projId, participantId } = useCollaborationProjIds();\n\n const loadProject = useCallback(\n () => { loadProjectInfo(dispatch)(projId, participantId); },\n [dispatch, participantId, projId],\n ); \n\n const devPlanProjectId = useAppState(state => state.projectSummary?.devPlanProjectId || projId);\n\n useMount(() => { dispatch(setPortalTypeAction(PortalType.COLLABORATOR)); });\n\n const loadData = useCallback(\n () => { loadPlanInfo(dispatch)(devPlanProjectId, participantId); },\n [dispatch, devPlanProjectId, participantId],\n );\n\n useEffect(\n () => {\n if (projId > 0 && participantId > 0 && devPlanProjectId > 0) {\n loadProject();\n loadData();\n }\n },\n [dispatch, loadProject, loadData, participantId, projId, devPlanProjectId],\n );\n\n const isLoading = useAnyLoading(API_ACTIONS);\n const hasError = useAnyError(API_ACTIONS);\n\n if (isLoading || hasError) {\n return (\n
    \n {\n isLoading\n ? \n : \n }\n
    \n );\n }\n\n return (\n \n \n \n \n \n );\n};\n\nexport default CollaboratorDevPlanRouter;\n","import React, { useState } from 'react'; //, { useMemo }\nimport { css } from '@emotion/core';\nimport { useParams } from 'react-router-dom';\nimport { BaseUrl } from '../core/api/endpoints';\nimport { pathCombine } from '../core/api/module';\nimport { useMount } from '../core/hooks/useMount';\nimport LocalDiv from '../localization/LocalDiv';\nimport Msg from '../localization/Msg';\nimport { Str } from '../localization/translationKeys';\nimport { Loader } from '../loading/Loader';\nimport { useBrowser } from '../language/useBrowser';\n\nconst styles = {\n iframe: css`\n width: 100%;\n height: calc(100vh - 51px);\n `,\n notFoundMsg: css`\n margin-top: 60px;\n display: block;\n text-align: center;\n font-weight: bold;\n `,\n loader: css`\n width: 150px;\n height: 150px;\n margin: 60px auto 0;\n `,\n};\n\ntype Props = {\n folder: string;\n className?: string;\n};\n\n/**\n * FileData: a component that renders file data from the server.\n *\n * PureComponent: true\n * Redux Connected: false\n */\nconst FileData: React.FC = props => {\n // get file name from URL\n const { fileName } = useParams() as { \n fileName: string;\n }\n // assign file type based on file extension\n const fileType = () => {\n const file = fileName.toLowerCase().trim();\n if (file.endsWith('.pdf')) {\n return 'application/pdf';\n }\n if (file.endsWith('.docx')) {\n return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n }\n if (file.endsWith('.pptx')) {\n return 'application/vnd.ms-powerpoint';\n }\n if (file.endsWith('.xlsx')) {\n return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n }\n if (file.endsWith('.htm') || file.endsWith('.html')) {\n return 'text/html';\n }\n return 'application/octet-stream'; \n };\n\n // get file data from api\n const [url, setUrl] = useState('');\n const [error, setError] = useState(false);\n const { onIe } = useBrowser();\n\n const getFileData = () => {\n const apiUrl = pathCombine(BaseUrl, 'document', 'fileData');\n const requestData = { folder: props.folder, fileName: fileName }\n const http = new XMLHttpRequest()\n http.open('POST', apiUrl)\n http.setRequestHeader('content-type', 'application/json')\n http.send(JSON.stringify(requestData))\n http.responseType = 'json';\n http.onload = function () {\n if (http.status === 200) {\n const response = http.response;\n const decoded = window.atob(response);\n const len = decoded.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = decoded.charCodeAt(i);\n }\n if (bytes !== undefined && bytes.length > 0) {\n const blob = new Blob([bytes], { type: fileType() });\n//TODO - maybe try something else to hack this into submission for IE?\n/* \n if (true) {\n let iFrameDoc = iframe.contentWindow && iframe.contentWindow.document;\n if (!iFrameDoc) {\n console.log(\"iFrame security.\");\n return;\n }\n iFrameDoc.write(blob);\n iFrameDoc.close();\n }\n*/\n setUrl(URL.createObjectURL(blob));\n } else {\n setError(true);\n }\n } else {\n setError(true);\n }\n };\n };\n\n useMount(() => { !onIe && getFileData(); });\n\n return (\n onIe\n ? \n Not supported by Internet Explorer - please try another browser\n \n : error \n ? \n \n \n : url.length > 0\n ? \n : \n );\n};\n\nexport default FileData;\n","import * as React from 'react';\nimport { Switch, Route, Redirect } from 'react-router-dom';\nimport { RouteTemplates, makeRoutes } from './routes';\nimport { CopyrightStatement, PrivacyStatement } from '../legal/Statement';\nimport YmcaLoginPage from '../auth/sso/YmcaLoginPage';\nimport YmcaSsoPage from '../auth/sso/YmcaSsoPage';\nimport SamlAssertionPage from '../auth/sso/SamlAssertionPage';\nimport SsoErrorPage from '../auth/sso/SsoErrorPage';\nimport LoginPage from '../auth/login/LoginPage';\nimport RaterApprovalRedirect from '../auth/login/RaterApprovalRedirect';\nimport ForgotPasswordPage from '../auth/forgotPassword/ForgotPasswordPage';\nimport { ActionType } from '../core/redux/actionType';\nimport {\n sendRaterApprovalPasswordResetEmailAction,\n} from '../auth/forgotPassword/api/sendRaterApprovalPasswordResetEmailAction';\nimport ProtectedRoute from '../auth/ProtectedRoute';\nimport AccountSetupPage from '../auth/accountSetup/AccountSetupPage';\nimport RaterApprovalRouter from '../raterApproval/RaterApprovalRouter';\nimport ReportRecipientRedirect from '../reportRecipient/ReportRecipientRedirect';\nimport {\n sendReportRecipientPasswordResetEmailAction,\n} from '../auth/forgotPassword/api/sendReportRecipientPasswordResetEmailAction';\nimport ReportRecipientRouter from '../reportRecipient/ReportRecipientRouter';\nimport ProjectModal from '../project/ProjectModal';\nimport { sendPortalPasswordResetEmailAction } from '../auth/forgotPassword/api/sendPortalPasswordResetEmailAction';\nimport ProjectRouter from '../project/ProjectRouter';\nimport CollaboratorRoute from '../project/devPlan/collaboration/CollaboratorRoute';\nimport CollaboratorDevPlanRouter from '../project/devPlan/collaboration/CollaboratorDevPlanRouter';\nimport FileData from '../fileData/FileData';\n\n\n/**\n * AppRouter: a component that\n */\nconst AppRouter: React.FC = () => {\n const routes = makeRoutes();\n\n return (\n \n \n \n\n \n \n \n \n\n (\n }\n />\n )\n }\n />\n (\n \n )\n }\n />\n } />}\n />\n\n \n \n\n (\n }\n />\n )\n }\n />\n (\n \n )\n }\n />\n } />}\n />\n\n \n \n\n (\n \n }\n />\n )\n }\n />\n (\n \n )\n }\n />\n } />}\n />\n \n \n\n }\n />\n }\n />\n }\n />\n }\n />\n\n {/* All unmatched routes go to login */}\n \n \n );\n};\n\nexport default AppRouter;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport { BrowserRouter } from 'react-router-dom';\nimport { applyMiddleware, createStore, compose } from 'redux';\nimport { apiMiddleware } from 'redux-api-middleware';\nimport { makeInitialState } from './core/redux/appState';\nimport { loggingMiddleware } from './core/redux/middleware/loggingMiddleware';\nimport { noOpMiddleware } from './core/redux/middleware/noOpMiddleware';\nimport { rootReducer } from './core/redux/rootReducer';\nimport { IS_DEV_ENV, IS_TEST_ENV } from './core/windowProps';\nimport './index.css';\nimport AppStateSessionStorageBridge from './localStorage/AppStateSessionStorageBridge';\nimport * as serviceWorker from './serviceWorker';\nimport TranslationLoader from './localization/TranslationLoader';\nimport { makeRoutes } from './navigation/routes';\nimport ConfigLoader from './featureFlags/ConfigLoader';\nimport RtlToggle from './localization/RtlToggle';\nimport { Global } from '@emotion/core';\nimport { GLOBAL_FONTS } from './globalStyle/fonts';\nimport LocalDiv from './localization/LocalDiv';\nimport AppVersion from './version/AppVersion';\nimport OldRouteInterceptor from './navigation/OldRouteInterceptor';\nimport { defaultLanguages } from './localization/defaultLanguages';\nimport { AnimatePresence } from 'framer-motion';\nimport { isOnMobile } from './language/browser';\nimport './globalStyle/date-picker-cal.css';\nimport LogoutTimer from './auth/LogoutTimer';\nimport TimeoutModal from './TimeoutModal';\nimport AppRouter from './navigation/AppRouter';\n\n\nconst devTools = (window as any).__REDUX_DEVTOOLS_EXTENSION__;\nconst devMiddleware = IS_DEV_ENV && devTools ? devTools() : (f: any) => f;\nconst logger = IS_DEV_ENV || IS_TEST_ENV ? loggingMiddleware : noOpMiddleware;\n\n// Set the default locale for now. We'll try to set it for real when the TranslationLoader mounts.\nconst initialAppState = makeInitialState(defaultLanguages['en'], isOnMobile(window));\n\nconst enhancers = compose(\n applyMiddleware(\n logger, // Keep first to log all incoming actions unaltered by subsequent middleware\n apiMiddleware,\n ),\n devMiddleware,\n);\n\nexport const store = createStore(rootReducer, initialAppState, enhancers);\n\n\nconst routes = makeRoutes();\n\n\nReactDOM.render(\n \n {/* Global Styles */}\n \n\n \n \n {/* Non-Rendering Components */}\n \n \n \n \n\n \n \n \n \n\n \n\n \n \n \n\n \n\n \n \n ,\n document.getElementById('react-root'),\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","import { Middleware } from 'redux';\n\n\n/**\n * A middleware function that does nothing.\n */\nexport const noOpMiddleware: Middleware = state => next => action => next(action);\n","module.exports = \"data:image/gif;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANoAAABsCAYAAAAMjqyzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDYuMC1jMDAyIDc5LjE2NDQ2MCwgMjAyMC8wNS8xMi0xNjowNDoxNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjIgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjkzNUY5MTA3MkRCQTExRUJCMTQ1RjdEMERFQUQ4NTUwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjkzNUY5MTA4MkRCQTExRUJCMTQ1RjdEMERFQUQ4NTUwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTM1RjkxMDUyREJBMTFFQkIxNDVGN0QwREVBRDg1NTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OTM1RjkxMDYyREJBMTFFQkIxNDVGN0QwREVBRDg1NTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4Sdz2qAAAQK0lEQVR42uycCXgU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\""],"sourceRoot":""}