{"version":3,"sources":["redux/actions/types.js","redux/reducers/user.js","redux/reducers/search.js","redux/reducers/app.js","redux/reducers/root.js","redux/store/reduxStore.js","AppInsights.js","utils/apiAgent.js","utils/userFeedback.js","redux/actions/user/login.js","components/form-validators.jsx","components/form-components.jsx","redux/actions/app/resetNext.js","components/LoginForm/LoginForm.jsx","assets/City-day.mp4","views/Login/Login.jsx","views/Index/Index.jsx","assets/onboarding.jpg","assets/training.jpg","assets/welcome.jpg","assets/congratulations.jpg","redux/actions/user/updateUser.js","redux/actions/thunkCreators.js","components/CourseTask/TasksComplete/TasksComplete.jsx","components/CourseSummary/CourseSummary.jsx","components/CourseCards/UserCourseCard.jsx","utils/documentTypes.js","components/DocumentCard/DocumentCard.jsx","redux/actions/search/setQuery.js","redux/actions/search/resetSearch.js","components/SearchDocumentForm/SearchDocumentForm.jsx","components/LinkCard/LinkCard.jsx","views/Dashboard/Dashboard.jsx","hooks/axiosHook.js","components/DocumentDetails/MetadataCard/EditHistoryGrid/utils/processEditHistory.js","components/DocumentDetails/MetadataCard/EditHistoryGrid/EditHistoryGrid.jsx","utils/dataTransformations.js","components/DocumentDetails/MetadataCard/MetadataCard.jsx","components/DocumentDetails/DocumentDetails.jsx","views/ViewDocument/Fab/Fab.js","views/ViewDocument/ViewDocument.jsx","components/UploadDocumentForm/form-components.js","utils/auth/userAuth.js","components/form-defaults.js","components/UploadDocumentForm/UploadDocumentForm.jsx","views/UploadDocument/Fab/Fab.js","views/UploadDocument/UploadDocument.jsx","components/UpdateDocumentForm/form-components.js","components/UpdateDocumentForm/UpdateDocumentForm.jsx","components/DeleteModal/DeleteModal.jsx","views/UpdateDocument/Fab/Fab.js","views/UpdateDocument/UpdateDocument.jsx","assets/Error_TV.svg","views/NotFoundPage/NotFoundPage.jsx","redux/actions/user/logout.js","components/SiteLayout/SiteHeader/SiteHeader.jsx","assets/header-bg.png","assets/logo.png","components/SiteLayout/SiteLayout.jsx","components/SearchResultsGrid/SearchResultsGrid.jsx","views/Search/UseCard/UseCard.jsx","views/Search/Fab/Fab.js","views/Search/Search.jsx","views/Search/utils/processSearchResults.js","views/Courses/MyCourses/MyCourses.jsx","components/CourseTask/DocumentTask/DocumentTask.jsx","components/CourseTask/SignatureTask/SignatureTask.jsx","components/CourseTask/QuizTask/QuizTask.jsx","components/CourseTask/VideoTask/VideoTask.jsx","views/Courses/TakeCourse/TakeCourse.jsx","components/SearchUserForm/SearchUserForm.jsx","components/AssignCourseWindow/UserSelectionList/UserSelectionList.jsx","components/AssignCourseWindow/AssignCourseWindow.jsx","views/Courses/AdminCourses/AdminCourses.jsx","views/Courses/EditCourse/EditTaskWindow/QuestionTaskFields/QuestionTaskFields.jsx","views/Courses/EditCourse/EditTaskWindow/DocumentTaskFields/UploadDocumentFields/UploadDocumentFields.jsx","views/Courses/EditCourse/EditTaskWindow/DocumentTaskFields/UpdateDocumentFields/UpdataeDocumentFields.jsx","views/Courses/EditCourse/EditTaskWindow/DocumentTaskFields/DocumentTaskFields.jsx","views/Courses/EditCourse/EditTaskWindow/EditTaskWindow.jsx","views/Courses/EditCourse/EditCourse.jsx","utils/gridCells.js","views/Users/UserList/UserList.jsx","views/Users/UserEdit/UserCourseGrid.jsx","utils/validators.js","views/Users/UserEdit/UserEdit.jsx","views/Users/UserCreate/UserCreate.jsx","views/Reports/Reports.jsx","views/Reports/PastDueReport.jsx","views/Reports/AssignedCoursesReport.jsx","views/Applications/AdminApplications/AdminApplications.jsx","components/ApplicationFieldGroups/LicensesCertificatesFields.jsx","components/ApplicationFieldGroups/MilitaryServiceFields.jsx","components/ApplicationFieldGroups/EducationFields.jsx","components/ApplicationFieldGroups/AvailabilityFields.jsx","components/ApplicationFieldGroups/PositionDesiredFields.jsx","components/ApplicationFieldGroups/PermanentAddressFields.jsx","components/ApplicationFieldGroups/PresentAddressFields.jsx","components/ApplicationFieldGroups/MainApplicationFields.jsx","components/ApplicationFieldGroups/EmploymentFields.jsx","components/ApplicationFieldGroups/ReferencesFields.jsx","components/ApplicationFieldGroups/EmploymentUnderstanding.jsx","assets/application-image.jpg","views/Applications/EmploymentApplication/EmploymentApplication.jsx","views/Applications/ContinueApplication/ContinueApplication.jsx","views/Applications/ViewApplication/ViewApplication.jsx","redux/actions/user/updateToken.js","redux/actions/app/setNext.js","routes/appRoutes.js","views/AppError/AppError.jsx","App.js","index.js"],"names":["LOG_OUT","LOG_IN","UPDATE_USER","UPDATE_TOKEN","RESET_SEARCH","SET_RESULTS","SET_QUERY","SET_NEXT","RESET_NEXT","INIT_STATE","token","user","state","action","type","payload","results","query","search","next","app","combineReducers","persistConfig","key","storage","persistedReducer","persistReducer","rootReducer","store","createStore","composeWithDevTools","applyMiddleware","thunk","persistor","persistStore","browserHistory","createBrowserHistory","basename","reactPlugin","ReactPlugin","appInsights","ApplicationInsights","config","instrumentationKey","window","workplaceSettings","appInsightsInstrumentationKey","extensions","extensionConfig","identifier","history","loadAppInsights","addTelemetryInitializer","envelope","tags","BASE_URL","apiUrl","process","REACT_APP_BASE_URL","ApiAgent","userData","axios","post","Routes","login","resp","data","trackException","exception","properties","name","error","refreshToken","_token","id","params","get","getDocument","uploadData","uploadDocMetadata","url","documentMetadata","editData","patch","searchDocMetadata","deleteData","delete","deleteDocument","version","getCourse","courseAdmin","put","user_id","course_id","update","assignCourse","getUsers","map","x","timestamp","Date","_ts","createUser","editUser","courseName","getCourseAssignments","encodeURIComponent","fileUid","applicationId","getResume","category","queryString","createErrorFeedbackMessage","response","status","FormFeedback","feedback","feedbackRef","variant","rest","Typography","className","role","ref","message","networkErrorMessageObjFactory","successMessageObjFactory","errorMessageObjFactory","documentSuccessMessageObjFactory","msg","page","Box","display","component","mr","to","appRoutes","documents","anchorElement","position","title","makeViewDocUrl","nameExistsMessageObjFactory","setSearchQuery","tabIndex","onKeyPress","onClick","UploadLink","document","querySelector","click","toTitleCase","str","trim","split","word","toUpperCase","slice","join","scrollFeedbackIntoView","setTimeout","current","scrollIntoView","behavior","block","basicValidator","value","booleanValidator","categoryValidator","nameValidator","usernameValidator","passwordValidator","urlValidator","test","phoneValidator","zipCodeValidator","ssnValidator","FormInput","fieldRenderProps","validationMessage","touched","label","valid","disabled","hint","optional","others","showValidationMessage","showHint","hintId","errorId","editorId","editorValid","editorDisabled","ariaDescribedBy","FormFloatingInput","editorValue","FormRadioGroup","labelStyle","visited","modified","editorRef","React","labelId","style","ariaLabelledBy","FormCheckbox","labelOptional","FormMaskedTextBox","FormTextArea","FormUpload","autoUpload","showActionButtons","multiple","files","onAdd","event","onChange","newState","onRemove","FormDropDownList","wrapperStyle","wrapperClassName","textField","dataItemKey","FormComboBox","FormFloatingComboBox","FormFloatingMultiSelect","formOnChange","allowCustom","allowDuplicates","e","values","target","lastItem","pop","includes","FormDatePicker","hintDirection","direction","FormFloatingNumericTextBox","resetNext","formStyle","maxWidth","width","useStyles","makeStyles","theme","buttonDiv","marginTop","spacing","paddingRight","breakpoints","up","classNamePrefix","LoginForm","classes","useHistory","dispatch","useDispatch","useState","formFeedback","setFormFeedback","loading","setLoading","useSelector","handleSubmit","useCallback","formData","a","username","password","push","onSubmit","render","formRenderProps","mb","validator","autoComplete","flexDirection","justifyContent","Button","color","loginButton","allowSubmit","videoBackground","minHeight","maxHeight","objectFit","zIndex","root","paddingTop","paddingBottom","card","alignItems","backgroundColor","padding","avatar","margin","palette","primary","main","formWrapper","marginBottom","submit","Login","videoBackgroundRef","useRef","useEffect","playbackRate","autoPlay","loop","muted","playsInline","src","City","default","kind","srcLang","Container","Card","Avatar","Index","updateUser","updateTasksCompleted","taskNumber","taskData","apiRoutes","userTask","task_completed","console","resetTasksCompleted","updateUserThunkCreator","userId","patchUser","cardImage","completeTaskHeader1","fontSize","completeTaskHeader2","completeTaskDetails","border","minWidth","marginLeft","marginRight","textAlign","TasksComplete","userCourse","passingScore","setTaskNumber","handleResetCourse","Number","isFinite","score","dateCompleted","completed_date","DateTime","fromISO","now","userPassedCourse","congratulations","alt","gutterBottom","transform","firstname","lastname","toLocaleString","DATETIME_MED","course_version","displayPrint","print","DialogTitle","withStyles","closeButton","right","top","grey","props","children","onClose","other","disableTypography","IconButton","DialogContent","MuiDialogContent","CourseSummary","open","setResp","setError","Dialog","course","passing_percentage","cardHeader","overflow","media","height","actions","UserCourseCard","summaryDialogOpen","setSummaryDialogOpen","assignedOn","useMemo","assigned_date","DATE_SHORT","complete","completedDate","due_in_days","Math","round","parse","due_date","closeModal","CardHeader","noWrap","CardMedia","image","onboarding","welcome","training","CardContent","Grid","container","justify","item","xs","CardActions","makeTakeCourseUrl","memo","allowedUploadExtensions","fileIconDictionary","extension","documentDetails","colors","DocumentCard","file_extension","setQuery","resetSearch","SearchDocumentForm","setSearchResults","previousQuery","callback","q","setFormData","handleCancelSearch","handleChange","newValue","onRequestSearch","onCancelSearch","linkIcon","float","cardContent","whiteSpace","LinkCard","linkInfo","href","rel","icon","section","Dashboard","favoriteDocuments","setFavoriteDocuments","courses","filter","getFavDocs","promiseArray","favorites","fav","getDocMetadata","Promise","all","gotoSearch","AppRoutes","links","index","length","m","AxiosGetHook","abort","getData","processEditHistory","metadata","editHistory","edit_history","metadataLast","reverse","forEach","editRecord","edit_date","hour","day","fields_altered","changed_to","previous_data","Object","entries","val","tag","processPreviousData","DetailComponent","this","dataItem","idx","k","v","GridDetailRow","pageableSettings","buttonCount","info","pageSizes","previousNext","EditHistoryGrid","gridRef","skip","take","pagingState","setpagingState","setData","sort","setSort","pageChange","expandChange","expanded","pageData","orderBy","handleSortChange","onRowClick","total","pageable","onPageChange","sortable","onSortChange","reorderable","detail","expandField","onExpandChange","field","processMetatdata","copy","last_modified","boxSizing","filename","paddingLeft","cardActions","borderTop","fadedSmall","MetadataCard","fileMetadata","downloadButton","isFavorite","setIsFavorite","setExpanded","anchorEl","setAnchorEl","processedMetadata","cardData","headerTitle","headerSubtitle","headerSubtitle2","lastModified","file_size_KB","file_size","handleFavorite","updatedFavorites","el","currentTarget","Menu","keepMounted","Boolean","MenuItem","makeUpdateUrl","titleTypographyProps","sm","mt","Tooltip","clsx","expand","expandOpen","Collapse","in","timeout","unmountOnExit","DownloadButton","DocumentDetails","download","items","text","NaviFab","onItemClick","itemIndex","uploadDoc","itemClickedHandler","themeColor","alignOffset","y","pdfCheckRegex","paper","pdfSpacer","ViewDocument","useParams","ApiRoutes","respMetadata","respMetaError","urlDocument","encoded","embedUrl","size","frameBorder","scrolling","Fab","FileInput","handleNameChange","setFiles","saveUrl","setSaveUrl","batch","restrictions","allowedExtensions","maxFileSize","file","affectedFiles","match","fileExtension","uuidv4","fileSizeKb","valueGetter","uploadUrl","onProgress","onStatusChange","withCredentials","removeUrl","return200","getUserEditPermissions","tokenData","decode","groups","permission","permType","imageTypes","taskTypes","formWidth","down","UploadDocumentForm","nameTimerRef","editPermissions","searchName","clearTimeout","editedFormData","initialValues","my","Input","itemClickedToAppUrl","cardWrapper","UploadDocument","lastUpdate","setLastUpdate","updateDocMetadata","then","resolve","fieldset","checkDataChanged","lastData","newData","string","toLowerCase","JSON","stringify","UpdateDocumentForm","updateLoading","setUpdateLoading","formFeedbackFile","setFormFeedbackFile","updateResp","DeleteDialog","delModalOpen","setDelModalOpen","itemDetail","handleDelete","delDisabled","setDelDisabled","nameTitleCase","handleClose","DialogContentText","TextField","fullWidth","DialogActions","UpdateDocument","deleteFormFeedback","setDeleteFormFeedback","deleteResp","replace","DeleteModal","overlay","backgroundImage","UFO","backgroundSize","backgroundRepeat","backgroundPosition","NotFoundPage","align","logout","logoutButton","SiteHeader","onButtonClick","hideMenu","pathname","isWorkplacePage","employmentApplication","continueApplication","displayName","route","dashboard","myCourses","separator","accessGroup","adminUsers","adminCourses","reports","applications","getUserMenuItems","some","isInGroup","getHeaderTextFromPath","withRouter","innerWidth","isSmallerScreen","setIsSmallerScreen","userMenuItems","handleClick","addEventListener","resizeWindow","removeEventListener","selected","pathName","currentPath","find","getSelectedItem","location","takeCourse","Fragment","animation","duration","mode","mini","onOverlayClick","onSelect","itemTarget","gridStyle","columns","minGridWidth","SearchResultsGrid","searchResults","setPagingState","visibleColumns","setVisibleColumns","handleResize","grid","currentVisibleColumns","c","offsetWidth","handleRowClick","gridData","column","cardBody","cardUl","lineHeight","cardSearchIcon","UseCard","infoButton","borderRadius","opacity","loaderSpacing","Search","infoWindowVisible","setInfoWindowVisible","makeSearch","toggleUseWindow","initialHeight","initialWidth","MyCourses","assignedUserCourses","completedUserCourses","pdfjs","GlobalWorkerOptions","workerSrc","DocumentTask","currTask","setAllowNext","numPages","setNumPages","document_id","Hidden","smDown","isMobile","onLoadSuccess","nextNumPages","Array","from","pageNumber","isBrowser","header","subtitle","formElement","nameInputDiv","nameInput","buttonBox","Signature","currTaskDone","signatureValidator","RegExp","ev","tasks_completed","pb","quizQuestion","choicesDiv","quizChoices","feedbackDiv","highlightAnswer","answer","userAnswer","answerChoices","newResult","answerCorrect","classList","add","fontStyle","QuizTask","currTaskResult","courseId","selectedAnswerChoice","setSelectedAnswerChoice","formRenderPropsRef","setAnswerChoices","choices","fill","_","i","createRef","enableForm","onFormReset","quizForm","dir","checked","playButtonDiv","playButton","transition","VideoTask","videoLinkClicked","video_password","video_url","wrapper","overflowY","bottomNavigation","bottom","bottomNavigationAction","loader","TakeCourse","allowNext","completeTaskDialogOpen","setCompleteTaskDialogOpen","quizAnswers","tasks","numberOfTasks","tasksDone","handleCloseDialog","SignatureTask","BottomNavigation","showLabels","BottomNavigationAction","ArrowBack","ArrowForward","autoFocus","SearchUserForm","searchQuery","getResults","flexWrap","idGetter","getter","boxShadow","dataGrid","UserList","usersSelectedCallback","selectedState","setSelectedState","initialSearchCompleted","setInitialSearchCompleted","onSearchResults","users","is_active","onSelectionChange","newSelectedState","getSelectedState","onHeaderSelectionChange","syntheticEvent","dataItems","CircularProgress","resizable","selectedField","selectable","enabled","drag","cell","headerSelectionValue","findIndex","formLegend","borderColor","borderWidth","borderStyle","textTransform","formInputs","AssignCourseWindow","courseDetails","setAssignWindowOpen","usersSelected","setUsersSelected","updateAssignment","setUpdateAssignment","requests","responses","errors","onCloseClick","maximizeButton","minimizeButton","modal","appendTo","body","UserSelectionList","layout","AdminCourses","assignWindowOpen","setCourseDetails","getCourses","deleteCourse","CommandCell","makeEditCourse","uuid4","answers","answersButton","QuestionTaskFields","setAnswer","setChoices","handleRadioChange","addQuizChoice","removeQuizChoice","choiceNumber","choiceName","idCallback","UpdateDocumentFields","legend","DocumentTaskFields","additionalDocumentForm","setAdditionalDocumentForm","documentFormFeedback","setDocumentFormFeedback","documentFeedbackRef","initialState","documentId","setDocumentId","UploadDocumentFields","actionBar","makeChoicesFromFormData","choicesSeen","adjustAnswer","startsWith","adjustedAnswer","EditTaskWindow","dataItemIdx","setGridData","questionFormFeedback","setQuestionFormFeedback","formType","setFormType","questionFeedbackRef","choice","inputName","updatedTask","handleTypeChange","overflowX","stateChip","formButtons","MyContext","createContext","reorder","dragStart","DragCell","currentContext","useContext","onDragOver","preventDefault","dataTransfer","dropEffect","draggable","cursor","onDragStart","EditCourse","activeItem","setActiveItem","showEditWindow","setShowEditWindow","draftRef","blankFormDefaultsRef","saveAsDraft","putCourseAdmin","submitResp","pushCourseAdmin","reorderedData","prevIndex","nextIndex","splice","dataIdx","dataIndex","createNewTask","closeEditTaskWindow","deleteDraft","delete_draft_only","delResp","getCourseAdmin","courseResp","reload","cancelEditCourse","goBack","Chip","md","lg","min","Provider","placement","BooleanCell","DateDisplayCell","CourseTitleVersionCell","makeEditUserUrl","excelExport","pr","save","format","UserCourseGrid","minResizableWidth","emailRegex","emailValidator","userNameValidator","requiredValidator","list","UserEdit","resetPassword","setResetPassword","setPassword","passwordHandleChange","confirmPasswordValidator","groupAxiosCall","getAccessGroups","allGroups","loadingGroups","getUser","resetPasswordHandleChange","confirmPassword","is_ad_auth","bgcolor","p","pl","userTagData","userTags","created_date","DATETIME_SHORT","inactive_date","List","dense","group","ListItem","ListItemText","UserCreate","newUser","toISO","reportCard","reportTitle","avatarRed","secondary","avatarBlue","ReportCard","avatarText","avatarClass","description","link","subheader","Reports","reportPastDue","reportAssignedCourses","PastDueReport","getPastDueCourses","sectionHeader","courseDropdown","searchButton","AssignedCoursesReport","setCourse","loadingCourses","fetchData","AdminApplications","getApplications","applicant_signature_date","DATE_MED","makeViewApplication","LicensesCertificatesFields","professional_licenses","showLicenses","setShowLicenses","fontWeight","lgUp","formLegendAlternate","MilitaryServiceFields","EducationFields","attended_college","showCollege","setShowCollege","attended_vocational","showVocational","setShowVocational","military_service","showMilitary","setShowMilitary","handleVisibilityStateChange","setter","AvailabilityFields","employmentTypeData","workedAsAideTypeData","PositionDesiredFields","PermanentAddressFields","mask","PresentAddressFields","MainApplicationFields","EmploymentFields","ReferencesFields","EmploymentUnderstanding","Transition","forwardRef","Slide","headerImageDiv","AppImage","headerImgOverlay","left","headerText","headerTextAlt","uploadDiv","submitButton","textCenter","processFileData","resume","progress","fileId","uid","resumeFile","getRawFile","toBase64","dataURL","Error","fileData","reject","reader","FileReader","readAsDataURL","onload","result","onerror","EmploymentApplication","submitError","setSubmitError","submitting","setSubmitting","showSubmittedDialog","setShowSubmittedDialog","runOnceRef","convertDates","setProperty","submitApplication","application","ApplicationError","ml","TransitionComponent","date_of_application","date_available","resumeSpacer","resumeCardContent","ViewApplication","resumeData","setResumeData","pdfExportComponent","resumeResp","handleSaveFile","dataUrl","saveAs","FormComponent","ContinueApplication","paperSize","keepTogether","scale","updateToken","setNext","nextPath","ProtectedRoute","Component","tokenExpired","setTokenExpired","tokenExpiringSoon","exp","interval","setInterval","clearInterval","catch","err","defaults","headers","common","exact","path","editCourse","viewDoc","updateDoc","viewApplication","AppError","class","createMuiTheme","light","dark","contrastText","overrides","MuiCardContent","withAITracking","AppInsightsErrorBoundary","onError","ThemeProvider","ReactDOM","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.eb75fbe2.chunk.js","sourcesContent":["export const LOG_OUT = 'LOG_OUT';\r\nexport const LOG_IN = 'LOG_IN';\r\nexport const UPDATE_USER = 'UPDATE_USER';\r\nexport const UPDATE_TOKEN = 'UPDATE_TOKEN';\r\nexport const RESET_SEARCH = 'RESET_SEARCH';\r\nexport const SET_RESULTS = 'SET_RESULTS';\r\nexport const SET_QUERY = 'SET_QUERY';\r\nexport const SET_NEXT = 'SET_NEXT';\r\nexport const RESET_NEXT = 'RESET_NEXT';\r\n","/** User reducer. */\r\n\r\nimport { LOG_OUT, LOG_IN, UPDATE_USER, UPDATE_TOKEN } from '../actions/types';\r\n\r\nconst INIT_STATE = {\r\n token: null,\r\n user: null,\r\n};\r\n\r\nfunction user(state = INIT_STATE, action) {\r\n switch (action.type) {\r\n case LOG_OUT:\r\n return { ...INIT_STATE };\r\n\r\n case LOG_IN:\r\n return {\r\n ...state,\r\n token: action.payload.token,\r\n user: action.payload.user,\r\n };\r\n\r\n case UPDATE_USER:\r\n return {\r\n ...state,\r\n user: action.payload.user,\r\n };\r\n\r\n case UPDATE_TOKEN:\r\n return {\r\n ...state,\r\n token: action.payload.token,\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nexport default user;\r\n","/** Document search results reducer. */\r\n\r\nimport { RESET_SEARCH, SET_RESULTS, SET_QUERY } from '../actions/types';\r\n\r\nconst INIT_STATE = {\r\n results: null,\r\n query: null,\r\n};\r\n\r\nfunction search(state = INIT_STATE, action) {\r\n switch (action.type) {\r\n case RESET_SEARCH:\r\n return { ...INIT_STATE };\r\n\r\n case SET_RESULTS:\r\n return {\r\n ...state,\r\n results: action.payload,\r\n };\r\n\r\n case SET_QUERY:\r\n return {\r\n ...state,\r\n query: action.payload,\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nexport default search;\r\n","/** Workplace App reducer. */\r\n\r\nimport { SET_NEXT, RESET_NEXT } from '../actions/types';\r\n\r\nconst INIT_STATE = {\r\n next: null,\r\n};\r\n\r\nfunction app(state = INIT_STATE, action) {\r\n switch (action.type) {\r\n case RESET_NEXT:\r\n return { ...INIT_STATE };\r\n\r\n case SET_NEXT:\r\n return {\r\n ...state,\r\n next: action.payload.next,\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nexport default app;\r\n","/** Root reducer for WorkPlace. Combines sub-reducers. */\r\n\r\nimport { combineReducers } from 'redux';\r\nimport user from './user';\r\nimport search from './search';\r\nimport app from './app';\r\n\r\nexport default combineReducers({\r\n user,\r\n search,\r\n app,\r\n});\r\n","/* Redux Store\r\n *\r\n * Uses redux-persist to persist redux state in user's browser.\r\n */\r\n\r\nimport { composeWithDevTools } from 'redux-devtools-extension/logOnlyInProduction';\r\nimport { createStore, applyMiddleware } from 'redux';\r\nimport { persistStore, persistReducer } from 'redux-persist';\r\nimport storage from 'redux-persist/lib/storage'; // defaults to localStorage for web\r\nimport thunk from 'redux-thunk';\r\n\r\n// local imports\r\nimport rootReducer from '../reducers/root';\r\n\r\nconst persistConfig = {\r\n key: 'root',\r\n storage,\r\n};\r\n\r\nconst persistedReducer = persistReducer(persistConfig, rootReducer);\r\n\r\n// Create store from persisted reducer.\r\nexport const store = createStore(\r\n persistedReducer,\r\n composeWithDevTools(applyMiddleware(thunk))\r\n);\r\n\r\nexport const persistor = persistStore(store);\r\n\r\n// Also create test-store.\r\nexport const testStore = createStore(rootReducer);\r\n","import { ApplicationInsights } from \"@microsoft/applicationinsights-web\";\r\nimport { ReactPlugin } from \"@microsoft/applicationinsights-react-js\";\r\nimport { createBrowserHistory } from \"history\";\r\n\r\nconst browserHistory = createBrowserHistory({ basename: \"\" });\r\nconst reactPlugin = new ReactPlugin();\r\nconst appInsights = new ApplicationInsights({\r\n config: {\r\n instrumentationKey: window.workplaceSettings?.appInsightsInstrumentationKey || \"42b1b13c-5b37-4b28-8006-e8ae091cbf50\",\r\n extensions: [reactPlugin],\r\n extensionConfig: {\r\n [reactPlugin.identifier]: { history: browserHistory },\r\n },\r\n },\r\n});\r\nappInsights.loadAppInsights();\r\nappInsights.addTelemetryInitializer(\r\n (envelope) => (envelope.tags[\"ai.cloud.role\"] = \"wp-web\")\r\n);\r\nexport { reactPlugin, appInsights };\r\n","/**\r\n * Class to hold methods for convenience of calling API endpoints.\r\n * Obscures error handling.\r\n */\r\n\r\nimport axios from 'axios';\r\nimport { appInsights } from '../AppInsights';\r\n\r\nexport const BASE_URL =\r\n window.workplaceSettings?.apiUrl ||\r\n process.env.REACT_APP_BASE_URL ||\r\n 'https://wp-funcapp-dev.azurewebsites.net/api';\r\n\r\nclass ApiAgent {\r\n // Auth\r\n static async login(userData) {\r\n try {\r\n const resp = await axios.post(Routes.login, userData);\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.login',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n static async refreshToken(token) {\r\n try {\r\n const resp = await axios.post(Routes.refreshToken, {\r\n _token: token,\r\n });\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.refreshToken',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n // Document\r\n static async getDocument(id, params) {\r\n try {\r\n const resp = await axios.get(Routes.getDocument(id), { params });\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.getDocument',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n static async uploadDocMetadata(uploadData) {\r\n try {\r\n const resp = await axios.post(Routes.uploadDocMetadata, uploadData);\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.uploadDocMetadata',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n static async getDocMetadata(id, params) {\r\n const url = Routes.documentMetadata(id);\r\n try {\r\n const resp = await axios.get(url, { params });\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.getDocMetadata',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n static async updateDocMetadata(editData) {\r\n const url = Routes.documentMetadata(editData.id);\r\n try {\r\n const resp = await axios.patch(url, editData);\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.updateDocMetadata',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n static async searchDocMetadata(params) {\r\n try {\r\n const resp = await axios.get(Routes.searchDocMetadata, {\r\n params,\r\n });\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.searchDocMetadata',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n static async deleteDocument(id, deleteData) {\r\n try {\r\n const resp = await axios.delete(Routes.deleteDocument(id), {\r\n data: deleteData,\r\n });\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.deleteDocument',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n // Course\r\n static async getCourse(id, version, params) {\r\n try {\r\n const resp = await axios.get(Routes.getCourse(id, version), { params });\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.getCourse',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n // Course Admin\r\n static async getCourseAdmin(id, params) {\r\n try {\r\n const resp = await axios.get(Routes.courseAdmin(id), { params });\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.getCourseAdmin',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n static async pushCourseAdmin(id, editData) {\r\n try {\r\n const resp = await axios.post(Routes.courseAdmin(id), editData);\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.pushCourseAdmin',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n static async putCourseAdmin(id, editData) {\r\n try {\r\n const resp = await axios.put(Routes.courseAdmin(id), editData);\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.putCourseAdmin',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n static async deleteCourse(id, deleteData) {\r\n try {\r\n const resp = await axios.delete(Routes.courseAdmin(id), {\r\n data: deleteData,\r\n });\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.deleteCourse',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n // Assign Course\r\n static async assignCourse(user_id, course_id, token, update) {\r\n try {\r\n let resp;\r\n if (update) {\r\n // add or replace course assignment\r\n resp = await axios.put(Routes.assignCourse(user_id, course_id), {\r\n _token: token,\r\n });\r\n } else {\r\n // add if absent course assignment\r\n resp = await axios.post(Routes.assignCourse(user_id, course_id), {\r\n _token: token,\r\n });\r\n }\r\n\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.assignCourse',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n // User\r\n static async getUsers(query) {\r\n try {\r\n const resp = await axios.get(Routes.getUsers(query));\r\n const data = resp.data.map((x) => {\r\n return { ...x, timestamp: new Date(x._ts * 1000) };\r\n });\r\n return data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.getUsers',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n static async createUser(user_id, user) {\r\n try {\r\n const resp = await axios.post(Routes.createUser(user_id), user);\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.createUser',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n static async patchUser(id, editData) {\r\n try {\r\n const resp = await axios.patch(Routes.editUser(id), editData);\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.patchUser',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n // Reports\r\n static async getCourseAssignments(token, courseName) {\r\n try {\r\n const resp = await axios.get(\r\n Routes.getCourseAssignments(token, encodeURIComponent(courseName))\r\n );\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.getCourseAssignments',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n // Applications\r\n static async submitApplication(data, fileUid) {\r\n try {\r\n const url = Routes.applicationId(fileUid);\r\n const resp = await axios.post(url, data);\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.submitApplication',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n\r\n static async getResume(id, params) {\r\n try {\r\n const url = Routes.getResume(id);\r\n const resp = await axios.get(url, { params });\r\n return resp.data;\r\n } catch (error) {\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'ApiAgent.getResume',\r\n },\r\n });\r\n return { error };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Class to construct API endpoint URLs.\r\n */\r\n\r\nexport class Routes {\r\n static get login() {\r\n return `${BASE_URL}/login`;\r\n }\r\n static get refreshToken() {\r\n return `${BASE_URL}/token-refresh`;\r\n }\r\n static get searchDocMetadata() {\r\n return `${BASE_URL}/document-metadata`;\r\n }\r\n static documentMetadata(id) {\r\n return `${BASE_URL}/document-metadata/${id}`;\r\n }\r\n static getDocument(id) {\r\n return `${BASE_URL}/document-blob/${id}`;\r\n }\r\n static uploadDoc(id, token, category) {\r\n const queryString = `?_token=${token}&category=${category}`;\r\n return `${BASE_URL}/document-blob/${id}${queryString}`;\r\n }\r\n static get uploadDocMetadata() {\r\n return `${BASE_URL}/document-metadata`;\r\n }\r\n static deleteDocument(id) {\r\n return `${BASE_URL}/document/${id}`;\r\n }\r\n static getCourse(id, version) {\r\n return `${BASE_URL}/course/${id}/${version}`;\r\n }\r\n static get getCourses() {\r\n return `${BASE_URL}/course`;\r\n }\r\n static courseAdmin(id) {\r\n return `${BASE_URL}/course-admin/${id}`;\r\n }\r\n static assignCourse(user_id, course_id) {\r\n return `${BASE_URL}/user/${user_id}/assign-course/${course_id}`;\r\n }\r\n static userTask(user_id, course_id) {\r\n return `${BASE_URL}/user/${user_id}/user-task/${course_id}`;\r\n }\r\n static getUsers(query) {\r\n return query\r\n ? `${BASE_URL}/users?query=${query}`\r\n : `${BASE_URL}/users`;\r\n }\r\n static getUser(id) {\r\n return `${BASE_URL}/user/${id}`;\r\n }\r\n static getCourseAssignments(token, courseName) {\r\n return `${BASE_URL}/course-assignments/${\r\n courseName !== 'All' ? courseName : ''\r\n }?_token=${token}`;\r\n }\r\n static get getPastDueCourses() {\r\n return `${BASE_URL}/courses/past-due`;\r\n }\r\n static createUser(id) {\r\n return `${BASE_URL}/user/${id}`;\r\n }\r\n static editUser(id) {\r\n return `${BASE_URL}/user/${id}`;\r\n }\r\n static get getApplications() {\r\n return `${BASE_URL}/application`;\r\n }\r\n static applicationId(id) {\r\n return `${BASE_URL}/application/${id}`;\r\n }\r\n static getResume(id) {\r\n return `${BASE_URL}/resume/${id}`;\r\n }\r\n static getAccessGroups() {\r\n return `${BASE_URL}/access-groups`;\r\n }\r\n static get return200() {\r\n return `${BASE_URL}/Return-200`;\r\n }\r\n}\r\n\r\nexport default ApiAgent;\r\n","/** User feedback messaging utilities. */\r\n\r\nimport Box from '@material-ui/core/Box';\r\nimport { Link } from 'react-router-dom';\r\nimport { Tooltip } from '@progress/kendo-react-tooltip';\r\n// import CloudUploadIcon from '@material-ui/icons/CloudUpload';\r\n\r\n// local\r\nimport { Routes as appRoutes } from '../routes/appRoutes';\r\nimport { Typography } from '@material-ui/core';\r\n\r\n/** createErrorFeedbackMessage()\r\n *\r\n * Create and error feedback message for network (HTTP) errors.\r\n *\r\n * @param {object literal} error response error\r\n * @returns jsx || string\r\n */\r\n\r\nexport function createErrorFeedbackMessage(error, login = false) {\r\n switch (error.response?.status) {\r\n case 401:\r\n return 'Authorization Required';\r\n case 403:\r\n if (login)\r\n return (\r\n <>\r\n
There was an error authenticating.
\r\n
Please check you username and password.
\r\n \r\n );\r\n return 'You are not authorized for this action';\r\n case 423:\r\n if (login)\r\n return (\r\n <>\r\n
You account has been locked for invalid attempts
\r\n
Please try again later or contact the system admin.
\r\n \r\n );\r\n return 'Network Error';\r\n case 500:\r\n return 'Network Error';\r\n default:\r\n return 'Network Error';\r\n }\r\n}\r\n\r\n/** FormFeedback component that consumes message object.\r\n *\r\n * feedbackRef used for scrolling FormFeedback into view.\r\n */\r\nexport const FormFeedback = ({\r\n feedback,\r\n feedbackRef,\r\n variant = 'body1',\r\n ...rest\r\n}) => (\r\n \r\n {feedback.message}\r\n \r\n);\r\n\r\n/** Factory function for error feedback object for forms. */\r\nexport const networkErrorMessageObjFactory = (error, login) => ({\r\n message: createErrorFeedbackMessage(error, login),\r\n type: 'error',\r\n});\r\n\r\n/** Factory function for error feedback object for forms. */\r\nexport const successMessageObjFactory = message => ({\r\n message,\r\n type: 'success',\r\n});\r\n\r\n/** Factory function for error feedback object for forms. */\r\nexport const errorMessageObjFactory = message => ({\r\n message,\r\n type: 'error',\r\n});\r\n\r\n/** Factory function for success feedback object for document forms. */\r\nexport const documentSuccessMessageObjFactory = (msg, page, id) => ({\r\n message: (\r\n <>\r\n
{msg}
\r\n \r\n \r\n ),\r\n type: 'success',\r\n});\r\n\r\n/** Factory function for \"document name already exists\" feedback object for upload document form. */\r\nexport const nameExistsMessageObjFactory = (name, setSearchQuery) => ({\r\n message: (\r\n <>\r\n
{`Document with name \"${name}\" already exists!`}
\r\n \r\n See Document\r\n \r\n \r\n ),\r\n type: 'error',\r\n});\r\n\r\n/** Link style button to reset form. For the document upload form upload success alert.\r\n * Clicking this button clicks \".k-delete\" button of file upload component.\r\n */\r\nconst UploadLink = () => (\r\n \r\n {document.querySelector('.k-delete') && (\r\n document.querySelector('.k-delete').click()}\r\n onKeyPress={() => document.querySelector('.k-delete').click()}\r\n role=\"button\"\r\n tabIndex={0}\r\n name={'reset form'}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n);\r\n\r\n/** Make each word in a string have first letter upper case. */\r\nexport const toTitleCase = str => {\r\n return str\r\n ? str\r\n .trim()\r\n .split(' ')\r\n .map(word => word[0].toUpperCase() + word.slice(1))\r\n .join(' ')\r\n : str;\r\n};\r\n\r\n/**\r\n * Scroll form feedback display into view on small screens\r\n * after small delay to ensure feedback has rendered.\r\n *\r\n * @param {React ref} feedbackRef form feedback ref\r\n */\r\n\r\nexport const scrollFeedbackIntoView = feedbackRef => {\r\n setTimeout(() => {\r\n if (feedbackRef.current)\r\n feedbackRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'center',\r\n });\r\n }, 100);\r\n};\r\n","/** Log user in action creator. */\r\n\r\nimport { LOG_IN } from '../types';\r\n\r\nfunction login(token, user) {\r\n return { type: LOG_IN, payload: { token, user } };\r\n}\r\n\r\nexport default login;\r\n","// Basic validator\r\nexport const basicValidator = value => {\r\n if (typeof value === 'string') value = value.trim();\r\n return value ? '' : 'This is a required field.';\r\n};\r\n\r\nexport const booleanValidator = value =>\r\n value === true || value === false ? '' : 'This is a required field.';\r\n\r\n// Category validator\r\nexport const categoryValidator = value =>\r\n value ? '' : 'Category is a required field. Please select a category.';\r\n\r\n// Name validator\r\nexport const nameValidator = value =>\r\n value?.trim() ? '' : 'Document Name is a required field.';\r\n\r\n// Username validator\r\nexport const usernameValidator = value =>\r\n value ? '' : 'Username is a required field';\r\n\r\n// Password validator\r\nexport const passwordValidator = value =>\r\n value ? '' : 'Password is a required field';\r\n\r\n// URL validator\r\nexport const urlValidator = value =>\r\n /^[-a-zA-Z0-9@:%_+.~#?&/=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_+.~#?&/=]*)?$/gi.test(\r\n value\r\n )\r\n ? ''\r\n : 'Please enter a valid URL.';\r\n\r\n// threeDigitMoneyValidator\r\nexport const threeDigitMoneyValidator = value => {\r\n // three digits but not three empties (space or zero)\r\n return /^\\$[ \\d]{2}(? {\r\n return /^\\$[ \\d]{3}(?\r\n /^\\(\\d{3}\\) \\d{3}-\\d{4}$/.test(value)\r\n ? ''\r\n : 'Please enter a valid phone number.';\r\n\r\n// zipCodeValidator\r\nexport const zipCodeValidator = value =>\r\n /^\\d{5}$/.test(value) ? '' : 'Please enter a valid zip code.';\r\n\r\n // ssnValidator\r\nexport const ssnValidator = value =>\r\n/^\\d{3}-\\d{2}-\\d{4}$/.test(value)\r\n ? ''\r\n : 'Please enter a valid social security number.';\r\n","import * as React from 'react';\r\n\r\nimport { FieldWrapper } from '@progress/kendo-react-form';\r\nimport {\r\n Input,\r\n MaskedTextBox,\r\n NumericTextBox,\r\n Checkbox,\r\n ColorPicker,\r\n Switch,\r\n RadioGroup,\r\n Slider,\r\n SliderLabel,\r\n RangeSlider,\r\n TextArea,\r\n Rating,\r\n} from '@progress/kendo-react-inputs';\r\nimport {\r\n DatePicker,\r\n TimePicker,\r\n DateTimePicker,\r\n DateRangePicker,\r\n DateInput,\r\n} from '@progress/kendo-react-dateinputs';\r\nimport {\r\n Label,\r\n Error,\r\n Hint,\r\n FloatingLabel,\r\n} from '@progress/kendo-react-labels';\r\nimport { Upload } from '@progress/kendo-react-upload';\r\nimport {\r\n DropDownList,\r\n AutoComplete,\r\n MultiSelect,\r\n ComboBox,\r\n MultiColumnComboBox,\r\n} from '@progress/kendo-react-dropdowns';\r\n\r\nexport const FormInput = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n type,\r\n optional,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n
\r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && (\r\n {validationMessage}\r\n )}\r\n
\r\n
\r\n );\r\n};\r\nexport const FormFloatingInput = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n type,\r\n optional,\r\n value,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && (\r\n {validationMessage}\r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport const FormRadioGroup = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n id,\r\n label,\r\n valid,\r\n disabled,\r\n hint,\r\n visited,\r\n modified,\r\n labelStyle,\r\n optional,\r\n ...others\r\n } = fieldRenderProps;\r\n const editorRef = React.useRef(null);\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormNumericTextBox = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n\r\n return (\r\n \r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormCheckbox = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n optional,\r\n label,\r\n visited,\r\n modified,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n\r\n return (\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormSwitch = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n optional,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n ...others\r\n } = fieldRenderProps;\r\n const editorRef = React.useRef(null);\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormMaskedTextBox = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n hint,\r\n optional,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && (\r\n {validationMessage}\r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport const FormTextArea = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n hint,\r\n disabled,\r\n optional,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n\r\n return (\r\n \r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormColorPicker = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n ...others\r\n } = fieldRenderProps;\r\n const editorRef = React.useRef(null);\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormSlider = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n data,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const editorRef = React.useRef(null);\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n {data.map(value => (\r\n \r\n {value.toString()}\r\n \r\n ))}\r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormRangeSlider = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n hint,\r\n disabled,\r\n data,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n\r\n return (\r\n \r\n \r\n \r\n {data.map(value => {\r\n return (\r\n \r\n {value.toString()}\r\n \r\n );\r\n })}\r\n \r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormRating = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n hint,\r\n disabled,\r\n optional,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n\r\n return (\r\n \r\n \r\n \r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormUpload = fieldRenderProps => {\r\n const {\r\n valid,\r\n value,\r\n id,\r\n optional,\r\n label,\r\n hint,\r\n validationMessage,\r\n touched,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n const onChangeHandler = event => {\r\n fieldRenderProps.onChange({ value: event.newState });\r\n };\r\n const onRemoveHandler = event => {\r\n fieldRenderProps.onChange({ value: event.newState });\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormDropDownList = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n wrapperClassName,\r\n value,\r\n textField,\r\n dataItemKey,\r\n ...others\r\n } = fieldRenderProps;\r\n const editorRef = React.useRef(null);\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && (\r\n {validationMessage}\r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport const FormAutoComplete = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n ...others\r\n } = fieldRenderProps;\r\n const editorRef = React.useRef(null);\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormComboBox = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n ...others\r\n } = fieldRenderProps;\r\n const editorRef = React.useRef(null);\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormFloatingComboBox = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n value,\r\n ...others\r\n } = fieldRenderProps;\r\n const editorRef = React.useRef(null);\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormMultiColumnComboBox = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n ...others\r\n } = fieldRenderProps;\r\n const editorRef = React.useRef(null);\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n const columns = [\r\n { field: 'id', header: header, width: '100px' },\r\n { field: 'name', header: 'Name', width: '300px' },\r\n { field: 'position', header: 'Position', width: '300px' },\r\n ];\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormMultiSelect = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n value,\r\n ...others\r\n } = fieldRenderProps;\r\n const editorRef = React.useRef(null);\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && (\r\n {validationMessage}\r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport const FormFloatingMultiSelect = fieldRenderProps => {\r\n const {\r\n name,\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n onChange,\r\n formOnChange,\r\n allowCustom,\r\n allowDuplicates,\r\n ...others\r\n } = fieldRenderProps;\r\n const editorRef = React.useRef(null);\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n\r\n // Remove value duplicates if any then handle onChange for MultiSelect.\r\n function removeDuplicates(e) {\r\n const values = e.target.value;\r\n const lastItem = values.pop();\r\n\r\n // if no duplicate proceed as normal\r\n if (!values.includes(lastItem)) {\r\n onChange(e);\r\n }\r\n // else use the form onChange handler to set the value w/o duplicate.\r\n else {\r\n formOnChange(name, { value: values });\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormDatePicker = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n hintDirection,\r\n value,\r\n optional,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const editorRef = React.useRef(null);\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n
\r\n \r\n {showHint && (\r\n \r\n {hint}\r\n \r\n )}\r\n {showValidationMessage && (\r\n {validationMessage}\r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport const FormDateTimePicker = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormTimePicker = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormDateInput = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormDateRangePicker = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n wrapperStyle,\r\n ...others\r\n } = fieldRenderProps;\r\n const editorRef = React.useRef(null);\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n const labelId = label ? `${id}_label` : '';\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n\r\nexport const FormFloatingNumericTextBox = fieldRenderProps => {\r\n const {\r\n validationMessage,\r\n touched,\r\n label,\r\n id,\r\n valid,\r\n disabled,\r\n hint,\r\n optional,\r\n value,\r\n ...others\r\n } = fieldRenderProps;\r\n\r\n const showValidationMessage = touched && validationMessage;\r\n const showHint = !showValidationMessage && hint;\r\n const hintId = showHint ? `${id}_hint` : '';\r\n const errorId = showValidationMessage ? `${id}_error` : '';\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {showHint && {hint}}\r\n {showValidationMessage && {validationMessage}}\r\n \r\n );\r\n};\r\n","/** Set next page action creator. */\r\n\r\nimport { RESET_NEXT } from '../types';\r\n\r\nfunction resetNext() {\r\n return { type: RESET_NEXT };\r\n}\r\n\r\nexport default resetNext;\r\n","import { useState, useCallback } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { Form, Field, FormElement } from '@progress/kendo-react-form';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Box from '@material-ui/core/Box';\r\nimport Button from '@material-ui/core/Button';\r\n\r\n// local imports\r\nimport ApiAgent from '../../utils/apiAgent';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n FormFeedback,\r\n} from '../../utils/userFeedback';\r\nimport login from '../../redux/actions/user/login';\r\nimport { usernameValidator, passwordValidator } from '../form-validators';\r\nimport { FormFloatingInput } from '../form-components';\r\nimport resetNext from '../../redux/actions/app/resetNext';\r\n\r\nconst formStyle = { maxWidth: 650, width: '100%' };\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n buttonDiv: {\r\n marginTop: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(0),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(2),\r\n },\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\n/**\r\n * LoginForm\r\n * @returns LoginForm Component\r\n */\r\n\r\nfunction LoginForm() {\r\n const classes = useStyles();\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const next = useSelector(state => state.app.next);\r\n\r\n const handleSubmit = useCallback(\r\n async formData => {\r\n const { username, password } = formData;\r\n setLoading(true);\r\n const resp = await ApiAgent.login({ username, password });\r\n setLoading(false);\r\n if (resp.error) {\r\n setFormFeedback(networkErrorMessageObjFactory(resp.error, true));\r\n } else {\r\n dispatch(login(resp.token, resp.user));\r\n if (next) {\r\n history.push(next);\r\n dispatch(resetNext());\r\n }\r\n }\r\n },\r\n [dispatch, history, next]\r\n );\r\n\r\n return (\r\n (\r\n \r\n
\r\n {formFeedback && }\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n \r\n \r\n Login\r\n \r\n \r\n
\r\n )}\r\n />\r\n );\r\n}\r\n\r\nexport default LoginForm;\r\n","export default __webpack_public_path__ + \"static/media/City-day.dc5197bd.mp4\";","/** Login View */\r\n\r\nimport { useRef, useEffect } from 'react';\r\nimport Container from '@material-ui/core/Container';\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Card from '@material-ui/core/Card';\r\nimport Box from '@material-ui/core/Box';\r\n\r\n// local imports\r\nimport LoginForm from '../../components/LoginForm/LoginForm';\r\nimport City from '../../assets/City-day.mp4';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n videoBackground: {\r\n minHeight: 'calc(100vh - 80px)',\r\n maxHeight: 'calc(100vh - 80px)',\r\n position: 'fixed',\r\n objectFit: 'cover',\r\n width: '100%',\r\n zIndex: -10,\r\n },\r\n root: {\r\n paddingTop: theme.spacing(10),\r\n paddingBottom: theme.spacing(2),\r\n [theme.breakpoints.up('sm')]: {\r\n paddingTop: theme.spacing(2),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n paddingTop: theme.spacing(12),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n paddingTop: theme.spacing(20),\r\n },\r\n [theme.breakpoints.up('xl')]: {\r\n paddingTop: theme.spacing(25),\r\n },\r\n },\r\n card: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n backgroundColor: 'white',\r\n padding: `${theme.spacing(5)}px ${theme.spacing(4)}px`,\r\n [theme.breakpoints.up('sm')]: {\r\n padding: `${theme.spacing(1)}px ${theme.spacing(8)}px`,\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n padding: `${theme.spacing(5)}px ${theme.spacing(10)}px`,\r\n },\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n formWrapper: {\r\n marginTop: theme.spacing(1),\r\n marginBottom: theme.spacing(2),\r\n width: '100%',\r\n [theme.breakpoints.up('sm')]: {\r\n marginBottom: theme.spacing(1),\r\n marginTop: 0,\r\n },\r\n },\r\n submit: {\r\n margin: theme.spacing(3, 0, 2),\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\n/**\r\n * Login\r\n * @returns Login View Component\r\n */\r\n\r\nfunction Login() {\r\n const classes = useStyles();\r\n const videoBackgroundRef = useRef(null);\r\n\r\n useEffect(() => {\r\n videoBackgroundRef.current.playbackRate = 0.75;\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Sign in\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default Login;\r\n","/** Index View */\r\n\r\nimport { useSelector } from 'react-redux';\r\nimport Login from '../Login/Login';\r\nimport { Redirect } from 'react-router-dom';\r\n\r\n/**\r\n * Index\r\n * @returns Index View Component\r\n */\r\n\r\nfunction Index() {\r\n const token = useSelector(state => state.user.token);\r\n\r\n const Component = token ? : ;\r\n\r\n return Component;\r\n}\r\n\r\nexport default Index;\r\n","export default __webpack_public_path__ + \"static/media/onboarding.8ec58a2c.jpg\";","export default __webpack_public_path__ + \"static/media/training.c4987006.jpg\";","export default __webpack_public_path__ + \"static/media/welcome.be0eb4f7.jpg\";","export default __webpack_public_path__ + \"static/media/congratulations.414248c0.jpg\";","/** Update user action creator. */\r\n\r\nimport { UPDATE_USER } from '../types';\r\n\r\nfunction updateUser(user) {\r\n return { type: UPDATE_USER, payload: { user } };\r\n}\r\n\r\nexport default updateUser;\r\n","import axios from 'axios';\r\n\r\nimport ApiAgent, { Routes as apiRoutes } from '../../utils/apiAgent';\r\nimport updateUser from './user/updateUser';\r\n\r\n// THUNK CREATORS\r\n\r\nexport const updateTasksCompleted =\r\n (user_id, course_id, taskNumber, token, taskData) => async dispatch => {\r\n try {\r\n const url = apiRoutes.userTask(user_id, course_id);\r\n const { data } = await axios.post(url, {\r\n task_completed: taskNumber,\r\n _token: token,\r\n taskData,\r\n });\r\n if (data?.user) dispatch(updateUser(data.user));\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n };\r\n\r\nexport const resetTasksCompleted =\r\n (user_id, course_id, token) => async dispatch => {\r\n try {\r\n const url = apiRoutes.userTask(user_id, course_id);\r\n const { data } = await axios.delete(url, {\r\n data: {\r\n _token: token,\r\n },\r\n });\r\n if (data?.user) dispatch(updateUser(data.user));\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n };\r\n\r\nexport const updateUserThunkCreator = (userId, editData) => async dispatch => {\r\n try {\r\n const data = await ApiAgent.patchUser(userId, editData);\r\n if (data?.user) dispatch(updateUser(data.user));\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n};\r\n","import Typography from '@material-ui/core/Typography';\r\nimport Box from '@material-ui/core/Box';\r\nimport Button from '@material-ui/core/Button';\r\nimport { makeStyles } from '@material-ui/styles';\r\nimport { DateTime } from 'luxon';\r\n\r\nimport congratulations from '../../../assets/congratulations.jpg';\r\nimport { useDispatch } from 'react-redux';\r\nimport { resetTasksCompleted } from '../../../redux/actions/thunkCreators';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n cardImage: {\r\n width: '100%',\r\n maxWidth: 400,\r\n },\r\n completeTaskHeader1: {\r\n fontSize: 'calc(1vw + 12px)',\r\n marginTop: 20,\r\n },\r\n completeTaskHeader2: {\r\n fontSize: 'calc(1.5vw + 12px)',\r\n },\r\n completeTaskDetails: {\r\n border: '2px solid gray',\r\n minWidth: 200,\r\n padding: 10,\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n marginTop: 20,\r\n display: 'inline-block',\r\n textAlign: 'left',\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nconst TasksComplete = ({\r\n user,\r\n userCourse,\r\n passingScore,\r\n token,\r\n setTaskNumber,\r\n}) => {\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n\r\n const handleResetCourse = async () => {\r\n if (!token) return;\r\n dispatch(resetTasksCompleted(user.id, userCourse.course_id, token));\r\n setTaskNumber(0);\r\n };\r\n\r\n if (!Number.isFinite(userCourse.score)) return null;\r\n\r\n // get completed date from record or current time\r\n const dateCompleted = userCourse.completed_date\r\n ? DateTime.fromISO(userCourse.completed_date)\r\n : DateTime.now();\r\n const userPassedCourse = userCourse.score >= passingScore;\r\n\r\n return (\r\n
\r\n {userPassedCourse && (\r\n <>\r\n \r\n \r\n You have completed\r\n \r\n \r\n )}\r\n\r\n \r\n {userCourse.title}\r\n \r\n\r\n {!userPassedCourse && (\r\n <>\r\n \r\n Sorry, you did not pass the course\r\n \r\n \r\n :(\r\n \r\n \r\n )}\r\n \r\n \r\n Name: {`${user.firstname} ${user.lastname}`}\r\n \r\n\r\n Score: {userCourse.score}%\r\n\r\n \r\n Date: {dateCompleted.toLocaleString(DateTime.DATETIME_MED)}\r\n \r\n \r\n Course Version: {userCourse.course_version}\r\n \r\n \r\n \r\n \r\n {userPassedCourse && (\r\n {\r\n window.print();\r\n return false;\r\n }}\r\n >\r\n Print this page for your records\r\n \r\n )}\r\n {!userPassedCourse && (\r\n \r\n )}\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default TasksComplete;\r\n","import { useRef, useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport MuiDialogContent from '@material-ui/core/DialogContent';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\n\r\nimport ApiAgent from '../../utils/apiAgent';\r\nimport TasksComplete from '../CourseTask/TasksComplete/TasksComplete';\r\n\r\nconst styles = theme => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n});\r\n\r\nconst DialogTitle = withStyles(styles)(props => {\r\n const { children, classes, onClose, ...other } = props;\r\n return (\r\n \r\n {children}\r\n {onClose ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n );\r\n});\r\n\r\nconst DialogContent = withStyles(theme => ({\r\n root: {\r\n padding: theme.spacing(5),\r\n minWidth: '28vw',\r\n },\r\n}))(MuiDialogContent);\r\n\r\nconst CourseSummary = ({ userCourse, onClose, open }) => {\r\n const user = useSelector((state) => state.user);\r\n const params = useRef({ _token: user.token });\r\n const [loading, setLoading] = useState(true);\r\n const [resp, setResp] = useState(null);\r\n const [error, setError] = useState(null);\r\n\r\n // get course details after summary button clicked\r\n useEffect(() => {\r\n const getCourse = async () => {\r\n setLoading(true);\r\n const resp = await ApiAgent.getCourse(\r\n userCourse.course_id,\r\n userCourse.course_version,\r\n params.current\r\n );\r\n if (resp.error) {\r\n setError(resp.error);\r\n } else {\r\n setResp(resp);\r\n }\r\n setLoading(false);\r\n };\r\n if (open) getCourse();\r\n }, [open, userCourse.course_id, userCourse.course_version, setError]);\r\n\r\n if (error || loading) return null;\r\n\r\n return (\r\n \r\n Course Summary\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CourseSummary;\r\n","import React, { useState, useCallback, useMemo } from 'react';\r\n\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nimport Card from '@material-ui/core/Card';\r\nimport CardHeader from '@material-ui/core/CardHeader';\r\nimport CardMedia from '@material-ui/core/CardMedia';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport CardActions from '@material-ui/core/CardActions';\r\n\r\nimport Button from '@material-ui/core/Button';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Grid from '@material-ui/core/Grid';\r\n\r\nimport { Link } from 'react-router-dom';\r\nimport { DateTime } from 'luxon';\r\n\r\nimport { Routes as appRoutes } from '../../routes/appRoutes';\r\nimport onboarding from '../../assets/onboarding.jpg';\r\nimport training from '../../assets/training.jpg';\r\nimport welcome from '../../assets/welcome.jpg';\r\nimport CourseSummary from '../CourseSummary/CourseSummary';\r\n\r\nconst useStyles = makeStyles(\r\n () => ({\r\n card: {\r\n width: 300,\r\n },\r\n cardHeader: {\r\n display: 'block',\r\n overflow: 'hidden',\r\n },\r\n media: {\r\n height: 0,\r\n paddingTop: '56.25%', // 16:9\r\n },\r\n actions: {\r\n justifyContent: 'center',\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction UserCourseCard({ userCourse }) {\r\n const classes = useStyles();\r\n const [summaryDialogOpen, setSummaryDialogOpen] = useState(false);\r\n\r\n // Format assignment date.\r\n const assignedOn = useMemo(\r\n () =>\r\n DateTime.fromISO(userCourse.assigned_date).toLocaleString({\r\n ...DateTime.DATE_SHORT,\r\n }),\r\n [userCourse.assigned_date]\r\n );\r\n // Format date of completion or calculate days until course completion is due.\r\n if (!userCourse.complete) {\r\n var due_in_days = Math.round(\r\n (Date.parse(userCourse.due_date) - Date.now()) / (1000 * 60 * 60 * 24)\r\n );\r\n } else {\r\n var completedDate = DateTime.fromISO(\r\n userCourse.completed_date\r\n ).toLocaleString({\r\n ...DateTime.DATE_SHORT,\r\n });\r\n }\r\n\r\n const closeModal = useCallback(() => setSummaryDialogOpen(false), []);\r\n\r\n return (\r\n <>\r\n \r\n \r\n {userCourse.title}\r\n \r\n }\r\n className={classes.cardHeader}\r\n />\r\n \r\n \r\n \r\n \r\n {userCourse.complete && (\r\n Completed on {completedDate}\r\n )}\r\n {!userCourse.complete && due_in_days > 0 && (\r\n Due in {due_in_days} days\r\n )}\r\n {!userCourse.complete && due_in_days <= 0 && (\r\n Past due\r\n )}\r\n \r\n\r\n \r\n \r\n Assigned on {assignedOn}\r\n \r\n \r\n\r\n \r\n \r\n Version {userCourse.course_version}\r\n \r\n \r\n \r\n \r\n \r\n {userCourse.complete && (\r\n setSummaryDialogOpen(true)}\r\n >\r\n View Summary\r\n \r\n )}\r\n {!userCourse.complete && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default React.memo(UserCourseCard);\r\n","/**\r\n * allowedUploadExtensions\r\n *\r\n * File upload allowed extension types array.\r\n */\r\n\r\nexport const allowedUploadExtensions = [\r\n '.pdf',\r\n\r\n // word document types\r\n '.doc',\r\n '.dot',\r\n '.docm',\r\n '.docx',\r\n '.dotm',\r\n '.dotx',\r\n '.odt',\r\n '.rtf',\r\n '.wps',\r\n '.txt',\r\n\r\n // excel document types\r\n '.xml',\r\n '.xps',\r\n '.xls',\r\n '.xla',\r\n '.xlt',\r\n '.xlw',\r\n '.xlam',\r\n '.xlsx',\r\n '.xlsb',\r\n '.xlsm',\r\n '.csv',\r\n];\r\n\r\n/**\r\n * getMimeType\r\n * @param {string} extension file extension\r\n * @returns MIME type for the extension type\r\n */\r\n\r\nexport function getMimeType(extension) {\r\n switch (extension.toLowerCase()) {\r\n case '.pdf':\r\n return `application/pdf`;\r\n case '.doc':\r\n return `application/msword`;\r\n case '.dot':\r\n return `application/msword`;\r\n case '.docm':\r\n return `application/vnd.ms-word.document.macroEnabled.12`;\r\n case '.docx':\r\n return `application/vnd.openxmlformats-officedocument.wordprocessingml.document`;\r\n case '.dotm':\r\n return `application/vnd.ms-word.template.macroEnabled.12`;\r\n case '.dotx':\r\n return `application/vnd.openxmlformats-officedocument.wordprocessingml.template`;\r\n case '.odt':\r\n return `application/vnd.oasis.opendocument.text`;\r\n case '.rtf':\r\n return `application/rtf`;\r\n case '.wps':\r\n return `application/wps`;\r\n case '.txt':\r\n return `text/plain`;\r\n case '.xml':\r\n return `application/xml`;\r\n case '.xps':\r\n return `application/vnd.ms-xpsdocument`;\r\n case '.xls':\r\n return `application/vnd.ms-excel`;\r\n case '.xla':\r\n return `application/msexcel`;\r\n case '.xlt':\r\n return `application/msexcel`;\r\n case '.xlw':\r\n return `application/msexcel`;\r\n case '.xlam':\r\n return `application/vnd.ms-excel.addin.macroEnabled.12`;\r\n case '.xlsx':\r\n return `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`;\r\n case '.xlsb':\r\n return `application/vnd.ms-excel.sheet.binary.macroEnabled.12`;\r\n case '.xlsm':\r\n return `\tapplication/vnd.ms-excel.sheet.macroEnabled.12`;\r\n case '.csv':\r\n return `text/csv`;\r\n default:\r\n return `application/octet-stream`;\r\n }\r\n}\r\n\r\n// create a dataURL from base64 string.\r\nexport function createDataUrl(data, extension) {\r\n return `data:${getMimeType(extension)};base64,${data}`;\r\n}\r\n\r\nexport function fileIconDictionary(extension) {\r\n switch (extension) {\r\n case '.pdf':\r\n return ;\r\n case '.doc':\r\n return ;\r\n case '.dot':\r\n return ;\r\n case '.docm':\r\n return ;\r\n case '.docx':\r\n return ;\r\n case '.dotm':\r\n return ;\r\n case '.dotx':\r\n return ;\r\n case '.odt':\r\n return ;\r\n case '.rtf':\r\n return ;\r\n case '.wps':\r\n return ;\r\n case '.txt':\r\n return ;\r\n case '.xml':\r\n return ;\r\n case '.xps':\r\n return ;\r\n case '.xls':\r\n return ;\r\n case '.xla':\r\n return ;\r\n case '.xlt':\r\n return ;\r\n case '.xlw':\r\n return ;\r\n case '.xlam':\r\n return ;\r\n case '.xlsx':\r\n return ;\r\n case '.xlsb':\r\n return ;\r\n case '.xlsm':\r\n return ;\r\n case '.csv':\r\n return ;\r\n default:\r\n return {extension};\r\n }\r\n}\r\n","import React from 'react';\r\n\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nimport Card from '@material-ui/core/Card';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Grid from '@material-ui/core/Grid';\r\n\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport * as colors from '@material-ui/core/colors';\r\n\r\nimport { fileIconDictionary } from '../../utils/documentTypes';\r\n\r\nconst useStyles = makeStyles(\r\n () => ({\r\n card: {\r\n width: 310,\r\n },\r\n documentDetails: {\r\n display: 'block',\r\n overflow: 'hidden',\r\n width: 230,\r\n },\r\n avatar: {\r\n backgroundColor: colors.teal[600],\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction DocumentCard({ document }) {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {fileIconDictionary(document.file_extension)}\r\n \r\n \r\n \r\n \r\n {document.name}\r\n \r\n \r\n Category: {document.category}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default React.memo(DocumentCard);\r\n","/** Set search query action creator. */\r\n\r\nimport { SET_QUERY } from '../types';\r\n\r\nfunction setQuery(query) {\r\n return { type: SET_QUERY, payload: query };\r\n}\r\n\r\nexport default setQuery;\r\n","/** Reset search action creator. */\r\n\r\nimport { RESET_SEARCH } from '../types';\r\n\r\nfunction resetSearch() {\r\n return { type: RESET_SEARCH };\r\n}\r\n\r\nexport default resetSearch;\r\n","import { useState, useCallback } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport SearchBar from 'material-ui-search-bar';\r\n\r\n// local\r\nimport setQuery from '../../redux/actions/search/setQuery';\r\nimport resetSearch from '../../redux/actions/search/resetSearch';\r\n\r\n/**\r\n * SearchDocumentForm\r\n * @returns SearchDocumentForm Component\r\n *\r\n * This searchbar form sets search query in Redux state and calls callback\r\n * if given.\r\n */\r\n\r\nfunction SearchDocumentForm({\r\n setSearchResults = () => {},\r\n previousQuery,\r\n callback,\r\n ...others\r\n}) {\r\n const dispatch = useDispatch();\r\n const [formData, setFormData] = useState({\r\n q: previousQuery || '',\r\n });\r\n\r\n const handleSubmit = useCallback(async () => {\r\n dispatch(setQuery(formData.q));\r\n if (callback) callback();\r\n }, [dispatch, formData.q, callback]);\r\n\r\n const handleCancelSearch = useCallback(() => {\r\n setSearchResults(null);\r\n setFormData({ q: '' });\r\n dispatch(resetSearch());\r\n }, [dispatch, setSearchResults]);\r\n\r\n const handleChange = useCallback(\r\n newValue =>\r\n setFormData(formData => ({\r\n ...formData,\r\n q: newValue,\r\n })),\r\n []\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport default SearchDocumentForm;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Card from \"@material-ui/core/Card\";\r\nimport CardContent from \"@material-ui/core/CardContent\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\n\r\nconst useStyles = makeStyles(\r\n () => ({\r\n linkIcon: {\r\n width: 20,\r\n float: 'left',\r\n marginRight: 6\r\n },\r\n card: {\r\n '&:hover': {\r\n backgroundColor: 'lightgray'\r\n }\r\n },\r\n cardContent: {\r\n whiteSpace: 'nowrap',\r\n marginRight: 26\r\n }\r\n }),\r\n { classNamePrefix: \"wp\" }\r\n);\r\n\r\nfunction LinkCard({ linkInfo }) {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n {linkInfo.name}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default React.memo(LinkCard);\r\n","import { React, useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { Link, useHistory } from \"react-router-dom\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport Card from \"@material-ui/core/Card\";\r\nimport CardHeader from \"@material-ui/core/CardHeader\";\r\nimport CardContent from \"@material-ui/core/CardContent\";\r\nimport { Box, Typography } from \"@material-ui/core\";\r\n\r\n// local\r\nimport UserCourseCard from \"../../components/CourseCards/UserCourseCard\";\r\nimport DocumentCard from \"../../components/DocumentCard/DocumentCard\";\r\nimport SearchDocumentForm from \"../../components/SearchDocumentForm/SearchDocumentForm\";\r\nimport LinkCard from \"../../components/LinkCard/LinkCard\";\r\nimport { Routes as AppRoutes } from \"../../routes/appRoutes\";\r\nimport ApiAgent from \"../../utils/apiAgent\";\r\n\r\nimport links from \"../../testing/MockData/Links.json\";\r\n\r\nconst useStyles = makeStyles(\r\n (theme) => ({\r\n section: {\r\n margin: 10,\r\n [theme.breakpoints.up(\"md\")]: {\r\n margin: 25,\r\n },\r\n },\r\n }),\r\n { classNamePrefix: \"wp\" }\r\n);\r\n\r\nfunction Dashboard() {\r\n const classes = useStyles();\r\n const history = useHistory();\r\n const user = useSelector((state) => state.user.user);\r\n const token = useSelector((state) => state.user.token);\r\n const [favoriteDocuments, setFavoriteDocuments] = useState(null);\r\n const params = useRef({ _token: token });\r\n\r\n const courses = (user.courses ?? []).filter((x) => !x.complete);\r\n\r\n // get favorites data\r\n useEffect(() => {\r\n const getFavDocs = async () => {\r\n const promiseArray = [];\r\n for (let fav of user.favorites) {\r\n promiseArray.push(ApiAgent.getDocMetadata(fav, params.current));\r\n }\r\n const favorites = await Promise.all(promiseArray);\r\n setFavoriteDocuments(favorites);\r\n };\r\n\r\n if (user.favorites) getFavDocs();\r\n }, [user.favorites]);\r\n\r\n const gotoSearch = useCallback(\r\n () => history.push(AppRoutes.documents),\r\n [history]\r\n );\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n {links.map((linkInfo, index) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {courses.map((userCourse) => (\r\n \r\n \r\n \r\n ))}\r\n {courses.length === 0 && (\r\n \r\n You have no assigned courses.\r\n \r\n )}\r\n \r\n \r\n \r\n\r\n \r\n }\r\n />\r\n \r\n \r\n {favoriteDocuments?.map((document) => (\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n {(favoriteDocuments == null || favoriteDocuments?.length === 0) && (\r\n \r\n You have no favorite documents.\r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default Dashboard;\r\n","import { useEffect, useState } from 'react';\r\nimport axios from 'axios';\r\nimport { appInsights } from '../AppInsights';\r\n\r\n// local imports\r\n\r\n/**\r\n *\r\n * @param {string} url url for GET request\r\n * @param {object literal} params query parameters\r\n * @returns\r\n */\r\n\r\nexport function AxiosGetHook(url, params, abort) {\r\n const [resp, setResp] = useState(null);\r\n const [error, setError] = useState(false);\r\n const [loading, setLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n async function getData() {\r\n try {\r\n const resp = await axios.get(url, { params });\r\n setResp(resp.data);\r\n } catch (error) {\r\n console.error('AxiosGetHookError', error);\r\n appInsights.trackException({\r\n exception: error,\r\n properties: {\r\n name: 'AxiosGetHook.getData',\r\n },\r\n });\r\n setError(error);\r\n }\r\n setLoading(false);\r\n }\r\n if (abort) setLoading(false);\r\n else getData();\r\n }, [url, params, abort]);\r\n\r\n return { resp, error, loading, setResp, setError };\r\n}\r\n","import { DateTime } from 'luxon';\r\n\r\n// local\r\nimport { toTitleCase } from '../../../../../utils/userFeedback';\r\n\r\n/** Process edit history array of edit records for display in Kendo\r\n * Grid.\r\n *\r\n * @param {DocumentMetadataDB} metadata - document metadata\r\n * @returns array of EditRecords w/ additional properties added\r\n *\r\n */\r\n\r\nexport default function processEditHistory(metadata) {\r\n const editHistory = [...metadata.edit_history];\r\n const metadataLast = { ...metadata };\r\n\r\n // show latest edits first\r\n editHistory.reverse();\r\n\r\n // add properties to each edit history record for display\r\n editHistory.forEach(editRecord => {\r\n // make timestamp human readable and save at edit_date property.\r\n // zero pad day and hour for sort-ability\r\n editRecord.edit_date = DateTime.fromISO(\r\n editRecord.timestamp\r\n ).toLocaleString({\r\n ...DateTime.DATETIME_MED,\r\n ...{ hour: '2-digit', day: '2-digit' },\r\n });\r\n\r\n processPreviousData(editRecord, metadataLast);\r\n });\r\n\r\n return editHistory;\r\n}\r\n\r\n/** Process previous_data object.\r\n *\r\n * Create \"fields_altered\" property to hold array of field\r\n * names that had values changed when this edit happened.\r\n *\r\n * Create object at property \"changed_to\" to hold data in this\r\n * Edit Record about what the each changed value was changed to.\r\n *\r\n * Convert Tags for display.\r\n *\r\n * @param {EditRecord} editRecord\r\n * @param {DocumentMetadataDB} metadataLast\r\n */\r\n\r\nfunction processPreviousData(editRecord, metadataLast) {\r\n editRecord.fields_altered = [];\r\n editRecord.changed_to = {};\r\n\r\n // If edits happened\r\n if (editRecord.previous_data) {\r\n Object.entries(editRecord.previous_data).forEach(([key, val]) => {\r\n // Remove \"_\" from field name and replace with a space and capitalize\r\n // first letter of each word then add to fields_altered array.\r\n editRecord.fields_altered.push(\r\n key\r\n .split('_')\r\n .map(word => toTitleCase(word))\r\n .join(' ')\r\n );\r\n\r\n // set value of what this field was change to in changed_to object.\r\n editRecord.changed_to[key] = metadataLast[key] || 'current value';\r\n metadataLast[key] = val;\r\n\r\n // if key is tags convert tag strings for display\r\n if (key === 'tags') val = val?.map(tag => toTitleCase(tag)).join(', ');\r\n });\r\n }\r\n return editRecord;\r\n}\r\n","import React, { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport {\r\n Grid,\r\n GridColumn as Column,\r\n GridDetailRow,\r\n} from '@progress/kendo-react-grid';\r\nimport { orderBy } from '@progress/kendo-data-query';\r\n\r\n// local\r\nimport processEditHistory from './utils/processEditHistory';\r\nimport './EditHistoryGrid.css';\r\n\r\nclass DetailComponent extends GridDetailRow {\r\n render() {\r\n return (\r\n
    \r\n {Object.entries(this.props.dataItem.previous_data || []).map(\r\n ([k, v], idx) => (\r\n
  • \r\n {k} changed from{' '}\r\n {v} to{' '}\r\n \r\n {this.props.dataItem.changed_to[k]}\r\n \r\n
  • \r\n )\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst pageableSettings = {\r\n buttonCount: 5,\r\n info: true,\r\n type: 'numeric',\r\n pageSizes: [5, 10, 20, 50, 100],\r\n previousNext: true,\r\n};\r\n\r\n/**\r\n * EditHistoryGrid\r\n * @returns EditHistoryGrid Component\r\n */\r\n\r\nfunction EditHistoryGrid({ metadata, gridRef }) {\r\n const editHistory = metadata.edit_history;\r\n const [pagingState, setpagingState] = useState({ skip: 0, take: 10 });\r\n const [data, setData] = useState(editHistory);\r\n const [sort, setSort] = useState([]);\r\n\r\n const pageChange = useCallback(event => {\r\n setpagingState({\r\n skip: event.page.skip,\r\n take: event.page.take,\r\n });\r\n }, []);\r\n\r\n // Process edit history for display.\r\n useEffect(() => {\r\n setData([...processEditHistory(metadata)]);\r\n }, [metadata]);\r\n\r\n const expandChange = useCallback(event => {\r\n event.dataItem.expanded = !event.dataItem.expanded;\r\n // force an update\r\n setSort(sort => [...sort]);\r\n }, []);\r\n\r\n const pageData = useMemo(\r\n () =>\r\n orderBy(\r\n data.slice(pagingState.skip, pagingState.take + pagingState.skip),\r\n sort\r\n ),\r\n [data, pagingState.skip, pagingState.take, sort]\r\n );\r\n\r\n const handleSortChange = useCallback(e => {\r\n setSort(e.sort);\r\n }, []);\r\n\r\n return (\r\n
\r\n {}}\r\n data={pageData}\r\n skip={pagingState.skip}\r\n take={pagingState.take}\r\n total={data.length}\r\n pageable={pageableSettings}\r\n onPageChange={pageChange}\r\n sortable={true}\r\n sort={sort}\r\n onSortChange={handleSortChange}\r\n reorderable={true}\r\n detail={DetailComponent}\r\n expandField=\"expanded\"\r\n onExpandChange={expandChange}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default EditHistoryGrid;\r\n","/** Functions to transform data as necessary. */\r\n\r\nimport { DateTime } from 'luxon';\r\n\r\n// local\r\nimport { toTitleCase } from './userFeedback';\r\n\r\n/**\r\n * Process metadata for display. Date and tags.\r\n */\r\n\r\nexport function processMetatdata(metadata) {\r\n const copy = { ...metadata };\r\n // make timestamp human readable and save at last_modified property\r\n copy.last_modified = DateTime.fromISO(copy.last_modified).toLocaleString(\r\n DateTime.DATETIME_MED\r\n );\r\n // Process tags array for display.\r\n copy.tags = copy.tags?.map(tag => toTitleCase(tag)).join(', ');\r\n\r\n return copy;\r\n}\r\n","import { useRef, useMemo, useState, useEffect } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { Typography, Box } from '@material-ui/core';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { makeStyles } from '@material-ui/styles';\r\nimport clsx from 'clsx';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardHeader from '@material-ui/core/CardHeader';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport CardActions from '@material-ui/core/CardActions';\r\nimport Collapse from '@material-ui/core/Collapse';\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport * as colors from '@material-ui/core/colors';\r\nimport FavoriteIcon from '@material-ui/icons/Favorite';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\n// local\r\nimport EditHistoryGrid from './EditHistoryGrid/EditHistoryGrid';\r\nimport { fileIconDictionary } from '../../../utils/documentTypes.js';\r\nimport { processMetatdata } from '../../../utils/dataTransformations';\r\nimport { Routes as AppRoutes } from '../../../routes/appRoutes';\r\nimport { updateUserThunkCreator } from '../../../redux/actions/thunkCreators';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n card: {\r\n marginTop: '15px',\r\n padding: '1rem 1rem 0rem 1rem',\r\n maxWidth: '92vw',\r\n width: '100%',\r\n boxSizing: 'border-box',\r\n },\r\n avatar: {\r\n backgroundColor: colors.teal[600],\r\n },\r\n filename: {\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(1),\r\n paddingLeft: theme.spacing(2),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(1),\r\n paddingLeft: theme.spacing(0),\r\n },\r\n },\r\n cardActions: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n borderTop: '1px lightgray solid',\r\n },\r\n fadedSmall: {\r\n fontSize: '13px',\r\n color: '#656565',\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction MetadataCard({ fileMetadata, downloadButton }) {\r\n const classes = useStyles();\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n const gridRef = useRef(null);\r\n const user = useSelector(state => state.user.user);\r\n const token = useSelector(state => state.user.token);\r\n const [isFavorite, setIsFavorite] = useState(false);\r\n const [expanded, setExpanded] = useState(false);\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n\r\n // process metadata for display\r\n const processedMetadata = useMemo(\r\n () => processMetatdata(fileMetadata),\r\n [fileMetadata]\r\n );\r\n\r\n const cardData = {\r\n headerTitle: processedMetadata.name,\r\n headerSubtitle: processedMetadata.category,\r\n headerSubtitle2: processedMetadata.tags,\r\n lastModified: processedMetadata.last_modified,\r\n file_size_KB: Math.round(processedMetadata.file_size / 1024),\r\n extension: processedMetadata.file_extension,\r\n };\r\n\r\n const handleExpandClick = () => {\r\n setExpanded(!expanded);\r\n };\r\n\r\n const handleMenuOpen = event => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleMenuClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleEditDocument = () => {\r\n history.push(AppRoutes.makeUpdateUrl(fileMetadata.id));\r\n };\r\n\r\n // update isFavorite state when user.favorites changes\r\n useEffect(() => {\r\n setIsFavorite(user.favorites?.includes(fileMetadata.id));\r\n }, [user.favorites, fileMetadata.id]);\r\n\r\n // add or remove document as user favorite\r\n const handleFavorite = async () => {\r\n let updatedFavorites;\r\n if (isFavorite) {\r\n updatedFavorites = user.favorites.filter(el => el !== fileMetadata.id);\r\n } else {\r\n updatedFavorites = user.favorites\r\n ? [...user.favorites, fileMetadata.id]\r\n : [fileMetadata.id];\r\n }\r\n dispatch(\r\n updateUserThunkCreator(user.id, {\r\n favorites: updatedFavorites,\r\n _token: token,\r\n })\r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n {fileIconDictionary(processedMetadata.file_extension)}\r\n \r\n }\r\n action={\r\n <>\r\n \r\n \r\n \r\n \r\n Edit\r\n \r\n \r\n }\r\n title={cardData.headerTitle}\r\n titleTypographyProps={{ variant: 'h4', component: 'h1' }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n Category: {cardData.headerSubtitle}\r\n \r\n {cardData.headerSubtitle2 && (\r\n \r\n \r\n Tags: {cardData.headerSubtitle2}\r\n \r\n \r\n )}\r\n \r\n\r\n \r\n {downloadButton}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {cardData.file_size_KB} KB\r\n \r\n \r\n {cardData.extension}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Edit History\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default MetadataCard;\r\n","import { Button } from '@progress/kendo-react-buttons';\r\nimport { Ripple } from '@progress/kendo-react-ripple';\r\nimport { makeStyles } from '@material-ui/core';\r\n\r\n// local\r\nimport MetadataCard from './MetadataCard/MetadataCard';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n DownloadButton: {\r\n [theme.breakpoints.up('sm')]: {\r\n marginBottom: theme.spacing(2),\r\n },\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction DocumentDetails({ fileMetadata, url }) {\r\n const classes = useStyles();\r\n\r\n const DownloadButton = (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport default DocumentDetails;\r\n","import { FloatingActionButton } from '@progress/kendo-react-buttons';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\n// local\r\nimport { Routes as AppRoutes } from '../../../routes/appRoutes';\r\n\r\nconst items = [\r\n { icon: 'search', text: 'Search' },\r\n { icon: 'plus', text: 'Upload' },\r\n { icon: 'pencil', text: 'Edit' },\r\n];\r\n\r\nfunction itemClickedHandler(e, id, history) {\r\n const itemClicked = e.itemIndex;\r\n\r\n switch (itemClicked) {\r\n case 2:\r\n history.push(AppRoutes.makeUpdateUrl(id));\r\n break;\r\n case 1:\r\n history.push(AppRoutes.uploadDoc);\r\n break;\r\n case 0:\r\n history.push(AppRoutes.documents);\r\n break;\r\n default:\r\n history.push(AppRoutes.documents);\r\n }\r\n}\r\n\r\nfunction NaviFab({ id }) {\r\n const history = useHistory();\r\n return (\r\n itemClickedHandler(e, id, history)}\r\n themeColor=\"tertiary\"\r\n alignOffset={{ x: '30px', y: '30px' }}\r\n />\r\n );\r\n}\r\n\r\nexport default NaviFab;\r\n","/** View Document View */\r\n\r\nimport { useRef } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { useParams } from 'react-router-dom';\r\nimport Container from '@material-ui/core/Container';\r\nimport Box from '@material-ui/core/Box';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Loader } from '@progress/kendo-react-indicators';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardContent from '@material-ui/core/CardContent';\r\n\r\n// local imports\r\nimport { Routes as ApiRoutes } from '../../utils/apiAgent';\r\nimport { AxiosGetHook } from '../../hooks/axiosHook';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n FormFeedback,\r\n} from '../../utils/userFeedback';\r\nimport DocumentDetails from '../../components/DocumentDetails/DocumentDetails';\r\nimport Fab from './Fab/Fab';\r\n\r\nconst pdfCheckRegex = /^.pdf$/i;\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n container: {\r\n minHeight: '100vh',\r\n [theme.breakpoints.up('lg')]: {\r\n maxWidth: '75vw',\r\n },\r\n },\r\n paper: {\r\n marginTop: theme.spacing(1),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n maxWidth: '100vw',\r\n width: '100%',\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(0),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(6),\r\n },\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n pdfSpacer: {\r\n marginTop: theme.spacing(3),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(2),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(3),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(4),\r\n },\r\n },\r\n card: {\r\n width: '100%',\r\n },\r\n cardContent: {\r\n height: 'calc(100vh - 100px)',\r\n [theme.breakpoints.up('lg')]: {\r\n height: 'calc(100vh - 140px)',\r\n margin: 10,\r\n },\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\n/**\r\n * ViewDocument\r\n * @returns ViewDocument View Component\r\n */\r\n\r\nfunction ViewDocument() {\r\n const classes = useStyles();\r\n const { id } = useParams();\r\n const token = useSelector(state => state.user.token);\r\n const params = useRef({ _token: token });\r\n const url = ApiRoutes.documentMetadata(id);\r\n const {\r\n resp: respMetadata,\r\n error: respMetaError,\r\n loading,\r\n } = AxiosGetHook(url, params.current);\r\n\r\n const urlDocument = ApiRoutes.getDocument(id);\r\n const encoded = encodeURIComponent(token);\r\n const embedUrl = `${urlDocument}?_token=${encoded}&category=CourseViewer`;\r\n\r\n return (\r\n <>\r\n \r\n
\r\n {respMetaError && (\r\n \r\n )}\r\n {loading && (\r\n \r\n \r\n \r\n )}\r\n {respMetadata && (\r\n \r\n )}\r\n\r\n \r\n {respMetadata && pdfCheckRegex.test(respMetadata.file_extension) && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n
\r\n \r\n \r\n );\r\n}\r\n\r\nexport default ViewDocument;\r\n","import { useState } from 'react';\r\nimport { Upload } from '@progress/kendo-react-upload';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\n// local imports\r\nimport { Routes as ApiRoutes } from '../../utils/apiAgent';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n scrollFeedbackIntoView,\r\n} from '../../utils/userFeedback';\r\nimport { allowedUploadExtensions } from '../../utils/documentTypes';\r\n\r\n// File Input\r\nexport const FileInput = ({\r\n formRenderProps,\r\n setFormFeedback,\r\n token,\r\n feedbackRef,\r\n handleNameChange,\r\n}) => {\r\n const [files, setFiles] = useState([]);\r\n const [saveUrl, setSaveUrl] = useState(null);\r\n\r\n // When file is first added.\r\n function onAdd(event) {\r\n // formReset();\r\n // get file and file data variables\r\n const file = event.affectedFiles[0];\r\n const filenameGroups = file.name.match(/^(.+)\\.\\w+$/);\r\n const filename = filenameGroups[1];\r\n const fileExtension = file.extension;\r\n const uuid = uuidv4();\r\n const id = uuid + '_' + filename;\r\n const fileSizeKb = Math.round(file.size / 1024);\r\n\r\n // set form data from file data\r\n // if user hasn't entered a name for the file use filename from above.\r\n const nameValue = formRenderProps.valueGetter('name');\r\n if (!nameValue) {\r\n formRenderProps.onChange('name', { value: filename });\r\n if (handleNameChange) handleNameChange(formRenderProps);\r\n }\r\n formRenderProps.onChange('file_extension', { value: fileExtension });\r\n formRenderProps.onChange('file_size_KB', { value: fileSizeKb });\r\n formRenderProps.onChange('file_size', { value: file.size });\r\n formRenderProps.onChange('id', { value: id });\r\n\r\n // create / set file upload URL\r\n // category is used for upload authorization\r\n const category = formRenderProps.valueGetter('category') || 'General';\r\n const uploadUrl = ApiRoutes.uploadDoc(id, token, category);\r\n setSaveUrl(uploadUrl);\r\n\r\n setFormFeedback(null);\r\n setFiles(event.newState);\r\n }\r\n\r\n // When file is removed from upload component\r\n function onRemove(event) {\r\n // reset form\r\n formRenderProps.onChange('name', { value: '' });\r\n formRenderProps.onChange('file_extension', { value: '' });\r\n formRenderProps.onChange('file_size_KB', { value: 0 });\r\n formRenderProps.onChange('file_size', { value: 0 });\r\n formRenderProps.onChange('id', { value: '' });\r\n setFormFeedback(null);\r\n setFiles(event.newState);\r\n }\r\n\r\n function onProgress(event) {\r\n setFiles(event.newState);\r\n }\r\n\r\n // When file upload status changes\r\n function onStatusChange(event) {\r\n const uploadFailureStatus = 0;\r\n const uploadSuccessfulStatus = 4;\r\n const status = event.newState[0].status;\r\n\r\n if (status === uploadFailureStatus) {\r\n setFormFeedback(networkErrorMessageObjFactory(event.response));\r\n if (feedbackRef.current) scrollFeedbackIntoView(feedbackRef);\r\n }\r\n // if file uploaded successfully submit metadata form.\r\n else if (status === uploadSuccessfulStatus) {\r\n formRenderProps.onSubmit();\r\n }\r\n setFiles(event.newState);\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { decode } from 'jsonwebtoken';\r\n\r\n/**\r\n *\r\n * @param tokenData\r\n * @returns string[] - list of groups which user has view permission\r\n */\r\n\r\nexport const getUserViewPermissions = token => {\r\n const tokenData = decode(token);\r\n\r\n // memo to remove duplicate category in case user has both \"View\" permission and \"Contrib\"\r\n const memo = new Set();\r\n // the category is at index \"1\" when permission split on \"-\"\r\n return tokenData?.groups\r\n .map(permission => permission.split('-')[1])\r\n .filter(category => {\r\n if (memo.has(category)) {\r\n return false;\r\n }\r\n memo.add(category);\r\n return true;\r\n });\r\n};\r\n\r\n/**\r\n *\r\n * @param tokenData\r\n * @returns string[] - list of groups which user has view permission\r\n */\r\n\r\nexport const getUserEditPermissions = token => {\r\n const tokenData = decode(token);\r\n\r\n // collect all \"Contrib\" permissions.\r\n return tokenData?.groups\r\n .map(permission => permission.split('-'))\r\n .filter(([, , permType]) => /^contrib$/i.test(permType))\r\n .map(el => el[1]);\r\n};\r\n","export const tags = ['Policy', 'Guide', 'Manual'];\r\n\r\nexport const imageTypes = ['welcome', 'onboarding', 'training'];\r\n\r\nexport const taskTypes = ['Document', 'Video', 'Question', 'Signature'];\r\n","import React, {\r\n useState,\r\n useMemo,\r\n useRef,\r\n useEffect,\r\n useCallback,\r\n} from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport Box from '@material-ui/core/Box';\r\nimport { Form, Field, FormElement } from '@progress/kendo-react-form';\r\nimport { Input } from '@progress/kendo-react-inputs';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { makeStyles } from '@material-ui/core';\r\n\r\n// local imports\r\nimport ApiAgent from '../../utils/apiAgent';\r\nimport setQuery from '../../redux/actions/search/setQuery';\r\nimport { FileInput } from './form-components';\r\nimport { getUserEditPermissions } from '../../utils/auth/userAuth';\r\nimport { tags } from '../form-defaults';\r\nimport {\r\n FormFloatingComboBox,\r\n FormFloatingMultiSelect,\r\n FormFloatingInput,\r\n} from '../form-components';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n documentSuccessMessageObjFactory,\r\n FormFeedback,\r\n nameExistsMessageObjFactory,\r\n scrollFeedbackIntoView,\r\n} from '../../utils/userFeedback';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n formWidth: {\r\n width: '100%',\r\n [theme.breakpoints.down('xs')]: {\r\n maxWidth: '82vw',\r\n },\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\n/**\r\n * UploadDocumentForm\r\n * @returns UploadDocumentForm Component\r\n *\r\n * Note: Metadata portion of form has no validators but will use\r\n * sensible defaults. This is to guarantee if file upload has\r\n * success metadata upload will have success as well.\r\n */\r\n\r\nfunction UploadDocumentForm() {\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n const token = useSelector(state => state.user.token);\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const feedbackRef = useRef(null);\r\n const nameTimerRef = useRef(null);\r\n const editPermissions = useMemo(() => getUserEditPermissions(token), [token]);\r\n\r\n // search if document with given name already exists using the document search endpoint.\r\n const searchName = useCallback(\r\n async name => {\r\n if (name === '') return;\r\n // create query for a name that matches name input value.\r\n const q = `name:\"${name}\"`;\r\n\r\n const setSearchQuery = () => {\r\n dispatch(setQuery(q));\r\n };\r\n\r\n const resp = await ApiAgent.searchDocMetadata({ q, _token: token });\r\n\r\n if (resp.error) {\r\n setFormFeedback(networkErrorMessageObjFactory(resp.error));\r\n } else if (resp[0]) {\r\n // show form feedback about document name collision and pass setSearchQuery\r\n // which will be called if user clicks link to existing document.\r\n setFormFeedback(nameExistsMessageObjFactory(name, setSearchQuery));\r\n }\r\n },\r\n [dispatch, token]\r\n );\r\n\r\n // As name input value changes search for matching document in DB after delay.\r\n const handleNameChange = useCallback(\r\n formRenderProps => {\r\n setFormFeedback(null);\r\n clearTimeout(nameTimerRef.current);\r\n\r\n nameTimerRef.current = setTimeout(() => {\r\n searchName(formRenderProps.valueGetter('name'));\r\n }, 800);\r\n },\r\n [searchName]\r\n );\r\n\r\n // remove timer if component is dismounted.\r\n useEffect(() => {\r\n return () => {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n clearTimeout(nameTimerRef.current);\r\n };\r\n }, []);\r\n\r\n // upload document metadata on submit.\r\n const handleSubmit = useCallback(\r\n async formData => {\r\n const editedFormData = { ...formData };\r\n // delete display-only data size KB\r\n delete editedFormData.file_size_KB;\r\n // edit form data making sure defaults are added if needed\r\n // as form currently has no validation checks.\r\n // if category is blank or missing use \"General\"\r\n editedFormData.category = editedFormData.category || 'General';\r\n // if \"name\" was blank use original filename\r\n editedFormData.name =\r\n editedFormData.name === ''\r\n ? formData.id.match(/^\\S+?_(.+)$/)[1]\r\n : formData.name;\r\n\r\n const resp = await ApiAgent.uploadDocMetadata({\r\n ...editedFormData,\r\n _token: token,\r\n });\r\n if (resp.error) {\r\n setFormFeedback(networkErrorMessageObjFactory(resp.error));\r\n } else {\r\n setFormFeedback(\r\n documentSuccessMessageObjFactory(\r\n 'Document uploaded successfully!',\r\n 'upload',\r\n formData.id\r\n )\r\n );\r\n }\r\n scrollFeedbackIntoView(feedbackRef);\r\n },\r\n [token]\r\n );\r\n\r\n return (\r\n (\r\n \r\n
\r\n {formFeedback && (\r\n \r\n )}\r\n\r\n handleNameChange(formRenderProps)}\r\n className={classes.formWidth}\r\n />\r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n
\r\n )}\r\n />\r\n );\r\n}\r\n\r\nexport default UploadDocumentForm;\r\n","import { FloatingActionButton } from '@progress/kendo-react-buttons';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\n// local\r\nimport { Routes as AppRoutes } from '../../../routes/appRoutes';\r\n\r\nconst items = [{ icon: 'search', text: 'Search' }];\r\n\r\nfunction itemClickedToAppUrl(e, id) {\r\n const itemClicked = e.itemIndex;\r\n\r\n switch (itemClicked) {\r\n case 0:\r\n return AppRoutes.documents;\r\n default:\r\n return AppRoutes.documents;\r\n }\r\n}\r\n\r\nfunction Fab({ id }) {\r\n const history = useHistory();\r\n return (\r\n history.push(itemClickedToAppUrl(e, id))}\r\n themeColor=\"tertiary\"\r\n alignOffset={{ x: '30px', y: '30px' }}\r\n />\r\n );\r\n}\r\n\r\nexport default Fab;\r\n","/** Upload View */\r\n\r\nimport React from 'react';\r\nimport Container from '@material-ui/core/Container';\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport CloudUploadIcon from '@material-ui/icons/CloudUpload';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Box from '@material-ui/core/Box';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardContent from '@material-ui/core/CardContent';\r\n\r\n// local imports\r\nimport UploadDocumentForm from '../../components/UploadDocumentForm/UploadDocumentForm';\r\nimport Fab from './Fab/Fab';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n cardWrapper: {\r\n marginTop: theme.spacing(3),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(2),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(10),\r\n paddingLeft: theme.spacing(12),\r\n paddingRight: theme.spacing(12),\r\n },\r\n },\r\n card: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n backgroundColor: 'white',\r\n paddingTop: theme.spacing(2),\r\n [theme.breakpoints.up('sm')]: {\r\n paddingTop: theme.spacing(4),\r\n paddingLeft: theme.spacing(4),\r\n paddingRight: theme.spacing(4),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n paddingTop: theme.spacing(4),\r\n paddingLeft: theme.spacing(12),\r\n paddingRight: theme.spacing(12),\r\n },\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n submit: {\r\n margin: theme.spacing(3, 0, 2),\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\n/**\r\n * UploadDocument\r\n * @returns UploadDocument View Component\r\n */\r\n\r\nfunction UploadDocument() {\r\n const classes = useStyles();\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n Upload Document\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n );\r\n}\r\n\r\nexport default React.memo(UploadDocument);\r\n","import { useState } from 'react';\r\nimport { Upload } from '@progress/kendo-react-upload';\r\n\r\n// local imports\r\nimport ApiAgent, { Routes as ApiRoutes } from '../../utils/apiAgent';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n errorMessageObjFactory,\r\n documentSuccessMessageObjFactory,\r\n} from '../../utils/userFeedback';\r\nimport { allowedUploadExtensions } from '../../utils/documentTypes';\r\n\r\n// File Input\r\nexport const FileInput = ({\r\n setFormFeedback,\r\n id,\r\n token,\r\n formRenderProps,\r\n lastUpdate,\r\n setLastUpdate,\r\n}) => {\r\n const [files, setFiles] = useState([]);\r\n const [saveUrl, setSaveUrl] = useState(null);\r\n\r\n function onAdd(event) {\r\n // get file and file data variables\r\n const file = event.affectedFiles[0];\r\n const fileSizeKb = Math.round(file.size / 1024);\r\n\r\n // set form data from file data\r\n formRenderProps.onChange('file_size_KB', { value: fileSizeKb });\r\n formRenderProps.onChange('file_extension', { value: file.extension });\r\n\r\n // create / set file upload URL\r\n // category is used for upload authorization\r\n const category = formRenderProps.valueGetter('category') || 'General';\r\n const uploadUrl = ApiRoutes.uploadDoc(id, token, category);\r\n setSaveUrl(uploadUrl);\r\n\r\n const feedback =\r\n file.size === lastUpdate.file_size &&\r\n file.extension === lastUpdate.file_extension\r\n ? errorMessageObjFactory(\r\n <>\r\n
\r\n You may be uploading the same file that was last uploaded.\r\n
\r\n
The new file has the same size and extension.
\r\n \r\n )\r\n : null;\r\n setFormFeedback(feedback);\r\n setFiles(event.newState);\r\n }\r\n\r\n function onRemove(event) {\r\n setFormFeedback(null);\r\n formRenderProps.onChange('file_size_KB', { value: 0 });\r\n formRenderProps.onChange('file_extension', { value: '' });\r\n setFiles(event.newState);\r\n }\r\n\r\n function onProgress(event) {\r\n setFiles(event.newState);\r\n }\r\n\r\n function onStatusChange(event) {\r\n const uploadFailureStatus = 0;\r\n const uploadSuccessfulStatus = 4;\r\n const status = event.newState[0].status;\r\n\r\n if (status === uploadFailureStatus) {\r\n setFormFeedback(networkErrorMessageObjFactory(event.response));\r\n }\r\n // if file uploaded successfully submit file size metadata update\r\n else if (status === uploadSuccessfulStatus) {\r\n const file = event.affectedFiles[0];\r\n // update document metadata\r\n ApiAgent.updateDocMetadata({\r\n _token: token,\r\n id,\r\n file_extension: file.extension,\r\n file_size: file.size,\r\n }).then(resolve => {\r\n if (resolve.error)\r\n setFormFeedback({\r\n message: 'Network error. File size update failed.',\r\n type: 'error',\r\n });\r\n else {\r\n setFormFeedback(\r\n documentSuccessMessageObjFactory('Document Updated!', 'update', id)\r\n );\r\n setLastUpdate(resolve);\r\n }\r\n });\r\n }\r\n\r\n setFiles(event.newState);\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { useState, useRef, useMemo, useCallback, useEffect } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport Box from '@material-ui/core/Box';\r\nimport { Form, Field, FormElement } from '@progress/kendo-react-form';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Loader } from '@progress/kendo-react-indicators';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { makeStyles } from '@material-ui/styles';\r\nimport { Typography } from '@material-ui/core';\r\n\r\n// local imports\r\nimport ApiAgent from '../../utils/apiAgent';\r\nimport { getUserEditPermissions } from '../../utils/auth/userAuth';\r\nimport { FileInput } from './form-components';\r\nimport { nameValidator, categoryValidator } from '../form-validators';\r\nimport { tags } from '../form-defaults';\r\nimport setQuery from '../../redux/actions/search/setQuery';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n documentSuccessMessageObjFactory,\r\n FormFeedback,\r\n toTitleCase,\r\n scrollFeedbackIntoView,\r\n nameExistsMessageObjFactory,\r\n} from '../../utils/userFeedback';\r\nimport {\r\n FormFloatingComboBox,\r\n FormFloatingInput,\r\n FormFloatingMultiSelect,\r\n} from '../form-components';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n formWidth: {\r\n width: '100%',\r\n [theme.breakpoints?.down('xs')]: {\r\n maxWidth: '82vw',\r\n },\r\n },\r\n fieldset: {\r\n border: 'none',\r\n padding: 0,\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\n/**\r\n * checkDataChanged\r\n *\r\n * Function to check if the form data has changed from last known state.\r\n * Used to prevent making a duplicate update to document metadata.\r\n *\r\n * @param {object} lastUpdate data from DB or from last update to DB\r\n * @param {obj} formData update document form data\r\n * @returns boolean\r\n */\r\n\r\nfunction checkDataChanged(lastUpdate, formData) {\r\n const lastData = {\r\n name: lastUpdate.name,\r\n category: lastUpdate.category,\r\n tags: lastUpdate.tags,\r\n };\r\n const newData = { ...formData };\r\n newData.tags = newData.tags?.map(string => string.toLowerCase());\r\n\r\n // improve equality check?\r\n return JSON.stringify(lastData) !== JSON.stringify(newData);\r\n}\r\n\r\n/**\r\n * UpdateDocumentForm\r\n * @returns UpdateDocumentForm Component\r\n */\r\n\r\nfunction UpdateDocumentForm({ id, error, loading, data }) {\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n const token = useSelector(state => state.user.token);\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [updateLoading, setUpdateLoading] = useState(false);\r\n const [formFeedbackFile, setFormFeedbackFile] = useState(null);\r\n const [lastUpdate, setLastUpdate] = useState(null);\r\n const feedbackRef = useRef(null);\r\n const nameTimerRef = useRef(null);\r\n const editPermissions = useMemo(() => getUserEditPermissions(token), [token]);\r\n\r\n const handleSubmit = useCallback(\r\n async formData => {\r\n setUpdateLoading(true);\r\n setFormFeedback(null);\r\n\r\n const editedFormData = { ...formData };\r\n // KB/file extension display only\r\n delete editedFormData.file_size_KB;\r\n delete editedFormData.file_extension;\r\n\r\n const dataChanged = checkDataChanged(lastUpdate || data, editedFormData);\r\n if (!dataChanged)\r\n setFormFeedback({\r\n message: 'Document properties unchanged.',\r\n type: 'error',\r\n });\r\n else {\r\n const updateResp = await ApiAgent.updateDocMetadata({\r\n ...editedFormData,\r\n _token: token,\r\n id,\r\n });\r\n if (updateResp.error) {\r\n setFormFeedback(networkErrorMessageObjFactory(updateResp.error));\r\n } else {\r\n setFormFeedback(\r\n documentSuccessMessageObjFactory(\r\n 'Document properties updated!',\r\n 'update',\r\n id\r\n )\r\n );\r\n setLastUpdate(updateResp);\r\n }\r\n }\r\n scrollFeedbackIntoView(feedbackRef);\r\n setUpdateLoading(false);\r\n },\r\n [id, lastUpdate, data, token]\r\n );\r\n\r\n // search if document with given name already exists using the document search endpoint.\r\n const searchName = useCallback(\r\n async name => {\r\n if (name === '') return;\r\n // create query for a name that matches name input value.\r\n const q = `name:\"${name}\"`;\r\n\r\n const setSearchQuery = () => {\r\n dispatch(setQuery(q));\r\n };\r\n\r\n const resp = await ApiAgent.searchDocMetadata({ q, _token: token });\r\n\r\n if (resp.error) {\r\n setFormFeedback(networkErrorMessageObjFactory(resp.error));\r\n } else if (resp[0]) {\r\n // show form feedback about document name collision and pass setSearchQuery\r\n // which will be called if user clicks link to existing document.\r\n setFormFeedback(nameExistsMessageObjFactory(name, setSearchQuery));\r\n }\r\n },\r\n [dispatch, token]\r\n );\r\n\r\n // As name input value changes search for matching document in DB after delay.\r\n const handleNameChange = useCallback(\r\n formRenderProps => {\r\n setFormFeedback(null);\r\n clearTimeout(nameTimerRef.current);\r\n\r\n nameTimerRef.current = setTimeout(() => {\r\n searchName(formRenderProps.valueGetter('name'));\r\n }, 800);\r\n },\r\n [searchName]\r\n );\r\n\r\n // remove timer if component is dismounted.\r\n useEffect(() => {\r\n return () => {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n clearTimeout(nameTimerRef.current);\r\n };\r\n }, []);\r\n\r\n if (loading) return ;\r\n if (error || data?.error)\r\n return (\r\n \r\n );\r\n\r\n return (\r\n <>\r\n toTitleCase(tag)),\r\n file_size_KB: Math.round(data.file_size / 1024),\r\n file_extension: data.file_extension,\r\n }}\r\n onSubmit={handleSubmit}\r\n render={formRenderProps => (\r\n \r\n
\r\n \r\n \r\n Update Document Properties\r\n \r\n \r\n\r\n {formFeedback && (\r\n \r\n )}\r\n\r\n handleNameChange(formRenderProps)}\r\n />\r\n\r\n \r\n \r\n
\r\n
\r\n \r\n Update\r\n \r\n
\r\n\r\n \r\n \r\n \r\n Update Document File\r\n \r\n \r\n\r\n {formFeedbackFile && }\r\n\r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n />\r\n \r\n );\r\n}\r\n\r\nexport default UpdateDocumentForm;\r\n","import { useState, useCallback } from 'react';\r\nimport Button from '@material-ui/core/Button';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\n\r\n// local\r\nimport { FormFeedback } from '../../utils/userFeedback';\r\n\r\nfunction DeleteDialog({\r\n delModalOpen,\r\n setDelModalOpen,\r\n name,\r\n itemDetail,\r\n handleDelete,\r\n formFeedback,\r\n}) {\r\n const [delDisabled, setDelDisabled] = useState(true);\r\n const nameTitleCase = name[0].toUpperCase() + name.slice(1);\r\n\r\n const handleClose = useCallback(() => {\r\n setDelModalOpen(false);\r\n }, [setDelModalOpen]);\r\n\r\n const handleChange = useCallback(e => {\r\n const { value } = e.target;\r\n\r\n if (/^confirm$/i.test(value)) {\r\n setDelDisabled(false);\r\n } else {\r\n setDelDisabled(true);\r\n }\r\n }, []);\r\n\r\n return (\r\n
\r\n \r\n \r\n Delete {nameTitleCase} {itemDetail && ` - ${itemDetail}`}\r\n \r\n \r\n \r\n To delete the current {name} please type \"confirm\" below then click\r\n the delete button.\r\n \r\n {formFeedback && }\r\n \r\n \r\n \r\n \r\n \r\n Delete\r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default DeleteDialog;\r\n","import { FloatingActionButton } from '@progress/kendo-react-buttons';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\n// local\r\nimport { Routes as AppRoutes } from '../../../routes/appRoutes';\r\n\r\nconst items = [\r\n { icon: 'search', text: 'Search' },\r\n { icon: 'plus', text: 'Upload' },\r\n { icon: 'trash', text: 'Delete' },\r\n { icon: 'file', text: 'Details' },\r\n];\r\n\r\nfunction itemClickedHandler(e, id, history, setDelModalOpen) {\r\n const itemClicked = e.itemIndex;\r\n\r\n switch (itemClicked) {\r\n case 3:\r\n history.push(AppRoutes.makeViewDocUrl(id));\r\n break;\r\n case 2:\r\n setDelModalOpen(delModalOpen => !delModalOpen);\r\n break;\r\n case 1:\r\n history.push(AppRoutes.uploadDoc);\r\n break;\r\n case 0:\r\n history.push(AppRoutes.documents);\r\n break;\r\n default:\r\n history.push(AppRoutes.documents);\r\n }\r\n}\r\n\r\nfunction NaviFab({ id, setDelModalOpen }) {\r\n const history = useHistory();\r\n return (\r\n itemClickedHandler(e, id, history, setDelModalOpen)}\r\n themeColor=\"tertiary\"\r\n alignOffset={{ x: '30px', y: '30px' }}\r\n />\r\n );\r\n}\r\n\r\nexport default NaviFab;\r\n","/** Upload View */\r\nimport { useState, useCallback, useRef } from 'react';\r\nimport { useParams, useHistory } from 'react-router-dom';\r\nimport { useSelector } from 'react-redux';\r\nimport Container from '@material-ui/core/Container';\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Box from '@material-ui/core/Box';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardContent from '@material-ui/core/CardContent';\r\n\r\n// local imports\r\nimport { AxiosGetHook } from '../../hooks/axiosHook';\r\nimport UpdateDocumentForm from '../../components/UpdateDocumentForm/UpdateDocumentForm';\r\nimport DeleteModal from '../../components/DeleteModal/DeleteModal';\r\nimport { Routes as AppRoutes } from '../../routes/appRoutes';\r\nimport ApiAgent, { Routes as ApiRoutes } from '../../utils/apiAgent';\r\nimport { networkErrorMessageObjFactory } from '../../utils/userFeedback';\r\nimport Fab from '../UpdateDocument/Fab/Fab';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n cardWrapper: {\r\n marginTop: theme.spacing(3),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(2),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(10),\r\n paddingLeft: theme.spacing(12),\r\n paddingRight: theme.spacing(12),\r\n },\r\n },\r\n card: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n backgroundColor: 'white',\r\n paddingTop: theme.spacing(2),\r\n [theme.breakpoints.up('sm')]: {\r\n paddingTop: theme.spacing(4),\r\n paddingLeft: theme.spacing(4),\r\n paddingRight: theme.spacing(4),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n paddingTop: theme.spacing(4),\r\n paddingLeft: theme.spacing(12),\r\n paddingRight: theme.spacing(12),\r\n },\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n submit: {\r\n margin: theme.spacing(3, 0, 2),\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\n/**\r\n * UpdateDocument\r\n * @returns UpdateDocument View Component\r\n */\r\n\r\nfunction UpdateDocument() {\r\n const { id } = useParams();\r\n const classes = useStyles();\r\n const history = useHistory();\r\n const token = useSelector(state => state.user.token);\r\n const params = useRef({ _token: token });\r\n const [delModalOpen, setDelModalOpen] = useState(false);\r\n const [deleteFormFeedback, setDeleteFormFeedback] = useState(null);\r\n\r\n // get document metadata hook\r\n const url = ApiRoutes.documentMetadata(id);\r\n const { resp, error, loading } = AxiosGetHook(url, params.current);\r\n\r\n const handleDelete = useCallback(async () => {\r\n const deleteResp = await ApiAgent.deleteDocument(id, {\r\n _token: token,\r\n category: resp.category,\r\n });\r\n if (deleteResp.error) {\r\n setDeleteFormFeedback(networkErrorMessageObjFactory(deleteResp.error));\r\n } else {\r\n history.replace(AppRoutes.documents);\r\n }\r\n }, [history, id, resp, token]);\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n Update Document\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default UpdateDocument;\r\n","export default __webpack_public_path__ + \"static/media/Error_TV.9b78e677.svg\";","import Typography from '@material-ui/core/Typography';\r\nimport { Button } from '@progress/kendo-react-buttons';\r\nimport Box from '@material-ui/core/Box';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Link } from 'react-router-dom';\r\nimport { Routes as appRoutes } from '../../routes/appRoutes';\r\nimport UFO from '../../assets/Error_TV.svg';\r\n\r\n// local imports\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n overlay: {\r\n height: 'calc(100vh - 80px)',\r\n backgroundImage: `url(${UFO})`,\r\n backgroundSize: 'contain',\r\n backgroundRepeat: 'no-repeat',\r\n backgroundPosition: 'center',\r\n },\r\n}));\r\n\r\n/**\r\n * NotFoundPage\r\n * @returns NotFoundPage View Component\r\n */\r\n\r\nfunction NotFoundPage() {\r\n return (\r\n \r\n \r\n \r\n
\r\n \r\n \r\n Page Not Found\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default NotFoundPage;\r\n","/** Log user out action creator. */\r\n\r\nimport { LOG_OUT } from '../types';\r\n\r\nfunction logout() {\r\n return { type: LOG_OUT };\r\n}\r\n\r\nexport default logout;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useDispatch } from 'react-redux';\r\nimport { makeStyles, Button } from '@material-ui/core';\r\n\r\nimport headerBg from '../../../assets/header-bg.png';\r\nimport logo from '../../../assets/logo.png';\r\nimport logout from '../../../redux/actions/user/logout';\r\nimport { Routes as AppRoutes } from '../../../routes/appRoutes';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n logoutButton: {\r\n color: 'white',\r\n marginRight: 10,\r\n [theme.breakpoints.up('sm')]: {\r\n marginRight: 50,\r\n },\r\n '&:hover': {\r\n color: 'lightblue',\r\n },\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nexport const SiteHeader = React.memo(props => {\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n const { onButtonClick, page, hideMenu, token, pathname } = props;\r\n\r\n const handleLogout = () => {\r\n dispatch(logout());\r\n };\r\n\r\n const isWorkplacePage = pathname => {\r\n switch (pathname) {\r\n case AppRoutes.employmentApplication: {\r\n return false;\r\n }\r\n case AppRoutes.continueApplication: {\r\n return false;\r\n }\r\n default: {\r\n return true;\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n
\r\n {!hideMenu && (\r\n
\r\n \r\n
\r\n )}\r\n\r\n
\r\n {'Northeast\r\n {isWorkplacePage(pathname) &&

Workplace Intranet

}\r\n\r\n {isWorkplacePage(pathname) && page && }\r\n\r\n {page &&

{page}

}\r\n
\r\n {token && (\r\n \r\n )}\r\n
\r\n \r\n );\r\n});\r\n\r\nSiteHeader.displayName = 'Header';\r\nSiteHeader.propTypes = {\r\n page: PropTypes.string,\r\n hideMenu: PropTypes.bool,\r\n onButtonClick: PropTypes.func,\r\n};\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACFgAAACeCAYAAAAM5yzYAAAgAElEQVR4nO3dbZaqOpgG0HDXGVQPqUfTU6Z/lCjfJIFAgL3XXTdaJRqQSB158tL8z//+XxsAAAAAAAAAAFj039UdAAAAAAAAAAConYAFAAAAAAAAAMAGAQsAAAAAAAAAgA0CFgAAAAAAAAAAGwQsAAAAAAAAAAA2CFgAAAAAAAAAAGwQsAAAAAAAAAAA2CBgAQAAAAAAAACwQcACAAAAAAAAAGCDgAUAAAAAAAAAwAYBCwAAAAAAAACADQIWAAAAAAAAAAAbBCwAAAAAAAAAADYIWAAAAAAAAAAAbBCwAAAAAAAAAADYIGABAAAAAAAAALBBwAIAAAAAAAAAYIOABQAAAAAAAADABgELAAAAAAAAAIANAhYAAAAAAAAAABsELAAAAAAAAAAANghYAAAAAAAAAABsELAAAAAAAAAAANggYAEAAAAAAAAAsEHAAgAAAAAAAABgw7+rOwAAAAAAAFCN5vu/3/+b2Qd9b7VrTzV6zvO0345N+9eu3u3/YPqrpbUFgOcTsAAAAAAAAJ6p6QclPreGqYdP9mFf+OHs6ESc37pO+9es3o381YJ2kMrYDHcMftSO7gpzAFAXAQsAAAAAAOA+mmamssRxYQn2Glb82Ax3zPwo7h2MrNCxFN4IQYADgGQCFgAAAAAAQFWapgm/E/WN4AQzIit0JIU3lkIby4GNyWOFNgAeTcACAAAAAAA4X9MPTghRUIOl0MZqSY7t0Ma0CZN7M8GN6b3Rb2Q5AE4nYAEAAAAAAJQxupxHExohCl6mmWvC5N7CsMgfLZGXUJn8aKYyh6ocAF8CFgAAAAAAwD5N8wlPhBBC87nEB3CdyEuopP3oo13IXCwEMRaqcwx/JcQB3IOABQAAAAAAEGd8WQ9BCnihZqEQTXoZjrUQx/JVUNYqcCw/ZlCbQ54DyCRgAQAAAAAADI2DFN/bAGdo+kU4pr+L+FHaQ+YuqdKG6c12/JvF5wGeScACAAAAAADeTFUK4PXmLqnShLmbM3cTbAQ5Zu6uV+OYPi9QloAFAAAAAAC8hTAFwIU2ghwzdxeeJU47V3FjKdCxUJ2jldyAPgELAAAAAAB4oqb5u7hH87nIhzAFwLt8PveHn/7rgY64I8VcJY6Fx23+eKGWh2AHlRKwAAAAAACAB2iaRmUKAE4wV4lj4XH7fzzULl1cpZ29qTIHRxOwAAAAAACAm2k+QYrQCFMA8CLN0sVVmtmbKz9asFadY+nyKus/bD+vr0LHMwhYAAAAAABAxYZhihBSThMBACnWqnNkXU/l+7B9l19ZC3eo0nEmAYs7ODt9bLABAAAAAFzjW5FCZQoAeJ+lgMd2uCOpSse0CXP3BDmm/m2dvO/KlRzV5jxnjCP7+XoF/2iPe1/b+DceAAAAAODGmuZTmeJToQIAoKxmrglz9/YFOcIgfPGUIMe/EI4PJ6xt1Jgwxbgt1b+llnLitnUT/WYsBjYqGWAAAAAAAF+9IIVLfQAAj9cLj15TkWPmcau/mgl3jM47/+s/YK09uhJETgWLUv1U0eK+FgMbG0nv6fBRNQMAAAAAOFDT/H1vqToFAEBBaxU5Zh4X8avlR7bHV7C4SyULFS3erfn+v7cnNOM9Y6lkzecnAhkAAAAAwEd3qY8Qmr/bAAA8TBNfwWLcXlnJor/sEf1TyeKttvac8L3fTPaA8WVMlsIYghgAAAAA8ERdoEJ1CgCA9/jXv3OXShYl+hsiWp5qzx7cf465Ry8HMQb32unvAAAAAIBKuNwHAABhFLC4upJF7HOuLbunfypZvFXqnrPHJH7Ru9H/XTvo0d8dAQwAAAAAOEUvSOFyHwAAdP7N/VAli/WWpzqiksWRfRm94vcfcnOXI3EpEgAAAADI8g1TBNUpAABYNRuwUMlCJYt3OrOSxR5zlyOZvxSJChgAAAAA0ONSHwAA7DAbsBg7M5ygkgXXq6mSRa7tChjCFwAAAAA8nkt9AABwoKiAxRWVLPqvrZIF57pLJYtca+GLEAQwAAAAALirpumqUghUAABwvKiAReeKcEJKRYsS/QwRLU/11nhNagCjnU86AQAAAEBhXaDC5T4AADhDUsDiSZUscvr5xlPt75a7xzzdOIDRjFZ7FMBQ/QIAAACAIwwu9xHCO76LAwCgJkkBi07tlSzayGVUsiBO6h7ydqMAxn9NP23R+38QvgAAAABgkct9AABQm6yARe2VLMYVLVSyYB+VLHYZZCi2wxeDWwIYAAAAAO/wrU4RXO4DAIBqZQUsOipZzLc8lUoWu6wN1u8DPre6x3QBjO8y4woYkycBAAAA4A4Gl/vwfRoAAPewK2ChkoU6Bu+iksUus6GKj9hB26+A8c2zDKtgTJ5eFQwAAACA632DFAIVAADc166ARadUKGHtz+yrK1moaPFmKlnsEjNYx5mImIH+eWAzfszaZUhUwAAAAAAoommaQZUKAAB4gkMCFqUqWcTM/8+pZBHTb5UsWJa75xBCSKtk0bVrAYzo6hfhV+2iCaFpQwj/hRDaZuUSJMIXAAAAAJu+QYogUAEAwKMdErDo3KWSRYn+hoiWp1LJIsuRg3ZumayB3ITf/8PvywDhCwAAAICv7lIfv8t+AADAOxwasEipZNG1KllwfypZZEmpSnFkJYvsgbsWvvjdEMAAAAAAnqa73EcIAhUAALzboQGLjkoW6y1PpZJFliorWcy0a/3v3RDAAAAAAG7te7mP5vP1hu+0AACgUyRgcXUli9jnTOm3ShZsU8kiy1mVLNZer+TAFcAAAAAAKqY6BQAAxCsSsBhTyWK+5alUsshSupJFTkWLMNMebSuAET796a38310BDAAAACBRvzrF5z4AABDvlIDFFZUs+q+tkgXnUskiS+lKFuMBf3Yliz2a7/96d8cBjL8bw4IYQhgAAADwZqpTAADAsU4JWHSuCCekVLQo0c8Q0fJUtZ2lv4m3VrLYo1cFY1gQY74Kxi+EIYABAAAAT9IFKroqFQAAwLFODVg8qZJFTj+dan+b3D3m5bbCFCG8t5LFHr3AxS+E8bk1WwFD+AIAAACq1r/cx3iiBQAAUMSpAYtO7ZUscia4q2TBstQ9hAGVLMqbrYCh+gUAAABUZRCoeNIXEwAAcB+XBCxqr2QRM8F9Tz+fMiGeWCpZ7JJSyWJtGZUs8kVWvxjeFcAAAACAPVzuAwAA6nNJwKKjksV8y1OpZLHLkVUpcpZ5QyWLHM3whgAGAAAAZGg+VSUFKgAAoGqXBixUsnjvhPh3UslilyMqWeQOdAM431YAI4TPthbAAAAA4EVc7gMAAG7p0oBFp1Qli7V/mqhkwXVUstilpkoWKloco/n+TwADAACAR+ou9xGCQAUAANxZFQGLUpUsYiaS36GShQnxT6OSxS5HVbLIWcbAvUZUAOPvhgAGAAAAl3O5DwAAeKwqAhadN1ayUNEClSwypVSyWFpGJYtn+KUu5gMYIUyrYPTuAwAAwC4u9wEAAK9RVcAipZJF115ZySKm3ypZsC11zyGEkFbJomtVsnivcRWM3n0VMAAAAEjRXe5DdQoAAHifqgIWnbtUsijR3xDR8lQqWWQ5ctDOLaOSxfMNKmB83sjmv/DdCVS/AAAAeK9vkCIIVAAAAHUGLK6uZBH7nCn9VsmCbSpZZEmpSrGnksXc6xm4DzSzU3y/PGtCE9rP/Xa0SDtcSgUMAACAexpc7iME/5gHAAD6qgxYdFSyWG95KpUsspSuZLG1jEoWD5MwDntfuDVh/OulKhgCGAAAAFUYBCr84x0AAFhXdcBCJQsT4t9JJYssV1ayCMHAfZyjxmHTa5rxzd/zfwIYKmAAAAAUJlABAADsUHXAYuzMcIJKFlxPJYsspStZtBvLqGTxMKXTMsMAxmwFjF/qQgADAAAgUdP8hSlCEKgAAAD2u1XA4opKFv3XVsmCc6lkkaV0JYvxgFfJ4uGuHodN72nHAYxh9YvB/+UvAACAN/pWpwjfKhUAAABHulXAonNFOCGlokWJfoaIlqdylj6LShYUUdM4HFa/6P1kPYCh+gUAAPAQqlMAAABnu2XA4kmVLHL66VT72+TuMS+3FaYIIb4qxdxjVbJ4qTuNw4UAxrdbvR34E8L4/kQIAwAAqFAXqFCdAgAAuMotAxad2itZ5ExwV8mCZal7CANHVqXIWUYli4d5wjhsRjfHlyDpDCthCGEAAACn6F/u41OlAgAA4Gq3DljUXskiZoL7nn7WPG+aElSy2OWISha5A90AfqDUN/rOhpUwpiEMAQwAAOAAvcoULvcBAADU6tYBi45KFvMtT6WSxS41VbJQ0eIBjEMBDAAAIItABQAAcEOPCFioZPHcedPMUclil6MqWeQsYwA/0JsqWeQSwAAAAEIvSCFQAQAA3NcjAhadUpUs1v7Jd3Uli5iKFjyVSha7pFSyWFpGJQu+jMN8AhgAAPA4zedv+16VCgAAgCd4VMCiVCWLmHnHOZUsYvpdKozBE+TuOYQQ0ipZdK1KFiwyDsuJCGB8wheD/8tfAADAeVzuAwAAeIlHBSw6d6lkUaK/IaLlqcygz3LkoJ1bRiWLlzEOz/S3dZvQNJ+2//PVChgCGAAAsEfTNKpTAAAAr/TIgEVKJYuuVcmC+zODPktKVQqVLNhkHJ5p6/gewl/NizaEbwjjv+73kwoYf7d/NyUwAACgI1ABAADw55EBi45KFustT2UGfRaVLDiUcXimfcfNpvf98PASJH/D9zOI27//fX8mfwEAwIN9AxVNE/z7BQAA4OfRAYutma17J5THvrZKFpzLDPosKVUp9lSymHs9A/eBjMMzHX18H0ZhfhUw+gGM9UuQhKACBgAAt9F8/s4VqAAAANj06IDFmEoW8y1PZQZ9ltKVLNqNZVSyeBhpmTOVPm6OX2twaxTAWK+AEQQwAAC4Tu9SH12QGAAAgDivCljEzHDt2qMnksc8V0p/VbJgmxn0WdbCFEdUshgP+DM+gLiQcXimUsf53Hep6f0/LYDRzv9hAAAAOQaBCv/uAAAA2ONVAYvOFeGEmHBF7KT4o2fk+qf108XuGQykVKXIWabdWCZ2IHMzwhVnOqOSxd7+qYABAMDRmqYZhCoAAAA4zisDFqVmuMa+9pGVLHL6af702+TuMS+3FaYIQSULMhiHZyp9/CwtLoAR/nokgAEA8E7fIMUnWOHfEQAAAEW9MmDROTKUEHuyJSZcsWeC+54Zuf4J/nSpewgDMYN16bFry+QM9DDTcjPG4ZlKHTev9gtbNN+2GX3mtL8b/XsCGAAAd+VyHwAAAJd6dcAiZmZr115RySJmgvuefl49M5ez5e4xhBCWwxQhxA/auceqZPFSqW80e5Q+fl5uZYWa5lPq4r8QQtv8ZTE+v2/7TyCAAQBQpe5yHyEIVAAAANTg1QGLjkoW8y1PpZLFLkdWpchZRiWLhzEOz/TUShZfiSv07X/bTAMY//UzFgIYAABn6QIVXZUKAAAA6iJgEeJmtnbt0TNaU54zpb9nhkW4m9w9hhDCdPP1pQzanIFuAD9Q6hvNHqWPn5fLXbHOKDnyq3bx+0HTW2Y5gNH+XhsAgGXfIMUnWFHHX5UAAACsELDoOTKUEDv/uPQE9z0zcv2z/umO2INfLGawxg7anGViBzQ3YRyeqdRxsxq5K5R4SJgNYPS60bbdk3bNJ4Ch+gUA8Fa9yhQu9wEAAHBPfwGLaqZeXitmZmvXHj2zNeW5UvpbKjTCE+TuMYQQppuvL3XQpi5j4D5Q6hvNHqWPn5fLXbGxfqhiaZmVlMnfOYPm77H//d0WwAAAXuUbpBCoAAAAeIq/gIV/4w2UCiWsbeazJrin9LP6GbocbM8e/GIxg3V8rrD0QA8zLTdhHJ6p1HGzGnv/UNnz2HE/5rrX9H75uT14aNt9FHY3XIIEAKicQAUAAMDjDStYVDP18loxM1vH7VEzW1OeK6XfpcIYPMneqc4vtRSiCGF5860FMJYG+lEDm8oZh2c6+vhe3buUu2Jjc6GK8TIxKZPUDdJ0D+9urAQwvo0qGADAeZqmCf3LfgAAAPB8wwoW/i04UCqUsLaZY0IVS+dzS/Wz+hm6HGzPHvxiRw7auWWOGsjchHF4ptLHzcvt/UMlZ1c8Y7ftBzBC+JzUaD8xjM8Lt72qFyH07gchDAAgTS9IMajEBQAAwKvMV7C4fMplHWJmto7bo2a0pjxXSr9LhUZ4kr1TnV9qLUyxtPlSlll7PQP3gYzDMx19fK/uXcpdsbG5oMTSsmuhimIbZGYFmyY0oQ0h/Pe5/9/n/qezbffo7oYKGADAh8t9AAAAMGO+goV/Nw6UCiWsbeaYUMXcOdmj+xsiWp5qzx78YkcO2pxlYgcyN2Ecnqn0cfNye/9QyfmMuXS3jehsE34BjGame/0KGP0Axud3AMBzuNwHAAAAMT4VLP5m+NU35bIOMTNbx+1RM1pTnjOl36VCIzxJ6p5DCGE9GLG0+VKWiXk9A/dBjMMzHX18r+5dyl2xsbmgxNKya6GK4hskdgVXOtE0n9828wGM0H5yFm3vJVXBAIDqfYMU4VulAgAAAGL8+/tuefSNcXVTLutyZjghJlQxd0726H6GiJanit0zGDhy0M4t024sEzuQuYmqT9s/VqnjZjVSV6ST8xlz6eEjdtzkjKXRNdgnIYy2+y/8bghgAMDpepUpXO4DAACAPf79fcfc/oUsJm1w7mZGzAzXrj0iZDF+7ZjQRWx/zwyLcFepew4hhPUwxdLmy1lm7fUM3AcxDq9w9HG+undp7241F5RYWnYtVFF8w8SuYIkXb7r/Qu/GIIAxroDxvQiJAAYAZOsu9/EXhqziLy8AAAAe4t8wTNFrQ6h4ymUdrggnxIQrxl/HH92/rZanusXpwvrEDNbYQTu3TLuxTOxA5maMwzOVOm5WI3dFcj5jLv08ih03Z46laQWMwSu3XdziF8D4RjAEMADgT3dJr16VCgAAACjl33zlinEbnLuZETOztWuPDFnEPmdOf88Mi3A3uXvMy22FKUJYHrxzy2wN+DM+gKiAcXim0sfPy+39eJ8LSCwtsxamKL5hYle0inflT3fCqBfA6DUhhBDatrc+AhgAvIHLfQAAAHChf/Nhil4bQsVTLutwZCgh9pxCTLhi3B7dv62Wp0rdQxiIGayxgzZnma2BzM0Yh2cqddysRu4K5XzGXPp5FPsXWHVRmFm/E0vNbAAjhPFlSNrwvSeEAcANdJf7UJ0CAACAGvz7+954HLJYakNeGuDhYma2du2RIYvU50zp75lhEe4md48hhDDdfH0pgzZnoBvAD5T6RrNH6ePn5XJXrDMXkFhaJiZMUWzDxK5gp4p3Z4fpZUh6TfgFMP5uf5IXAhgAXKN/uY+m/0cDAAAA1OHf33fIW6GK0Tex1U69vNaRoYTYcwoxoYpxe3T/tlqeKnUPYSBmsMYO2pxlYgc0N2EcnqnUcbMauSuU89my9odP8Q2TOm6qicIcrOlNBm5mAhjBZUgAKMflPgAAALiZfyGE35ejKlnsEjOztWuPDFmkPmdKf88Mi3A3uXsMIYTp5utLHbSpyxjAD5T6RrNH6ePn5XJXrDOXT1haJiZlUmzDpK5gFe/OJTYvQ9J+AhcCGABs+FalEKgAAADgpv4CFtGhitE3qtVOvbzWkaGEtXmUKa8ZZtrS/bR7vMURe/CLxQzW8fmp0gM9zLTchHF4plLHzWrkrkjOIWEtZVJ8w+R2lq+unLsABgAjTfMJU3xCFQAAAHB30woWXauSRbaYma1dm3syZu21Y58rpd+lwhg8Qe6eQwhhOUQRwvLmWwtgLA30Mz6AqIBxeKZSx/lq3qWjPt77OYWlZWJSJsU2SOoKGjvJVgMY7S930Q9gCF8A3M/gch8hOGYCAADwRJ8KFuHznXFsqGL0zWi1Uy+vVSqUsLaZY0IVS+dzS/XTbvI2e/bgFzty0M4tc9RA5iaMwzOVPm5ebu8fKnseO+5HUbkrxj5NL3cxH8BoP6GLb/gihKD6BcD1uuoUIbjcBwAAAO/xqWDxuaeSxaFiZraO29RzGGuvHftcKf0uFRrhSVL3HEII62GKpc2Xssza6xi4D2Qcnuno43t171Luio3N5RTGy8SkS4ptkNQVNHbO0ZsFPQlfhNAFL9rebSEMgDJc7gMAAAAmFSy6NjZUMfqWs7opl3UoFUpY28wxoYq5c7JH9zdEtDzVnj34xY4ctHPLHDWQuQnj8Eylj5uX2/uHSs6ueOlum7piXKPpZS+WQxiqYACkE6gAAACAqVEFi65tp61KFtliZraO29RzGDGvHRO6iO13qdAIT5K65xBCWA9TLG2+lGXWXs/AfSDj8ExHH9+re5dyV2xsLqewtOxaqKL4BoldQWOnfutVMNr2czAVvgDerGn+PhsFKgAAAGDVv8G9yXfGsaGK0TeV1U25rMvRoYS1zRwTqpg7J1uyn3aTt9mzB7/YkYN2bpl2Y5nYgcxNVH3a/nFKHzcvt/cPlZzPmEsPH6krxt00zScoMxO+CO0ncCGAATxNL0jRCFMAAABAtGHAYnICrp22KlnsFjPDtWtTz2HEvHZM6CK2v0eGMOwmT5W65xBCWA9TLG2+nGXWXs/AfRDj8EyljvPVvEu5KzQ2l1NYWnYtVFF8g8SuoLHzSN2M7oQAxvf/QhhARbrLfYQgUAEAAAB7/Jv96eQ749hQRTP8kru6KZd1uSKcEBOuGH8VfHT/tlqeKnbPYCBmsMYO2rll2o1lYgcyN1PlafvHKnXcrEbqinRyPmMuPXzEjhtj6VVmAhifez/9EMa3UQkDKKsLVLjcBwAAABxrPmAxOQHXTtuma2PDF8H3zSOlZrjGvnZM2CK1v2eGRbib3D3m5bbCFCFMN9vaMlsD/owPICoQ+wZzhNLHz8ulrtDYXFBiadm1UEXxDRO7olW8K9SkH8KYNn9GlTDa0ApfAPEGl/sIwbEIAAAAypkPWHQm3xnHhil6bfc8/ZaBI0MJsecUYsIV4/bo/m21PFXqHsJAzGBdeuzaMjkDPcy03EzVp+0fp9Rxsxq5K5TzGXPp51HsuDGmSDCqhDHcY9pP1qL9HK+/UQwhDHgpl/sAAACA66wHLCYn4Npp23RtbPgi+L55ZOt8Z+yE0JzNmvKcKf09MyzC3eTuMYQQlsMUIcQP2rnHxgx0A/eBUt9o9ih9/Lzc3o/3uYDE0jIxYYpiGyZ2RauNwnA7vRnpTf+nnbaXs/iFMAQw4CFUpwAAAICqrAcsxr7fGceEKfqhiua3/FxLCOHYUELsOYWYUMW4Pbp/Wy1PlbqHMBAzWGMHbc4yWwOZmzEOz1TquFmN3BXK+YxZ+8On+IaJ/QusuigMj9OE3wT2XwhjsLeNLkEigAH1Up0CAAAA6pYWsPiegGuXW5UsssXMbO3aI0MWqc+Z0t8zwyLcTe4eQwhhuvn6UgZtzkA3gB8o9Y1mj9LHz8vlrlhnLkyxtExMyqTYholdwU4V7w5vNboEyefWjwAGXKMbm70qFQAAAEDd0gIWncl3x7GhitG3edVOvbzWkaGE/lf7a5s5JlQxbkv1z+7xNkfswS8WM1hjB23OMrEDmpswDs9U6rhZjdwVyjkkrKVMim+Y3M5CRVYDGN0lSIQvYC/VKQAAAOD+8gIWkxNx7bRVySJbzMzWrs09KbP22rHPldLfUqERniB3jyGEMN18famDNnUZA/eBUt9o9ih9/Lxc7oqN9XMKS8vEpEyKbZjUFazi3YEE3SVI5sIXIah+AQt6VSmEKQAAAOA58gIWncl3xrGhitE3c9VOvbxWqVDC2maOCVWM29L9tJu8zZ49+MViBuv4PEfpgR5mWm7CODxTqeNmNfb+obLnseN+FJW7YnBzKZcf+TZCGDxIE/6CFJ8x4FIfAAAA8Gz7AhaTE3HttFXJIlvMzNZxm3oOY+21Y58rpd+lwhg8SeqeQwhhOUQRwvLmWwtgLA30owY2lTMOz3T08b26dyl3xcbmcgrjZWJSJsU2SOoKGju8RD+AMW2+2vbzx4kABrUahIk+twUpAAAA4HX2BSw6k++MY0MVo2/Xqp16ea1SoYS1zRwTqlg6n1uqn3aTt9mzB7/YkYN2bpmjBjI3YRyeqfRx83J7/1DJ2RUv2W1zVwze7e8SCs1MAKP95S4EMDjDIDwhSAEAAAAMHROwmJyIa6etShbZ1iZ+LrWp5zDWXjv2uVL6XSo0wpOk7jmEENbDFEubL2WZtdczcB/IODzT0cf36t6l3BUbm8spLC27FqootkFSV9DYgXVNL3chgMFBRpe2cVkPAAAAINYxAYvO5Dvj2FDF6Fuy6qZc1qFUKGFtM8eEKubOyR7d3xDR8lR79uAXO3LQ5iwTO5C5CePwTKWPm5fb+4dKzmfMpbtt6ooBabYCGCGEtp0GMIQvnk+IAgAAACjg2IDF5ERcO21VssgWM7N13Kaew4h57ZjQRWy/S4VGeJLUPYcQwnowYmnzpSwT83oG7oMYh2c6+vhe3buUu2JjczmFpWXXQhXFN0jsCho7UMzoRPvn1kf7y11047VVAaN6k/e06X4cfJ4CAAAAJR0bsOhMvjOODVWMvu2qbsplXc4MJ8SEKubOyR7dzxDR8lSxewYDRw7auWXajWViBzI3UfVp+8cqddysRuqKdHI+Yy49fMSOG2MJztX0chdN/0dfv2oXba/pqmIEQYwjNIN3IAzfBOEJAAAAoB5lAhaTE3DttI0KXfTDF8H3zSMxM1y79oiQxfi1Y0IXsf09MyzCXaXuOYQQ1sMUS5svZ5m11zNwH8Q4vMLRx/nq3qW9u9VcUGJp2bVQRfENEruCVbwrQE/TjD48hs1I2/33uz+52S5+5NwmtNG71MZwPZrZm6PoxOQ5AAAAAO6iTMCiM/nOODZM0Wu75+m3DFwRTogJV4y/Ejy6f1stT3WL04X1iRmssYN2bpl2Y5nYgczNGIdnKnXcrEbuiuR8xm8KlmUAAAUNSURBVKw9trjYcWMswT013X+/++s3x0uv+wQvSsYvmsENn0MAAAAAfWUDFpMTcO20bbo2NnwRfN88EjOztWuPDFnEPmdOf88Mi3A3uXvMy22FKUJYHrxzy2wN+DM+gKiAcXim0sfPy+39eJ8LSiwtsxaqKL5hYle0incFqM3kUhoAAAAAnOm/U1/t+2V282vbrp0LU/TawfKn9vo2tmaoljjZEhOuGLdH9jPm+XiqmD2m/zgGlk5EzrVbgzRnma2BzM0Yh2fac/xcW74auSu0lFsYP2ffUoBs7rGHW1vRvrVkHAAAAAAAZzo3YPH9fridtk3XNqP7c48fP1/pjt9DzMzWro0NMaS8dup50yP6Gfs8PFHMHjP3OEII65slZdDmDPScgUzl1t7oud+zx57jZ8zyl0tZsf7vO3sCZGv9OVzsuOlUF4UBAAAAAHidcwMWnckJuX7Finah/fx+dvmzOn4PR1aImJtHufSaqSd0juxnzPPxVKklEhjYcyIyd6DnDGhuYmtGvjf0SHuOn2vLVyNlxfqPOyIMNtePYlLHTTVRGAAAAACA17kmYDH54rudtpOQxdzjFp7v5VIqO8SGGFJeO/V86RH9jH0enih1irM9YSDmpGLsoE1dJmdAU7nYGfne0CPsOX7GLH+5lBXr/76zJ0C21p/DpY6b6qIwAAAAAACvcU3AojM58978WpUsdjuyQkTs/OOcIETpfto93iJ1ijMDKScil5ZJHeg5A5mbSJ2Rzx5HHD/nlq9Gyor1H7cVzOg/NiwsM9ePYlLHTTVRGAAAAACA17g2YDH54rudtipZZEup7BB7Eqa/3NZr557AObqf1c/Q5SAxe87c7wkhxJ1UjDl5ubTM0uvkDmQqZxye6YjjfMzzXCZlxfq/H8sJg63153Cp46a6KAwAAAAAwONdG7DoTE7eNb9WJYvdSleIWHrN1BM5Mf3d00+7yduYQZ9laeCFmTZnmZyBPbccN2EcnumI4+fa81wuZcX6j+ssBTO2HrvUj2JSx83lERgAAAAAgNeoI2AxORHXTluVLLKlVnRInem69dq550v39C9lRq7d5KlSZwITQljfPEuDN2WZtdfJGchUzjg809HH9+repZQV6/9+bO5zaSsMttafw6WOm2oiMAAAAAAAj1dHwKIzOXnX/FqVLHaLreiQO9N16TVTT+TE9DclZBG73jyVGfRZlgZemGlzlskZ2HPLcRPG4ZmOPr5X9y6lrFj/cZ2l/MLcY5eWWXvs4VJXDAAAAACAUuoKWEy+8G6nrUoW2VIrOqTOdI197dTzpXv6lzIj127yVGbQZ1nbPEuDN2WZtdfLGchUzjg809HH9+repZQV6/9+bO5zKTYUNtefYmLHTTURGAAAAACAx6orYNGZnLxrfq1KFoeJqeyQM9N167ViT+TE9DMlZBGzvjyZGfRZUqpS5Cwzd/IyZyBzE7ElBziCShZh/WN+KaAx99xLy8w9ppjUFQMAAAAA4Gh1BiwmX3i301Yli91SKjukzHSNfe3U86V7+pcyI9du8lRm0GdZ2zxLgzdnmbXXSxnIVG5vyQFSHHGcj1n+Mikr1P/92NznUUwYbKk/xcQev6qJwAAAAAAAPE6dAYvO5ERc82u3KlmY6RwtprJDSoghZjPnBDaO7l/1M3MpZG3P6f+egZSqFDnLLJ28TB3I3IxKFmfacxxdW74ar65kMTduLo/AAAAAAAA8zv8D7/H9P6AdoEoAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,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\"","import React from 'react';\r\nimport { useState, useEffect, useMemo } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { withRouter } from 'react-router-dom';\r\nimport { Drawer, DrawerContent } from '@progress/kendo-react-layout';\r\nimport { decode } from 'jsonwebtoken';\r\nimport { SiteHeader } from './SiteHeader/SiteHeader.jsx';\r\nimport { Routes as AppRoutes } from '../../routes/appRoutes.js';\r\n\r\nconst items = () => [\r\n { text: 'Dashboard', icon: 'k-i-grid', route: AppRoutes.dashboard },\r\n { text: 'My Courses', icon: 'k-i-check-outline', route: AppRoutes.myCourses },\r\n { text: 'Documents', icon: 'k-i-txt', route: AppRoutes.documents },\r\n { separator: true, accessGroup: 'WP-Course-Admin' },\r\n {\r\n text: 'Users',\r\n icon: 'k-i-tell-a-friend',\r\n route: AppRoutes.adminUsers,\r\n accessGroup: 'WP-Course-Admin',\r\n },\r\n {\r\n text: 'Course Admin',\r\n icon: 'k-i-check-circle',\r\n route: AppRoutes.adminCourses,\r\n accessGroup: 'WP-Course-Admin',\r\n },\r\n {\r\n text: 'Reports',\r\n icon: 'k-i-information',\r\n route: AppRoutes.reports,\r\n accessGroup: 'WP-Course-Admin',\r\n },\r\n {\r\n text: 'Applications',\r\n icon: 'k-i-txt',\r\n route: AppRoutes.applications,\r\n accessGroup: 'WP-Application-Admin',\r\n },\r\n];\r\n\r\nfunction getUserMenuItems(token) {\r\n return items().filter(x => isInGroup(token, x.accessGroup));\r\n}\r\n\r\nfunction isInGroup(token, accessGroup) {\r\n if (!token) return false;\r\n if (!accessGroup) return true;\r\n const tokenData = decode(token);\r\n return tokenData?.groups.some(x => x === accessGroup);\r\n}\r\n\r\n// get header text for pages not accessible from main drawer navigation\r\nconst getHeaderTextFromPath = pathname => {\r\n switch (pathname) {\r\n case AppRoutes.index: {\r\n return 'Login';\r\n }\r\n case AppRoutes.employmentApplication: {\r\n return 'Employment Application';\r\n }\r\n case AppRoutes.continueApplication: {\r\n return 'Employment Application';\r\n }\r\n default: {\r\n return null;\r\n }\r\n }\r\n};\r\n\r\nfunction SiteLayout(props) {\r\n const token = useSelector(state => state.user.token);\r\n const [expanded, setExpanded] = useState(window.innerWidth >= 768);\r\n const [isSmallerScreen, setIsSmallerScreen] = useState(\r\n window.innerWidth < 768\r\n );\r\n const userMenuItems = useMemo(() => getUserMenuItems(token), [token]);\r\n\r\n useEffect(() => {\r\n window.addEventListener('resize', resizeWindow);\r\n\r\n return () => {\r\n window.removeEventListener('resize', resizeWindow);\r\n };\r\n\r\n function resizeWindow() {\r\n // resizing from smaller to larger\r\n if (isSmallerScreen && window.innerWidth >= 768) {\r\n setExpanded(true); // show menu\r\n }\r\n\r\n // resizing from larger to smaller\r\n if (!isSmallerScreen && window.innerWidth < 768) {\r\n setExpanded(false); // hide menu\r\n }\r\n\r\n setIsSmallerScreen(window.innerWidth < 768);\r\n }\r\n }, [isSmallerScreen]);\r\n\r\n function handleClick() {\r\n setExpanded(e => !e);\r\n }\r\n\r\n function handleSelect(e) {\r\n setExpanded(!isSmallerScreen);\r\n props.history.push(e.itemTarget.props.route);\r\n }\r\n\r\n function getSelectedItem(pathName) {\r\n let currentPath = items().find(item => item.route === pathName);\r\n if (currentPath?.text) {\r\n return currentPath.text;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n let selected = getSelectedItem(props.location.pathname);\r\n\r\n // todo - need to come up with a better way to determine if the menu should be shown\r\n const hideMenu =\r\n !token ||\r\n props.location.pathname.includes(AppRoutes.takeCourse) ||\r\n props.location.pathname.includes(AppRoutes.employmentApplication) ||\r\n props.location.pathname.includes(AppRoutes.continueApplication);\r\n\r\n return (\r\n \r\n \r\n {!hideMenu && (\r\n ({\r\n icon: item.icon,\r\n separator: item.separator,\r\n route: item.route,\r\n text: item.text,\r\n selected: item.text === selected,\r\n }))}\r\n position=\"start\"\r\n mode={isSmallerScreen ? 'overlay' : 'push'}\r\n mini={isSmallerScreen ? false : true}\r\n onOverlayClick={handleClick}\r\n onSelect={handleSelect}\r\n className=\"SiteLayout-drawer\"\r\n >\r\n {props.children}\r\n \r\n )}\r\n {hideMenu && props.children}\r\n \r\n );\r\n}\r\n\r\nexport default withRouter(SiteLayout);\r\n","import React, { useEffect, useState, useCallback, useMemo } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { Grid, GridColumn as Column } from '@progress/kendo-react-grid';\r\n\r\n// local\r\nimport { Routes as appRoutes } from '../../routes/appRoutes';\r\nimport './SearchResultsGrid.css';\r\n\r\nconst gridStyle = { maxHeight: '90vh', maxWidth: '92vw' };\r\n\r\nconst columns = [\r\n { field: 'name', title: 'Name' },\r\n { field: 'category', title: 'Category' },\r\n { field: 'tags', title: 'Tags' },\r\n { field: 'file_extension', title: 'Type' },\r\n { field: 'last_modified', title: 'Last Modified', minGridWidth: 400 },\r\n];\r\n\r\nconst pageableSettings = {\r\n buttonCount: 5,\r\n info: true,\r\n type: 'numeric',\r\n pageSizes: true,\r\n previousNext: true,\r\n};\r\n\r\n/**\r\n * SearchResultsGrid\r\n * @returns SearchResultsGrid Component\r\n */\r\n\r\nfunction SearchResultsGrid({ searchResults }) {\r\n const history = useHistory();\r\n const [pagingState, setPagingState] = useState({ skip: 0, take: 10 });\r\n const [visibleColumns, setVisibleColumns] = useState(columns);\r\n\r\n const pageChange = useCallback(event => {\r\n setPagingState({\r\n skip: event.page.skip,\r\n take: event.page.take,\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n // remove last modified column on smallest screen sizes.\r\n const handleResize = () => {\r\n const grid = document.querySelector('.k-grid');\r\n const currentVisibleColumns = columns.filter(\r\n c => !(c.minGridWidth > grid.offsetWidth)\r\n );\r\n if (currentVisibleColumns.length !== visibleColumns.length) {\r\n setVisibleColumns(currentVisibleColumns);\r\n }\r\n };\r\n\r\n window.addEventListener('resize', handleResize);\r\n handleResize();\r\n\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n };\r\n }, [visibleColumns]);\r\n\r\n const handleRowClick = useCallback(\r\n e => history.push(appRoutes.makeViewDocUrl(e.dataItem.id)),\r\n [history]\r\n );\r\n\r\n const gridData = useMemo(\r\n () =>\r\n searchResults.slice(\r\n pagingState.skip,\r\n pagingState.take + pagingState.skip\r\n ),\r\n [pagingState.skip, pagingState.take, searchResults]\r\n );\r\n\r\n return (\r\n \r\n {visibleColumns.map((column, index) => {\r\n return ;\r\n })}\r\n \r\n );\r\n}\r\n\r\nexport default React.memo(SearchResultsGrid);\r\n","import SearchIcon from '@material-ui/icons/Search';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport {\r\n CardHeader,\r\n CardBody,\r\n CardSubtitle,\r\n} from '@progress/kendo-react-layout';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n cardBody: {\r\n paddingLeft: 0,\r\n [theme.breakpoints.down('sm')]: {\r\n paddingLeft: 0,\r\n },\r\n },\r\n cardUl: {\r\n lineHeight: 1.8,\r\n },\r\n cardSearchIcon: {\r\n marginBottom: '-6px',\r\n color: 'rgba(0, 0, 0, 0.54)',\r\n },\r\n}));\r\n\r\nconst UseCard = () => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <>\r\n \r\n \r\n Search documents by name, category, tags, or type.\r\n \r\n \r\n \r\n
    \r\n
  • \r\n Click{' '}\r\n {' '}\r\n button with blank input to search all documents.\r\n
  • \r\n
  • \r\n \"Double Quote\" - Search for an exact match with \"\r\n
  • \r\n
  • \r\n name:progress report - Search within a column with ':'\r\n
  • \r\n
  • \r\n guide + taxes - Multiple requirements. Use '+'\r\n
  • \r\n
  • \r\n name:marketing + type:\".xml\" Combine previous operators.\r\n
  • \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default UseCard;\r\n","import { FloatingActionButton } from '@progress/kendo-react-buttons';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\n// local\r\nimport { Routes as AppRoutes } from '../../../routes/appRoutes';\r\n\r\nconst items = [{ icon: 'plus', text: 'Upload' }];\r\n\r\nfunction itemClickedToAppUrl(e) {\r\n const itemClicked = e.itemIndex;\r\n\r\n switch (itemClicked) {\r\n case 0:\r\n return AppRoutes.uploadDoc;\r\n default:\r\n return AppRoutes.uploadDoc;\r\n }\r\n}\r\n\r\nfunction Fab({ id }) {\r\n const history = useHistory();\r\n return (\r\n history.push(itemClickedToAppUrl(e))}\r\n themeColor=\"tertiary\"\r\n alignOffset={{ x: '30px', y: '30px' }}\r\n />\r\n );\r\n}\r\n\r\nexport default Fab;\r\n","/** Search Documents View */\r\n\r\nimport { useState, useEffect, useCallback } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport Container from '@material-ui/core/Container';\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport SearchIcon from '@material-ui/icons/Search';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Box from '@material-ui/core/Box';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Window } from '@progress/kendo-react-dialogs';\r\nimport { Tooltip } from '@progress/kendo-react-tooltip';\r\nimport { Loader } from '@progress/kendo-react-indicators';\r\n\r\n// local imports\r\nimport SearchDocumentForm from '../../components/SearchDocumentForm/SearchDocumentForm';\r\nimport SearchResultsGrid from '../../components/SearchResultsGrid/SearchResultsGrid';\r\nimport processSearchResults from './utils/processSearchResults';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n FormFeedback,\r\n} from '../../utils/userFeedback';\r\nimport ApiAgent from '../../utils/apiAgent';\r\nimport UseCard from './UseCard/UseCard';\r\nimport Fab from './Fab/Fab';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n container: {\r\n // minHeight: '100vh',\r\n [theme.breakpoints.up('lg')]: {\r\n maxWidth: '75vw',\r\n },\r\n },\r\n paper: {\r\n marginTop: theme.spacing(2),\r\n maxWidth: '100vw',\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(1),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(6),\r\n },\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n window: {\r\n [theme.breakpoints.down('xs')]: {\r\n maxWidth: 350,\r\n minHeight: 450,\r\n },\r\n },\r\n infoButton: {\r\n borderRadius: '10px',\r\n padding: 10,\r\n marginTop: theme.spacing(4),\r\n opacity: 0.5,\r\n },\r\n loaderSpacing: {\r\n marginTop: theme.spacing(4),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(0),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(4),\r\n },\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\n/**\r\n * Search\r\n * @returns Search View Component\r\n */\r\n\r\nfunction Search() {\r\n const classes = useStyles();\r\n const token = useSelector(state => state.user.token);\r\n const query = useSelector(state => state.search.query);\r\n const [loading, setLoading] = useState(null);\r\n const [searchResults, setSearchResults] = useState(null);\r\n const [infoWindowVisible, setInfoWindowVisible] = useState(false);\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n\r\n const makeSearch = useCallback(async () => {\r\n setFormFeedback(null);\r\n setLoading(true);\r\n setSearchResults(null);\r\n const resp = await ApiAgent.searchDocMetadata({\r\n q: query,\r\n _token: token,\r\n });\r\n if (resp.error) {\r\n setFormFeedback(networkErrorMessageObjFactory(resp.error));\r\n } else {\r\n setSearchResults(processSearchResults(resp));\r\n }\r\n setLoading(false);\r\n }, [token, query]);\r\n\r\n // load results from previous query if previous query\r\n useEffect(() => {\r\n if (query !== null) makeSearch();\r\n }, [query, makeSearch]);\r\n\r\n const toggleUseWindow = useCallback(() => {\r\n setInfoWindowVisible(!infoWindowVisible);\r\n }, [infoWindowVisible]);\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n \r\n \r\n \r\n Search Documents\r\n \r\n \r\n \r\n \r\n {loading && (\r\n \r\n \r\n \r\n )}\r\n\r\n {formFeedback && }\r\n\r\n {searchResults && }\r\n {!searchResults && !loading && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {infoWindowVisible && (\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n
\r\n \r\n \r\n );\r\n}\r\n\r\nexport default Search;\r\n","import { processMetatdata } from '../../../utils/dataTransformations';\r\n\r\n/** Process search results for display. */\r\n\r\nexport default function processSearchResults(results) {\r\n return results.map(el => processMetatdata(el));\r\n}\r\n","import React from \"react\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport Card from \"@material-ui/core/Card\";\r\nimport CardHeader from \"@material-ui/core/CardHeader\";\r\nimport CardContent from \"@material-ui/core/CardContent\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nimport UserCourseCard from \"../../../components/CourseCards/UserCourseCard\";\r\nimport { Box, Typography } from \"@material-ui/core\";\r\n\r\nconst useStyles = makeStyles(\r\n (theme) => ({\r\n section: {\r\n margin: 10,\r\n [theme.breakpoints.up(\"md\")]: {\r\n margin: 25,\r\n },\r\n },\r\n }),\r\n { classNamePrefix: \"wp\" }\r\n);\r\n\r\nfunction MyCourses() {\r\n const classes = useStyles();\r\n const user = useSelector((state) => state.user.user);\r\n const assignedUserCourses = (user.courses ?? []).filter((el) => !el.complete);\r\n const completedUserCourses = (user.courses ?? []).filter((el) => el.complete);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n {assignedUserCourses.map((userCourse) => (\r\n \r\n \r\n \r\n ))}\r\n {assignedUserCourses.length === 0 && (\r\n \r\n You have no assigned courses.\r\n \r\n )}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {completedUserCourses.map((userCourse) => (\r\n \r\n \r\n \r\n ))}\r\n {completedUserCourses.length === 0 && (\r\n \r\n You have not completed any courses yet.\r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default MyCourses;\r\n","import React, { useEffect, useState } from 'react';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Hidden from '@material-ui/core/Hidden';\r\nimport { Document, Page } from 'react-pdf/dist/esm/entry.webpack';\r\nimport { pdfjs } from 'react-pdf';\r\nimport { isBrowser, isMobile } from 'react-device-detect';\r\n\r\n// local\r\nimport { Routes as ApiRoutes } from '../../../utils/apiAgent';\r\n\r\npdfjs.GlobalWorkerOptions.workerSrc = '/pdf.worker.min.js';\r\n\r\nconst DocumentTask = ({ currTask, token, setAllowNext }) => {\r\n useEffect(() => {\r\n setAllowNext(true);\r\n }, [setAllowNext]);\r\n\r\n const [numPages, setNumPages] = useState(null);\r\n\r\n const url = ApiRoutes.getDocument(currTask.document_id);\r\n const encoded = encodeURIComponent(token);\r\n const embedUrl = `${url}?_token=${encoded}&category=CourseViewer`;\r\n\r\n function onDocumentLoadSuccess({ numPages: nextNumPages }) {\r\n setNumPages(nextNumPages);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n {currTask.title} - {currTask.text}\r\n \r\n \r\n\r\n {isMobile && (\r\n \r\n {Array.from(new Array(numPages), (el, index) => (\r\n \r\n ))}\r\n \r\n )}\r\n\r\n {isBrowser && (\r\n \r\n

\r\n Your web browser doesn't have a PDF viewer. Instead you can\r\n click here to download the PDF file.\r\n

\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default DocumentTask;\r\n","import { useEffect, useCallback } from 'react';\r\nimport Box from '@material-ui/core/Box';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { useDispatch } from 'react-redux';\r\nimport { Form, FormElement, Field } from '@progress/kendo-react-form';\r\n\r\n// local\r\nimport { updateTasksCompleted } from '../../../redux/actions/thunkCreators';\r\nimport { FormInput } from '../../form-components';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n header: {\r\n textAlign: 'center',\r\n [theme.breakpoints.up('md')]: {\r\n paddingTop: theme.spacing(6),\r\n },\r\n },\r\n title: {\r\n fontSize: 'min(2vw + 14px, 4vh + 14px)',\r\n },\r\n subtitle: {\r\n fontSize: 'min(1.5vw + 12px, 2.5vh + 12px)',\r\n },\r\n formElement: {\r\n width: 'clamp(300px, 500px, 90vw)',\r\n margin: 'auto',\r\n marginTop: theme.spacing(5),\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(7),\r\n },\r\n },\r\n nameInputDiv: {\r\n marginTop: theme.spacing(5),\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(6),\r\n },\r\n },\r\n nameInput: {\r\n backgroundColor: '#f5f5f5',\r\n height: 60,\r\n textAlign: 'center',\r\n '&:hover': {\r\n backgroundColor: '#e7e7e7',\r\n },\r\n },\r\n buttonBox: {\r\n paddingBottom: theme.spacing(2),\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction Signature({\r\n currTask,\r\n setAllowNext,\r\n currTaskDone,\r\n setTaskNumber,\r\n userCourse,\r\n taskNumber,\r\n user,\r\n token,\r\n}) {\r\n const dispatch = useDispatch();\r\n const classes = useStyles();\r\n\r\n const signatureValidator = value => {\r\n const name = `${user.firstname} ${user.lastname}`;\r\n\r\n const reName = new RegExp(`^${name}$`, 'i');\r\n\r\n return reName.test(value)\r\n ? ''\r\n : 'Signature must match first and last name.';\r\n };\r\n\r\n const handleSubmit = useCallback(\r\n ev => {\r\n // if a new task was completed for user update user DB record\r\n if (!userCourse.tasks_completed[taskNumber]) {\r\n dispatch(\r\n updateTasksCompleted(user.id, userCourse.course_id, taskNumber, token)\r\n );\r\n }\r\n setTaskNumber(taskNumber => taskNumber + 1);\r\n setAllowNext(true);\r\n },\r\n [\r\n dispatch,\r\n setAllowNext,\r\n setTaskNumber,\r\n taskNumber,\r\n token,\r\n userCourse.course_id,\r\n userCourse.tasks_completed,\r\n user.id,\r\n ]\r\n );\r\n\r\n useEffect(() => {\r\n if (!currTaskDone) setAllowNext(false);\r\n else setAllowNext(true);\r\n }, [setAllowNext, currTaskDone]);\r\n\r\n return (\r\n <>\r\n
\r\n {currTask.title}\r\n \r\n \r\n {currTask.text}\r\n \r\n
\r\n\r\n (\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n Signature Expected:\r\n \r\n \r\n {' '}\r\n \r\n {user.firstname} {user.lastname}\r\n \r\n \r\n \r\n \r\n \r\n Digitally Sign\r\n \r\n \r\n
\r\n )}\r\n />\r\n \r\n );\r\n}\r\n\r\nexport default Signature;\r\n","import { useEffect, useCallback, useRef, useState, createRef } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Form, FormElement } from '@progress/kendo-react-form';\r\nimport { RadioButton } from '@progress/kendo-react-inputs';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Box } from '@material-ui/core';\r\n\r\n// local\r\nimport { updateTasksCompleted } from '../../../redux/actions/thunkCreators';\r\nimport {\r\n successMessageObjFactory,\r\n errorMessageObjFactory,\r\n FormFeedback,\r\n} from '../../../utils/userFeedback';\r\nimport './QuizTask.scss';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n quizQuestion: {\r\n fontSize: 'min(2vw + 14px, 4vh + 14px)',\r\n textAlign: 'center',\r\n marginTop: '20px',\r\n marginBottom: '10px',\r\n lineHeight: 1.25,\r\n [theme.breakpoints.up('sm')]: {\r\n margin: '20px 40px 0',\r\n },\r\n },\r\n choicesDiv: {\r\n [theme.breakpoints.up('md')]: {\r\n padding: '0 5vw',\r\n },\r\n },\r\n quizChoices: {\r\n fontSize: 'min(1.5vw + 12px, 2.5vh + 12px)',\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n paddingLeft: 20,\r\n paddingRight: 20,\r\n },\r\n feedbackDiv: {\r\n height: 40,\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\n// highlight correct answer in green and show user answer in red if incorrect\r\nconst highlightAnswer = (\r\n answer,\r\n userAnswer,\r\n answerChoices,\r\n newResult,\r\n setFormFeedback\r\n) => {\r\n const answerCorrect = userAnswer === answer;\r\n if (newResult)\r\n answerChoices[answer - 1].current.classList.add(\r\n 'highlight-answer',\r\n 'highlight-answer-animate'\r\n );\r\n else answerChoices[answer - 1].current.classList.add('highlight-answer');\r\n\r\n if (answerCorrect) {\r\n setFormFeedback(successMessageObjFactory('Correct!'));\r\n } else {\r\n answerChoices[userAnswer - 1].current.style.color = '#eb2f2f';\r\n answerChoices[userAnswer - 1].current.style.fontStyle = 'italic';\r\n setFormFeedback(errorMessageObjFactory('Incorrect!'));\r\n }\r\n};\r\n\r\nconst QuizTask = ({\r\n currTask,\r\n setAllowNext,\r\n currTaskResult,\r\n userId,\r\n courseId,\r\n taskNumber,\r\n token,\r\n}) => {\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [selectedAnswerChoice, setSelectedAnswerChoice] = useState(null);\r\n const feedbackRef = useRef(null);\r\n const formRenderPropsRef = useRef(null);\r\n const [answerChoices, setAnswerChoices] = useState([]);\r\n\r\n // create refs for radio button highlighting\r\n useEffect(() => {\r\n setAnswerChoices(() => {\r\n return Array(currTask.choices.length)\r\n .fill()\r\n .map((_, i) => createRef());\r\n });\r\n if (!currTaskResult) {\r\n setSelectedAnswerChoice(null);\r\n }\r\n }, [currTask, currTaskResult]);\r\n\r\n // update feedback, highlighting, answer choice selection\r\n useEffect(() => {\r\n // highlight answer on component load if task already done\r\n if (currTaskResult && answerChoices[0]) {\r\n highlightAnswer(\r\n currTask.answer,\r\n currTaskResult.answer,\r\n answerChoices,\r\n false,\r\n setFormFeedback\r\n );\r\n setSelectedAnswerChoice(currTaskResult.answer);\r\n } else {\r\n // clear feedback and any radio button selection\r\n setFormFeedback(null);\r\n setSelectedAnswerChoice(null);\r\n }\r\n }, [currTask.answer, currTaskResult, answerChoices]);\r\n\r\n // make form change to enable submit button\r\n const enableForm = useCallback(\r\n () =>\r\n formRenderPropsRef.current.onChange('title', {\r\n value: formRenderPropsRef.current.valueGetter('title'),\r\n }),\r\n []\r\n );\r\n\r\n const handleChange = useCallback(\r\n e => {\r\n setSelectedAnswerChoice(e.value);\r\n enableForm();\r\n },\r\n [setSelectedAnswerChoice, enableForm]\r\n );\r\n\r\n const handleSubmit = useCallback(() => {\r\n if (!currTaskResult) {\r\n dispatch(\r\n updateTasksCompleted(\r\n userId,\r\n courseId,\r\n taskNumber,\r\n token,\r\n selectedAnswerChoice\r\n )\r\n );\r\n }\r\n setAllowNext(true);\r\n\r\n highlightAnswer(\r\n currTask.answer,\r\n selectedAnswerChoice,\r\n answerChoices,\r\n true,\r\n setFormFeedback\r\n );\r\n }, [\r\n courseId,\r\n currTask.answer,\r\n dispatch,\r\n setAllowNext,\r\n taskNumber,\r\n token,\r\n userId,\r\n currTaskResult,\r\n selectedAnswerChoice,\r\n answerChoices,\r\n ]);\r\n\r\n // reset form on task number change\r\n useEffect(() => {\r\n formRenderPropsRef.current.onFormReset();\r\n }, [taskNumber]);\r\n\r\n useEffect(() => {\r\n if (!currTaskResult) setAllowNext(false);\r\n else setAllowNext(true);\r\n }, [setAllowNext, currTaskResult]);\r\n\r\n return (\r\n {\r\n formRenderPropsRef.current = formRenderProps;\r\n\r\n return (\r\n \r\n {currTask.text}\r\n\r\n \r\n \r\n \r\n {formFeedback && (\r\n \r\n )}\r\n \r\n \r\n {currTask.choices.map((el, i) => (\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n Submit\r\n \r\n \r\n
\r\n \r\n );\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default QuizTask;\r\n","import { useEffect, useCallback } from \"react\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { Box, makeStyles, Typography } from \"@material-ui/core\";\r\nimport PlayCircleOutlineIcon from \"@material-ui/icons/PlayCircleOutline\";\r\n\r\nimport { updateTasksCompleted } from \"../../../redux/actions/thunkCreators\";\r\n\r\nconst useStyles = makeStyles(\r\n (theme) => ({\r\n title: {\r\n textAlign: \"center\",\r\n marginTop: theme.spacing(2),\r\n [theme.breakpoints.up(\"md\")]: {\r\n marginTop: theme.spacing(6),\r\n },\r\n },\r\n subtitle: {\r\n textAlign: \"center\",\r\n marginTop: theme.spacing(1),\r\n },\r\n playButtonDiv: {},\r\n playButton: {\r\n fontSize: \"15vh\",\r\n marginTop: theme.spacing(3),\r\n \"&:hover\": {\r\n transform: \"scale(1.1)\",\r\n transition: \".4s\",\r\n color: \"lightblue\",\r\n },\r\n },\r\n }),\r\n { classNamePrefix: \"wp\" }\r\n);\r\n\r\nconst VideoTask = ({\r\n currTask,\r\n userCourse,\r\n taskNumber,\r\n userId,\r\n token,\r\n setAllowNext,\r\n currTaskDone,\r\n}) => {\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n\r\n const videoLinkClicked = useCallback(\r\n (ev) => {\r\n // if a new task was completed for user update user DB record\r\n if (!userCourse.tasks_completed[taskNumber]) {\r\n dispatch(\r\n updateTasksCompleted(userId, userCourse.course_id, taskNumber, token)\r\n );\r\n }\r\n setAllowNext(true);\r\n },\r\n [\r\n dispatch,\r\n setAllowNext,\r\n taskNumber,\r\n token,\r\n userCourse.course_id,\r\n userCourse.tasks_completed,\r\n userId,\r\n ]\r\n );\r\n\r\n useEffect(() => {\r\n if (!currTaskDone) setAllowNext(false);\r\n else setAllowNext(true);\r\n }, [setAllowNext, currTaskDone]);\r\n\r\n return (\r\n <>\r\n \r\n {currTask.title}\r\n \r\n \r\n {currTask.text}\r\n \r\n \r\n \r\n Video Playback Password: {currTask.video_password}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n Click on the above play button to open the video a new browser\r\n window. After watching the video return to this browser window to\r\n complete the course.\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default VideoTask;\r\n","import React, { useState, useRef } from 'react';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardHeader from '@material-ui/core/CardHeader';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport Box from '@material-ui/core/Box';\r\nimport BottomNavigation from '@material-ui/core/BottomNavigation';\r\nimport BottomNavigationAction from '@material-ui/core/BottomNavigationAction';\r\nimport Hidden from '@material-ui/core/Hidden';\r\nimport { ArrowBack, ArrowForward } from '@material-ui/icons';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { useHistory, useParams } from 'react-router-dom';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { Loader } from '@progress/kendo-react-indicators';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Button from '@material-ui/core/Button';\r\n\r\n// local\r\nimport { AxiosGetHook } from '../../../hooks/axiosHook';\r\nimport { Routes as appRoutes } from '../../../routes/appRoutes';\r\nimport { Routes as apiRoutes } from '../../../utils/apiAgent';\r\nimport DocumentTask from '../../../components/CourseTask/DocumentTask/DocumentTask';\r\nimport SignatureTask from '../../../components/CourseTask/SignatureTask/SignatureTask';\r\nimport QuizTask from '../../../components/CourseTask/QuizTask/QuizTask';\r\nimport VideoTask from '../../../components/CourseTask/VideoTask/VideoTask';\r\nimport TasksComplete from '../../../components/CourseTask/TasksComplete/TasksComplete';\r\nimport { updateTasksCompleted } from '../../../redux/actions/thunkCreators';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n FormFeedback,\r\n} from '../../../utils/userFeedback';\r\n\r\nimport './TakeCourse.scss';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n wrapper: {\r\n height: 'calc(100vh - 80px)',\r\n position: 'relative',\r\n paddingTop: theme.spacing(1),\r\n [theme.breakpoints.up('sm')]: {\r\n paddingTop: 0,\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n paddingTop: 25,\r\n },\r\n },\r\n card: {\r\n margin: 0,\r\n overflowY: 'auto',\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n [theme.breakpoints.up('sm')]: {\r\n marginLeft: 25,\r\n marginRight: 25,\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginLeft: 25,\r\n marginRight: 25,\r\n },\r\n },\r\n header: {\r\n paddingBottom: 0,\r\n },\r\n bottomNavigation: {\r\n justifyContent: 'space-between',\r\n backgroundColor: theme.palette.primary.main,\r\n width: '100%',\r\n position: 'absolute',\r\n bottom: 0,\r\n },\r\n bottomNavigationAction: {\r\n color: 'white',\r\n },\r\n cardContent: {\r\n height: 'calc(100vh - 135px)',\r\n marginBottom: 0,\r\n [theme.breakpoints.up('md')]: {\r\n height: 'calc(100vh - 250px)',\r\n },\r\n },\r\n loader: {\r\n marginTop: theme.spacing(26),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(12),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(30),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(36),\r\n },\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction TakeCourse() {\r\n const { id: courseId, version } = useParams();\r\n const classes = useStyles();\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n const user = useSelector(state => state.user.user);\r\n const token = useSelector(state => state.user.token);\r\n const userCourse = user.courses.find(el => el.course_id === courseId);\r\n const [taskNumber, setTaskNumber] = useState(\r\n userCourse.tasks_completed.length\r\n );\r\n const [allowNext, setAllowNext] = useState(true);\r\n const [completeTaskDialogOpen, setCompleteTaskDialogOpen] = useState(false);\r\n const quizAnswers = useRef({});\r\n\r\n // get course\r\n const url = apiRoutes.getCourse(courseId, version);\r\n const params = useRef({ _token: token });\r\n const { resp, error, loading } = AxiosGetHook(url, params.current);\r\n\r\n if (error)\r\n return ;\r\n if (loading)\r\n return (\r\n \r\n \r\n \r\n );\r\n\r\n const course = resp.course;\r\n const currTask = course.tasks[taskNumber];\r\n const numberOfTasks = course.tasks.length;\r\n const currTaskResult = userCourse.tasks_completed[taskNumber];\r\n const tasksDone = taskNumber === numberOfTasks;\r\n\r\n // Next/ Back buttons go forward, backward, or back to \"My Courses\"\r\n const onBottomNavChange = (_, newValue) => {\r\n if (newValue === 'next' && !tasksDone) {\r\n if (!allowNext) {\r\n setCompleteTaskDialogOpen(true);\r\n } else {\r\n // if a new task was completed for the user update user DB record\r\n if (!userCourse.tasks_completed[taskNumber])\r\n dispatch(updateTasksCompleted(user.id, courseId, taskNumber, token));\r\n setTaskNumber(taskNumber + 1);\r\n }\r\n } else if (newValue === 'back' && taskNumber > 0) {\r\n setTaskNumber(taskNumber - 1);\r\n } else if ((newValue === 'next' && tasksDone) || newValue === 'back') {\r\n history.push(appRoutes.myCourses);\r\n }\r\n };\r\n\r\n const handleCloseDialog = () => setCompleteTaskDialogOpen(false);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {currTask?.type === 'Document' && (\r\n \r\n )}\r\n {currTask?.type === 'Signature' && (\r\n \r\n )}\r\n {currTask?.type === 'Question' && (\r\n \r\n )}\r\n\r\n {currTask?.type === 'Video' && (\r\n \r\n )}\r\n {tasksDone && (\r\n \r\n )}\r\n \r\n \r\n\r\n \r\n }\r\n />\r\n }\r\n />\r\n \r\n\r\n \r\n \r\n Please complete current task.\r\n \r\n \r\n \r\n You must complete the current task before proceeding to the next\r\n task.\r\n \r\n \r\n \r\n {/* eslint-disable-next-line jsx-a11y/no-autofocus */}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default TakeCourse;\r\n","import { useState, useCallback } from \"react\";\r\nimport SearchBar from \"material-ui-search-bar\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport Box from \"@material-ui/core/Box\";\r\n\r\nimport ApiAgent from \"../../utils/apiAgent\";\r\n\r\nfunction SearchUserForm({\r\n setSearchResults = () => {},\r\n setLoading = () => {},\r\n}) {\r\n const [searchQuery, setSearchQuery] = useState(null);\r\n\r\n const handleSubmit = useCallback(() => {\r\n async function getResults() {\r\n setLoading(true);\r\n const resp = await ApiAgent.getUsers(searchQuery);\r\n setLoading(false);\r\n if (resp.error) {\r\n } else {\r\n setSearchResults(resp);\r\n }\r\n }\r\n getResults();\r\n }, [searchQuery, setSearchResults, setLoading]);\r\n\r\n return (\r\n \r\n \r\n setSearchQuery(newValue)}\r\n onCancelSearch={() => setSearchQuery(null)}\r\n onRequestSearch={handleSubmit}\r\n />\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default SearchUserForm;\r\n","import { useState, useCallback } from \"react\";\r\nimport Card from \"@material-ui/core/Card\";\r\nimport CardContent from \"@material-ui/core/CardContent\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport Box from \"@material-ui/core/Box\";\r\nimport {\r\n Grid,\r\n GridColumn,\r\n GridNoRecords,\r\n getSelectedState,\r\n} from \"@progress/kendo-react-grid\";\r\nimport { getter } from \"@progress/kendo-react-common\";\r\n\r\nimport SearchUserForm from \"../../SearchUserForm/SearchUserForm\";\r\n\r\nconst idGetter = getter(\"id\");\r\n\r\nconst useStyles = makeStyles(\r\n () => ({\r\n section: {\r\n border: \"none\",\r\n boxShadow: \"none\",\r\n },\r\n dataGrid: {\r\n height: \"calc(100vh - 300px)\",\r\n maxHeight: 340,\r\n minHeight: 200,\r\n },\r\n }),\r\n { classNamePrefix: \"wp\" }\r\n);\r\n\r\nfunction UserList({ usersSelectedCallback = () => {} }) {\r\n const classes = useStyles();\r\n const [searchResults, setSearchResults] = useState([]);\r\n const [loading, setLoading] = useState(null);\r\n const [selectedState, setSelectedState] = useState({});\r\n const [initialSearchCompleted, setInitialSearchCompleted] = useState(false);\r\n\r\n const onSearchResults = useCallback(\r\n (results) => {\r\n const users = results.filter(x => x.is_active);\r\n setSearchResults(users);\r\n setInitialSearchCompleted(true);\r\n },\r\n [setSearchResults, setInitialSearchCompleted]\r\n );\r\n\r\n const onSelectionChange = useCallback(\r\n (event) => {\r\n const newSelectedState = getSelectedState({\r\n event,\r\n selectedState: selectedState,\r\n dataItemKey: \"id\",\r\n });\r\n setSelectedState(newSelectedState);\r\n usersSelectedCallback(\r\n searchResults.filter((x) => newSelectedState[x.id])\r\n );\r\n },\r\n [selectedState, searchResults, usersSelectedCallback]\r\n );\r\n\r\n const onHeaderSelectionChange = useCallback(\r\n (event) => {\r\n const checkboxElement = event.syntheticEvent.target;\r\n const checked = checkboxElement.checked;\r\n const newSelectedState = {};\r\n event.dataItems.forEach((item) => {\r\n newSelectedState[idGetter(item)] = checked;\r\n });\r\n setSelectedState(newSelectedState);\r\n usersSelectedCallback(\r\n searchResults.filter((x) => newSelectedState[x.id])\r\n );\r\n },\r\n [searchResults, usersSelectedCallback]\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {loading && (\r\n \r\n \r\n \r\n )}\r\n {!loading && (\r\n ({\r\n ...item,\r\n selected: selectedState[idGetter(item)],\r\n }))}\r\n dataItemKey=\"id\"\r\n selectedField=\"selected\"\r\n selectable={{\r\n enabled: true,\r\n drag: false,\r\n cell: false,\r\n mode: \"multiple\",\r\n }}\r\n onSelectionChange={onSelectionChange}\r\n onHeaderSelectionChange={onHeaderSelectionChange}\r\n >\r\n {!initialSearchCompleted && (\r\n Perform a search to show results\r\n )}\r\n !selectedState[idGetter(item)]\r\n ) === -1\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n\r\nexport default UserList;\r\n","import { useState, useRef, useCallback } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { makeStyles, Typography } from '@material-ui/core';\r\nimport { Window, WindowActionsBar } from '@progress/kendo-react-dialogs';\r\nimport { Form, Field, FormElement } from '@progress/kendo-react-form';\r\nimport Box from '@material-ui/core/Box';\r\nimport Button from '@material-ui/core/Button';\r\n\r\n// local\r\nimport ApiAgent from '../../utils/apiAgent';\r\nimport {\r\n FormFeedback,\r\n successMessageObjFactory,\r\n scrollFeedbackIntoView,\r\n errorMessageObjFactory,\r\n} from '../../utils/userFeedback';\r\nimport { FormCheckbox } from '../form-components';\r\nimport UserSelectionList from './UserSelectionList/UserSelectionList';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n formElement: {\r\n width: '100%',\r\n marginBottom: '20px',\r\n },\r\n formLegend: {\r\n borderColor: 'rgba(0, 0, 0, 0.12)',\r\n margin: '0 0 1rem',\r\n padding: 0,\r\n width: '100%',\r\n borderWidth: '0 0 2px',\r\n borderStyle: 'solid',\r\n fontSize: 14,\r\n textTransform: 'uppercase',\r\n },\r\n formInputs: {\r\n paddingLeft: theme.spacing(4),\r\n paddingRight: theme.spacing(5),\r\n },\r\n FormCheckbox: {\r\n marginLeft: theme.spacing(2),\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction AssignCourseWindow({ courseDetails, setAssignWindowOpen }) {\r\n const classes = useStyles();\r\n const token = useSelector(state => state.user.token);\r\n const [usersSelected, setUsersSelected] = useState([]);\r\n const [updateAssignment, setUpdateAssignment] = useState(false);\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const feedbackRef = useRef(null);\r\n const formRenderPropsRef = useRef(null);\r\n\r\n const handleSubmit = useCallback(\r\n async formData => {\r\n if (usersSelected.length === 0)\r\n return setFormFeedback(\r\n errorMessageObjFactory('Please select one or more users.')\r\n );\r\n setLoading(true);\r\n const requests = usersSelected.map(x =>\r\n ApiAgent.assignCourse(\r\n x.id,\r\n courseDetails.course_id,\r\n token,\r\n updateAssignment\r\n )\r\n );\r\n\r\n const responses = await Promise.all(requests);\r\n const errors = responses.filter(x => x.error).map(x => x.error);\r\n\r\n if (errors.length > 0) {\r\n setFormFeedback(\r\n errorMessageObjFactory(\r\n <>\r\n Encountered {errors.length} errors while assigning courses:\r\n
    \r\n {errors.map((x, index) => (\r\n
  • {x.message}
  • \r\n ))}\r\n
\r\n \r\n )\r\n );\r\n } else {\r\n setFormFeedback(\r\n successMessageObjFactory(\r\n `Course assigned to ${responses.length} user(s).`\r\n )\r\n );\r\n }\r\n\r\n scrollFeedbackIntoView(feedbackRef);\r\n setLoading(false);\r\n },\r\n [courseDetails.course_id, token, updateAssignment, usersSelected]\r\n );\r\n\r\n const onCloseClick = useCallback(() => {\r\n setAssignWindowOpen(false);\r\n }, [setAssignWindowOpen]);\r\n\r\n return (\r\n null}\r\n minimizeButton={() => null}\r\n onClose={onCloseClick}\r\n modal={true}\r\n appendTo={document.body}\r\n >\r\n Course: {courseDetails?.title}\r\n {\r\n formRenderPropsRef.current = formRenderProps;\r\n return (\r\n \r\n \r\n Please choose the users to assign the course to\r\n \r\n {formFeedback && (\r\n \r\n )}\r\n setUsersSelected(users)}\r\n />\r\n\r\n
{usersSelected.length} users selected for assignment
\r\n\r\n setUpdateAssignment(e.value)}\r\n component={FormCheckbox}\r\n label={'Update user to latest course version.'}\r\n hint={\r\n 'If this course was previously assigned to this user and has not been completed.'\r\n }\r\n />\r\n\r\n \r\n \r\n \r\n Assign\r\n \r\n \r\n \r\n
\r\n );\r\n }}\r\n />\r\n \r\n );\r\n}\r\n\r\nexport default AssignCourseWindow;\r\n","import { useRef, useState, useMemo, useCallback } from 'react';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardHeader from '@material-ui/core/CardHeader';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport Button from '@material-ui/core/Button';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Grid, GridColumn, GridToolbar } from '@progress/kendo-react-grid';\r\nimport { Link } from 'react-router-dom';\r\nimport { useSelector } from 'react-redux';\r\nimport Box from '@material-ui/core/Box';\r\nimport { Loader } from '@progress/kendo-react-indicators';\r\nimport { v4 as uuid4 } from 'uuid';\r\nimport { DateTime } from 'luxon';\r\n\r\n//local\r\nimport { Routes as AppRoutes } from '../../../routes/appRoutes';\r\nimport ApiAgent, { Routes as ApiRoutes } from '../../../utils/apiAgent';\r\nimport { AxiosGetHook } from '../../../hooks/axiosHook';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n FormFeedback,\r\n} from '../../../utils/userFeedback';\r\nimport DeleteModal from '../../../components/DeleteModal/DeleteModal';\r\nimport AssignCourseWindow from '../../../components/AssignCourseWindow/AssignCourseWindow';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n section: {\r\n margin: 25,\r\n },\r\n loader: {\r\n marginTop: theme.spacing(26),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(12),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(30),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(36),\r\n },\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction AdminCourses() {\r\n const classes = useStyles();\r\n const token = useSelector(state => state.user.token);\r\n const params = useRef({ _token: token });\r\n const [delModalOpen, setDelModalOpen] = useState(false);\r\n const [assignWindowOpen, setAssignWindowOpen] = useState(false);\r\n const [deleteFormFeedback, setDeleteFormFeedback] = useState(null);\r\n const [courseDetails, setCourseDetails] = useState(null);\r\n // get course\r\n const url = ApiRoutes.getCourses;\r\n const { resp, error, loading, setResp } = AxiosGetHook(url, params.current);\r\n\r\n const courses = useMemo(\r\n () =>\r\n resp?.courses.map(el => {\r\n return {\r\n ...el,\r\n timestamp: DateTime.fromISO(el.timestamp).toLocaleString({\r\n ...DateTime.DATETIME_MED,\r\n }),\r\n };\r\n }),\r\n [resp]\r\n );\r\n\r\n const handleDelete = useCallback(async () => {\r\n const deleteResp = await ApiAgent.deleteCourse(courseDetails.course_id, {\r\n _token: token,\r\n category: courseDetails.category,\r\n });\r\n if (deleteResp.error) {\r\n setDeleteFormFeedback(networkErrorMessageObjFactory(deleteResp.error));\r\n } else {\r\n // update courses resp to reflect deleted entry\r\n setResp(resp => ({\r\n ...resp,\r\n courses: resp.courses.filter(\r\n el => el.course_id !== courseDetails.course_id\r\n ),\r\n }));\r\n }\r\n setDelModalOpen(false);\r\n }, [courseDetails, setResp, token]);\r\n\r\n const CommandCell = useCallback(\r\n props => (\r\n \r\n \r\n \r\n \r\n\r\n {\r\n setCourseDetails({\r\n course_id: props.dataItem.course_id,\r\n category: props.dataItem.category,\r\n title: props.dataItem.title,\r\n });\r\n setAssignWindowOpen(true);\r\n }}\r\n >\r\n Assign\r\n \r\n {\r\n setCourseDetails({\r\n course_id: props.dataItem.course_id,\r\n category: props.dataItem.category,\r\n title: props.dataItem.title,\r\n });\r\n setDelModalOpen(true);\r\n }}\r\n >\r\n Delete\r\n \r\n \r\n ),\r\n []\r\n );\r\n\r\n if (error)\r\n return ;\r\n\r\n if (loading)\r\n return (\r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n {assignWindowOpen && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nexport default AdminCourses;\r\n","import React, { useState, useCallback } from 'react';\r\nimport Button from '@material-ui/core/Button';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport DeleteForeverRoundedIcon from '@material-ui/icons/DeleteForeverRounded';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Field } from '@progress/kendo-react-form';\r\n\r\n// local\r\nimport { basicValidator } from '../../../../../components/form-validators';\r\nimport {\r\n FormInput,\r\n FormTextArea,\r\n} from '../../../../../components/form-components';\r\nimport { FormFeedback } from '../../../../../utils/userFeedback';\r\n\r\nconst useStyles = makeStyles(\r\n () => ({\r\n answers: {\r\n marginTop: 30,\r\n },\r\n answersButton: {\r\n marginTop: 30,\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nconst QuestionTaskFields = ({\r\n formFeedback,\r\n feedbackRef,\r\n dataItem,\r\n formRenderProps,\r\n answer,\r\n setAnswer,\r\n}) => {\r\n const classes = useStyles();\r\n const [choices, setChoices] = useState(dataItem.choices || []);\r\n\r\n const handleRadioChange = useCallback(\r\n ev => {\r\n // make form change to un-disable submit button if radio button clicked\r\n formRenderProps.onChange('title', {\r\n value: formRenderProps.valueGetter('title'),\r\n });\r\n setAnswer(+ev.target.value);\r\n },\r\n [formRenderProps, setAnswer]\r\n );\r\n\r\n const addQuizChoice = useCallback(() => {\r\n setChoices(choices => [...choices, {}]);\r\n }, []);\r\n\r\n const removeQuizChoice = useCallback(\r\n choiceNumber => {\r\n // set choice value null to hide choice on form\r\n formRenderProps.onChange(`choice${choiceNumber}`, {\r\n value: null,\r\n });\r\n // if this was answer reset answer\r\n if (answer === choiceNumber) setAnswer(null);\r\n },\r\n [answer, setAnswer, formRenderProps]\r\n );\r\n\r\n return (\r\n <>\r\n \r\n\r\n \r\n Answers\r\n \r\n\r\n {formFeedback && (\r\n \r\n )}\r\n\r\n {choices.map((item, idx) => {\r\n const choiceName = `choice${idx + 1}`;\r\n const currentChoiceValue = formRenderProps.valueGetter(choiceName);\r\n // no choice input-row if value is null\r\n if (currentChoiceValue === null) return
;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n removeQuizChoice(idx + 1)}\r\n >\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n \r\n Add Answer\r\n \r\n \r\n );\r\n};\r\n\r\nexport default QuestionTaskFields;\r\n","import React, { useState, useRef, useCallback } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport Box from '@material-ui/core/Box';\r\nimport { Form, Field, FormElement } from '@progress/kendo-react-form';\r\nimport { Input } from '@progress/kendo-react-inputs';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { makeStyles } from '@material-ui/core';\r\n\r\n// local imports\r\nimport ApiAgent from '../../../../../../utils/apiAgent';\r\nimport { FileInput } from '../../../../../../components/UploadDocumentForm/form-components';\r\nimport { FormFloatingInput } from '../../../../../../components/form-components';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n documentSuccessMessageObjFactory,\r\n FormFeedback,\r\n scrollFeedbackIntoView,\r\n} from '../../../../../../utils/userFeedback';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n formWidth: {\r\n width: '100%',\r\n [theme.breakpoints.down('xs')]: {\r\n maxWidth: '82vw',\r\n },\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\n/**\r\n * UploadDocumentForm\r\n * @returns UploadDocumentForm Component\r\n *\r\n * Note: Metadata portion of form has no validators but will use\r\n * sensible defaults. This is to guarantee if file upload has\r\n * success metadata upload will have success as well.\r\n */\r\n\r\nfunction UploadDocumentForm({ idCallback }) {\r\n const classes = useStyles();\r\n const token = useSelector(state => state.user.token);\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const feedbackRef = useRef(null);\r\n\r\n // upload document metadata on submit.\r\n const handleSubmit = useCallback(\r\n async formData => {\r\n const editedFormData = { ...formData };\r\n // delete display-only data size KB\r\n delete editedFormData.file_size_KB;\r\n // edit form data making sure defaults are added if needed\r\n // as form currently has no validation checks.\r\n // if category is blank or missing use \"Course\"\r\n editedFormData.category = editedFormData.category || 'Course';\r\n // if \"name\" was blank use original filename\r\n editedFormData.name =\r\n editedFormData.name === ''\r\n ? formData.id.match(/^\\S+?_(.+)$/)[1]\r\n : formData.name;\r\n\r\n const resp = await ApiAgent.uploadDocMetadata({\r\n ...editedFormData,\r\n _token: token,\r\n });\r\n if (resp.error) {\r\n setFormFeedback(networkErrorMessageObjFactory(resp.error));\r\n } else {\r\n setFormFeedback(\r\n documentSuccessMessageObjFactory(\r\n 'Document uploaded successfully!',\r\n 'upload',\r\n formData.id\r\n )\r\n );\r\n if (idCallback) idCallback(formData.id);\r\n }\r\n scrollFeedbackIntoView(feedbackRef);\r\n },\r\n [token, idCallback]\r\n );\r\n\r\n return (\r\n (\r\n \r\n
\r\n {formFeedback && (\r\n \r\n )}\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n
\r\n )}\r\n />\r\n );\r\n}\r\n\r\nexport default UploadDocumentForm;\r\n","import { useState, useRef, useCallback } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport Box from '@material-ui/core/Box';\r\nimport { Form, Field, FormElement } from '@progress/kendo-react-form';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Loader } from '@progress/kendo-react-indicators';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { makeStyles } from '@material-ui/styles';\r\nimport { Typography } from '@material-ui/core';\r\n\r\n// local imports\r\nimport ApiAgent from '../../../../../../utils/apiAgent';\r\nimport { FileInput } from '../../../../../../components/UpdateDocumentForm/form-components';\r\nimport { nameValidator } from '../../../../../../components/form-validators';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n documentSuccessMessageObjFactory,\r\n FormFeedback,\r\n toTitleCase,\r\n scrollFeedbackIntoView,\r\n} from '../../../../../../utils/userFeedback';\r\nimport { FormFloatingInput } from '../../../../../../components/form-components';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n formWidth: {\r\n width: '100%',\r\n [theme.breakpoints?.down('xs')]: {\r\n maxWidth: '82vw',\r\n },\r\n },\r\n fieldset: {\r\n border: 'none',\r\n padding: 0,\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\n/**\r\n * checkDataChanged\r\n *\r\n * Function to check if the form data has changed from last known state.\r\n * Used to prevent making a duplicate update to document metadata.\r\n *\r\n * @param {object} lastUpdate data from DB or from last update to DB\r\n * @param {obj} formData update document form data\r\n * @returns boolean\r\n */\r\n\r\nfunction checkDataChanged(lastUpdate, formData) {\r\n const lastData = {\r\n name: lastUpdate.name,\r\n category: lastUpdate.category,\r\n tags: lastUpdate.tags,\r\n };\r\n const newData = { ...formData };\r\n newData.tags = newData.tags?.map(string => string.toLowerCase());\r\n\r\n // improve equality check?\r\n return JSON.stringify(lastData) !== JSON.stringify(newData);\r\n}\r\n\r\n/**\r\n * UpdateDocumentFields\r\n * @returns UpdateDocumentFields Component\r\n */\r\n\r\nfunction UpdateDocumentFields({ id, error, loading, data }) {\r\n const classes = useStyles();\r\n const token = useSelector(state => state.user.token);\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [formFeedbackFile, setFormFeedbackFile] = useState(null);\r\n const [lastUpdate, setLastUpdate] = useState(null);\r\n const feedbackRef = useRef(null);\r\n\r\n const handleSubmit = useCallback(\r\n async formData => {\r\n setFormFeedback(null);\r\n\r\n const editedFormData = { ...formData };\r\n // KB/file extension display only\r\n delete editedFormData.file_size_KB;\r\n delete editedFormData.file_extension;\r\n\r\n const dataChanged = checkDataChanged(lastUpdate || data, editedFormData);\r\n if (!dataChanged)\r\n setFormFeedback({\r\n message: 'Document properties unchanged.',\r\n type: 'error',\r\n });\r\n else {\r\n const updateResp = await ApiAgent.updateDocMetadata({\r\n ...editedFormData,\r\n _token: token,\r\n id,\r\n });\r\n if (updateResp.error) {\r\n setFormFeedback(networkErrorMessageObjFactory(updateResp.error));\r\n } else {\r\n setFormFeedback(\r\n documentSuccessMessageObjFactory(\r\n 'Document properties updated!',\r\n 'update',\r\n id\r\n )\r\n );\r\n setLastUpdate(updateResp);\r\n }\r\n }\r\n scrollFeedbackIntoView(feedbackRef);\r\n },\r\n [id, lastUpdate, data, token]\r\n );\r\n\r\n if (loading) return ;\r\n if (error || data?.error)\r\n return (\r\n \r\n );\r\n\r\n return (\r\n <>\r\n toTitleCase(tag)),\r\n file_size_KB: Math.round(data.file_size / 1024),\r\n file_extension: data.file_extension,\r\n }}\r\n onSubmit={handleSubmit}\r\n render={formRenderProps => (\r\n \r\n
\r\n \r\n \r\n Update Document Properties\r\n \r\n \r\n\r\n {formFeedback && (\r\n \r\n )}\r\n\r\n \r\n
\r\n
\r\n \r\n Update\r\n \r\n
\r\n\r\n \r\n \r\n \r\n Update Document File\r\n \r\n \r\n\r\n {formFeedbackFile && }\r\n\r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n />\r\n \r\n );\r\n}\r\n\r\nexport default UpdateDocumentFields;\r\n","import { useEffect, useRef, useState, useCallback } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport { Typography } from '@material-ui/core';\r\n\r\n// local\r\nimport ApiAgent from '../../../../../utils/apiAgent';\r\nimport UploadDocumentFields from './UploadDocumentFields/UploadDocumentFields';\r\nimport UpdateDocumentFields from './UpdateDocumentFields/UpdataeDocumentFields';\r\nimport { FormFeedback } from '../../../../../utils/userFeedback';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n root: {\r\n marginTop: theme.spacing(3),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n },\r\n legend: {\r\n marginLeft: theme.spacing(1),\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction DocumentTaskFields({\r\n additionalDocumentForm,\r\n setAdditionalDocumentForm,\r\n documentFormFeedback,\r\n setDocumentFormFeedback,\r\n documentFeedbackRef,\r\n formRenderPropsRef,\r\n initialState,\r\n documentId,\r\n}) {\r\n const classes = useStyles();\r\n const token = useSelector(state => state.user.token);\r\n // document request variables\r\n const params = useRef({ _token: token });\r\n const [resp, setResp] = useState(null);\r\n const [error, setError] = useState(null);\r\n\r\n // if there is a document id get the document metadata for the update doc. form\r\n useEffect(() => {\r\n const getDocMetadata = async () => {\r\n // get document metadata hook\r\n const resp = await ApiAgent.getDocMetadata(\r\n documentId || initialState.document_id,\r\n params.current\r\n );\r\n if (resp.error) setError(resp.error);\r\n else {\r\n setResp(resp);\r\n setAdditionalDocumentForm('update');\r\n }\r\n };\r\n if (documentId || initialState.document_id) {\r\n getDocMetadata();\r\n }\r\n }, [documentId, initialState, setAdditionalDocumentForm]);\r\n\r\n const setDocumentId = useCallback(\r\n id => {\r\n setDocumentFormFeedback(null);\r\n formRenderPropsRef.current.onChange('document_id', { value: id });\r\n setTimeout(() => {\r\n setDocumentFormFeedback(null);\r\n setAdditionalDocumentForm('update');\r\n }, 8000);\r\n },\r\n [formRenderPropsRef, setAdditionalDocumentForm, setDocumentFormFeedback]\r\n );\r\n\r\n if (!additionalDocumentForm) return null;\r\n\r\n return (\r\n
\r\n {documentFormFeedback && (\r\n \r\n )}\r\n\r\n {additionalDocumentForm === 'upload' && (\r\n <>\r\n \r\n \r\n \r\n Upload Task Document\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {additionalDocumentForm === 'update' && (\r\n <>\r\n \r\n \r\n \r\n Update Task Document\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n}\r\n\r\nexport default DocumentTaskFields;\r\n","import React, { useState, useRef, useCallback } from 'react';\r\nimport Button from '@material-ui/core/Button';\r\nimport Box from '@material-ui/core/Box';\r\nimport { Window, WindowActionsBar } from '@progress/kendo-react-dialogs';\r\nimport { Form, Field, FormElement } from '@progress/kendo-react-form';\r\nimport { makeStyles } from '@material-ui/core';\r\n\r\n// local\r\nimport {\r\n basicValidator,\r\n urlValidator,\r\n} from '../../../../components/form-validators';\r\nimport { taskTypes } from '../../../../components/form-defaults';\r\nimport {\r\n FormTextArea,\r\n FormComboBox,\r\n FormInput,\r\n} from '../../../../components/form-components';\r\nimport {\r\n errorMessageObjFactory,\r\n scrollFeedbackIntoView,\r\n} from '../../../../utils/userFeedback';\r\nimport QuestionTaskFields from './QuestionTaskFields/QuestionTaskFields';\r\nimport DocumentTaskFields from './DocumentTaskFields/DocumentTaskFields';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n root: {\r\n position: 'relative',\r\n },\r\n window: {\r\n paddingBottom: theme.spacing(6),\r\n },\r\n actionBar: {\r\n position: 'absolute',\r\n bottom: -80,\r\n width: '100%',\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction EditTaskWindow({ dataItem, dataItemIdx, setGridData, onCloseClick }) {\r\n const classes = useStyles();\r\n const [documentFormFeedback, setDocumentFormFeedback] = useState(null);\r\n const [questionFormFeedback, setQuestionFormFeedback] = useState(null);\r\n const [additionalDocumentForm, setAdditionalDocumentForm] = useState(null);\r\n const [formType, setFormType] = useState(dataItem.type);\r\n const documentFeedbackRef = useRef(null);\r\n const questionFeedbackRef = useRef(null);\r\n const formRenderPropsRef = useRef(null);\r\n // track answer value from radio buttons (*not part of form data)\r\n const [answer, setAnswer] = useState(+dataItem.answer);\r\n const documentId = formRenderPropsRef.current?.valueGetter('document_id');\r\n\r\n const [initialState] = useState(() => {\r\n const initialState = { ...dataItem };\r\n // convert any question choices to input properties on initialState\r\n if (dataItem.choices) {\r\n dataItem.choices.forEach(choice => {\r\n const inputName = `choice${choice.value}`;\r\n initialState[inputName] = choice.label;\r\n });\r\n delete initialState.choices;\r\n }\r\n return initialState;\r\n });\r\n\r\n const handleSubmit = useCallback(\r\n formData => {\r\n setDocumentFormFeedback(null);\r\n setQuestionFormFeedback(null);\r\n const updatedTask = {\r\n type: formData.type,\r\n title: formData.title,\r\n text: formData.text,\r\n };\r\n // check and update formData per type of task created\r\n if (updatedTask.type === 'Document') {\r\n if (!formData.document_id) {\r\n setDocumentFormFeedback(\r\n errorMessageObjFactory('Please upload a document.')\r\n );\r\n scrollFeedbackIntoView(documentFeedbackRef);\r\n return;\r\n }\r\n updatedTask.document_id = formData.document_id;\r\n } else if (updatedTask.type === 'Question') {\r\n if (!answer) {\r\n setQuestionFormFeedback(\r\n errorMessageObjFactory('Please create and choose a correct answer.')\r\n );\r\n scrollFeedbackIntoView(questionFeedbackRef);\r\n return;\r\n }\r\n // create question choices array and calculate adjusted answer\r\n const { choices, adjustedAnswer } = makeChoicesFromFormData(\r\n formData,\r\n answer\r\n );\r\n updatedTask.answer = adjustedAnswer;\r\n updatedTask.choices = choices;\r\n } else if (updatedTask.type === 'Video') {\r\n // url needs to start with protocol for external link\r\n updatedTask.video_url = /^http(s)?:\\/\\//.test(formData.video_url)\r\n ? formData.video_url\r\n : 'https://' + formData.video_url;\r\n updatedTask.video_password = formData.video_password;\r\n }\r\n\r\n setGridData(gridData => {\r\n gridData[dataItemIdx] = updatedTask;\r\n return gridData;\r\n });\r\n onCloseClick();\r\n },\r\n [answer, dataItemIdx, onCloseClick, setGridData]\r\n );\r\n\r\n const handleTypeChange = useCallback(\r\n ev => {\r\n const { value } = ev.target;\r\n if (!value) return;\r\n setFormType(value);\r\n if (value === 'Document') {\r\n if (documentId || initialState.document_id) {\r\n setAdditionalDocumentForm('update');\r\n } else {\r\n setAdditionalDocumentForm('upload');\r\n }\r\n } else {\r\n setAdditionalDocumentForm(null);\r\n }\r\n },\r\n [documentId, initialState.document_id]\r\n );\r\n\r\n return (\r\n null}\r\n minimizeButton={() => null}\r\n onClose={onCloseClick}\r\n modal={true}\r\n appendTo={document.body}\r\n className={classes.window}\r\n >\r\n
\r\n {\r\n formRenderPropsRef.current = formRenderProps;\r\n\r\n return (\r\n \r\n \r\n {formType !== 'Question' && (\r\n <>\r\n \r\n\r\n \r\n \r\n )}\r\n\r\n {formType === 'Document' && (\r\n \r\n )}\r\n\r\n {formType === 'Question' && (\r\n \r\n )}\r\n\r\n {formType === 'Video' && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {initialState.title ? 'Update' : 'Save'}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }}\r\n />\r\n\r\n \r\n
\r\n \r\n );\r\n}\r\n\r\n/**\r\n * makeChoicesFromFormData\r\n *\r\n * Convert from formData key/val e.g.- {choice1: 'answer'}\r\n * to choices array [{label: 'answer', value: '1'}]\r\n *\r\n * Calculate how many digits to offset answer because of\r\n * deleted choices set to null value.\r\n *\r\n * @param {object} formData\r\n * @param {number} answer\r\n * @returns\r\n */\r\nconst makeChoicesFromFormData = (formData, answer) => {\r\n let choicesSeen = 0;\r\n let adjustAnswer = 0;\r\n const choices = Object.entries(formData)\r\n .map(([key, val]) => {\r\n if (key.startsWith('choice')) {\r\n choicesSeen++;\r\n if (!val && choicesSeen < answer) adjustAnswer++;\r\n return val;\r\n } else return null;\r\n })\r\n .filter(el => el)\r\n .map((el, idx) => ({ label: el, value: `${idx + 1}` }));\r\n\r\n const adjustedAnswer = `${answer - adjustAnswer}`;\r\n return { adjustedAnswer, choices };\r\n};\r\n\r\nexport default EditTaskWindow;\r\n","import React, {\r\n useState,\r\n useRef,\r\n useEffect,\r\n useMemo,\r\n useCallback,\r\n} from 'react';\r\nimport { useParams, useHistory } from 'react-router-dom';\r\nimport { useSelector } from 'react-redux';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardHeader from '@material-ui/core/CardHeader';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport Button from '@material-ui/core/Button';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Box from '@material-ui/core/Box';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Tooltip } from '@material-ui/core';\r\nimport Chip from '@material-ui/core/Chip';\r\nimport { Form, Field, FormElement } from '@progress/kendo-react-form';\r\nimport { Hint } from '@progress/kendo-react-labels';\r\nimport { Loader } from '@progress/kendo-react-indicators';\r\nimport {\r\n Grid as DataGrid,\r\n GridColumn,\r\n GridToolbar,\r\n} from '@progress/kendo-react-grid';\r\n\r\n// local\r\nimport EditTaskWindow from './EditTaskWindow/EditTaskWindow';\r\nimport ApiAgent, { Routes as apiRoutes } from '../../../utils/apiAgent';\r\nimport { getUserEditPermissions } from '../../../utils/auth/userAuth';\r\nimport { AxiosGetHook } from '../../../hooks/axiosHook';\r\nimport { basicValidator } from '../../../components/form-validators';\r\nimport { tags, imageTypes } from '../../../components/form-defaults';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n errorMessageObjFactory,\r\n FormFeedback,\r\n successMessageObjFactory,\r\n scrollFeedbackIntoView,\r\n} from '../../../utils/userFeedback';\r\nimport {\r\n FormFloatingComboBox,\r\n FormFloatingInput,\r\n FormFloatingNumericTextBox,\r\n FormFloatingMultiSelect,\r\n} from '../../../components/form-components';\r\n\r\nimport './EditCourse.scss';\r\n\r\n// TODO: fix card with on mobile portrait view\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n section: {\r\n margin: 0,\r\n overflowX: 'auto',\r\n maxWidth: '100vw',\r\n [theme.breakpoints.up('sm')]: {\r\n margin: 25,\r\n },\r\n },\r\n formLegend: {\r\n borderColor: 'rgba(0, 0, 0, 0.12)',\r\n margin: '0 0 1rem',\r\n padding: 0,\r\n width: '100%',\r\n borderWidth: '0 0 2px',\r\n borderStyle: 'solid',\r\n fontSize: 14,\r\n textTransform: 'uppercase',\r\n },\r\n stateChip: {\r\n marginLeft: theme.spacing(2),\r\n marginBottom: '3px',\r\n },\r\n fieldset: {\r\n marginBottom: 20,\r\n border: 'None',\r\n },\r\n formButtons: {\r\n '& > *': {\r\n margin: theme.spacing(1),\r\n },\r\n },\r\n loader: {\r\n marginTop: theme.spacing(26),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(12),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(30),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(36),\r\n },\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nconst MyContext = React.createContext({\r\n reorder: dataItem => {},\r\n dragStart: dataItem => {},\r\n});\r\n\r\nconst DragCell = props => {\r\n const currentContext = React.useContext(MyContext);\r\n return (\r\n {\r\n currentContext.reorder(props.dataItem);\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'copy';\r\n }}\r\n >\r\n {\r\n currentContext.dragStart(props.dataItem);\r\n e.dataTransfer.setData('dragging', '');\r\n }}\r\n />\r\n \r\n );\r\n};\r\n\r\nfunction EditCourse() {\r\n const { id } = useParams();\r\n const history = useHistory();\r\n const classes = useStyles();\r\n const token = useSelector(state => state.user.token);\r\n const [activeItem, setActiveItem] = useState(null);\r\n const [gridData, setGridData] = useState([]);\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [updateLoading, setUpdateLoading] = useState(false);\r\n const [showEditWindow, setShowEditWindow] = useState(false);\r\n const feedbackRef = useRef(null);\r\n const formRenderPropsRef = useRef(null);\r\n const draftRef = useRef(false);\r\n const blankFormDefaultsRef = useRef({\r\n course_id: id,\r\n tags: [],\r\n passing_percentage: 70,\r\n });\r\n const editPermissions = useMemo(() => getUserEditPermissions(token), [token]);\r\n\r\n // get draft or latest version of course.\r\n // GET error is acceptable as it happens when creating a new course.\r\n const url = apiRoutes.courseAdmin(id);\r\n const params = useRef({ _token: token });\r\n const { resp, loading, setResp } = AxiosGetHook(url, params.current);\r\n\r\n // make form change to enable submit button\r\n const enableForm = useCallback(\r\n () =>\r\n formRenderPropsRef.current.onChange('title', {\r\n value: formRenderPropsRef.current.valueGetter('title'),\r\n }),\r\n []\r\n );\r\n\r\n // if resp set gridData to course tasks\r\n useEffect(() => {\r\n if (resp) {\r\n setGridData(resp.course.tasks);\r\n // allow draft to be published on load without needing form changes\r\n if (resp.course.state === 'Draft') setTimeout(() => enableForm(), 0);\r\n }\r\n }, [setGridData, resp, enableForm]);\r\n\r\n const saveAsDraft = useCallback(() => {\r\n // set draftRef true so handleSubmit creates draft\r\n draftRef.current = true;\r\n formRenderPropsRef.current.onSubmit();\r\n }, []);\r\n\r\n const handleSubmit = useCallback(\r\n async formData => {\r\n setUpdateLoading(true);\r\n const editData = {\r\n ...formData,\r\n _token: token,\r\n tasks: gridData,\r\n };\r\n let submitResp;\r\n // if draftRef was set true PUT data to endpoint to save draft.\r\n if (draftRef.current)\r\n submitResp = await ApiAgent.putCourseAdmin(id, editData);\r\n // else if course has tasks POST data to endpoint to publish course\r\n else if (gridData.length > 0)\r\n submitResp = await ApiAgent.pushCourseAdmin(id, editData);\r\n // create feedback\r\n if (submitResp?.error) {\r\n // error\r\n setFormFeedback(networkErrorMessageObjFactory(submitResp.error));\r\n } else if (submitResp) {\r\n // success\r\n const message = draftRef.current ? 'Draft updated!' : 'Course updated!';\r\n setFormFeedback(successMessageObjFactory(message));\r\n setResp(() => submitResp);\r\n } else {\r\n // the course has no tasks\r\n setFormFeedback(\r\n errorMessageObjFactory('Please add some tasks to your course.')\r\n );\r\n }\r\n // scroll feedback into view for xs/ sm screens\r\n draftRef.current = false;\r\n scrollFeedbackIntoView(feedbackRef);\r\n setUpdateLoading(false);\r\n },\r\n [gridData, id, token, setResp]\r\n );\r\n\r\n // DataGrid reorder\r\n const reorder = useCallback(\r\n dataItem => {\r\n if (activeItem === dataItem) {\r\n return;\r\n }\r\n let reorderedData = gridData.slice();\r\n let prevIndex = reorderedData.findIndex(x => x === activeItem);\r\n let nextIndex = reorderedData.findIndex(x => x === dataItem);\r\n reorderedData.splice(prevIndex, 1);\r\n reorderedData.splice(nextIndex, 0, activeItem || reorderedData[0]);\r\n setGridData(reorderedData);\r\n },\r\n [activeItem, gridData]\r\n );\r\n\r\n // DataGrid dragStart\r\n const dragStart = useCallback(dataItem => {\r\n setActiveItem(dataItem);\r\n }, []);\r\n\r\n // DataGrid CommandCell\r\n const CommandCell = useCallback(\r\n props => {\r\n const editTask = () => {\r\n setShowEditWindow({\r\n dataItem: props.dataItem,\r\n dataIdx: props.dataIndex,\r\n });\r\n enableForm();\r\n };\r\n const deleteTask = () => {\r\n setGridData(gridData => {\r\n const copy = [...gridData];\r\n copy.splice(props.dataIndex, 1);\r\n return copy;\r\n });\r\n enableForm();\r\n };\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n },\r\n [enableForm]\r\n );\r\n\r\n // open new task window\r\n const createNewTask = useCallback(() => {\r\n setShowEditWindow({ dataItem: {}, dataIdx: gridData.length });\r\n enableForm();\r\n }, [enableForm, gridData.length]);\r\n\r\n // close new task window\r\n const closeEditTaskWindow = useCallback(() => setShowEditWindow(false), []);\r\n\r\n const deleteDraft = useCallback(async () => {\r\n setUpdateLoading(true);\r\n setFormFeedback(null);\r\n const delResp = await ApiAgent.deleteCourse(id, {\r\n delete_draft_only: true,\r\n _token: token,\r\n });\r\n if (delResp.error) {\r\n setFormFeedback(networkErrorMessageObjFactory(delResp.error));\r\n } else {\r\n const courseResp = await ApiAgent.getCourseAdmin(id, params.current);\r\n if (courseResp.error) {\r\n window.location.reload();\r\n } else {\r\n setResp(courseResp);\r\n formRenderPropsRef.current.onFormReset();\r\n setFormFeedback(\r\n successMessageObjFactory('Course reverted to last published version.')\r\n );\r\n }\r\n }\r\n setUpdateLoading(false);\r\n }, [id, setResp, token]);\r\n\r\n // close EditCourse\r\n const cancelEditCourse = useCallback(() => {\r\n history.goBack();\r\n }, [history]);\r\n\r\n if (loading)\r\n return (\r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n formRenderPropsRef.current = formRenderProps;\r\n\r\n return (\r\n \r\n
\r\n \r\n Course Details:\r\n {resp?.course.state === 'Latest' && (\r\n \r\n )}\r\n {resp?.course.state === 'Draft' && (\r\n \r\n )}\r\n \r\n {formFeedback && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n Days\r\n \r\n\r\n \r\n \r\n For courses with questions.\r\n \r\n \r\n
\r\n\r\n
\r\n Course Tasks:\r\n {\r\n enableForm();\r\n dragStart(...rest);\r\n },\r\n }}\r\n >\r\n \r\n \r\n \r\n New Task\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n Save and Publish\r\n \r\n \r\n Save as Draft\r\n \r\n {resp?.course.state === 'Draft' && (\r\n \r\n \r\n Delete Draft\r\n \r\n \r\n )}\r\n \r\n
\r\n
\r\n );\r\n }}\r\n />\r\n\r\n {showEditWindow && (\r\n \r\n )}\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default EditCourse;\r\n","import { DateTime } from \"luxon\";\r\n\r\nexport const BooleanCell = (props) => (\r\n {props.dataItem[props.field] ? \"Yes\" : \"No\"}\r\n);\r\n\r\nexport const DateDisplayCell = (props) => (\r\n \r\n {props.dataItem[props.field]\r\n ? DateTime.fromISO(props.dataItem[props.field]).toLocaleString(\r\n DateTime.DATE_SHORT\r\n )\r\n : \"\"}\r\n \r\n);\r\n\r\nexport const CourseTitleVersionCell = (props) => (\r\n \r\n {props.dataItem[\"title\"]} ({props.dataItem[\"course_version\"]})\r\n \r\n);","import { useState, useCallback, useRef } from 'react';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardHeader from '@material-ui/core/CardHeader';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport Button from '@material-ui/core/Button';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Box from '@material-ui/core/Box';\r\nimport { Grid, GridColumn, GridNoRecords } from '@progress/kendo-react-grid';\r\nimport { ExcelExport } from '@progress/kendo-react-excel-export';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport { Routes as appRoutes } from '../../../routes/appRoutes';\r\nimport { BooleanCell } from '../../../utils/gridCells';\r\nimport SearchUserForm from '../../../components/SearchUserForm/SearchUserForm';\r\n\r\nconst useStyles = makeStyles(\r\n () => ({\r\n section: {\r\n margin: 25,\r\n },\r\n dataGrid: {\r\n height: 'calc(100vh - 330px)',\r\n minHeight: 200,\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nconst CommandCell = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nfunction UserList() {\r\n const classes = useStyles();\r\n const [searchResults, setSearchResults] = useState(null);\r\n const [loading, setLoading] = useState(null);\r\n const [initialSearchCompleted, setInitialSearchCompleted] = useState(false);\r\n\r\n const onSearchResults = useCallback(\r\n (results) => {\r\n setSearchResults(results);\r\n setInitialSearchCompleted(true);\r\n },\r\n [setSearchResults, setInitialSearchCompleted]\r\n );\r\n\r\n const excelExport = useRef(null);\r\n const exportExport = () => {\r\n if (excelExport.current !== null)\r\n excelExport.current.save(searchResults);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {loading && (\r\n \r\n \r\n \r\n )}\r\n {!loading && (\r\n \r\n \r\n \r\n {!initialSearchCompleted && (\r\n Perform a search to show results\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n\r\nexport default UserList;\r\n","import React, { useState } from \"react\";\r\nimport { Grid, GridColumn } from \"@progress/kendo-react-grid\";\r\nimport { orderBy } from \"@progress/kendo-data-query\";\r\nimport { DateDisplayCell, CourseTitleVersionCell } from \"../../../utils/gridCells\";\r\n\r\nfunction UserCourseGrid({ courses }) {\r\n const [sort, setSort] = useState([{ field: \"assigned_date\", dir: \"desc\" }]);\r\n\r\n return (\r\n {\r\n setSort(e.sort);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default UserCourseGrid;\r\n","const emailRegex = new RegExp(/\\S+@\\S+\\.\\S+/);\r\n\r\nexport const emailValidator = (value) =>\r\n !value\r\n ? \"Email field is required.\"\r\n : emailRegex.test(value)\r\n ? \"\"\r\n : \"Email is not in a valid format.\";\r\n\r\nexport const userNameValidator = (value) =>\r\n !value\r\n ? \"User Name is required\"\r\n : value.length < 5\r\n ? \"User name should be at least 5 characters long.\"\r\n : \"\";\r\n\r\nexport const requiredValidator = (value) =>\r\n value ? \"\" : \"This field is required.\";\r\n\r\nexport const passwordValidator = (value) =>\r\n value && value.length >= 8 ? \"\" : \"Password must be at least 8 symbols.\";","import React, { useState, useRef, useCallback } from \"react\";\r\nimport { useParams, Link } from \"react-router-dom\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nimport Card from \"@material-ui/core/Card\";\r\nimport CardHeader from \"@material-ui/core/CardHeader\";\r\nimport CardContent from \"@material-ui/core/CardContent\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport Box from \"@material-ui/core/Box\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport List from \"@material-ui/core/List\";\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport ListItemText from \"@material-ui/core/ListItemText\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport { DateTime } from \"luxon\";\r\nimport { Form, Field, FormElement } from \"@progress/kendo-react-form\";\r\nimport { Checkbox } from \"@progress/kendo-react-inputs\";\r\n\r\nimport {\r\n FormInput,\r\n FormCheckbox,\r\n FormFloatingMultiSelect,\r\n} from \"../../../components/form-components\";\r\nimport ApiAgent, { Routes as apiRoutes } from \"../../../utils/apiAgent\";\r\nimport { Routes as appRoutes } from \"../../../routes/appRoutes\";\r\nimport { AxiosGetHook } from \"../../../hooks/axiosHook\";\r\nimport UserCourseGrid from \"./UserCourseGrid\";\r\nimport {\r\n networkErrorMessageObjFactory,\r\n successMessageObjFactory,\r\n errorMessageObjFactory,\r\n FormFeedback,\r\n scrollFeedbackIntoView,\r\n} from \"../../../utils/userFeedback\";\r\nimport {\r\n userNameValidator,\r\n emailValidator,\r\n requiredValidator,\r\n passwordValidator,\r\n} from \"../../../utils/validators\";\r\n\r\nimport userTagData from \"../../../testing/MockData/UserTags.json\";\r\n\r\nconst useStyles = makeStyles(\r\n (theme) => ({\r\n section: {\r\n margin: 25,\r\n },\r\n list: {\r\n paddingTop: 0,\r\n },\r\n formButtons: {\r\n marginTop: theme.spacing(2),\r\n \"& > *\": {\r\n margin: theme.spacing(1),\r\n },\r\n },\r\n formLegend: {\r\n borderColor: \"rgba(0, 0, 0, 0.12)\",\r\n margin: \"2rem 0 1rem\",\r\n padding: 0,\r\n width: \"100%\",\r\n borderWidth: \"0 0 2px\",\r\n borderStyle: \"solid\",\r\n fontSize: 14,\r\n textTransform: \"uppercase\",\r\n },\r\n }),\r\n { classNamePrefix: \"wp\" }\r\n);\r\n\r\nfunction UserEdit() {\r\n const classes = useStyles();\r\n const { id } = useParams();\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [updateLoading, setUpdateLoading] = useState(false);\r\n const [resetPassword, setResetPassword] = useState(false);\r\n const token = useSelector((state) => state.user.token);\r\n const params = useRef({ _token: token });\r\n const feedbackRef = useRef(null);\r\n const [password, setPassword] = useState(\"\");\r\n const passwordHandleChange = (event) => setPassword(event.target.value);\r\n const confirmPasswordValidator = (value) =>\r\n value === password ? \"\" : \"Password must match.\";\r\n\r\n const groupAxiosCall = AxiosGetHook(apiRoutes.getAccessGroups());\r\n const allGroups = groupAxiosCall.resp;\r\n const loadingGroups = groupAxiosCall.loading;\r\n\r\n const { resp, loading } = AxiosGetHook(apiRoutes.getUser(id), params.current);\r\n const user = resp;\r\n\r\n const resetPasswordHandleChange = (event) => {\r\n setResetPassword(event.value);\r\n };\r\n\r\n const handleSubmit = useCallback(\r\n async (formData) => {\r\n setFormFeedback(null);\r\n setUpdateLoading(true);\r\n // remove the fields that shouldn't be included in the update (confirmPassword, courses)\r\n const { confirmPassword, courses, ...editData } = {\r\n ...formData,\r\n _token: token,\r\n };\r\n\r\n const resp = await ApiAgent.patchUser(id, editData);\r\n\r\n if (resp?.error) {\r\n // error\r\n setFormFeedback(networkErrorMessageObjFactory(resp.error));\r\n } else if (resp) {\r\n // success\r\n setFormFeedback(successMessageObjFactory(\"User Updated!\"));\r\n } else {\r\n setFormFeedback(errorMessageObjFactory(\"Unknown error\"));\r\n }\r\n\r\n scrollFeedbackIntoView(feedbackRef);\r\n setUpdateLoading(false);\r\n },\r\n [id, token]\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n {(loading || loadingGroups) && (\r\n \r\n \r\n \r\n )}\r\n {!(loading || loadingGroups) && (\r\n <>\r\n \r\n \r\n (\r\n \r\n {formFeedback && (\r\n \r\n )}\r\n {user.is_ad_auth && (\r\n \r\n User management is controlled by Active Directory.\r\n Disabled fields must be updated from the source\r\n system.\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n {!user.is_ad_auth && (\r\n <>\r\n
\r\n \r\n
\r\n {resetPassword && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n
\r\n \r\n Save\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n />\r\n
\r\n \r\n \r\n \r\n Source:\r\n {user.is_ad_auth ? \" Active Directory\" : \" Manual Entry\"}\r\n \r\n {user.created_date && (\r\n \r\n Created On:{\" \"}\r\n {DateTime.fromISO(user.created_date).toLocaleString(\r\n DateTime.DATETIME_SHORT\r\n )}\r\n \r\n )}\r\n {!user.is_active && (\r\n \r\n Inactivated On: {user.inactive_date}\r\n \r\n )}\r\n {user.groups && user.groups.length > 0 && (\r\n \r\n Groups:\r\n \r\n {user.groups.map((group) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n \r\n
\r\n\r\n Courses:\r\n \r\n \r\n )}\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default UserEdit;\r\n","import React, { useRef, useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useSelector } from 'react-redux';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport Card from '@material-ui/core/Card';\r\nimport CardHeader from '@material-ui/core/CardHeader';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport Button from '@material-ui/core/Button';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { DateTime } from 'luxon';\r\nimport { Form, Field, FormElement } from '@progress/kendo-react-form';\r\n\r\nimport {\r\n FormInput,\r\n FormFloatingMultiSelect,\r\n} from '../../../components/form-components';\r\nimport { Routes as appRoutes } from '../../../routes/appRoutes';\r\nimport {\r\n userNameValidator,\r\n emailValidator,\r\n requiredValidator,\r\n passwordValidator,\r\n} from '../../../utils/validators';\r\nimport ApiAgent from '../../../utils/apiAgent';\r\nimport {\r\n errorMessageObjFactory,\r\n successMessageObjFactory,\r\n FormFeedback,\r\n scrollFeedbackIntoView,\r\n} from '../../../utils/userFeedback';\r\n\r\nimport userTagData from '../../../testing/MockData/UserTags.json';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n section: {\r\n margin: 25,\r\n },\r\n list: {\r\n paddingTop: 0,\r\n },\r\n formButtons: {\r\n marginTop: theme.spacing(3),\r\n '& > *': {\r\n margin: theme.spacing(1),\r\n },\r\n },\r\n formLegend: {\r\n borderColor: 'rgba(0, 0, 0, 0.12)',\r\n margin: '2rem 0 1rem',\r\n padding: 0,\r\n width: '100%',\r\n borderWidth: '0 0 2px',\r\n borderStyle: 'solid',\r\n fontSize: 14,\r\n textTransform: 'uppercase',\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction UserCreate() {\r\n const classes = useStyles();\r\n const token = useSelector(state => state.user.token);\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const feedbackRef = useRef(null);\r\n const [password, setPassword] = useState('');\r\n const passwordHandleChange = event => setPassword(event.target.value);\r\n const confirmPasswordValidator = value =>\r\n value === password ? '' : 'Password must match.';\r\n\r\n const handleSubmit = async formData => {\r\n setLoading(true);\r\n const newUser = {\r\n ...formData,\r\n is_active: true,\r\n is_ad_auth: false,\r\n created_date: DateTime.now().toISO(),\r\n groups: [],\r\n courses: [],\r\n };\r\n delete newUser.confirmPassword;\r\n\r\n const resp = await ApiAgent.createUser(uuidv4(), {\r\n ...newUser,\r\n _token: token,\r\n });\r\n if (resp.error) {\r\n setFormFeedback(errorMessageObjFactory(resp.error));\r\n } else {\r\n setFormFeedback(successMessageObjFactory('User created successfully!'));\r\n }\r\n\r\n scrollFeedbackIntoView(feedbackRef);\r\n setLoading(false);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n (\r\n \r\n {formFeedback && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
\r\n \r\n Save\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n />\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default UserCreate;\r\n","import Card from \"@material-ui/core/Card\";\r\nimport CardHeader from \"@material-ui/core/CardHeader\";\r\nimport CardContent from \"@material-ui/core/CardContent\";\r\nimport Avatar from \"@material-ui/core/Avatar\";\r\nimport Box from \"@material-ui/core/Box\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\nimport { Routes as appRoutes } from '../../routes/appRoutes';\r\n\r\nconst useStyles = makeStyles(\r\n (theme) => ({\r\n section: {\r\n margin: 25,\r\n },\r\n reportCard: {\r\n width: 345,\r\n marginRight: theme.spacing(2),\r\n marginBottom: theme.spacing(2),\r\n minHeight: 100,\r\n },\r\n reportTitle: {\r\n fontSize: 8,\r\n },\r\n avatarRed: {\r\n backgroundColor: theme.palette.secondary.main,\r\n },\r\n avatarBlue: {\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n }),\r\n { classNamePrefix: \"wp\" }\r\n);\r\n\r\nfunction Reports() {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nfunction ReportCard({ name, avatarText, avatarClass, description, link }) {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n {avatarText}\r\n \r\n }\r\n title={name}\r\n subheader={description}\r\n >\r\n \r\n \r\n );\r\n}\r\n\r\nexport default Reports;\r\n","import { useState, useRef, useMemo } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardHeader from '@material-ui/core/CardHeader';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport Box from '@material-ui/core/Box';\r\nimport Button from '@material-ui/core/Button';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Grid, GridColumn } from '@progress/kendo-react-grid';\r\nimport { orderBy } from '@progress/kendo-data-query';\r\nimport { ExcelExport } from '@progress/kendo-react-excel-export';\r\nimport { Routes as ApiRoutes } from '../../utils/apiAgent';\r\nimport { AxiosGetHook } from '../../hooks/axiosHook';\r\n\r\nimport { DateDisplayCell, CourseTitleVersionCell } from '../../utils/gridCells';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n FormFeedback,\r\n} from '../../utils/userFeedback';\r\n\r\nconst useStyles = makeStyles(\r\n () => ({\r\n section: {\r\n margin: 25,\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction PastDueReport() {\r\n const classes = useStyles();\r\n const token = useSelector((state) => state.user.token);\r\n const params = useRef({ _token: token });\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [sort, setSort] = useState([{ field: 'due_date', dir: 'asc' }]);\r\n\r\n const excelExport = useRef(null);\r\n const exportExport = () => {\r\n if (excelExport.current !== null)\r\n excelExport.current.save(orderBy(searchResults, sort));\r\n };\r\n\r\n const { resp, error, loading } = AxiosGetHook(\r\n ApiRoutes.getPastDueCourses,\r\n params.current\r\n );\r\n if (error) setFormFeedback(networkErrorMessageObjFactory(error));\r\n const searchResults = useMemo(() => resp, [resp]);\r\n\r\n return (\r\n \r\n \r\n \r\n {formFeedback && }\r\n {loading && (\r\n \r\n \r\n \r\n )}\r\n {searchResults && !loading && (\r\n \r\n \r\n {\r\n setSort(e.sort);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n\r\nexport default PastDueReport;\r\n","import { useState, useEffect, useMemo, useRef } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardHeader from '@material-ui/core/CardHeader';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport Button from '@material-ui/core/Button';\r\nimport Box from '@material-ui/core/Box';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Grid, GridColumn } from '@progress/kendo-react-grid';\r\nimport { orderBy } from '@progress/kendo-data-query';\r\nimport { Form, Field, FormElement } from '@progress/kendo-react-form';\r\nimport { ExcelExport } from '@progress/kendo-react-excel-export';\r\nimport { FormDropDownList } from '../../components/form-components';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n FormFeedback,\r\n} from '../../utils/userFeedback';\r\nimport ApiAgent, { Routes as ApiRoutes } from '../../utils/apiAgent';\r\nimport { AxiosGetHook } from '../../hooks/axiosHook';\r\nimport { DateDisplayCell, CourseTitleVersionCell } from '../../utils/gridCells';\r\n\r\nconst useStyles = makeStyles(\r\n (theme) => ({\r\n section: {\r\n margin: 25,\r\n },\r\n sectionHeader: {\r\n paddingBottom: 0,\r\n },\r\n courseDropdown: {\r\n minWidth: 300,\r\n },\r\n searchButton: {\r\n maxHeight: 35,\r\n marginTop: 30,\r\n margin: theme.spacing(1),\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction AssignedCoursesReport() {\r\n const classes = useStyles();\r\n const token = useSelector((state) => state.user.token);\r\n const params = useRef({ _token: token });\r\n const [course, setCourse] = useState(null);\r\n const [loading, setLoading] = useState(null);\r\n const [searchResults, setSearchResults] = useState([]);\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [sort, setSort] = useState([{ field: 'assigned_date', dir: 'desc' }]);\r\n\r\n const excelExport = useRef(null);\r\n const exportExport = () => {\r\n if (excelExport.current !== null)\r\n excelExport.current.save(orderBy(searchResults, sort));\r\n };\r\n\r\n const { resp, error, loadingCourses } = AxiosGetHook(\r\n ApiRoutes.getCourses,\r\n params.current\r\n );\r\n\r\n if (error) setFormFeedback(networkErrorMessageObjFactory(error));\r\n\r\n const courses = useMemo(\r\n () => resp ? [ { title: 'All', course_id: '' }, ...resp.courses] : [],\r\n [resp]\r\n );\r\n\r\n useEffect(() => {\r\n // Don't search until a course is selected\r\n if (!course) return;\r\n\r\n async function fetchData() {\r\n setLoading(true);\r\n setSearchResults(null);\r\n const resp = await ApiAgent.getCourseAssignments(token, course.course_id);\r\n\r\n if (resp.error) {\r\n setFormFeedback(networkErrorMessageObjFactory(resp.error));\r\n } else {\r\n setSearchResults(resp);\r\n }\r\n setLoading(false);\r\n }\r\n fetchData();\r\n }, [token, course]);\r\n\r\n return (\r\n \r\n \r\n \r\n {formFeedback && courses && }\r\n setCourse(formData.course)}\r\n render={(formRenderProps) => (\r\n \r\n \r\n \r\n \r\n Search\r\n \r\n \r\n \r\n )}\r\n />\r\n {!course &&
Select a course and click search
}\r\n {loading && (\r\n \r\n \r\n \r\n )}\r\n {!loading && !formFeedback && course && (\r\n \r\n \r\n {\r\n setSort(e.sort);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default AssignedCoursesReport;\r\n","import { useRef, useMemo, useCallback } from 'react';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardHeader from '@material-ui/core/CardHeader';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport Button from '@material-ui/core/Button';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Grid, GridColumn } from '@progress/kendo-react-grid';\r\nimport { Link } from 'react-router-dom';\r\nimport { useSelector } from 'react-redux';\r\nimport Box from '@material-ui/core/Box';\r\nimport { Loader } from '@progress/kendo-react-indicators';\r\nimport { DateTime } from 'luxon';\r\n\r\n//local\r\nimport { Routes as AppRoutes } from '../../../routes/appRoutes';\r\nimport { Routes as ApiRoutes } from '../../../utils/apiAgent';\r\nimport { AxiosGetHook } from '../../../hooks/axiosHook';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n FormFeedback,\r\n} from '../../../utils/userFeedback';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n section: {\r\n margin: 25,\r\n },\r\n loader: {\r\n marginTop: theme.spacing(26),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(12),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(30),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(36),\r\n },\r\n },\r\n dataGrid: {\r\n height: 'calc(100vh - 230px)',\r\n minHeight: 200,\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nconst AdminApplications = () => {\r\n const classes = useStyles();\r\n const token = useSelector(state => state.user.token);\r\n const params = useRef({ _token: token });\r\n\r\n // get course\r\n const url = ApiRoutes.getApplications;\r\n const { resp, error, loading } = AxiosGetHook(url, params.current);\r\n\r\n const applications = useMemo(\r\n () =>\r\n resp?.applications.map(el => {\r\n return {\r\n ...el,\r\n applicant_signature_date: DateTime.fromISO(\r\n el.applicant_signature_date\r\n ).toLocaleString({\r\n ...DateTime.DATE_MED,\r\n }),\r\n continueApplication: el.continueApplication ? 'Yes' : 'No',\r\n };\r\n }),\r\n [resp]\r\n );\r\n\r\n const CommandCell = useCallback(\r\n props => (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n []\r\n );\r\n\r\n if (error)\r\n return ;\r\n if (loading)\r\n return (\r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {/* \r\n \r\n \r\n \r\n */}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AdminApplications;\r\n","import { useState } from 'react';\r\nimport { Field } from '@progress/kendo-react-form';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { Hidden } from '@material-ui/core';\r\n\r\n// local\r\nimport {\r\n FormInput,\r\n FormRadioGroup,\r\n FormDatePicker,\r\n} from '../../components/form-components';\r\nimport {\r\n basicValidator,\r\n booleanValidator,\r\n} from '../../components/form-validators';\r\n\r\nconst LicensesCertificatesFields = ({ initialValues, classes }) => {\r\n const [showLicenses, setShowLicenses] = useState(\r\n initialValues ? initialValues.professional_licenses : true\r\n );\r\n\r\n const handleLicenseChange = e => {\r\n const value = e.value;\r\n if (value === true) {\r\n setShowLicenses(true);\r\n } else {\r\n setShowLicenses(false);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {showLicenses && (\r\n <>\r\n {/* First license input */}\r\n \r\n \r\n License/Certificate One\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* Second license input */}\r\n \r\n \r\n License/Certificate Two\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* Third license input */}\r\n \r\n \r\n License/Certificate Three\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default LicensesCertificatesFields;\r\n","import { Field } from '@progress/kendo-react-form';\r\nimport Grid from '@material-ui/core/Grid';\r\n\r\n// local\r\nimport { basicValidator } from '../../components/form-validators';\r\nimport { FormInput, FormDatePicker } from '../../components/form-components';\r\n\r\nconst MilitaryServiceFields = ({ initialValues }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default MilitaryServiceFields;\r\n","import { useState } from 'react';\r\nimport { Field } from '@progress/kendo-react-form';\r\nimport Grid from '@material-ui/core/Grid';\r\n\r\n// local\r\nimport {\r\n basicValidator,\r\n booleanValidator,\r\n} from '../../components/form-validators';\r\nimport MilitaryServiceFields from './MilitaryServiceFields';\r\nimport {\r\n FormInput,\r\n FormRadioGroup,\r\n FormDatePicker,\r\n} from '../../components/form-components';\r\n\r\nconst EducationFields = ({ classes, initialValues }) => {\r\n const [showCollege, setShowCollege] = useState(\r\n initialValues ? initialValues.attended_college : true\r\n );\r\n const [showVocational, setShowVocational] = useState(\r\n initialValues ? initialValues.attended_vocational : true\r\n );\r\n const [showMilitary, setShowMilitary] = useState(\r\n initialValues ? initialValues.military_service : true\r\n );\r\n\r\n const handleVisibilityStateChange = (e, setter) => {\r\n const value = e.value;\r\n if (value === true) {\r\n setter(true);\r\n } else {\r\n setter(false);\r\n }\r\n };\r\n\r\n const handleCollegeChange = e => {\r\n handleVisibilityStateChange(e, setShowCollege);\r\n };\r\n\r\n const handleVocationalChange = e => {\r\n handleVisibilityStateChange(e, setShowVocational);\r\n };\r\n\r\n const handleMilitaryChange = e => {\r\n handleVisibilityStateChange(e, setShowMilitary);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n High School\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n College\r\n \r\n \r\n \r\n {showCollege && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n Vocational or Business\r\n \r\n \r\n \r\n \r\n {showVocational && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n Community Involvement\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n Armed Forces\r\n \r\n \r\n \r\n {showMilitary && }\r\n \r\n );\r\n};\r\n\r\nexport default EducationFields;\r\n","import { Field } from '@progress/kendo-react-form';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\n// local\r\nimport { basicValidator } from '../../components/form-validators';\r\nimport { FormInput } from '../../components/form-components';\r\n\r\nconst AvailabilityFields = ({ initialValues }) => {\r\n return (\r\n <>\r\n \r\n \r\n Enter your availability for each day. Example: 8am-5pm. Type N/A if\r\n you are unavailable for a specific day.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AvailabilityFields;\r\n","import { Field } from '@progress/kendo-react-form';\r\nimport Grid from '@material-ui/core/Grid';\r\n\r\n// local\r\nimport { basicValidator } from '../../components/form-validators';\r\nimport { FormInput, FormRadioGroup } from '../../components/form-components';\r\n\r\nconst employmentTypeData = [\r\n {\r\n label: 'Full Time',\r\n value: 'Full Time',\r\n },\r\n {\r\n label: 'Part Time',\r\n value: 'Part Time',\r\n },\r\n {\r\n label: 'Temporary',\r\n value: 'Temporary',\r\n },\r\n];\r\n\r\nconst workedAsAideTypeData = [\r\n {\r\n label: 'Yes',\r\n value: 'Yes',\r\n },\r\n {\r\n label: 'No',\r\n value: 'No',\r\n },\r\n];\r\n\r\nconst PositionDesiredFields = ({ initialValues }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PositionDesiredFields;\r\n","import { Field } from '@progress/kendo-react-form';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { Hint } from '@progress/kendo-react-labels';\r\n\r\n// local\r\nimport { FormInput, FormMaskedTextBox } from '../../components/form-components';\r\n\r\nconst PermanentAddressFields = ({ initialValues }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n In case you can't be reached at your main phone number.\r\n \r\n \r\n );\r\n};\r\n\r\nexport default PermanentAddressFields;\r\n","import { Field } from '@progress/kendo-react-form';\r\nimport Grid from '@material-ui/core/Grid';\r\n\r\n// local\r\nimport {\r\n basicValidator,\r\n zipCodeValidator,\r\n phoneValidator,\r\n} from '../../components/form-validators';\r\nimport { FormInput, FormMaskedTextBox } from '../../components/form-components';\r\n\r\nconst PresentAddressFields = ({ initialValues }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PresentAddressFields;\r\n","import { Field } from '@progress/kendo-react-form';\r\nimport Grid from '@material-ui/core/Grid';\r\n\r\n// local\r\nimport {\r\n basicValidator,\r\n phoneValidator,\r\n ssnValidator,\r\n} from '../../components/form-validators';\r\nimport {\r\n FormInput,\r\n FormDatePicker,\r\n FormMaskedTextBox,\r\n} from '../../components/form-components';\r\nimport { emailValidator } from '../../utils/validators';\r\n\r\nconst MainApplicationFields = ({ continueApplication, initialValues }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {!continueApplication && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {continueApplication && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default MainApplicationFields;\r\n","import React from 'react';\r\nimport { Field } from '@progress/kendo-react-form';\r\nimport Grid from '@material-ui/core/Grid';\r\n\r\n// local\r\nimport {\r\n basicValidator,\r\n zipCodeValidator,\r\n phoneValidator,\r\n} from '../../components/form-validators';\r\nimport {\r\n FormInput,\r\n FormRadioGroup,\r\n FormTextArea,\r\n FormMaskedTextBox,\r\n FormDatePicker,\r\n} from '../../components/form-components';\r\n\r\nconst EmploymentFields = ({ classes, initialValues }) => {\r\n return (\r\n <>\r\n {['One', 'Two', 'Three'].map((el, idx) => (\r\n \r\n \r\n Employment {el}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n\r\nexport default EmploymentFields;\r\n","import { Field } from '@progress/kendo-react-form';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { Typography } from '@material-ui/core';\r\n\r\n// local\r\nimport {\r\n basicValidator,\r\n booleanValidator,\r\n phoneValidator,\r\n} from '../../components/form-validators';\r\nimport {\r\n FormInput,\r\n FormRadioGroup,\r\n FormTextArea,\r\n FormMaskedTextBox,\r\n} from '../../components/form-components';\r\nimport { emailValidator } from '../../utils/validators';\r\n\r\nconst ReferencesFields = ({ classes, initialValues }) => {\r\n return (\r\n <>\r\n Reference One\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n Reference Two\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n Other Information\r\n \r\n \r\n If your former employment references, education or military service\r\n are under another name other than indicated on the top of the\r\n application, please indicate that here\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ReferencesFields;\r\n","import { Field } from '@progress/kendo-react-form';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { Typography } from '@material-ui/core';\r\n\r\n// local\r\nimport { basicValidator } from '../../components/form-validators';\r\nimport { FormInput, FormDatePicker } from '../../components/form-components';\r\n\r\nconst EmploymentUnderstanding = ({ initialValues }) => {\r\n return (\r\n <>\r\n \r\n This institution does not discriminate in hiring or any other decision\r\n on basis of race, color, sex, citizenship, national origin, ancestry,\r\n Vietnam era veteran status, or on the basis of age or physical or mental\r\n disability unrelated to ability to perform the work required. No\r\n question on this application is intended to secure information to be\r\n used for such discrimination. Applicants who provide false information\r\n or omit any requested information on the application materials or in the\r\n interview process may be deemed to have falsified their application and\r\n may be ineligible for hire. Northeast Professional Home Care and\r\n Northeast Professional Caregivers (collectively \"Northeast\") is a\r\n drug-free workplace. Individuals offered employment may be required to\r\n successfully complete a pre-employment physical as a condition of\r\n employment that may include drug and/or alcohol testing. Refusing to\r\n take or failing a drug and/or alcohol test will result in removal from\r\n employment consideration. Northeast is required by federal law to verify\r\n the identity and work authorization of all new employees. All offers are\r\n contingent upon verification of identity and eligibility to be employed\r\n in the United States by completing an I-9 form. I voluntarily give this\r\n institution the right to make a thorough investigation of my past\r\n employment and activities, agree to cooperate in such investigation and\r\n release from all liability or responsibility all persons, companies or\r\n corporations supplying such information. I consent to take the physical\r\n examination and/or drug screens, and such future physical examinations\r\n and drug screens as may be required by this institution at such times\r\n and places as the institution shall designate. I understand that an\r\n offer of employment may be contingent on passing the physical\r\n examination and drug screen which relates to the essential duties I\r\n would be required to perform. I understand that my employment is at\r\n will, and that either party is free to terminate the employment\r\n relationship at any time without cause.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default EmploymentUnderstanding;\r\n","export default __webpack_public_path__ + \"static/media/application-image.e31deda8.jpg\";","import React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { Form, Field, FormElement } from '@progress/kendo-react-form';\r\nimport Button from '@material-ui/core/Button';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Box from '@material-ui/core/Box';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Container, Typography } from '@material-ui/core';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Slide from '@material-ui/core/Slide';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\n\r\n// local\r\nimport ApiAgent from '../../../utils/apiAgent';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n FormFeedback,\r\n scrollFeedbackIntoView,\r\n errorMessageObjFactory,\r\n} from '../../../utils/userFeedback';\r\nimport { FormUpload } from '../../../components/form-components';\r\nimport LicensesCertificatesFields from '../../../components/ApplicationFieldGroups/LicensesCertificatesFields';\r\nimport EducationFields from '../../../components/ApplicationFieldGroups/EducationFields';\r\nimport AvailabilityFields from '../../../components/ApplicationFieldGroups/AvailabilityFields';\r\nimport PositionDesiredFields from '../../../components/ApplicationFieldGroups/PositionDesiredFields';\r\nimport PermanentAddressFields from '../../../components/ApplicationFieldGroups/PermanentAddressFields';\r\nimport PresentAddressFields from '../../../components/ApplicationFieldGroups/PresentAddressFields';\r\nimport MainApplicationFields from '../../../components/ApplicationFieldGroups/MainApplicationFields';\r\nimport EmploymentFields from '../../../components/ApplicationFieldGroups/EmploymentFields';\r\nimport ReferencesFields from '../../../components/ApplicationFieldGroups/ReferencesFields';\r\nimport EmploymentUnderstanding from '../../../components/ApplicationFieldGroups/EmploymentUnderstanding';\r\nimport AppImage from '../../../assets/application-image.jpg';\r\n\r\nconst Transition = React.forwardRef(function Transition(props, ref) {\r\n return ;\r\n});\r\n\r\nconst allowedUploadExtensions = ['.pdf', '.rtf', '.doc', '.docx'];\r\n\r\nconst useStyles = makeStyles(\r\n (theme) => ({\r\n headerImageDiv: {\r\n backgroundImage: `url(${AppImage})`,\r\n backgroundSize: 'cover',\r\n backgroundRepeat: 'no-repeat',\r\n backgroundPosition: 'center',\r\n position: 'relative',\r\n paddingTop: 'min(25.4vh, 25.4vw)',\r\n paddingBottom: 'min(25.4vh, 25.4vw)',\r\n marginTop: theme.spacing(4),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(2),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(8),\r\n },\r\n },\r\n headerImgOverlay: {\r\n position: 'absolute',\r\n top: 0,\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.55)',\r\n },\r\n headerText: {\r\n fontSize: 'max(6vh, 6vw)',\r\n textAlign: 'center',\r\n color: 'white',\r\n fontWeight: '900',\r\n [theme.breakpoints.up('md')]: {\r\n fontSize: 'min(7vh, 7vw)',\r\n },\r\n position: 'relative',\r\n },\r\n headerTextAlt: {\r\n fontSize: 'max(3vh, 3vw)',\r\n textAlign: 'center',\r\n paddingTop: theme.spacing(2),\r\n [theme.breakpoints.up('md')]: {\r\n fontSize: 'min(4vh, 4vw)',\r\n },\r\n },\r\n section: {\r\n paddingTop: theme.spacing(6),\r\n paddingBottom: theme.spacing(6),\r\n },\r\n formLegend: {\r\n marginTop: theme.spacing(2),\r\n marginBottom: theme.spacing(0),\r\n fontWeight: '900',\r\n fontSize: 26,\r\n color: '#0266b0',\r\n width: '100%',\r\n },\r\n formLegendAlternate: {\r\n marginTop: theme.spacing(2),\r\n fontWeight: '700',\r\n width: '100%',\r\n fontSize: 18,\r\n color: '#0266b0',\r\n },\r\n fieldset: {\r\n marginBottom: theme.spacing(4),\r\n border: 'None',\r\n },\r\n uploadDiv: {\r\n maxWidth: '80vw',\r\n [theme.breakpoints.up('sm')]: {\r\n maxWidth: 'unset',\r\n },\r\n },\r\n formButtons: {\r\n '& > *': {\r\n margin: theme.spacing(1),\r\n },\r\n },\r\n submitButton: {\r\n width: '100%',\r\n backgroundColor: '#0266b0',\r\n color: 'white',\r\n },\r\n textCenter: {\r\n textAlign: 'center',\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction convertDates(initialValues) {\r\n const fields = [\r\n 'date_available',\r\n 'college_grad_date',\r\n 'vocational_grad_date',\r\n 'military_start_date',\r\n 'military_end_date',\r\n 'licenses_1_date_issued',\r\n 'licenses_2_date_issued',\r\n 'licenses_3_date_issued',\r\n 'employment_1_start_date',\r\n 'employment_1_end_date',\r\n 'employment_2_start_date',\r\n 'employment_2_end_date',\r\n 'employment_3_start_date',\r\n 'employment_3_end_date',\r\n 'applicant_signature_date',\r\n ];\r\n\r\n fields.forEach((el) => {\r\n if (initialValues[el]) {\r\n initialValues[el] = new Date(initialValues[el]);\r\n }\r\n });\r\n}\r\n\r\nasync function processFileData(uploadData, setFormFeedback, feedbackRef) {\r\n if (uploadData.resume && uploadData.resume[0]) {\r\n delete uploadData.resume[0].progress;\r\n delete uploadData.resume[0].status;\r\n var fileId = uploadData.resume[0].uid;\r\n const resumeFile = uploadData.resume[0].getRawFile();\r\n var dataURL = await toBase64(resumeFile);\r\n if (dataURL instanceof Error) {\r\n setFormFeedback(\r\n errorMessageObjFactory(\r\n 'DataURL creation failed for resume. Please try again.'\r\n )\r\n );\r\n scrollFeedbackIntoView(feedbackRef);\r\n return { fileId: false, uploadData };\r\n }\r\n }\r\n return { fileId, uploadData, fileData: dataURL };\r\n}\r\n\r\nfunction toBase64(file) {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onload = () => resolve(reader.result);\r\n reader.onerror = (error) => reject(error);\r\n });\r\n}\r\n\r\nfunction EmploymentApplication({ initialValues }) {\r\n const classes = useStyles();\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [submitError, setSubmitError] = useState(null);\r\n const feedbackRef = useRef(null);\r\n const [submitting, setSubmitting] = useState(null);\r\n const [showSubmittedDialog, setShowSubmittedDialog] = useState(false);\r\n const formRenderPropsRef = useRef(null);\r\n const runOnceRef = useRef(!!initialValues);\r\n\r\n if (runOnceRef.current) {\r\n convertDates(initialValues);\r\n runOnceRef.current = false;\r\n }\r\n\r\n useEffect(() => {\r\n document.body.style.setProperty('--bodyBgColor', '#fff');\r\n }, []);\r\n\r\n const handleClose = () => {\r\n window.location.href = 'https://neprohomecare.com';\r\n };\r\n\r\n const handleSubmit = useCallback(async (formData) => {\r\n setSubmitting(true);\r\n setFormFeedback(null);\r\n setSubmitError(null);\r\n\r\n const { fileId, uploadData, fileData } = await processFileData(\r\n { ...formData },\r\n setFormFeedback,\r\n feedbackRef\r\n );\r\n if (fileId === false) return;\r\n\r\n const resp = await ApiAgent.submitApplication(\r\n { application: uploadData, fileData },\r\n fileId\r\n );\r\n if (resp.error) {\r\n setSubmitError(resp.error?.message || 'Unknown error');\r\n setFormFeedback(networkErrorMessageObjFactory(resp.error));\r\n scrollFeedbackIntoView(feedbackRef);\r\n } else {\r\n setShowSubmittedDialog(true);\r\n }\r\n setSubmitting(false);\r\n }, []);\r\n\r\n const ApplicationError = () => {\r\n return (\r\n <>\r\n {submitError && (\r\n \r\n

\r\n There was an error submitting your application, please try again.\r\n If you continue to receive this error, print this page as a PDF\r\n and email to{' '}\r\n \r\n employment@neprohomecare.com\r\n \r\n

\r\n
\r\n Error details: {submitError}\r\n
\r\n
\r\n )}\r\n \r\n );\r\n };\r\n\r\n return (\r\n <>\r\n {!initialValues && (\r\n \r\n \r\n \r\n EMPLOYMENT APPLICATION\r\n \r\n \r\n )}\r\n\r\n {initialValues && (\r\n \r\n EMPLOYMENT APPLICATION\r\n \r\n )}\r\n\r\n \r\n {\r\n formRenderPropsRef.current = formRenderProps;\r\n return (\r\n \r\n
\r\n {formFeedback && (\r\n \r\n )}\r\n \r\n \r\n \r\n\r\n \r\n Present Address\r\n \r\n \r\n\r\n \r\n Permanent Address (If different than present address)\r\n \r\n \r\n\r\n \r\n Position Desired\r\n \r\n \r\n\r\n Availability\r\n \r\n\r\n Education\r\n \r\n\r\n \r\n Professional Licenses and/or Certifications\r\n \r\n \r\n\r\n \r\n Employment Record\r\n \r\n \r\n\r\n References\r\n \r\n\r\n \r\n \r\n Resume\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n Employment Understanding (Please Read and Sign)\r\n \r\n \r\n \r\n
\r\n\r\n {formRenderProps.touched &&\r\n formRenderProps.visited &&\r\n !formRenderProps.valid && (\r\n \r\n \r\n \r\n )}\r\n\r\n
\r\n \r\n Send\r\n \r\n
\r\n\r\n {submitting && (\r\n \r\n

\r\n Submitting application, please\r\n wait...\r\n

\r\n
\r\n )}\r\n\r\n \r\n
\r\n );\r\n }}\r\n />\r\n
\r\n \r\n {'Success!'}\r\n \r\n \r\n Application successfully submitted.\r\n \r\n \r\n \r\n {/* eslint-disable-next-line jsx-a11y/no-autofocus */}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default EmploymentApplication;\r\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Form, FormElement } from '@progress/kendo-react-form';\r\nimport Button from '@material-ui/core/Button';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Box from '@material-ui/core/Box';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Container, Typography } from '@material-ui/core';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Slide from '@material-ui/core/Slide';\r\n\r\n// local\r\nimport ApiAgent from '../../../utils/apiAgent';\r\nimport { Routes as AppRoutes } from '../../../routes/appRoutes';\r\nimport {\r\n networkErrorMessageObjFactory,\r\n errorMessageObjFactory,\r\n FormFeedback,\r\n scrollFeedbackIntoView,\r\n} from '../../../utils/userFeedback';\r\nimport AvailabilityFields from '../../../components/ApplicationFieldGroups/AvailabilityFields';\r\nimport MainApplicationFields from '../../../components/ApplicationFieldGroups/MainApplicationFields';\r\nimport ReferencesFields from '../../../components/ApplicationFieldGroups/ReferencesFields';\r\nimport EmploymentUnderstanding from '../../../components/ApplicationFieldGroups/EmploymentUnderstanding';\r\nimport AppImage from '../../../assets/application-image.jpg';\r\n\r\nconst Transition = React.forwardRef(function Transition(props, ref) {\r\n return ;\r\n});\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n headerImageDiv: {\r\n backgroundImage: `url(${AppImage})`,\r\n backgroundSize: 'cover',\r\n backgroundRepeat: 'no-repeat',\r\n backgroundPosition: 'center',\r\n position: 'relative',\r\n paddingTop: 'min(25.4vh, 25.4vw)',\r\n paddingBottom: 'min(25.4vh, 25.4vw)',\r\n marginTop: theme.spacing(4),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(2),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(8),\r\n },\r\n },\r\n headerImgOverlay: {\r\n position: 'absolute',\r\n top: 0,\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.55)',\r\n },\r\n headerText: {\r\n fontSize: 'max(6vh, 6vw)',\r\n textAlign: 'center',\r\n color: 'white',\r\n fontWeight: '900',\r\n [theme.breakpoints.up('md')]: {\r\n fontSize: 'min(7vh, 7vw)',\r\n },\r\n position: 'relative',\r\n },\r\n headerTextAlt: {\r\n fontSize: 'max(3vh, 3vw)',\r\n textAlign: 'center',\r\n paddingTop: theme.spacing(2),\r\n [theme.breakpoints.up('md')]: {\r\n fontSize: 'min(4vh, 4vw)',\r\n },\r\n },\r\n section: {\r\n paddingTop: theme.spacing(6),\r\n paddingBottom: theme.spacing(6),\r\n },\r\n formLegend: {\r\n marginTop: theme.spacing(2),\r\n marginBottom: theme.spacing(0),\r\n fontWeight: '900',\r\n fontSize: 26,\r\n color: '#0266b0',\r\n width: '100%',\r\n },\r\n formLegendAlternate: {\r\n marginTop: theme.spacing(2),\r\n fontWeight: '700',\r\n width: '100%',\r\n fontSize: 18,\r\n color: '#0266b0',\r\n },\r\n fieldset: {\r\n marginBottom: theme.spacing(4),\r\n border: 'None',\r\n },\r\n formButtons: {\r\n '& > *': {\r\n margin: theme.spacing(1),\r\n },\r\n },\r\n submitButton: {\r\n width: '100%',\r\n backgroundColor: '#0266b0',\r\n color: 'white',\r\n },\r\n textCenter: {\r\n textAlign: 'center',\r\n },\r\n link: {\r\n color: 'blue',\r\n fontSize: 'inherit',\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nfunction convertDates(initialValues) {\r\n initialValues.date_of_application = new Date(\r\n initialValues.date_of_application\r\n );\r\n initialValues.date_available = new Date(initialValues.date_available);\r\n initialValues.applicant_signature_date = new Date(\r\n initialValues.applicant_signature_date\r\n );\r\n}\r\n\r\nfunction EmploymentApplication({ initialValues }) {\r\n const classes = useStyles();\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const feedbackRef = useRef(null);\r\n const [submitting, setSubmitting] = useState(null);\r\n const [showSubmittedDialog, setShowSubmittedDialog] = useState(false);\r\n const formRenderPropsRef = useRef(null);\r\n const runOnceRef = useRef(!!initialValues);\r\n\r\n if (runOnceRef.current) {\r\n convertDates(initialValues);\r\n runOnceRef.current = false;\r\n }\r\n\r\n useEffect(() => {\r\n document.body.style.setProperty('--bodyBgColor', '#fff');\r\n }, []);\r\n const handleClose = () => {\r\n window.location.href = 'https://neprohomecare.com';\r\n };\r\n\r\n const handleSubmit = useCallback(async formData => {\r\n setSubmitting(true);\r\n setFormFeedback(null);\r\n\r\n formData.continueApplication = true;\r\n\r\n const resp = await ApiAgent.submitApplication(\r\n { application: formData },\r\n null\r\n );\r\n if (resp.error) {\r\n setFormFeedback(networkErrorMessageObjFactory(resp.error));\r\n scrollFeedbackIntoView(feedbackRef);\r\n } else {\r\n setShowSubmittedDialog(true);\r\n }\r\n setSubmitting(false);\r\n }, []);\r\n\r\n return (\r\n <>\r\n {!initialValues && (\r\n \r\n \r\n \r\n CONTINUE EMPLOYMENT APPLICATION\r\n \r\n \r\n )}\r\n\r\n {initialValues && (\r\n \r\n CONTINUE EMPLOYMENT APPLICATION\r\n \r\n )}\r\n \r\n \r\n \r\n This form is for those who have already applied through Indeed.com.\r\n If you have not submitted an application through Indeed, please\r\n complete our{' '}\r\n \r\n full application.\r\n \r\n \r\n \r\n {\r\n formRenderPropsRef.current = formRenderProps;\r\n return (\r\n \r\n
\r\n {formFeedback && (\r\n \r\n )}\r\n \r\n \r\n\r\n Availability\r\n \r\n\r\n References\r\n \r\n\r\n \r\n Employment Understanding (Please Read and Sign)\r\n \r\n \r\n \r\n
\r\n\r\n {formRenderProps.touched &&\r\n formRenderProps.visited &&\r\n !formRenderProps.valid && (\r\n \r\n \r\n \r\n )}\r\n\r\n
\r\n \r\n Send\r\n \r\n
\r\n
\r\n );\r\n }}\r\n />\r\n
\r\n \r\n {'Success!'}\r\n \r\n \r\n Application successfully submitted.\r\n \r\n \r\n \r\n {/* eslint-disable-next-line jsx-a11y/no-autofocus */}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default EmploymentApplication;\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { useSelector } from 'react-redux';\r\nimport { Loader } from '@progress/kendo-react-indicators';\r\nimport { Button } from '@progress/kendo-react-buttons';\r\nimport { saveAs } from '@progress/kendo-file-saver';\r\nimport { PDFExport } from '@progress/kendo-react-pdf';\r\nimport { Ripple } from '@progress/kendo-react-ripple';\r\nimport {\r\n Box,\r\n Card,\r\n CardContent,\r\n Container,\r\n makeStyles,\r\n} from '@material-ui/core';\r\n\r\nimport EmploymentApplication from '../EmploymentApplication/EmploymentApplication';\r\nimport ContinueApplication from '../ContinueApplication/ContinueApplication';\r\nimport { AxiosGetHook } from '../../../hooks/axiosHook';\r\nimport ApiAgent, { Routes as ApiRoutes } from '../../../utils/apiAgent';\r\nimport {\r\n errorMessageObjFactory,\r\n FormFeedback,\r\n networkErrorMessageObjFactory,\r\n} from '../../../utils/userFeedback';\r\nimport './ViewApplication.css';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n main: {\r\n marginTop: theme.spacing(2),\r\n marginBottom: theme.spacing(4),\r\n },\r\n loader: {\r\n marginTop: theme.spacing(26),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(12),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(30),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(36),\r\n },\r\n },\r\n resumeSpacer: {\r\n marginTop: theme.spacing(3),\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(2),\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n marginTop: theme.spacing(3),\r\n },\r\n [theme.breakpoints.up('lg')]: {\r\n marginTop: theme.spacing(4),\r\n },\r\n },\r\n resumeCardContent: {\r\n height: 'calc(100vh - 100px)',\r\n [theme.breakpoints.up('lg')]: {\r\n height: 'calc(100vh - 140px)',\r\n margin: 10,\r\n },\r\n },\r\n }),\r\n { classNamePrefix: 'wp' }\r\n);\r\n\r\nconst pdfCheckRegex = /^.pdf$/i;\r\n\r\nconst ViewApplication = () => {\r\n const classes = useStyles();\r\n const { id } = useParams();\r\n const token = useSelector(state => state.user.token);\r\n const params = useRef({ _token: token });\r\n const [formFeedback, setFormFeedback] = useState(null);\r\n const [resumeData, setResumeData] = useState(null);\r\n const pdfExportComponent = useRef(null);\r\n\r\n // get application hook\r\n const url = ApiRoutes.applicationId(id);\r\n const { resp, error, loading } = AxiosGetHook(url, params.current);\r\n\r\n // get resume method\r\n const getResume = useCallback(async id => {\r\n const resumeResp = await ApiAgent.getResume(id, params.current);\r\n if (resumeResp.error) {\r\n setFormFeedback(errorMessageObjFactory('Resume Network Error.'));\r\n } else {\r\n setResumeData(resumeResp);\r\n }\r\n }, []);\r\n\r\n // get resume if resume is PDF hook\r\n useEffect(() => {\r\n if (\r\n resp?.application?.resume?.length > 0 &&\r\n pdfCheckRegex.test(resp?.application.resume[0].extension)\r\n ) {\r\n getResume(resp.application.resume[0].uid);\r\n }\r\n }, [resp, getResume]);\r\n\r\n // save resume to file method\r\n const handleSaveFile = useCallback(\r\n async e => {\r\n e.preventDefault();\r\n const resume = resp.application.resume[0];\r\n if (!resumeData) {\r\n var resumeResp = await getResume(resume.uid);\r\n }\r\n const dataUrl = resumeData || resumeResp;\r\n saveAs(dataUrl, `${resume.name}`);\r\n },\r\n [resp, getResume, resumeData]\r\n );\r\n\r\n const handleExportWithComponent = () => {\r\n pdfExportComponent.current.save();\r\n };\r\n\r\n if (error)\r\n return ;\r\n if (loading)\r\n return (\r\n \r\n \r\n
\r\n );\r\n\r\n const application = resp.application;\r\n const resume = resp.application.resume && resp.application.resume[0];\r\n const FormComponent = application.continueApplication\r\n ? ContinueApplication\r\n : EmploymentApplication;\r\n\r\n return (\r\n \r\n \r\n {formFeedback && }\r\n \r\n \r\n \r\n\r\n \r\n \r\n PRINT TO PDF\r\n \r\n \r\n\r\n \r\n\r\n {resume && (\r\n
\r\n \r\n {resumeData &&\r\n pdfCheckRegex.test(resp.application.resume[0].extension) && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n Download Resume\r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ViewApplication;\r\n","/** Update token action creator. */\r\n\r\nimport { UPDATE_TOKEN } from '../types';\r\n\r\nfunction updateToken(token) {\r\n return { type: UPDATE_TOKEN, payload: { token } };\r\n}\r\n\r\nexport default updateToken;\r\n","/** Set next page action creator. */\r\n\r\nimport { SET_NEXT } from '../types';\r\n\r\nfunction setNext(nextPath) {\r\n return { type: SET_NEXT, payload: { next: nextPath } };\r\n}\r\n\r\nexport default setNext;\r\n","/** App routes for main app routing. */\r\n\r\nimport { useEffect, useRef, useState } from 'react';\r\nimport { Route, Switch, Redirect } from 'react-router-dom';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { decode } from 'jsonwebtoken';\r\nimport axios from 'axios';\r\n\r\n// local imports\r\nimport Index from '../views/Index/Index';\r\nimport Dashboard from '../views/Dashboard/Dashboard';\r\nimport ViewDocument from '../views/ViewDocument/ViewDocument';\r\nimport UploadDocument from '../views/UploadDocument/UploadDocument';\r\nimport UpdateDocument from '../views/UpdateDocument/UpdateDocument';\r\nimport NotFoundPage from '../views/NotFoundPage/NotFoundPage';\r\nimport SiteLayout from '../components/SiteLayout/SiteLayout';\r\nimport Search from '../views/Search/Search';\r\nimport MyCourses from '../views/Courses/MyCourses/MyCourses';\r\nimport TakeCourse from '../views/Courses/TakeCourse/TakeCourse';\r\nimport AdminCourses from '../views/Courses/AdminCourses/AdminCourses';\r\nimport EditCourse from '../views/Courses/EditCourse/EditCourse';\r\nimport UserList from '../views/Users/UserList/UserList';\r\nimport UserEdit from '../views/Users/UserEdit/UserEdit';\r\nimport UserCreate from '../views/Users/UserCreate/UserCreate';\r\nimport Reports from '../views/Reports/Reports';\r\nimport PastDueReport from '../views/Reports/PastDueReport';\r\nimport AssignedCoursesReport from '../views/Reports/AssignedCoursesReport';\r\nimport AdminApplications from '../views/Applications/AdminApplications/AdminApplications';\r\nimport ViewApplication from '../views/Applications/ViewApplication/ViewApplication';\r\nimport EmploymentApplication from '../views/Applications/EmploymentApplication/EmploymentApplication';\r\nimport ContinueApplication from '../views/Applications/ContinueApplication/ContinueApplication';\r\nimport logout from '../redux/actions/user/logout';\r\nimport updateToken from '../redux/actions/user/updateToken';\r\nimport ApiAgent from '../utils/apiAgent';\r\nimport setNext from '../redux/actions/app/setNext';\r\n\r\nfunction AppRoutes() {\r\n const token = useSelector(state => state.user.token);\r\n axios.defaults.headers.common = {'Authorization': `Bearer ${token}`};\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport class Routes {\r\n static get index() {\r\n return '/';\r\n }\r\n static get dashboard() {\r\n return '/dashboard';\r\n }\r\n static get myCourses() {\r\n return '/my-courses';\r\n }\r\n static get takeCourse() {\r\n return '/take-course/:id/:version';\r\n }\r\n // URL factory function\r\n static makeTakeCourseUrl(id, version) {\r\n return `/take-course/${id}/${version}`;\r\n }\r\n static get adminCourses() {\r\n return '/admin-courses';\r\n }\r\n static get editCourse() {\r\n return '/edit-course/:id';\r\n }\r\n // URL factory function\r\n static makeEditCourse(id) {\r\n return `/edit-course/${id}`;\r\n }\r\n static get documents() {\r\n return '/documents';\r\n }\r\n static get uploadDoc() {\r\n return '/upload-document';\r\n }\r\n static get updateDoc() {\r\n return '/update-document/:id';\r\n }\r\n // URL factory function\r\n static makeUpdateUrl(id) {\r\n return `/update-document/${id}`;\r\n }\r\n static get viewDoc() {\r\n return '/view-document/:id';\r\n }\r\n // URL factory function\r\n static makeViewDocUrl(id) {\r\n return `/view-document/${id}`;\r\n }\r\n static get adminUsers() {\r\n return '/admin/users';\r\n }\r\n static get createUser() {\r\n return '/admin/users/create';\r\n }\r\n static get editUser() {\r\n return '/admin/users/edit/:id';\r\n }\r\n static makeEditUserUrl(id) {\r\n return `/admin/users/edit/${id}`;\r\n }\r\n static get reports() {\r\n return '/admin/reports';\r\n }\r\n static get reportPastDue() {\r\n return '/admin/reports/past-due';\r\n }\r\n static get reportAssignedCourses() {\r\n return '/admin/reports/assigned-courses';\r\n }\r\n static get applications() {\r\n return '/admin/applications';\r\n }\r\n static get viewApplication() {\r\n return '/admin/applications/:id';\r\n }\r\n static makeViewApplication(id) {\r\n return `/admin/applications/${id}`;\r\n }\r\n static get employmentApplication() {\r\n return '/employment-application';\r\n }\r\n static get continueApplication() {\r\n return '/continue-application';\r\n }\r\n}\r\n\r\nconst ProtectedRoute = ({ component: Component, token, ...rest }) => {\r\n const dispatch = useDispatch();\r\n const [tokenExpired, setTokenExpired] = useState(false);\r\n const tokenExpiringSoon = useRef(false);\r\n const next = rest.location.pathname;\r\n\r\n useEffect(() => {\r\n if (token) {\r\n const data = decode(token);\r\n tokenExpiringSoon.current =\r\n data.exp * 1000 - Date.now() <= 60 * 60 * 1000;\r\n if (data.exp * 1000 - Date.now() <= 0) setTokenExpired(true);\r\n }\r\n }, [token]);\r\n\r\n useEffect(() => {\r\n // Create a timer that will run every five seconds to check if the token has expired, this will\r\n // address the scenario where a user just leaves the browser window open\r\n const interval = setInterval(() => {\r\n if (token) {\r\n const data = decode(token);\r\n if (data.exp * 1000 - Date.now() <= 0) setTokenExpired(true);\r\n }\r\n }, 5000);\r\n return () => clearInterval(interval);\r\n }, [token, setTokenExpired]);\r\n\r\n return (\r\n {\r\n if (!token) {\r\n dispatch(logout());\r\n dispatch(setNext(next));\r\n return ;\r\n }\r\n\r\n if (tokenExpired) {\r\n dispatch(logout());\r\n dispatch(setNext(next));\r\n return ;\r\n }\r\n\r\n if (tokenExpiringSoon.current) {\r\n ApiAgent.refreshToken(token)\r\n .then(resp => {\r\n if (resp.error) {\r\n throw new Error();\r\n } else {\r\n dispatch(updateToken(resp.token));\r\n }\r\n })\r\n .catch(err => {\r\n console.error('Unable to renew token', err);\r\n dispatch(logout());\r\n return ;\r\n });\r\n }\r\n\r\n return ;\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default AppRoutes;\r\n","import \"./AppError.css\";\r\n\r\nfunction AppError() {\r\n return (\r\n
\r\n
\r\n
\r\n

Error

\r\n
\r\n

Oops! Something went wrong at our end.

\r\n

\r\n Don't worry, it's not you - it's us. Please try your request again. If\r\n you continue to receive this error please report it to the\r\n administrator.\r\n

\r\n Go To Homepage\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default AppError;\r\n","import { reactPlugin } from './AppInsights';\r\nimport { AppInsightsErrorBoundary, withAITracking } from '@microsoft/applicationinsights-react-js';\r\nimport { createMuiTheme, ThemeProvider } from '@material-ui/core/styles';\r\nimport '@progress/kendo-theme-material/dist/all.css';\r\n\r\n// local imports\r\nimport AppRoutes from './routes/appRoutes';\r\nimport AppError from './views/AppError/AppError';\r\nimport './App.scss';\r\n\r\nconst theme = createMuiTheme({\r\n palette: {\r\n primary: {\r\n main: '#3A6E8F',\r\n light: '#c4d4dd',\r\n dark: '#255172',\r\n contrastText: '#fff',\r\n },\r\n secondary: {\r\n main: '#e72432',\r\n light: '#f8bdc2',\r\n dark: '#dd161f',\r\n contrastText: '#000',\r\n },\r\n },\r\n overrides: {\r\n MuiCardContent: {\r\n root: {\r\n '&:last-child': {\r\n paddingBottom: 16,\r\n },\r\n },\r\n },\r\n },\r\n});\r\n\r\nfunction App() {\r\n return (\r\n }\r\n appInsights={reactPlugin}\r\n >\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n );\r\n}\r\n\r\nexport default withAITracking(reactPlugin, App);\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport { PersistGate } from 'redux-persist/integration/react';\r\n\r\n// local imports\r\nimport { persistor, store } from './redux/store/reduxStore';\r\nimport App from './App';\r\nimport './index.css';\r\n\r\n// initialize axe a11y auditing for React\r\nif (process.env.NODE_ENV !== 'production') {\r\n const axe = require('@axe-core/react');\r\n axe(React, ReactDOM, 1000);\r\n}\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n"],"sourceRoot":""}