{"version":3,"sources":["components/widgets/wordmark/uc_wordmark_stacked_gray.png","pages/login/wordmark.png","constants/index.js","analytics.js","history.js","constants/errors/user-errors.js","constants/errors/category-errors.js","constants/errors/issue-errors.js","constants/errors/campus-guidance-errors.js","constants/errors/tag-errors.js","constants/errors/index.js","utils/users.js","utils/issues.js","utils/index.js","components/widgets/button/index.js","components/widgets/error-list/index.js","components/widgets/form/index.js","components/widgets/spinner/index.js","components/widgets/text-input/index.js","components/widgets/wordmark/index.js","components/widgets/tooltip/index.js","components/widgets/table/index.js","components/widgets/pagination/index.js","components/widgets/success-banner/index.js","components/widgets/select/index.js","components/widgets/rich-text-editor/index.js","components/header/index.js","constants/routes.js","components/footer/index.js","constants/action-types/user.js","constants/action-types/session.js","constants/action-types/categories.js","constants/action-types/issues.js","constants/action-types/campuses.js","constants/action-types/messages.js","constants/action-types/search.js","constants/action-types/tags.js","actions/messages-actions.js","_aws-exports.js","config/awsConfig.js","api/cognito.js","constants/errors/login-errors.js","api/users.js","api/campuses.js","constants/errors/campus-errors.js","api/categories.js","api/tags.js","api/issues.js","api/campus-guidance.js","api/search.js","constants/errors/search-errors.js","api/index.js","actions/session-actions.js","constants/fragments/index.js","selectors/users.js","selectors/categories.js","selectors/campuses.js","selectors/campus-guidances.js","selectors/search-results.js","selectors/tags.js","selectors/issues.js","actions/category-actions.js","utils/categories.js","constants/fragments/category-fragments.js","actions/issue-actions.js","actions/user-actions.js","constants/fragments/user-fragments.js","actions/campus-actions.js","actions/search-actions.js","actions/tag-actions.js","utils/tags.js","constants/fragments/tag-fragments.js","components/category-list/index.js","components/page-content/index.js","components/search-bar/index.js","pages/welcome/index.js","pages/category/index.js","pages/issue/issue-section-container.js","pages/issue/issue-section.js","pages/issue/issue-nav.js","pages/issue/tag-selector.js","pages/issue/issue-title.js","pages/issue/breadcrumbs.js","pages/issue/campus-guidance.js","pages/issue/previous-version-list.js","pages/issue/index.js","pages/search/index.js","reducers/session.js","reducers/categories.js","reducers/issues.js","reducers/users.js","reducers/campuses.js","reducers/messages.js","reducers/search.js","reducers/tags.js","reducers/index.js","store.js","auth.js","pages/profile/index.js","pages/login/login-wrapper.js","pages/login/login.js","pages/login/unregistered.js","pages/admin/users/list-user.js","pages/admin/users/user-buttons.js","pages/admin/users/delete-user-modal.js","pages/admin/users/edit-user-modal.js","pages/admin/users/index.js","pages/admin/category-admin-list/category-admin-list.js","pages/admin/category-admin-list/edit-category-modal.js","pages/admin/category-admin-list/create-category-modal.js","pages/admin/category-admin-list/index.js","pages/admin/issue-admin-list/issues-admin-list.js","pages/admin/issue-admin-list/create-issue-modal.js","pages/admin/issue-admin-list/index.js","pages/admin/tags-admin-list/tags-admin-list.js","pages/admin/tags-admin-list/create-tag-modal.js","pages/admin/tags-admin-list/edit-tag-modal.js","pages/admin/tags-admin-list/delete-tag-modal.js","pages/admin/tags-admin-list/index.js","components/authenticated-route/index.js","components/unauthenticated-route/index.js","components/user-menu/index.js","components/leftside-menu/index.js","components/modal/index.js","App.js","serviceWorker.js","index.js"],"names":["module","exports","__webpack_require__","p","ROLES","name","value","ALL_ROLES","map","role","CAMPUS_GUIDANCE_STATUS_UNPUBLISHED","CAMPUS_GUIDANCE_STATUS_ALL","CAMPUS_GUIDANCE_STATUS_CAMPUS","ReactGA","initialize","history","createHashHistory","basename","hashType","listen","location","url","pathname","set","page","pageview","MISSING_NAME_ERROR","SHORT_NAME_ERROR","MISSING_CAMPUS_ERROR","MISSING_ROLE_ERROR","DELETE_USER_NO_CONFIRMATION_ERROR","UNABLE_TO_UPDATE_USER_ERROR","UNABLE_TO_DELETE_USER_ERROR","MISSING_CATEGORY_NAME_ERROR","INCORRECT_CATEGORY_CONFIRMATION_ERROR","DUPLICATE_CATEGORY_NAME_ERROR","MISSING_ISSUE_TITLE_ERROR","MISSING_ISSUE_GUIDANCE_ERROR","MISSING_ISSUE_RATIONALE_ERROR","MISSING_ISSUE_AGREEMENT_LANGUAGE_ERROR","CAMPUS_GUIDANCE_NO_CONTENT_ERROR","MISSING_TAG_NAME_ERROR","DUPLICATE_TAG_NAME_ERROR","GQL_NULL_RESPONSE_ERROR","errors","error","makeGenericErrorMessage","Object","objectSpread","time","Date","toISOString","concat","window","href","email","body","JSON","stringify","emailString","react_default","a","createElement","react","ROLE_LOOKUP","reduce","lookup","getRoleName","roleValue","validateCreateCampusGuidanceFormData","formData","rawText","guidance","isEmptyString","push","makeIssueNameWithStatus","issue","published","title","makeClassName","_len","arguments","length","names","Array","_key","trim","filter","join","isSystemAdmin","currentUser","isCampusAdmin","isLocationAccessCoordinator","string","undefined","Button","_this$props","this","props","label","id","className","type","onClick","disabled","children","focusRef","ref","aria-label","Component","defaultProps","ErrorList","_this","classCallCheck","possibleConstructorReturn","getPrototypeOf","call","createRef","focusOnError","bind","assertThisInitialized","shouldFocusOnError","current","focus","prevProps","tabIndex","idx","key","Form","onSubmit","event","preventDefault","data","from","target","values","input","Spinner","light","small","autoFocus","TextInput","state","initialValue","onChange","setState","prevState","pattern","placeholder","required","WordMark","src","wordmarkImage","alt","Tooltip","Table","selectSortFunction","activeSortFunction","setSortDirection","descending","_this$state","sortFunctions","currentSortFunction","setFilterState","active","filters","currentFilter","setFilterValue","onPageChange","total","currentPage","skipAction","getFilteredData","filtered","item","method","getSortedData","_this$state2","sorted","sort","reverse","getPaginatedData","itemsPerPage","totalPages","tableData","Math","ceil","sliceStart","slice","firstItemNumber","itemCount","lastItemNumber","min","statusString","columns","forEach","col","Boolean","initialFilterValue","defaultSort","newPageCount","filteredData","max","_this2","caption","keyFunction","_this$paginatedData","paginatedData","needsPagination","scope","width","displayName","tooltip","e","displayTransformer","colSpan","pagination","sortedData","Pagination","increment","decrement","onFirstPage","onLastPage","currentpage","SuccessBanner","focusOnSuccess","shouldFocusOnSuccess","message","Select","options","prompt","option","toLowerCase","parseOption","RichTextEditor","focusOnEditor","editor","on","selection","select","getBody","collapse","setEditorRefInParent","editMode","getEditor","height","init","ts","onEditorChange","updateContent","branding","menubar","plugins","toolbar1","toolbar2","dangerouslySetInnerHTML","__html","DOMPurify","sanitize","Header","aria-live","wordmark","react_router_dom","to","user_menu","search_bar","Footer","year","getFullYear","SET_USER_LIST_LOADING_STATUS","LOAD_USER_LIST","SET_USER_ACTION_SUCCESS_MESSAGE","SET_USER_ACTION_ERROR","SET_USER_ACTION_LOADING_STATUS","LOGOUT_USER","LOAD_CATEGORY_LIST","SET_CATEGORY_LIST_LOADING_STATUS","LOAD_CATEGORY_ISSUE_LIST","SET_CATEGORY_ISSUE_LIST_LOADING_STATUS","SET_CATEGORY_ACTION_LOADING_STATUS","LOAD_ISSUE_LIST","SET_ISSUE_LIST_LOADING_STATUS","LOAD_SINGLE_ISSUE","SET_SINGLE_ISSUE_LOADING_STATUS","SET_SINGLE_ISSUE_UPDATING_STATUS","SET_NAV_SECTION_VISIBLE","SET_SECTION_EDIT_STATUS","LOAD_PREVIOUS_VERSION","LOAD_CAMPUS_LIST","SET_CAMPUS_LIST_LOADING_STATUS","SET_ERRORS","PUSH_ERRORS","SET_SUCCESS_MESSAGE","SET_MODAL_MESSAGE_STATUS","LOAD_SEARCH_RESULTS","SET_SEARCH_STATUS","SET_SEARCH_STRING","LOAD_TAG_LIST","SET_TAG_LIST_LOADING_STATUS","SET_TAG_ACTION_LOADING_STATUS","setErrors","isArray","resetErrors","setSuccessMessage","successMessage","setModalMessageStatus","inModal","resetAllMessages","dispatch","awsmobile","aws_project_region","aws_cognito_identity_pool_id","aws_cognito_region","aws_user_pools_id","aws_user_pools_web_client_id","oauth","domain","redirectSignIn","redirectSignOut","responseType","federationTarget","aws_appsync_graphqlEndpoint","aws_appsync_region","aws_appsync_authenticationType","aws_cloud_logic_custom","endpoint","region","awsConf","CognitoRegion","UserPoolId","ClientId","IdentityPoolId","OauthDetails","GRAPHQL_ENDPOINT","USERS_ENDPOINT","AWS_INFO","process","REACT_APP_BRANCH","REACT_APP_COMMIT","REACT_APP_BUILD_NUMBER","console","log","getCurrentCognitoUser","CognitoUserPool","getCurrentUser","getCurrentCognitoUserAttributes","getCurrentCognitoUserWithSession","then","user","attributes","signInUserSession","idToken","payload","groups","find","group","r","Promise","resolve","reject","cognitoUser","getSession","session","code","context","getCurrentCognitoUserTokens","_user$signInUserSessi","accessToken","getJwtToken","updateUser","userData","firstname","lastname","campusid","authFetch","username","first_name","last_name","campus_id","catch","fetchCampusList","gqlQuery","res","listCampuss","items","fetchCategoryList","listCategorys","fetchIssueListForCategory","categoryId","getCategory","records","updateCategory","categoryData","createCategory","fetchTagList","listTags","GET_SINGLE_TAG_QUERY","createTag","tagData","BATCH_CREATE_RECORD_TAG_MUTATION","BATCH_DELETE_RECORD_TAGS_MUTATION","updateTag","deleteTag","tagId","getTag","tagDeleteData","tag","tagMutations","ids","all","fetchIssueList","listRecords","parsedErrors","errorType","unshift","fetchSingleIssue","issueId","getRecord","createIssue","issueData","createRecord","updateIssue","updateData","recordCategoryId","category","rationale","agreement_language","tags","tagCreateData","tagIds","recordTagRecordId","recordTagTagId","updateTags","updateRecord","updateCampusGuidance","cgData","status","record","createCampusGuidance","record_id","SEARCH_QUERIES","_SEARCH_QUERIES","defineProperty","searchRecords","term","types","isValidType","promises","query","_results","results","searchCampusGuidances","searchCategorys","cat","searchTags","issues","params","_ref","headers","append","Headers","Content-Type","Authorization","Access-Token","credentials","request","Request","fetch","ok","json","errorMessage","statusCode","parse","variables","gqlParams","TypeError","setCurrentUserAttributes","userId","sub","initializeUserSessionFromSSO","endSession","finally","verifyCurrentUserSession","getState","WELCOME_BLURB","WELCOME_BLURB_UNAUTHED","makeUserFromData","Attributes","attr","Name","Value","preferredFirstName","preferredLastName","firstName","given_name","lastName","family_name","groupName","confirmed","roleName","campusId","Username","userName","campusListData","campuses","createSelector","campusList","campus","c","getUserList","users","list","userList","u","getUserById","getCategoryList","categories","getSortedCategoryList","b","getCategorySelectList","getSortedCategoryListWithIssueCount","issueCount","String","getCategoryById","categoryList","getCampusListSelectData","long_name","getViewableCampusGuidanceForCurrentIssue","currentIssue","guidanceData","campusGuidance","ownCampus","canEdit","canView","getParsedSearchResults","search","searchResults","seenIssues","combinedIssues","getTagList","getSortedTagList","getSortedTagListWithIssueData","sortedTags","toConsumableArray","getTagById","tagList","t","formatVersion","version","date","updated_at","moment","tz","guess","updated_by","dateString","format","timeString","getFormattedPreviousVersion","previousVersion","getFormattedPreviousVersionList","versions","setCategoryListLoadingStatus","isLoading","setCategoryIssueListLoadingStatus","setCategoryActionLoadingStatus","fetchAndLoadCategoryList","force","loaded","fetchAndLoadCategoryIssueList","attemptToUpdateCategory","validateUpdateCategoryFormData","replace","attemptToCreateCategory","currentUserEmail","confirmation","validateCreateCategoryFormData","setNavSectionVisible","visible","setSectionEditStatus","section","setIssueListLoadingStatus","loadSingleIssue","setSingleIssueLoadingStatus","setSingleIssueUpdatingStatus","isUpdating","fetchAndLoadSingleIssue","versionId","getRecordVersion","fetchPreviousVersion","updateCurrentIssue","skipRawTextCheck","validateUpdateIssueFormData","updatedIssue","attemptToCreateIssue","categoryid","validateCreateIssueFormData","updateCampusGuidanceForCurrentIssue","createCampusGuidanceForCurrentIssue","setUserListLoadingStatus","setUserActionLoadingStatus","fetchAndLoadUserList","attemptToUpdateUser","getUser","roleData","validateUpdateUserFormData","makeEditUserSuccessMessage","attemptToUpdateUserProfile","validateUpdateUserProfileFormData","updatedUser","custom:preferred_last_name","custom:preferred_first_name","refreshSession","refreshToken","err","attemptToDeleteUser","userEmail","validateDeleteUserFormData","deleteUser","makeDeleteUserSuccessMessage","setCampusListLoadingStatus","fetchAndLoadCampusList","loadCampusList","setSearchStatus","isSearching","loadSearchResults","executeSearch","searchString","searchTypes","_loadSearchResults","clearSearchResults","setSearchString","setTagListLoadingStatus","setTagActionLoadingStatus","fetchAndLoadTagList","attemptToCreateTag","validateCreateTagFormData","attemptToUpdateTag","validateUpdateTagFormData","CategoryList","spinner","connect","PageContainer","PageContent","messages","error_list","success_banner","SearchBar","shouldLockSubmit","isEmpty","Welcome","page_content_PageContainer","category_list","isLoggedIn","ISSUE_LIST_COLUMNS","CategoryView","loadCategoryList","loadIssueList","isLoadingIssues","issueList","table","match","IssueSectionContainer","onScroll","isVisible","visibleSection","toggleCollapse","collapsed","startCollapsed","addEventListener","removeEventListener","showCollapseButton","showEditButton","editAction","shouldHighlight","currentSection","aria-expanded","widgets_button","el","rect","getBoundingClientRect","midpoint","document","documentElement","clientHeight","top","bottom","IssueSection","onSave","isNotDirty","cancel","_this$props$onSave","content","getContent","field","edit","onCancel","startInEditMode","customData","isCollapsible","shouldLockForm","shouldShowEditButton","shouldShowCollapseButton","issue_section_container","rich_text_editor","IssueNav","campusGuidanceList","showVersionMenuItem","anchor_link_default","offset","short_name","TagSelector","addTag","tagText","filterText","tagLookup","selectedTags","updateState","addNewTag","storeNewTag","listOpen","filteredTagList","addTagButtonText","isTagAlreadySelected","tagName","openList","listIdx","closeList","setFilterText","text","focusAndClose","allTags","includes","addButtonText","handleListNavigation","selectedTag","incrementListIdx","decrementListIdx","listRef","pillBottleRef","issueTags","scrollToLastPill","findIndex","splice","scrollToTag","tagTop","offsetTop","tagBottom","listTop","scrollTop","listBottom","isTagVisible","listElement","tagElement","bottle","pill","lastElementChild","_this$state3","htmlFor","removeTag","tagIdString","aria-haspopup","aria-owns","onBlur","autoComplete","aria-autocomplete","aria-controls","aria-activedescendant","highlightedTag","onFocus","onKeyDown","showList","aria-labelledby","navigateThroughTagList","aria-selected","onMouseDown","canAddTag","_this$state4","_this$state5","STATUS_OPTIONS","IssueTitle","clearNewTags","newTag","currentNewTags","newTags","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","deleteNewTag","return","tagids","sameTitle","sameCategory","sameStatus","newTagIds","split","oldTagIds","sameTags","isUnpublished","oldIssue","newIssue","oldTags","currentVersion","displayTitle","widgets_form","text_input","widgets_select","tag_selector_TagSelector","aria-hidden","print","Breadcrumbs","trackScrolling","scrollY","toggleBtop","scrollTo","activateVersionFunction","CampusGuidance","addCampusGuidanceWYSIWYGControls","ui","registry","addMenuButton","callback","icon","onAction","setDirty","openEditorToCreateNewGuidance","creatingNewGuidance","cancelCreatingNewGuidance","shouldSwitchToViewMode","shouldShowStatus","setup","toolbar3","issue_section","makeVersionString","PreviousVersionList","previousVersions","currentIssueId","IssuePage","fetchAndLoadIssue","isAdmin","onSaveIssue","_this$props2","campusListLoaded","onSaveCampusGuidance","showVersionInfo","previousVersionList","viewingPreviousVersion","breadcrumbs","savePreviousVersionAsCurrent","issue_title","issue_nav","campus_guidance","previous_version_list","sectionEditStatus","some","val","createOrUpdateCampusGuidanceForCurrentIssue","Search","searchResultColumns","result","isCategory","prefix","route","initialState","loginErrors","listInitialState","issuesInitialState","actionInitialState","combineReducers","action","actions","currentIssueInitialState","usersInitialState","actionsInitialState","success","_data","isLoadingSession","newErrors","composeFunction","compose","createStore","reducers","applyMiddleware","thunk","Auth","configure","identityPoolId","userPoolId","userPoolWebClientId","mandatorySignIn","Hub","_ref$payload","Store","EditProfile","focusName","focusRole","resetMessages","hideModal","signOut","confirmMessage","isNameSet","cancelMessage","modal","handleClose","LoginWrapper","LoginForm","clearLoginErrors","signIn","login_wrapper","federatedSignIn","Unregistered","USER_LIST_COLUMNS","filterTerm","emailSuffix","AddUser","EditUser","Users","isLoadingUserList","authenticated_route","path","USERS_DELETE_ROUTE_PREFIX","component","DeleteUserModal","allowedRoles","USERS_EDIT_ROUTE_PREFIX","EditUserModal","leftside_menu","list_user","CATEGORY_LIST_COLUMNS","CategoryAdminList","EditCategory","CreateCategory","Categories","CATEGORY_EDIT_ROUTE_PREFIX","EditCategoryModal","CreateCategoryModal","category_admin_list","IssueAdminList","CreateIssue","Issues","fetchAndLoadIssueList","CreateIssueModal","issues_admin_list","TagIssueList","_useState","useState","_useState2","slicedToArray","setShowList","hasIssues","TAG_LIST_COLUMNS","tags_admin_list_TagIssueList","TagAdminList","CreateTag","EditTag","DeleteTag","Tags","CreateTagModal","TAG_EDIT_ROUTE_PREFIX","EditTagModal","TAG_DELETE_ROUTE_PREFIX","DeleteTagModal","tags_admin_list","AuthenticatedRoute","isAuthenticated","isRegistered","isAuthorized","react_router","profile","rest","objectWithoutProperties","assign","render","targetComponent","UnauthenticatedRoute","Usermenu","toggleMenu","isOpen","node","contains","onKeyPress","checked","readOnly","LeftsideMenu","Modal","store","react_focus_trap_default","App","header","unauthenticated_route","exact","ISSUE_ROUTE_PREFIX","Issue","ISSUE_ROUTE","CATEGORY_ROUTE_PREFIX","TagsAdminList","footer","renderApp","hostname","ReactDOM","es","src_App","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.db022d2a.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/uc_wordmark_stacked_gray.41258bb1.png\";","module.exports = __webpack_public_path__ + \"static/media/wordmark.7ac78ea2.png\";","export const APP_TITLE = 'Negotiator\\'s Handbook';\n\nexport const ROLE_SYSTEM_ADMINISTRATOR = 'sys_admin';\nexport const ROLE_CAMPUS_ADMINISTRATOR = 'campus_admin';\nexport const ROLE_LOCATION_ACCESS_COORDINATOR = 'location_c';\nexport const ROLE_VIEWER = 'viewer';\n\nexport const ROLES = [\n {\n name: 'System Administrator',\n value: ROLE_SYSTEM_ADMINISTRATOR\n },\n {\n name: 'Campus Administrator',\n value: ROLE_CAMPUS_ADMINISTRATOR\n },\n {\n name: 'Location Access Coordinator',\n value: ROLE_LOCATION_ACCESS_COORDINATOR\n },\n {\n name: 'Viewer',\n value: ROLE_VIEWER\n }\n];\n\nexport const ALL_ROLES = ROLES.map(role => role.value);\n\n// campus guidance statuses\nexport const CAMPUS_GUIDANCE_STATUS_UNPUBLISHED = 'none';\nexport const CAMPUS_GUIDANCE_STATUS_ALL = 'all';\nexport const CAMPUS_GUIDANCE_STATUS_CAMPUS = 'campus';\n\n// Search result types\nexport const TYPE_ISSUE = 'TYPE_ISSUE';\nexport const TYPE_CAMPUS_GUIDANCE = 'TYPE_CAMPUS_GUIDANCE';\nexport const TYPE_CATEGORY = 'TYPE_CATEGORY';\nexport const TYPE_TAG = 'TYPE_TAG';\n","import ReactGA from 'react-ga';\n\nconst trackingId = 'UA-157124467-1';\nReactGA.initialize(trackingId);\n\nexport const setPage = url => {\n ReactGA.set({ page: url });\n ReactGA.pageview(url);\n};\n","import { createHashHistory } from 'history';\nimport { setPage } from './analytics';\n\n\nconst history = createHashHistory({\n basename: '',\n hashType: 'slash'\n});\n\nhistory.listen(location => {\n setPage(location.pathname)\n})\n\nexport default history;\n","export const MISSING_NAME_ERROR = 'Please add your first and last names';\nexport const SHORT_NAME_ERROR = 'Names must be at least 2 characters';\nexport const MISSING_CAMPUS_ERROR = 'Please select a campus';\nexport const MISSING_ROLE_ERROR = 'Please select a role';\nexport const DELETE_USER_NO_CONFIRMATION_ERROR = 'Please enter the correct email address to confirm deletion';\n\nexport const UNABLE_TO_LOAD_LIST_ERROR = 'We are unable to load the user list at this time.';\n\nexport const UNABLE_TO_UPDATE_USER_ERROR = 'We are unable to update this user at this time.'\nexport const UNABLE_TO_DELETE_USER_ERROR = 'We are unable to delete this user at this time.'\n","export const CATEGORY_LIST_ERROR =\n \"We are unable to load the category list at this time\";\nexport const CATEGORY_VIEW_ERROR =\n \"We are unable to load this category at this time\";\nexport const CATEGORY_UPDATE_ERROR =\n \"We are unable to update the category at this time\";\nexport const CATEGORY_CREATE_ERROR =\n \"We are unable to create the category at this time\";\nexport const MISSING_CATEGORY_NAME_ERROR = \"Please provide a category name\";\nexport const INCORRECT_CATEGORY_CONFIRMATION_ERROR =\n \"To verify that you actually want to create a new category, please enter the email address associated with your account.\";\nexport const DUPLICATE_CATEGORY_NAME_ERROR = \"Category name already exists. Please enter a different category name\";\n","export const ISSUE_LIST_ERROR = 'We are unable to load the issue list at this time';\nexport const CREATE_ISSUE_ERROR = 'We are unable to create this issue at this time';\nexport const UPDATE_ISSUE_ERROR = 'We are unable to update this issue at this time';\nexport const SINGLE_ISSUE_ERROR = 'We are unable to load this issue at this time';\nexport const PREVIOUS_VERSION_ERROR = 'We are unable to load this version at this time';\nexport const MISSING_ISSUE_TITLE_ERROR = 'Please add a title for this issue';\nexport const MISSING_ISSUE_CATEGORY_ERROR = 'Please select a category for this issue';\nexport const MISSING_ISSUE_GUIDANCE_ERROR = 'Please add UCOP guidance to this issue';\nexport const MISSING_ISSUE_RATIONALE_ERROR = 'Please add rationale to this issue';\nexport const MISSING_ISSUE_AGREEMENT_LANGUAGE_ERROR = 'Please add agreement language to this issue';\n","export const CAMPUS_GUIDANCE_UPDATE_ERROR = \"We are unable to update this campus guidance at this time\";\nexport const CAMPUS_GUIDANCE_CREATE_ERROR = \"We are unable to create this campus guidance at this time\";\n\nexport const CAMPUS_GUIDANCE_NO_CONTENT_ERROR = \"Please add some text for this guidance\";\n","export const TAG_LIST_ERROR =\n \"We are unable to load the tag list at this time\";\nexport const SINGLE_TAG_ERROR =\n \"We are unable to load the tag at this time\";\nexport const TAG_CREATE_ERROR =\n \"We are unable to create the tag at this time\";\nexport const TAG_UPDATE_ERROR =\n \"We are unable to update the tag at this time\";\nexport const TAG_DELETE_ERROR =\n \"We are unable to delete the tag at this time\";\n\nexport const MISSING_TAG_NAME_ERROR = \"Please provide a tag name\";\nexport const DUPLICATE_TAG_NAME_ERROR = \"Tag name already exists. Please enter a different tag name\";\n","/**\n * @module constants/errors\n * @desc Primarily jsut exported const data pertaining to error messages.\n */\n\nimport React, { Fragment } from 'react';\n\nexport * from './login-errors';\nexport * from './user-errors';\nexport * from './campus-errors';\nexport * from './category-errors';\nexport * from './issue-errors';\nexport * from './campus-guidance-errors';\nexport * from './search-errors';\nexport * from './tag-errors';\n\nexport const GQL_NULL_RESPONSE_ERROR = {\n errors: [\n {error: 'null response from gql'}\n ]\n}\n\n/**\n * Method to create a generic error message with an email link and some contextual data\n * @function\n * @param {object} error error data as well as any other context. This object is stringified and inserted in the body of the email\n * @returns {node} a jsx node with the message, email link, and contextual data\n */\nexport const makeGenericErrorMessage = error => {\n // doing it this way to have time and url at the front of the object\n error = {\n time: new Date().toISOString(),\n url: ` ${window.location.href} `,\n ...error\n };\n const email = 'infohelp@ucop.edu';\n const subject = 'NHB Error report'\n const body = `\n ErrorInfo:\n ${JSON.stringify(error)}\n `;\n\n const emailString = `mailto:${email}?subject=${subject}&body=${body}`;\n return (\n Something went wrong on our end. If the problem persists please try refreshing the page or logging out and back in. If this doesn't work then please contact us at {email}.\n );\n};\n\nexport const GENERIC_ERROR = 'Unknown error';\n","/**\n * @module utils/users\n * @desc validators, parsers, etc reltaed to user data\n */\n\nimport {\n SHORT_NAME_ERROR,\n MISSING_ROLE_ERROR,\n MISSING_CAMPUS_ERROR,\n MISSING_NAME_ERROR,\n UNABLE_TO_UPDATE_USER_ERROR,\n UNABLE_TO_DELETE_USER_ERROR,\n DELETE_USER_NO_CONFIRMATION_ERROR,\n makeGenericErrorMessage\n} from \"../constants/errors\";\n\nimport {\n ROLES\n} from '../constants';\n\nimport { isEmptyString } from './';\n\n/**\n * Checks update user form data for errors\n * @param {Object} formData\n * @param {string} formData.id\n * @param {string} formData.firstname\n * @param {string} formData.lastname\n * @param {string} formData.role\n * @param {string} formData.campus\n * @param {string[]} campusList\n * @returns {string[]} errors\n */\nexport function validateUpdateUserFormData(formData, campusList) {\n const errors = [];\n const { id, firstname, lastname, role, campusid } = formData;\n\n if (isEmptyString(id)) {\n errors.push([\n UNABLE_TO_UPDATE_USER_ERROR,\n makeGenericErrorMessage({context: 'update user', error: 'missing id'})\n ]);\n }\n\n if (isEmptyString(firstname) || isEmptyString(lastname)) {\n errors.push(MISSING_NAME_ERROR);\n } else if ((firstname.length < 2) || (lastname.length < 2)) {\n errors.push(SHORT_NAME_ERROR);\n }\n\n if (!ROLES.find(roleData => role === roleData.value)) {\n errors.push(MISSING_ROLE_ERROR)\n }\n\n if (!campusList.find(campus => campusid === campus.id)) {\n errors.push(MISSING_CAMPUS_ERROR)\n }\n\n return errors;\n}\n\n/**\n * Checks update user form data for errors\n * @param {Object} formData\n * @param {string} formData.id\n * @param {string} formData.firstname\n * @param {string} formData.lastname\n * @returns {string[]} errors\n */\n export function validateUpdateUserProfileFormData(formData) {\n const errors = [];\n const { id, firstname, lastname } = formData;\n\n if (isEmptyString(id)) {\n errors.push([\n UNABLE_TO_UPDATE_USER_ERROR,\n makeGenericErrorMessage({context: 'update user', error: 'missing id'})\n ]);\n }\n\n if (isEmptyString(firstname) || isEmptyString(lastname)) {\n errors.push(MISSING_NAME_ERROR);\n } else if ((firstname.length < 2) || (lastname.length < 2)) {\n errors.push(SHORT_NAME_ERROR);\n }\n\n return errors;\n}\n\n/**\n * Checks delete user form data for errors\n * @param {Object} formData\n * @param {string} formData.id\n * @param {string} formData.email email entered in form to confirm deletion\n * @param {string} userEmail email taken from user data in store\n *\n * @returns {string[]} errors\n */\nexport function validateDeleteUserFormData(formData, userEmail) {\n const errors = [];\n const { id, email } = formData;\n\n if (isEmptyString(id) || isEmptyString(userEmail)) {\n errors.push([\n UNABLE_TO_DELETE_USER_ERROR,\n makeGenericErrorMessage({context: 'delete user', error: 'missing id'})\n ]);\n }\n\n if (isEmptyString(email) || (email.trim() !== userEmail.trim())) {\n errors.push(DELETE_USER_NO_CONFIRMATION_ERROR);\n }\n\n return errors;\n}\n\nconst ROLE_LOOKUP = ROLES.reduce((lookup, role) => {\n lookup[role.value] = role.name;\n\n return lookup;\n}, {});\n\nexport const getRoleName = roleValue => ROLE_LOOKUP[roleValue];\n\n/**\n * Converts user data from the users endpoint into a format better suited for the app\n * @param {object} rawUserData\n * @param {string} rawUserData.Username\n * @param {string} rawUserData.UserCreateDate\n * @param {string} rawUserData.UserLastModifiedDate\n * @param {string} rawUserData.UserStatus\n * @param {string} rawUserData.role\n * @param {object[]} rawUserData.Attributes\n * @returns {object} user\n * @returns {string} user.id\n * @returns {string} user.createdAt\n * @returns {string} user.updatedAt\n * @returns {string} user.status\n * @returns {string} user.role\n * @returns {string} user.campus\n * @returns {string} user.family_name\n * @returns {string} user.given_name\n */\nexport function parseUserResponse(rawUserData) {\n // TODO create actual date objects out of date strings from response\n const user = {\n id: rawUserData.Username,\n createdAt: rawUserData.UserCreateDate,\n updatedAt: rawUserData.UserLastModifiedDate,\n status: rawUserData.UserStatus,\n role: rawUserData.role\n };\n\n if (rawUserData.Attributes) {\n rawUserData.Attributes.forEach(({Name, Value}) => {\n if (Name.search('custom:') === 0) {\n Name = Name.substring(7); // 7 chars in 'custom:'\n }\n user[Name] = Value;\n });\n }\n\n return user;\n}\n","import {\n MISSING_ISSUE_TITLE_ERROR,\n MISSING_ISSUE_GUIDANCE_ERROR,\n MISSING_ISSUE_RATIONALE_ERROR,\n MISSING_ISSUE_AGREEMENT_LANGUAGE_ERROR,\n CAMPUS_GUIDANCE_NO_CONTENT_ERROR\n} from '../constants/errors';\n\nimport { isEmptyString } from './';\n\nexport function validateCreateIssueFormData(formData) {\n const errors = [];\n const { title } = formData;\n\n if (isEmptyString(title)) {\n errors.push(MISSING_ISSUE_TITLE_ERROR);\n }\n\n return errors;\n}\n\n// TODO validate title, category, status, and tags\nexport function validateUpdateIssueFormData(formData, skipRawTextCheck = false) {\n const errors = [];\n const { title, rawText, agreement_language, guidance, rationale } = formData;\n\n if (typeof title !== \"undefined\" && isEmptyString(title)) {\n errors.push(MISSING_ISSUE_TITLE_ERROR);\n }\n\n if (typeof guidance !== \"undefined\"\n && (isEmptyString(guidance) || (!skipRawTextCheck && isEmptyString(rawText)))\n ) {\n errors.push(MISSING_ISSUE_GUIDANCE_ERROR);\n }\n\n if (typeof rationale !== \"undefined\" &&\n (isEmptyString(rationale) || (!skipRawTextCheck && isEmptyString(rawText)))\n ) {\n errors.push(MISSING_ISSUE_RATIONALE_ERROR);\n }\n\n if (typeof agreement_language !== \"undefined\" &&\n (isEmptyString(agreement_language) || (!skipRawTextCheck && isEmptyString(rawText)))\n) {\n errors.push(MISSING_ISSUE_AGREEMENT_LANGUAGE_ERROR);\n }\n\n return errors;\n}\n\nexport function validateCreateCampusGuidanceFormData(formData) {\n const errors = [];\n const { rawText, guidance } = formData;\n\n if (isEmptyString(rawText) || isEmptyString(guidance)) {\n errors.push(CAMPUS_GUIDANCE_NO_CONTENT_ERROR);\n }\n\n return errors;\n}\n\nexport function makeIssueNameWithStatus(issue) {\n return issue.published ? issue.title : \"*\" + issue.title;\n}\n","/**\n * @module utils\n * @desc Helper methods and classes\n */\nimport {\n ROLE_SYSTEM_ADMINISTRATOR,\n ROLE_CAMPUS_ADMINISTRATOR,\n ROLE_LOCATION_ACCESS_COORDINATOR,\n ROLE_VIEWER\n} from '../constants';\n\nexport * from './users';\nexport * from './categories';\nexport * from './issues';\nexport * from './tags';\n\n// TODO for all util update validators: add checks to see if the updated data differs from the currtent data\n// we can avoid sending requests if a user presses 'update' without changing any fields\n\n///////////////////////////////////////////////////////////////\n// ENV CHECKS /////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////\n/**\n * Returns the name of the environment\n * @return {string} env name\n */\nexport function getEnv() {\n return process.env.NODE_ENV;\n}\n\n/**\n/* Checks if we are in the production environment\n * @return {boolean} true if production\n */\nexport function isProd() {\n return getEnv() === \"production\";\n}\n\n/**\n/* Checks if we are in the development environment\n * @return {boolean} true if development\n */\nexport function isDev() {\n return getEnv() === \"development\";\n}\n\n/**\n/* Checks if we are in the test environment\n * @return {boolean} true if test\n */\nexport function isTest() {\n return getEnv() === \"test\";\n}\n\n///////////////////////////////////////////////////////////////\n// HELPER METHODS /////////////////////////////////////////////\n///////////////////////////////////////////////////////////////\n/**\n * Combines strings into a single string to use with a react className prop\n * @param {...string} names - A variable amount of names to combine\n * @return {string}\n * @example\n * makeClassName('ucop-form', 'login-form', 'hidden')\n */\nexport function makeClassName(...names) {\n return names\n .map(name => (name ? name.trim() : null))\n .filter(name => name)\n .join(\" \");\n}\n\nexport const isSystemAdmin = currentUser =>\n currentUser && currentUser.role === ROLE_SYSTEM_ADMINISTRATOR;\n\nexport const isCampusAdmin = currentUser =>\n currentUser && currentUser.role === ROLE_CAMPUS_ADMINISTRATOR;\n\nexport const isLocationAccessCoordinator = currentUser =>\n currentUser && currentUser.role === ROLE_LOCATION_ACCESS_COORDINATOR;\n\nexport const isViewer = currentUser =>\n currentUser && currentUser.role === ROLE_VIEWER;\n\n/**\n * @param {string} string\n * @param {boolean} includeWhiteSpace - if true then ' ' would not be considered empty\n * @return {boolean}\n */\nexport function isEmptyString(string = \"\", includeWhiteSpace = false) {\n string = includeWhiteSpace ? string : string.trim();\n\n return !string;\n}\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport './style.scss';\n\nimport { makeClassName } from '../../../utils';\n\nclass Button extends Component {\n render() {\n const { name, label, id, className, type, onClick, disabled, children, focusRef } = this.props;\n return (\n \n {children}\n \n );\n }\n}\n\nButton.defaultProps ={\n type: 'button'\n};\n\nButton.propTypes = {\n name: PropTypes.string,\n label: PropTypes.string,\n id: PropTypes.string,\n className: PropTypes.string,\n type: PropTypes.string,\n onClick: PropTypes.func,\n focusRef: PropTypes.object,\n disabled: PropTypes.bool\n};\n\nexport default Button;\n","import React, { Component, createRef } from \"react\";\nimport PropTypes from \"prop-types\";\nimport \"./style.scss\";\nimport { makeClassName } from \"../../../utils\";\n\nclass ErrorList extends Component {\n constructor(props) {\n super(props);\n this.focusRef = createRef();\n this.focusOnError = this.focusOnError.bind(this);\n }\n\n focusOnError() {\n if (this.props.shouldFocusOnError && this.props.errors.length) {\n this.focusRef.current.focus();\n }\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.errors !== this.props.errors) {\n this.focusOnError();\n }\n }\n\n render() {\n const { title, errors, id, className } = this.props;\n return (\n 0 ? \"-1\" : \"\"}\n role=\"alert\"\n >\n {title && errors.length > 0 ?

{title}

: null}\n \n \n );\n }\n}\n\nErrorList.defaultProps = {\n shouldFocusOnError: true,\n errors: []\n};\n\nErrorList.propTypes = {\n id: PropTypes.string,\n className: PropTypes.string,\n title: PropTypes.string,\n errors: PropTypes.arrayOf(PropTypes.node).isRequired,\n shouldFocusOnError: PropTypes.bool\n};\n\nexport default ErrorList;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { makeClassName } from '../../../utils';\n\nclass Form extends Component {\n constructor(props) {\n super(props);\n\n this.onSubmit = this.onSubmit.bind(this);\n }\n\n onSubmit(event) {\n event.preventDefault();\n\n const inputs = Array.from(event.target);\n const data = inputs.reduce((values, input) => {\n if (input.name) {\n values[input.name] = input.value;\n }\n return values;\n }, {});\n\n if (this.props.onSubmit) {\n this.props.onSubmit(data);\n }\n }\n\n render() {\n const {children, id, className } = this.props;\n return (\n \n {children}\n \n );\n }\n}\n\nForm.propTypes = {\n id: PropTypes.string,\n className: PropTypes.string,\n onSubmit: PropTypes.func\n};\n\nexport default Form;\n","import React from 'react';\nimport './style.scss';\nimport { makeClassName } from '../../../utils';\n\nconst Spinner = props => {\n const { className, light, small } = props;\n return (\n
\n
\n
\n
\n
\n
\n
\n Loading\n
\n
\n );\n};\n\nexport default Spinner;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nimport './style.scss';\nimport { makeClassName } from '../../../utils';\n\nclass TextInput extends Component {\n state = {\n value: this.props.initialValue\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (this.props.initialValue && !prevProps.initialValue) {\n this.setState({\n value: this.props.initialValue\n })\n }\n }\n\n onChange = (event) => {\n if (this.props.onChange) {\n this.props.onChange(event);\n }\n\n this.setState({\n value: event.target.value\n });\n }\n\n render() {\n const { focusRef, pattern, name, id, className, label, type, placeholder, disabled, required } = this.props;\n\n return (\n \n\n );\n }\n}\n\nTextInput.defaultProps = {\n type: 'text',\n initialValue: ''\n};\n\nTextInput.propTypes = {\n name: PropTypes.string.isRequired,\n id: PropTypes.string,\n className: PropTypes.string,\n label: PropTypes.node,\n initialValue: PropTypes.string,\n onChange: PropTypes.func,\n type: PropTypes.string,\n placeholder: PropTypes.string,\n disabled: PropTypes.bool,\n required: PropTypes.bool,\n focusRef: PropTypes.object,\n pattern: PropTypes.string\n};\n\nexport default TextInput;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { makeClassName } from '../../../utils';\n\nimport wordmarkImage from './uc_wordmark_stacked_gray.png';\n\nconst WordMark = props => {\n const { className, id } = props;\n return (\n \n );\n};\n\nWordMark.propTypes = {\n id: PropTypes.string,\n className: PropTypes.string,\n};\n\nexport default WordMark;\n","import React, { Fragment } from \"react\";\nimport \"./style.scss\";\n\nconst Tooltip = props => {\n return (\n \n
\n ?{props.children}\n
\n
\n );\n};\n\nexport default Tooltip;\n","import React, { Component, Fragment, createRef } from \"react\";\nimport PropTypes from \"prop-types\";\nimport \"./style.scss\";\nimport { Pagination } from \"../\";\nimport Tooltip from \"../tooltip/index\";\nimport { makeClassName } from \"../../../utils\";\n\nclass Table extends Component {\n constructor(props) {\n super(props);\n\n // we want to extract our filter/sort functions from our column schema for use later\n // we also need to set some initial state for the filters/sort functions\n const filters = {};\n const sortFunctions = {};\n let activeSortFunction;\n\n this.props.columns.forEach(col => {\n // extract filters and set initial state\n if (typeof col.filter === \"function\") {\n filters[col.name] = {\n method: col.filter,\n active: Boolean(col.initialFilterValue),\n value: col.initialFilterValue || \"\",\n };\n }\n\n // extract sort functions and set initial state\n if (typeof col.sort === \"function\") {\n sortFunctions[col.name] = {\n method: col.sort,\n descending: Boolean(col.descending)\n };\n if (col.defaultSort) {\n activeSortFunction = col.name;\n }\n }\n });\n\n this.state = {\n currentPage: this.props.page || 1,\n filters,\n sortFunctions,\n activeSortFunction\n };\n\n this.focusRef = createRef();\n }\n\n selectSortFunction = name => {\n this.setState({ activeSortFunction: name });\n };\n\n setSortDirection = (name, descending) => {\n const { activeSortFunction, sortFunctions } = this.state;\n const currentSortFunction = sortFunctions[activeSortFunction];\n\n sortFunctions[name] = {\n ...currentSortFunction,\n descending\n };\n\n this.setState({ sortFunctions });\n };\n\n setFilterState = (name, active) => {\n const filters = this.state.filters;\n const currentFilter = filters[name];\n filters[name] = {\n ...currentFilter,\n value: active ? currentFilter.value : \"\",\n active\n };\n\n this.setState({ filters });\n };\n\n setFilterValue = (name, value) => {\n const filters = this.state.filters;\n const currentFilter = filters[name];\n\n filters[name] = {\n ...currentFilter,\n value\n };\n\n\n this.setState({\n filters\n });\n };\n\n onPageChange = (page, total) => {\n this.setState({\n currentPage: page\n });\n };\n\n skipAction = () => {\n if (this.focusRef.current) {\n this.focusRef.current.focus();\n }\n };\n\n componentDidUpdate(prevProps, prevState) {\n const { itemsPerPage } = this.props;\n const { currentPage } = this.state;\n\n const newPageCount = Math.ceil(this.filteredData.length / itemsPerPage);\n // if we are left on a non-existant page after filtering then we can\n // move to the last page\n if (Math.max(1, currentPage) > Math.max(1, newPageCount)) {\n this.setState({currentPage: Math.max(1, newPageCount)});\n }\n }\n\n getFilteredData = data => {\n const { filters } = this.state;\n\n // iterate over each filter's value: {active, value, filter}\n const filteredData = Object.values(filters).reduce((filtered, filter) => {\n // apply active filters to our data\n if (filter.active && filter.value) {\n return filtered.filter(item => filter.method(item, filter.value));\n }\n // we just pass the data along unfiltered if the filter isn't active\n return filtered;\n }, data);\n\n return filteredData;\n };\n\n getSortedData = data => {\n const { activeSortFunction, sortFunctions } = this.state;\n const currentSortFunction = sortFunctions[activeSortFunction];\n if (\n !currentSortFunction ||\n typeof currentSortFunction.method !== \"function\"\n ) {\n return data;\n }\n\n const sorted = data.sort(currentSortFunction.method);\n\n return currentSortFunction.descending ? sorted.reverse() : sorted;\n };\n\n getPaginatedData = data => {\n const { itemsPerPage } = this.props;\n const { currentPage } = this.state;\n\n if (typeof itemsPerPage === \"undefined\") {\n return {\n totalPages: 1,\n tableData: data\n };\n }\n\n const totalPages = Math.ceil(data.length / itemsPerPage);\n const sliceStart = (currentPage - 1) * itemsPerPage;\n const page = data.slice(sliceStart, sliceStart + itemsPerPage);\n const firstItemNumber = sliceStart + 1;\n const itemCount = data.length;\n const lastItemNumber = Math.min(sliceStart + itemsPerPage, itemCount);\n\n const statusString = (totalPages > 1) ?\n `Displaying ${data.length ? firstItemNumber : 0} - ${lastItemNumber} out of ${itemCount} results` :\n `Displaying ${data.length ? firstItemNumber : 0} - ${itemCount} out of ${itemCount} results`;\n\n return {\n totalPages,\n statusString,\n tableData: page\n };\n };\n\n get filteredData() {\n return this.getFilteredData(this.props.data);\n }\n\n get sortedData() {\n return this.getSortedData(this.filteredData);\n }\n\n get paginatedData() {\n return this.getPaginatedData(this.sortedData);\n }\n\n render() {\n const { id, caption, columns, className, keyFunction } = this.props;\n const {\n tableData,\n totalPages,\n statusString\n } = this.paginatedData;\n const needsPagination = totalPages > 1;\n return (\n
\n {needsPagination && (\n
\n \n
\n )}\n
{statusString}
\n \n \n \n {/* COLUMN HEADERS */}\n \n {/* we iterate over each column and either render a bunch of filter stuff or */}\n {/* just the column's display name */}\n {columns.map((col, idx) =>\n col.filter ? (\n \n this.setFilterState(col.name, true)}\n >\n {col.displayName}\n \n Click header to {`filter by:${col.displayName}`}\n \n \n {this.state.filters[col.name].active && (\n \n \n this.setFilterValue(col.name, e.target.value)\n }\n value={this.state.filters[col.name].value}\n />\n this.setFilterState(col.name, false)}\n >\n X\n \n \n )}\n \n ) : (\n \n )\n )}\n \n\n {/* TABLE ROWS */}\n {tableData.length ? (\n tableData.map((item, idx) => (\n \n {/* we iterate over each column and look up the appropriate data */}\n {/* if the column has a displayTransformer function we call it with the rest of an item's data */}\n {/* otherwise we just display the data that matches the column name */}\n {/* if we don't have anything for that column we render an empty string */}\n {columns.map((col, idx) => (\n \n ))}\n \n ))\n ) : (\n \n \n \n )}\n \n
{caption}
\n {col.displayName}\n
\n {(typeof col.displayTransformer === \"function\"\n ? col.displayTransformer(item)\n : item[col.name]) || \"\"}\n
No content in table.
\n {needsPagination && (\n \n )}\n
\n );\n }\n}\n\nTable.propTypes = {\n caption: PropTypes.node,\n columns: PropTypes.arrayOf(PropTypes.object).isRequired,\n data: PropTypes.arrayOf(PropTypes.object),\n className: PropTypes.string,\n itemsPerPage: PropTypes.number,\n id: PropTypes.string,\n page: PropTypes.number\n};\n\nexport default Table;\n","import React, { Component, Fragment } from \"react\";\nimport PropTypes from \"prop-types\";\nimport \"./style.scss\";\n\nclass Pagination extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n currentPage: this.props.page || 1\n };\n }\n\n increment = () => {\n this.setState({\n currentPage: this.state.currentPage + 1\n });\n if (typeof this.props.onChange === \"function\") {\n this.props.onChange(this.state.currentPage + 1, this.props.totalPages);\n }\n };\n\n decrement = () => {\n this.setState({\n currentPage: this.state.currentPage - 1\n });\n if (typeof this.props.onChange === \"function\") {\n this.props.onChange(this.state.currentPage - 1, this.props.totalPages);\n }\n };\n\n componentDidUpdate(prevProps) {\n // if we get a new page number from the table then we just go there right away\n if (\n (this.props.page !== this.state.currentPage) &&\n (this.props.page !== prevProps.page)\n ) {\n this.setState({\n currentPage: this.props.page\n })\n }\n }\n\n render() {\n const { focusRef } = this.props;\n const onFirstPage = this.state.currentPage === 1;\n const onLastPage = this.state.currentPage === this.props.totalPages;\n const currentpage = this.state.currentPage;\n\n return (\n
\n {!onFirstPage && (\n \n \n \n {currentpage - 1}\n \n \n )}\n \n {!onLastPage && (\n \n \n {currentpage + 1}\n \n \n \n )}\n
\n );\n }\n}\n\nPagination.propTypes = {\n onChange: PropTypes.func,\n page: PropTypes.number,\n totalPages: PropTypes.number.isRequired,\n focusRef: PropTypes.object\n};\n\nexport default Pagination;\n","import React, { Component, Fragment, createRef } from 'react';\nimport PropTypes from \"prop-types\";\nimport './style.scss';\n\nimport { makeClassName } from \"../../../utils\";\n\nclass SuccessBanner extends Component {\n constructor(props) {\n super(props);\n this.focusRef = createRef();\n }\n\n focusOnSuccess = () => {\n if (this.props.shouldFocusOnSuccess && this.props.message) {\n this.focusRef.current.focus();\n }\n };\n\n componentDidUpdate() {\n this.focusOnSuccess();\n }\n\n render() {\n let { message, className, id } = this.props;\n\n return (\n \n { message &&\n \n {message}\n \n }\n \n );\n }\n}\n\nSuccessBanner.defaultProps = {\n shouldFocusOnSuccess: true\n};\n\nSuccessBanner.propTypes = {\n id: PropTypes.string,\n className: PropTypes.string,\n message: PropTypes.node,\n shouldFocusOnSuccess: PropTypes.bool\n};\n\nexport default SuccessBanner;\n","import React, { Component } from 'react';\nimport './style.scss';\n\nimport { makeClassName } from '../../../utils';\n\nconst parseOption = option => {\n const data = {};\n if (typeof option === 'object') {\n data.name = option.name;\n data.value = option.value\n } else {\n data.name = option;\n }\n\n if (typeof data.value === 'undefined') {\n data.value = data.name.toLowerCase();\n }\n\n\n return data;\n};\n\nclass Select extends Component {\n state = {\n value: this.props.initialValue\n };\n\n componentDidUpdate(prevProps, prevState) {\n if (this.props.initialValue && !prevProps.initialValue) {\n this.setState({\n value: this.props.initialValue\n })\n }\n }\n\n onChange = (event) => {\n if (this.props.onChange) {\n this.props.onChange(event);\n }\n\n this.setState({\n value: event.target.value\n });\n }\n\n render() {\n const { focusRef, name, id, className, label, disabled, required, options, prompt } = this.props;\n\n return (\n \n\n );\n }\n\n\n}\n\nexport default Select;\n","import React, { Component, createRef } from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport { makeClassName } from \"../../../utils\";\n\nimport { Editor } from \"@tinymce/tinymce-react\";\nimport DOMPurify from \"dompurify\";\n\nconst DEFAULT_TOOLBAR =\n \"undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link unlink\";\nconst TABLE_TOOLBAR =\n \"table tabledelete | tableprops tablerowprops tablecellprops | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol\";\n\nclass RichTextEditor extends Component {\n constructor(props) {\n super(props);\n this.ref = createRef();\n }\n\n componentDidMount() {\n this.setEditorRefInParent();\n this.focusOnEditor();\n }\n\n focusOnEditor = () => {\n if (!(this.ref.current && this.ref.current.editor)) {\n return;\n }\n const editor = this.ref.current.editor;\n // Normally we could use the 'auto_focus' property in our init object,\n // but since this is a react component we won't know the selector of the underlying\n // element that tinymce binds to until after init.\n // Instead we add an init eventhandler and this works for some reason\n // Taken from https://community.tiny.cloud/communityQuestion?id=90661000000IhC9AAK\n editor.on(\"init\", () => {\n editor.focus();\n editor.selection.select(editor.getBody(), true);\n editor.selection.collapse(false);\n });\n };\n\n componentDidUpdate(prevProps) {\n if (this.props.editMode && !prevProps.editMode && this.ref.current) {\n this.focusOnEditor();\n }\n this.setEditorRefInParent();\n }\n\n setEditorRefInParent() {\n if (typeof this.props.getEditor === \"function\" && this.ref.current) {\n this.props.getEditor(this.ref.current.editor);\n }\n }\n\n render() {\n const { initialValue, editMode, height, className, disabled } = this.props;\n const init = this.props.init || {};\n return (\n
\n {\n editMode &&\n \n }\n
\n
\n );\n }\n}\n\nRichTextEditor.propTypes = {\n initialValue: PropTypes.string,\n editMode: PropTypes.bool,\n getEditor: PropTypes.func,\n className: PropTypes.string,\n disabled: PropTypes.bool,\n height: PropTypes.number\n};\n\nexport default RichTextEditor;\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\n\nimport \"./style.scss\";\n\nimport { ROOT_ROUTE } from \"../../constants/routes\";\nimport { WordMark } from \"../widgets\";\nimport { SearchBar, Usermenu } from \"../\";\n\nconst Header = props => {\n let { children } = props;\n\n return (\n
\n
\n
\n \n \n

Negotiator's Handbook

\n \n
\n\n \n
\n
\n \n
\n {children}\n
\n );\n};\n\nexport default Header;\n","/**\n * @module constants/routes\n * @desc exported const data representing the front end routes\n */\nexport const ROOT_ROUTE = \"/\";\n\n//////////////////////////////////////////////////////////////////////\n// LOGIN ROUTES //////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////\nexport const LOGIN_ROUTE = \"/login\";\n\nexport const UNREGISTERED_ROUTE = '/unregistered';\n\n//////////////////////////////////////////////////////////////////////\n// TAGS ROUTES ///////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////\nexport const TAG_ROUTE_PREFIX = \"/tag/\";\nexport const TAG_ROUTE = TAG_ROUTE_PREFIX + \":id\";\n\nexport const TAG_LIST_ROUTE = \"/admin/tags\";\n\nexport const TAG_EDIT_ROUTE_PREFIX = \"/admin/tags/edit/\";\nexport const TAG_EDIT_ROUTE = TAG_EDIT_ROUTE_PREFIX + \":id\";\n\nexport const TAG_DELETE_ROUTE_PREFIX = \"/admin/tags/delete/\";\nexport const TAG_DELETE_ROUTE = TAG_DELETE_ROUTE_PREFIX + \":id\";\n\nexport const TAG_CREATE_ROUTE = \"/admin/tags/create/\";\n//////////////////////////////////////////////////////////////////////\n// CATEGORY ROUTES ///////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////\nexport const CATEGORY_ROUTE_PREFIX = \"/category/\";\nexport const CATEGORY_ROUTE = CATEGORY_ROUTE_PREFIX + \":id\";\n\nexport const CATEGORY_LIST_ROUTE = \"/admin/categories\";\n\nexport const CATEGORY_EDIT_ROUTE_PREFIX = \"/admin/categories/edit/\";\nexport const CATEGORY_EDIT_ROUTE = CATEGORY_EDIT_ROUTE_PREFIX + \":id\";\n\nexport const CATEGORY_CREATE_ROUTE = \"/admin/categories/create/\";\n//////////////////////////////////////////////////////////////////////\n// USERS ROUTES///////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////\nexport const USERS_ROUTE = \"/admin/users\";\n\nexport const USERS_DELETE_ROUTE_PREFIX = \"/admin/users/delete/\";\nexport const USERS_DELETE_ROUTE = USERS_DELETE_ROUTE_PREFIX + \":id\";\n\nexport const USERS_EDIT_ROUTE_PREFIX = \"/admin/users/edit/\";\nexport const USERS_EDIT_ROUTE = USERS_EDIT_ROUTE_PREFIX + \":id\";\n\n//////////////////////////////////////////////////////////////////////\n// ISSUES ROUTES /////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////\nexport const ISSUE_ROUTE_PREFIX = \"/issue/\";\nexport const ISSUE_ROUTE = ISSUE_ROUTE_PREFIX + \":id\";\nexport const ISSUE_LIST_ROUTE = \"/admin/issues\";\nexport const ISSUE_CREATE_ROUTE = \"/admin/issues/create\";\n\nexport const ISSUE_VERSION_ROUTE_PREFIX = \"/version/\";\nexport const ISSUE_VERSION_ROUTE = ISSUE_ROUTE + ISSUE_VERSION_ROUTE_PREFIX + \":versionId\";\n\n//////////////////////////////////////////////////////////////////////\n// SEARCH ROUTES /////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////\nexport const SEARCH_ROUTE = \"/search/\";\n\n//////////////////////////////////////////////////////////////////////\n// PROFILE ROUTES /////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////\nexport const PROFILE_EDIT_ROUTE = \"/profile/edit/\";\n","import React from \"react\";\nimport \"./style.scss\";\n\nconst Footer = props => {\n const year = new Date().getFullYear();\n return (\n
\n © University of California, {year}\n
\n );\n};\n\nexport default Footer;\n","export const LOAD_USER = 'LOAD_USER';\n\nexport const ADD_USER = 'ADD_USER';\n\nexport const SET_USER_LIST_LOADING_STATUS = 'SET_USER_LIST_LOADING_STATUS';\nexport const LOAD_USER_LIST = 'LOAD_USER_LIST';\n\nexport const SET_USER_ACTION_SUCCESS_MESSAGE = 'SET_USER_ACTION_SUCCESS_MESSAGE';\nexport const SET_USER_ACTION_ERROR = 'SET_USER_ACTION_ERROR';\nexport const SET_USER_ACTION_LOADING_STATUS = 'SET_USER_ACTION_LOADING_STATUS';\nexport const SET_USER_ACTION_UPDATING_STATUS = 'SET_USER_ACTION_UPDATING_STATUS';\n\n","export const LOGOUT_USER = 'LOGOUT_USER';\nexport const SET_LOGIN_LOADING_STATUS = 'SET_LOGIN_LOADING_STATUS';\nexport const SET_CURRENT_USER_ATTRIBUTES = 'SET_CURRENT_USER_ATTRIBUTES';\n","export const LOAD_CATEGORY_LIST = 'LOAD_CATEGORY_LIST';\nexport const SET_CATEGORY_LIST_LOADING_STATUS = 'SET_CATEGORY_LOADING_STATUS';\nexport const LOAD_CATEGORY_ISSUE_LIST = 'LOAD_CATEGORY_ISSUE_LIST';\nexport const SET_CATEGORY_ISSUE_LIST_LOADING_STATUS = 'SET_CATEGORY_ISSUE_LIST_LOADING_STATUS';\nexport const SET_CATEGORY_ACTION_LOADING_STATUS = 'SET_CATEGORY_ACTION_LOADING_STATUS';\n","export const LOAD_ISSUE_LIST = 'LOAD_ISSUE_LIST';\nexport const SET_ISSUE_LIST_LOADING_STATUS = 'SET_ISSUE_LIST_LOADING_STATUS';\nexport const LOAD_SINGLE_ISSUE = 'LOAD_SINGLE_ISSUE';\nexport const SET_SINGLE_ISSUE_LOADING_STATUS = 'SET_SINGLE_ISSUE_LOADING_STATUS';\nexport const SET_SINGLE_ISSUE_UPDATING_STATUS = 'SET_SINGLE_ISSUE_UPDATING_STATUS';\nexport const SET_NAV_SECTION_VISIBLE = 'SET_NAV_SECTION_VISIBLE';\nexport const SET_SECTION_EDIT_STATUS = 'SET_SECTION_EDIT_STATUS';\nexport const LOAD_PREVIOUS_VERSION = 'LOAD_PREVIOUS_VERSION';\n","export const LOAD_CAMPUS_LIST = 'LOAD_CAMPUS_LIST';\nexport const SET_CAMPUS_LIST_LOADING_STATUS = 'SET_CAMPUS_LIST_LOADING_STATUS';\n","export const SET_ERRORS = 'SET_ERRORS';\nexport const PUSH_ERRORS = 'PUSH_ERRORS';\nexport const SET_SUCCESS_MESSAGE = 'SET_SUCCESS_MESSAGE';\nexport const SET_MODAL_MESSAGE_STATUS = 'SET_MODAL_MESSAGE_STATUS';\n","export const LOAD_SEARCH_RESULTS = 'LOAD_SEARCH_RESULTS';\nexport const SET_SEARCH_STATUS = 'SET_SEARCH_STATUS';\nexport const SET_SEARCH_STRING = 'SET_SEARCH_STRING';\n","export const LOAD_TAG_LIST = 'LOAD_TAG_LIST';\nexport const SET_TAG_LIST_LOADING_STATUS = 'SET_TAG_LIST_LOADING_STATUS';\nexport const SET_TAG_ACTION_LOADING_STATUS = 'SET_TAG_ACTION_LOADING_STATUS';\n","/**\n * @module actions/messages-actions\n * @desc redux actions related to setting error and success messages. These will mostly be dispatched by other actions\n */\n\nimport {\n SET_ERRORS,\n PUSH_ERRORS,\n SET_SUCCESS_MESSAGE,\n SET_MODAL_MESSAGE_STATUS\n} from '../constants/action-types';\n\n/**\n * Redux action to set the global error text\n * @function\n * @param {Array.|node} errors a single react node (jsx or string) or array of nodes\n */\nexport const setErrors = errors => {\n errors = Array.isArray(errors) ? errors : [errors];\n return {\n type: SET_ERRORS,\n errors\n }\n};\n\n/**\n * Redux action to append to the global error text\n * @function\n * @param {Array.|node} errors a single react node (jsx or string) or array of nodes\n */\nexport const pushErrors = errors => {\n errors = Array.isArray(errors) ? errors : [errors];\n return {\n type: PUSH_ERRORS,\n errors\n }\n};\n\n/**\n * Redux action to clear the global error text\n * @function\n */\nexport const resetErrors = () => ({\n type: SET_ERRORS,\n errors: []\n});\n\n/**\n * Redux action set the global success text\n * @function\n * @param {node} successMessage a react node (jsx or string)\n */\nexport const setSuccessMessage = successMessage => ({\n type: SET_SUCCESS_MESSAGE,\n successMessage\n});\n\n/**\n * Redux action to clear the global success text\n * @function\n */\nexport const resetSuccessMessage = () => ({\n type: SET_SUCCESS_MESSAGE,\n successMessage: null\n});\n\n/**\n * Redux action to indicate whether we are in a modal context. This should not really be needed outside of the modal component.\n * @function\n * @param {boolean} inModal\n */\nexport const setModalMessageStatus = inModal => ({\n type: SET_MODAL_MESSAGE_STATUS,\n inModal\n});\n\n/**\n * Thunk action to clear both the global error and global success text\n * @function\n */\nexport const resetAllMessages = () => dispatch => {\n dispatch(resetErrors());\n dispatch(resetSuccessMessage());\n};\n","/* eslint-disable */\n// WARNING: DO NOT EDIT. This file is automatically generated by AWS Amplify. It will be overwritten.\n\nconst awsmobile = {\n \"aws_project_region\": \"us-west-2\",\n \"aws_cognito_identity_pool_id\": \"us-west-2:19ce8051-3f93-420d-9c59-c9f82a3e0bb1\",\n \"aws_cognito_region\": \"us-west-2\",\n \"aws_user_pools_id\": \"us-west-2_SlC1RbWsp\",\n \"aws_user_pools_web_client_id\": \"1ogmdrbltu42jg7fag7ekccj05\",\n \"oauth\": {\n \"domain\": \"was-nhb-newprod.auth.us-west-2.amazoncognito.com\",\n \"redirectSignIn\": \"https://negotiators-handbook.ucop.edu/\",\n \"redirectSignOut\": \"https://negotiators-handbook.ucop.edu/\",\n \"responseType\": \"code\"\n },\n \"federationTarget\": \"COGNITO_USER_POOLS\",\n \"aws_appsync_graphqlEndpoint\": \"https://grkkn7po5bel5cqqak7xxaecye.appsync-api.us-west-2.amazonaws.com/graphql\",\n \"aws_appsync_region\": \"us-west-2\",\n \"aws_appsync_authenticationType\": \"AMAZON_COGNITO_USER_POOLS\",\n \"aws_cloud_logic_custom\": [\n {\n \"name\": \"nhbusersapi\",\n \"endpoint\": \"https://vmvcuws4v8.execute-api.us-west-2.amazonaws.com/newprod\",\n \"region\": \"us-west-2\"\n }\n ]\n};\n\n\nexport default awsmobile;\n","import awsmobile from '../_aws-exports';\n\nexport const awsConf = {\n CognitoRegion: awsmobile.aws_cognito_region,\n UserPoolId: awsmobile.aws_user_pools_id,\n ClientId: awsmobile.aws_user_pools_web_client_id,\n IdentityPoolId: awsmobile.aws_cognito_identity_pool_id,\n OauthDetails: awsmobile.oauth,\n};\n\n\nexport const GRAPHQL_ENDPOINT = awsmobile.aws_appsync_graphqlEndpoint;\n\n\nexport const USERS_ENDPOINT = awsmobile.aws_cloud_logic_custom[0].endpoint + '/users';\n\n\n\nconst NHB_LOGO = `\n _____ _____ _____\n| | | | | __ |\n| | | | | __ -|\n|_|___|__|__|_____|\n`;\n\nconst AWS_INFO = `\n----- AWS INFO -------------------\nuser pool id : ${awsConf.UserPoolId}\nclient id : ${awsConf.ClientId}\ngql endpoint : ${GRAPHQL_ENDPOINT}\nusers endpoint: ${USERS_ENDPOINT}\n----------------------------------\n`;\n\n// all of the REACT_APP_ vars get set by the bitbucket pipeline\nconst BUILD_INFO = `\n----- BUILD INFO -----------------\nbranch : ${process.env.REACT_APP_BRANCH}\ncommit : ${process.env.REACT_APP_COMMIT}\nbuild number : ${process.env.REACT_APP_BUILD_NUMBER}\n----------------------------------\n`;\n\nconsole.log(\n NHB_LOGO,\n AWS_INFO\n);\n","/**\n * @module api/cognito\n * @desc Various functions that interact with the cognito user pool\n */\n\nimport {\n CognitoUserPool,\n} from \"amazon-cognito-identity-js\";\n\nimport { awsConf } from \"../config/awsConfig\";\n\nimport {\n UNABLE_TO_LOAD_USER_ERROR,\n makeGenericErrorMessage\n} from \"../constants/errors\";\n\nimport { ALL_ROLES } from '../constants';\n\nimport {\n isDev\n} from '../utils';\n\n/**\n * Gets the current cognito user using the data from local storage\n * @function\n * @returns {CognitoUser}\n */\nexport const getCurrentCognitoUser = () => {\n const userPool = new CognitoUserPool(awsConf);\n return userPool.getCurrentUser();\n};\n\n/**\n * Gets the current cognito user's attributes.\n * @function\n * @returns {Promise}\n */\nexport const getCurrentCognitoUserAttributes = () =>\n getCurrentCognitoUserWithSession().then(user => {\n const { idToken } = user.signInUserSession;\n const attributes = idToken.payload;\n const groups = attributes['cognito:groups'];\n if (groups) {\n attributes.role = groups.find(group => {\n return ALL_ROLES.find(r => r === group);\n });\n }\n\n return attributes;\n });\n\nif (isDev()) {\n window.getCurrentCognitoUserAttributes = () => {\n getCurrentCognitoUserAttributes().then(console.log, console.log);\n };\n}\n\n/**\n * Gets the current cognito user with up to date session info\n * @function\n * @returns {Promise}\n */\nconst getCurrentCognitoUserWithSession = () => new Promise((resolve, reject) => {\n const cognitoUser = getCurrentCognitoUser();\n if (!cognitoUser) {\n // TODO error handling\n reject();\n return;\n }\n\n cognitoUser.getSession((error, session) => {\n if (error) {\n switch (error.code) {\n default:\n reject([\n UNABLE_TO_LOAD_USER_ERROR,\n makeGenericErrorMessage({context: 'get user session', error})\n ]);\n }\n return;\n }\n\n resolve(cognitoUser);\n });\n});\n/**\n * Gets the current user's id token for use in authed api calls\n * @function\n * @returns {string|null} token\n */\nexport const getCurrentCognitoUserTokens = () => getCurrentCognitoUserWithSession().then(user => {\n const { idToken, accessToken } = user.signInUserSession;\n return {\n idToken: idToken.getJwtToken(),\n accessToken: accessToken.getJwtToken()\n };\n});\n\nif (isDev()) {\n window.getTokens = () => {\n getCurrentCognitoUserTokens().then(console.log, console.log);\n };\n}\n","export const MISSING_EMAIL_ERROR = 'Email cannot be blank';\nexport const MISSING_PASSWORD_ERROR = 'Password cannot be blank';\nexport const INVALID_LOGIN_ERROR = 'Your username or password is incorrect';\nexport const INVALID_RESET_CODE_ERROR = 'Your reset code is invalid';\nexport const MISSING_RESET_CODE_ERROR = 'Reset code cannot be blank';\n\nexport const MISSING_PASSWORD_CONFIRMATION_ERROR = 'Please confirm your password';\nexport const MISMATCHED_PASSWORD_ERROR = 'Passwords must match';\nexport const WEAK_PASSWORD_ERROR = 'Please ensure that your password meets the given criteria';\n\nexport const EMAIL_NOT_FOUND_ERROR = 'We can\\'t find an account with that email address';\n\nexport const UNABLE_TO_LOGIN_ERROR = 'We are unable to log you in at this time.';\nexport const UNABLE_TO_RESET_PASSWORD_ERROR = 'We are unable to reset you password at this time.';\nexport const UNABLE_TO_CHANGE_PASSWORD_ERROR = 'We are unable to reset you password at this time.';\nexport const UNABLE_TO_LOAD_USER_ERROR = 'We are unable to load your user info at this time.';\n","/**\n * @module api/users\n * @desc Methods for making api calls related to user management (user sessions are handled by api/cognito)\n */\n\nimport { authFetch } from './';\nimport {\n UNABLE_TO_LOAD_LIST_ERROR,\n UNABLE_TO_UPDATE_USER_ERROR,\n UNABLE_TO_DELETE_USER_ERROR,\n makeGenericErrorMessage\n} from '../constants/errors';\nimport { USERS_ENDPOINT } from '../config/awsConfig';\n\n/**\n * Makes an authed GET call to the users endpoint to retrieve a list of all NHB users\n * @function\n * @returns {Promise}\n */\nexport const fetchUserList = () => authFetch(USERS_ENDPOINT)\n .then(res =>{\n return res.data\n })\n .catch(error => {\n // TODO respond to error info if we get that sorted on the backend\n const errors = [\n UNABLE_TO_LOAD_LIST_ERROR,\n makeGenericErrorMessage({context: 'user list', error})\n ];\n throw(errors);\n });\n\n/**\n * Makes an authed PUT call to the users endpoint to update an NHB user\n * @function\n * @param {object} userData\n * @param {string} userData.email\n * @param {string} userData.firstname\n * @param {string} userData.lastname\n * @param {string} userData.campus\n * @param {string} userData.role\n * @returns {Promise}\n */\nexport const updateUser = userData => {\n const { id, firstname, lastname, campusid, role } = userData;\n\n return authFetch(USERS_ENDPOINT, {\n method: 'PUT',\n body: JSON.stringify({\n username: id,\n first_name: firstname,\n last_name: lastname,\n campus_id: campusid,\n role\n })\n }).catch(error => {\n const errors = [\n UNABLE_TO_UPDATE_USER_ERROR,\n makeGenericErrorMessage({context: 'update user', error})\n ];\n throw(errors);\n });\n};\n\n\n/**\n * Makes an authed DELTE call to the users endpoint to delete an NHB user\n * @function\n * @param {string} email\n * @returns {Promise}\n */\nexport const deleteUser = id => {\n return authFetch(USERS_ENDPOINT, {\n method: 'DELETE',\n body: JSON.stringify({\n id\n })\n }).catch(error => {\n const errors = [\n UNABLE_TO_DELETE_USER_ERROR,\n makeGenericErrorMessage({context: 'delete user', error})\n ];\n throw(errors);\n });\n};\n\nexport const getCurrentUserRole = () => {\n return authFetch(USERS_ENDPOINT + '/myrole').then(role => role.data);\n}\n","/**\n * @module api/campuses\n * @desc Campus related api functions. Probably just used for getting a list of campuses\n */\n\nimport { gqlQuery } from './';\nimport {\n CAMPUS_LIST_ERROR,\n GQL_NULL_RESPONSE_ERROR,\n makeGenericErrorMessage\n} from '../constants/errors';\n\nimport {\n isDev\n} from '../utils';\n\nconst LIST_CAMPUS_QUERY = `\nquery ListCampuses {\n listCampuss(limit: 1000) {\n items {\n id,\n short_name,\n long_name,\n }\n }\n}\n`;\n\n/**\n * Makes an authed api call to the grapql endpoint to retrieve a list of campuses\n * @function\n * @returns {Promise}\n */\nexport const fetchCampusList = () => gqlQuery(LIST_CAMPUS_QUERY)\n .then(res => {\n if (!res.listCampuss.items) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.listCampuss.items;\n })\n .catch(res => {\n const errors = [\n CAMPUS_LIST_ERROR,\n makeGenericErrorMessage({context: 'campus list', error: res.errors})\n ];\n throw(errors);\n });\n\nif (isDev()) {\n window.fetchCampusList = () => {\n fetchCampusList().then(console.log, console.log);\n };\n}\n","export const CAMPUS_LIST_ERROR = 'Unable to load campus data.';\n","/**\n * @module api/categories\n * @desc Category related api functions.\n */\n\nimport { gqlQuery } from './';\nimport {\n CATEGORY_LIST_ERROR,\n CATEGORY_VIEW_ERROR,\n CATEGORY_UPDATE_ERROR,\n CATEGORY_CREATE_ERROR,\n GQL_NULL_RESPONSE_ERROR,\n makeGenericErrorMessage\n} from '../constants/errors';\n\nimport {\n isDev\n} from '../utils';\n\n// TODO we need to get issue counts for the category query\nconst LIST_CATEGORY_QUERY =`\nquery ListCategories {\n listCategorys (limit: 1000) {\n items {\n id,\n name\n records {\n items {\n id\n }\n }\n }\n }\n}`;\n\n/**\n * Makes an authed call to the graphql endpoint to retrieve a list of campuses\n * @function\n * @returns {Promise}\n */\nexport const fetchCategoryList = () => gqlQuery(LIST_CATEGORY_QUERY)\n .then(res => {\n if (!res.listCategorys.items) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.listCategorys.items\n })\n .catch(res => {\n const errors = [\n CATEGORY_LIST_ERROR,\n makeGenericErrorMessage({context: 'category list', error: res.errors})\n ];\n throw(errors);\n });\n\nif (isDev()) {\n window.fetchCategoryList = () => {\n fetchCategoryList().then(console.log, console.log);\n };\n}\n\n\nconst GET_CATEGORY_ISSUE_NAMES_QUERY = `\nquery ($id: ID!) {\n getCategory (id: $id) {\n records {\n items {\n title,\n id,\n published\n }\n }\n }\n}\n`;\n\n/**\n * Makes an authed call to the graphql endpoint to retrieve a list of issues for a given category\n * @function\n * @param {string} categoryId\n * @returns {Promise}\n */\nexport const fetchIssueListForCategory = categoryId =>\n gqlQuery(GET_CATEGORY_ISSUE_NAMES_QUERY, {id: categoryId})\n .then(res => {\n if (!(res.getCategory.records && res.getCategory.records.items)) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.getCategory.records.items\n })\n .catch(res => {\n const errors = [\n CATEGORY_VIEW_ERROR,\n makeGenericErrorMessage({context: 'issue list for category', error: res.errors})\n ];\n throw(errors);\n });\n\nif (isDev()) {\n window.fetchIssueListForCategory = categoryId => {\n fetchIssueListForCategory(categoryId).then(console.log, console.log);\n };\n}\n\nconst UPDATE_CATEGORY_MUTATION = `\nmutation UpdateCategory ($id: ID!, $name: String!){\n updateCategory(input: {\n id: $id,\n name: $name\n }) {\n id,\n name\n }\n}\n`;\n\n/**\n * Makes an authed call to the graphql endpoint to update a category's name\n * @function\n * @param {string} categoryData\n * @param {string} categoryData.id\n * @param {string} categoryData.name\n * @returns {Promise}\n */\nexport const updateCategory = categoryData =>\n gqlQuery(UPDATE_CATEGORY_MUTATION, {id: categoryData.id, name: categoryData.name.trim()})\n .then(res => {\n if (!res.updateCategory) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.updateCategory\n })\n .catch(res => {\n const errors = [\n CATEGORY_UPDATE_ERROR,\n makeGenericErrorMessage({context: 'category update', error: res.errors})\n ];\n throw(errors);\n });\n\nif (isDev()) {\n window.updateCategory = categoryData => {\n updateCategory(categoryData).then(console.log, console.log);\n };\n}\n\nconst CREATE_CATEGORY_MUTATION = `\nmutation CreateCategory ($name: String!){\n createCategory(input:{\n name: $name\n }) {\n id\n name\n }\n}\n`;\n\n/**\n * Makes an authed call to the graphql endpoint to create a new category\n * @function\n * @param {string} categoryData\n * @param {string} categoryData.name\n * @returns {Promise}\n */\nexport const createCategory = categoryData =>\n gqlQuery(CREATE_CATEGORY_MUTATION, { name: categoryData.name.trim() })\n .then(res => {\n if (!res.createCategory) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.createCategory;\n })\n .catch(res => {\n const errors = [\n CATEGORY_CREATE_ERROR,\n makeGenericErrorMessage({context: 'category create', error: res.errors})\n ];\n throw(errors);\n });\n\nif (isDev()) {\n window.createCategory = categoryData => {\n createCategory(categoryData).then(console.log, console.log);\n };\n}\n","/**\n * @module api/tags\n * @desc Category related api functions.\n */\n\nimport { gqlQuery } from './';\nimport {\n TAG_LIST_ERROR,\n SINGLE_TAG_ERROR,\n TAG_CREATE_ERROR,\n TAG_UPDATE_ERROR,\n TAG_DELETE_ERROR,\n GQL_NULL_RESPONSE_ERROR,\n makeGenericErrorMessage\n} from '../constants/errors';\n\nimport {\n isDev\n} from '../utils';\n\nconst LIST_TAGS_QUERY =`\nquery ListTags {\n listTags(limit: 10000) {\n items {\n id\n name\n records(limit: 1000) {\n items {\n record {\n id\n published\n title\n category {\n id\n name\n }\n }\n }\n }\n }\n }\n}`;\n\n/**\n * Makes an authed call to the graphql endpoint to retrieve a list of tags\n * @function\n * @returns {Promise}\n */\nexport const fetchTagList = () => gqlQuery(LIST_TAGS_QUERY)\n .then(res => {\n if (!res.listTags.items) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.listTags.items\n })\n .catch(res => {\n const errors = [\n TAG_LIST_ERROR,\n makeGenericErrorMessage({context: 'tag list', error: res.errors})\n ];\n throw(errors);\n });\n\nif (isDev()) {\n window.fetchTagList = () => {\n fetchTagList().then(console.log, console.log);\n };\n}\n\nconst GET_SINGLE_TAG_QUERY = `\nquery GetTag ($id: ID!) {\n getTag(id: $id) {\n id\n name\n records(limit: 1000) {\n items {\n id\n }\n }\n }\n}\n`;\n\n/**\n * Makes an authed call to the graphql endpoint to fetch the data for a single tag\n * @function\n * @param {string} tagId\n * @returns {Promise}}\n */\nexport const fetchSingleTag = tagId => gqlQuery(GET_SINGLE_TAG_QUERY, { id: tagId })\n .then(res => {\n if (!res.getTag) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.getTag\n })\n .catch(res => {\n const parsedErrors = res.errors.map(error => {\n switch (error.errorType) {\n default:\n return makeGenericErrorMessage({context: 'tag', error});\n }\n });\n parsedErrors.unshift(SINGLE_TAG_ERROR);\n throw(parsedErrors);\n });\n\nif (isDev()) {\n window.fetchSingleTag = tagId => {\n fetchSingleTag(tagId).then(console.log, console.log);\n };\n}\n\nconst CREATE_TAG_MUTATION = `\nmutation CreateTag ($name: String!) {\n createTag(input: {\n name: $name\n }) {\n id\n name\n }\n}\n`;\n\n/**\n * Makes an authed call to the graphql endpoint to create a new tag\n * @function\n * @param {string} tagData\n * @param {string} tagData.name\n * @returns {Promise}\n */\nexport const createTag = tagData =>\n gqlQuery(CREATE_TAG_MUTATION, { name: tagData.name.trim() })\n .then(res => {\n if (!res.createTag) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.createTag;\n })\n .catch(res => {\n const errors = [\n TAG_CREATE_ERROR,\n makeGenericErrorMessage({context: 'tag create', error: res.errors})\n ];\n throw(errors);\n });\n\nif (isDev()) {\n window.createTag = tagData => {\n createTag(tagData).then(console.log, console.log);\n };\n}\n\nexport const BATCH_CREATE_RECORD_TAG_MUTATION = `\nmutation BatchCreateRecordTags ($tags: [CreateRecordTagInput]) {\n batchCreateRecordTag(recordtags: $tags) {\n id\n }\n}\n`;\n\nexport const batchCreateRecordTags = tagArray =>\n gqlQuery(BATCH_CREATE_RECORD_TAG_MUTATION, { tags: tagArray })\n .then(res => {\n if (!res.batchCreateRecordTag) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.batchCreateRecordTag;\n })\n .catch(res => {\n const errors = [\n TAG_CREATE_ERROR,\n makeGenericErrorMessage({context: 'batch record tag create', error: res.errors})\n ];\n throw(errors);\n });\n\nif (isDev()) {\n window.batchCreateRecordTags = tagArray => {\n batchCreateRecordTags(tagArray).then(console.log, console.log);\n };\n}\n\nexport const BATCH_DELETE_RECORD_TAGS_MUTATION = `\nmutation BatchDeleteRecordTags($ids: [ID]) {\n batchDeleteRecordTag(ids: $ids) {\n id\n }\n}\n`;\n\nexport const batchDeleteRecordTags = idArray =>\n gqlQuery(BATCH_DELETE_RECORD_TAGS_MUTATION, { ids: idArray })\n .then(res => {\n if (!res.batchDeleteRecordTag) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.batchDeleteRecordTag;\n })\n .catch(res => {\n const errors = [\n TAG_DELETE_ERROR,\n makeGenericErrorMessage({context: 'batch record tag delete', error: res.errors})\n ];\n throw(errors);\n });\n\nif (isDev()) {\n window.batchDeleteRecordTags = idArray => {\n batchDeleteRecordTags(idArray).then(console.log, console.log);\n };\n}\n\nconst UPDATE_TAG_MUTATION = `\nmutation UpdateTag ($id: ID!, $name: String!){\n updateTag(input: {\n id: $id,\n name: $name\n }) {\n id,\n name\n }\n}\n`;\n\n/**\n * Makes an authed call to the graphql endpoint to update a tag's name\n * @function\n * @param {string} tagData\n * @param {string} tagData.id\n * @param {string} tagData.name\n * @returns {Promise}\n */\nexport const updateTag = tagData =>\n gqlQuery(UPDATE_TAG_MUTATION, {id: tagData.id, name: tagData.name.trim()})\n .then(res => {\n if (!res.updateTag) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.updateTag\n })\n .catch(res => {\n const errors = [\n TAG_UPDATE_ERROR,\n makeGenericErrorMessage({context: 'tag update', error: res.errors})\n ];\n throw(errors);\n });\n\nif (isDev()) {\n window.updateTag = tagData => {\n updateTag(tagData).then(console.log, console.log);\n };\n}\n\nconst DELETE_TAG_MUTATION = `\nmutation DeleteTag($id: ID!) {\n deleteTag(input:{\n id: $id\n }) {\n id\n name\n }\n}\n`;\n\n/**\n * Makes an authed call to the graphql endpoint to delete a tag\n * @function\n * @param {string} tagId\n * @returns {Promise}\n */\nexport const deleteTag = tagId =>\n gqlQuery(GET_SINGLE_TAG_QUERY, { id: tagId })\n .then(res => {\n if (!res.getTag) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n const tagDeleteData = res.getTag.records.items ? res.getTag.records.items.map(tag => tag.id) : [];\n const tagMutations = [gqlQuery(DELETE_TAG_MUTATION, { id: tagId })];\n if (tagDeleteData.length) {\n tagMutations.push(gqlQuery(BATCH_DELETE_RECORD_TAGS_MUTATION, {ids: tagDeleteData}));\n }\n return Promise.all(tagMutations).then(res => {\n const tag = res[0];\n if (!tag.deleteTag) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return tag.deleteTag;\n })\n })\n .catch(res => {\n const errors = [\n TAG_DELETE_ERROR,\n makeGenericErrorMessage({context: 'tag delete', error: res.errors})\n ];\n throw(errors);\n });\n\nif (isDev()) {\n window.deleteTag = tagId => {\n deleteTag(tagId).then(console.log, console.log);\n };\n}\n","/** @module api/issues\n * @desc Issues related api functions\n */\n\nimport { gqlQuery } from './';\n\nimport {\n ISSUE_LIST_ERROR,\n SINGLE_ISSUE_ERROR,\n GQL_NULL_RESPONSE_ERROR,\n CREATE_ISSUE_ERROR,\n UPDATE_ISSUE_ERROR,\n PREVIOUS_VERSION_ERROR,\n makeGenericErrorMessage\n} from '../constants/errors';\n\nimport {\n BATCH_CREATE_RECORD_TAG_MUTATION,\n BATCH_DELETE_RECORD_TAGS_MUTATION\n} from './tags';\n\nimport {\n isDev\n} from '../utils';\n\nconst LIST_ISSUES_QUERY = `\nquery listIssues {\n listRecords (limit: 10000) {\n items {\n id,\n title,\n published,\n category {\n id,\n name\n }\n }\n }\n}\n`;\n\n/**\n * Makes an authed call to the graphql endpoint to fetch the list of issues\n * @function\n * @returns {Promise}\n */\nexport const fetchIssueList = () => gqlQuery(LIST_ISSUES_QUERY)\n .then(res => {\n if (!res.listRecords.items) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.listRecords.items\n })\n .catch(res => {\n const parsedErrors = res.errors.map(error => {\n switch (error.errorType) {\n default:\n return makeGenericErrorMessage({context: 'issue list', error});\n }\n });\n parsedErrors.unshift(ISSUE_LIST_ERROR);\n throw(parsedErrors);\n });\n\nif (isDev()) {\n window.fetchIssueList = () => {\n fetchIssueList().then(console.log, console.log);\n };\n}\n\nconst GET_SINGLE_ISSUE_QUERY = `\nquery GetRecord ($id: ID!) {\n getRecord(id: $id) {\n agreement_language\n guidance\n id\n published\n rationale\n title\n campusGuidance {\n items {\n id\n guidance\n status\n campus {\n id\n long_name\n short_name\n }\n }\n }\n category {\n id\n name\n }\n versions(limit: 10000) {\n items {\n id\n updated_at\n updated_by\n }\n }\n tags(limit: 10000) {\n items {\n id\n tag {\n id\n name\n }\n }\n }\n }\n}\n`;\n\n\n/**\n * Makes an authed call to the graphql endpoint to fetch the data for a single issue\n * @function\n * @param {string} issueId\n * @returns {Promise}}\n */\nexport const fetchSingleIssue = issueId => gqlQuery(GET_SINGLE_ISSUE_QUERY, { id: issueId })\n .then(res => {\n if (!res.getRecord) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.getRecord\n })\n .catch(res => {\n const parsedErrors = res.errors.map(error => {\n switch (error.errorType) {\n default:\n return makeGenericErrorMessage({context: 'issue', error});\n }\n });\n parsedErrors.unshift(SINGLE_ISSUE_ERROR);\n throw(parsedErrors);\n });\n\nif (isDev()) {\n window.fetchSingleIssue = issueId => {\n fetchSingleIssue(issueId).then(console.log, console.log);\n };\n}\n\nconst GET_PREVIOUS_VERSION_QUERY = `\n query GetRecordVersion($id: ID!) {\n getRecordVersion(id: $id) {\n id,\n title,\n guidance,\n rationale,\n agreement_language,\n updated_at,\n updated_by,\n record {\n id\n }\n }\n }\n\n`;\n\nexport const fetchPreviousVersion = versionId =>\n gqlQuery(GET_PREVIOUS_VERSION_QUERY, { id: versionId })\n .then(res => {\n if (!res.getRecordVersion) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.getRecordVersion;\n })\n .catch(res => {\n const parsedErrors = res.errors.map(error => {\n switch(error.errorType) {\n default:\n return makeGenericErrorMessage({context: 'issue version', error});\n }\n });\n parsedErrors.unshift(PREVIOUS_VERSION_ERROR);\n throw(parsedErrors);\n });\n\nconst CREATE_ISSUE_MUTATION = `\n mutation CreateIssue ($title: String!, $categoryId: ID!) {\n createRecord(input: {\n title: $title,\n published: false,\n recordCategoryId: $categoryId,\n guidance: \"Please add some guidance\",\n rationale: \"Please add some rationale\",\n agreement_language: \"Please add some agreement language\"\n }) {\n id\n }\n }\n`;\n\nexport const createIssue = (issueData) =>\n gqlQuery(CREATE_ISSUE_MUTATION, { title: issueData.title, categoryId: issueData.categoryId})\n .then(res => {\n if (!res.createRecord) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.createRecord\n })\n .catch(res => {\n const parsedErrors = res.errors.map(error => {\n switch (error.errorType) {\n default:\n return makeGenericErrorMessage({context: 'create issue', error});\n }\n });\n parsedErrors.unshift(CREATE_ISSUE_ERROR);\n throw(parsedErrors);\n });\n\nif (isDev()) {\n window.createIssue = issueData => {\n createIssue(issueData).then(console.log, console.log);\n };\n}\n\nconst CREATE_ISSUE_VERSION_MUTATION = `\nmutation CreateIssueVersion ($id: ID!, $title: String!, $guidance: String!, $rationale: String!, $agreement_language: String!) {\n createRecordVersion(input: {\n recordVersionRecordId: $id,\n title: $title,\n guidance: $guidance,\n rationale: $rationale,\n agreement_language: $agreement_language\n }) {\n id\n }\n}\n`;\n\nconst UPDATE_ISSUE_MUTATION = `\nmutation UpdateIssue ($id: ID!, $published: Boolean!, $categoryId: ID!, $title: String!, $guidance: String!, $rationale: String!, $agreement_language: String!) {\n updateRecord(input: {\n id: $id,\n published: $published,\n recordCategoryId: $categoryId,\n title: $title,\n guidance: $guidance,\n rationale: $rationale,\n agreement_language: $agreement_language,\n }) {\n id,\n title,\n published,\n agreement_language,\n guidance,\n rationale,\n category {\n id,\n name\n },\n tags(limit: 10000) {\n items {\n id\n tag {\n id\n name\n }\n }\n },\n versions (limit: 10000) {\n items {\n id,\n updated_at,\n updated_by\n }\n },\n campusGuidance {\n items {\n id,\n guidance,\n status,\n campus {\n id,\n short_name,\n long_name\n }\n }\n },\n }\n}\n`;\n\nexport const updateIssue = (issueData) => {\n const updateData = {\n id: issueData.id,\n title: issueData.title,\n published: Boolean(issueData.published),\n // we want to use the recordCategoryId if we have one, but fall back to the issue's current\n // category's id when we don't\n categoryId: issueData.recordCategoryId || issueData.category.id,\n guidance: issueData.guidance,\n rationale: issueData.rationale,\n agreement_language: issueData.agreement_language\n };\n\n // check if we have tag stuff to change\n const tagDeleteData = issueData.tags.items ? issueData.tags.items.map(tag => tag.id) : [];\n const tagCreateData = issueData.tagIds ? issueData.tagIds.map(id => ({\n recordTagRecordId: issueData.id,\n recordTagTagId: id\n })) : [];\n\n // if we do push the promises onto an array\n const tagMutations = [];\n if (issueData.updateTags && tagDeleteData.length) {\n tagMutations.push(gqlQuery(BATCH_DELETE_RECORD_TAGS_MUTATION, {ids: tagDeleteData}));\n }\n\n if (issueData.updateTags && tagCreateData.length) {\n tagMutations.push(gqlQuery(BATCH_CREATE_RECORD_TAG_MUTATION, {tags: tagCreateData}));\n }\n\n // resolve tag promises (if any) then handle the normal issue update stuff.\n // The tag promises need to be resolved first otherwise the issue data returned by the\n // update issue mutation may have stale data due to race conditions\n return Promise.all(tagMutations).then(() => Promise.all([\n gqlQuery(UPDATE_ISSUE_MUTATION, updateData),\n gqlQuery(CREATE_ISSUE_VERSION_MUTATION, updateData)\n ])).then(res => {\n const issue = res[0];\n if (!issue.updateRecord) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return issue.updateRecord\n }).catch(res => {\n const combinedErrors = res.reduce((errors, item) => errors.concat(item), [])\n\n const parsedErrors = combinedErrors.map(error => {\n switch (error.errorType) {\n default:\n return makeGenericErrorMessage({context: 'update issue', error});\n }\n });\n parsedErrors.unshift(UPDATE_ISSUE_ERROR);\n throw(parsedErrors);\n });\n};\n\nif (isDev()) {\n window.updateIssue = issueData => {\n updateIssue(issueData).then(console.log, console.log);\n };\n}\n","import { gqlQuery } from \"./\";\nimport {\n GQL_NULL_RESPONSE_ERROR,\n CAMPUS_GUIDANCE_CREATE_ERROR,\n CAMPUS_GUIDANCE_UPDATE_ERROR,\n makeGenericErrorMessage\n} from '../constants/errors';\n\nimport { isDev } from '../utils';\n\n// here we want to get the full issue back when we update guidance\nconst UPDATE_CAMPUS_GUIDANCE_MUTATION = `\nmutation UpdateCampusGuidance ($id: ID!, $status: CampusGuidanceStatus!, $guidance: String!) {\n updateCampusGuidance(input: {\n id: $id,\n guidance: $guidance,\n status: $status\n }) {\n id,\n record {\n id,\n title,\n agreement_language,\n guidance,\n rationale,\n category {\n id,\n name\n },\n campusGuidance {\n items {\n id,\n status,\n guidance,\n campus {\n id,\n short_name,\n long_name\n }\n }\n }\n }\n }\n}\n`;\n\nexport const updateCampusGuidance = (cgData) =>\n gqlQuery(UPDATE_CAMPUS_GUIDANCE_MUTATION, {\n id: cgData.id,\n status: cgData.status,\n guidance: cgData.guidance\n }).then(res => {\n if (!(res.updateCampusGuidance && res.updateCampusGuidance.record)) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.updateCampusGuidance;\n }).catch(res => {\n const parsedErrors = res.errors.map(error => {\n switch (error.errorType) {\n default:\n return makeGenericErrorMessage({context: 'campus guidance update', error});\n }\n });\n parsedErrors.unshift(CAMPUS_GUIDANCE_UPDATE_ERROR);\n throw(parsedErrors);\n });\n\nif (isDev()) {\n window.updateCampusGuidance = data => {\n updateCampusGuidance(data).then(console.log, console.log);\n };\n}\n\nconst CREATE_CAMPUS_GUIDANCE_MUTATION = `\nmutation CreateCampusGuidance ($status: CampusGuidanceStatus!, $guidance: String!, $record_id: ID!, $campus_id: ID!) {\n createCampusGuidance(input: {\n campusGuidanceRecordId: $record_id,\n campusGuidanceCampusId: $campus_id,\n guidance: $guidance,\n status: $status\n }) {\n id,\n record {\n id,\n title,\n agreement_language,\n guidance,\n rationale,\n category {\n id,\n name\n },\n campusGuidance {\n items {\n id,\n guidance,\n status,\n campus {\n id,\n short_name,\n long_name\n }\n }\n }\n }\n }\n}\n`;\n\nexport const createCampusGuidance = (cgData) =>\n gqlQuery(CREATE_CAMPUS_GUIDANCE_MUTATION, {\n campus_id: cgData.campus_id,\n record_id: cgData.record_id,\n status: cgData.status,\n guidance: cgData.guidance\n }).then(res => {\n if (!(res.createCampusGuidance && res.createCampusGuidance.record)) {\n throw(GQL_NULL_RESPONSE_ERROR);\n }\n return res.createCampusGuidance;\n }).catch(res => {\n const parsedErrors = res.errors.map(error => {\n switch (error.errorType) {\n default:\n return makeGenericErrorMessage({context: 'campus guidance create', error});\n }\n });\n parsedErrors.unshift(CAMPUS_GUIDANCE_CREATE_ERROR);\n throw(parsedErrors);\n });\n\nif (isDev()) {\n window.createCampusGuidance = data => {\n createCampusGuidance(data).then(console.log, console.log);\n };\n}\n","import { gqlQuery } from './';\nimport { isDev } from '../utils';\nimport {\n TYPE_ISSUE,\n TYPE_CATEGORY,\n TYPE_CAMPUS_GUIDANCE,\n TYPE_TAG\n} from '../constants';\n\nimport {\n SEARCH_ERROR,\n makeGenericErrorMessage\n} from '../constants/errors';\n\nconst SEARCH_RECORD_QUERY = `\nquery SearchRecord ($term: String!) {\n searchRecords( filter : {\n or: [\n { title: { wildcard: $term } },\n { guidance: { wildcard: $term } },\n { rationale: { wildcard: $term } },\n { agreement_language: { wildcard: $term } },\n ]\n }, limit: 10000) {\n items {\n id,\n title,\n published,\n tags(limit: 10000) {\n items {\n tag {\n id,\n name\n }\n }\n }\n }\n }\n}\n`;\n\nconst SEARCH_CAMPUS_GUIDANCE_QUERY = `\nquery SearchCampusGuidance ($term: String!) {\n searchCampusGuidances( filter: {\n guidance: { wildcard: $term }\n }, limit: 10000) {\n items {\n record {\n id,\n title,\n published\n }\n }\n }\n}\n`;\n\nconst SEARCH_CATEGORY_QUERY = `\nquery SearchCategory ($term: String!) {\n searchCategorys ( filter : {\n name : { wildcard : $term }\n }, limit: 10000) {\n items {\n id,\n name\n }\n }\n}\n\n`;\n\nconst SEARCH_TAG_QUERY = `\nquery SearchTags ($term: String!) {\n searchTags(filter: {name: {wildcard: $term}}, limit: 10000) {\n items {\n id\n name\n records(limit: 10000) {\n items {\n record {\n id\n title\n published\n tags(limit: 10000) {\n items {\n tag {\n id\n name\n }\n }\n }\n }\n }\n }\n }\n }\n}\n`;\nconst SEARCH_QUERIES = {\n [TYPE_ISSUE]: SEARCH_RECORD_QUERY,\n [TYPE_CAMPUS_GUIDANCE]: SEARCH_CAMPUS_GUIDANCE_QUERY,\n [TYPE_CATEGORY]: SEARCH_CATEGORY_QUERY,\n [TYPE_TAG]: SEARCH_TAG_QUERY\n};\n\n/**\n * Makes several authed api calls to the graphql endpoint to search for a given string\n * @function\n * @returns {Promise}\n */\nexport const searchRecords = (term, searchTypes = []) => {\n const types = searchTypes.filter(type => {\n const isValidType = Boolean(SEARCH_QUERIES[type]);\n\n if (isDev() && !isValidType) {\n console.error(`${type} is not a valid search type`);\n }\n\n return isValidType;\n });\n const promises = types\n .map(type => SEARCH_QUERIES[type])\n .map(query => gqlQuery(query, { term: `*${term.toLowerCase()}*` }))\n\n return Promise.all(promises).then(res => {\n // we want to init our results object with empty arrays for all types since we aren't\n // necessarily always going to search for all types, but we do need to have them all\n // in the returned object\n const results = {\n [TYPE_ISSUE]: [],\n [TYPE_CAMPUS_GUIDANCE]: [],\n [TYPE_CATEGORY]: [],\n [TYPE_TAG]: []\n };\n\n types.forEach((type, idx) => {\n switch (type) {\n case TYPE_ISSUE:\n results[TYPE_ISSUE] = res[idx].searchRecords.items;\n break;\n case TYPE_CAMPUS_GUIDANCE:\n results[TYPE_CAMPUS_GUIDANCE] = res[idx].searchCampusGuidances.items\n .map(guidance => guidance.record);\n break;\n case TYPE_CATEGORY:\n results[TYPE_CATEGORY] = res[idx].searchCategorys.items\n .map(cat => ({id: cat.id, title: cat.name}));\n break;\n case TYPE_TAG:\n results[TYPE_TAG] = res[idx].searchTags.items\n .reduce((issues, tag) => issues.concat(tag.records.items.map(r => r.record)), []);\n break;\n default:\n break;\n }\n });\n\n return results;\n }).catch(res => {\n const errors = [\n SEARCH_ERROR,\n makeGenericErrorMessage({context: 'search', error: res.errors})\n ];\n throw(errors);\n });\n}\n\nif (isDev()) {\n window.searchRecords = (data, type) => {\n searchRecords(data, type).then(console.log, console.log);\n };\n}\n","export const SEARCH_ERROR = 'Unable to load search results';\n","/**\n * @module api\n * @desc Non-specific api functions\n */\n\nimport { getCurrentCognitoUserTokens } from './cognito';\nimport { GRAPHQL_ENDPOINT } from '../config/awsConfig';\n\nexport * from './cognito';\nexport * from './users';\nexport * from './campuses';\nexport * from './categories';\nexport * from './issues';\nexport * from './campus-guidance';\nexport * from './search';\nexport * from './tags';\n\n/**\n * A wrapped fetch method that inserts the necessary headers for making authed api calls.\n * It also examines the response to determine if there is error data in a 200 response.\n * Finally, it attempts to parse the data and return a js object version.\n * @function\n * @param {string} url the url of the target endpoint\n * @param {object} [params] any additional fetch params (custom headers, method, body, etc...)\n * @returns {Promise}\n */\nexport const authFetch = (url, params = {}) => {\n // TODO error messages/codes\n return getCurrentCognitoUserTokens().then(({idToken, accessToken}) => {\n if (params.headers) {\n params.headers.append('Authorization', idToken);\n params.headers.append('Access-Token', accessToken);\n params.headers.append('Content-Type', 'application/json');\n } else {\n params.headers = new Headers({\n 'Content-Type': 'application/json',\n 'Authorization': idToken,\n 'Access-Token': accessToken\n });\n }\n\n params.credentials = 'omit';\n\n const request = new Request(url, params);\n\n return fetch(request)\n .then(res => {\n // if we have a bad error code and no body content then bail out here\n if (!(res.body || res.ok)) {\n return Promise.reject(res);\n }\n\n return res.json();\n })\n .then(json => {\n if (\n json.errorMessage ||\n json.errors ||\n (json.statusCode >= 400)\n ) {\n return Promise.reject(json);\n }\n\n if (json.data) {\n return json.data;\n }\n\n if (json.body) {\n return JSON.parse(json.body);\n }\n\n return json;\n });\n });\n};\n\n\n/**\n * Makes an authed request to the graphql endpoint\n * @function\n * @param {string} query gprahql query string\n * @param {object|null} [variables] graphql variables. Can pass null if params are needed but variables are not\n * @param {object} [params] any additional fetch params (custom headers, etc...)\n * @returns {Promise}\n */\nexport const gqlQuery = (query, variables = {}, params = {}) => {\n // need to do this in case we do something like gqlQuery(\"...\", null, { ... });\n variables = (typeof variables === 'object') ? variables : {};\n const gqlParams = {\n ...params,\n method: 'POST',\n body: JSON.stringify({query, variables})\n };\n\n return authFetch(GRAPHQL_ENDPOINT, gqlParams).catch(error => {\n if (error instanceof TypeError) {\n // if it isn't a gql error then throw it in an array so we can deal with it later\n const errorObject = {\n errors: [{...error}]\n };\n throw(errorObject);\n } else {\n throw(error)\n }\n });\n};\n\nexport const fakeFetch = (duration = 1000, res = {}) => new Promise(resolve => {\n setTimeout(() => resolve(res), duration);\n});\n","/**\n * @module actions/session-actions\n * @desc Redux and thunk actions to handle session/login/logout related things\n// NOTE signing a user in and out is handled primarily by the Auth.js module. These actions are\n// for adding session status info to the store and verifying its presence\n */\nimport {\n LOGOUT_USER,\n SET_CURRENT_USER_ATTRIBUTES,\n} from \"../constants/action-types\";\n\nimport {\n getCurrentCognitoUser,\n getCurrentCognitoUserAttributes,\n} from \"../api\";\n\n\nimport {\n resetErrors,\n setErrors\n} from './';\n\nimport ReactGA from 'react-ga';\n\n/////////////////////\n// ACTION CREATORS //\n/////////////////////\n\nconst logout = () => ({ type: LOGOUT_USER });\n\nconst setCurrentUserAttributes = attributes => {\n ReactGA.set({userId: attributes.sub});\n return {\n type: SET_CURRENT_USER_ATTRIBUTES,\n attributes\n };\n};\n\n/////////////\n// ACTIONS //\n/////////////\n\n\n\n/**\n * Action to load an SSO user's into the Redux store. This gets called by Auth.js when the user logs in\n * @function\n*/\nexport const initializeUserSessionFromSSO = () => dispatch => {\n getCurrentCognitoUserAttributes().then(attributes => {\n dispatch(setCurrentUserAttributes(attributes));\n }).catch(errors => {\n dispatch(setErrors(errors))\n dispatch(endSession());\n }).finally(() => {\n });\n\n};\n\n/**\n * Action to clear the store. This has the affect of logging the current user out.\n * @function\n */\nexport const endSession = () => dispatch => {\n dispatch(logout());\n dispatch(resetErrors());\n};\n\n/**\n * Action to check if we have an active session. This is used to load user data into the store if we have a valid session\n * but not a 'currentUser'. This should typically only happen when a logged in users loads/refreshes the page.\n * This action also will redirect to the login screen if the user does not have a valid session. This part\n * of the action is used in the authenticated route component.\n * If we have a cognito user but no attributes we try to get them. If we have no cognito user we log out.\n * @function\n */\nexport const verifyCurrentUserSession = () => (dispatch, getState) => {\n const cognitoUser = getCurrentCognitoUser();\n if (cognitoUser) {\n // if we have a cognito user but no current user in the store then we need to try and add one\n // This could happen if a user logs in on another tab\n if (!getState().session.currentUser) {\n dispatch(initializeUserSessionFromSSO());\n }\n } else {\n // if we are not able to get a cognito user then we are for sure logged out\n // This can happen if a user logs out in another tab\n dispatch(endSession());\n }\n};\n\n/**\n * \n * @param {*} userData\n * @param userdData.firstname\n * @param userdData.lastname\n * @returns \n */\nexport const updateUserName = (userData) => (dispatch, getState) => {\n const { firstname, lastname } = userData;\n const currentUser = getState().session.currentUser;\n const updatedUser = {\n ...currentUser,\n given_name: firstname,\n family_name: lastname,\n \"custom:preferred_last_name\": lastname,\n \"custom:preferred_first_name\": firstname,\n };\n dispatch(setCurrentUserAttributes(updatedUser));\n\n const cognitoUser = getCurrentCognitoUser();\n cognitoUser.getSession((error, session) => {\n cognitoUser.refreshSession(session.refreshToken, (err, session) => {\n if (err) throw err;\n }); \n }); \n};\n","/**\n * @module constants/fragments\n * @desc exported cost data pertaining to longer bits of text and jsx fragments that we don't want to include inline in a component\n */\n\nimport React from 'react';\n\nexport * from './user-fragments';\nexport * from './category-fragments';\nexport * from './tag-fragments';\n\nexport const WELCOME_BLURB = (\n
\n

The UCOP Negotiator's Handbook is a collection of information useful to campus administrators negotiating sponsored research agreements. It is organized by common topics, which are labeled categories. Some categories are subdivided into issues as needed. All entries include UCOP guidance on UC's standard position, the rationale for that position, sample agreement language, and additional resources. Content is also searchable using smart tags which automatically link to related issues.

\n

Content in the \"Rationale\" section and acceptable terms from the \"Agreement Language\" section may be cited verbatim in negotiations. However, the remainder of the content should not be shared with anyone who does not have authorized access.

\n

Campuses will be able to add campus-specific content for each entry. Campus-specific content is only visible to users from that campus unless the campus chooses to share it with other campuses.

\n

Contacts:

\n \n
\n);\n\nexport const WELCOME_BLURB_UNAUTHED = (\n
\n

Your Negotiator's Handbook user account is currently pending. Please contact your campus's Location Access Coordinator for access.

\n
\n

For technical or other questions, please contact NHB@ucop.edu.

\n
\n);\n","/**\n * @module selectors/users\n * @desc Selectors for user data\n */\n\nimport { createSelector } from 'reselect';\nimport { getRoleName } from \"../utils\";\n\nconst makeUserFromData = userData => {\n const data = {...userData};\n if (data.Attributes) {\n data.Attributes.forEach(attr => {\n data[attr.Name] = attr.Value;\n });\n }\n let preferredFirstName = data[\"custom:preferred_first_name\"] || \"\";\n let preferredLastName = data[\"custom:preferred_last_name\"] || \"\";\n\n const user = {\n firstName: data.given_name || \"\",\n lastName: data.family_name || \"\",\n name: `${preferredFirstName} ${preferredLastName}`,\n email: data.email,\n role: data.role || data.groupName,\n confirmed: data.role || data.groupName,\n roleName: getRoleName(data.role || data.groupName) || '- UNREGISTERED -',\n campusId: data[\"custom:campus_id\"] || data.campus_id,\n // the || is to handle the differences between our lambda api user data and the cognito api user data\n id: data.Username || data.sub,\n userName: data[\"cognito:username\"] || data.username,\n preferredFirstName: preferredFirstName,\n preferredLastName: preferredLastName\n };\n return user;\n}\n\nconst campusListData = state => state.campuses.data;\nconst currentUserData = state => state.session.currentUser;\n\n/**\n * Gets a formatted version of the current user from the store\n * @function\n * @param {Object} state\n * @returns {Object} user\n * @returns {string} user.firstName\n * @returns {string} user.lastName\n * @returns {string} user.name\n * @returns {string} user.email\n * @returns {string} user.role\n */\nexport const getCurrentUser = createSelector(\n [ currentUserData, campusListData ],\n (currentUser, campusList) => {\n if (!currentUser) {\n return null;\n }\n const user = makeUserFromData(currentUser);\n const campus = campusList.find(c => c.id === user.campusId);\n user.campus = campus;\n\n return user;\n }\n);\n\nconst userListData = state => state.users.list.data;\n\nexport const getUserList = createSelector(\n [userListData, campusListData],\n (userList, campusList) => userList.map(u => {\n const user = makeUserFromData(u);\n const campus = campusList.find(c => c.id === user.campusId);\n user.campus = campus;\n\n return user;\n })\n);\n\n/**\n * Returns a selector function to get a specific user's data\n * @function\n * @param {string} id\n * @returns {function(id)} selector function\n * @example const user = getUserById(userId)(state);\n */\nexport const getUserById = id => createSelector(\n [getUserList],\n userList => {\n const user = userList.find(u => u.id === id);\n if (!user) {\n return {};\n }\n\n return user;\n }\n);\n","/**\n * @module selectors/categories\n * @desc Selectors for category data\n */\n\nimport { createSelector } from 'reselect';\n\nconst getCategoryList = state => state.categories.list.data;\n\n/**\n * Returns list of categories in the store, sorted alphabetically\n * @function\n * @param {Object} state\n * @returns {Object[]} sorted categories\n */\nexport const getSortedCategoryList = createSelector(\n [getCategoryList],\n list => list.sort((a, b) => a.name < b.name ? -1 : 1) // sort alphabetically\n);\n\nexport const getCategorySelectList = createSelector(\n [getSortedCategoryList],\n list => list.map(category => ({name: category.name, value: category.id }))\n);\n\n// TODO this is temporary until we get aggregates from gql\nexport const getSortedCategoryListWithIssueCount = createSelector(\n [getSortedCategoryList],\n list => list.map(category => {\n return {\n id: category.id,\n name: category.name,\n issueCount: String(category.records.items.length)\n };\n })\n);\n\n/**\n * Returns a selector function to get a specific category's data\n * @function\n * @param {string} id\n * @returns {function(id)} selector function\n * @example const category = getCategoryById(userId)(state);\n */\nexport const getCategoryById = id => createSelector(\n [getCategoryList],\n categoryList => {\n const category = categoryList.find(c => c.id === id);\n if (!category) {\n return null;\n }\n\n return {\n id: category.id,\n name: category.name\n };\n }\n);\n\nexport const getCategoryByName = name => createSelector(\n [getCategoryList],\n categoryList => {\n const category = categoryList.find(c => c.name === name);\n if (!category) {\n return null;\n }\n\n return {\n id: category.id,\n name: category.name\n };\n }\n);\n","/**\n * @module selectors/campuses\n * @desc selectors for campus data\n */\n\nimport { createSelector } from 'reselect';\n\nconst campusList = state => state.campuses.data;\n\n/**\n * Selector to create a sorted list of campuses for use in the add users modal\n * @function\n * @param {object} state\n * @returns {array.} sorted campus list\n */\nexport const getCampusListSelectData = createSelector(\n [campusList],\n campuses => campuses\n .sort((a, b) => (a.long_name < b.long_name) ? -1 : 1)\n .map(campus => ({name: campus.long_name, value: campus.id}))\n);\n\nexport const getCampusById = id => createSelector(\n [campusList],\n campuses => campuses.find(campus => campus.id === id)\n);\n","import { createSelector } from \"reselect\";\nimport { isCampusAdmin, isSystemAdmin } from \"../utils\";\nimport { CAMPUS_GUIDANCE_STATUS_ALL, CAMPUS_GUIDANCE_STATUS_UNPUBLISHED } from \"../constants\";\n\nconst getCampusList = state => state.campuses.data;\nconst getCurrentUser = state => state.session.currentUser;\nconst getCurrentIssue = state => state.issues.currentIssue.data;\n\nexport const getViewableCampusGuidanceForCurrentIssue = createSelector(\n [\n getCampusList,\n getCurrentUser,\n getCurrentIssue\n ],\n (campusList, currentUser, issue) => {\n if (!(currentUser && issue)) {\n return [];\n }\n\n return campusList.reduce((guidanceData, campus) => {\n const campusGuidance =\n issue.campusGuidance.items.find(guidance => guidance.campus.id === campus.id);\n const ownCampus = currentUser[\"custom:campus_id\"] === campus.id;\n const canEdit = isCampusAdmin(currentUser) && ownCampus;\n\n let canView = false;\n if (campusGuidance) {\n if (campusGuidance.status === CAMPUS_GUIDANCE_STATUS_ALL) {\n canView = true;\n }\n\n if (ownCampus && (campusGuidance.status !== CAMPUS_GUIDANCE_STATUS_UNPUBLISHED)) {\n canView = true;\n }\n\n if (isSystemAdmin(currentUser)) {\n canView = true;\n }\n }\n\n if (canView || canEdit) {\n guidanceData.push({\n campus,\n campusGuidance,\n canEdit\n });\n }\n return guidanceData;\n }, [])\n\n }\n);\n\n","import { createSelector } from \"reselect\";\nimport {\n TYPE_ISSUE,\n TYPE_CATEGORY,\n TYPE_CAMPUS_GUIDANCE,\n TYPE_TAG\n} from '../constants';\n\nconst getSearchResults = state => state.search.data;\n\nexport const getParsedSearchResults = createSelector(\n [getSearchResults],\n searchResults => {\n const seenIssues = {};\n const combinedIssues = [];\n searchResults[TYPE_ISSUE]\n .concat(searchResults[TYPE_CAMPUS_GUIDANCE])\n .concat(searchResults[TYPE_TAG])\n .forEach(item => {\n if (!seenIssues[item.id]) {\n seenIssues[item.id] = true;\n item.type = TYPE_ISSUE;\n combinedIssues.push(item);\n }\n });\n const categories = searchResults[TYPE_CATEGORY].map(item => ({...item, type: TYPE_CATEGORY}));\n\n return categories.concat(combinedIssues);\n }\n);\n\n","/**\n * @module selectors/tags\n * @desc Selectors for tag data\n */\n\nimport { createSelector } from 'reselect';\n\nconst getTagList = state => state.tags.list.data;\n\n/**\n * Returns list of tags in the store, sorted alphabetically\n * @function\n * @param {Object} state\n * @returns {Object[]} sorted categories\n */\nexport const getSortedTagList = createSelector(\n [getTagList],\n list => list.sort((a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1) // sort alphabetically\n);\n\n/**\n * Returns an array of tags with their name and id for use in a dropdown select list\n * @function\n * @param {Object} state\n * @returns {Object[]} array of tags with values\n */\nexport const getTagSelectList = createSelector(\n [getSortedTagList],\n list => {\n const sortedTags = list.map(tag => ({name: tag.name, value: tag.id }));\n return [\n { name: '- No Tag -', value: '' },\n ...sortedTags\n ];\n }\n);\n\n/**\n * Returns an array of tags with their name, id, and associated issues\n * @function\n * @param {Object} state\n * @returns {Object[]} array of tags\n */\nexport const getSortedTagListWithIssueData = createSelector(\n [getSortedTagList],\n list => list.map(tag => ({\n id: tag.id,\n name: tag.name,\n issues: tag.records.items.map(r => r.record).sort ((a, b) => a.title.toLowerCase() < b.title.toLowerCase() ? -1 : 1),\n issueCount: String(tag.records.items.length)\n }))\n);\n\n// TODO this is temporary until we get aggregates from gql\nexport const getSortedTagListWithIssueCount = createSelector(\n [getSortedTagList],\n list => list.map(tag => {\n return {\n id: tag.id,\n name: tag.name,\n issueCount: String(tag.records.items.length)\n };\n })\n);\n\n/**\n * Returns a selector function to get a specific tag's data\n * @function\n * @param {string} id\n * @returns {function(id)} selector function\n * @example const tag = getTagById(tagId)(state);\n */\nexport const getTagById = id => createSelector(\n [getTagList],\n tagList => {\n const tag = tagList.find(t => t.id === id);\n if (!tag) {\n return null;\n }\n\n return {\n id: tag.id,\n name: tag.name\n };\n }\n);\n","import moment from 'moment-timezone';\nimport { createSelector } from 'reselect';\n\nconst getCurrentIssue = state => state.issues.currentIssue.data;\nconst getPreviousVersion = state => state.issues.currentIssue.previousVersion;\n\nconst formatVersion = version => {\n const date = version.updated_at ? moment.tz(version.updated_at, moment.tz.guess()) : null;\n\n return {\n title: version.title,\n editor: version.updated_by || \"Unknown\",\n id: version.id,\n date: date ? date : null,\n dateString: date ? date.format('M/D/YYYY') : \"Unknown\",\n timeString: date? date.format('h:mm a z') : \"Unknown\",\n guidance: version.guidance,\n rationale: version.rationale,\n agreement_language: version.agreement_language\n };\n}\n\nexport const getFormattedPreviousVersion = createSelector(\n [getPreviousVersion],\n version => {\n if (!version) {\n return null;\n }\n\n return formatVersion(version);\n }\n);\n\nexport const getFormattedPreviousVersionList = createSelector(\n [getCurrentIssue],\n issue => {\n if (!(issue && issue.versions && issue.versions.items)) {\n return [];\n }\n\n return issue.versions.items.map(formatVersion).sort((a, b) => a.date > b.date ? -1 : 1);\n }\n);\n","/**\n * @module actions/category-actions\n * @desc Redux actions to handle category related things\n */\nimport {\n LOAD_CATEGORY_LIST,\n SET_CATEGORY_LIST_LOADING_STATUS,\n LOAD_CATEGORY_ISSUE_LIST,\n SET_CATEGORY_ISSUE_LIST_LOADING_STATUS,\n SET_CATEGORY_ACTION_LOADING_STATUS\n} from '../constants/action-types';\n\nimport {\n makeUpdateCategorySuccessMessage,\n makeCreateCategorySuccessMessage\n} from '../constants/fragments';\n\nimport {\n makeGenericErrorMessage\n} from '../constants/errors';\n\nimport {\n setErrors,\n setSuccessMessage,\n resetAllMessages\n} from './';\n\nimport {\n fetchCategoryList,\n fetchIssueListForCategory,\n updateCategory,\n createCategory\n} from '../api';\n\nimport {\n validateUpdateCategoryFormData,\n validateCreateCategoryFormData\n} from '../utils';\n\nimport {\n getCategoryById\n} from '../selectors';\n\nimport { CATEGORY_LIST_ROUTE } from '../constants/routes';\nimport history from '../history';\n\nconst loadCategoryList = data => ({\n type: LOAD_CATEGORY_LIST,\n data\n});\n\nconst setCategoryListLoadingStatus = isLoading => ({\n type: SET_CATEGORY_LIST_LOADING_STATUS,\n isLoading\n});\n\nconst loadCategoryIssueList = data => ({\n type: LOAD_CATEGORY_ISSUE_LIST,\n data\n});\n\nconst clearCategoryIssueList = () => ({\n type: LOAD_CATEGORY_ISSUE_LIST,\n data: []\n});\n\nconst setCategoryIssueListLoadingStatus = isLoading => ({\n type: SET_CATEGORY_ISSUE_LIST_LOADING_STATUS,\n isLoading\n});\n\nconst setCategoryActionLoadingStatus = isLoading => ({\n type: SET_CATEGORY_ACTION_LOADING_STATUS,\n isLoading\n});\n\n/**\n * Makes an api call to retrieve the category list if it isn't in the store already.\n * If successful it triggers an action to add it to the store.\n * @function\n * @param {boolean} force If this is false then the function returns early if it has been called before\n */\nexport const fetchAndLoadCategoryList = (force = false) => (dispatch, getState) => {\n const list = getState().categories.list;\n\n // we only need to do this once until we logout\n if (list.loaded && !force) {\n return false;\n }\n\n dispatch(setCategoryListLoadingStatus(true));\n fetchCategoryList().then(list => {\n dispatch(loadCategoryList(list));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setCategoryListLoadingStatus(false));\n });\n};\n\n/**\n * Makes an api call to retrieve the list of issues for a given category.\n * If successfull it loads them in the store. Otherwise it sets an error message.\n * @function\n * @param {string} categoryId\n */\nexport const fetchAndLoadCategoryIssueList = categoryId => (dispatch, getState) => {\n dispatch(clearCategoryIssueList());\n dispatch(setCategoryIssueListLoadingStatus(true));\n fetchIssueListForCategory(categoryId).then(list => {\n dispatch(loadCategoryIssueList(list));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setCategoryIssueListLoadingStatus(false));\n });\n};\n\n/**\n * Makes an api call to change a category's name\n * If successfull it reloads the category list. Otherwise it sets an error message.\n * @function\n * @param {object} formData\n * @param {string} formData.name\n * @param {string} formData.id\n *\n */\nexport const attemptToUpdateCategory = formData => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n const categoryList = getState().categories.list.data;\n\n if (categoryList.length === 0) {\n dispatch(setErrors(\n makeGenericErrorMessage({context: 'update category', error: 'category list not loaded'})\n ));\n return;\n }\n\n const { id } = formData;\n const category = getCategoryById(id)(getState());\n if (!category) {\n dispatch(setErrors(\n makeGenericErrorMessage({context: 'update category', error: 'unable to find category by id'})\n ));\n return;\n }\n\n // if the user didn't actually change the name then we can just exit\n if (category.name.trim() === formData.name.trim()) {\n history.replace(CATEGORY_LIST_ROUTE);\n return;\n }\n\n const errors = validateUpdateCategoryFormData(formData, categoryList);\n if (errors.length > 0) {\n dispatch(setErrors(errors));\n return;\n }\n\n dispatch(setCategoryActionLoadingStatus(true));\n updateCategory(formData).then(res => {\n history.replace(CATEGORY_LIST_ROUTE);\n dispatch(setSuccessMessage(makeUpdateCategorySuccessMessage(res.name)));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(fetchAndLoadCategoryList(true));\n dispatch(setCategoryActionLoadingStatus(false));\n })\n};\n\n/**\n * Makes an api call to create a new category\n * @function\n * @param {object} formData\n * @param {string} formData.name\n * @param {string} formData.confirmation current user's email as confirmation\n */\nexport const attemptToCreateCategory = formData => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n const categoryList = getState().categories.list.data;\n if (categoryList.length === 0) {\n dispatch(setErrors(\n makeGenericErrorMessage({context: 'create category', error: 'category list not loaded'})\n ));\n return;\n }\n\n const currentUser = getState().session.currentUser;\n if (!(currentUser && currentUser.email)) {\n dispatch(setErrors(makeGenericErrorMessage({context: 'create category', error: 'no current user'})));\n return;\n }\n\n const errors = validateCreateCategoryFormData(formData, currentUser.email, categoryList);\n if (errors.length > 0) {\n dispatch(setErrors(errors));\n return;\n }\n\n dispatch(setCategoryActionLoadingStatus(true));\n createCategory(formData).then(res => {\n history.replace(CATEGORY_LIST_ROUTE);\n dispatch(setSuccessMessage(makeCreateCategorySuccessMessage(res.name)));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(fetchAndLoadCategoryList(true));\n dispatch(setCategoryActionLoadingStatus(false));\n })\n};\n","/**\n * @module utils/categories\n * @desc Helper methods and validators for category forms\n */\nimport {\n MISSING_CATEGORY_NAME_ERROR,\n INCORRECT_CATEGORY_CONFIRMATION_ERROR,\n DUPLICATE_CATEGORY_NAME_ERROR,\n makeGenericErrorMessage,\n\n} from '../constants/errors';\n\nimport { isEmptyString } from './';\n\n/**\n * Checks update category form for errors\n * @param {object} formData\n * @param {string} formData.id\n * @param {string} formData.name\n * @param {object[]} categoryList\n * @returns {node[]} errors\n */\nexport function validateUpdateCategoryFormData(formData, categoryList) {\n const errors = [];\n const { id, name } = formData;\n\n if (isEmptyString(name)) {\n errors.push(MISSING_CATEGORY_NAME_ERROR);\n } else if (categoryList.find(category => category.name.trim() === name.trim() )) {\n errors.push(DUPLICATE_CATEGORY_NAME_ERROR);\n }\n\n if (isEmptyString(id)) {\n errors.push(makeGenericErrorMessage({context: 'update category', error: 'missing id'}));\n }\n\n return errors;\n}\n\n/**\n * Checks create category form for errors\n * @param {object} formData\n * @param {string} formData.name\n * @param {string} formData.confirmation email from form for confirmation\n * @param {string} currentUserEmail for comparison\n * @param {object[]} categoryList\n * @returns {string[]} errors\n */\nexport function validateCreateCategoryFormData(formData, currentUserEmail, categoryList) {\n const errors = [];\n const { name, confirmation } = formData;\n\n if (isEmptyString(name)) {\n errors.push(MISSING_CATEGORY_NAME_ERROR);\n } else if (categoryList.find(category => category.name.trim() === name.trim() )) {\n errors.push(DUPLICATE_CATEGORY_NAME_ERROR);\n }\n\n if (confirmation !== currentUserEmail) {\n errors.push(INCORRECT_CATEGORY_CONFIRMATION_ERROR);\n }\n\n return errors;\n}\n","export const makeUpdateCategorySuccessMessage = name => `Category ${name} updated!`;\nexport const makeCreateCategorySuccessMessage = name => `Category ${name} created!`;\n","/**\n * @module actions/issue-actions\n * @desc Redux actions to handle issue related things\n */\n\nimport {\n LOAD_ISSUE_LIST,\n SET_ISSUE_LIST_LOADING_STATUS,\n SET_SINGLE_ISSUE_UPDATING_STATUS,\n LOAD_SINGLE_ISSUE,\n SET_SINGLE_ISSUE_LOADING_STATUS,\n SET_NAV_SECTION_VISIBLE,\n SET_SECTION_EDIT_STATUS,\n LOAD_PREVIOUS_VERSION\n} from '../constants/action-types';\n\nimport {\n ISSUE_ROUTE_PREFIX\n} from '../constants/routes';\n\nimport {\n makeGenericErrorMessage\n} from '../constants/errors';\n\nimport {\n validateCreateIssueFormData,\n validateCreateCampusGuidanceFormData,\n validateUpdateIssueFormData\n} from '../utils';\n\nimport history from '../history';\n\nimport {\n setErrors,\n resetAllMessages\n} from './';\n\nimport {\n fetchIssueList,\n fetchSingleIssue,\n fetchPreviousVersion,\n createIssue,\n updateIssue,\n updateCampusGuidance,\n createCampusGuidance\n} from '../api';\n\nconst loadIssueList = data => ({\n type: LOAD_ISSUE_LIST,\n data\n});\n\nexport const setNavSectionVisible = id => ({\n type: SET_NAV_SECTION_VISIBLE,\n visible: id\n});\n\nexport const setSectionEditStatus = (section, status) => ({\n type: SET_SECTION_EDIT_STATUS,\n section,\n status\n});\n\nconst setIssueListLoadingStatus = isLoading => ({\n type: SET_ISSUE_LIST_LOADING_STATUS,\n isLoading\n});\n\nconst loadSingleIssue = data => ({\n type: LOAD_SINGLE_ISSUE,\n data\n});\n\nconst clearCurrentIssue = () => ({\n type: LOAD_SINGLE_ISSUE,\n data: null\n});\n\nconst loadPreviousVersion = previousVersion => ({\n type: LOAD_PREVIOUS_VERSION,\n previousVersion\n});\n\nexport const clearPreviousVersion = () => ({\n type: LOAD_PREVIOUS_VERSION,\n previousVersion: null\n});\n\nconst setSingleIssueLoadingStatus = isLoading => ({\n type: SET_SINGLE_ISSUE_LOADING_STATUS,\n isLoading\n});\n\nconst setSingleIssueUpdatingStatus = isUpdating => ({\n type: SET_SINGLE_ISSUE_UPDATING_STATUS,\n isUpdating\n});\n\n/**\n * Makes an api call to retrieve the issue list.\n * If successful it triggers an action to add it to the store.\n * @function\n */\nexport const fetchAndLoadIssueList = () => (dispatch, getState) => {\n dispatch(setIssueListLoadingStatus(true));\n fetchIssueList().then(list => {\n dispatch(loadIssueList(list));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setIssueListLoadingStatus(false));\n });\n};\n\n/**\n * Makes an api call to retrieve a single issue\n * If successful it triggers an action to add it to the store\n * @function\n * @param {string} id\n*/\nexport const fetchAndLoadSingleIssue = (id, versionId = null) => (dispatch, getState) => {\n // we want to clear the current issue in case we fail to fetch\n // we don't want previous issue data to be in the store\n dispatch(clearCurrentIssue());\n dispatch(clearPreviousVersion());\n\n dispatch(setSingleIssueLoadingStatus(true));\n fetchSingleIssue(id).then(issue => {\n dispatch(loadSingleIssue(issue));\n if (versionId) {\n return fetchPreviousVersion(versionId).then(res => dispatch(loadPreviousVersion(res)));\n }\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setSingleIssueLoadingStatus(false));\n });\n};\n\nexport const updateCurrentIssue = (data, skipRawTextCheck = false) => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n const issue = getState().issues.currentIssue.data;\n if (!issue) {\n dispatch(setErrors(\n makeGenericErrorMessage({context: 'update issue', error: 'no current issue'})\n ));\n }\n\n const errors = validateUpdateIssueFormData(data, skipRawTextCheck);\n if (errors.length > 0) {\n dispatch(setErrors(errors));\n return;\n }\n\n const updatedIssue = {\n ...issue,\n ...data\n };\n\n dispatch(setSingleIssueUpdatingStatus(true));\n updateIssue(updatedIssue).then(res => {\n dispatch(loadSingleIssue(res));\n history.replace(ISSUE_ROUTE_PREFIX + res.id);\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setSingleIssueUpdatingStatus(false));\n })\n};\n\nexport const attemptToCreateIssue = issueData => (dispatch, getState) => {\n dispatch(resetAllMessages());\n issueData.categoryId = issueData.categoryid;\n\n\n const errors = validateCreateIssueFormData(issueData);\n if (errors.length) {\n dispatch(setErrors(errors));\n return;\n }\n dispatch(setSingleIssueUpdatingStatus(true));\n createIssue(issueData).then(res => {\n history.replace(ISSUE_ROUTE_PREFIX + res.id);\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setSingleIssueUpdatingStatus(false));\n });\n};\n\nexport const createOrUpdateCampusGuidanceForCurrentIssue = data => (dispatch, getState) => {\n if (data.id) {\n dispatch(updateCampusGuidanceForCurrentIssue(data));\n } else {\n dispatch(createCampusGuidanceForCurrentIssue(data));\n }\n};\n\nconst updateCampusGuidanceForCurrentIssue = data => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n const errors = validateCreateCampusGuidanceFormData(data);\n\n if (errors.length) {\n dispatch(setErrors(errors));\n return;\n }\n\n dispatch(setSingleIssueUpdatingStatus(true));\n updateCampusGuidance(data).then(res => {\n dispatch(loadSingleIssue(res.record));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setSingleIssueUpdatingStatus(false));\n })\n};\n\nconst createCampusGuidanceForCurrentIssue = data => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n const errors = validateCreateCampusGuidanceFormData(data);\n\n if (errors.length) {\n dispatch(setErrors(errors));\n return;\n }\n\n dispatch(setSingleIssueUpdatingStatus(true));\n createCampusGuidance(data).then(res => {\n dispatch(loadSingleIssue(res.record));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setSingleIssueUpdatingStatus(false));\n })\n};\n","/**\n * @module actions/user-actions\n * @desc Redux and thunk actions to handle user CRUD\n */\nimport {\n LOAD_USER_LIST,\n SET_USER_LIST_LOADING_STATUS,\n SET_USER_ACTION_LOADING_STATUS\n} from '../constants/action-types';\n\nimport {\n makeGenericErrorMessage\n} from '../constants/errors';\n\nimport {\n USERS_ROUTE,\n ROOT_ROUTE\n} from '../constants/routes';\n\nimport {\n makeEditUserSuccessMessage,\n makeUpdateNameSuccessMessage,\n makeDeleteUserSuccessMessage\n} from '../constants/fragments';\n\nimport {\n validateUpdateUserFormData,\n validateUpdateUserProfileFormData,\n validateDeleteUserFormData\n} from '../utils';\n\nimport {\n fetchUserList,\n updateUser,\n deleteUser\n} from '../api';\n\nimport {\n getUserById\n} from '../selectors';\n\nimport history from '../history';\n\nimport {\n setErrors,\n resetAllMessages,\n setSuccessMessage,\n verifyCurrentUserSession,\n updateUserName\n} from './';\n\nconst loadUserList = users => ({\n type: LOAD_USER_LIST,\n users\n});\n\nconst setUserListLoadingStatus = isLoading => ({\n type: SET_USER_LIST_LOADING_STATUS,\n isLoading\n});\n\nconst setUserActionLoadingStatus = isLoading => ({\n type: SET_USER_ACTION_LOADING_STATUS,\n isLoading\n});\n\n/**\n * Action to retrieve the list of users and load it into the store\n * @function\n */\nexport const fetchAndLoadUserList = () => (dispatch, getState) => {\n dispatch(setUserListLoadingStatus(true));\n fetchUserList().then(res => {\n dispatch(loadUserList(res));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setUserListLoadingStatus(false));\n });\n};\n\n\n/**\n * Makes an api call to update a user's attributes and role/group\n * @function\n * @param {object} formData\n * @param {string} formData.id\n * @param {string} formData.firstname\n * @param {string} formData.lastname\n * @param {string} formData.role\n * @param {string} formData.campus\n */\nexport const attemptToUpdateUser = formData => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n const campusList = getState().campuses.data;\n if (campusList.length === 0) {\n // we should never actually arrive here but we can handle it if we do for some reason\n dispatch(setErrors(makeGenericErrorMessage({context: 'update user', error: 'no campus list'})));\n return;\n }\n\n const { id } = formData;\n const getUser = getUserById(id);\n const user = getUser(getState());\n\n const errors = validateUpdateUserFormData(formData, campusList);\n if (errors.length) {\n dispatch(setErrors(errors));\n return;\n }\n\n dispatch(setUserActionLoadingStatus(true));\n updateUser({...formData, email: user.email}).then(res => {\n dispatch(\n setSuccessMessage(\n makeEditUserSuccessMessage(user)\n )\n );\n history.replace(USERS_ROUTE);\n }).catch(error => {\n dispatch(setErrors(error));\n }).finally(() => {\n dispatch(fetchAndLoadUserList());\n dispatch(setUserActionLoadingStatus(false));\n dispatch(verifyCurrentUserSession());\n });\n};\n\n/**\n * Makes an api call to update a user's attributes\n * @function\n * @param {object} formData\n * @param {string} formData.id\n * @param {string} formData.firstname\n * @param {string} formData.lastname\n * @param {string} formData.role\n * @param {string} formData.campus\n */\n export const attemptToUpdateUserProfile = formData => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n const errors = validateUpdateUserProfileFormData(formData);\n if (errors.length) {\n dispatch(setErrors(errors));\n return;\n }\n dispatch(setUserActionLoadingStatus(true));\n updateUser({...formData}).then(res => {\n dispatch(updateUserName(formData));\n dispatch(\n setSuccessMessage(\n makeUpdateNameSuccessMessage()\n )\n );\n history.replace(ROOT_ROUTE);\n }).catch(error => {\n dispatch(setErrors(error));\n }).finally(() => {\n dispatch(setUserActionLoadingStatus(false));\n dispatch(verifyCurrentUserSession());\n });\n};\n\n/**\n * Makes an api call to delete a user from the userpool\n * @function\n * @param {object} formData\n * @param {string} formData.id\n * @param {string} formData.email email entered in form to confirm deletion\n */\nexport const attemptToDeleteUser = formData => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n const { id } = formData;\n const getUser = getUserById(id);\n const user = getUser(getState());\n\n const errors = validateDeleteUserFormData(formData, user.email);\n if (errors.length > 0) {\n dispatch(setErrors(errors));\n return;\n }\n\n dispatch(setUserActionLoadingStatus(true));\n deleteUser(id).then(res =>{\n dispatch(\n setSuccessMessage(\n makeDeleteUserSuccessMessage(user)\n )\n );\n history.replace(USERS_ROUTE);\n }).catch(error => {\n dispatch(setErrors(error));\n }).finally(() => {\n dispatch(fetchAndLoadUserList());\n dispatch(setUserActionLoadingStatus(false));\n })\n};\n","/**\n * @module constants/fragments/user-fragments\n * @desc Text and jsx fragments related to users and user management. Also some fragment generating methods.\n */\n\n/**\n * Generates a success message for use when a user is created.\n * @function\n * @param {object} user\n * @param {string} user.email\n */\nexport const makeAddUserSuccessMessage = user => `${user.email} has been added successfully`;\n\n/**\n * Generates a success message for use when a user is updated.\n * @function\n * @param {object} user\n * @param {string} user.email\n */\nexport const makeEditUserSuccessMessage = user => `${user.email} has been updated`;\n\n/**\n * Generates a success message for use when a user is updated.\n * @function\n * @param {object} user\n * @param {string} user.email\n */\n export const makeUpdateNameSuccessMessage = () => `Your first name and last name were updated successfully`;\n\n/**\n * Generates a success message for use when a user is deleted.\n * @function\n * @param {object} user\n * @param {string} user.email\n */\nexport const makeDeleteUserSuccessMessage = user => `${user.email} has been deleted`;\n","/**\n * @module actions/campus-actions\n * @desc Redux and thunk actions to handle fetching and loading the campus list\n */\nimport {\n LOAD_CAMPUS_LIST,\n SET_CAMPUS_LIST_LOADING_STATUS\n} from '../constants/action-types';\n\nimport {\n fetchCampusList\n} from '../api';\n\nimport {\n setErrors\n} from './';\n\nconst loadCampusList = campuses => ({\n type: LOAD_CAMPUS_LIST,\n campuses\n});\n\nconst setCampusListLoadingStatus = isLoading => ({\n type: SET_CAMPUS_LIST_LOADING_STATUS,\n isLoading\n});\n\n/**\n * Action to retrieve the campus list and load it into the store\n * @function\n */\nexport const fetchAndLoadCampusList = () => (dispatch, getState) => {\n if (getState().campuses.loaded) {\n return false;\n }\n\n dispatch(setCampusListLoadingStatus(true));\n fetchCampusList().then(campuses => {\n dispatch(loadCampusList(campuses));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setCampusListLoadingStatus(false));\n });\n};\n","import {\n SET_SEARCH_STATUS,\n SET_SEARCH_STRING,\n LOAD_SEARCH_RESULTS\n} from '../constants/action-types';\n\nimport {\n TYPE_ISSUE,\n TYPE_CATEGORY,\n TYPE_CAMPUS_GUIDANCE,\n TYPE_TAG\n} from '../constants';\n\nimport {\n setErrors,\n resetAllMessages\n} from './';\n\nimport { SEARCH_ROUTE } from '../constants/routes';\nimport history from '../history';\n\nimport { searchRecords } from '../api';\n\n\nconst setSearchString = searchString => ({\n type: SET_SEARCH_STRING,\n searchString\n});\n\nconst setSearchStatus = isSearching => ({\n type: SET_SEARCH_STATUS,\n isSearching\n});\n\nconst loadSearchResults = data => ({\n type: LOAD_SEARCH_RESULTS,\n data\n});\n\nconst clearSearchResults = () => loadSearchResults({\n [TYPE_ISSUE]: [],\n [TYPE_CAMPUS_GUIDANCE]: [],\n [TYPE_CATEGORY]: [],\n [TYPE_TAG]: []\n});\n\nexport const executeSearch = (searchString, searchTypes = []) => dispatch => {\n dispatch(clearSearchResults());\n dispatch(setSearchStatus(true));\n dispatch(resetAllMessages());\n dispatch(setSearchString(searchString));\n history.push(SEARCH_ROUTE);\n\n searchRecords(searchString, searchTypes).then(res => {\n dispatch(loadSearchResults(res));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setSearchStatus(false));\n });\n};\n","/**\n * @module actions/tag-actions\n * @desc Redux actions to handle tag related things\n */\nimport {\n LOAD_TAG_LIST,\n SET_TAG_LIST_LOADING_STATUS,\n SET_TAG_ACTION_LOADING_STATUS\n} from '../constants/action-types';\n\nimport {\n setErrors,\n setSuccessMessage,\n resetAllMessages\n} from './';\n\nimport {\n makeGenericErrorMessage\n} from '../constants/errors';\n\nimport {\n makeCreateTagSuccessMessage,\n makeUpdateTagSuccessMessage,\n makeDeleteTagSuccessMessage\n} from '../constants/fragments';\n\nimport {\n validateCreateTagFormData,\n validateUpdateTagFormData\n} from '../utils';\n\nimport {\n getTagById\n} from '../selectors';\n\nimport {\n fetchTagList,\n createTag,\n updateTag,\n deleteTag\n} from '../api';\n\nimport { TAG_LIST_ROUTE } from '../constants/routes';\nimport history from '../history';\n\nconst loadTagList = data => ({\n type: LOAD_TAG_LIST,\n data\n});\n\nconst setTagListLoadingStatus = isLoading => ({\n type: SET_TAG_LIST_LOADING_STATUS,\n isLoading\n});\n\nconst setTagActionLoadingStatus = isLoading => ({\n type: SET_TAG_ACTION_LOADING_STATUS,\n isLoading\n});\n\n/**\n * Makes an api call to retrieve the tag list if it isn't in the store already.\n * If successful it triggers an action to add it to the store.\n * @function\n * @param {boolean} force If this is false then the function returns early if it has been called before\n */\nexport const fetchAndLoadTagList = (force = false) => (dispatch, getState) => {\n const list = getState().tags.list;\n\n // we only need to do this once until we logout\n if (list.loaded && !force) {\n return false;\n }\n\n dispatch(setTagListLoadingStatus(true));\n fetchTagList().then(list => {\n dispatch(loadTagList(list));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(setTagListLoadingStatus(false));\n });\n};\n\n/**\n * Makes an api call to create a new tag\n * @function\n * @param {object} formData\n * @param {string} formData.name\n */\nexport const attemptToCreateTag = formData => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n const tagList = getState().tags.list.data;\n if (tagList.length === 0) {\n dispatch(setErrors(\n makeGenericErrorMessage({context: 'create tag', error: 'tag list not loaded'})\n ));\n return;\n }\n\n const currentUser = getState().session.currentUser;\n if (!(currentUser && currentUser.email)) {\n dispatch(setErrors(makeGenericErrorMessage({context: 'create tag', error: 'no current user'})));\n return;\n }\n\n const errors = validateCreateTagFormData(formData, tagList);\n if (errors.length > 0) {\n dispatch(setErrors(errors));\n return;\n }\n\n dispatch(setTagActionLoadingStatus(true));\n createTag(formData).then(res => {\n history.replace(TAG_LIST_ROUTE);\n dispatch(setSuccessMessage(makeCreateTagSuccessMessage(res.name)));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(fetchAndLoadTagList(true));\n dispatch(setTagActionLoadingStatus(false));\n })\n};\n\n\n/**\n * Makes an api call to create a new tag from the issue page\n * @function\n * @param {object} formData\n * @param {string} formData.name\n */\nexport const addNewTag = formData => (dispatch, getState) => {\n\n const tagList = getState().tags.list.data;\n if (tagList.length === 0) {\n dispatch(setErrors(\n makeGenericErrorMessage({context: 'create tag', error: 'tag list not loaded'})\n ));\n return;\n }\n\n const currentUser = getState().session.currentUser;\n if (!(currentUser && currentUser.email)) {\n dispatch(setErrors(makeGenericErrorMessage({context: 'create tag', error: 'no current user'})));\n return;\n }\n\n return createTag(formData).then(res => {\n return res;\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(fetchAndLoadTagList(true));\n dispatch(setTagActionLoadingStatus(false));\n })\n};\n\n\n/**\n * Makes an api call to change a tag's name\n * If successfull it reloads the tag list. Otherwise it sets an error message.\n * @function\n * @param {object} formData\n * @param {string} formData.name\n * @param {string} formData.id\n *\n */\nexport const attemptToUpdateTag = formData => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n const tagList = getState().tags.list.data;\n\n if (tagList.length === 0) {\n dispatch(setErrors(\n makeGenericErrorMessage({context: 'update tag', error: 'tag list not loaded'})\n ));\n return;\n }\n\n const { id } = formData;\n const tag = getTagById(id)(getState());\n if (!tag) {\n dispatch(setErrors(\n makeGenericErrorMessage({context: 'update tag', error: 'unable to find tag by id'})\n ));\n return;\n }\n\n // if the user didn't actually change the name then we can just exit\n if (tag.name.trim() === formData.name.trim()) {\n history.replace(TAG_LIST_ROUTE);\n return;\n }\n\n const errors = validateUpdateTagFormData(formData, tagList);\n if (errors.length > 0) {\n dispatch(setErrors(errors));\n return;\n }\n\n dispatch(setTagActionLoadingStatus(true));\n updateTag(formData).then(res => {\n history.replace(TAG_LIST_ROUTE);\n dispatch(setSuccessMessage(makeUpdateTagSuccessMessage(res.name)));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(fetchAndLoadTagList(true));\n dispatch(setTagActionLoadingStatus(false));\n })\n};\n\n\n\n/**\n * Makes an api call to delete a tag\n * @function\n * @param {string} tagId\n */\nexport const attemptToDeleteTag = tagId => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n dispatch(setTagActionLoadingStatus(true));\n deleteTag(tagId).then(res => {\n history.replace(TAG_LIST_ROUTE);\n dispatch(setSuccessMessage(makeDeleteTagSuccessMessage(res.name)));\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(fetchAndLoadTagList(true));\n dispatch(setTagActionLoadingStatus(false));\n })\n};\n\n\n\n/**\n * Makes an api call to delete a tag from the issue page\n * @function\n * @param {string} tagId\n */\nexport const deleteNewTag = tagId => (dispatch, getState) => {\n dispatch(resetAllMessages());\n\n dispatch(setTagActionLoadingStatus(true));\n deleteTag(tagId).then(res => {\n return res;\n }).catch(errors => {\n dispatch(setErrors(errors));\n }).finally(() => {\n dispatch(fetchAndLoadTagList(true));\n dispatch(setTagActionLoadingStatus(false));\n })\n};","/**\n * @module utils/categories\n * @desc Helper methods and validators for category forms\n */\nimport {\n MISSING_TAG_NAME_ERROR,\n DUPLICATE_TAG_NAME_ERROR,\n makeGenericErrorMessage\n} from '../constants/errors';\n\nimport { isEmptyString } from './';\n\n/**\n * Checks update tag form for errors\n * @param {object} formData\n * @param {string} formData.id\n * @param {string} formData.name\n * @param {object[]} tagList\n * @returns {node[]} errors\n */\nexport function validateUpdateTagFormData(formData, tagList) {\n const errors = [];\n const { id, name } = formData;\n\n if (isEmptyString(name)) {\n errors.push(MISSING_TAG_NAME_ERROR);\n } else if (tagList.find(tag => tag.name.trim() === name.trim() )) {\n errors.push(DUPLICATE_TAG_NAME_ERROR);\n }\n\n if (isEmptyString(id)) {\n errors.push(makeGenericErrorMessage({context: 'update tag', error: 'missing id'}));\n }\n\n return errors;\n}\n\n\n/**\n * Checks create tag form for errors\n * @param {object} formData\n * @param {string} formData.name\n * @param {object[]} tagList\n * @returns {string[]} errors\n */\nexport function validateCreateTagFormData(formData, tagList) {\n const errors = [];\n const { name } = formData;\n\n\n if (isEmptyString(name)) {\n errors.push(MISSING_TAG_NAME_ERROR);\n } else if (tagList.find(tag => tag.name.trim() === name.trim() )) {\n errors.push(DUPLICATE_TAG_NAME_ERROR);\n }\n\n return errors;\n}\n","export const makeUpdateTagSuccessMessage = name => `Tag ${name} updated!`;\nexport const makeCreateTagSuccessMessage = name => `Tag ${name} created!`;\nexport const makeDeleteTagSuccessMessage = name => `Tag ${name} has been deleted and all affected issues have been updated!`;\n","import React, { Component } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Spinner } from '../widgets';\nimport { CATEGORY_ROUTE_PREFIX } from '../../constants/routes';\n\nimport './style.scss';\n\nimport { connect } from \"react-redux\";\nimport { fetchAndLoadCategoryList } from \"../../actions\";\nimport { getSortedCategoryList } from \"../../selectors\";\n\nconst mapStateToProps = (state, props) => {\n return {\n categories: getSortedCategoryList(state),\n isLoading: state.categories.list.isLoading\n };\n};\n\nclass CategoryList extends Component {\n componentDidMount() {\n this.props.fetchAndLoadCategoryList();\n }\n\n render() {\n const { categoryId, categories, isLoading } = this.props;\n\n return (\n
\n

Categories

\n {\n isLoading ?\n \n :\n
    \n {(categories).map((category) => (\n
  • \n {category.id === categoryId ?\n {category.name} :\n {category.name}\n }\n
  • \n ))}\n
\n }\n
\n )\n }\n}\n\nexport default connect(\n mapStateToProps,\n { fetchAndLoadCategoryList }\n)(CategoryList);\n","import React from \"react\";\nimport { connect } from 'react-redux';\n\nimport \"./style.scss\";\n\nimport { makeClassName } from \"../../utils\";\nimport { ErrorList, SuccessBanner } from '../widgets';\n\nexport const PageContainer = props => {\n const { className } = props;\n return (\n
\n
\n {props.children}\n
\n
\n );\n};\n\nconst PageContentComponent = props => {\n const { errors, successMessage, inModal } = props;\n return (\n
\n { !inModal && }\n \n
{props.children}
\n
\n );\n};\n\nexport const PageContent = connect(\n state => ({\n errors: state.messages.errors,\n successMessage: state.messages.successMessage,\n inModal: state.messages.inModal\n })\n)(PageContentComponent);\n","import React, { Component, Fragment } from \"react\";\nimport { connect } from 'react-redux';\nimport { Spinner } from '../widgets';\nimport { executeSearch } from '../../actions';\nimport { isSystemAdmin } from '../../utils';\nimport {\n TYPE_ISSUE,\n TYPE_CAMPUS_GUIDANCE,\n TYPE_CATEGORY,\n TYPE_TAG\n} from '../../constants';\n\nimport \"./style.scss\";\n\nconst mapStateToProps = (state, props) => ({\n searchString: state.search.searchString,\n isSearching: state.search.isSearching,\n currentUser: state.session.currentUser\n});\n\nconst mapDispatchToProps = (dispatch, props) => ({\n search: (searchString, searchTypes) => dispatch(executeSearch(searchString, searchTypes))\n});\n\nclass SearchBar extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n value: \"\",\n };\n\n this.onChange = this.onChange.bind(this);\n this.onSubmit = this.onSubmit.bind(this);\n }\n\n get isEmpty() {\n return !this.state.value;\n }\n\n get shouldLockSubmit() {\n return this.isEmpty || this.props.isSearching;\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.searchString !== this.props.searchString) {\n this.setState({\n value: this.props.searchString\n });\n }\n }\n\n onChange(event) {\n this.setState({\n value: event.target.value\n });\n }\n\n onSubmit(event) {\n event.preventDefault();\n\n const searchTypes = isSystemAdmin(this.props.currentUser) ?\n [TYPE_ISSUE, TYPE_CAMPUS_GUIDANCE, TYPE_CATEGORY, TYPE_TAG] :\n [TYPE_ISSUE, TYPE_CAMPUS_GUIDANCE, TYPE_CATEGORY];\n\n this.props.search(this.state.value, searchTypes);\n }\n\n render() {\n const { isSearching } = this.props;\n\n return (\n
\n \n \n \n );\n }\n}\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(SearchBar);\n","import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport \"./style.scss\";\n\nimport { CategoryList, PageContent, PageContainer } from \"../../components\";\n\nimport { WELCOME_BLURB, WELCOME_BLURB_UNAUTHED } from \"../../constants/fragments\";\n\nconst mapStateToProps = state => ({\n isLoggedIn: Boolean(state.session.currentUser) && Boolean(state.session.currentUser.role)\n});\n\nclass Welcome extends Component {\n render() {\n return (\n \n \n \n

Welcome to the Negotiator's Handbook

\n { this.props.isLoggedIn ? WELCOME_BLURB : WELCOME_BLURB_UNAUTHED }\n
\n
\n );\n }\n}\n\nexport default connect(mapStateToProps)(Welcome);\n","import React, { Component, Fragment } from 'react';\nimport { connect } from 'react-redux';\nimport './style.scss';\n\nimport { Link } from 'react-router-dom';\n\nimport {\n CategoryList,\n PageContainer,\n PageContent\n} from '../../components';\n\nimport {\n Spinner,\n Table\n} from '../../components/widgets';\n\nimport {\n fetchAndLoadCategoryList,\n fetchAndLoadCategoryIssueList,\n resetAllMessages\n} from '../../actions';\n\nimport {\n ISSUE_ROUTE_PREFIX\n} from '../../constants/routes';\n\nimport { isSystemAdmin, makeIssueNameWithStatus } from '../../utils';\n\nconst mapStateToProps = (state, props) => {\n const id = props.match.params.id;\n const category = state.categories.list.data.find(c => c.id === id);\n\n return {\n category,\n isLoadingIssues: state.categories.issues.isLoading,\n issueList: state.categories.issues.data,\n currentUser: state.session.currentUser\n };\n};\n\nconst mapDistpatchToProps = (dispatch, props) => {\n const id = props.match.params.id;\n return {\n loadIssueList: () => dispatch(fetchAndLoadCategoryIssueList(id)),\n loadCategoryList: () => dispatch(fetchAndLoadCategoryList()),\n resetAllMessages: () => dispatch(resetAllMessages())\n };\n};\n\nconst ISSUE_LIST_COLUMNS = [{\n name: 'link',\n displayName: 'Issue Name',\n displayTransformer: issue => {makeIssueNameWithStatus(issue)},\n sort: (a, b) => {\n if (a.published && !b.published) {\n return -1;\n }\n\n if (!a.published && b.published) {\n return 1;\n }\n\n return a.title.toLowerCase() > b.title.toLowerCase() ? 1 : -1;\n },\n defaultSort: true\n}];\n\nclass CategoryView extends Component {\n componentDidMount() {\n this.props.resetAllMessages();\n this.props.loadCategoryList();\n this.props.loadIssueList();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.category !== this.props.category) {\n this.props.loadIssueList();\n }\n }\n\n render() {\n const { currentUser, category, isLoadingIssues } = this.props;\n const issueList = isSystemAdmin(currentUser) ?\n this.props.issueList :\n this.props.issueList.filter(issue => issue.published);\n\n return (\n \n \n \n { category &&\n \n

{category.name}

\n
\n \n
\n }\n { isLoadingIssues &&\n \n
\n \n
\n }\n
\n
\n );\n }\n}\n\nexport default connect(\n mapStateToProps,\n mapDistpatchToProps\n)(CategoryView);\n","import React, { Component, createRef } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\n\nimport { Button } from \"../../components/widgets\";\n\nimport { makeClassName } from \"../../utils\";\n\nimport {\n setNavSectionVisible,\n} from \"../../actions\";\n\nconst mapStateToProps = (state, props) => {\n return {\n visibleSection: state.issues.currentIssue.visibleSection\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n setNavSectionVisible: id => dispatch(setNavSectionVisible(id)),\n };\n};\n\nclass IssueSectionContainer extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n collapsed: props.startCollapsed\n };\n\n this.ref = createRef();\n }\n\n get isVisible() {\n const el = this.ref.current;\n if (!el) {\n return false;\n }\n const rect = el.getBoundingClientRect();\n const midpoint = document.documentElement.clientHeight / 2;\n\n return (rect.top < midpoint) &&\n (midpoint < rect.bottom) &&\n !this.state.collapsed;\n }\n\n onScroll = e => {\n if (this.isVisible && (this.props.id !== this.props.visibleSection)) {\n this.props.setNavSectionVisible(this.props.id);\n }\n }\n\n componentDidMount() {\n window.addEventListener(\"scroll\", this.onScroll);\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"scroll\", this.onScroll);\n }\n\n toggleCollapse = () => {\n this.setState({ collapsed: !this.state.collapsed });\n };\n\n render() {\n const { id, title, showCollapseButton, showEditButton, editAction } = this.props;\n const shouldHighlight = (this.props.id === this.props.currentSection);\n\n return (\n \n
\n

{title}

\n { showCollapseButton && (\n \n )}\n {!this.state.collapsed && showEditButton &&\n \n }\n
\n
\n {this.props.children}\n
\n \n );\n }\n}\n\nIssueSectionContainer.propTypes = {\n startCollapsed: PropTypes.bool,\n showCollapseButton: PropTypes.bool,\n showEditButton: PropTypes.bool,\n title: PropTypes.string,\n onSave: PropTypes.func,\n id: PropTypes.string.isRequired,\n};\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(IssueSectionContainer);\n\n","import React, { Component, Fragment } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\n\nimport { Button, RichTextEditor, Spinner } from \"../../components/widgets\";\nimport IssueSectionContainer from \"./issue-section-container\";\n\nimport {\n setNavSectionVisible,\n setSectionEditStatus\n} from \"../../actions\";\n\nconst mapStateToProps = (state, props) => {\n return {\n visibleSection: state.issues.currentIssue.visibleSection\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n setNavSectionVisible: id => dispatch(setNavSectionVisible(id)),\n setSectionEditStatus: (section, status) => dispatch(setSectionEditStatus(section, status))\n };\n};\n\nclass IssueSection extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n editMode: props.startInEditMode,\n };\n }\n // if we get new data props while in edit mode then we should\n // switch back to view mode. This should only ever happen when we\n // save our data and it gets updated in the store.\n componentDidUpdate(prevProps, prevState) {\n if ((prevProps.content !== this.props.content) ||\n (this.props.customData !== prevProps.customData))\n {\n this.setState({editMode: false});\n }\n\n if (this.props.field) {\n this.props.setSectionEditStatus(this.props.field, this.state.editMode);\n }\n }\n\n getEditor = ref => {\n this.editor = ref;\n }\n\n onSave = e => {\n // if we try to save without changing anything then just close the editor\n if (this.editor && this.editor.isNotDirty) {\n this.cancel();\n return;\n }\n\n const content = this.editor && this.editor.getContent();\n const rawText = this.editor && this.editor.getContent({format: 'text'});\n if (typeof this.props.onSave === \"function\") {\n if (this.props.field) {\n this.props.onSave({[this.props.field]: content, rawText});\n } else {\n this.props.onSave({ content, rawText });\n }\n }\n };\n\n edit = () => {\n this.setState({ editMode: true });\n };\n\n cancel = () => {\n if (typeof this.props.onCancel === \"function\") {\n this.props.onCancel();\n }\n this.setState({ editMode: false });\n };\n\n render() {\n const { startInEditMode, init, id, title, content, canEdit, isCollapsible, shouldLockForm } = this.props;\n const shouldShowEditButton = !this.state.editMode && canEdit;\n const shouldShowCollapseButton = isCollapsible && !this.state.editMode;\n\n return (\n \n \n\n {\n this.state.editMode &&\n
\n {\n shouldLockForm ?\n \n
\n \n
\n :\n \n \n \n \n }\n
\n }\n \n );\n }\n}\n\nIssueSection.propTypes = {\n isCollapsible: PropTypes.bool,\n title: PropTypes.string,\n onSave: PropTypes.func,\n content: PropTypes.string,\n customData: PropTypes.any,\n canEdit: PropTypes.bool,\n id: PropTypes.string.isRequired,\n startCollapsed: PropTypes.bool,\n field: PropTypes.string,\n shouldLockForm: PropTypes.bool,\n onCancel: PropTypes.func,\n isVisible: PropTypes.bool,\n startInEditMode: PropTypes.bool\n};\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(IssueSection);\n","import React, { Component, Fragment } from \"react\";\nimport \"./style.scss\";\nimport AnchorLink from \"react-anchor-link-smooth-scroll\";\nimport { makeClassName } from \"../../utils\"\n\nclass IssueNav extends Component {\n render() {\n const { visibleSection, campusGuidanceList, showVersionMenuItem } = this.props;\n return (\n
\n
    \n
  • \n \n UCOP Guidance\n \n \n
  • \n
  • \n \n Rationale\n \n \n
  • \n
  • \n \n Agreement Language\n \n \n
  • \n { campusGuidanceList.length > 0 &&\n \n
  • \n Campus Guidance\n
  • \n {\n campusGuidanceList.map((guidanceData, idx) => {\n const { campus } = guidanceData;\n return (\n \n\n \n {campus.long_name}\n \n \n \n )\n })\n }\n
    \n }\n {\n showVersionMenuItem &&\n
  • \n \n Previous Versions\n \n \n
  • \n }\n
\n
\n );\n }\n}\n\nexport default IssueNav;\n","import React, { Component, createRef } from \"react\";\nimport { makeClassName } from '../../utils';\n\nexport default class TagSelector extends Component {\n constructor(props) {\n super(props);\n\n this.focusRef = createRef();\n this.listRef = createRef();\n this.pillBottleRef = createRef();\n\n this.state = {\n filterText: '',\n selectedTags: this.props.issueTags || [],\n filteredTagList: [],\n listIdx: -1,\n listOpen: false,\n addTagButtonText: 'Assign Tag'\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (this.state.selectedTags.length > prevState.selectedTags.length) {\n this.scrollToLastPill();\n }\n }\n\n tagLookup(tagName) {\n return this.props.tagList\n .find(tag => tag.name === tagName);\n }\n\n // get a copy of the taglist for manipulation\n get allTags() {\n return Array.from(this.props.tagList);\n }\n\n get selectedTags() {\n return Array.from(this.state.selectedTags);\n }\n\n addTag = () => {\n const tagText = this.state.filterText.trim();\n if (!tagText || tagText.length === 0) {\n return;\n }\n let tag = this.tagLookup(tagText);\n if (!tag) {\n // if the tag doesn't exist, create it in the DB\n this.props.addNewTag({name: tagText}).then(tag => {\n this.props.storeNewTag(tag);\n this.updateState(tag);\n })\n return;\n }\n // don't add duplicates\n if (this.state.selectedTags.find(t => t.id === tag.id)) {\n return;\n }\n\n this.updateState(tag);\n }\n\n updateState = tag => {\n const tags = this.selectedTags;\n tags.push(tag);\n this.setState({\n selectedTags: tags,\n filterText: '',\n listOpen: false,\n filteredTagList: [],\n addTagButtonText: 'Assign Tag'\n });\n }\n\n get highlightedTag() {\n const {\n listOpen,\n listIdx,\n filteredTagList\n } = this.state;\n if (!(listOpen && listIdx > -1)) {\n return null;\n }\n\n return filteredTagList[listIdx];\n }\n\n isTagAlreadySelected = tagName => {\n return this.state.selectedTags.find(tag => tag.name.trim() === tagName.trim());\n }\n\n removeTag(tag) {\n const tagList = this.selectedTags;\n const idx = tagList.findIndex(t => t.id === tag.id);\n\n if (idx > -1) {\n tagList.splice(idx, 1);\n }\n this.setState({selectedTags: tagList})\n }\n\n openList = () => {\n this.setState({\n listOpen: true,\n listIdx: -1\n });\n }\n\n closeList = () => {\n this.setState({listOpen: false});\n }\n\n setFilterText = (text, focusAndClose = false) => {\n const filteredTagList = this.allTags\n .filter(({name}) => name.toLowerCase()\n .includes(text.toLowerCase()) &&\n !this.isTagAlreadySelected(name))\n\n const addButtonText = (text && (!filteredTagList.length)) ? 'Add New Tag' : 'Assign Tag';\n\n this.setState({\n filterText: text,\n filteredTagList,\n addTagButtonText: addButtonText\n });\n\n if (!this.state.listOpen && text.trim().length) {\n this.openList();\n } else if (!text.trim().length) {\n this.closeList();\n }\n\n if (focusAndClose) {\n this.focusRef.current.focus();\n if (this.state.listOpen) {\n this.closeList();\n }\n }\n }\n\n incrementListIdx() {\n const {\n listOpen,\n listIdx,\n filteredTagList,\n filterText\n } = this.state;\n\n // empty list\n if (!filteredTagList.length) {\n return;\n }\n\n // closed list\n if (!listOpen && filterText.trim().length) {\n this.openList();\n return\n }\n\n // open list, nothing selected\n if (listIdx < 0) {\n this.setState({listIdx: 0});\n return;\n }\n\n // at end of list\n if (listIdx >= filteredTagList.length - 1) {\n this.setState({listIdx: 0});\n this.scrollToTag(0);\n return;\n }\n\n // anywhere else in list\n this.setState({listIdx: listIdx + 1});\n this.scrollToTag(listIdx + 1);\n }\n\n decrementListIdx() {\n const {\n listOpen,\n listIdx,\n filteredTagList\n } = this.state;\n\n // empty list\n if (!(filteredTagList.length && listOpen)) {\n return;\n }\n\n if (filteredTagList.length && !listOpen) {\n this.setState({\n listOpen: true,\n listIdx: filteredTagList.length - 1\n });\n return;\n }\n\n // at beginning of list\n if (listIdx <= 0) {\n this.setState({\n listIdx: filteredTagList.length - 1\n });\n this.scrollToTag(filteredTagList.length - 1);\n return\n }\n\n // elsewhere in list\n this.setState({ listIdx: listIdx - 1 });\n this.scrollToTag(listIdx - 1);\n }\n\n isTagVisible(idx) {\n const {\n listOpen\n } = this.state;\n\n if (this.listRef.current && listOpen) {\n const list = this.listRef.current;\n const tag = list.children[idx];\n\n const tagTop = tag.offsetTop;\n const tagBottom = tagTop + tag.clientHeight;\n\n const listTop = list.scrollTop;\n const listBottom = listTop + list.clientHeight;\n\n return (tagTop >= listTop) && (tagBottom <= listBottom);\n }\n }\n\n scrollToTag(idx) {\n const {\n listOpen\n } = this.state;\n\n\n if (this.listRef.current && listOpen) {\n if (!this.isTagVisible(idx)) {\n const listElement = this.listRef.current;\n const tagElement = listElement.children[idx];\n if (tagElement) {\n listElement.scrollTop = tagElement.offsetTop - 20;\n }\n }\n }\n }\n\n scrollToLastPill() {\n if (this.pillBottleRef.current) {\n const bottle = this.pillBottleRef.current;\n const pill = bottle.lastElementChild;\n if (pill) {\n bottle.scrollTop = pill.offsetTop;\n }\n }\n }\n\n get canAddTag() {\n const filterText = this.state.filterText;\n return !this.isTagAlreadySelected(filterText);\n }\n\n get showList() {\n const {\n filteredTagList,\n listOpen\n } = this.state;\n\n return filteredTagList.length && listOpen;\n }\n\n handleListNavigation = e => {\n switch (e.key) {\n case \"Escape\":\n this.setFilterText('', true);\n break;\n\n case \"Enter\":\n e.preventDefault();\n // using { } to start a new block so we can safely declare a variable in a switch case\n {\n const selectedTag = this.state.filteredTagList[this.state.listIdx];\n if (this.state.listOpen && selectedTag) {\n this.setFilterText(selectedTag.name, true);\n } else {\n this.addTag();\n }\n }\n break;\n\n case \"ArrowDown\":\n e.preventDefault();\n this.incrementListIdx();\n break;\n\n case \"ArrowUp\":\n e.preventDefault();\n this.decrementListIdx();\n break;\n\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"Home\":\n case \"End\":\n this.setState({ listIdx: -1 });\n break;\n default:\n // nothing\n }\n }\n\n get tagIdString() {\n return this.state.selectedTags.map(tag => tag.id).join(\",\");\n }\n\n render() {\n const {\n filterText,\n selectedTags,\n filteredTagList,\n listIdx,\n listOpen,\n disabled,\n addTagButtonText\n } = this.state;\n\n return (\n
\n \n\n
    \n {\n selectedTags.map(tag => (\n
  • \n {tag.name}\n \n
  • \n ))\n }\n
\n \n\n
\n \n {\n if (!listOpen && filteredTagList.length) {\n this.openList();\n }\n }}\n onChange={e => {\n e.preventDefault();\n this.setFilterText(e.target.value);\n }}\n\n onKeyDown={this.handleListNavigation}\n />\n\n {\n (Boolean(this.showList)) &&\n \n {\n filteredTagList.map((tag, idx) => (\n e.preventDefault()} // mouse event prevents bluring\n onClick={e => {\n e.preventDefault();\n this.setFilterText(tag.name, true);\n }}\n >\n {tag.name}\n \n ))\n }\n \n }\n
\n {\n e.preventDefault();\n this.addTag();\n }}\n >\n {addTagButtonText}\n \n
\n \n );\n }\n}\n","import React, { Component, Fragment } from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n Spinner,\n Form,\n Select,\n TextInput,\n Button\n} from \"../../components/widgets\";\n\nimport TagSelector from './tag-selector';\n\nimport { getSortedTagList, getCategorySelectList } from \"../../selectors\";\nimport {\n fetchAndLoadCategoryList,\n fetchAndLoadTagList,\n setSectionEditStatus,\n addNewTag,\n deleteNewTag,\n setSuccessMessage,\n resetAllMessages\n} from \"../../actions\";\nimport { isSystemAdmin, makeClassName } from \"../../utils\";\n\nconst STATUS_OPTIONS = [\n {\n name: 'Unpublished',\n value: false\n },\n {\n name: 'Published',\n value: true\n }\n];\n\nconst mapStateToProps = (state, props) => {\n return {\n shouldLockForm:\n state.categories.list.isLoading ||\n state.issues.currentIssue.isUpdating ||\n state.tags.list.isLoading,\n categories: getCategorySelectList(state),\n currentUser: state.session.currentUser,\n tagList: getSortedTagList(state),\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n fetchAndLoadCategoryList: () => dispatch(fetchAndLoadCategoryList()),\n setSectionEditStatus: (section, status) => dispatch(setSectionEditStatus(section, status)),\n fetchAndLoadTagList: () => dispatch(fetchAndLoadTagList()),\n addNewTag: (tagData) => dispatch(addNewTag(tagData)),\n deleteNewTag: (tagId) => dispatch(deleteNewTag(tagId)),\n setSuccessMessage: (successMessage) => dispatch(setSuccessMessage(successMessage)),\n resetAllMessages: () => dispatch(resetAllMessages())\n };\n};\n\nclass IssueTitle extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n editMode: props.isUnpublished && props.canEdit,\n newTags: []\n };\n\n this.props.setSectionEditStatus('title', this.state.editMode);\n }\n\n componentDidMount() {\n if (isSystemAdmin(this.props.currentUser)) {\n this.props.fetchAndLoadTagList();\n }\n this.props.fetchAndLoadCategoryList();\n\n }\n\n edit = () => {\n this.props.resetAllMessages();\n this.setState({ editMode: true });\n };\n\n cancel = () => {\n this.setState({ editMode: false });\n this.clearNewTags();\n };\n\n storeNewTag = (newTag) => {\n const currentNewTags = this.state.newTags ? this.state.newTags : [];\n this.setState({newTags: [...currentNewTags, newTag]});\n };\n\n // if we recieved new props that are not our previous props then this implies we either loaded a new\n // issue or saved some updates to the current issue. Either way we want to get out of edit mode\n componentDidUpdate(prevProps, prevState) {\n const oldIssue = prevProps.issue;\n const newIssue = this.props.issue;\n const oldTags = oldIssue.tags ? oldIssue.tags.items.map(t => t.id).sort().join(\"|\") : \"\";\n const newTags = newIssue.tags ? newIssue.tags.items.map(t => t.id).sort().join(\"|\") : \"\";\n if (\n (oldIssue.title !== newIssue.title) ||\n (oldIssue.category.id !== newIssue.category.id) ||\n (oldIssue.published !== newIssue.published) ||\n (oldTags !== newTags)\n ) {\n this.setState({ editMode: false });\n }\n\n this.props.setSectionEditStatus('title', this.state.editMode);\n }\n\n clearNewTags = () => {\n const newTags = this.state.newTags;\n for (const newTag of newTags) {\n this.props.deleteNewTag(newTag.id);\n }\n this.setState({\n newTags: []\n });\n }\n\n onSave = formData => {\n \n // remove newTags from this component's state\n this.setState({\n newTags: []\n });\n\n const { title, categoryid, tagids } = formData;\n const published = formData.published === 'true';\n\n const { issue } = this.props;\n // exit edit mode if we haven't made any changes\n const sameTitle = title === issue.title;\n const sameCategory = categoryid === issue.category.id;\n const sameStatus = published === issue.published;\n\n // format tags as sorted arrays of id strings\n // filter out empty strings from the new tag id string\n const newTagIds = tagids.split(\",\").filter(t => Boolean(t.trim())).sort();\n const oldTagIds = issue.tags ? issue.tags.items.map(t => t.tag.id).sort() : [];\n\n // convert arrays back to strings and compare them\n // since we sorted them they should be the same string if they have the same contents\n const sameTags = newTagIds.join(\"|\") === oldTagIds.join(\"|\");\n\n if (sameTitle && sameCategory && sameStatus && sameTags) {\n this.setState({ editMode: false });\n return;\n }\n\n if (typeof this.props.onSave === \"function\") {\n this.props.onSave({\n title,\n published,\n recordCategoryId: categoryid,\n tagIds: newTagIds,\n updateTags: true\n });\n this.props.setSuccessMessage('Issue ' + title + ' updated.');\n }\n }\n\n render() {\n const {\n isUnpublished,\n shouldLockForm,\n categories,\n issue,\n canEdit,\n currentVersion,\n previousVersion,\n tagList\n } = this.props;\n\n // we want to show the previous versions title if we are viewing a previous version\n const displayTitle = previousVersion ? previousVersion.title : issue.title;\n\n return (\n
\n {this.state.editMode && (\n
\n
\n
\n
\n \n \n \n item.tag)}\n disabled={shouldLockForm}\n addNewTag={this.props.addNewTag}\n storeNewTag={this.storeNewTag}\n />\n
\n {isUnpublished && (\n
\n \n

\n This issue is currently\n unpublished and is only\n visible to system admins.\n

\n
\n )}\n
\n\n {shouldLockForm ? (\n \n ) : (\n
\n \n \n Cancel\n \n
\n )}\n \n {\n currentVersion && !shouldLockForm &&\n \n { `Last updated by ${currentVersion.editor} on ${currentVersion.dateString} at ${currentVersion.timeString}` }\n \n }\n
\n )}\n \n

\n {isUnpublished ? displayTitle + \" (unpublished)\" : displayTitle}\n \n {canEdit && (\n \n \n \n )}\n\n
\n {issue.category.name}\n

\n
\n
\n );\n }\n}\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(IssueTitle);\n","import React, { Component, createRef } from \"react\";\nimport { Button } from \"../../components/widgets\";\nimport { Link } from \"react-router-dom\";\nimport AnchorLink from \"react-anchor-link-smooth-scroll\";\nimport {\n ISSUE_ROUTE_PREFIX,\n ROOT_ROUTE,\n CATEGORY_ROUTE_PREFIX\n} from \"../../constants/routes\";\n\nimport { makeIssueNameWithStatus, makeClassName } from \"../../utils\";\n\nclass Breadcrumbs extends Component {\n constructor(props) {\n super(props);\n this.state = {\n toggleBtop: false\n };\n\n this.focusRef = createRef();\n }\n componentDidMount() {\n document.addEventListener(\"scroll\", this.trackScrolling);\n }\n componentWillUnmount() {\n document.removeEventListener(\"scroll\", this.trackScrolling);\n }\n\n componentDidUpdate(prevProps) {\n if (\n !prevProps.previousVersion &&\n this.props.previousVersion &&\n this.focusRef.current\n ) {\n this.focusRef.current.focus();\n window.scrollTo(0,0);\n }\n }\n\n trackScrolling = () => {\n if (window.scrollY > 200 && !this.state.toggleBtop) {\n this.setState({\n toggleBtop: true\n });\n }\n if (window.scrollY <= 200 && this.state.toggleBtop) {\n this.setState({\n toggleBtop: false\n });\n }\n };\n\n render() {\n const { issue, previousVersion, activateVersionFunction } = this.props;\n const { toggleBtop } = this.state;\n return (\n
\n Categories\n >\n \n {issue.category.name}\n \n -\n {makeIssueNameWithStatus(issue)}\n \n Back to top\n \n { previousVersion &&\n
\n
\n {`Currently viewing version created by ${previousVersion.editor} on ${previousVersion.dateString} at ${previousVersion.timeString}`}\n
\n \n View current version\n
\n
\n
\n }\n
\n );\n }\n}\n\nexport default Breadcrumbs;\n","import React, { Fragment, Component } from \"react\";\nimport IssueSection from \"./issue-section\";\nimport { Button, Spinner } from \"../../components/widgets\";\nimport {\n CAMPUS_GUIDANCE_STATUS_UNPUBLISHED,\n CAMPUS_GUIDANCE_STATUS_CAMPUS,\n CAMPUS_GUIDANCE_STATUS_ALL\n} from \"../../constants\";\n\nclass CampusGuidance extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n creatingNewGuidance: false,\n status:\n (props.campusGuidance && props.campusGuidance.status) ||\n CAMPUS_GUIDANCE_STATUS_UNPUBLISHED,\n shouldSwitchToViewMode: false\n };\n }\n\n addCampusGuidanceWYSIWYGControls = editor => {\n editor.ui.registry.addMenuButton(\"campus-visibility\", {\n text: \"Campus Visibility\",\n fetch: callback => {\n callback([\n {\n type: \"menuitem\",\n text: \"Unpublished\",\n icon:\n this.state.status === CAMPUS_GUIDANCE_STATUS_UNPUBLISHED\n ? \"checkmark\"\n : null,\n onAction: () => {\n editor.setDirty(true);\n this.setState({ status: CAMPUS_GUIDANCE_STATUS_UNPUBLISHED });\n }\n },\n {\n type: \"menuitem\",\n text: \"Published only to my campus\",\n icon:\n this.state.status === CAMPUS_GUIDANCE_STATUS_CAMPUS\n ? \"checkmark\"\n : null,\n onAction: () => {\n editor.setDirty(true);\n this.setState({ status: CAMPUS_GUIDANCE_STATUS_CAMPUS });\n }\n },\n {\n type: \"menuitem\",\n text: \"Published to all campuses\",\n icon:\n this.state.status === CAMPUS_GUIDANCE_STATUS_ALL\n ? \"checkmark\"\n : null,\n onAction: () => {\n editor.setDirty(true);\n this.setState({ status: CAMPUS_GUIDANCE_STATUS_ALL });\n }\n }\n ]);\n }\n });\n };\n\n onSave = ({ content, rawText }) => {\n const data = {};\n if (this.props.campusGuidance) {\n data.id = this.props.campusGuidance.id;\n } else {\n data.campus_id = this.props.campus.id;\n }\n data.status = this.state.status;\n data.guidance = content;\n data.rawText = rawText;\n\n if (typeof this.props.onSave === \"function\") {\n this.props.onSave(data);\n }\n };\n\n componentDidUpdate(prevProps, prevState) {\n if (!prevProps.campusGuidance && this.props.campusGuidance) {\n this.cancelCreatingNewGuidance();\n }\n }\n\n openEditorToCreateNewGuidance = () => {\n this.setState({ creatingNewGuidance: true });\n };\n\n cancelCreatingNewGuidance = () => {\n // need this extra check so we don't set state when pressing cancel on an already created item\n if (this.state.creatingNewGuidance) {\n this.setState({ creatingNewGuidance: false });\n }\n };\n\n render() {\n const { shouldShowStatus, canEdit, campusGuidance, campus, shouldLockForm } = this.props;\n const init = {\n setup: this.addCampusGuidanceWYSIWYGControls,\n toolbar3: \"campus-visibility\"\n };\n\n let title = campus.long_name + \" Guidance\";\n if (shouldShowStatus && campusGuidance) {\n title += ` (visible to ${campusGuidance.status})`\n }\n\n return (\n \n {campusGuidance || this.state.creatingNewGuidance ? (\n \n ) : (\n \n {shouldLockForm ? (\n \n ) : (\n
\n \n Create Guidance for {campus.long_name}\n \n
\n )}\n
\n )}\n
\n );\n }\n}\n\nexport default CampusGuidance;\n","import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\n\nimport {\n setNavSectionVisible,\n} from \"../../actions\";\n\nimport {\n ISSUE_ROUTE_PREFIX,\n ISSUE_VERSION_ROUTE_PREFIX\n} from \"../../constants/routes\";\n\nimport IssueSectionContainer from \"./issue-section-container\";\n\nconst mapStateToProps = (state, props) => {\n return {\n visibleSection: state.issues.currentIssue.visibleSection\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n setNavSectionVisible: id => dispatch(setNavSectionVisible(id)),\n };\n};\n\nconst makeVersionString = version => `Version last updated by ${version.editor} on ${version.dateString} at ${version.timeString}`;\n\nclass PreviousVersionList extends Component {\n render() {\n const { id, previousVersions, currentIssueId, versionId } = this.props;\n\n return (\n \n {\n previousVersions.length > 1 ?\n
    \n {\n previousVersions.slice(1).map(version => (\n
  • \n {\n version.id === versionId ?\n {makeVersionString(version)}\n :\n \n {makeVersionString(version)}\n \n }\n
  • \n ))\n }\n
\n :\n

There are no previous versions

\n }\n \n );\n }\n\n}\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(PreviousVersionList);\n","import React, { Component, Fragment } from \"react\";\nimport { connect } from \"react-redux\";\nimport { PageContainer, PageContent } from \"../../components\";\nimport { Spinner } from \"../../components/widgets\";\nimport \"./style.scss\";\n\nimport {\n getViewableCampusGuidanceForCurrentIssue,\n getFormattedPreviousVersionList,\n getFormattedPreviousVersion\n} from \"../../selectors\";\n\nimport {\n fetchAndLoadSingleIssue,\n resetAllMessages,\n fetchAndLoadCampusList,\n updateCurrentIssue,\n createOrUpdateCampusGuidanceForCurrentIssue,\n} from \"../../actions\";\n\nimport {\n isSystemAdmin,\n isCampusAdmin\n} from \"../../utils\";\n\nimport IssueSection from \"./issue-section\";\nimport IssueNav from \"./issue-nav\";\nimport IssueTitle from \"./issue-title\";\nimport Breadcrumbs from \"./breadcrumbs\";\nimport CampusGuidance from \"./campus-guidance\";\nimport PreviousVersionList from \"./previous-version-list\";\n\nconst mapStateToProps = (state, props) => {\n const versionId = props.match.params.versionId;\n\n return {\n currentUser: state.session.currentUser,\n issue: state.issues.currentIssue.data,\n isLoading: state.issues.currentIssue.isLoading || state.campuses.isLoading,\n campusListLoaded: state.campuses.loaded,\n isUpdating: state.issues.currentIssue.isUpdating,\n isUnpublished: state.issues.currentIssue.data && !state.issues.currentIssue.data.published,\n campusGuidanceList: getViewableCampusGuidanceForCurrentIssue(state),\n visibleSection: state.issues.currentIssue.visibleSection,\n viewingPreviousVersion: Boolean(versionId),\n // show version info if any of the sections are being edited (val === true)\n showVersionInfo: Boolean(versionId) || Object.values(state.issues.currentIssue.sectionEditStatus).some(val => val),\n previousVersionList: getFormattedPreviousVersionList(state),\n previousVersion: getFormattedPreviousVersion(state),\n versionId\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n const id = props.match.params.id;\n\n return {\n fetchAndLoadIssue: (versionId) => dispatch(fetchAndLoadSingleIssue(id, versionId)),\n resetAllMessages: () => dispatch(resetAllMessages()),\n fetchAndLoadCampusList: () => dispatch(fetchAndLoadCampusList()),\n onSaveIssue: (content, skipRawTextCheck) => dispatch(updateCurrentIssue(content, skipRawTextCheck)),\n onSaveCampusGuidance: data => dispatch(createOrUpdateCampusGuidanceForCurrentIssue({\n ...data,\n record_id: id\n })),\n };\n};\n\nclass IssuePage extends Component {\n componentDidMount() {\n this.props.fetchAndLoadCampusList();\n this.props.resetAllMessages();\n this.props.fetchAndLoadIssue(this.isAdmin ? this.props.versionId : null);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.versionId !== prevProps.versionId) {\n this.props.fetchAndLoadIssue(this.isAdmin ? this.props.versionId : null);\n }\n }\n\n get isAdmin() {\n return isSystemAdmin(this.props.currentUser);\n }\n\n get isCampusAdmin() {\n return isCampusAdmin(this.props.currentUser);\n }\n\n savePreviousVersionAsCurrent() {\n const { previousVersion, onSaveIssue } = this.props;\n\n if (previousVersion) {\n onSaveIssue({\n title: previousVersion.title,\n guidance: previousVersion.guidance,\n rationale: previousVersion.rationale,\n agreement_language: previousVersion.agreement_language\n }, true); // true to skip raw text check, we only need that when using an editor\n }\n }\n\n render() {\n const {\n campusGuidanceList,\n campusListLoaded,\n isUnpublished,\n isLoading,\n isUpdating,\n issue,\n onSaveIssue,\n onSaveCampusGuidance,\n visibleSection,\n showVersionInfo,\n previousVersionList,\n previousVersion,\n viewingPreviousVersion,\n versionId\n } = this.props;\n\n const currentVersion = previousVersionList[0];\n\n return (\n \n { issue &&\n \n this.savePreviousVersionAsCurrent()}\n />\n \n \n }\n \n { issue &&\n \n }\n \n { isLoading && }\n {\n issue &&\n \n \n \n \n { campusListLoaded &&\n
\n {\n campusGuidanceList.map(guidanceData => {\n const {campus, campusGuidance, canEdit} = guidanceData;\n\n return \n }) }\n
\n }\n {\n showVersionInfo &&\n \n }\n
\n }\n
\n
\n
\n );\n }\n}\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(IssuePage);\n","import React, { Component, Fragment } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { PageContainer, PageContent } from \"../../components\";\nimport { Table, Spinner } from \"../../components/widgets\";\nimport { connect } from \"react-redux\";\nimport \"./style.scss\";\n\nimport {\n getParsedSearchResults\n} from '../../selectors';\n\nimport { isSystemAdmin, makeIssueNameWithStatus } from '../../utils';\n\nimport {\n CATEGORY_ROUTE_PREFIX,\n ISSUE_ROUTE_PREFIX\n} from \"../../constants/routes\";\n\nimport {\n TYPE_CATEGORY,\n} from '../../constants';\n\nconst mapStateToProps = (state, props) => ({\n isSearching: state.search.isSearching,\n searchString: state.search.searchString,\n data: getParsedSearchResults(state),\n currentUser: state.session.currentUser\n});\n\nclass Search extends Component {\n get searchResultColumns() {\n return [\n {\n name: 'type',\n displayTransformer: result => (result.type === TYPE_CATEGORY) ? 'Category:' : 'Issue:',\n width: 80\n },\n {\n name: 'title',\n displayTransformer: result => {\n const isCategory = (result.type === TYPE_CATEGORY)\n const prefix = isCategory ? CATEGORY_ROUTE_PREFIX : ISSUE_ROUTE_PREFIX;\n const title = isCategory ? result.title : makeIssueNameWithStatus(result);\n const route = prefix + result.id;\n const tag = isSystemAdmin(this.props.currentUser) && result.tag && result.tag.name;\n return \n {title}\n {tag && {tag}}\n ;\n }\n }\n ];\n }\n\n render() {\n const { isSearching, currentUser, searchString } = this.props;\n const data = isSystemAdmin(currentUser) ?\n this.props.data :\n this.props.data.filter(item => {\n if (item.type === TYPE_CATEGORY) {\n return true;\n }\n\n return item.published;\n });\n\n return (\n \n \n {\n isSearching ? :\n \n

Showing results for {searchString}

\n \n
\n }\n\n
\n
\n );\n }\n}\n\nexport default connect(\n mapStateToProps\n)(Search);\n","import {\n LOGOUT_USER,\n SET_CURRENT_USER_ATTRIBUTES,\n} from \"../constants/action-types\";\n\nconst initialState = {\n loginErrors: [],\n currentUser: null,\n};\n\nexport default function(state = initialState, action) {\n switch (action.type) {\n case SET_CURRENT_USER_ATTRIBUTES:\n return {\n ...state,\n currentUser: action.attributes\n };\n\n case LOGOUT_USER:\n return { ...initialState, isLoadingSession: false };\n\n default:\n return state;\n }\n}\n","import { combineReducers } from 'redux';\n\nimport {\n LOAD_CATEGORY_LIST,\n SET_CATEGORY_LIST_LOADING_STATUS,\n LOAD_CATEGORY_ISSUE_LIST,\n SET_CATEGORY_ISSUE_LIST_LOADING_STATUS,\n SET_CATEGORY_ACTION_LOADING_STATUS,\n LOGOUT_USER\n} from '../constants/action-types';\n\nconst listInitialState = {\n data: [],\n loaded: false,\n isLoading: false\n};\n\nfunction list(state = listInitialState, action) {\n switch (action.type) {\n\n case LOAD_CATEGORY_LIST:\n return {\n ...state,\n data: action.data,\n loaded: true,\n };\n\n case SET_CATEGORY_LIST_LOADING_STATUS:\n return {\n ...state,\n isLoading: action.isLoading\n };\n\n case LOGOUT_USER:\n return listInitialState;\n\n default:\n return state;\n }\n}\n\nconst issuesInitialState = {\n data: [],\n isLoading: false\n};\n\nfunction issues(state = issuesInitialState, action) {\n switch (action.type) {\n\n case LOAD_CATEGORY_ISSUE_LIST:\n return {\n ...state,\n data: action.data\n };\n\n case SET_CATEGORY_ISSUE_LIST_LOADING_STATUS:\n return {\n ...state,\n isLoading: action.isLoading\n };\n\n case LOGOUT_USER:\n return issuesInitialState;\n\n default:\n return state;\n }\n}\n\nconst actionInitialState = {\n isLoading: false\n};\n\nfunction actions(state = actionInitialState, action) {\n switch (action.type) {\n\n case SET_CATEGORY_ACTION_LOADING_STATUS:\n return {\n ...state,\n isLoading: action.isLoading\n };\n\n case LOGOUT_USER:\n return actionInitialState;\n\n default:\n return state;\n }\n}\n\nexport default combineReducers({\n list,\n issues,\n actions\n});\n","import { combineReducers } from 'redux';\n\nimport {\n LOAD_ISSUE_LIST,\n SET_ISSUE_LIST_LOADING_STATUS,\n LOAD_SINGLE_ISSUE,\n SET_SINGLE_ISSUE_LOADING_STATUS,\n SET_SINGLE_ISSUE_UPDATING_STATUS,\n LOGOUT_USER,\n SET_NAV_SECTION_VISIBLE,\n SET_SECTION_EDIT_STATUS,\n LOAD_PREVIOUS_VERSION\n} from '../constants/action-types';\n\nconst listInitialState = {\n data: [],\n loaded: false,\n isLoading: false\n};\n\nfunction list(state = listInitialState, action) {\n switch (action.type) {\n\n case LOAD_ISSUE_LIST:\n return {\n ...state,\n data: action.data,\n loaded: true,\n isLoading: false\n };\n\n case SET_ISSUE_LIST_LOADING_STATUS:\n return {\n ...state,\n isLoading: action.isLoading\n };\n\n case LOGOUT_USER:\n return listInitialState;\n\n default:\n return state;\n }\n}\n\nconst currentIssueInitialState = {\n data: null,\n previousVersion: null,\n isLoading: false,\n isUpdating: false,\n visibleSection: false,\n sectionEditStatus: {\n title: false,\n guidance: false,\n rationale: false,\n agreement_language: false,\n }\n};\n\nfunction currentIssue(state = currentIssueInitialState, action) {\n switch (action.type) {\n\n case LOAD_SINGLE_ISSUE:\n return {\n ...state,\n data: action.data\n };\n\n case SET_SINGLE_ISSUE_LOADING_STATUS:\n return {\n ...state,\n isLoading: action.isLoading\n };\n\n case SET_SINGLE_ISSUE_UPDATING_STATUS:\n return {\n ...state,\n isUpdating: action.isUpdating\n };\n\n case SET_NAV_SECTION_VISIBLE:\n return{\n ...state,\n visibleSection: action.visible\n };\n\n case SET_SECTION_EDIT_STATUS:\n return {\n ...state,\n sectionEditStatus: {\n ...state.sectionEditStatus,\n [action.section]: action.status\n }\n };\n\n case LOAD_PREVIOUS_VERSION: {\n return {\n ...state,\n previousVersion: action.previousVersion\n };\n }\n\n default:\n return state;\n }\n}\n\nexport default combineReducers({\n list,\n currentIssue\n});\n\n","import { combineReducers } from 'redux';\n\nimport {\n LOAD_USER_LIST,\n SET_USER_LIST_LOADING_STATUS,\n SET_USER_ACTION_ERROR,\n SET_USER_ACTION_SUCCESS_MESSAGE,\n SET_USER_ACTION_LOADING_STATUS\n} from '../constants/action-types';\n\nconst usersInitialState = {\n data: [],\n isLoading: false\n};\n\nfunction list(state = usersInitialState, action) {\n switch (action.type) {\n case LOAD_USER_LIST:\n return {\n ...state,\n data: action.users,\n isLoading: false\n };\n\n case SET_USER_LIST_LOADING_STATUS:\n return {\n ...state,\n isLoading: action.isLoading\n };\n\n default:\n return state;\n }\n}\n\nconst actionsInitialState = {\n errors: [],\n success: null,\n isLoading: false\n};\n\nfunction actions(state = actionsInitialState, action) {\n switch (action.type) {\n case SET_USER_ACTION_ERROR:\n return {\n ...state,\n errors: action.errors\n };\n case SET_USER_ACTION_SUCCESS_MESSAGE:\n return {\n ...state,\n success: action.message\n };\n case SET_USER_ACTION_LOADING_STATUS:\n return {\n ...state,\n isLoading: action.isLoading\n };\n default:\n return state;\n }\n}\n\nexport default combineReducers({\n list,\n actions\n});\n","import {\n LOAD_CAMPUS_LIST,\n SET_CAMPUS_LIST_LOADING_STATUS\n} from '../constants/action-types';\n\nconst initialState = {\n data: [],\n loaded: false,\n isLoading: false\n};\n\nexport default function campuses(state = initialState, action) {\n switch (action.type) {\n\n case LOAD_CAMPUS_LIST:\n return {\n ...state,\n data: action.campuses,\n loaded: true,\n };\n\n case SET_CAMPUS_LIST_LOADING_STATUS:\n return {\n ...state,\n isLoading: action.isLoading\n };\n\n default:\n return state;\n }\n}\n","import {\n SET_ERRORS,\n PUSH_ERRORS,\n SET_SUCCESS_MESSAGE,\n SET_MODAL_MESSAGE_STATUS\n} from '../constants/action-types';\n\nconst initialState = {\n inModal: false,\n errors: [],\n successMessage: null\n};\n\nexport default function messages(state = initialState, action) {\n const newErrors = Array.isArray(action.errors) ? action.errors : [action.errors];\n\n switch (action.type) {\n case SET_ERRORS:\n return { ...state, errors: newErrors };\n case PUSH_ERRORS:\n return { ...state, errors: state.errors.concat(newErrors) };\n case SET_SUCCESS_MESSAGE:\n return { ...state, successMessage: action.successMessage };\n case SET_MODAL_MESSAGE_STATUS:\n return { ...state, inModal: action.inModal };\n default:\n return state;\n }\n}\n","import {\n SET_SEARCH_STATUS,\n SET_SEARCH_STRING,\n LOAD_SEARCH_RESULTS\n} from '../constants/action-types';\n\nimport {\n TYPE_ISSUE,\n TYPE_CATEGORY,\n TYPE_CAMPUS_GUIDANCE,\n TYPE_TAG\n} from '../constants';\n\nconst initialState = {\n data: {\n [TYPE_ISSUE]: [],\n [TYPE_CAMPUS_GUIDANCE]: [],\n [TYPE_CATEGORY]: [],\n [TYPE_TAG]: []\n },\n isSearching: false,\n searchString: \"\"\n};\n\nexport default function search(state = initialState, action) {\n switch (action.type) {\n case SET_SEARCH_STATUS:\n return {\n ...state,\n isSearching: action.isSearching\n };\n\n case LOAD_SEARCH_RESULTS:\n return {\n ...state,\n data: action.data\n };\n\n case SET_SEARCH_STRING:\n return {\n ...state,\n searchString: action.searchString\n };\n\n default:\n return state;\n }\n}\n","import { combineReducers } from 'redux';\n\nimport {\n LOAD_TAG_LIST,\n SET_TAG_LIST_LOADING_STATUS,\n SET_TAG_ACTION_LOADING_STATUS,\n LOGOUT_USER\n} from '../constants/action-types';\n\nconst listInitialState = {\n data: [],\n loaded: false,\n isLoading: false\n};\n\nfunction list(state = listInitialState, action) {\n switch (action.type) {\n\n case LOAD_TAG_LIST:\n return {\n ...state,\n data: action.data,\n loaded: true,\n };\n\n case SET_TAG_LIST_LOADING_STATUS:\n return {\n ...state,\n isLoading: action.isLoading\n };\n\n case LOGOUT_USER:\n return listInitialState;\n\n default:\n return state;\n }\n}\n\nconst actionInitialState = {\n isLoading: false\n};\n\nfunction actions(state = actionInitialState, action) {\n switch (action.type) {\n\n case SET_TAG_ACTION_LOADING_STATUS:\n return {\n ...state,\n isLoading: action.isLoading\n };\n\n case LOGOUT_USER:\n return actionInitialState;\n\n default:\n return state;\n }\n}\n\nexport default combineReducers({\n list,\n actions\n});\n\n","import { combineReducers } from 'redux';\nimport session from './session';\nimport categories from './categories';\nimport issues from './issues';\nimport users from './users';\nimport campuses from './campuses';\nimport messages from './messages';\nimport search from './search';\nimport tags from './tags';\n\nexport default combineReducers({\n session,\n categories,\n issues,\n users,\n campuses,\n messages,\n search,\n tags\n});\n","import { createStore, compose, applyMiddleware } from \"redux\";\nimport thunk from \"redux-thunk\";\nimport reducers from \"./reducers\";\n\nimport { composeWithDevTools } from \"redux-devtools-extension\";\nimport { isProd } from \"./utils\";\n\nconst composeFunction = isProd()\n ? compose\n : composeWithDevTools({ trace: true, traceLimit: 25 });\n\nexport default createStore(reducers, composeFunction(applyMiddleware(thunk)));\n","import Amplify, { Auth, Hub } from \"aws-amplify\";\n\nimport { endSession, initializeUserSessionFromSSO } from './actions';\nimport Store from './store';\nimport { isDev } from './utils';\nimport { awsConf } from \"./config/awsConfig\";\n\nAuth.configure({\n Auth: {\n identityPoolId: awsConf.IdentityPoolId,\n region: awsConf.CognitoRegion,\n userPoolId: awsConf.UserPoolId,\n userPoolWebClientId: awsConf.ClientId,\n mandatorySignIn: false,\n oauth: awsConf.OauthDetails\n }\n});\n\n\nAuth.configure();\n\nif (isDev()) {\n window.Auth = Auth;\n}\n\nconst SIGN_IN = 'signIn';\nconst SIGN_OUT = 'signOut';\n\nHub.listen('auth', ({ payload: { event, data } }) => {\n switch (event) {\n case SIGN_IN:\n Store.dispatch(initializeUserSessionFromSSO());\n break;\n case SIGN_OUT:\n Store.dispatch(endSession());\n break;\n default:\n console.log(event);\n }\n});\n\nexport default Auth;\n\n","import React, { Component, Fragment, createRef } from \"react\";\nimport \"./style.scss\";\nimport { Modal } from \"../../components\";\nimport {\n Form,\n TextInput,\n Button,\n Spinner,\n ErrorList\n} from \"../../components/widgets\";\n\nimport {\n resetAllMessages,\n resetErrors,\n attemptToUpdateUserProfile,\n} from \"../../actions\";\n\nimport { connect } from \"react-redux\";\n\nimport history from \"../../history\";\n\nimport { getCurrentUser } from \"../../selectors\";\nimport { ROOT_ROUTE } from \"../../constants/routes\";\n\nimport Auth from '../../auth';\n\nconst mapStateToProps = (state, props) => {\n return {\n shouldLockForm: state.users.actions.isLoading,\n shouldLockSubmit: state.users.actions.isLoading || state.campuses.isLoading,\n errors: state.messages.errors,\n currentUser: getCurrentUser(state)\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n onSubmit: userData => dispatch(attemptToUpdateUserProfile({ ...userData })),\n resetMessages: () => dispatch(resetAllMessages()),\n hideModal: () => {\n dispatch(resetErrors());\n history.replace(ROOT_ROUTE);\n },\n signOut: () => {\n Auth.signOut();\n },\n };\n};\n\nclass EditProfile extends Component {\n constructor(props) {\n super(props);\n this.focusName = createRef();\n this.focusRole = createRef();\n }\n\n componentDidMount() {\n this.props.resetMessages();\n\n // TODO this doesn't work if we don't have the users list loaded yet\n this.focusName.current.focus();\n }\n\n componentDidUpdate(prevProps, prevState) {\n // this will close the modal in the case when someone goes directly to the edit route for a non-confirmed user\n //if (this.props.user.email && !this.props.user.confirmed) {\n //this.props.hideModal();\n //}\n }\n\n render() {\n const {\n hideModal,\n onSubmit,\n shouldLockForm,\n shouldLockSubmit,\n errors,\n currentUser,\n signOut\n } = this.props;\n const confirmMessage = currentUser.confirmed ? 'Update' : 'Submit';\n const isNameSet = currentUser.preferredFirstName && currentUser.preferredFirstName;\n const cancelMessage = isNameSet ? 'Cancel' : 'Sign Out';\n const title = isNameSet ? 'Edit your name' : 'You will need to enter your name to use the application'\n return (\n \n
\n

{title}

\n \n \n \n \n \n \n \n \n \n \n
\n \n {shouldLockForm ? : confirmMessage}\n \n \n {shouldLockForm ? : cancelMessage}\n \n
\n \n
\n );\n }\n}\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(EditProfile);\n","import React from \"react\";\nimport wordmark from \"./wordmark.png\";\nimport { APP_TITLE } from \"../../constants\";\n\n\nconst LoginWrapper = props => {\n\n return (\n
\n
\n
\n \n

{APP_TITLE}

\n
\n { props.children }\n
\n
\n );\n}\n\nexport default LoginWrapper;\n","import React, { Component } from \"react\";\nimport { Spinner, Button, ErrorList } from \"../../components/widgets\";\nimport LoginWrapper from './login-wrapper';\n\nimport { connect } from 'react-redux';\n\nimport Auth from '../../auth';\n\nimport {\n resetErrors,\n} from '../../actions';\n\n\nclass LoginForm extends Component {\n componentDidMount() {\n this.props.clearLoginErrors();\n }\n\n render() {\n const { signIn, errors, shouldLockForm} = this.props;\n\n return (\n \n \n {shouldLockForm ? : \"Sign in with SSO\"}\n \n );\n }\n}\n\nexport default connect(\n (state, props) => ({\n // 'code' will be in the url if we are redirected from SSO login.\n // We need to check window.location.search because this.props.location and this.props.history don't include 'code'.\n // This is probably because we are using the hash router\n shouldLockForm: window.location.search.search('code') !== -1,\n errors: state.messages.errors,\n }),\n (dispatch, props) => ({\n clearLoginErrors: () => dispatch(resetErrors()),\n signIn: () => Auth.federatedSignIn()\n })\n)(LoginForm);\n","import React from \"react\";\nimport Auth from '../../auth';\nimport LoginWrapper from './login-wrapper';\nimport { Button } from '../../components/widgets';\nimport { WELCOME_BLURB_UNAUTHED } from \"../../constants/fragments\";\n\nconst Unregistered = props => (\n \n
\n { WELCOME_BLURB_UNAUTHED }\n
\n Auth.signOut()}\n >Sign Out\n
\n);\n\nexport default Unregistered;\n","import React from \"react\";\nimport { Table } from \"../../../components/widgets\";\nimport { connect } from 'react-redux';\nimport UserButtons from './user-buttons';\nimport {\n getUserList,\n getCurrentUser\n} from \"../../../selectors\";\n\nimport { isLocationAccessCoordinator } from \"../../../utils\";\n\nconst USER_LIST_COLUMNS = [\n {\n name: 'email',\n displayName: 'Email',\n displayTransformer: user => {user.email},\n filter: (user, filterTerm) => user.email &&\n user.email.toLowerCase().includes(filterTerm.toLowerCase()),\n sort: (a, b) => a.email > b.email ? 1 : -1,\n defaultSort: true,\n },\n\n {\n name: 'firstName',\n displayName: 'First Name',\n displayTransformer: user => user.firstName,\n filter: (user, filterTerm) => user.firstName &&\n user.firstName.toLowerCase().includes(filterTerm.toLowerCase()),\n sort: (a, b) => {\n if (a.firstName && b.firstName) {\n return a.firstName.toLowerCase() > b.firstName.toLowerCase() ? 1 : -1;\n }\n return a.firstName ? -1 : 1;\n },\n },\n {\n name: 'lastName',\n displayName: 'Last Name',\n displayTransformer: user => user.lastName,\n filter: (user, filterTerm) => user.lastName &&\n user.lastName.toLowerCase().includes(filterTerm.toLowerCase()),\n sort: (a, b) => {\n if (a.lastName && b.lastName) {\n return a.lastName.toLowerCase() > b.lastName.toLowerCase() ? 1 : -1;\n }\n return a.lastName ? -1 : 1;\n },\n },\n\n {\n name: 'campus',\n displayName: 'Campus',\n displayTransformer: user => user.campus ? user.campus.short_name : \"N/A\",\n filter: (user, filterTerm) => user.campus &&\n user.campus.short_name.toLowerCase().includes(filterTerm.toLowerCase()),\n sort: (a, b) => {\n // we shouldn't actually have a user without a campus but it doesn't hurt to check\n if (!a.campus) {\n return 1;\n }\n\n if (!b.campus) {\n return -1;\n }\n\n if (a.campus.short_name === b.campus.short_name) {\n return a.email > b.email ? 1 : -1;\n }\n\n return a.campus.short_name > b.campus.short_name ? 1 : -1;\n },\n },\n\n {\n name: 'roleName',\n displayName: 'Role',\n filter: (user, filterTerm) => user.roleName && user.roleName.toLowerCase().includes(filterTerm.toLowerCase()),\n sort: (a, b) => {\n if (a.roleName === b.roleName) {\n return a.email > b.email ? 1 : -1;\n }\n\n return a.roleName > b.roleName ? 1 : -1;\n },\n },\n\n {\n name: 'action',\n displayName: 'Action',\n displayTransformer: UserButtons\n },\n];\n\nconst mapStateToProps = (state, props) => ({\n data: getUserList(state),\n currentUser: getCurrentUser(state)\n});\n\nconst UserList = props => {\n const { currentUser, data } = props;\n\n if (isLocationAccessCoordinator(currentUser)) {\n\n const emailSuffix = currentUser.email.split('@')[1];\n // using if here in case we have imporoper email data\n if (emailSuffix) {\n // grab the last two secctions of the domain\n const domain = emailSuffix.split('.').slice(-2).join('.');\n USER_LIST_COLUMNS[0].initialFilterValue = domain;\n }\n }\n\n return (\n
\n \n
\n );\n}\n\nexport default connect(\n mapStateToProps\n)(UserList);\n\n","import React, { Fragment } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { USERS_DELETE_ROUTE_PREFIX, USERS_EDIT_ROUTE_PREFIX } from \"../../../constants/routes\";\n\nconst UserButtons = props => {\n const { email, id } = props;\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default UserButtons;\n","import React, { Component, createRef } from \"react\";\nimport \"./style.scss\";\nimport { Modal } from \"../../../components\";\nimport {\n Form,\n TextInput,\n Button,\n Spinner,\n ErrorList\n} from \"../../../components/widgets\";\n\nimport { USERS_ROUTE } from \"../../../constants/routes\";\n\nimport {\n resetAllMessages,\n resetErrors,\n attemptToDeleteUser\n} from \"../../../actions\";\n\nimport { connect } from \"react-redux\";\n\nimport {\n getUserById\n} from '../../../selectors';\n\nimport history from \"../../../history\";\n\nconst mapStateToProps = (state, props) => {\n const { id } = props.match.params;\n const getUser = getUserById(id);\n\n return {\n user: getUser(state),\n shouldLockForm: state.users.actions.isLoading,\n shouldLockSubmit: state.users.actions.isLoading,\n errors: state.messages.errors\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n const { id } = props.match.params;\n return {\n onSubmit: userData => dispatch(attemptToDeleteUser({...userData, id} )),\n resetMessages: () => dispatch(resetAllMessages()),\n hideModal: () => {\n history.replace(USERS_ROUTE);\n dispatch(resetErrors());\n }\n };\n};\n\nclass AddUser extends Component {\n constructor(props) {\n super(props);\n this.focusRef = createRef();\n }\n componentDidMount() {\n this.props.resetMessages();\n this.focusRef.current.focus();\n }\n\n render() {\n const {\n hideModal,\n onSubmit,\n shouldLockForm,\n shouldLockSubmit,\n errors\n } = this.props;\n\n const user = this.props.user || {};\n return (\n \n
\n

Delete {user.email}

\n \n
\n

Please type {user.email} to confirm deletion.

\n
\n

This action is irreversible.

\n \n
\n \n {shouldLockForm ? : \"Confirm\"}\n \n \n {shouldLockForm ? : \"Cancel\"}\n \n
\n \n
\n );\n }\n}\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(AddUser);\n","import React, { Component, Fragment, createRef } from \"react\";\nimport \"./style.scss\";\nimport { Modal } from \"../../../components\";\nimport {\n Form,\n TextInput,\n Button,\n Spinner,\n ErrorList,\n Select\n} from \"../../../components/widgets\";\n\nimport { USERS_ROUTE } from \"../../../constants/routes\";\n\nimport { ROLES, ROLE_VIEWER } from \"../../../constants\";\n\nimport { getCampusListSelectData, getUserById } from \"../../../selectors\";\n\nimport {\n resetAllMessages,\n resetErrors,\n attemptToUpdateUser\n} from \"../../../actions\";\n\nimport { connect } from \"react-redux\";\n\nimport history from \"../../../history\";\n\nimport { isSystemAdmin } from \"../../../utils\";\nimport { getCurrentUser } from \"../../../selectors\";\n\nconst mapStateToProps = (state, props) => {\n const { id } = props.match.params;\n\n return {\n user: getUserById(id)(state),\n shouldLockForm: state.users.actions.isLoading,\n shouldLockSubmit: state.users.actions.isLoading || state.campuses.isLoading,\n errors: state.messages.errors,\n campusList: getCampusListSelectData(state),\n currentUser: getCurrentUser(state)\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n const { id } = props.match.params;\n return {\n onSubmit: userData => dispatch(attemptToUpdateUser({ ...userData, id })),\n resetMessages: () => dispatch(resetAllMessages()),\n hideModal: () => {\n history.replace(USERS_ROUTE);\n dispatch(resetErrors());\n },\n };\n};\n\nclass EditUser extends Component {\n constructor(props) {\n super(props);\n this.focusName = createRef();\n this.focusRole = createRef();\n\n }\n\n componentDidMount() {\n this.props.resetMessages();\n\n // TODO this doesn't work if we don't have the users list loaded yet\n this.focusName.current.focus();\n }\n\n componentDidUpdate(prevProps, prevState) {\n // this will close the modal in the case when someone goes directly to the edit route for a non-confirmed user\n //if (this.props.user.email && !this.props.user.confirmed) {\n //this.props.hideModal();\n //}\n }\n\n render() {\n const {\n campusList,\n hideModal,\n onSubmit,\n shouldLockForm,\n shouldLockSubmit,\n errors,\n user,\n currentUser\n } = this.props;\n\n const confirmMessage = user.confirmed ? 'Update' : 'Register';\n\n return (\n \n
\n

Edit {user.email}

\n \n \n \n \n {\n isSystemAdmin(currentUser) ?\n \n \n \n \n :\n \n \n \n \n }\n \n
\n \n {shouldLockForm ? : confirmMessage}\n \n \n {shouldLockForm ? : \"Cancel\"}\n \n
\n \n
\n );\n }\n}\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(EditUser);\n","import React, { Component } from \"react\";\nimport \"./style.scss\";\nimport {\n AuthenticatedRoute,\n PageContainer,\n PageContent,\n LeftsideMenu\n} from \"../../../components\";\n\nimport {\n USERS_DELETE_ROUTE,\n USERS_EDIT_ROUTE,\n USERS_ROUTE\n} from \"../../../constants/routes\";\nimport { Spinner } from \"../../../components/widgets\";\nimport UserList from \"./list-user\";\nimport DeleteUserModal from \"./delete-user-modal\";\nimport EditUserModal from \"./edit-user-modal\";\n\nimport { connect } from \"react-redux\";\n\nimport {\n fetchAndLoadUserList,\n fetchAndLoadCampusList,\n resetAllMessages } from \"../../../actions\";\n\nimport {\n ROLE_SYSTEM_ADMINISTRATOR,\n ROLE_LOCATION_ACCESS_COORDINATOR\n} from \"../../../constants\";\n\nimport { isSystemAdmin } from \"../../../utils\";\nimport { getCurrentUser } from \"../../../selectors\";\n\nconst mapStateToProps = (state, props) => ({\n isLoadingUserList: state.users.list.isLoading,\n currentUser: getCurrentUser(state)\n});\n\nclass Users extends Component {\n componentDidMount() {\n this.props.fetchAndLoadCampusList();\n this.props.fetchAndLoadUserList();\n this.props.resetAllMessages();\n }\n\n componentWillUnmount() {\n this.props.resetAllMessages();\n }\n\n render() {\n const { currentUser, isLoadingUserList } = this.props;\n return (\n \n \n \n { isSystemAdmin(currentUser) && }\n \n {isLoadingUserList ? : }\n \n \n );\n }\n}\n\nexport default connect(\n mapStateToProps,\n {\n fetchAndLoadUserList,\n fetchAndLoadCampusList,\n resetAllMessages\n }\n)(Users);\n","import React, { Component } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Table } from \"../../../components/widgets\";\nimport { connect } from \"react-redux\";\nimport { getSortedCategoryListWithIssueCount } from \"../../../selectors\";\nimport {\n CATEGORY_EDIT_ROUTE_PREFIX,\n CATEGORY_CREATE_ROUTE,\n CATEGORY_ROUTE_PREFIX\n} from \"../../../constants/routes\";\n\nconst CategoryActionButton = props => {\n const { id, name } = props;\n\n return (\n \n \n \n );\n};\n\nconst CATEGORY_LIST_COLUMNS = [\n {\n name: \"name\",\n displayName: \"Category Name\",\n displayTransformer: category => {category.name},\n sort: (a, b) => (a.name > b.name) ? 1 : -1,\n filter: (category, filterTerm) => category.name.toLowerCase().includes(filterTerm.toLowerCase()),\n defaultSort: true,\n },\n {\n name: \"issueCount\",\n displayName: \"Issues\",\n sort: (a, b) => (a.issueCount > b.issueCount) ? 1 : -1,\n descending: true\n },\n {\n name: \"action\",\n displayName: \"Action\",\n displayTransformer: CategoryActionButton,\n width: 70\n }\n];\n\nconst mapStateToProps = (state, props) => ({\n data: getSortedCategoryListWithIssueCount(state)\n});\n\nclass CategoryAdminList extends Component {\n render() {\n const { data } = this.props;\n return (\n
\n \n \n Add a category\n \n \n \n
\n );\n }\n}\n\nexport default connect(mapStateToProps)(CategoryAdminList);\n","import React, { Component, createRef } from \"react\";\nimport { Modal } from \"../../../components\";\nimport {\n Form,\n TextInput,\n Button,\n Spinner,\n ErrorList\n} from \"../../../components/widgets\";\n\nimport { CATEGORY_LIST_ROUTE } from \"../../../constants/routes\";\n\nimport { resetAllMessages, resetErrors } from \"../../../actions\";\n\nimport { connect } from \"react-redux\";\nimport history from \"../../../history\";\n\nimport { getCategoryById } from \"../../../selectors\";\nimport { attemptToUpdateCategory } from \"../../../actions\";\n\nconst mapStateToProps = (state, props) => {\n const { id } = props.match.params;\n\n return {\n category: getCategoryById(id)(state),\n shouldLockForm:\n state.categories.list.isLoading || state.categories.actions.isLoading,\n errors: state.messages.errors\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n const { id } = props.match.params;\n return {\n onSubmit: categoryData =>\n dispatch(attemptToUpdateCategory({ ...categoryData, id })),\n resetMessages: () => dispatch(resetAllMessages()),\n hideModal: () => {\n history.replace(CATEGORY_LIST_ROUTE);\n dispatch(resetErrors());\n }\n };\n};\n\nclass EditCategory extends Component {\n constructor(props) {\n super(props);\n this.focusRef = createRef();\n }\n componentDidMount() {\n this.props.resetMessages();\n this.focusRef.current.focus();\n }\n\n render() {\n const {\n hideModal,\n onSubmit,\n shouldLockForm,\n errors,\n category\n } = this.props;\n\n return (\n \n
\n

Edit {category ? category.name : \"Category\"}

\n
\n \n \n
\n \n {shouldLockForm ? : \"Update\"}\n \n \n {shouldLockForm ? : \"Cancel\"}\n \n
\n \n
\n );\n }\n}\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(EditCategory);\n","import React, { Component, createRef } from \"react\";\nimport { Modal } from \"../../../components\";\nimport {\n Form,\n TextInput,\n Button,\n Spinner,\n ErrorList\n} from \"../../../components/widgets\";\n\nimport { CATEGORY_LIST_ROUTE } from \"../../../constants/routes\";\n\nimport { resetAllMessages, resetErrors } from \"../../../actions\";\n\nimport { connect } from \"react-redux\";\nimport history from \"../../../history\";\n\nimport { attemptToCreateCategory } from \"../../../actions\";\n\nconst mapStateToProps = (state, props) => {\n return {\n shouldLockForm: state.categories.actions.isLoading,\n errors: state.messages.errors\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n onSubmit: categoryData => dispatch(attemptToCreateCategory(categoryData)),\n resetMessages: () => dispatch(resetAllMessages()),\n hideModal: () => {\n history.replace(CATEGORY_LIST_ROUTE);\n dispatch(resetErrors());\n }\n };\n};\n\nclass CreateCategory extends Component {\n constructor(props) {\n super(props);\n this.focusRef = createRef();\n }\n\n componentDidMount() {\n this.props.resetMessages();\n this.focusRef.current.focus();\n }\n\n render() {\n const { hideModal, onSubmit, shouldLockForm, errors } = this.props;\n\n return (\n \n
\n

Create a new Category

\n
\n \n \n

\n This action is irreversible. Please type your email address to\n verify that you actually want to do this.\n

\n \n
\n \n {shouldLockForm ? : \"Save\"}\n \n \n {shouldLockForm ? : \"Cancel\"}\n \n
\n \n
\n );\n }\n}\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(CreateCategory);\n","import React, { Component } from \"react\";\n\nimport {\n AuthenticatedRoute,\n PageContainer,\n PageContent,\n LeftsideMenu\n} from \"../../../components\";\n\nimport { Spinner } from \"../../../components/widgets\";\nimport CategoryAdminList from './category-admin-list';\n\nimport { connect } from \"react-redux\";\n\nimport {\n resetAllMessages,\n fetchAndLoadCategoryList\n} from \"../../../actions\";\n\nimport {\n CATEGORY_EDIT_ROUTE,\n CATEGORY_LIST_ROUTE,\n CATEGORY_CREATE_ROUTE\n} from \"../../../constants/routes\";\n\nimport {\n ROLE_SYSTEM_ADMINISTRATOR\n} from \"../../../constants\";\n\nimport EditCategoryModal from './edit-category-modal';\nimport CreateCategoryModal from './create-category-modal';\n\n\nconst mapStateToProps = (state, props) => ({\n isLoading: state.categories.list.isLoading\n});\n\nclass Categories extends Component {\n componentDidMount() {\n this.props.resetAllMessages();\n this.props.fetchAndLoadCategoryList(true);\n }\n\n componentWillUnmount() {\n this.props.resetAllMessages();\n }\n\n render() {\n const { isLoading } = this.props;\n return (\n \n \n \n \n \n {isLoading ? : }\n \n \n );\n }\n}\n\nexport default connect(\n mapStateToProps,\n {\n resetAllMessages,\n fetchAndLoadCategoryList\n }\n)(Categories);\n","import React, { Component } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Table } from \"../../../components/widgets\";\nimport { connect } from \"react-redux\";\nimport { makeIssueNameWithStatus } from \"../../../utils\";\nimport {\n CATEGORY_ROUTE_PREFIX,\n ISSUE_ROUTE_PREFIX,\n ISSUE_CREATE_ROUTE\n} from \"../../../constants/routes\";\n\nconst ISSUE_LIST_COLUMNS = [\n {\n name: \"title\",\n displayName: \"Issue Name\",\n displayTransformer: issue => {makeIssueNameWithStatus(issue)},\n sort: (a, b) => {\n if (a.published && !b.published) {\n return -1;\n }\n\n if (!a.published && b.published) {\n return 1;\n }\n\n return a.title.toLowerCase() > b.title.toLowerCase() ? 1 : -1;\n },\n filter: (issue, filterTerm) => makeIssueNameWithStatus(issue).toLowerCase().includes(filterTerm.toLowerCase()),\n defaultSort: true\n },\n {\n name: \"categoryName\",\n displayName: \"Category\",\n displayTransformer: issue => {issue.category.name},\n sort: (a, b) => a.category.name.toLowerCase() > b.category.name.toLowerCase() ? 1 : -1,\n filter: (issue, filterTerm) => issue.category.name.toLowerCase().includes(filterTerm.toLowerCase()),\n },\n {\n name: \"status\",\n displayName: \"Status\",\n displayTransformer: issue => issue.published ? \"Published\" : \"Unpublished\",\n }\n];\n\nconst mapStateToProps = (state, props) => ({\n data: state.issues.list.data\n});\n\nclass IssueAdminList extends Component {\n render() {\n const { data } = this.props;\n return (\n
\n \n \n Add an Issue\n \n \n \n
\n );\n }\n}\n\nexport default connect(mapStateToProps)(IssueAdminList);\n","import React, { Component, createRef } from \"react\";\nimport { Modal } from \"../../../components\";\nimport {\n Form,\n TextInput,\n Select,\n Button,\n Spinner,\n ErrorList\n} from \"../../../components/widgets\";\n\nimport { ISSUE_LIST_ROUTE } from \"../../../constants/routes\";\n\nimport { connect } from \"react-redux\";\nimport history from \"../../../history\";\n\nimport {\n resetAllMessages,\n resetErrors,\n fetchAndLoadCategoryList,\n attemptToCreateIssue\n} from \"../../../actions\";\n\nimport { getCategorySelectList } from \"../../../selectors\";\n\nconst mapStateToProps = (state, props) => {\n return {\n errors: state.messages.errors,\n shouldLockForm: state.categories.list.isLoading || state.issues.currentIssue.isUpdating,\n categories: getCategorySelectList(state)\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n onSubmit: issueData => dispatch(attemptToCreateIssue(issueData)),\n fetchAndLoadCategoryList: () => dispatch(fetchAndLoadCategoryList()),\n resetMessages: () => dispatch(resetAllMessages()),\n hideModal: () => {\n history.replace(ISSUE_LIST_ROUTE);\n dispatch(resetErrors());\n }\n };\n};\n\nclass CreateIssue extends Component {\n constructor(props) {\n super(props);\n this.focusRef = createRef();\n }\n\n componentDidMount() {\n this.props.resetMessages();\n this.props.fetchAndLoadCategoryList();\n this.focusRef.current.focus();\n }\n\n render() {\n const { categories, hideModal, onSubmit, shouldLockForm, errors } = this.props;\n\n return (\n \n
\n

Create a new Issue

\n
\n \n \n \n
\n \n {shouldLockForm ? : \"Create\"}\n \n \n {shouldLockForm ? : \"Cancel\"}\n \n
\n \n
\n );\n }\n}\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(CreateIssue);\n\n","import React, { Component } from \"react\";\nimport {\n AuthenticatedRoute,\n PageContainer,\n PageContent,\n LeftsideMenu\n} from \"../../../components\";\n\nimport { Spinner } from \"../../../components/widgets\";\nimport IssueAdminList from \"./issues-admin-list\";\n\nimport { connect } from \"react-redux\";\nimport {\n resetAllMessages,\n fetchAndLoadIssueList,\n fetchAndLoadCategoryList\n} from \"../../../actions\";\n\nimport {\n ISSUE_LIST_ROUTE,\n ISSUE_CREATE_ROUTE\n} from \"../../../constants/routes\";\n\nimport {\n ROLE_SYSTEM_ADMINISTRATOR\n} from \"../../../constants\";\n\nimport CreateIssueModal from \"./create-issue-modal\";\n\nconst mapStateToProps = (state, props) => ({\n isLoading: state.issues.list.isLoading\n});\n\nclass Issues extends Component {\n componentDidMount() {\n this.props.resetAllMessages();\n this.props.fetchAndLoadIssueList();\n this.props.fetchAndLoadCategoryList();\n }\n\n componentWillUnmount() {\n this.props.resetAllMessages();\n }\n\n render() {\n const { isLoading } = this.props;\n return (\n \n \n \n \n {isLoading ? : }\n \n \n );\n }\n}\n\nexport default connect(\n mapStateToProps,\n {\n resetAllMessages,\n fetchAndLoadIssueList,\n fetchAndLoadCategoryList\n }\n)(Issues);\n","import React, { useState, Fragment, Component } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Table } from \"../../../components/widgets\";\nimport { connect } from \"react-redux\";\nimport { getSortedTagListWithIssueData } from \"../../../selectors\";\nimport { makeIssueNameWithStatus, makeClassName } from \"../../../utils\";\nimport {\n TAG_CREATE_ROUTE,\n TAG_DELETE_ROUTE_PREFIX,\n TAG_EDIT_ROUTE_PREFIX,\n ISSUE_ROUTE_PREFIX\n} from '../../../constants/routes';\n\nconst TagIssueList = props => {\n const [showList, setShowList] = useState(false);\n const tag = props.tag;\n const issues = tag.issues;\n\n const hasIssues = issues.length > 0;\n\n return (\n \n setShowList(!showList)}\n aria-expanded={showList}\n >{tag.name}\n {hasIssues &&\n \n }\n \n {hasIssues && showList &&\n
    \n {issues.map((issue, idx) => (\n
  • \n {issue.category.name + \":\"}\n {makeIssueNameWithStatus(issue)}\n
  • \n ))}\n
\n }\n
\n );\n};\n\nconst TagActionButtons = props => {\n const { id, name } = props;\n\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nconst TAG_LIST_COLUMNS = [\n {\n name: \"name\",\n displayName: \"Tag Name\",\n displayTransformer: tag => tag.issues.length ? : tag.name,\n sort: (a, b) => (a.name > b.name) ? 1 : -1,\n filter: (tag, filterTerm) => tag.name.toLowerCase().includes(filterTerm.toLowerCase()),\n defaultSort: true,\n },\n {\n name: \"issueCount\",\n displayName: \"Issues\",\n sort: (a, b) => (a.issueCount > b.issueCount) ? 1 : -1,\n descending: true\n },\n {\n name: \"action\",\n displayName: \"Action\",\n displayTransformer: TagActionButtons,\n width: 70\n }\n];\n\nconst mapStateToProps = (state, props) => ({\n data: getSortedTagListWithIssueData(state)\n});\n\nclass TagAdminList extends Component {\n render() {\n const { data } = this.props;\n return (\n
\n \n \n Add a Tag\n \n \n item.id}\n />\n
\n );\n }\n}\n\nexport default connect(mapStateToProps)(TagAdminList);\n","import React, { Component, createRef } from \"react\";\nimport { Modal } from \"../../../components\";\nimport {\n Form,\n TextInput,\n Button,\n Spinner,\n ErrorList\n} from \"../../../components/widgets\";\n\nimport { TAG_LIST_ROUTE } from \"../../../constants/routes\";\n\nimport { resetAllMessages, resetErrors } from \"../../../actions\";\n\nimport { connect } from \"react-redux\";\nimport history from \"../../../history\";\n\nimport { attemptToCreateTag } from \"../../../actions\";\n\nconst mapStateToProps = (state, props) => {\n return {\n shouldLockForm: state.tags.actions.isLoading,\n errors: state.messages.errors\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n onSubmit: tagData => dispatch(attemptToCreateTag(tagData)),\n resetMessages: () => dispatch(resetAllMessages()),\n hideModal: () => {\n history.replace(TAG_LIST_ROUTE);\n dispatch(resetErrors());\n }\n };\n};\n\nclass CreateTag extends Component {\n constructor(props) {\n super(props);\n this.focusRef = createRef();\n }\n\n componentDidMount() {\n this.props.resetMessages();\n this.focusRef.current.focus();\n }\n\n render() {\n const { hideModal, onSubmit, shouldLockForm, errors } = this.props;\n\n return (\n \n
\n

Create a new Tag

\n
\n \n \n
\n \n {shouldLockForm ? : \"Save\"}\n \n \n {shouldLockForm ? : \"Cancel\"}\n \n
\n \n
\n );\n }\n}\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(CreateTag);\n","import React, { Component, createRef } from \"react\";\nimport { Modal } from \"../../../components\";\nimport {\n Form,\n TextInput,\n Button,\n Spinner,\n ErrorList\n} from \"../../../components/widgets\";\n\nimport { TAG_LIST_ROUTE } from \"../../../constants/routes\";\n\nimport { resetAllMessages, resetErrors } from \"../../../actions\";\n\nimport { connect } from \"react-redux\";\nimport history from \"../../../history\";\n\nimport { getTagById } from \"../../../selectors\";\nimport { attemptToUpdateTag } from \"../../../actions\";\n\nconst mapStateToProps = (state, props) => {\n const { id } = props.match.params;\n\n return {\n tag: getTagById(id)(state),\n shouldLockForm:\n state.tags.list.isLoading || state.tags.actions.isLoading,\n errors: state.messages.errors\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n const { id } = props.match.params;\n return {\n onSubmit: tagData =>\n dispatch(attemptToUpdateTag({ ...tagData, id })),\n resetMessages: () => dispatch(resetAllMessages()),\n hideModal: () => {\n history.replace(TAG_LIST_ROUTE);\n dispatch(resetErrors());\n }\n };\n};\n\nclass EditTag extends Component {\n constructor(props) {\n super(props);\n this.focusRef = createRef();\n }\n\n componentDidMount() {\n this.props.resetMessages();\n this.focusRef.current.focus();\n }\n\n render() {\n const {\n hideModal,\n onSubmit,\n shouldLockForm,\n errors,\n tag\n } = this.props;\n\n return (\n \n
\n

Edit {tag ? tag.name : \"Tag\"}

\n
\n \n \n
\n \n {shouldLockForm ? : \"Save\"}\n \n \n {shouldLockForm ? : \"Cancel\"}\n \n
\n \n
\n );\n }\n}\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(EditTag);\n","// TODO do we want any sort of auto-focus?\n\nimport React, { Component, createRef } from \"react\";\nimport { Modal } from \"../../../components\";\nimport {\n Form,\n Button,\n Spinner,\n ErrorList\n} from \"../../../components/widgets\";\n\nimport { getTagById } from \"../../../selectors\";\n\nimport { TAG_LIST_ROUTE } from \"../../../constants/routes\";\n\nimport {\n resetAllMessages,\n resetErrors,\n attemptToDeleteTag\n} from \"../../../actions\";\n\nimport { connect } from \"react-redux\";\nimport history from \"../../../history\";\n\n//import { attemptToCreateTag } from \"../../../actions\";\n\nconst mapStateToProps = (state, props) => {\n const { id } = props.match.params;\n\n return {\n tag: getTagById(id)(state),\n shouldLockForm: state.tags.list.isLoading || state.tags.actions.isLoading,\n shouldLockSubmit: state.tags.list.isLoading,\n errors: state.messages.errors\n };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n const { id } = props.match.params;\n\n return {\n onSubmit: () => dispatch(attemptToDeleteTag(id)),\n resetMessages: () => dispatch(resetAllMessages()),\n hideModal: () => {\n history.replace(TAG_LIST_ROUTE);\n dispatch(resetErrors());\n }\n };\n};\n\nclass DeleteTag extends Component {\n constructor(props) {\n super(props);\n this.focusRef = createRef();\n }\n\n componentDidMount() {\n this.props.resetMessages();\n this.focusRef.current.focus();\n }\n\n render() {\n const {\n hideModal,\n onSubmit,\n shouldLockForm,\n shouldLockSubmit,\n errors,\n tag\n } = this.props;\n\n return (\n \n
\n

Delete {tag ? tag.name : \"Tag\"}

\n
\n \n

Are you sure you want to delete {tag ? tag.name : \"Tag\"}?

\n

Once you press confirm, issues originally tagged will no longer be associated.

\n
\n \n {shouldLockForm ? : \"Confirm\"}\n \n \n {shouldLockForm ? : \"Cancel\"}\n \n
\n \n
\n );\n }\n}\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(DeleteTag);\n","import React, { Component } from \"react\";\n\nimport {\n AuthenticatedRoute,\n PageContainer,\n PageContent,\n LeftsideMenu\n} from \"../../../components\";\n\nimport { Spinner } from \"../../../components/widgets\";\nimport TagAdminList from './tags-admin-list';\n\nimport { connect } from \"react-redux\";\n\nimport {\n resetAllMessages,\n fetchAndLoadTagList\n} from \"../../../actions\";\n\nimport {\n TAG_LIST_ROUTE,\n TAG_CREATE_ROUTE,\n TAG_EDIT_ROUTE,\n TAG_DELETE_ROUTE\n} from \"../../../constants/routes\";\n\nimport {\n ROLE_SYSTEM_ADMINISTRATOR\n} from \"../../../constants\";\n\nimport CreateTagModal from './create-tag-modal';\nimport EditTagModal from './edit-tag-modal';\nimport DeleteTagModal from './delete-tag-modal';\n\nimport \"./style.scss\";\n\nconst mapStateToProps = (state, props) => ({\n isLoading: state.tags.list.isLoading\n});\n\nclass Tags extends Component {\n componentDidMount() {\n this.props.resetAllMessages();\n this.props.fetchAndLoadTagList(true);\n }\n\n componentWillUnmount() {\n this.props.resetAllMessages();\n }\n\n render() {\n const { isLoading } = this.props;\n return (\n \n \n \n \n \n \n {isLoading ? : }\n \n \n );\n }\n}\n\nexport default connect(\n mapStateToProps,\n {\n resetAllMessages,\n fetchAndLoadTagList\n }\n)(Tags);\n","import React, { Component } from \"react\";\nimport { Route, Redirect } from \"react-router-dom\";\nimport { LOGIN_ROUTE, UNREGISTERED_ROUTE, ROOT_ROUTE, PROFILE_EDIT_ROUTE } from \"../../constants/routes\";\n\nimport { connect } from \"react-redux\";\nimport { verifyCurrentUserSession } from '../../actions';\nimport { EditProfile } from \"../../pages\";\n\nconst mapStateToProps = (state, props) => {\n return {\n currentUser: state.session.currentUser\n };\n};\n\n// This component is used to prevent logged out or unregistered users from accessing any routes\n// that require a registered user and an active session to function.\n// This component will also prevent users who do not have the correct role (allowedRoles prop)\n// from accessing the route.\nclass AuthenticatedRoute extends Component {\n\n componentDidMount() {\n this.props.verifyCurrentUserSession();\n }\n\n componentDidUpdate() {\n this.props.verifyCurrentUserSession();\n }\n\n get isAuthenticated() {\n const { currentUser } = this.props;\n return Boolean(currentUser);\n }\n\n get isRegistered() {\n const { currentUser } = this.props;\n return Boolean(this.isAuthenticated && currentUser.role);\n }\n\n get isAuthorized() {\n const { allowedRoles, currentUser } = this.props;\n if (!allowedRoles) {\n return this.isRegistered;\n }\n\n return this.isRegistered && allowedRoles.find(role => currentUser.role === role);\n }\n\n get isNameSet() {\n const { currentUser } = this.props;\n let firstName = currentUser[\"custom:preferred_first_name\"];\n let lastName = currentUser[\"custom:preferred_last_name\"];\n return Boolean(this.isAuthenticated && firstName && lastName);\n }\n\n targetComponent(props) {\n const { component: Component } = this.props;\n\n if (!this.isAuthenticated) {\n return \n }\n\n if (!this.isNameSet) {\n return \n }\n\n if (!this.isRegistered) {\n return \n }\n\n if (!this.isAuthorized) {\n return \n }\n\n return ;\n }\n\n render() {\n // destructuring some extra variables to clean up ...rest a bit\n const { allowedRoles, children, component, currentUser, ...rest } = this.props;\n return (\n this.targetComponent(props)}>\n {children}\n \n );\n\n }\n}\n\nexport default connect(\n mapStateToProps,\n { verifyCurrentUserSession }\n)(AuthenticatedRoute);\n","import React, { Component } from \"react\";\nimport { Route, Redirect } from \"react-router-dom\";\nimport { ROOT_ROUTE, UNREGISTERED_ROUTE, PROFILE_EDIT_ROUTE } from \"../../constants/routes\";\nimport { connect } from \"react-redux\";\n\nconst mapStateToProps = (state, props) => {\n return {\n currentUser: state.session.currentUser\n };\n};\n\n// This component is used to prevent logged out or unregistered users from accessing any\n// routes that are _not_ expecting the user to have an active session.\n// Currently this is just the login form route.\nclass UnauthenticatedRoute extends Component {\n\n get isAuthenticated() {\n const { currentUser } = this.props;\n return Boolean(currentUser);\n }\n\n get isRegistered() {\n const { currentUser } = this.props;\n return Boolean(this.isAuthenticated && currentUser.role);\n }\n\n get isNameSet() {\n const { currentUser } = this.props;\n let firstName = currentUser[\"custom:preferred_first_name\"];\n let lastName = currentUser[\"custom:preferred_last_name\"];\n return Boolean(this.isAuthenticated && firstName && lastName);\n } \n\n targetComponent(props) {\n const { component: Component } = this.props;\n\n if (!this.isAuthenticated) {\n return Component ? : null;\n }\n\n if (!this.isNameSet) {\n return \n }\n\n if (!this.isRegistered) {\n return \n }\n\n return ;\n }\n\n render() {\n // destructuring some extra variables to clean up ...rest a bit\n const { component, currentUser, children, ...rest } = this.props;\n return (\n this.targetComponent(props) }>\n {children}\n \n );\n }\n}\n\nexport default connect(mapStateToProps)(UnauthenticatedRoute);\n","import React, { Fragment, Component } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { ROOT_ROUTE, USERS_ROUTE, PROFILE_EDIT_ROUTE } from \"../../constants/routes\";\nimport \"./style.scss\";\n\nimport { isSystemAdmin, isLocationAccessCoordinator, getRoleName } from \"../../utils\";\n\nimport { connect } from \"react-redux\";\nimport { getCurrentUser } from \"../../selectors\";\n\nimport Auth from '../../auth';\n\nconst mapStateToProps = (state, props) => {\n return {\n currentUser: getCurrentUser(state)\n };\n};\n\nclass Usermenu extends Component {\n constructor(props) {\n super(props);\n this.state = {\n isOpen: false\n };\n }\n\n toggleMenu = e => {\n const { isOpen } = this.state;\n if (this.node.contains(e.target)) {\n this.setState({\n isOpen: !isOpen\n });\n }\n };\n\n componentDidMount() {\n document.addEventListener(\"click\", this.toggleMenu);\n }\n\n componentWillUnmount() {\n document.removeEventListener(\"click\", this.toggleMenu);\n }\n\n render() {\n const { currentUser } = this.props;\n const { isOpen } = this.state;\n\n const roleName = getRoleName(currentUser.role);\n\n return (\n \n
\n
(this.node = node)}>\n
\n
\n
\n \n
\n \n \n
\n );\n }\n}\n\nexport default connect( mapStateToProps)(Usermenu);\n","import React from \"react\";\nimport \"./style.scss\";\n\nimport { Link } from \"react-router-dom\";\n\nimport {\n USERS_ROUTE,\n CATEGORY_LIST_ROUTE,\n ISSUE_LIST_ROUTE,\n TAG_LIST_ROUTE\n} from \"../../constants/routes\";\n\nconst LeftsideMenu = props => {\n const { path } = props;\n\n return (\n
\n
    \n

    Menu

    \n
  • \n \n \n Users\n \n
  • \n
  • \n \n \n Issues\n \n
  • \n
  • \n \n \n Categories\n \n
  • \n
  • \n \n \n Tags\n \n
  • \n
\n
\n );\n};\n\nexport default LeftsideMenu;\n","import React, { Component } from \"react\";\nimport PropTypes from \"prop-types\";\nimport \"./style.scss\";\nimport FocusTrap from \"react-focus-trap\";\n\nimport { makeClassName } from \"../../utils\";\n\nimport { setModalMessageStatus } from \"../../actions\";\nimport store from \"../../store\";\n\nclass Modal extends Component {\n componentDidMount() {\n store.dispatch(setModalMessageStatus(true));\n }\n\n componentWillUnmount() {\n store.dispatch(setModalMessageStatus(false));\n }\n\n render() {\n const { handleClose, children, id, className } = this.props;\n return (\n \n \n
\n {children}\n \n
\n
\n \n );\n }\n}\n\nModal.propTypes = {\n className: PropTypes.string,\n id: PropTypes.string,\n handleClose: PropTypes.func\n};\n\nexport default Modal;\n","import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport { Route, Router, Switch } from \"react-router-dom\";\n\nimport { APP_TITLE } from \"./constants\";\n\nimport history from \"./history\";\n\nimport {\n ROOT_ROUTE,\n ISSUE_ROUTE,\n ISSUE_VERSION_ROUTE,\n LOGIN_ROUTE,\n UNREGISTERED_ROUTE,\n CATEGORY_ROUTE,\n USERS_ROUTE,\n CATEGORY_LIST_ROUTE,\n ISSUE_LIST_ROUTE,\n TAG_LIST_ROUTE,\n SEARCH_ROUTE,\n PROFILE_EDIT_ROUTE,\n} from \"./constants/routes\";\n\nimport {\n ROLE_SYSTEM_ADMINISTRATOR,\n ROLE_LOCATION_ACCESS_COORDINATOR,\n} from \"./constants\";\n\nimport {\n AuthenticatedRoute,\n UnauthenticatedRoute,\n Header,\n Footer\n} from \"./components\";\n\nimport {\n LoginForm,\n Unregistered,\n Welcome,\n CategoryView,\n Issue,\n Users,\n CategoryAdminList,\n IssueAdminList,\n TagsAdminList,\n Search,\n EditProfile\n} from \"./pages\";\n\nimport { verifyCurrentUserSession } from \"./actions\";\n\nclass App extends Component {\n componentDidMount() {\n document.title = APP_TITLE;\n this.props.verifyCurrentUserSession();\n }\n\n renderApp() {\n const { isLoggedIn } = this.props;\n\n return (\n \n \n {isLoggedIn &&
}\n \n \n\n \n\n \n \n \n \n \n \n \n \n \n \n {/* This is a catch-all route so we can redirect to the dashboard for all unhandled urls */}\n {/* It needs to be at the end so we don't match a real route by mistake */}\n \n \n {isLoggedIn ?