{"version":3,"sources":["assets/gifs/loading-spinner-purple.gif","utils/types.ts","redux/domainObject/selectors.ts","redux/api/actions.ts","redux/navigation/actions.ts","redux/search/selectors.ts","redux/login/types.ts","components/domainObject/DomainObjectTags.tsx","components/domainObject/DomainObjectView.tsx","redux/login/actions.ts","redux/login/selectors.ts","components/login/styles.ts","components/login/Login.tsx","components/outOfService/styles.ts","redux/search/types.ts","components/outOfService/OutOfService.tsx","redux/search/actions.ts","components/waiting/styles.ts","components/waiting/Waiting.tsx","components/search/styles.ts","components/search/SearchBar.tsx","components/search/BusinessTable.tsx","redux/tag/actions.ts","redux/tag/selectors.ts","components/tag/Bulk.tsx","components/search/Search.tsx","components/tag/styles.ts","components/tag/Confirmation.tsx","components/tag/TagForm.tsx","components/tag/Create.tsx","components/tag/Edit.tsx","components/routes/styles.ts","redux/tag/types.ts","components/routes/NavigationBar.tsx","components/routes/PrivateRoute.tsx","components/routes/Routes.tsx","redux/domainObject/actions.ts","redux/domainObject/reducer.ts","redux/login/reducer.ts","redux/search/reducer.ts","redux/tag/reducer.ts","config.ts","sagas/api/tagr.ts","sagas/api/index.ts","sagas/domain.ts","sagas/navigation.ts","sagas/main.ts","redux/store.ts","styles.ts","App.tsx","index.tsx"],"names":["module","exports","HttpVerb","Path","DomainType","ActionTaken","getActiveDomainObject","state","domainObject","activeDomainObject","addTag","createAction","resolve","tag","updateTag","deleteTag","addDomainObjectToTag","domainType","domainObjectId","addDomainObjectToTagBulk","file","deleteDomainObjectToTag","deleteDomainObjectToTagBulk","searchDomainObjects","keyword","searchDomainObjectsByTag","searchTags","tagNamePrefix","error","createTag","confirmation","actionTaken","domainObjectView","bulkTag","editTag","errorMessage","search","waiting","getActivePageNumber","activePageNumber","getDomainObjects","domainObjects","getQuery","query","getSearchStatus","searchStatus","getSearchType","searchType","getTags","tags","LoginAttemptStatus","TAG","DomainObjectTagsComponent","props","getExistingTags","implicitlyAddTag","length","name","map","id","includes","handleFormChange","event","newState","target","value","setState","validateForm","handleSubmit","preventDefault","handleTagAddClick","handleTagDeleteClick","renderExistingTags","className","Badge","key","variant","onClick","goToEditTag","Button","size","stopPropagation","renderSearchTags","existingTagIds","renderLink","BUSINESS","href","primaryKey","renderSubtitle","BUSINESS_GROUP","getDomainTypeDisplayName","this","Form","onSubmit","autoComplete","Group","controlId","Control","autoFocus","onChange","type","placeholder","disabled","React","DomainObjectTags","connect","dispatch","apiActions","navigationActions","DomainObjectViewComponent","DomainObjectView","login","email","password","authenticated","failure","logout","getIsAuthenticated","getLoginAttemptStatus","loginAttemptStatus","LoginContainer","styled","div","LoginForm","form","LoginError","LoginComponent","isFormInvalid","handleChange","Label","FAILURE","Login","loginActions","SearchStatus","OutOfServiceWrapper","OutOfService","setActivePageNumber","clearSearch","setDomainObjects","setTagsForDomainObject","setTags","CenterWrapper","styledComponents","Waiting","src","loadingSpinnerPurpleGif","alt","PlaceholderText","SearchBarForm","SearchPage","BusinessTableWrapper","BusinessTableComponent","renderTags","business","paginate","items","NUM_PAGES","Math","ceil","resultsPerPage","pageNumber","push","Pagination","Item","active","getPageStartIndex","getPageEndIndex","renderSlice","slice","createTableEntry","goToDomainObjectView","businessGroup","Table","striped","bordered","hover","BusinessTable","searchActions","setActiveTag","setActionTaken","getActiveTag","activeTag","getActionTaken","getErrorMessage","TagAction","SearchBarComponent","handleSearchTypeChange","handleTagClick","renderModifyTagButton","renderBulkTagButton","placeholderText","Row","Col","sm","as","SearchBar","tagActions","SearchComponent","IN_PROGRESS","Search","BulkComponent","action","goToSearch","Object","values","files","UNTAG","bind","Check","inline","label","checked","handleActionSelection","handleFileSelection","Bulk","TagPage","ConfirmationComponent","renderCreateTagButton","CREATED","goToCreateTag","Confirmation","tagNameRegex","RegExp","TagFormComponent","hasTagNameError","tagName","trim","test","description","onSubmitAction","MODIFIED","handleDelete","renderDeleteButton","existingTag","hideTagNameError","renderTagNameError","Alert","dismissible","onClose","rows","TagForm","CreateComponent","Create","EditComponent","Edit","ErrorMessage","NavBar","NavBarLeft","NavBarRight","NavigationBarComponent","to","CREATE_TAG","NavigationBar","PrivateRouteComponent","LOGIN","Route","PrivateRoute","history","createBrowserHistory","RoutesComponent","window","location","pathname","SEARCH","exact","path","component","OUT_OF_SERVICE","WAITING","BULK_TAG","EDIT_TAG","DOMAIN_VIEW","CONFIRMATION","Routes","setActiveDomainObject","INITIAL_STATE","process","REACT_APP_ENV","NOT_ATTEMPTED","CLEARED","config","WEBAPP_CONFIG","API_DOMAIN","API_NAMESPACE","API_PORT","API_SCHEME","API_SERVICE_NAME","AUTH_SUBDOMAIN","EDGE_SUBDOMAIN","TAGR_SERVER_NAME_OVERRIDE","REACT_APP_TAGR_SERVER_NAME_OVERRIDE","checkReady","_tagrFetch","_fetch","getTag","getDomainObjectTags","_processDomainObjects","_getTagrServerName","tagrServerName","call","GET","_getUserName","userName","localStorage","getItem","Error","NOT_AUTHENTICATED_MESSAGE","verb","urlPath","contentType","body","tagrServiceNameUrlPart","url","response","floor","status","json","RESOURCE_CONFLICT","console","log","headers","fetch","method","edgeToken","Cookies","get","EDGE_TOKEN_NAME","credentials","mode","POST","JSON","stringify","PUT","DELETE","tagId","formData","FormData","append","apiResponse","Array","isArray","tagObject","_formatIntoTag","all","businessObject","_formatIntoBusiness","businesses","business_id","software_id","businessName","shortname","business_group_id","business_group_name","watcher","_setWebappConfig","_checkAuthenticated","_login","_addTag","_updateTag","_deleteTag","_searchTags","_addDomainObjectToTag","_addDomainObjectToTagBulk","_deleteDomainObjectToTag","_deleteDomainObjectToTagBulk","_setActiveDomainObject","_searchDomainObjects","_searchDomainObjectsByTag","_getTagsForDomainObjects","_handleError","takeLatest","tagrServerNameOverride","api_domain","api_namespace","api_port","api_scheme","api_service_name","auth_subdomain","edge_subdomain","put","message","_getAuthServerName","authServerName","base64LoginDetails","btoa","payload","Authorization","setItem","hostname","set","TAG_ALREADY_EXISTS","DELETED","TAG_IN_USE","BULK_UNTAG","select","domainObjectCurrent","domainObjectUpdated","cloneDeep","domainObjectActions","fork","i","setActiveDomainWithTags","_goToConfirmation","_goToDomainObjectView","_goToBulkTag","_goToEditTag","_goToSearch","_goToOutOfService","_goToCreateTag","_goToLogout","_goToWaiting","remove","removeItem","rootSaga","spawn","apiWatcher","navigationWatcher","reducers","getType","SUCCESS","DONE","LOGIN_ACTION_TYPE","sagaMiddleware","reduxSaga","_combinedReducers","combineReducers","Store","createStore","composeWithDevTools","applyMiddleware","next","info","run","GlobalStyle","createGlobalStyle","reset","AppHeader","App","hr","store","ReactDOM","document","getElementById"],"mappings":"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","file":"static/js/main.c9b562e3.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/loading-spinner-purple.1b643934.gif\";","export enum HttpVerb {\n GET = 'GET',\n DELETE = 'DELETE',\n POST = 'POST',\n PUT = 'PUT'\n}\n\nexport enum Path {\n BULK_TAG = '/bulk-tag',\n CREATE_TAG = '/create-tag',\n CONFIRMATION = '/confirmation',\n DOMAIN_VIEW = '/domain',\n EDIT_TAG = '/edit-tag',\n LOGIN = '/login',\n OUT_OF_SERVICE = '/out-of-service',\n SEARCH = '/',\n WAITING = '/waiting'\n}\n\nexport enum DomainType {\n BUSINESS = 'business',\n BUSINESS_GROUP = 'business-group'\n}\n\nexport enum ActionTaken {\n BULK_TAG = 'applied in bulk',\n BULK_UNTAG = 'removed in bulk',\n CREATED = 'created',\n MODIFIED = 'modified',\n DELETED = 'deleted'\n}\n\nexport const TAG = 'tag';\n\nexport interface Tag {\n id: number;\n name: string;\n description: string;\n}\n\ninterface BaseDomainObject {\n domainType: DomainType;\n id: number;\n primaryKey: string; // name of business group, software ID of business, etc.\n tags: Tag[] | null;\n}\n\nexport type BusinessGroup = BaseDomainObject;\n\nexport interface Business extends BaseDomainObject {\n businessName: string;\n businessGroup: BusinessGroup;\n}\n\nexport type DomainObject = BusinessGroup | Business;\n\nexport const getDomainTypeDisplayName = (domainType: DomainType): string => {\n switch (domainType) {\n case DomainType.BUSINESS_GROUP:\n return 'Business Group';\n case DomainType.BUSINESS:\n default:\n return 'Business';\n }\n};\n","import { State } from 'src/redux/state.types';\nimport { DomainObject } from 'src/utils/types';\n\nexport const getActiveDomainObject = (state: State): DomainObject | null => {\n return state.domainObject.activeDomainObject;\n};\n","/* eslint @typescript-eslint/explicit-function-return-type: 0 */\n\nimport { createAction } from 'typesafe-actions';\n\nimport { DomainType, Tag } from 'src/utils/types';\n\nexport const addTag = createAction('API_ADD_TAG', resolve => (tag: Tag) => resolve({ tag }));\nexport const updateTag = createAction('API_UPDATE_TAG', resolve => (tag: Tag) => resolve({ tag }));\nexport const deleteTag = createAction('API_DELETE_TAG', resolve => (tag: Tag) => resolve({ tag }));\n\nexport const addDomainObjectToTag = createAction(\n 'API_ADD_DOMAIN_OBJECT_TO_TAG',\n resolve => (tag: Tag, domainType: DomainType, domainObjectId: number) =>\n resolve({ tag, domainType, domainObjectId })\n);\nexport const addDomainObjectToTagBulk = createAction(\n 'API_ADD_DOMAIN_OBJECT_TO_TAG_BULK',\n resolve => (tag: Tag, domainType: DomainType, file: File) => resolve({ tag, domainType, file })\n);\nexport const deleteDomainObjectToTag = createAction(\n 'API_DELETE_DOMAIN_OBJECT_TO_TAG',\n resolve => (tag: Tag, domainType: DomainType, domainObjectId: number) =>\n resolve({ tag, domainType, domainObjectId })\n);\nexport const deleteDomainObjectToTagBulk = createAction(\n 'API_DELETE_DOMAIN_OBJECT_TO_TAG_BULK',\n resolve => (tag: Tag, domainType: DomainType, file: File) => resolve({ tag, domainType, file })\n);\n\nexport const searchDomainObjects = createAction(\n 'API_SEARCH_DOMAIN_OBJECTS',\n resolve => (domainType: DomainType, keyword: string) => resolve({ domainType, keyword })\n);\nexport const searchDomainObjectsByTag = createAction(\n 'API_SEARCH_DOMAIN_OBJECTS_BY_TAG',\n resolve => (domainType: DomainType, tag: Tag) => resolve({ domainType, tag })\n);\nexport const searchTags = createAction('API_SEARCH_TAGS', resolve => (tagNamePrefix: string) =>\n resolve({ tagNamePrefix })\n);\n\nexport const error = createAction('API_ERROR', resolve => (error: Error) => resolve({ error }));\n","/* eslint @typescript-eslint/explicit-function-return-type: 0 */\n\nimport { createAction } from 'typesafe-actions';\n\nimport { ErrorMessage } from 'src/redux/tag/types';\nimport { ActionTaken, DomainObject, Tag } from 'src/utils/types';\n\nexport const createTag = createAction('NAVIGATION_CREATE_TAG');\nexport const confirmation = createAction(\n 'NAVIGATION_CONFIRMATION',\n resolve => (actionTaken: ActionTaken, tag: Tag) => resolve({ actionTaken, tag })\n);\nexport const domainObjectView = createAction(\n 'NAVIGATION_DOMAIN_OBJECT_VIEW',\n resolve => (domainObject: DomainObject) => resolve({ domainObject })\n);\n\nexport const bulkTag = createAction('NAVIGATION_BULK_TAG', resolve => (tag: Tag) => resolve({ tag }));\nexport const editTag = createAction(\n 'NAVIGATION_EDIT_TAG',\n resolve => (tag: Tag, errorMessage: ErrorMessage | null = null) => resolve({ tag, errorMessage })\n);\n\nexport const search = createAction('NAVIGATION_SEARCH');\nexport const waiting = createAction('NAVIGATION_WAITING');\n","import { State } from 'src/redux/state.types';\nimport { DomainObject, Tag } from 'src/utils/types';\n\nimport { SearchStatus, SearchType } from './types';\n\nexport const getActivePageNumber = (state: State): number => state.search.activePageNumber;\n\nexport const getDomainObjects = (state: State): DomainObject[] => state.search.domainObjects;\n\nexport const getQuery = (state: State): string => state.search.query;\n\nexport const getSearchStatus = (state: State): SearchStatus => state.search.searchStatus;\n\nexport const getSearchType = (state: State): SearchType => state.search.searchType;\n\nexport const getTags = (state: State): Tag[] => state.search.tags;\n","import { ActionType } from 'typesafe-actions';\n\nimport * as loginActions from './actions';\n\nexport enum LoginAttemptStatus {\n FAILURE = 'FAILURE',\n IN_PROGRESS = 'IN_PROGRESS',\n NOT_ATTEMPTED = 'NOT_ATTEMPTED',\n SUCCESS = 'SUCCESS'\n}\n\nexport interface LoginState {\n authenticated: boolean;\n loginAttemptStatus: LoginAttemptStatus;\n}\n\nexport type LoginActions = ActionType;\n","import * as React from 'react';\nimport { Badge, Button, Form, FormControlProps } from 'react-bootstrap';\nimport { connect } from 'react-redux';\n\nimport * as apiActions from 'src/redux/api/actions';\nimport * as navigationActions from 'src/redux/navigation/actions';\nimport { getTags } from 'src/redux/search/selectors';\nimport { State } from 'src/redux/state.types';\nimport { DomainObject, DomainType, getDomainTypeDisplayName, Tag } from 'src/utils/types';\n\ninterface DomainTagsProps {\n domainObject: DomainObject;\n}\n\ninterface DomainObjectTagsStateProps {\n tags: Tag[];\n}\n\ninterface DomainObjectTagsDispatchProps {\n addDomainObjectToTag: (tag: Tag, domainType: DomainType, domainObjectId: number) => void;\n deleteDomainObjectToTag: (tag: Tag, domainType: DomainType, domainObjectId: number) => void;\n goToEditTag: (tag: Tag) => void;\n searchTags: (tagNamePrefix: string) => void;\n}\n\nexport type DomainObjectTagsComponentProps = DomainTagsProps &\n DomainObjectTagsStateProps &\n DomainObjectTagsDispatchProps;\n\ninterface DomainObjectTagsState {\n tagNamePrefix: string;\n}\n\nexport class DomainObjectTagsComponent extends React.Component<\n DomainObjectTagsComponentProps,\n DomainObjectTagsState\n> {\n public constructor(props: DomainObjectTagsComponentProps) {\n super(props);\n this.state = {\n tagNamePrefix: ''\n };\n }\n\n private getExistingTags = (): Tag[] => {\n if (!this.props.domainObject.tags) {\n return [];\n }\n\n return this.props.domainObject.tags;\n };\n\n private implicitlyAddTag = () => {\n if (this.props.tags.length !== 1) {\n return;\n }\n\n const tag = this.props.tags[0];\n\n if (this.state.tagNamePrefix !== tag.name) {\n return;\n }\n\n const existingTagIds = this.getExistingTags().map(tag => tag.id);\n\n if (!existingTagIds.includes(tag.id)) {\n this.props.addDomainObjectToTag(tag, this.props.domainObject.domainType, this.props.domainObject.id);\n }\n };\n\n private handleFormChange = (event: React.ChangeEvent) => {\n const newState: DomainObjectTagsState = this.state;\n\n switch (event.target.id) {\n case 'searchTags':\n newState.tagNamePrefix = event.target.value;\n break;\n }\n this.setState(newState);\n };\n\n private validateForm = (): boolean => {\n return !!this.state.tagNamePrefix;\n };\n\n private handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n this.props.searchTags(this.state.tagNamePrefix);\n };\n\n private handleTagAddClick = (tag: Tag) => {\n this.props.addDomainObjectToTag(tag, this.props.domainObject.domainType, this.props.domainObject.id);\n };\n\n private handleTagDeleteClick = (tag: Tag) => {\n this.props.deleteDomainObjectToTag(tag, this.props.domainObject.domainType, this.props.domainObject.id);\n };\n\n private renderExistingTags = () => {\n if (!this.props.domainObject.tags) {\n return Loading...;\n }\n\n if (this.props.domainObject.tags.length === 0) {\n return No existing tags;\n }\n\n return this.props.domainObject.tags.map(tag => {\n return (\n this.props.goToEditTag(tag)}>\n {tag.name} {}\n {\n event.stopPropagation(); // prevent the parent (badge) onclick from processing\n this.handleTagDeleteClick(tag);\n }}\n >\n x\n \n \n );\n });\n };\n\n private renderSearchTags = () => {\n if (!this.props.tags || this.props.tags.length === 0) {\n return No tags found;\n }\n\n const existingTagIds = this.getExistingTags().map(tag => tag.id);\n\n return this.props.tags.map(tag => {\n if (!existingTagIds.includes(tag.id)) {\n return (\n {\n this.handleTagAddClick(tag);\n }}\n >\n {tag.name}\n \n );\n } else {\n return <>;\n }\n });\n };\n\n private renderLink = () => {\n if (this.props.domainObject.domainType !== DomainType.BUSINESS) {\n return <>;\n }\n return (\n \n Mission Control\n \n );\n };\n\n private renderSubtitle = () => {\n return (\n

\n {getDomainTypeDisplayName(this.props.domainObject.domainType)} | {this.props.domainObject.id}\n

\n );\n };\n\n render() {\n this.implicitlyAddTag();\n\n return (\n
\n {this.renderLink()}\n
\n

{this.props.domainObject.primaryKey}

\n
\n {this.renderSubtitle()}\n
\n {this.renderExistingTags()}\n
\n
\n
\n \n \n \n \n Submit\n \n \n
\n {this.renderSearchTags()}\n
\n );\n }\n}\n\nexport const mapStateToProps: (state: State) => DomainObjectTagsStateProps = (state: State) => ({\n tags: getTags(state)\n});\n\nexport const mapDispatchToProps = (dispatch: Function) => ({\n addDomainObjectToTag: (tag: Tag, domainType: DomainType, domainObjectId: number) =>\n dispatch(apiActions.addDomainObjectToTag(tag, domainType, domainObjectId)),\n deleteDomainObjectToTag: (tag: Tag, domainType: DomainType, domainObjectId: number) =>\n dispatch(apiActions.deleteDomainObjectToTag(tag, domainType, domainObjectId)),\n goToEditTag: (tag: Tag) => dispatch(navigationActions.editTag(tag)),\n searchTags: (tagNamePrefix: string) => dispatch(apiActions.searchTags(tagNamePrefix))\n});\n\nexport const DomainObjectTags = connect(mapStateToProps, mapDispatchToProps)(DomainObjectTagsComponent);\n","import * as React from 'react';\nimport { connect } from 'react-redux';\n\nimport { getActiveDomainObject } from 'src/redux/domainObject/selectors';\nimport { State } from 'src/redux/state.types';\nimport { DomainObject } from 'src/utils/types';\n\nimport { DomainObjectTags } from './DomainObjectTags';\n\ninterface DomainObjectViewStateProps {\n domainObject: DomainObject | null;\n}\n\nexport type DomainObjectViewComponentProps = DomainObjectViewStateProps;\n\nexport class DomainObjectViewComponent extends React.Component {\n public constructor(props: DomainObjectViewComponentProps) {\n super(props);\n }\n\n render() {\n if (!this.props.domainObject) {\n return

Please Select a Business from the Search

;\n }\n\n return ;\n }\n}\n\nexport const mapStateToProps: (state: State) => DomainObjectViewStateProps = (state: State) => ({\n domainObject: getActiveDomainObject(state)\n});\n\nexport const DomainObjectView = connect(mapStateToProps)(DomainObjectViewComponent);\n","/* eslint @typescript-eslint/explicit-function-return-type: 0 */\n\nimport { createAction } from 'typesafe-actions';\n\nexport const login = createAction('LOGIN_LOGIN', resolve => (email: string, password: string) =>\n resolve({ email, password })\n);\nexport const authenticated = createAction('LOGIN_AUTHENTICATED');\nexport const failure = createAction('LOGIN_FAILURE');\nexport const logout = createAction('LOGIN_LOGOUT');\n","import { State } from 'src/redux/state.types';\n\nimport { LoginAttemptStatus } from './types';\n\nexport const getIsAuthenticated = (state: State): boolean => {\n return state.login.authenticated;\n};\n\nexport const getLoginAttemptStatus = (state: State): LoginAttemptStatus => {\n return state.login.loginAttemptStatus;\n};\n","import styled from 'styled-components';\n\nexport const LoginContainer = styled.div`\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n padding-top: 4em;\n h1 {\n font-size: 24pt;\n font-weight: bold;\n }\n`;\n\nexport const LoginForm = styled.form`\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n padding: 3em 0;\n button {\n border-radius: 10em;\n box-sizing: border-box;\n color: white;\n margin-top: 2em;\n padding: 0.5em 4em 0.5em 4em;\n &:disabled {\n background-color: #74b29b;\n }\n &:enabled {\n background-color: #1eb683;\n &:active {\n background-color: #127252 !important;\n }\n &:hover {\n background-color: #20cc92;\n }\n }\n }\n input {\n height: 1.5em;\n width: 20em;\n font-size: 1em;\n padding: 1em 0.5em;\n }\n label {\n font-weight: bold;\n padding: 0.5em 0;\n }\n`;\n\nexport const LoginError = styled.div`\n color: red;\n`;\n","import * as React from 'react';\nimport { Button, Form, FormControlProps } from 'react-bootstrap';\nimport { connect } from 'react-redux';\n\nimport * as loginActions from 'src/redux/login/actions';\nimport { getIsAuthenticated, getLoginAttemptStatus } from 'src/redux/login/selectors';\nimport { LoginAttemptStatus } from 'src/redux/login/types';\nimport { State } from 'src/redux/state.types';\n\nimport { LoginContainer, LoginError, LoginForm } from './styles';\n\ninterface LoginStateProps {\n authenticated: boolean;\n loginAttemptStatus: LoginAttemptStatus;\n}\n\ninterface LoginDispatchProps {\n login: (email: string, password: string) => void;\n}\n\nexport type LoginComponentProps = LoginStateProps & LoginDispatchProps;\n\ninterface LoginState {\n email: string;\n password: string;\n}\n\nexport class LoginComponent extends React.Component {\n public constructor(props: LoginComponentProps) {\n super(props);\n this.state = {\n email: '',\n password: ''\n };\n }\n\n isFormInvalid = () => {\n return this.state.email.length < '@fivestars.com'.length + 1 || this.state.password.length === 0;\n };\n\n handleChange = (event: React.ChangeEvent) => {\n const newState: LoginState = this.state;\n\n switch (event.target.id) {\n case 'email':\n newState.email = event.target.value;\n break;\n\n case 'password':\n newState.password = event.target.value;\n break;\n }\n this.setState(newState);\n };\n\n handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n this.props.login(this.state.email, this.state.password);\n };\n\n render() {\n return (\n \n

Login

\n \n \n Email\n \n \n\n \n Password\n \n \n\n \n \n \n {this.props.loginAttemptStatus === LoginAttemptStatus.FAILURE ? 'Login Failed' : ''}\n \n
\n );\n }\n}\n\nexport const mapStateToProps: (state: State) => LoginStateProps = (state: State) => ({\n authenticated: getIsAuthenticated(state),\n loginAttemptStatus: getLoginAttemptStatus(state)\n});\n\nexport const mapDispatchToProps = (dispatch: Function) => ({\n login: (email: string, password: string) => dispatch(loginActions.login(email, password))\n});\n\nexport const Login = connect(mapStateToProps, mapDispatchToProps)(LoginComponent);\n","import styled from 'styled-components';\n\nexport const OutOfServiceWrapper = styled.div`\n padding: 2em;\n\n h1 {\n font-size: 24pt;\n padding-bottom: 1em;\n }\n`;\n","import { ActionType } from 'typesafe-actions';\n\nimport { DomainObject, DomainType, Tag, TAG } from 'src/utils/types';\n\nimport * as searchActions from './actions';\n\nexport enum SearchStatus {\n CLEARED = 'CLEARED',\n DONE = 'DONE',\n IN_PROGRESS = 'IN_PROGRESS'\n}\n\nexport type SearchType = DomainType | typeof TAG;\n\nexport interface SearchState {\n activePageNumber: number;\n domainObjects: DomainObject[];\n query: string;\n searchStatus: SearchStatus;\n searchType: SearchType;\n tags: Tag[];\n}\n\nexport type SearchActions = ActionType;\n","import * as React from 'react';\n\nimport { OutOfServiceWrapper } from './styles';\n\nexport class OutOfServiceComponent extends React.Component {\n public constructor(props: any) {\n super(props);\n }\n\n render() {\n return (\n \n

We encountered a problem

\n
\n );\n }\n}\n\nexport const OutOfService = OutOfServiceComponent;\n","/* eslint @typescript-eslint/explicit-function-return-type: 0 */\n\nimport { createAction } from 'typesafe-actions';\n\nimport { DomainObject, DomainType, Tag } from 'src/utils/types';\n\nexport const setActivePageNumber = createAction(\n 'SEARCH_SET_ACTIVE_PAGE_NUMBER',\n resolve => (activePageNumber: number) => resolve({ activePageNumber })\n);\n\nexport const clearSearch = createAction('SEARCH_CLEAR_SEARCH');\n\nexport const setDomainObjects = createAction(\n 'SEARCH_SET_DOMAIN_OBJECTS',\n resolve => (domainObjects: DomainObject[]) => resolve({ domainObjects })\n);\n\nexport const setTagsForDomainObject = createAction(\n 'SEARCH_SET_TAGS_FOR_DOMAIN_OBJECT',\n resolve => (domainType: DomainType, id: number, tags: Tag[]) => resolve({ domainType, id, tags })\n);\n\nexport const setTags = createAction('SEARCH_SET_TAGS', resolve => (tags: Tag[]) => resolve({ tags }));\n","import styledComponents from 'styled-components';\n\nexport const CenterWrapper = styledComponents.div`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n`;\n","import * as React from 'react';\n\nimport loadingSpinnerPurpleGif from 'src/assets/gifs/loading-spinner-purple.gif';\n\nimport { CenterWrapper } from './styles';\n\nexport const Waiting: React.FC = () => (\n \n \"\"\n \n);\n","import styled from 'styled-components';\n\nexport const SearchBarForm = styled.form`\n width: 30%;\n\n .col-sm-5 {\n margin: 0;\n padding: 0;\n }\n .row {\n flex-wrap: nowrap;\n margin: 0;\n }\n`;\n\nexport const SearchPage = styled.div`\n padding: 2em 3em;\n padding-bottom: 0em;\n\n h1 {\n font-size: 24pt;\n padding-bottom: 1em;\n }\n`;\n\nexport const BusinessTableWrapper = styled.div`\n padding: 2em 3em;\n\n h1 {\n font-size: 24pt;\n padding-bottom: 1em;\n }\n`;\n","import * as React from 'react';\nimport { Button, Col, Form, FormControlProps, Row } from 'react-bootstrap';\nimport { connect } from 'react-redux';\n\nimport * as apiActions from 'src/redux/api/actions';\nimport * as navigationActions from 'src/redux/navigation/actions';\nimport * as searchActions from 'src/redux/search/actions';\nimport { getQuery, getSearchType, getTags } from 'src/redux/search/selectors';\nimport { SearchType } from 'src/redux/search/types';\nimport { State } from 'src/redux/state.types';\nimport * as tagActions from 'src/redux/tag/actions';\nimport { getActiveTag } from 'src/redux/tag/selectors';\nimport { DomainType, Tag, TAG } from 'src/utils/types';\n\nimport { SearchBarForm } from './styles';\n\ninterface SearchBarParentProps {\n clearSearch: () => void;\n}\n\ninterface SearchBarStateProps {\n activeTag: Tag | null;\n query: string;\n searchType: SearchType;\n tags: Tag[];\n}\n\ninterface SearchBarDispatchProps {\n bulkTag: (tag: Tag) => void;\n editTag: (tag: Tag) => void;\n searchDomainObjects: (domainType: DomainType, keyword: string) => void;\n searchDomainObjectsByTag: (domainType: DomainType, tag: Tag) => void;\n searchTags: (tagNamePrefix: string) => void;\n setActivePageNumber: (activePageNumber: number) => void;\n setActiveTag: (tag: Tag) => void;\n}\n\nexport type SearchBarComponentProps = SearchBarDispatchProps & SearchBarParentProps & SearchBarStateProps;\n\nenum PlaceholderText {\n BUSINESS = 'Any part of the SOFTWARE_ID',\n BUSINESS_GROUP = 'Any part of the Business Group Name',\n TAG = 'Prefix of Tag Name(s)'\n}\n\ninterface SearchBarState {\n query: string;\n searchType: SearchType;\n}\n\nexport class SearchBarComponent extends React.Component {\n public constructor(props: SearchBarComponentProps) {\n super(props);\n this.state = {\n query: this.props.query,\n searchType: this.props.searchType\n };\n }\n\n private handleChange = (event: React.ChangeEvent) => {\n const newState: SearchBarState = this.state;\n\n switch (event.target.id) {\n case 'query':\n newState.query = event.target.value;\n break;\n }\n this.setState(newState);\n };\n\n private handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n\n if (this.state.searchType === DomainType.BUSINESS || this.state.searchType === DomainType.BUSINESS_GROUP) {\n this.props.searchDomainObjects(this.state.searchType, this.state.query);\n }\n\n if (this.state.searchType === TAG) {\n this.props.searchTags(this.state.query);\n }\n\n this.props.setActivePageNumber(1);\n };\n\n private validateForm = () => {\n return this.state.query.length > 0;\n };\n\n private handleSearchTypeChange = (event: React.ChangeEvent) => {\n this.props.clearSearch();\n\n switch (event.target.value) {\n case DomainType.BUSINESS:\n this.setState({\n query: '',\n searchType: DomainType.BUSINESS\n });\n break;\n\n case DomainType.BUSINESS_GROUP:\n this.setState({\n query: '',\n searchType: DomainType.BUSINESS_GROUP\n });\n break;\n\n case TAG:\n this.setState({\n query: '',\n searchType: TAG\n });\n break;\n }\n };\n\n private handleTagClick = (tag: Tag) => {\n this.props.setActiveTag(tag);\n this.props.searchDomainObjectsByTag(DomainType.BUSINESS, tag);\n };\n\n private renderSearchTags = () => {\n if (!this.props.tags || this.props.tags.length === 0) {\n return ;\n }\n return this.props.tags.map(tag => {\n return (\n {\n this.handleTagClick(tag);\n }}\n >\n {tag.name}\n \n );\n });\n };\n\n private renderModifyTagButton = () => {\n if (!this.props.activeTag) {\n return ;\n }\n\n return (\n {\n this.props.editTag(this.props.activeTag as Tag);\n }}\n >\n Modify Tag\n \n );\n };\n\n private renderBulkTagButton = () => {\n if (!this.props.activeTag) {\n return ;\n }\n\n return (\n {\n this.props.bulkTag(this.props.activeTag as Tag);\n }}\n >\n Bulk Tag\n \n );\n };\n\n render() {\n let placeholderText = PlaceholderText.TAG;\n\n if (this.state.searchType === DomainType.BUSINESS) {\n placeholderText = PlaceholderText.BUSINESS;\n } else if (this.state.searchType === DomainType.BUSINESS_GROUP) {\n placeholderText = PlaceholderText.BUSINESS_GROUP;\n }\n\n return (\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n {this.renderSearchTags()}\n
\n {this.renderModifyTagButton()}\n {this.renderBulkTagButton()}\n
\n
\n );\n }\n}\n\nexport const mapStateToProps = (state: State) => ({\n activeTag: getActiveTag(state),\n query: getQuery(state),\n searchType: getSearchType(state),\n tags: getTags(state)\n});\n\nexport const mapDispatchToProps = (dispatch: Function) => ({\n bulkTag: (tag: Tag) => dispatch(navigationActions.bulkTag(tag)),\n editTag: (tag: Tag) => dispatch(navigationActions.editTag(tag)),\n searchDomainObjects: (domainType: DomainType, keyword: string) =>\n dispatch(apiActions.searchDomainObjects(domainType, keyword)),\n searchDomainObjectsByTag: (domainType: DomainType, tag: Tag) =>\n dispatch(apiActions.searchDomainObjectsByTag(domainType, tag)),\n searchTags: (tagNamePrefix: string) => dispatch(apiActions.searchTags(tagNamePrefix)),\n setActivePageNumber: (activePageNumber: number) =>\n dispatch(searchActions.setActivePageNumber(activePageNumber)),\n setActiveTag: (tag: Tag) => dispatch(tagActions.setActiveTag(tag))\n});\n\nexport const SearchBar = connect(mapStateToProps, mapDispatchToProps)(SearchBarComponent);\n","import * as React from 'react';\nimport { Badge, Pagination, Table } from 'react-bootstrap';\nimport { connect } from 'react-redux';\n\nimport * as navigationActions from 'src/redux/navigation/actions';\nimport * as searchActions from 'src/redux/search/actions';\nimport { getActivePageNumber, getDomainObjects } from 'src/redux/search/selectors';\nimport { State } from 'src/redux/state.types';\nimport { Business, DomainObject, Tag } from 'src/utils/types';\n\nimport { BusinessTableWrapper } from './styles';\n\ninterface BusinessTableProp {\n resultsPerPage: number;\n}\n\ninterface BusinessTableStateProps {\n activePageNumber: number;\n domainObjects: DomainObject[];\n}\n\ninterface BusinessTableDispatchProps {\n goToDomainObjectView: (domainObject: DomainObject) => void;\n goToEditTag: (tag: Tag) => void;\n setActivePageNumber: (activePageNumber: number) => void;\n}\n\nexport type BusinessTableComponentProps = BusinessTableStateProps & BusinessTableProp & BusinessTableDispatchProps;\n\nexport class BusinessTableComponent extends React.Component {\n public constructor(props: BusinessTableComponentProps) {\n super(props);\n }\n\n private renderTags = (business: Business) => {\n if (!business.tags) {\n return Loading...;\n }\n if (business.tags.length === 0) {\n return No tags;\n }\n\n return business.tags.map(tag => {\n return (\n this.props.goToEditTag(tag)}>\n {tag.name}\n \n );\n });\n };\n\n private paginate = (): JSX.Element[] => {\n const items = [];\n const NUM_PAGES = Math.ceil(this.props.domainObjects.length / this.props.resultsPerPage);\n for (let pageNumber = 1; pageNumber <= NUM_PAGES; pageNumber += 1) {\n items.push(\n this.props.setActivePageNumber(pageNumber)}\n >\n {pageNumber}\n \n );\n }\n return items;\n };\n\n private getPageStartIndex = () => {\n return this.props.activePageNumber * this.props.resultsPerPage - this.props.resultsPerPage;\n };\n\n private getPageEndIndex = () => {\n return this.props.activePageNumber * this.props.resultsPerPage;\n };\n\n private renderSlice = () => {\n const slice: DomainObject[] = this.props.domainObjects.slice(\n this.getPageStartIndex(),\n this.getPageEndIndex()\n );\n\n return slice.length === 0 ? <> : slice.map(business => this.createTableEntry(business as Business));\n };\n\n private createTableEntry = (business: Business): JSX.Element => {\n return (\n \n this.props.goToDomainObjectView(business)}>\n {business.primaryKey}\n \n this.props.goToDomainObjectView(business.businessGroup)}>\n {business.businessGroup.primaryKey}\n \n {business.id}\n {this.renderTags(business)}\n \n );\n };\n\n render() {\n if (!this.props.domainObjects.length) {\n return <>;\n }\n return (\n \n \n \n \n \n \n \n \n \n \n {this.renderSlice()}\n
BusinessBusiness GroupBusiness IDTags
\n \n {this.paginate()}\n \n
\n );\n }\n}\n\nexport const mapStateToProps: (state: State) => BusinessTableStateProps = (state: State) => ({\n activePageNumber: getActivePageNumber(state),\n domainObjects: getDomainObjects(state)\n});\n\nexport const mapDispatchToProps = (dispatch: Function) => ({\n goToDomainObjectView: (domainObject: DomainObject) =>\n dispatch(navigationActions.domainObjectView(domainObject)),\n goToEditTag: (tag: Tag) => dispatch(navigationActions.editTag(tag)),\n setActivePageNumber: (activePageNumber: number) => dispatch(searchActions.setActivePageNumber(activePageNumber))\n});\n\nexport const BusinessTable = connect(mapStateToProps, mapDispatchToProps)(BusinessTableComponent);\n","/* eslint @typescript-eslint/explicit-function-return-type: 0 */\n\nimport { createAction } from 'typesafe-actions';\n\nimport { ActionTaken, Tag } from 'src/utils/types';\n\nimport { ErrorMessage } from './types';\n\nexport const setActiveTag = createAction(\n 'TAG_SET_ACTIVE_TAG',\n resolve => (tag: Tag | null, errorMessage: ErrorMessage | null = null) => resolve({ tag, errorMessage })\n);\nexport const setActionTaken = createAction('TAG_SET_ACTION_TAKEN', resolve => (actionTaken: ActionTaken) =>\n resolve({ actionTaken })\n);\n","import { State } from 'src/redux/state.types';\nimport { ActionTaken, Tag } from 'src/utils/types';\n\nimport { ErrorMessage } from './types';\n\nexport const getActiveTag = (state: State): Tag | null => {\n return state.tag.activeTag;\n};\n\nexport const getActionTaken = (state: State): ActionTaken => {\n return state.tag.actionTaken;\n};\n\nexport const getErrorMessage = (state: State): ErrorMessage | null => {\n return state.tag.errorMessage;\n};\n","import * as React from 'react';\nimport { Badge, Button, Form, FormControlProps } from 'react-bootstrap';\nimport { connect } from 'react-redux';\n\nimport * as apiActions from 'src/redux/api/actions';\nimport * as navigationActions from 'src/redux/navigation/actions';\nimport { State } from 'src/redux/state.types';\nimport { getActiveTag } from 'src/redux/tag/selectors';\n// import { ErrorMessage } from 'src/redux/tag/types';\nimport { DomainType, Tag } from 'src/utils/types';\n\nenum TagAction {\n TAG = 'tag',\n UNTAG = 'untag'\n}\n\nexport type BulkState = {\n action: TagAction;\n file: File | null;\n};\n\nexport type BulkStateProps = {\n tag: Tag | null;\n};\n\nexport type BulkDispatchProps = {\n addDomainObjectToTagBulk(tag: Tag, domainType: DomainType, file: File): void;\n deleteDomainObjectToTagBulk(tag: Tag, domainType: DomainType, file: File): void;\n goToSearch(): void;\n};\n\nexport type BulkComponentProps = BulkStateProps & BulkDispatchProps;\n\nexport class BulkComponent extends React.Component {\n public constructor(props: BulkComponentProps) {\n super(props);\n this.state = { action: TagAction.TAG, file: null };\n }\n\n public componentDidMount() {\n if (!this.props.tag) {\n this.props.goToSearch();\n }\n }\n\n private handleActionSelection(event: React.ChangeEvent) {\n if (!Object.values(TagAction).includes(event.target.value as TagAction)) {\n return;\n }\n\n this.setState({\n action: event.target.value as TagAction\n });\n }\n\n private handleFileSelection(event: React.ChangeEvent) {\n if (!event.target.files || !event.target.files.length) {\n return;\n }\n\n this.setState({\n file: event.target.files[0]\n });\n }\n\n private handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (!this.props.tag) {\n return;\n }\n if (!this.state.file) {\n return;\n }\n\n if (this.state.action === TagAction.TAG) {\n this.props.addDomainObjectToTagBulk(this.props.tag, DomainType.BUSINESS, this.state.file);\n } else if (this.state.action === TagAction.UNTAG) {\n this.props.deleteDomainObjectToTagBulk(this.props.tag, DomainType.BUSINESS, this.state.file);\n }\n }\n\n render() {\n if (!this.props.tag) {\n return <>;\n }\n\n return (\n
\n
\n \n Bulk \n \n \n \n {this.props.tag.name}\n \n \n \n
\n \n \n
\n );\n }\n}\n\nexport const mapStateToProps = (state: State): BulkStateProps => ({\n tag: getActiveTag(state)\n});\n\nexport const mapDispatchToProps = (dispatch: Function): BulkDispatchProps => ({\n addDomainObjectToTagBulk: (tag: Tag, domainType: DomainType, file: File) =>\n dispatch(apiActions.addDomainObjectToTagBulk(tag, domainType, file)),\n deleteDomainObjectToTagBulk: (tag: Tag, domainType: DomainType, file: File) =>\n dispatch(apiActions.deleteDomainObjectToTagBulk(tag, domainType, file)),\n goToSearch: () => dispatch(navigationActions.search())\n});\n\nexport const Bulk = connect(mapStateToProps, mapDispatchToProps)(BulkComponent);\n","import * as React from 'react';\nimport { connect } from 'react-redux';\n\nimport * as searchActions from 'src/redux/search/actions';\nimport { getSearchStatus } from 'src/redux/search/selectors';\nimport { SearchStatus } from 'src/redux/search/types';\nimport { State } from 'src/redux/state.types';\n\nimport { Waiting } from '../waiting/Waiting';\nimport { BusinessTable } from './BusinessTable';\nimport { SearchBar } from './SearchBar';\nimport { SearchPage } from './styles';\n\ninterface SearchStateProps {\n searchStatus: SearchStatus;\n}\n\ninterface SearchDispatchProps {\n clearSearch: () => void;\n}\n\nexport type SearchComponentProps = SearchStateProps & SearchDispatchProps;\n\nexport class SearchComponent extends React.Component {\n public constructor(props: SearchComponentProps) {\n super(props);\n }\n\n componentDidMount() {\n this.props.clearSearch();\n }\n\n render() {\n if (this.props.searchStatus === SearchStatus.IN_PROGRESS) {\n return ;\n }\n\n return (\n \n

Search

\n \n \n
\n );\n }\n}\n\nexport const mapStateToProps = (state: State) => ({\n searchStatus: getSearchStatus(state)\n});\n\nexport const mapDispatchToProps = (dispatch: Function) => ({\n clearSearch: () => dispatch(searchActions.clearSearch())\n});\n\nexport const Search = connect(mapStateToProps, mapDispatchToProps)(SearchComponent);\n","import styled from 'styled-components';\n\nexport const TagPage = styled.div`\n padding: 2em;\n\n h1 {\n font-size: 24pt;\n padding-bottom: 1em;\n }\n`;\n","import * as React from 'react';\nimport { Badge, Button, Col, Row } from 'react-bootstrap';\nimport { connect } from 'react-redux';\n\nimport * as navigationActions from 'src/redux/navigation/actions';\nimport { State } from 'src/redux/state.types';\nimport { getActionTaken, getActiveTag } from 'src/redux/tag/selectors';\nimport { ActionTaken, Tag } from 'src/utils/types';\n\nimport { TagPage } from './styles';\n\ninterface ConfirmationStateProps {\n actionTaken: ActionTaken;\n tag: Tag | null;\n}\n\ninterface ConfirmationDispatchProps {\n goToCreateTag: () => void;\n goToSearch: () => void;\n}\n\nexport type ConfirmationComponentProps = ConfirmationStateProps & ConfirmationDispatchProps;\n\nexport class ConfirmationComponent extends React.Component {\n public constructor(props: ConfirmationComponentProps) {\n super(props);\n }\n\n private renderCreateTagButton = () => {\n if (this.props.actionTaken !== ActionTaken.CREATED) {\n return <>;\n }\n return (\n \n );\n };\n\n render() {\n if (!this.props.tag) {\n return

No new changes to apply.

;\n }\n\n return (\n \n \n \n

\n Tag\n \n {this.props.tag.name} {}\n \n {this.props.actionTaken}!\n

\n
\n \n \n \n
\n {this.renderCreateTagButton()}\n \n
\n
\n \n
\n );\n }\n}\n\nexport const mapStateToProps: (state: State) => ConfirmationStateProps = (state: State) => ({\n actionTaken: getActionTaken(state),\n tag: getActiveTag(state)\n});\n\nexport const mapDispatchToProps = (dispatch: Function) => ({\n goToCreateTag: () => dispatch(navigationActions.createTag()),\n goToSearch: () => dispatch(navigationActions.search())\n});\n\nexport const Confirmation = connect(mapStateToProps, mapDispatchToProps)(ConfirmationComponent);\n","import * as React from 'react';\nimport { Alert, Button, Form, FormControlProps } from 'react-bootstrap';\nimport { connect } from 'react-redux';\n\nimport * as apiActions from 'src/redux/api/actions';\nimport { ActionTaken, Tag } from 'src/utils/types';\n\nconst TAG_NAME_PATTERN = /^[a-z][a-z0-9:-]*$/;\nconst tagNameRegex = new RegExp(TAG_NAME_PATTERN);\n\ninterface TagFormProps {\n existingTag?: Tag;\n onSubmitAction: ActionTaken;\n}\n\ninterface TagFormDispatchProps {\n addTag: (tag: Tag) => void;\n deleteTag: (tag: Tag) => void;\n updateTag: (tag: Tag) => void;\n}\n\nexport type TagFormComponentProps = TagFormProps & TagFormDispatchProps;\n\ninterface TagFormState {\n hasTagNameError: boolean;\n tag: Tag;\n}\n\nexport class TagFormComponent extends React.Component {\n public constructor(props: TagFormComponentProps) {\n super(props);\n\n const defaultTag: Tag = {\n description: '',\n id: 0,\n name: ''\n };\n this.state = {\n hasTagNameError: false,\n tag: props.existingTag ? props.existingTag : defaultTag\n };\n }\n\n validateForm() {\n return this.state.tag.name;\n }\n\n handleChange = (event: React.ChangeEvent) => {\n const newState: TagFormState = { ...this.state, hasTagNameError: false };\n\n switch (event.target.id) {\n case 'name':\n {\n const tagName = event.target.value.trim();\n if (tagName.length && !tagNameRegex.test(tagName)) {\n this.setState({\n hasTagNameError: true\n });\n return;\n }\n newState.tag.name = tagName;\n }\n break;\n case 'description':\n newState.tag.description = event.target.value;\n break;\n }\n this.setState(newState);\n };\n\n handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n\n switch (this.props.onSubmitAction) {\n case ActionTaken.CREATED:\n this.props.addTag(this.state.tag);\n break;\n case ActionTaken.MODIFIED:\n default:\n this.props.updateTag(this.state.tag);\n }\n };\n\n handleDelete = () => {\n this.props.deleteTag(this.state.tag);\n };\n\n private renderDeleteButton = (): JSX.Element => {\n if (!this.props.existingTag) {\n return <>;\n }\n\n return (\n \n );\n };\n\n private hideTagNameError = () => {\n this.setState({\n hasTagNameError: false\n });\n };\n\n private renderTagNameError = (): JSX.Element => {\n if (!this.state.hasTagNameError) {\n return <>;\n }\n\n return (\n
\n \n A tag name must start with a lowercase letter "a-z", and then can only include\n lowercase letters "a-z", digits "0-9", colons ":", and dashes\n "-" (ex., tags-are:great100)\n \n
\n );\n };\n\n render() {\n return (\n <>\n {this.renderTagNameError()}\n
\n \n Name\n \n \n\n \n Description\n \n \n\n \n {this.renderDeleteButton()}\n
\n \n );\n }\n}\n\nexport const mapDispatchToProps = (dispatch: Function) => ({\n addTag: (tag: Tag) => dispatch(apiActions.addTag(tag)),\n deleteTag: (tag: Tag) => dispatch(apiActions.deleteTag(tag)),\n updateTag: (tag: Tag) => dispatch(apiActions.updateTag(tag))\n});\n\nexport const TagForm = connect(null, mapDispatchToProps)(TagFormComponent);\n","import * as React from 'react';\nimport { connect } from 'react-redux';\n\nimport { ActionTaken } from 'src/utils/types';\n\nimport { TagPage } from './styles';\nimport { TagForm } from './TagForm';\n\nexport class CreateComponent extends React.Component {\n public constructor(props: any) {\n super(props);\n }\n\n render() {\n return (\n \n

Create Tag

\n \n
\n );\n }\n}\n\nexport const Create = connect()(CreateComponent);\n","import * as React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport { connect } from 'react-redux';\n\nimport { BusinessTable } from 'src/components/search/BusinessTable';\nimport { State } from 'src/redux/state.types';\nimport { getActiveTag, getErrorMessage } from 'src/redux/tag/selectors';\nimport { ErrorMessage } from 'src/redux/tag/types';\nimport { ActionTaken, Tag } from 'src/utils/types';\n\nimport { TagPage } from './styles';\nimport { TagForm } from './TagForm';\n\ninterface EditStateProps {\n errorMessage: ErrorMessage | null;\n tag: Tag | null;\n}\n\nexport type EditComponentProps = EditStateProps;\n\nexport class EditComponent extends React.Component {\n public constructor(props: EditComponentProps) {\n super(props);\n }\n\n render() {\n if (!this.props.tag) {\n return <>;\n }\n\n return (\n
\n \n

Modify Tag

\n {this.props.errorMessage ? {this.props.errorMessage} : null}\n \n
\n \n
\n );\n }\n}\n\nexport const mapStateToProps: (state: State) => EditStateProps = (state: State) => ({\n errorMessage: getErrorMessage(state),\n tag: getActiveTag(state)\n});\n\nexport const Edit = connect(mapStateToProps)(EditComponent);\n","import styled from 'styled-components';\n\nexport const NavBar = styled.div`\n background-color: #e6def2;\n display: flex;\n justify-content: space-between;\n padding: 1em;\n`;\n\nexport const NavBarLeft = styled.div``;\n\nexport const NavBarRight = styled.div``;\n","import { ActionType } from 'typesafe-actions';\n\nimport { ActionTaken, Tag } from 'src/utils/types';\n\nimport * as tagActions from './actions';\n\nexport enum ErrorMessage {\n TAG_ALREADY_EXISTS = 'Tag already exists',\n TAG_IN_USE = 'Tag is in use'\n}\n\nexport interface TagState {\n activeTag: Tag | null;\n actionTaken: ActionTaken;\n errorMessage: ErrorMessage | null;\n}\n\nexport type TagActions = ActionType;\n","import * as React from 'react';\nimport { connect } from 'react-redux';\nimport { Link } from 'react-router-dom';\n\nimport * as loginActions from 'src/redux/login/actions';\nimport { getIsAuthenticated } from 'src/redux/login/selectors';\nimport * as navigationActions from 'src/redux/navigation/actions';\nimport { State } from 'src/redux/state.types';\nimport { Path } from 'src/utils/types';\n\nimport { NavBar, NavBarLeft, NavBarRight } from './styles';\n\ninterface NavigationBarStateProps {\n authenticated: boolean;\n}\n\ninterface NavigationBarDispatchProps {\n logout: () => void;\n search: () => void;\n}\n\nexport type NavigationBarComponentProps = NavigationBarStateProps & NavigationBarDispatchProps;\n\nexport class NavigationBarComponent extends React.Component {\n render() {\n if (!this.props.authenticated) {\n return null;\n }\n\n return (\n <>\n \n \n this.props.search()}>\n Search\n \n {' | '}\n Create Tag\n \n \n this.props.logout()}>\n Logout\n \n \n \n \n );\n }\n}\n\nexport const mapStateToProps: (state: State) => NavigationBarStateProps = (state: State) => ({\n authenticated: getIsAuthenticated(state)\n});\n\nexport const mapDispatchToProps = (dispatch: Function) => ({\n logout: () => dispatch(loginActions.logout()),\n search: () => dispatch(navigationActions.search())\n});\n\nexport const NavigationBar = connect(mapStateToProps, mapDispatchToProps)(NavigationBarComponent);\n","import * as React from 'react';\nimport { connect } from 'react-redux';\nimport { Redirect, Route, RouteProps } from 'react-router-dom';\n\nimport { getIsAuthenticated } from 'src/redux/login/selectors';\nimport { State } from 'src/redux/state.types';\nimport { Path } from 'src/utils/types';\n\ninterface PrivateRouteStateProps {\n authenticated: boolean;\n}\n\nexport type PrivateRouteComponentProps = RouteProps & PrivateRouteStateProps;\n\nexport class PrivateRouteComponent extends Route {\n public constructor(props: PrivateRouteComponentProps) {\n super(props);\n }\n\n render() {\n if (this.props.authenticated) {\n return ;\n }\n return ;\n }\n}\n\nexport const mapStateToProps: (state: State) => PrivateRouteStateProps = (state: State) => ({\n authenticated: getIsAuthenticated(state)\n});\n\nexport const PrivateRoute = connect(mapStateToProps)(PrivateRouteComponent);\n","import { createBrowserHistory } from 'history';\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { Route, Router, Switch } from 'react-router-dom';\n\nimport { DomainObjectView } from 'src/components/domainObject/DomainObjectView';\nimport { Login } from 'src/components/login/Login';\nimport { OutOfService } from 'src/components/outOfService/OutOfService';\nimport { Search } from 'src/components/search/Search';\nimport { Bulk } from 'src/components/tag/Bulk';\nimport { Confirmation } from 'src/components/tag/Confirmation';\nimport { Create } from 'src/components/tag/Create';\nimport { Edit } from 'src/components/tag/Edit';\nimport { Waiting } from 'src/components/waiting/Waiting';\nimport { Path } from 'src/utils/types';\n\nimport { NavigationBar } from './NavigationBar';\nimport { PrivateRoute } from './PrivateRoute';\n\nconst history = createBrowserHistory();\nexport { history };\n\nexport class RoutesComponent extends React.Component<{}> {\n public constructor(props: any) {\n super(props);\n\n if (window.location.pathname !== Path.SEARCH) {\n window.location.pathname = Path.SEARCH;\n }\n }\n\n render() {\n return (\n \n \n\n \n \n \n \n\n \n \n \n \n \n \n \n \n );\n }\n}\n\nexport const Routes = connect()(RoutesComponent);\n","/* eslint @typescript-eslint/explicit-function-return-type: 0 */\n\nimport { createAction } from 'typesafe-actions';\n\nimport { DomainObject } from 'src/utils/types';\n\nexport const setActiveDomainObject = createAction(\n 'DOMAIN_SET_ACTIVE_DOMAIN_OBJECT',\n resolve => (domainObject: DomainObject) => resolve({ domainObject })\n);\n","import { getType } from 'typesafe-actions';\n\nimport * as domainObjectActions from './actions';\nimport { DomainObjectActions, DomainObjectState } from './types';\n\nconst INITIAL_STATE: DomainObjectState = {\n activeDomainObject: null\n};\n\nexport const domainObjectReducer = (\n state: DomainObjectState = INITIAL_STATE,\n action: DomainObjectActions\n): DomainObjectState => {\n switch (action.type) {\n case getType(domainObjectActions.setActiveDomainObject):\n return {\n ...state,\n activeDomainObject: action.payload.domainObject\n };\n default:\n return state;\n }\n};\n","import { getType } from 'typesafe-actions';\n\nimport * as loginActions from './actions';\nimport { LoginActions, LoginAttemptStatus, LoginState } from './types';\n\nconst INITIAL_STATE: LoginState = {\n authenticated: process.env.REACT_APP_ENV === 'local',\n loginAttemptStatus: LoginAttemptStatus.NOT_ATTEMPTED\n};\n\nexport const loginReducer = (state: LoginState = INITIAL_STATE, action: LoginActions): LoginState => {\n switch (action.type) {\n case getType(loginActions.login):\n return {\n ...state,\n loginAttemptStatus: LoginAttemptStatus.IN_PROGRESS\n };\n case getType(loginActions.authenticated):\n return {\n ...state,\n authenticated: true,\n loginAttemptStatus: LoginAttemptStatus.SUCCESS\n };\n case getType(loginActions.failure):\n return {\n ...state,\n authenticated: false,\n loginAttemptStatus: LoginAttemptStatus.FAILURE\n };\n case getType(loginActions.logout):\n return {\n ...state,\n authenticated: false,\n loginAttemptStatus: LoginAttemptStatus.NOT_ATTEMPTED\n };\n default:\n return state;\n }\n};\n","import { ActionType, getType } from 'typesafe-actions';\n\nimport * as apiActions from 'src/redux/api/actions';\nimport { DomainType, TAG } from 'src/utils/types';\n\nimport * as searchActions from './actions';\nimport { SearchActions, SearchState, SearchStatus, SearchType } from './types';\n\nconst INITIAL_STATE: SearchState = {\n activePageNumber: 1,\n domainObjects: [],\n query: '',\n searchStatus: SearchStatus.CLEARED,\n searchType: DomainType.BUSINESS,\n tags: []\n};\n\nexport const searchReducer = (\n state: SearchState = INITIAL_STATE,\n action: SearchActions | ActionType\n): SearchState => {\n switch (action.type) {\n case getType(apiActions.searchDomainObjects):\n case getType(apiActions.searchDomainObjectsByTag):\n case getType(apiActions.searchTags): {\n let query = '';\n let searchType: SearchType = TAG;\n\n if (action.type === getType(apiActions.searchDomainObjects)) {\n query = action.payload.keyword;\n searchType = action.payload.domainType;\n } else if (action.type === getType(apiActions.searchTags)) {\n query = action.payload.tagNamePrefix;\n }\n\n return {\n ...state,\n query,\n searchStatus: SearchStatus.IN_PROGRESS,\n searchType\n };\n }\n case getType(searchActions.setActivePageNumber):\n return {\n ...state,\n activePageNumber: action.payload.activePageNumber\n };\n case getType(searchActions.setDomainObjects):\n return {\n ...state,\n domainObjects: action.payload.domainObjects,\n searchStatus: SearchStatus.DONE\n };\n case getType(searchActions.setTagsForDomainObject):\n for (let i = 0; i < state.domainObjects.length; i++) {\n const domainObject = state.domainObjects[i];\n\n if (\n domainObject.domainType === action.payload.domainType &&\n domainObject.id === action.payload.id\n ) {\n domainObject.tags = action.payload.tags;\n\n return {\n ...state,\n domainObjects: [...state.domainObjects]\n };\n }\n }\n\n return state;\n case getType(searchActions.setTags):\n return {\n ...state,\n tags: action.payload.tags,\n searchStatus: SearchStatus.DONE\n };\n case getType(searchActions.clearSearch):\n return {\n ...state,\n domainObjects: [],\n query: '',\n searchStatus: SearchStatus.CLEARED,\n searchType: DomainType.BUSINESS,\n tags: []\n };\n default:\n return state;\n }\n};\n","import { getType } from 'typesafe-actions';\n\nimport { ActionTaken } from 'src/utils/types';\n\nimport * as tagActions from './actions';\nimport { TagActions, TagState } from './types';\n\nconst INITIAL_STATE: TagState = {\n activeTag: null,\n actionTaken: ActionTaken.MODIFIED,\n errorMessage: null\n};\n\nexport const tagReducer = (state: TagState = INITIAL_STATE, action: TagActions): TagState => {\n switch (action.type) {\n case getType(tagActions.setActiveTag):\n return {\n ...state,\n activeTag: action.payload.tag,\n errorMessage: action.payload.errorMessage\n };\n case getType(tagActions.setActionTaken):\n return {\n ...state,\n actionTaken: action.payload.actionTaken\n };\n default:\n return state;\n }\n};\n","export const config = {\n // The webapp config is assigned using information from tagr server.\n // (see _setWebappConfig in sagas/api/index.ts)\n WEBAPP_CONFIG: {\n API_DOMAIN: '',\n API_NAMESPACE: '',\n API_PORT: '',\n API_SCHEME: '',\n API_SERVICE_NAME: '',\n AUTH_SUBDOMAIN: '',\n EDGE_SUBDOMAIN: ''\n },\n TAGR_SERVER_NAME_OVERRIDE: process.env.REACT_APP_TAGR_SERVER_NAME_OVERRIDE\n};\n","import Cookies from 'js-cookie';\nimport { SagaIterator } from 'redux-saga';\nimport { all, call } from 'redux-saga/effects';\n\nimport { config } from 'src/config';\nimport { Business, DomainObject, DomainType, HttpVerb, Tag } from 'src/utils/types';\n\nimport { EDGE_TOKEN_NAME, NOT_AUTHENTICATED_MESSAGE, RESOURCE_CONFLICT } from './index';\n\nexport function _getTagrServerName(): string {\n if (config.TAGR_SERVER_NAME_OVERRIDE) {\n return config.TAGR_SERVER_NAME_OVERRIDE;\n }\n\n let tagrServerName = `${config['WEBAPP_CONFIG']['API_SCHEME']}://`;\n\n if (\n config['WEBAPP_CONFIG']['API_NAMESPACE'] &&\n !['default', 'awesomestartup'].includes(config['WEBAPP_CONFIG']['API_NAMESPACE'])\n ) {\n tagrServerName += `${config['WEBAPP_CONFIG']['API_NAMESPACE']}.`;\n }\n\n if (config['WEBAPP_CONFIG']['EDGE_SUBDOMAIN']) {\n tagrServerName += `${config['WEBAPP_CONFIG']['EDGE_SUBDOMAIN']}`;\n }\n\n if (config['WEBAPP_CONFIG']['API_DOMAIN']) {\n tagrServerName += `.${config['WEBAPP_CONFIG']['API_DOMAIN']}`;\n }\n\n if (config['WEBAPP_CONFIG']['API_PORT']) {\n tagrServerName += `:${config['WEBAPP_CONFIG']['API_PORT']}`;\n }\n\n return tagrServerName;\n}\n\nexport function* checkReady(): SagaIterator {\n yield call(_tagrFetch, HttpVerb.GET, 'ready', 'application/json;charset=utf-8');\n}\n\nexport const _getUserName = (): string => {\n const userName = window.localStorage.getItem('email');\n\n if (!userName) {\n throw new Error(NOT_AUTHENTICATED_MESSAGE);\n }\n\n return userName;\n};\n\nexport function* _tagrFetch(\n verb: HttpVerb,\n urlPath: string,\n contentType: string | null,\n body?: string | FormData\n): any {\n const tagrServerName = _getTagrServerName();\n const tagrServiceNameUrlPart = config['WEBAPP_CONFIG']['API_SERVICE_NAME']\n ? `/${config['WEBAPP_CONFIG']['API_SERVICE_NAME']}`\n : '';\n const url = `${tagrServerName}${tagrServiceNameUrlPart}/${urlPath}`;\n const response: Response = yield call(_fetch, verb, url, contentType, body);\n\n if (Math.floor(response.status / 100) === 2) {\n if (response.status === 204) {\n return;\n }\n\n const json = yield call([response, response.json]);\n return json;\n }\n\n if (response.status === 409) {\n throw new Error(RESOURCE_CONFLICT);\n }\n\n console.log(response);\n\n if (response.status === 401) {\n throw new Error(NOT_AUTHENTICATED_MESSAGE);\n }\n\n throw new Error(`Response status ${response.status}`);\n}\n\nexport function* _fetch(verb: HttpVerb, url: string, contentType: string | null, body?: string | FormData): any {\n const headers: { [key: string]: string } = {};\n\n if (contentType) {\n headers['Content-Type'] = contentType;\n }\n\n if (process.env.REACT_APP_ENV === 'local') {\n return yield call(fetch, url, {\n body,\n headers,\n method: verb\n });\n }\n\n const edgeToken = Cookies.get(EDGE_TOKEN_NAME);\n\n if (!edgeToken) {\n throw new Error(NOT_AUTHENTICATED_MESSAGE);\n }\n\n headers['fs-edge-csrf-token'] = edgeToken;\n\n return yield call(fetch, url, {\n body,\n credentials: 'include',\n headers,\n method: verb,\n mode: 'cors'\n });\n}\n\n// Tags\n\nexport function* addTag(name: string, description: string): SagaIterator {\n const userName = _getUserName();\n return yield call(\n _tagrFetch,\n HttpVerb.POST,\n 'api/tag',\n 'application/json;charset=utf-8',\n JSON.stringify({\n name,\n description,\n userName\n })\n );\n}\n\nexport function* getTag(name: string): SagaIterator {\n return yield call(_tagrFetch, HttpVerb.GET, `api/tag?name=${name}`, 'application/json;charset=utf-8');\n}\n\nexport function* updateTag(name: string, description: string, id: number): SagaIterator {\n const userName = _getUserName();\n return yield call(\n _tagrFetch,\n HttpVerb.PUT,\n `api/tag`,\n 'application/json;charset=utf-8',\n JSON.stringify({\n id,\n name,\n description,\n userName\n })\n );\n}\n\nexport function* deleteTag(id: number): SagaIterator {\n const userName = _getUserName();\n yield call(\n _tagrFetch,\n HttpVerb.DELETE,\n 'api/tag/',\n 'application/json;charset=utf-8',\n JSON.stringify({ id, userName })\n );\n}\n\nexport function* searchTags(tagNamePrefix: string): SagaIterator {\n return yield call(\n _tagrFetch,\n HttpVerb.GET,\n `api/tag/search?tagNamePrefix=${tagNamePrefix}`,\n 'application/json;charset=utf-8'\n );\n}\n\n// DomaintType\n\nexport function* addDomainObjectToTag(\n domainType: DomainType,\n domainObjectId: number,\n tagId: number\n): SagaIterator {\n const userName = _getUserName();\n return yield call(\n _tagrFetch,\n HttpVerb.POST,\n `api/domain_type/${domainType}`,\n 'application/json;charset=utf-8',\n JSON.stringify({\n domainObjectId,\n tagId,\n userName\n })\n );\n}\n\nexport function* addDomainObjectToTagBulk(domainType: DomainType, file: File, tagId: number): SagaIterator {\n const userName = _getUserName();\n const formData = new FormData();\n formData.append('file', file);\n formData.append('tagId', `${tagId}`);\n formData.append('userName', userName);\n return yield call(_tagrFetch, HttpVerb.POST, `api/domain_type/${domainType}/bulk`, null, formData);\n}\n\nexport function* deleteDomainObjectToTag(\n domainType: DomainType,\n domainObjectId: number,\n tagId: number\n): SagaIterator {\n const userName = _getUserName();\n return yield call(\n _tagrFetch,\n HttpVerb.DELETE,\n `api/domain_type/${domainType}`,\n 'application/json;charset=utf-8',\n JSON.stringify({\n domainObjectId,\n tagId,\n userName\n })\n );\n}\n\nexport function* deleteDomainObjectToTagBulk(\n domainType: DomainType,\n file: File,\n tagId: number\n): SagaIterator {\n const userName = _getUserName();\n const formData = new FormData();\n formData.append('file', file);\n formData.append('tagId', `${tagId}`);\n formData.append('userName', userName);\n return yield call(_tagrFetch, HttpVerb.DELETE, `api/domain_type/${domainType}/bulk`, null, formData);\n}\n\nexport function* getDomainObjectTags(domainType: DomainType, domainObjectId: number): SagaIterator {\n const apiResponse: Response = yield call(\n _tagrFetch,\n HttpVerb.GET,\n `api/domain_type/${domainType}?domainObjectId=${domainObjectId}`,\n 'application/json;charset=utf-8'\n );\n\n if (Array.isArray(apiResponse)) {\n return apiResponse.map((tagObject: any) => _formatIntoTag(tagObject));\n }\n\n return [];\n}\n\nexport const _formatIntoTag = (tagObject: any): Tag => ({\n description: tagObject.description,\n id: tagObject.id,\n name: tagObject.name\n});\n\ntype BusinessObject = {\n business_group_id: number;\n business_group_name: string;\n business_group_shortname: string;\n business_group_uid: string;\n business_id: number;\n business_uid: string;\n deactivated_on: string | null;\n delinquent_thirty_day: string | null;\n is_demo: boolean;\n is_free_plan: boolean;\n latitude: string;\n longitude: string;\n phone: string | null;\n salesforce_lead: string;\n shortname: string;\n software_id: string;\n text_code: string | null;\n};\n\nexport function* searchDomainObjects(domainType: DomainType, keyword: string): SagaIterator {\n const apiResponse: any[] = yield call(\n _tagrFetch,\n HttpVerb.GET,\n `api/domain_type/${domainType}/search?searchTerm=${keyword}`,\n 'application/json;charset=utf-8'\n );\n\n return yield call(_processDomainObjects, domainType, apiResponse);\n}\n\nexport function* searchDomainObjectsByTag(domainType: DomainType, tagId: number): SagaIterator {\n const apiResponse: any[] = yield call(\n _tagrFetch,\n HttpVerb.GET,\n `api/domain_type/${domainType}/searchByTag?tagId=${tagId}`,\n 'application/json;charset=utf-8'\n );\n\n return yield call(_processDomainObjects, domainType, apiResponse);\n}\n\nexport function* _processDomainObjects(domainType: DomainType, apiResponse: any[]): SagaIterator {\n if (!apiResponse) {\n return [];\n }\n\n if (domainType === DomainType.BUSINESS || domainType === DomainType.BUSINESS_GROUP) {\n const businesses: Business[] = yield all(\n apiResponse.map((businessObject: BusinessObject) => call(_formatIntoBusiness, businessObject))\n );\n return businesses;\n }\n\n return [];\n}\n\nexport const _formatIntoBusiness = (businessObject: BusinessObject): Business => ({\n domainType: DomainType.BUSINESS,\n id: businessObject.business_id,\n primaryKey: businessObject.software_id,\n tags: null,\n businessName: businessObject.shortname,\n businessGroup: {\n domainType: DomainType.BUSINESS_GROUP,\n id: businessObject.business_group_id,\n primaryKey: businessObject.business_group_name,\n tags: null\n }\n});\n","import Cookies from 'js-cookie';\nimport { cloneDeep } from 'lodash';\nimport { SagaIterator } from 'redux-saga';\nimport { all, call, fork, put, select, takeLatest } from 'redux-saga/effects';\nimport { ActionType } from 'typesafe-actions';\n\nimport { config } from 'src/config';\nimport * as apiActions from 'src/redux/api/actions';\nimport * as domainObjectActions from 'src/redux/domainObject/actions';\nimport { getActiveDomainObject } from 'src/redux/domainObject/selectors';\nimport * as loginActions from 'src/redux/login/actions';\nimport * as navigationActions from 'src/redux/navigation/actions';\nimport * as searchActions from 'src/redux/search/actions';\nimport { ErrorMessage } from 'src/redux/tag/types';\nimport {\n addDomainObjectToTag,\n addDomainObjectToTagBulk,\n addTag,\n checkReady,\n deleteDomainObjectToTag,\n deleteDomainObjectToTagBulk,\n deleteTag,\n getDomainObjectTags,\n getTag,\n searchDomainObjects,\n searchDomainObjectsByTag,\n searchTags,\n updateTag\n} from 'src/sagas/api/tagr';\nimport { ActionTaken, DomainObject, DomainType, HttpVerb, Tag } from 'src/utils/types';\n\nexport const EDGE_TOKEN_NAME = 'edge_session_csrf_token';\nexport const NOT_AUTHENTICATED_MESSAGE = 'Not Authenticated';\n// This can happen if we try to create a tag that already exists\n// or we try to delete a tag that is linked to business objects\nexport const RESOURCE_CONFLICT = 'Resource Exists';\n\nexport function* watcher(): SagaIterator {\n yield call(_setWebappConfig);\n yield call(_checkAuthenticated);\n\n yield all([\n takeLatest(loginActions.login, _login),\n takeLatest(apiActions.addTag, _addTag),\n takeLatest(apiActions.deleteTag, _deleteTag),\n takeLatest(apiActions.updateTag, _updateTag),\n takeLatest(apiActions.searchTags, _searchTags),\n takeLatest(apiActions.addDomainObjectToTag, _addDomainObjectToTag),\n takeLatest(apiActions.addDomainObjectToTagBulk, _addDomainObjectToTagBulk),\n takeLatest(apiActions.deleteDomainObjectToTag, _deleteDomainObjectToTag),\n takeLatest(apiActions.deleteDomainObjectToTagBulk, _deleteDomainObjectToTagBulk),\n takeLatest(apiActions.searchDomainObjects, _searchDomainObjects),\n takeLatest(apiActions.searchDomainObjectsByTag, _searchDomainObjectsByTag)\n ]);\n}\n\nexport function* _setWebappConfig(): SagaIterator {\n try {\n let tagrServerNameOverride = '';\n\n if (config.TAGR_SERVER_NAME_OVERRIDE) {\n tagrServerNameOverride = config.TAGR_SERVER_NAME_OVERRIDE;\n }\n\n // Normally the tagr host override is empty and we retrieve the webapp config\n // from the same host that we used to access the client. However, the tagr\n // host override allows the server to have a different fqdn from the client.\n // A good example is when we are running locally.\n // You can also use this if you want to run the client locally but point to\n // a cluster in AWS.\n const response = yield call(fetch, `${tagrServerNameOverride}/api/webapp_config`, {\n method: HttpVerb.GET\n });\n\n const json = yield call([response, response.json]);\n config['WEBAPP_CONFIG']['API_DOMAIN'] = json.api_domain;\n config['WEBAPP_CONFIG']['API_NAMESPACE'] = json.api_namespace;\n config['WEBAPP_CONFIG']['API_PORT'] = json.api_port;\n config['WEBAPP_CONFIG']['API_SCHEME'] = json.api_scheme;\n config['WEBAPP_CONFIG']['API_SERVICE_NAME'] = json.api_service_name;\n config['WEBAPP_CONFIG']['AUTH_SUBDOMAIN'] = json.auth_subdomain;\n config['WEBAPP_CONFIG']['EDGE_SUBDOMAIN'] = json.edge_subdomain;\n } catch (error) {\n yield put(apiActions.error(error));\n }\n}\n\nexport function* _checkAuthenticated(): SagaIterator {\n const edgeToken = Cookies.get(EDGE_TOKEN_NAME);\n const userName = window.localStorage.getItem('email');\n\n if (!edgeToken || !userName) {\n return;\n }\n\n try {\n yield call(checkReady);\n yield put(loginActions.authenticated());\n } catch (error) {\n if (error.message !== NOT_AUTHENTICATED_MESSAGE) {\n yield put(apiActions.error(error));\n }\n }\n}\n\nexport function _getAuthServerName(): string {\n let authServerName = `${config['WEBAPP_CONFIG']['API_SCHEME']}://`;\n\n if (\n config['WEBAPP_CONFIG']['API_NAMESPACE'] &&\n !['default', 'awesomestartup'].includes(config['WEBAPP_CONFIG']['API_NAMESPACE'])\n ) {\n authServerName += `${config['WEBAPP_CONFIG']['API_NAMESPACE']}.`;\n }\n\n authServerName += config['WEBAPP_CONFIG']['AUTH_SUBDOMAIN'];\n\n if (config['WEBAPP_CONFIG']['API_DOMAIN']) {\n authServerName += `.${config['WEBAPP_CONFIG']['API_DOMAIN']}`;\n }\n\n if (config['WEBAPP_CONFIG']['API_PORT']) {\n authServerName += `:${config['WEBAPP_CONFIG']['API_PORT']}`;\n }\n\n return authServerName;\n}\n\nexport function* _login(action: ActionType): SagaIterator {\n const authServerName = _getAuthServerName();\n const base64LoginDetails = btoa(`${action.payload.email}:${action.payload.password}`);\n\n try {\n const response: Response = yield call(fetch, `${authServerName}/api/unified/edge/auth/login`, {\n body: JSON.stringify({}),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json;charset=utf-8',\n Authorization: `Basic ${base64LoginDetails}`\n },\n method: HttpVerb.POST,\n mode: 'cors'\n });\n\n if (response.status !== 201) {\n yield put(loginActions.failure());\n return;\n }\n\n window.localStorage.setItem('email', action.payload.email);\n\n if (window.location.hostname === 'tagr-server.fslocal') {\n // When running locally, spoof a cookie so we\n // skip authentication.\n Cookies.set(EDGE_TOKEN_NAME, EDGE_TOKEN_NAME);\n }\n\n yield put(loginActions.authenticated());\n } catch (error) {\n yield put(apiActions.error(error));\n }\n}\n\nexport function* _addTag(action: ActionType): SagaIterator {\n try {\n yield put(navigationActions.waiting());\n yield call(addTag, action.payload.tag.name, action.payload.tag.description);\n yield put(navigationActions.confirmation(ActionTaken.CREATED, action.payload.tag));\n } catch (error) {\n if (error.message === RESOURCE_CONFLICT) {\n try {\n const tag: Tag = yield call(getTag, action.payload.tag.name);\n yield put(navigationActions.editTag(tag, ErrorMessage.TAG_ALREADY_EXISTS));\n } catch (error) {\n yield call(_handleError, error);\n }\n } else {\n yield call(_handleError, error);\n }\n }\n}\n\nexport function* _updateTag(action: ActionType): SagaIterator {\n try {\n yield put(navigationActions.waiting());\n const tag = action.payload.tag;\n yield call(updateTag, tag.name, tag.description, tag.id);\n yield put(navigationActions.confirmation(ActionTaken.MODIFIED, tag));\n } catch (error) {\n yield call(_handleError, error);\n }\n}\n\nexport function* _deleteTag(action: ActionType): SagaIterator {\n const tag = action.payload.tag;\n\n try {\n yield put(navigationActions.waiting());\n yield call(deleteTag, tag.id);\n yield put(navigationActions.confirmation(ActionTaken.DELETED, tag));\n } catch (error) {\n if (error.message === RESOURCE_CONFLICT) {\n yield put(navigationActions.editTag(tag, ErrorMessage.TAG_IN_USE));\n } else {\n yield call(_handleError, error);\n }\n }\n}\n\nexport function* _searchTags(action: ActionType): SagaIterator {\n try {\n const tags: Tag[] = yield call(searchTags, action.payload.tagNamePrefix);\n yield put(searchActions.setTags(tags));\n } catch (error) {\n yield call(_handleError, error);\n }\n}\n\nexport function* _addDomainObjectToTag(\n action: ActionType\n): SagaIterator {\n try {\n const tags: Tag[] = yield call(\n addDomainObjectToTag,\n action.payload.domainType,\n action.payload.domainObjectId,\n action.payload.tag.id\n );\n yield call(_setActiveDomainObject, action.payload.domainType, action.payload.domainObjectId, tags);\n } catch (error) {\n yield call(_handleError, error);\n }\n}\n\nexport function* _addDomainObjectToTagBulk(\n action: ActionType\n): SagaIterator {\n try {\n yield put(navigationActions.waiting());\n yield call(addDomainObjectToTagBulk, action.payload.domainType, action.payload.file, action.payload.tag.id);\n yield put(navigationActions.confirmation(ActionTaken.BULK_TAG, action.payload.tag));\n } catch (error) {\n yield call(_handleError, error);\n }\n}\n\nexport function* _deleteDomainObjectToTag(\n action: ActionType\n): SagaIterator {\n try {\n const tags: Tag[] = yield call(\n deleteDomainObjectToTag,\n action.payload.domainType,\n action.payload.domainObjectId,\n action.payload.tag.id\n );\n yield call(_setActiveDomainObject, action.payload.domainType, action.payload.domainObjectId, tags);\n } catch (error) {\n yield call(_handleError, error);\n }\n}\n\nexport function* _deleteDomainObjectToTagBulk(\n action: ActionType\n): SagaIterator {\n try {\n yield put(navigationActions.waiting());\n yield call(\n deleteDomainObjectToTagBulk,\n action.payload.domainType,\n action.payload.file,\n action.payload.tag.id\n );\n yield put(navigationActions.confirmation(ActionTaken.BULK_UNTAG, action.payload.tag));\n } catch (error) {\n yield call(_handleError, error);\n }\n}\n\nexport function* _setActiveDomainObject(\n domainType: DomainType,\n domainObjectId: number,\n tags: Tag[]\n): SagaIterator {\n const domainObjectCurrent: DomainObject = yield select(getActiveDomainObject);\n\n if (domainObjectCurrent.domainType === domainType && domainObjectCurrent.id === domainObjectId) {\n const domainObjectUpdated: DomainObject = cloneDeep(domainObjectCurrent);\n domainObjectUpdated.tags = tags;\n yield put(domainObjectActions.setActiveDomainObject(domainObjectUpdated));\n }\n}\n\nexport function* _searchDomainObjects(\n action: ActionType\n): SagaIterator {\n try {\n const domainObjects: DomainObject[] = yield call(\n searchDomainObjects,\n action.payload.domainType,\n action.payload.keyword\n );\n yield put(searchActions.setDomainObjects(domainObjects));\n yield fork(_getTagsForDomainObjects, action.payload.domainType, domainObjects);\n } catch (error) {\n yield call(_handleError, error);\n }\n}\n\nexport function* _searchDomainObjectsByTag(\n action: ActionType\n): SagaIterator {\n try {\n const domainObjects: DomainObject[] = yield call(\n searchDomainObjectsByTag,\n action.payload.domainType,\n action.payload.tag.id\n );\n yield put(searchActions.setDomainObjects(domainObjects));\n yield fork(_getTagsForDomainObjects, action.payload.domainType, domainObjects);\n } catch (error) {\n yield call(_handleError, error);\n }\n}\n\nexport function* _getTagsForDomainObjects(\n domainType: DomainType,\n domainObjects: DomainObject[]\n): SagaIterator {\n if (![DomainType.BUSINESS, DomainType.BUSINESS_GROUP].includes(domainType)) {\n return;\n }\n\n for (let i = 0; i < domainObjects.length; i++) {\n const id = domainObjects[i].id;\n const tags: Tag[] = yield call(getDomainObjectTags, DomainType.BUSINESS, id);\n yield put(searchActions.setTagsForDomainObject(DomainType.BUSINESS, id, tags));\n }\n}\n\nexport function* _handleError(error: Error): SagaIterator {\n if (error.message === NOT_AUTHENTICATED_MESSAGE) {\n yield put(loginActions.logout());\n } else {\n yield put(apiActions.error(error));\n }\n}\n","import { SagaIterator } from 'redux-saga';\nimport { call, put } from 'redux-saga/effects';\n\nimport * as domainObjectActions from 'src/redux/domainObject/actions';\nimport { getDomainObjectTags } from 'src/sagas/api/tagr';\nimport { DomainObject, Tag } from 'src/utils/types';\n\nexport function* setActiveDomainWithTags(domainObject: DomainObject): SagaIterator {\n const tags: Tag[] = yield call(getDomainObjectTags, domainObject.domainType, domainObject.id);\n\n yield put(domainObjectActions.setActiveDomainObject({ ...domainObject, tags }));\n}\n","import Cookies from 'js-cookie';\nimport { SagaIterator } from 'redux-saga';\nimport { all, call, put, takeLatest } from 'redux-saga/effects';\nimport { ActionType } from 'typesafe-actions';\n\nimport { history } from 'src/components/routes/Routes';\nimport * as apiActions from 'src/redux/api/actions';\nimport * as loginActions from 'src/redux/login/actions';\nimport * as navigationActions from 'src/redux/navigation/actions';\nimport * as searchActions from 'src/redux/search/actions';\nimport * as tagActions from 'src/redux/tag/actions';\nimport { EDGE_TOKEN_NAME } from 'src/sagas/api';\nimport { setActiveDomainWithTags } from 'src/sagas/domain';\nimport { DomainType, Path } from 'src/utils/types';\n\nexport function* watcher(): SagaIterator {\n yield all([\n takeLatest(apiActions.error, _goToOutOfService),\n takeLatest(navigationActions.createTag, _goToCreateTag),\n takeLatest(navigationActions.confirmation, _goToConfirmation),\n takeLatest(navigationActions.domainObjectView, _goToDomainObjectView),\n takeLatest(navigationActions.bulkTag, _goToBulkTag),\n takeLatest(navigationActions.editTag, _goToEditTag),\n takeLatest([loginActions.authenticated, navigationActions.search], _goToSearch),\n takeLatest(loginActions.logout, _goToLogout),\n takeLatest(navigationActions.waiting, _goToWaiting)\n ]);\n}\n\nexport const _goToOutOfService = (): void => {\n history.push(Path.OUT_OF_SERVICE);\n};\n\nexport const _goToCreateTag = (): void => {\n history.push(Path.CREATE_TAG);\n};\n\nexport function* _goToConfirmation(action: ActionType): SagaIterator {\n yield put(tagActions.setActionTaken(action.payload.actionTaken));\n yield put(tagActions.setActiveTag(action.payload.tag));\n history.push(Path.CONFIRMATION);\n}\n\nexport function* _goToDomainObjectView(\n action: ActionType\n): SagaIterator {\n yield call(setActiveDomainWithTags, action.payload.domainObject);\n history.push(Path.DOMAIN_VIEW);\n}\n\nexport function* _goToBulkTag(action: ActionType): SagaIterator {\n yield put(tagActions.setActiveTag(action.payload.tag));\n history.push(Path.BULK_TAG);\n}\n\nexport function* _goToEditTag(action: ActionType): SagaIterator {\n yield put(searchActions.clearSearch());\n yield put(apiActions.searchDomainObjectsByTag(DomainType.BUSINESS, action.payload.tag));\n yield put(tagActions.setActiveTag(action.payload.tag, action.payload.errorMessage));\n history.push(Path.EDIT_TAG);\n}\n\nexport function* _goToSearch(): SagaIterator {\n yield put(searchActions.clearSearch());\n yield put(tagActions.setActiveTag(null));\n history.push(Path.SEARCH);\n}\n\nexport const _goToLogout = (): void => {\n // This probably deserves a seperate saga file\n Cookies.remove(EDGE_TOKEN_NAME);\n window.localStorage.removeItem('email');\n history.push(Path.LOGIN);\n};\n\nexport const _goToWaiting = (): void => {\n history.push(Path.WAITING);\n};\n","import { SagaIterator } from 'redux-saga';\nimport { spawn } from 'redux-saga/effects';\n\nimport { watcher as apiWatcher } from './api';\nimport { watcher as navigationWatcher } from './navigation';\n\nexport function* rootSaga(): SagaIterator {\n yield spawn(apiWatcher);\n yield spawn(navigationWatcher);\n}\n","import { applyMiddleware, combineReducers, createStore, Middleware } from 'redux';\nimport { composeWithDevTools } from 'redux-devtools-extension/developmentOnly';\nimport reduxSaga from 'redux-saga';\nimport { getType } from 'typesafe-actions';\n\nimport { domainObjectReducer as domainObject } from 'src/redux/domainObject/reducer';\nimport * as loginActions from 'src/redux/login/actions';\nimport { loginReducer as login } from 'src/redux/login/reducer';\nimport { searchReducer as search } from 'src/redux/search/reducer';\nimport { tagReducer as tag } from 'src/redux/tag/reducer';\nimport { rootSaga } from 'src/sagas/main';\n\nimport { ReducerState } from './state.types';\n\nconst reducers: ReducerState = {\n domainObject,\n login,\n search,\n tag\n};\n\nconst LOGIN_ACTION_TYPE = getType(loginActions.login);\n\nexport const logMiddleware: Middleware = () => next => (action: any): any => {\n if (action.type !== LOGIN_ACTION_TYPE) {\n console.info('dispatching', action);\n }\n\n return next(action);\n};\n\nconst sagaMiddleware = reduxSaga();\n// exporting to support testing\nexport const _combinedReducers = combineReducers(reducers);\nexport const Store = createStore(\n _combinedReducers,\n composeWithDevTools(applyMiddleware(logMiddleware, sagaMiddleware))\n);\n\nsagaMiddleware.run(rootSaga);\n","import styled, { createGlobalStyle } from 'styled-components';\nimport { reset } from 'styled-reset';\n\nexport const GlobalStyle = createGlobalStyle`\n ${reset}\n\n body {\n font-family: 'Helvetica Neue', sans-serif;\n }\n`;\n\nexport const AppHeader = styled.div`\n align-items: center;\n background-color: #6b20ce;\n color: white;\n display: flex;\n font-size: 24pt;\n font-style: italic;\n font-weight: bold;\n height: 1.75em;\n margin: 0;\n padding: 0.1em 0 0.4em 0.7em;\n text-align: left;\n`;\n\nexport const AppRule = styled.hr`\n padding: 0;\n`;\n","import * as React from 'react';\nimport { Provider } from 'react-redux';\n\nimport { Routes } from 'src/components/routes/Routes';\nimport { Store } from 'src/redux/store';\n\nimport { AppHeader, GlobalStyle } from './styles';\n\nexport class App extends React.Component {\n public render() {\n return (\n <>\n \n \n Tagr\n \n \n \n );\n }\n}\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport { App } from './App';\n\nReactDOM.render(, document.getElementById('root'));\n"],"sourceRoot":""}