{"version":3,"file":"index.5bce812b.js","sources":["../../src/Services/AuthService.ts","../../src/Contexts/AuthContext.ts","../../src/Providers/AuthProvider.tsx","../../src/Hooks/useAuth.ts","../../src/Assets/logo.png","../../src/Views/Loading.tsx","../../src/Hooks/useApi.ts","../../src/Views/Navbar.tsx","../../src/Views/Sidebar.tsx","../../src/Views/Layout.tsx","../../src/Contexts/UsersContext.ts","../../src/Providers/UsersProvider.tsx","../../src/Contexts/OrganizationContext.ts","../../src/Providers/OrganizationProvider.tsx","../../src/Routes/PrivateRoute.tsx","../../src/Views/Shared/Pager.tsx","../../src/Views/Shared/LetterFilter.tsx","../../src/Views/Shared/TextControl.tsx","../../src/Views/Shared/TabHeader.tsx","../../src/Views/Shared/Tab.tsx","../../src/Views/Shared/TabContent.tsx","../../src/Views/Contact/ContactTable.tsx","../../src/Views/Shared/Notes.tsx","../../src/Views/Shared/SelectControl.tsx","../../src/Assets/StateCodes.ts","../../src/Hooks/useOrganization.ts","../../src/Views/Shared/TextAreaControl.tsx","../../src/Views/Shared/CheckboxControl.tsx","../../src/Views/Shared/CustomFieldsEditor.tsx","../../src/types.ts","../../src/Views/Shared/AddressEditor.tsx","../../src/Views/Ticket/TicketTable.tsx","../../src/Views/Shared/FileTable.tsx","../../src/Views/Company/EditCompany.tsx","../../src/Views/Shared/TextDisplay.tsx","../../src/Views/Shared/Display.tsx","../../src/Views/Shared/SelectDisplay.tsx","../../src/Views/Shared/TextAreaDisplay.tsx","../../src/Views/Shared/CheckboxDisplay.tsx","../../src/Views/Shared/CustomFieldsDisplay.tsx","../../src/Views/Shared/AddressDisplay.tsx","../../src/Views/Shared/Timeline.tsx","../../src/Views/Shared/TranscriptTable.tsx","../../src/Assets/TicketStatus.ts","../../src/Hooks/useQuery.ts","../../src/Views/Ticket/EditTicket.tsx","../../src/Views/Contact/EditContact.tsx","../../src/Views/Shared/DisplayLink.tsx","../../src/Views/Shared/Card.tsx","../../src/Views/Dashboard/RecentlyUpdatedCompanies.tsx","../../src/Views/Dashboard/RecentlyUpdatedContacts.tsx","../../src/Views/Dashboard/RecentlyUpdatedTickets.tsx","../../src/Routes/Routes.tsx","../../src/Views/Auth/LoginErrorCallback.tsx","../../src/Views/Auth/LoginCallback.tsx","../../src/Views/Auth/Logout.tsx","../../src/Views/Auth/LogoutCallback.tsx","../../src/Views/Company/ViewCompany.tsx","../../src/Views/Company/Companies.tsx","../../src/Views/Contact/ViewContact.tsx","../../src/Views/Contact/Contacts.tsx","../../src/Views/Ticket/ViewTicket.tsx","../../src/Views/Ticket/Tickets.tsx","../../src/Views/Dashboard/index.tsx","../../src/App.tsx","../../src/main.tsx"],"sourcesContent":["interface Token {\r\n token: string;\r\n expires: Date;\r\n}\r\n\r\nclass AuthService {\r\n constructor() {\r\n this.loadTokenFromStorage();\r\n this.loadLegacyTokenFromStorage();\r\n this.loadProfileFromStorage();\r\n }\r\n\r\n token: Token = {\r\n token: \"\",\r\n expires: new Date(Date.now() - 1000),\r\n };\r\n\r\n legacyToken: Token = {\r\n token: \"\",\r\n expires: new Date(Date.now() - 1000),\r\n };\r\n\r\n profile = {\r\n userName: \"\",\r\n picture: \"\",\r\n firstName: \"\",\r\n lastName: \"\",\r\n };\r\n\r\n loadProfileFromStorage() {\r\n const profileJson = sessionStorage.getItem(\"profile\");\r\n\r\n if (profileJson) {\r\n this.profile = JSON.parse(profileJson);\r\n }\r\n }\r\n\r\n loadTokenFromStorage() {\r\n const item = sessionStorage.getItem(\"token\");\r\n\r\n if (!item) {\r\n return;\r\n }\r\n\r\n const data = JSON.parse(item);\r\n\r\n this.token = {\r\n token: data.token,\r\n expires: new Date(data.expires),\r\n };\r\n }\r\n\r\n loadLegacyTokenFromStorage() {\r\n const item = sessionStorage.getItem(\"legacyToken\");\r\n\r\n if (!item) {\r\n return;\r\n }\r\n\r\n const data = JSON.parse(item);\r\n\r\n this.legacyToken = {\r\n token: data.token,\r\n expires: new Date(data.expires),\r\n };\r\n }\r\n\r\n isAuthenticated() {\r\n if (!this.token) {\r\n return false;\r\n }\r\n\r\n return this.token.expires.getTime() > Date.now() && this.token.token !== \"\";\r\n }\r\n\r\n loginRedirect() {\r\n sessionStorage.setItem(\"redirectUri\", window.location.pathname);\r\n const redirectUri = `${window.location.origin}/login/callback`;\r\n const qs = `redirectUri=${encodeURIComponent(redirectUri)}`;\r\n const url = `${import.meta.env.VITE_AUTH_URL}/identity/authenticate?${qs}`;\r\n window.location.replace(url);\r\n }\r\n\r\n logout() {\r\n const redirectUri = `${window.location.origin}/logout/callback`;\r\n const qs = `redirectUri=${encodeURIComponent(redirectUri)}`;\r\n const url = `${import.meta.env.VITE_AUTH_URL}/account/logout?${qs}`;\r\n window.location.replace(url);\r\n }\r\n\r\n logoutCallback() {\r\n sessionStorage.removeItem(\"token\");\r\n sessionStorage.removeItem(\"legacyToken\");\r\n window.location.replace(\"/\");\r\n }\r\n\r\n retryLogin() {\r\n const url = sessionStorage.getItem(\"redirectUri\") || \"/\";\r\n window.location.replace(url);\r\n }\r\n\r\n async refresh(temporaryToken: string) {\r\n await this.fetchAccessToken(temporaryToken);\r\n console.log(\"auth token refreshed\");\r\n }\r\n\r\n async fetchAccessToken(temporaryToken: string) {\r\n const response = await fetch(`${import.meta.env.VITE_API_URL}/token`, {\r\n method: \"post\",\r\n body: JSON.stringify({ temporaryToken }),\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n console.error(\"unable to acquire access token\");\r\n }\r\n\r\n const data = await response.json();\r\n\r\n this.token = {\r\n token: data.token.token,\r\n expires: new Date(data.token.expires),\r\n };\r\n\r\n this.legacyToken = {\r\n token: data.legacyToken.token,\r\n expires: new Date(data.legacyToken.expires),\r\n };\r\n\r\n this.profile = data.profile;\r\n\r\n sessionStorage.setItem(\"token\", JSON.stringify(this.token));\r\n sessionStorage.setItem(\"legacyToken\", JSON.stringify(this.legacyToken));\r\n sessionStorage.setItem(\"profile\", JSON.stringify(data.profile));\r\n }\r\n\r\n async handleLoginCallback() {\r\n const params = new URLSearchParams(window.location.search);\r\n const temporaryToken = params.get(\"token\")!;\r\n try {\r\n await this.fetchAccessToken(temporaryToken);\r\n window.location.replace(sessionStorage.getItem(\"redirectUri\")!);\r\n } catch (err) {\r\n window.location.replace(\"/login/callback/error\");\r\n }\r\n }\r\n}\r\n\r\nconst authService = new AuthService();\r\n\r\nfunction silentRenew() {\r\n let frameRemoved = false;\r\n\r\n console.log(\"silent renew\");\r\n const frame = document.createElement(\"iframe\");\r\n const qs = `originUri=${encodeURIComponent(window.location.origin)}`;\r\n frame.src = `${import.meta.env.VITE_AUTH_URL}/identity/silentrenew?${qs}`;\r\n frame.style.width = \"0\";\r\n frame.style.height = \"0\";\r\n frame.style.border = \"0\";\r\n frame.style.border = \"none\";\r\n frame.style.position = \"absolute\";\r\n\r\n const destroy = () => {\r\n document.body.removeChild(frame);\r\n window.removeEventListener(\"message\", handleMessage);\r\n frameRemoved = true;\r\n };\r\n\r\n const handleMessage = (message: any) => {\r\n try {\r\n if (message.origin === import.meta.env.VITE_AUTH_URL) {\r\n const data = JSON.parse(message.data);\r\n if (data.type === \"silentrenew\") {\r\n if (data.isAuthenticated) {\r\n authService.refresh(data.token);\r\n } else {\r\n authService.logout();\r\n }\r\n\r\n destroy();\r\n }\r\n }\r\n } catch (err) {\r\n console.error(err);\r\n destroy();\r\n }\r\n };\r\n\r\n window.addEventListener(\"message\", handleMessage);\r\n document.body.appendChild(frame);\r\n\r\n setTimeout(() => {\r\n if (!frameRemoved) {\r\n console.log(\"silent renew timeout\");\r\n destroy();\r\n }\r\n }, 30000);\r\n}\r\n\r\nlet checkAccessTokenTimeout: any;\r\n\r\n/**\r\n * Check the access token to see if it needs to be refreshed.\r\n * When the token is close to expiration, a call will be made to renew it.\r\n */\r\n\r\nfunction checkAccessToken() {\r\n console.log(\"checking token expiration\");\r\n const expires = authService.token.expires;\r\n const delta = expires.getTime() - Date.now() - 1000 * 60 * 10;\r\n console.log(`token expires in ${expires.getTime() - Date.now()}`);\r\n console.log(`token expiry delta ${delta}`);\r\n\r\n if (delta < 0) {\r\n console.log(\"token expires soon, renewing\");\r\n silentRenew();\r\n }\r\n\r\n clearTimeout(checkAccessTokenTimeout);\r\n checkAccessTokenTimeout = setTimeout(() => checkAccessToken(), 30000);\r\n}\r\n\r\n\r\nwindow.addEventListener(\"focus\", () => {\r\n checkAccessToken();\r\n});\r\n\r\ncheckAccessTokenTimeout = setTimeout(() => checkAccessToken(), 30000);\r\n\r\nexport default authService;\r\n","import React from \"react\";\r\nimport AuthService from \"../Services/AuthService\";\r\nexport const AuthContext = React.createContext(AuthService);","import React from \"react\";\r\nimport { AuthContext } from \"../Contexts/AuthContext\";\r\nimport AuthService from \"../Services/AuthService\";\r\n\r\nexport function AuthProvider(props: { children: React.ReactNode }) {\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}","import React from \"react\";\r\nimport { AuthContext } from \"../Contexts/AuthContext\";\r\n\r\nexport default function useAuth() {\r\n return React.useContext(AuthContext);\r\n}","export default \"__VITE_ASSET__27d8e524__\"","import React from 'react';\r\nimport logoUrl from \"../Assets/logo.png\"\r\n\r\n\r\nexport default function Loading() {\r\n return (\r\n
\r\n

\r\n
\r\n );\r\n}","import React from \"react\";\r\nimport useAuth from \"./useAuth\";\r\nimport $ from 'jquery';\r\n\r\nclass Api {\r\n accessToken: string;\r\n\r\n constructor(accessToken: string) {\r\n this.accessToken = accessToken;\r\n }\r\n\r\n get(endpoint: string, data?:any) {\r\n return fetch(`${import.meta.env.VITE_API_URL}/${endpoint}${data ? \"?\" + $.param(data) : ''}`, {\r\n method: \"get\",\r\n headers: {\r\n Authorization: `Bearer ${this.accessToken}`,\r\n },\r\n });\r\n }\r\n\r\n post(endpoint: string, data?: any) {\r\n return fetch(`${import.meta.env.VITE_API_URL}/${endpoint}`, {\r\n method: \"post\",\r\n body: data ? JSON.stringify(data) : undefined,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.accessToken}`,\r\n },\r\n });\r\n }\r\n\r\n uploadFile(endpoint: string, data: FormData) {\r\n return fetch(`${import.meta.env.VITE_API_URL}/${endpoint}`, {\r\n method: \"post\",\r\n body: data,\r\n headers: {\r\n Authorization: `Bearer ${this.accessToken}`,\r\n },\r\n });\r\n }\r\n\r\n put(endpoint: string, data?: any) {\r\n return fetch(`${import.meta.env.VITE_API_URL}/${endpoint}`, {\r\n method: \"put\",\r\n body: data ? JSON.stringify(data) : undefined,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.accessToken}`,\r\n },\r\n });\r\n }\r\n\r\n delete(endpoint: string, data?: any) {\r\n return fetch(`${import.meta.env.VITE_API_URL}/${endpoint}`, {\r\n method: \"delete\",\r\n body: data ? JSON.stringify(data) : undefined,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.accessToken}`,\r\n },\r\n });\r\n }\r\n}\r\n\r\nexport default function useApi() {\r\n const auth = useAuth();\r\n return React.useMemo(() => new Api(auth.token.token), [auth.token.token]);\r\n}","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { SyncIcon, ThreeBarsIcon } from '@primer/octicons-react'\r\nimport _ from 'underscore';\r\nimport useApi from '../Hooks/useApi';\r\nimport { SearchResult } from '../types';\r\nimport logoUrl from \"../Assets/logo.png\";\r\n\r\n\r\n\r\nexport default function Navbar() {\r\n const [searchResults, setSearchResults] = React.useState>([]);\r\n const [searching, setSearching] = React.useState(false);\r\n const [showingSearchResults, setShowingSearchResults] = React.useState(false);\r\n const [term, setTerm] = React.useState('');\r\n\r\n const api = useApi();\r\n const search = _.debounce(async (term: string) => {\r\n setSearching(true);\r\n const response = await api.get('api/record/search', { term });\r\n const results = await response.json();\r\n setSearchResults(results);\r\n setShowingSearchResults(true);\r\n setSearching(false);\r\n }, 1000);\r\n\r\n React.useEffect(() => {\r\n document.body.addEventListener('click', closeSearchResults);\r\n\r\n return function cleanup() {\r\n window.removeEventListener('click', closeSearchResults );\r\n } \r\n },[]);\r\n\r\n const closeSearchResults = () => {\r\n setShowingSearchResults(false);\r\n setSearchResults([]);\r\n setTerm('');\r\n }\r\n\r\n const debouncedSearch = React.useCallback(e => {\r\n const term = e.currentTarget.value;\r\n setTerm(term);\r\n if (!term) {\r\n return;\r\n }\r\n search(term);\r\n }, [search]);\r\n\r\n const apiMap = {\r\n \"Contact\": \"contacts\",\r\n \"Ticket\": \"tickets\",\r\n \"Company\": \"companies\"\r\n }\r\n\r\n const renderSearchResults = React.useCallback(() => {\r\n if (!showingSearchResults) {\r\n return null;\r\n }\r\n\r\n if (!searchResults.length) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {searchResults.map(sr => {\r\n return (\r\n - {sr.name} ({sr.recordType})
\r\n )\r\n })}\r\n
\r\n )\r\n }, [searchResults, showingSearchResults, apiMap]);\r\n\r\n return (\r\n \r\n );\r\n}","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { OrganizationIcon, HomeFillIcon, PeopleIcon, ChecklistIcon, SignOutIcon, GearIcon } from '@primer/octicons-react'\r\nimport authService from '../Services/AuthService';\r\n\r\n\r\nexport default function Navbar() {\r\n \r\n const [path, setPath] = React.useState(window.location.pathname);\r\n\r\n var onClickLink = React.useCallback((e) => {\r\n setPath(e.currentTarget.pathname);\r\n },[setPath]);\r\n\r\n var getClassName = React.useCallback((link:string) => {\r\n var className = \"nav-link\";\r\n if(link === path){\r\n className += \" active\";\r\n }\r\n\r\n return className;\r\n }, [path]);\r\n\r\n\r\n return (\r\n \r\n );\r\n} ","import React from 'react';\r\nimport Navbar from './Navbar';\r\nimport Sidebar from './Sidebar';\r\ninterface Props {\r\n children: React.ReactNode;\r\n }\r\n\r\nexport default function Layout(props:Props){\r\n return(\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n {props.children}\r\n \r\n
\r\n
\r\n
\r\n )\r\n}","import React from \"react\";\r\nimport { User } from \"../types\";\r\n\r\nexport const UsersContext = React.createContext>([])","import React from \"react\";\r\nimport { UsersContext } from \"../Contexts/UsersContext\";\r\nimport useApi from \"../Hooks/useApi\";\r\nimport { User } from \"../types\";\r\nimport Loading from \"../Views/Loading\";\r\n\r\nexport function UsersProvider(props: { children: React.ReactNode }) {\r\n const api = useApi();\r\n const [users, setUsers] = React.useState>([]);\r\n const [loading, setLoading] = React.useState(true);\r\n\r\n const load = React.useCallback(async() =>{\r\n const response = await api.get('api/user');\r\n setUsers(await response.json());\r\n setLoading(false);\r\n },[api]);\r\n\r\n React.useEffect(() => {\r\n load();\r\n },[load])\r\n\r\n if(loading){\r\n return \r\n }\r\n\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}","import React from \"react\";\r\nimport { Organization } from \"../types\";\r\n\r\nexport const OrganizationContext = React.createContext({\r\n velaroSiteId: undefined,\r\n expirationDate: new Date(),\r\n name:\"\",\r\n velaroUrl:\"\",\r\n customFieldDefinition: {\r\n address: [],\r\n ticket: [],\r\n contact: [],\r\n company:[]\r\n }\r\n });","import React from \"react\";\r\nimport { OrganizationContext } from \"../Contexts/OrganizationContext\";\r\nimport useApi from \"../Hooks/useApi\";\r\nimport { Organization } from \"../types\";\r\nimport Loading from \"../Views/Loading\";\r\n\r\nexport function OrganizationProvider(props: { children: React.ReactNode }) {\r\n const api = useApi();\r\n const [organization, setOrganization] = React.useState({\r\n customFieldDefinition: {\r\n address: [],\r\n company: [],\r\n contact: [],\r\n ticket: []\r\n },\r\n expirationDate: new Date(),\r\n name: \"\",\r\n velaroUrl: \"\",\r\n velaroSiteId: 0\r\n });\r\n const [loading, setLoading] = React.useState(true);\r\n\r\n const load = React.useCallback(async () => {\r\n const response = await api.get('api/organization');\r\n setOrganization(await response.json());\r\n setLoading(false);\r\n }, [api]);\r\n\r\n React.useEffect(() => {\r\n load();\r\n }, [load])\r\n\r\n if (loading) {\r\n return \r\n }\r\n\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}","import React from \"react\";\r\nimport { Route } from \"react-router-dom\";\r\nimport useAuth from \"../Hooks/useAuth\";\r\nimport Loading from \"../Views/Loading\";\r\nimport Layout from \"../Views/Layout\";\r\nimport { UsersProvider } from \"../Providers/UsersProvider\";\r\nimport { OrganizationProvider } from \"../Providers/OrganizationProvider\";\r\n\r\nexport function PrivateRoute(props: any) {\r\n const { component, ...rest } = props;\r\n const auth = useAuth();\r\n\r\n const renderFn = (Component: any) => (props: any) => {\r\n if (!!Component && auth.isAuthenticated()) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n } else {\r\n auth.loginRedirect();\r\n return ;\r\n }\r\n };\r\n\r\n return ;\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n page: number;\r\n setPage(page: number): void;\r\n totalRecordCount: number;\r\n pageSize: number;\r\n}\r\n\r\nexport default function Pager(props: Props) {\r\n const numberOfPages = Math.ceil(props.totalRecordCount / props.pageSize);\r\n\r\n var renderPages = React.useCallback(() => {\r\n let startPage = props.page - 2;\r\n let endPage = props.page + 2;\r\n if (startPage < 0) {\r\n startPage = 0;\r\n }\r\n\r\n if (startPage > 2 && endPage > props.page + 2) {\r\n endPage = props.page + 2;\r\n }\r\n\r\n if (startPage <= 2 && endPage > 4) {\r\n endPage = 4;\r\n startPage = 0;\r\n }\r\n\r\n if (endPage > 4) {\r\n startPage = endPage - 4;\r\n }\r\n\r\n const maxPage = props.totalRecordCount / props.pageSize;\r\n if (endPage > maxPage) {\r\n endPage = maxPage;\r\n }\r\n\r\n let pages = [];\r\n for (var i = startPage; i <= endPage; i++) {\r\n pages.push(i);\r\n }\r\n\r\n return pages.map((p) => {\r\n let className = \"page-item\";\r\n if (p === props.page) {\r\n className += \" active\";\r\n }\r\n return \r\n })\r\n\r\n\r\n }, [props])\r\n\r\n if (numberOfPages < 1) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n )\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n filter: string;\r\n setFilter(filter:string):void;\r\n}\r\n\r\nexport default function LetterFilter(props:Props){\r\n const alphabet = ['All', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']\r\n \r\n function onClick(e:any, filter:string) {\r\n e.preventDefault();\r\n if(filter === 'All'){\r\n filter = '';\r\n }\r\n props.setFilter(filter);\r\n }\r\n\r\n return \r\n {alphabet.map(letter => {\r\n let className = letter === props.filter ? 'active': '';\r\n if(letter === 'All' && !props.filter){\r\n className = 'active';\r\n }\r\n return
onClick(e,letter)}>{letter}\r\n })}\r\n
\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n setValue(input:string): void;\r\n label: string;\r\n value: string;\r\n}\r\n\r\nexport default function TextControl(props: Props){\r\n return (\r\n \r\n \r\n props.setValue(e.currentTarget.value)} />\r\n
\r\n )\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n \r\n}\r\n\r\nexport default function TabHeader(props: React.PropsWithChildren) {\r\n return (\r\n \r\n
\r\n
\r\n {props.children}\r\n
\r\n
\r\n
\r\n )\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n showing: string;\r\n label:string;\r\n setShowing:any;\r\n}\r\n\r\nexport default function Tab(props: Props) {\r\n return (\r\n \r\n {\r\n e.preventDefault();\r\n props.setShowing(props.label);\r\n }}>{props.label}\r\n \r\n )\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n \r\n}\r\n\r\nexport default function TabContent(props: React.PropsWithChildren) {\r\n return (\r\n \r\n
\r\n {props.children}\r\n
\r\n
\r\n )\r\n}","import React from 'react';\r\nimport Loading from '../Loading';\r\nimport useApi from '../../Hooks/useApi';\r\nimport { Contact, PagedContacts } from '../../types';\r\nimport { Link } from 'react-router-dom';\r\nimport moment from 'moment';\r\nimport Pager from '../Shared/Pager';\r\nimport LetterFilter from '../Shared/LetterFilter';\r\n\r\ninterface Props {\r\n companyId?: string;\r\n}\r\n\r\nexport default function ContactTable(props: Props) {\r\n const [loading, setLoading] = React.useState(true);\r\n const [contacts, setContacts] = React.useState>([]);\r\n const [page, setPage] = React.useState(0);\r\n const [totatRecordCount, setTotalRecordCount] = React.useState(0);\r\n const [filter, setFilter] = React.useState(\"\");\r\n const api = useApi();\r\n\r\n const loadContacts = React.useCallback(async () => {\r\n setLoading(true);\r\n const response = await api.get('api/contacts/page', { page, filter, companyId: props.companyId });\r\n const paged = (await response.json()) as PagedContacts;\r\n setContacts(paged.contacts);\r\n setTotalRecordCount(paged.totalRecordCount);\r\n setLoading(false);\r\n }, [page, filter, api, props.companyId]);\r\n\r\n React.useEffect(() => {\r\n loadContacts();\r\n }, [loadContacts]);\r\n\r\n\r\n const renderLoading = React.useCallback(() => {\r\n if (!loading) {\r\n return null;\r\n }\r\n return \r\n \r\n \r\n | \r\n
\r\n }, [loading]);\r\n\r\n const renderContact = React.useCallback((contact: Contact) => {\r\n const href = `/contacts/${contact.id}`;\r\n return (\r\n \r\n {contact.name} | \r\n {moment.utc(contact.createdOn).local().calendar()} | \r\n {moment.utc(contact.lastUpdated).local().calendar()} | \r\n {contact.phoneNumber} | \r\n {contact.emailAddress} | \r\n
\r\n )\r\n }, []);\r\n\r\n const renderEmpty = React.useCallback(() => {\r\n if (contacts.length || loading) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n No results\r\n | \r\n
\r\n )\r\n }, [contacts, loading]);\r\n\r\n const updateFilter = React.useCallback((value: string) => {\r\n setPage(0);\r\n setFilter(value);\r\n }, [])\r\n\r\n\r\n return (\r\n <>\r\n {props.companyId &&\r\n \r\n
\r\n
\r\n
Add Contact\r\n
\r\n
\r\n
\r\n
}\r\n \r\n\r\n \r\n \r\n \r\n Name | \r\n Created On | \r\n Last Updated | \r\n Phone Number | \r\n Email Address | \r\n
\r\n \r\n \r\n {renderLoading()}\r\n {contacts.map(renderContact)}\r\n {renderEmpty()}\r\n \r\n
\r\n >\r\n );\r\n}","import React from 'react';\r\nimport { Note } from '../../types';\r\nimport useApi from '../../Hooks/useApi';\r\nimport moment from 'moment';\r\nimport Loading from '../Loading';\r\n\r\ninterface Props {\r\n companyId?: string;\r\n contactId?: string;\r\n ticketId?: string;\r\n}\r\n\r\nexport default React.memo((props: Props) => {\r\n const api = useApi();\r\n const [loading, setLoading] = React.useState(true);\r\n const [reachedEnd, setReachedEnd] = React.useState(false);\r\n const [notes, setNotes] = React.useState>([]);\r\n const [content, setContent] = React.useState(\"\");\r\n\r\n \r\n const getNotes = React.useCallback(async():Promise => {\r\n let route = 'company';\r\n let params = {\r\n id: props.companyId || props.contactId || props.ticketId,\r\n skip: notes.length\r\n }\r\n\r\n if(props.contactId){\r\n route = 'contact'\r\n }\r\n \r\n if(props.ticketId){\r\n route = 'ticket'\r\n }\r\n\r\n return await api.get(`api/notes/${route}`, params);\r\n },[api, notes.length, props.companyId, props.contactId, props.ticketId]);\r\n\r\n const loadNotes = React.useCallback(async() => {\r\n setLoading(true);\r\n const response = await getNotes();\r\n var noteResponse = (await response.json()) as Array;\r\n setReachedEnd(noteResponse.length === 0);\r\n setNotes(n => [...n, ...noteResponse]);\r\n setLoading(false);\r\n }, [getNotes]);\r\n\r\n var handleScroll = React.useCallback((e:any) => {\r\n if(!reachedEnd && e.currentTarget.scrollTop - e.currentTarget.offsetHeight === -e.currentTarget.scrollHeight){\r\n loadNotes();\r\n }\r\n }, [reachedEnd, loadNotes]);\r\n\r\n\r\n async function addNote() {\r\n if(!content.trim()){\r\n return;\r\n }\r\n\r\n const response = await api.post('api/notes/postnote',{\r\n content,\r\n companyId: props.companyId,\r\n contactId: props.contactId,\r\n ticketId: props.ticketId\r\n });\r\n const note = await response.json();\r\n setNotes([note, ...notes]);\r\n setContent('');\r\n }\r\n\r\n const renderNote = React.useCallback((note: Note) => {\r\n return (\r\n \r\n
\r\n
{moment.utc(note.createdOn).local().calendar()}\r\n
\r\n )\r\n }, [])\r\n\r\n function onKeyPress(e:any){\r\n if(e.key === \"Enter\" && !e.shiftKey){\r\n addNote();\r\n }\r\n }\r\n\r\n\r\n const renderLoading = React.useCallback(() => {\r\n if(!loading){\r\n return null;\r\n }\r\n return \r\n }, [loading]);\r\n\r\n const renderEmpty = React.useCallback(() => {\r\n if(loading || notes.length){\r\n return null;\r\n }\r\n return (\r\n \r\n
No notes exist
\r\n \r\n )\r\n }, [loading, notes]);\r\n\r\n React.useEffect(() => {\r\n loadNotes();\r\n }, [loadNotes]);\r\n\r\n\r\n return (\r\n <>\r\n \r\n {notes.map(renderNote)}\r\n {renderLoading()}\r\n {renderEmpty()}\r\n
\r\n\r\n \r\n \r\n >\r\n )\r\n})","import React from 'react';\r\nimport { SelectOption } from '../../types';\r\n\r\ninterface Props {\r\n setValue(input:any): void;\r\n label: string;\r\n value: string | number;\r\n options: Array\r\n allowEmpty?:boolean;\r\n}\r\n\r\nexport default function SelectControl(props: Props){\r\n function renderOption(selectOption: SelectOption){\r\n return \r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n )\r\n}","export default [\r\n {\r\n label: \"Alabama\",\r\n value: \"AL\"\r\n },\r\n {\r\n label: \"Alaska\",\r\n value: \"AK\"\r\n },\r\n {\r\n label: \"American Samoa\",\r\n value: \"AS\"\r\n },\r\n {\r\n label: \"Arizona\",\r\n value: \"AZ\"\r\n },\r\n {\r\n label: \"Arkansas\",\r\n value: \"AR\"\r\n },\r\n {\r\n label: \"California\",\r\n value: \"CA\"\r\n },\r\n {\r\n label: \"Colorado\",\r\n value: \"CO\"\r\n },\r\n {\r\n label: \"Connecticut\",\r\n value: \"CT\"\r\n },\r\n {\r\n label: \"Delaware\",\r\n value: \"DE\"\r\n },\r\n {\r\n label: \"District Of Columbia\",\r\n value: \"DC\"\r\n },\r\n {\r\n label: \"Federated States Of Micronesia\",\r\n value: \"FM\"\r\n },\r\n {\r\n label: \"Florida\",\r\n value: \"FL\"\r\n },\r\n {\r\n label: \"Georgia\",\r\n value: \"GA\"\r\n },\r\n {\r\n label: \"Guam\",\r\n value: \"GU\"\r\n },\r\n {\r\n label: \"Hawaii\",\r\n value: \"HI\"\r\n },\r\n {\r\n label: \"Idaho\",\r\n value: \"ID\"\r\n },\r\n {\r\n label: \"Illinois\",\r\n value: \"IL\"\r\n },\r\n {\r\n label: \"Indiana\",\r\n value: \"IN\"\r\n },\r\n {\r\n label: \"Iowa\",\r\n value: \"IA\"\r\n },\r\n {\r\n label: \"Kansas\",\r\n value: \"KS\"\r\n },\r\n {\r\n label: \"Kentucky\",\r\n value: \"KY\"\r\n },\r\n {\r\n label: \"Louisiana\",\r\n value: \"LA\"\r\n },\r\n {\r\n label: \"Maine\",\r\n value: \"ME\"\r\n },\r\n {\r\n label: \"Marshall Islands\",\r\n value: \"MH\"\r\n },\r\n {\r\n label: \"Maryland\",\r\n value: \"MD\"\r\n },\r\n {\r\n label: \"Massachusetts\",\r\n value: \"MA\"\r\n },\r\n {\r\n label: \"Michigan\",\r\n value: \"MI\"\r\n },\r\n {\r\n label: \"Minnesota\",\r\n value: \"MN\"\r\n },\r\n {\r\n label: \"Mississippi\",\r\n value: \"MS\"\r\n },\r\n {\r\n label: \"Missouri\",\r\n value: \"MO\"\r\n },\r\n {\r\n label: \"Montana\",\r\n value: \"MT\"\r\n },\r\n {\r\n label: \"Nebraska\",\r\n value: \"NE\"\r\n },\r\n {\r\n label: \"Nevada\",\r\n value: \"NV\"\r\n },\r\n {\r\n label: \"New Hampshire\",\r\n value: \"NH\"\r\n },\r\n {\r\n label: \"New Jersey\",\r\n value: \"NJ\"\r\n },\r\n {\r\n label: \"New Mexico\",\r\n value: \"NM\"\r\n },\r\n {\r\n label: \"New York\",\r\n value: \"NY\"\r\n },\r\n {\r\n label: \"North Carolina\",\r\n value: \"NC\"\r\n },\r\n {\r\n label: \"North Dakota\",\r\n value: \"ND\"\r\n },\r\n {\r\n label: \"Northern Mariana Islands\",\r\n value: \"MP\"\r\n },\r\n {\r\n label: \"Ohio\",\r\n value: \"OH\"\r\n },\r\n {\r\n label: \"Oklahoma\",\r\n value: \"OK\"\r\n },\r\n {\r\n label: \"Oregon\",\r\n value: \"OR\"\r\n },\r\n {\r\n label: \"Palau\",\r\n value: \"PW\"\r\n },\r\n {\r\n label: \"Pennsylvania\",\r\n value: \"PA\"\r\n },\r\n {\r\n label: \"Puerto Rico\",\r\n value: \"PR\"\r\n },\r\n {\r\n label: \"Rhode Island\",\r\n value: \"RI\"\r\n },\r\n {\r\n label: \"South Carolina\",\r\n value: \"SC\"\r\n },\r\n {\r\n label: \"South Dakota\",\r\n value: \"SD\"\r\n },\r\n {\r\n label: \"Tennessee\",\r\n value: \"TN\"\r\n },\r\n {\r\n label: \"Texas\",\r\n value: \"TX\"\r\n },\r\n {\r\n label: \"Utah\",\r\n value: \"UT\"\r\n },\r\n {\r\n label: \"Vermont\",\r\n value: \"VT\"\r\n },\r\n {\r\n label: \"Virgin Islands\",\r\n value: \"VI\"\r\n },\r\n {\r\n label: \"Virginia\",\r\n value: \"VA\"\r\n },\r\n {\r\n label: \"Washington\",\r\n value: \"WA\"\r\n },\r\n {\r\n label: \"West Virginia\",\r\n value: \"WV\"\r\n },\r\n {\r\n label: \"Wisconsin\",\r\n value: \"WI\"\r\n },\r\n {\r\n label: \"Wyoming\",\r\n value: \"WY\"\r\n }\r\n ]","import React from \"react\";\r\nimport { OrganizationContext } from \"../Contexts/OrganizationContext\";\r\n\r\nexport default function useOrganization() {\r\n return React.useContext(OrganizationContext);\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n setValue(input:string): void;\r\n label: string;\r\n value: string;\r\n}\r\n\r\nexport default function TextAreaControl(props: Props){\r\n return (\r\n \r\n \r\n
\r\n )\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n setValue(input:boolean): void;\r\n label: string;\r\n value: boolean;\r\n}\r\n\r\nexport default function CheckboxControl(props: Props){\r\n return (\r\n \r\n
\r\n props.setValue(e.currentTarget.checked)} />\r\n \r\n
\r\n
\r\n )\r\n}","import useOrganization from '../../Hooks/useOrganization';\r\nimport { CustomFields, FieldDefinition } from '@/src/types';\r\nimport React from 'react';\r\nimport TextControl from './TextControl';\r\nimport TextAreaControl from './TextAreaControl';\r\nimport SelectControl from './SelectControl';\r\nimport CheckboxControl from './CheckboxControl';\r\n\r\ninterface Props {\r\n customInformation:CustomFields;\r\n setValue(model:any):void;\r\n type:\"contact\" | \"company\" | \"address\" | \"ticket\";\r\n}\r\n\r\nexport default React.memo((props: Props) => {\r\n const org = useOrganization();\r\n const definitions = org.customFieldDefinition[props.type];\r\n if(definitions.length === 0){\r\n return null;\r\n }\r\n\r\n const setFieldValue = function(partial:any){\r\n const update = {[props.type]:{...props.customInformation[props.type],...partial}};\r\n const customInformation = {...props.customInformation, ...update};\r\n props.setValue(customInformation)\r\n }\r\n\r\n const renderDefinition = React.useCallback((definition:FieldDefinition) =>{\r\n const record = props.customInformation && props.customInformation[props.type] ? props.customInformation[props.type] as any : {};\r\n const fieldValue = record[definition.label] || \"\";\r\n \r\n if(definition.type === \"text\"){\r\n return (\r\n setFieldValue({[definition.label]: val})} />\r\n )\r\n }\r\n \r\n if(definition.type === \"textarea\"){\r\n return (\r\n setFieldValue({[definition.label]: val})} />\r\n )\r\n }\r\n \r\n if(definition.type === \"select\"){\r\n return (\r\n setFieldValue({[definition.label]: val})} />\r\n )\r\n }\r\n \r\n if(definition.type === \"checkbox\"){\r\n return (\r\n setFieldValue({[definition.label]: val})} />\r\n )\r\n }\r\n },[props]);\r\n\r\n return (\r\n <>\r\n {definitions.map(renderDefinition)}\r\n >\r\n )\r\n})","export interface Company {\r\n customFields: CustomFields;\r\n id?: string;\r\n name: string;\r\n phoneNumber: string;\r\n emailAddress: string;\r\n address: Address;\r\n createdOn?: Date;\r\n lastUpdated?: Date;\r\n}\r\nexport interface Contact {\r\n id?: string;\r\n name: string;\r\n phoneNumber: string;\r\n emailAddress: string;\r\n address: Address;\r\n createdOn?: Date;\r\n lastUpdated?: Date;\r\n companyId?: string;\r\n companyName?: string;\r\n customFields:CustomFields;\r\n}\r\n\r\nexport interface PagedContacts {\r\n contacts: Array;\r\n totalRecordCount: number;\r\n}\r\n\r\nexport interface CustomFieldDefinition {\r\n address: Array;\r\n ticket: Array;\r\n contact: Array;\r\n company: Array;\r\n}\r\n\r\nexport interface CustomFields {\r\n address: object;\r\n ticket: object;\r\n contact: object;\r\n company: object;\r\n}\r\n\r\nexport interface FieldDefinition{\r\n type: \"text\" | \"select\" | \"checkbox\" | \"textarea\";\r\n options: Array;\r\n label: string;\r\n }\r\n\r\nexport interface Ticket {\r\n customFields: CustomFields;\r\n id?: string;\r\n createdOn?: Date;\r\n lastUpdated?: Date;\r\n title: string;\r\n status: TicketStatus;\r\n description: string;\r\n companyId?: string;\r\n contactId?: string;\r\n companyName?: string;\r\n contactName?: string;\r\n}\r\n\r\nexport interface PagedTickets {\r\n tickets: Array;\r\n totalRecordCount: number;\r\n}\r\n\r\nexport interface Dashboard {\r\n companies: Array;\r\n contacts: Array;\r\n tickets: Array\r\n}\r\n\r\nexport interface PagedCompanies {\r\n companies: Array;\r\n totalRecordCount: number;\r\n}\r\n\r\nexport interface SelectOption {\r\n label: string;\r\n value: any;\r\n}\r\n\r\nexport interface Note {\r\n id?: string;\r\n content: string;\r\n createdOn?: Date;\r\n engagementId?: string;\r\n companyId?: string;\r\n ticketId?: string;\r\n contactId?: string;\r\n}\r\n\r\nexport interface Address {\r\n addressLine1: string;\r\n addressLine2: string;\r\n city: string;\r\n state: string;\r\n zipCode: string;\r\n country: string;\r\n}\r\n\r\nexport interface Organization{\r\n velaroUrl: string;\r\n velaroSiteId?:number;\r\n name: string;\r\n expirationDate: Date;\r\n customFieldDefinition: CustomFieldDefinition;\r\n}\r\n\r\nexport interface FileReference {\r\n name: string;\r\n uri: string;\r\n createdOn: Date;\r\n}\r\n\r\nexport interface TranscriptReference{\r\n id:string;\r\n createdOn:Date;\r\n}\r\n\r\n\r\nexport interface TimelineItem {\r\n eventType: EventType;\r\n userId: string;\r\n createdOn: Date;\r\n companyId:string;\r\n contactId:string;\r\n ticketId:string;\r\n nameReference:string;\r\n id:string;\r\n}\r\n\r\nexport interface User {\r\n displayName: string;\r\n id: string;\r\n\r\n}\r\n\r\nexport interface SearchResult {\r\n name:string;\r\n id:string;\r\n lastUpdated:Date;\r\n recordType: \"Contact\" | \"Company\" | \"Ticket\";\r\n}\r\n\r\nexport enum EventType {\r\n NoteAdded,\r\n ContactAdded,\r\n ContactUpdated,\r\n TicketAdded,\r\n TicketUpdated,\r\n CompanyAdded,\r\n CompanyUpdated\r\n}\r\n\r\nexport enum TicketStatus {\r\n Open,\r\n Waiting,\r\n Closed,\r\n Reopened\r\n}","import React from 'react';\r\nimport TextControl from './TextControl';\r\nimport SelectControl from './SelectControl';\r\nimport { Address, CustomFields } from '../../types';\r\nimport StateCodes from '../../Assets/StateCodes';\r\nimport CustomFieldsEditor from './CustomFieldsEditor';\r\n\r\ninterface Props {\r\n address: Address;\r\n setAddressLine1(input:string):void;\r\n setAddressLine2(input:string):void;\r\n setCity(input:string):void;\r\n setState(input:string):void;\r\n setZipCode(input:string):void;\r\n setCountry(input:string):void;\r\n setCustomFields(input:CustomFields):void;\r\n customFields:CustomFields;\r\n}\r\n\r\nexport default React.memo((props: Props) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n >\r\n )\r\n})","import React from 'react';\r\nimport Loading from '../Loading';\r\nimport useApi from '../../Hooks/useApi';\r\nimport { PagedTickets, Ticket, TicketStatus } from '../../types';\r\nimport { Link } from 'react-router-dom';\r\nimport moment from 'moment';\r\nimport Pager from '../Shared/Pager';\r\nimport LetterFilter from '../Shared/LetterFilter';\r\n\r\ninterface Props {\r\n companyId?:string;\r\n contactId?:string;\r\n}\r\n\r\nconst ticketStatusKey = {\r\n [TicketStatus.Open]: \"Open\",\r\n [TicketStatus.Closed]: \"Closed\",\r\n [TicketStatus.Reopened]: \"Re-Opened\",\r\n [TicketStatus.Waiting]: \"Waiting\"\r\n}\r\n\r\nexport default function TicketTable(props:Props) {\r\n const [loading, setLoading] = React.useState(true);\r\n const [tickets, setTickets] = React.useState>([]);\r\n const [page, setPage] = React.useState(0);\r\n const [totatRecordCount, setTotalRecordCount] = React.useState(0);\r\n const [filter, setFilter] = React.useState(\"\");\r\n const api = useApi();\r\n\r\n const loadTickets = React.useCallback(async() => {\r\n setLoading(true);\r\n const response = await api.get('api/tickets/page', {page, filter, companyId: props.companyId, contactId: props.contactId});\r\n const paged = (await response.json()) as PagedTickets;\r\n setTickets(paged.tickets);\r\n setTotalRecordCount(paged.totalRecordCount);\r\n setLoading(false);\r\n }, [api, filter, page, props.companyId, props.contactId]);\r\n\r\n React.useEffect(() => {\r\n loadTickets();\r\n }, [page, filter, loadTickets]);\r\n\r\n\r\n const renderLoading = React.useCallback(() => {\r\n if (!loading) {\r\n return null;\r\n }\r\n return \r\n \r\n \r\n | \r\n
\r\n }, [loading]);\r\n\r\n const renderTicket = React.useCallback((ticket: Ticket) => {\r\n const href = `/tickets/${ticket.id}`;\r\n return (\r\n \r\n {ticket.title} | \r\n {moment.utc(ticket.createdOn).local().calendar()} | \r\n {moment.utc(ticket.lastUpdated).local().calendar()} | \r\n {ticketStatusKey[ticket.status]} | \r\n
\r\n )\r\n },[]);\r\n\r\n const renderEmpty = React.useCallback(() => {\r\n if (tickets.length || loading) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n No results\r\n | \r\n
\r\n )\r\n }, [tickets,loading]);\r\n\r\n const updateFilter = React.useCallback((value:string) => {\r\n setPage(0);\r\n setFilter(value);\r\n }, [])\r\n\r\n\r\n return (\r\n <>\r\n {props.companyId &&\r\n }\r\n {props.contactId &&\r\n }\r\n \r\n\r\n \r\n \r\n \r\n Name | \r\n Created On | \r\n Last Updated | \r\n Status | \r\n
\r\n \r\n \r\n {renderLoading()}\r\n {tickets.map(renderTicket)}\r\n {renderEmpty()}\r\n \r\n
\r\n >\r\n );\r\n}","import React, { useRef } from \"react\";\r\nimport useApi from \"../../Hooks/useApi\";\r\nimport { FileReference } from \"../../types\";\r\nimport Loading from \"../Loading\";\r\nimport * as $ from \"jquery\";\r\nimport moment from \"moment\";\r\nimport { TrashIcon } from \"@primer/octicons-react\";\r\n\r\ninterface Props {\r\n companyId?: string;\r\n contactId?: string;\r\n ticketId?: string;\r\n}\r\n\r\nexport default (props: Props) => {\r\n const id = props.companyId || props.contactId || props.ticketId || \"unknown\";\r\n const tenMB = 10485760;\r\n const fileInput = useRef(null);\r\n const api = useApi();\r\n const [loading, setLoading] = React.useState(true);\r\n const [files, setFiles] = React.useState>([]);\r\n\r\n const load = React.useCallback(async () => {\r\n const response = await api.get(`api/files?${$.param({ id })}`);\r\n setFiles(await response.json());\r\n setLoading(false);\r\n }, [api])\r\n\r\n const deleteFile = React.useCallback(async (file:FileReference) => {\r\n const response = await api.delete(`api/files?${$.param({ id })}`, file);\r\n setFiles(f => f.filter(x => x.name !== file.name));\r\n },[setFiles]);\r\n\r\n const renderFile = React.useCallback((file: FileReference) => {\r\n return (\r\n \r\n \r\n \r\n {file.name}\r\n \r\n | \r\n {moment.utc(file.createdOn).local().calendar()} | \r\n {e.preventDefault(); deleteFile(file)}}> | \r\n
\r\n )\r\n }, []);\r\n\r\n\r\n const onClickUploadFile = React.useCallback(async (e: React.FormEvent) => {\r\n if (e.currentTarget.files === null) {\r\n return;\r\n }\r\n\r\n const file = e.currentTarget.files[0];\r\n\r\n if (file.size > tenMB) {\r\n alert(\"File too large\");\r\n e.currentTarget.value = \"\";\r\n return;\r\n }\r\n\r\n const formData = new FormData();\r\n formData.append(\"file\", file);\r\n formData.append(\"id\", id)\r\n\r\n const promise = api.uploadFile('api/files/uploadfile', formData);\r\n e.currentTarget.value = \"\";\r\n\r\n promise.then(async result => {\r\n const file = await result.json();\r\n setFiles(f => [...f, file])\r\n })\r\n }, [setFiles]);\r\n\r\n React.useEffect(() => {\r\n load();\r\n }, [load]);\r\n\r\n\r\n if (loading) {\r\n return \r\n }\r\n\r\n return (\r\n <>\r\n \r\n {files.length === 0 &&
Nothing here
}\r\n
\r\n \r\n {files.length > 0 && \r\n \r\n \r\n Name | \r\n Date | \r\n
\r\n \r\n \r\n {files.map(renderFile)}\r\n \r\n
}\r\n \r\n \r\n
\r\n >\r\n )\r\n}\r\n","import React from 'react';\r\nimport Loading from '../Loading';\r\nimport useApi from '../../Hooks/useApi';\r\nimport TextControl from '../Shared/TextControl';\r\nimport { Company, CustomFields } from '../../types';\r\nimport { useHistory } from 'react-router-dom';\r\nimport TabHeader from '../Shared/TabHeader';\r\nimport Tab from '../Shared/Tab';\r\nimport TabContent from '../Shared/TabContent';\r\nimport ContactTable from '../Contact/ContactTable';\r\nimport Notes from '../Shared/Notes';\r\nimport AddressEditor from '../Shared/AddressEditor';\r\nimport TicketTable from '../Ticket/TicketTable';\r\nimport FileTable from '../Shared/FileTable';\r\nimport CustomFieldsEditor from '../Shared/CustomFieldsEditor';\r\n\r\ninterface Props {\r\n match: any\r\n}\r\n\r\nexport default function EditCompany(props: Props) {\r\n const history = useHistory();\r\n const api = useApi();\r\n const [name, setName] = React.useState(\"\");\r\n const [phoneNumber, setPhoneNumber] = React.useState(\"\");\r\n const [emailAddress, setEmailAddress] = React.useState(\"\");\r\n const [id, setId] = React.useState(props.match.params.id);\r\n const [showing, setShowing] = React.useState<\"Notes\" | \"Tickets\" | \"Contacts\" | \"Address\" | \"Files\">(id ? \"Notes\" : \"Address\");\r\n const [loading, setLoading] = React.useState(id);\r\n const [title, setTitle] = React.useState(\"Add Company\");\r\n const [addressLine1, setAddressLine1] = React.useState(\"\");\r\n const [addressLine2, setAddressLine2] = React.useState(\"\");\r\n const [state, setState] = React.useState(\"\");\r\n const [zipCode, setZipCode] = React.useState(\"\");\r\n const [country, setCountry] = React.useState(\"\");\r\n const [city, setCity] = React.useState(\"\");\r\n const [customFields, setCustomFields] = React.useState(\r\n {address:{},\r\n company: {},\r\n contact: {},\r\n ticket:{}\r\n });\r\n\r\n const loadCompany = React.useCallback(async() => {\r\n if (!id) {\r\n return;\r\n }\r\n const response = await api.get(`api/companies/retrieve/${id}`);\r\n const company = (await response.json()) as Company;\r\n setId(company.id);\r\n setName(company.name);\r\n setPhoneNumber(company.phoneNumber);\r\n setEmailAddress(company.emailAddress);\r\n setTitle(\"Edit Company\");\r\n setLoading(false);\r\n setAddressLine1(company.address.addressLine1);\r\n setAddressLine2(company.address.addressLine2);\r\n setCity(company.address.city)\r\n setState(company.address.state);\r\n setCountry(company.address.country);\r\n setZipCode(company.address.zipCode);\r\n setCustomFields(company.customFields)\r\n },[api, id]);\r\n\r\n React.useEffect(() => {\r\n loadCompany();\r\n }, [id, loadCompany]);\r\n\r\n if (loading) {\r\n return \r\n }\r\n\r\n async function saveCompany() {\r\n const req = {\r\n emailAddress,\r\n name,\r\n phoneNumber,\r\n address: {\r\n addressLine1,\r\n addressLine2,\r\n city,\r\n state,\r\n zipCode,\r\n country\r\n },\r\n customFields,\r\n id\r\n };\r\n\r\n const response = req.id ? await api.put('api/companies', req) : await api.post('api/companies', req);\r\n\r\n if (response.ok) {\r\n const company = (await response.json()) as Company;\r\n history.push(`/companies/${company.id}`);\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
{title}
\r\n
\r\n \r\n
\r\n \r\n
\r\n
Details
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n\r\n \r\n {id && }\r\n \r\n {id && }\r\n {id && }\r\n {id && }\r\n \r\n \r\n {id && showing === \"Notes\" && }\r\n {showing === \"Contacts\" && }\r\n {showing === \"Address\" && }\r\n {showing === \"Tickets\" && }\r\n {showing === \"Files\" && }\r\n \r\n >\r\n );\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n label: string;\r\n value?: string;\r\n}\r\n\r\nexport default function TextDisplay(props: Props){\r\n return (\r\n \r\n \r\n \r\n
\r\n )\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n label: string;\r\n value?: string;\r\n}\r\n\r\nexport default function Display(props: Props) {\r\n return (\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n )\r\n}","import React from 'react';\r\nimport { SelectOption } from '../../types';\r\n\r\ninterface Props {\r\n label: string;\r\n value: any;\r\n options: Array;\r\n}\r\n\r\nexport default function SelectDisplay(props: Props){\r\n function renderOption(selectOption: SelectOption){\r\n return \r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n )\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n label: string;\r\n value?: string;\r\n}\r\n\r\nexport default function TextAreaDisplay(props: Props){\r\n return (\r\n \r\n \r\n \r\n
\r\n )\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n label: string;\r\n value: boolean;\r\n}\r\n\r\nexport default function CheckboxDisplay(props: Props){\r\n return (\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n )\r\n}","import useOrganization from '../../Hooks/useOrganization';\r\nimport { CustomFields, FieldDefinition } from '@/src/types';\r\nimport React from 'react';\r\nimport TextDisplay from './TextDisplay';\r\nimport TextAreaDisplay from './TextAreaDisplay';\r\nimport SelectDisplay from './SelectDisplay';\r\nimport CheckboxDisplay from './CheckboxDisplay';\r\n\r\ninterface Props {\r\n customInformation:CustomFields;\r\n type:\"contact\" | \"company\" | \"address\" | \"ticket\";\r\n}\r\n\r\nexport default React.memo((props: Props) => {\r\n const org = useOrganization();\r\n const definitions = org.customFieldDefinition[props.type];\r\n if(definitions.length === 0){\r\n return null;\r\n }\r\n\r\n const renderDefinition = React.useCallback((definition:FieldDefinition) =>{\r\n const record = props.customInformation && props.customInformation[props.type] ? props.customInformation[props.type] as any : {};\r\n const fieldValue = record[definition.label] || \"\";\r\n \r\n if(definition.type === \"text\"){\r\n return (\r\n \r\n )\r\n }\r\n \r\n if(definition.type === \"textarea\"){\r\n return (\r\n \r\n )\r\n }\r\n \r\n if(definition.type === \"select\"){\r\n return (\r\n <>\r\n \r\n >\r\n )\r\n }\r\n \r\n if(definition.type === \"checkbox\"){\r\n return (\r\n <>\r\n \r\n >\r\n )\r\n }\r\n },[props]);\r\n\r\n return (\r\n <>\r\n {definitions.map(renderDefinition)}\r\n >\r\n )\r\n})","import React from 'react';\r\nimport TextDisplay from './TextDisplay';\r\nimport SelectDisplay from './SelectDisplay';\r\nimport { Address, CustomFields } from '../../types';\r\nimport StateCodes from '../../Assets/StateCodes';\r\nimport CustomFieldsDisplay from './CustomFieldsDisplay';\r\n\r\ninterface Props {\r\n address: Address;\r\n customInformation:CustomFields;\r\n}\r\n\r\nexport default React.memo((props: Props) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n >\r\n )\r\n})","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { EventType, TimelineItem, User } from '../../types';\r\nimport Loading from '../Loading';\r\nimport useApi from '../../Hooks/useApi';\r\nimport moment from \"moment\";\r\nimport * as $ from \"jquery\";\r\nimport { UsersContext } from '../../Contexts/UsersContext';\r\nimport { uniqueId } from 'underscore';\r\n\r\ninterface Props {\r\n companyId?: string;\r\n ticketId?: string;\r\n contactId?: string;\r\n}\r\n\r\nexport default React.memo((props: Props) => {\r\n const api = useApi();\r\n const [loading, setLoading] = React.useState(true);\r\n const [items, setItems] = React.useState>([]);\r\n\r\n const load = React.useCallback(async () => {\r\n setLoading(true);\r\n const response = await api.get(`api/timeline?${$.param(props)}`);\r\n setItems(await response.json());\r\n setLoading(false);\r\n }, [api, props]);\r\n\r\n React.useEffect(() => {\r\n load();\r\n }, [load])\r\n\r\n const getStripColor = React.useCallback((eventType: EventType) => {\r\n switch (eventType) {\r\n case EventType.CompanyAdded:\r\n case EventType.CompanyUpdated:\r\n return \"blue\"\r\n case EventType.ContactAdded:\r\n case EventType.ContactUpdated:\r\n return \"green\"\r\n case EventType.TicketAdded:\r\n case EventType.TicketUpdated:\r\n return \"darkblue\";\r\n default:\r\n return \"blue\";\r\n }\r\n }, []);\r\n\r\n\r\n const renderItem = React.useCallback((item: TimelineItem, users: Array) => {\r\n let link = null;\r\n let filteredUsers = users.filter(x => x.id === item.userId);\r\n let displayName = null;\r\n if (filteredUsers.length) {\r\n displayName = filteredUsers[0].displayName;\r\n }\r\n switch (item.eventType) {\r\n case EventType.CompanyAdded:\r\n link = {`${item.nameReference || \"Company\"} was created`}\r\n break;\r\n case EventType.CompanyUpdated:\r\n link = {`${item.nameReference || \"Company\"} was updated`}\r\n break;\r\n case EventType.ContactAdded:\r\n link = {`${item.nameReference || \"Contact\"} was created`}\r\n break;\r\n case EventType.ContactUpdated:\r\n link = {`${item.nameReference || \"Contact\"} was updated`}\r\n break;\r\n case EventType.TicketAdded:\r\n link = {`${item.nameReference || \"Ticket\"} was created`}\r\n break;\r\n case EventType.TicketUpdated:\r\n link = {`${item.nameReference || \"Ticket\"} was updated`}\r\n break;\r\n case EventType.NoteAdded:\r\n let href = `/tickets/${item.ticketId}`;\r\n let nameReference = item.nameReference || \"Ticket\";\r\n\r\n if (item.contactId) {\r\n href = `/contacts/${item.contactId}`;\r\n nameReference = item.nameReference || \"Contact\"\r\n }\r\n\r\n if (item.companyId) {\r\n href = `/companies/${item.companyId}`;\r\n nameReference = item.nameReference || \"Company\"\r\n }\r\n link = Note was added to {nameReference}\r\n break;\r\n }\r\n\r\n return (\r\n \r\n
\r\n {link}\r\n
\r\n
by {displayName?.trim() || \"Guest\"}\r\n
{moment.utc(item.createdOn).local().calendar()}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n }, [getStripColor]);\r\n\r\n if (loading) {\r\n return \r\n }\r\n\r\n return (\r\n <>\r\n Activity Feed
\r\n {items.length == 0 && \"No Recent Activity\"}\r\n \r\n {users => {\r\n return items.map(x => renderItem(x, users))\r\n }\r\n }\r\n \r\n >\r\n )\r\n})\r\n\r\n\r\n","import React from \"react\";\r\nimport useApi from \"../../Hooks/useApi\";\r\nimport { Organization, TranscriptReference } from \"../../types\";\r\nimport Loading from \"../Loading\";\r\nimport * as $ from \"jquery\";\r\nimport moment from \"moment\";\r\nimport { OrganizationContext } from \"../../Contexts/OrganizationContext\";\r\nimport useAuth from \"../../Hooks/useAuth\";\r\n\r\ninterface Props {\r\n companyId?:string;\r\n contactId?:string;\r\n ticketId?:string;\r\n}\r\n\r\nexport default (props:Props) => {\r\n const api = useApi();\r\n const auth = useAuth();\r\n const [loading, setLoading] = React.useState(true);\r\n const [transcripts, setTranscripts] = React.useState>([]);\r\n\r\n const load = React.useCallback(async() =>{\r\n const response = await api.get(`api/transcript?${$.param(props)}`);\r\n setTranscripts(await response.json());\r\n setLoading(false);\r\n },[api])\r\n\r\n React.useEffect(() =>{\r\n load();\r\n }, [load]);\r\n\r\n const renderTranscript = React.useCallback((transcript: TranscriptReference, organization: Organization | undefined) => {\r\n const transcriptUrl = `/transcript/show/${transcript.id}`;\r\n const passThroughUrl = `${organization?.velaroUrl}/account/passthrough`;\r\n const href = `${passThroughUrl}?token=${encodeURIComponent(auth.legacyToken.token)}&returnUrl=${encodeURIComponent(transcriptUrl)}`;\r\n return (\r\n \r\n {moment.utc(transcript.createdOn).local().calendar()} | \r\n
\r\n )\r\n },[]);\r\n\r\n const renderEmpty = React.useCallback(() => {\r\n if (transcripts.length || loading) {\r\n return null;\r\n }\r\n \r\n return (\r\n \r\n \r\n No results\r\n | \r\n
\r\n )\r\n }, [transcripts,loading]);\r\n\r\n\r\n if(loading){\r\n return \r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n Date | \r\n
\r\n \r\n \r\n \r\n {org => transcripts.map(x => renderTranscript(x, org))}\r\n \r\n {renderEmpty()}\r\n \r\n
\r\n )\r\n}","import { TicketStatus } from \"../types\";\r\n\r\nexport default [\r\n {\r\n label: \"Open\",\r\n value: TicketStatus.Open\r\n },\r\n {\r\n label: \"Waiting\",\r\n value: TicketStatus.Waiting\r\n },\r\n {\r\n label: \"Closed\",\r\n value: TicketStatus.Closed\r\n },\r\n {\r\n label: \"Re-Opened\",\r\n value: TicketStatus.Reopened\r\n },\r\n ]","\r\nimport {\r\n useLocation\r\n } from \"react-router-dom\";\r\n\r\nexport default function useQuery() {\r\n return new URLSearchParams(useLocation().search);\r\n }","import React from 'react';\r\nimport Loading from '../Loading';\r\nimport useApi from '../../Hooks/useApi';\r\nimport TextControl from '../Shared/TextControl';\r\nimport SelectControl from '../Shared/SelectControl';\r\nimport {CustomFields, SelectOption, Ticket, TicketStatus } from '../../types';\r\nimport { useHistory } from 'react-router-dom';\r\nimport Notes from '../Shared/Notes';\r\nimport Tab from '../Shared/Tab';\r\nimport TabContent from '../Shared/TabContent';\r\nimport TabHeader from '../Shared/TabHeader';\r\nimport TextAreaControl from '../Shared/TextAreaControl';\r\nimport TicketStatusOptions from '../../Assets/TicketStatus';\r\nimport useQuery from '../../Hooks/useQuery';\r\nimport FileTable from '../Shared/FileTable';\r\nimport CustomFieldsEditor from '../Shared/CustomFieldsEditor';\r\n\r\ninterface Props {\r\n match: any\r\n}\r\n\r\nexport default function EditTicket(props: Props) {\r\n const query = useQuery();\r\n const history = useHistory();\r\n const api = useApi();\r\n const [loading, setLoading] = React.useState(true);\r\n const [id, setId] = React.useState(props.match?.params?.id);\r\n const [header, setHeader] = React.useState(\"Add Ticket\");\r\n const [title, setTitle] = React.useState('');\r\n const [status, setStatus] = React.useState(TicketStatus.Open);\r\n const [description, setDescription] = React.useState(\"\");\r\n const [companyId, setCompanyId] = React.useState(query.get(\"companyId\") || \"\");\r\n const [contactId, setContactId] = React.useState(query.get(\"contactId\") || \"\");\r\n const [companyOptions, setCompanyOptions] = React.useState>([]);\r\n const [contactOptions, setContactOptions] = React.useState>([]);\r\n const [showing, setShowing] = React.useState< \"Notes\" | \"Files\">(\"Notes\");\r\n const [customFields, setCustomFields] = React.useState(\r\n {address:{},\r\n company: {},\r\n contact: {},\r\n ticket:{}\r\n });\r\n\r\n\r\n const loadTicket = React.useCallback(async() => {\r\n if(!id){\r\n return;\r\n }\r\n const response = await api.get(`api/tickets/retrieve/${id}`);\r\n const ticket = (await response.json()) as Ticket;\r\n setId(ticket.id);\r\n setCompanyId(ticket.companyId || '');\r\n setContactId(ticket.contactId || '');\r\n setTitle(ticket.title);\r\n setDescription(ticket.description);\r\n setHeader(\"Edit Ticket\");\r\n setStatus(ticket.status);\r\n setCustomFields(ticket.customFields);\r\n }, [api, id]);\r\n\r\n const loadContactOptions = React.useCallback(async() => {\r\n const response = await api.get('api/contacts/options', {companyId});\r\n const options = (await response.json());\r\n setContactOptions(options);\r\n },[api, companyId]);\r\n\r\n const renderTabs = React.useCallback(() => {\r\n if(!id){\r\n return null;\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n {id && }\r\n \r\n \r\n {showing === \"Notes\" && }\r\n {showing === \"Files\" && }\r\n \r\n >\r\n )\r\n },[id, showing]);\r\n\r\n React.useEffect(() => {\r\n loadContactOptions();\r\n }, [companyId, loadContactOptions])\r\n\r\n const loadCompanyOptions = React.useCallback(async() => {\r\n const response = await api.get('api/companies/options');\r\n const options = (await response.json());\r\n setCompanyOptions(options);\r\n },[api]);\r\n\r\n \r\n const load = React.useCallback(async() => {\r\n await Promise.all([loadTicket(), loadCompanyOptions(), loadContactOptions()])\r\n setLoading(false);\r\n },[loadTicket, loadCompanyOptions, loadContactOptions]);\r\n\r\n React.useEffect(() => {\r\n load();\r\n }, [id, load]);\r\n\r\n if (loading) {\r\n return \r\n }\r\n\r\n async function saveTicket() {\r\n const req = {\r\n id,\r\n companyId: companyId || undefined,\r\n contactId: contactId || undefined,\r\n title,\r\n description,\r\n status,\r\n customFields\r\n };\r\n\r\n const response = req.id ? await api.put('api/tickets', req) : await api.post('api/tickets', req);\r\n\r\n if (response.ok) {\r\n const ticket = (await response.json()) as Ticket;\r\n history.push(`/tickets/${ticket.id}`);\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
{header}
\r\n
\r\n \r\n
\r\n \r\n
\r\n
Details
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n\r\n {renderTabs()}\r\n >\r\n );\r\n}","import React from 'react';\r\nimport Loading from '../Loading';\r\nimport useApi from '../../Hooks/useApi';\r\nimport TextControl from '../Shared/TextControl';\r\nimport SelectControl from '../Shared/SelectControl';\r\nimport { Contact, CustomFields, SelectOption } from '../../types';\r\nimport { useHistory } from 'react-router-dom';\r\nimport AddressEditor from '../Shared/AddressEditor';\r\nimport Notes from '../Shared/Notes';\r\nimport Tab from '../Shared/Tab';\r\nimport TabContent from '../Shared/TabContent';\r\nimport TabHeader from '../Shared/TabHeader';\r\nimport TicketTable from '../Ticket/TicketTable';\r\nimport useQuery from '../../Hooks/useQuery';\r\nimport FileTable from '../Shared/FileTable';\r\nimport CustomFieldsEditor from '../Shared/CustomFieldsEditor';\r\n\r\ninterface Props {\r\n match: any\r\n}\r\n\r\nexport default function EditContact(props: Props) {\r\n const query = useQuery();\r\n const api = useApi();\r\n const history = useHistory();\r\n const [name, setName] = React.useState(\"\");\r\n const [phoneNumber, setPhoneNumber] = React.useState(\"\");\r\n const [emailAddress, setEmailAddress] = React.useState(\"\");\r\n const [loading, setLoading] = React.useState(true);\r\n const [id, setId] = React.useState(props.match.params.id);\r\n const [title, setTitle] = React.useState(\"Add Contact\");\r\n const [companyId, setCompanyId] = React.useState(query.get(\"companyId\") || \"\");\r\n const [companyOptions, setCompanyOptions] = React.useState>([]);\r\n const [showing, setShowing] = React.useState<\"Notes\" | \"Tickets\" | \"Address\" | \"Files\">(id ? \"Notes\" : \"Address\");\r\n const [addressLine1, setAddressLine1] = React.useState(\"\");\r\n const [addressLine2, setAddressLine2] = React.useState(\"\");\r\n const [state, setState] = React.useState(\"\");\r\n const [zipCode, setZipCode] = React.useState(\"\");\r\n const [country, setCountry] = React.useState(\"\");\r\n const [city, setCity] = React.useState(\"\");\r\n const [customFields, setCustomFields] = React.useState(\r\n {address:{},\r\n company: {},\r\n contact: {},\r\n ticket:{}\r\n });\r\n\r\n const loadContact = React.useCallback(async() => {\r\n if (!id) {\r\n return;\r\n }\r\n const response = await api.get(`api/contacts/retrieve/${id}`);\r\n const contact = (await response.json()) as Contact;\r\n setId(contact.id);\r\n setName(contact.name);\r\n setPhoneNumber(contact.phoneNumber);\r\n setEmailAddress(contact.emailAddress);\r\n setCompanyId(contact.companyId || '');\r\n setTitle(\"Edit Contact\");\r\n setAddressLine1(contact.address.addressLine1);\r\n setAddressLine2(contact.address.addressLine2);\r\n setCity(contact.address.city)\r\n setState(contact.address.state);\r\n setCountry(contact.address.country);\r\n setZipCode(contact.address.zipCode);\r\n setCustomFields(contact.customFields);\r\n }, [api, id]);\r\n\r\n const loadCompanyOptions = React.useCallback(async() => {\r\n const response = await api.get('api/companies/options');\r\n const options = (await response.json());\r\n setCompanyOptions(options);\r\n },[api]);\r\n\r\n const load = React.useCallback(async() => {\r\n await Promise.all([loadContact(), loadCompanyOptions()])\r\n setLoading(false);\r\n },[loadContact, loadCompanyOptions]);\r\n\r\n React.useEffect(() => {\r\n load();\r\n }, [load]);\r\n\r\n if (loading) {\r\n return \r\n }\r\n\r\n async function saveContact() {\r\n const req = {\r\n address: {\r\n addressLine1,\r\n addressLine2,\r\n city,\r\n state,\r\n country,\r\n zipCode\r\n },\r\n emailAddress,\r\n name,\r\n phoneNumber,\r\n id,\r\n companyId: companyId || undefined,\r\n customFields\r\n };\r\n\r\n const response = req.id ? await api.put('api/contacts', req) : await api.post('api/contacts', req);\r\n\r\n if (response.ok) {\r\n const contact = (await response.json()) as Contact;\r\n history.push(`/contacts/${contact.id}`);\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
{title}
\r\n
\r\n \r\n
\r\n \r\n
\r\n
Details
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n\r\n \r\n {id && }\r\n \r\n {id && }\r\n {id && }\r\n \r\n \r\n {showing === \"Notes\" && }\r\n {showing === \"Address\" && }\r\n {showing === \"Tickets\" && }\r\n {showing === \"Files\" && }\r\n \r\n >\r\n );\r\n}","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\ninterface Props {\r\n label: string;\r\n value?: string;\r\n href?: string;\r\n}\r\n\r\nexport default function DisplayLink(props: Props) {\r\n return (\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n )\r\n}","import React from 'react';\r\n\r\ninterface Props {\r\n title: string;\r\n color: \"bg-base\" | \"bg-accentdark\" | \"bg-accentmed\" | \"bg-accentlight\"\r\n}\r\n\r\nexport default function Card(props: React.PropsWithChildren) {\r\n const headerClass = `card-header ${props.color}`;\r\n return (\r\n \r\n
\r\n {props.title}\r\n
\r\n
\r\n {(props.children as Array).length > 0 ? props.children : \"No results\"}\r\n
\r\n
\r\n )\r\n}","import React from 'react';\r\nimport { Company } from '../../types';\r\nimport Card from '../Shared/Card';\r\nimport { Link } from 'react-router-dom';\r\n\r\ninterface Props {\r\n companies: Array;\r\n}\r\n\r\nexport default function RecentlyUpdatedCompanies(props: Props) {\r\n\r\n\r\n const renderCompany = React.useCallback((company:Company) => {\r\n const href = `/companies/${company.id }`;\r\n return (\r\n \r\n \r\n {company.name}\r\n \r\n
\r\n )\r\n }, []);\r\n\r\n return (\r\n \r\n {props.companies.map(renderCompany)}\r\n \r\n )\r\n}","import React from 'react';\r\nimport { Company, Contact } from '../../types';\r\nimport Card from '../Shared/Card';\r\nimport { Link } from 'react-router-dom';\r\n\r\ninterface Props {\r\n contacts: Array;\r\n}\r\n\r\nexport default function RecentlyUpdatedContacts(props: Props) {\r\n\r\n\r\n const renderContact = React.useCallback((contact:Company) => {\r\n const href = `/contacts/${contact.id }`;\r\n return (\r\n \r\n \r\n {contact.name}\r\n \r\n
\r\n )\r\n }, []);\r\n\r\n return (\r\n \r\n {props.contacts.map(renderContact)}\r\n \r\n )\r\n}","import React from 'react';\r\nimport { Company, Ticket } from '../../types';\r\nimport Card from '../Shared/Card';\r\nimport { Link } from 'react-router-dom';\r\n\r\ninterface Props {\r\n tickets: Array;\r\n}\r\n\r\nexport default function RecentlyUpdatedTickets(props: Props) {\r\n\r\n\r\n const renderTicket = React.useCallback((ticket:Ticket) => {\r\n const href = `/tickets/${ticket.id }`;\r\n return (\r\n \r\n \r\n {ticket.title}\r\n \r\n
\r\n )\r\n }, []);\r\n\r\n return (\r\n \r\n {props.tickets.map(renderTicket)}\r\n \r\n )\r\n}","import * as React from \"react\";\r\nimport { Route, Switch } from \"react-router-dom\";\r\nimport { LoginCallback } from \"../Views/Auth/LoginCallback\";\r\nimport { Logout } from \"../Views/Auth/Logout\";\r\nimport { LogoutCallback } from \"../Views/Auth/LogoutCallback\";\r\nimport { PrivateRoute } from \"./PrivateRoute\";\r\nimport Companies from \"../Views/Company/Companies\";\r\nimport EditCompany from \"../Views/Company/EditCompany\";\r\nimport ViewCompany from \"../Views/Company/ViewCompany\";\r\nimport Contacts from '../Views/Contact/Contacts';\r\nimport Tickets from '../Views/Ticket/Tickets';\r\nimport EditTicket from '../Views/Ticket/EditTicket';\r\nimport EditContact from '../Views/Contact/EditContact';\r\nimport ViewContact from '../Views/Contact/ViewContact';\r\nimport Dashboard from '../Views/Dashboard';\r\nimport ViewTicket from '../Views/Ticket/ViewTicket';\r\nimport LoginCallbackError from \"../Views/Auth/LoginErrorCallback\";\r\n\r\nexport const Routes = (\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n);","import useAuth from \"../../Hooks/useAuth\";\r\nimport React from \"react\";\r\n\r\nexport default function LoginCallbackError() {\r\n const auth = useAuth();\r\n\r\n return (\r\n \r\n
An unexpected error has occurred while attempting to log in.
\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n","import React from \"react\";\r\nimport useAuth from \"../../Hooks/useAuth\";\r\nimport Loading from \"../Loading\";\r\n\r\nexport function LoginCallback() {\r\n const auth = useAuth();\r\n\r\n React.useLayoutEffect(() => {\r\n auth.handleLoginCallback();\r\n }, [auth]);\r\n\r\n return ;\r\n}","import React from \"react\";\r\nimport useAuth from \"../../Hooks/useAuth\";\r\nimport Loading from \"../Loading\";\r\n\r\nexport function Logout() {\r\n const auth = useAuth();\r\n\r\n React.useLayoutEffect(() => {\r\n auth.logout();\r\n }, [auth]);\r\n\r\n return ;\r\n}","import React from \"react\";\r\nimport useAuth from \"../../Hooks/useAuth\";\r\nimport Loading from \"..//Loading\";\r\n\r\nexport function LogoutCallback() {\r\n const auth = useAuth();\r\n\r\n React.useLayoutEffect(() => {\r\n auth.logoutCallback();\r\n }, [auth]);\r\n\r\n return ;\r\n}","import React from 'react';\r\nimport Loading from '../Loading';\r\nimport useApi from '../../Hooks/useApi';\r\nimport { Company } from '../../types';\r\nimport TextDisplay from '../Shared/TextDisplay';\r\nimport Notes from '../Shared/Notes';\r\nimport Display from '../Shared/Display';\r\nimport { Link } from 'react-router-dom';\r\nimport moment from 'moment';\r\nimport ContactTable from '../Contact/ContactTable';\r\nimport TabHeader from '../Shared/TabHeader';\r\nimport TabContent from '../Shared/TabContent';\r\nimport Tab from '../Shared/Tab';\r\nimport AddressDisplay from '../Shared/AddressDisplay';\r\nimport TicketTable from '../Ticket/TicketTable';\r\nimport Timeline from '../Shared/Timeline';\r\nimport { OrganizationContext } from '../../Contexts/OrganizationContext';\r\nimport TranscriptTable from '../Shared/TranscriptTable';\r\nimport FileTable from '../Shared/FileTable';\r\nimport CustomFieldsDisplay from '../Shared/CustomFieldsDisplay';\r\n\r\ninterface Props {\r\n match: any;\r\n}\r\n\r\nexport default function ViewCompany(props: Props) {\r\n const api = useApi();\r\n const [company, setCompany] = React.useState({\r\n address: {\r\n addressLine1: \"\",\r\n addressLine2: \"\",\r\n city: \"\",\r\n country: \"\",\r\n state: \"\",\r\n zipCode: \"\"\r\n },\r\n emailAddress: \"\",\r\n name: \"\",\r\n phoneNumber: \"\",\r\n customFields: {\r\n address: {},\r\n company: {},\r\n contact: {},\r\n ticket: {}\r\n }\r\n });\r\n const [showing, setShowing] = React.useState<\"Notes\" | \"Tickets\" | \"Contacts\" | \"Address\" | \"Transcripts\" | \"Files\">(\"Notes\");\r\n const [loading, setLoading] = React.useState(true);\r\n\r\n const loadCompany = React.useCallback(async () => {\r\n const response = await api.get(`api/companies/retrieve/${props.match.params.id}`);\r\n setCompany(await response.json());\r\n setLoading(false);\r\n }, [api, props.match.params.id]);\r\n\r\n React.useEffect(() => {\r\n loadCompany();\r\n }, [loadCompany]);\r\n\r\n if (loading) {\r\n return \r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
{company.name}
\r\n \r\n
\r\n Edit Company\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
Details
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {org => \r\n org?.velaroSiteId && \r\n }\r\n \r\n \r\n \r\n \r\n {showing === \"Notes\" && }\r\n {showing === \"Contacts\" && }\r\n {showing === \"Address\" && }\r\n {showing === \"Tickets\" && }\r\n {showing === \"Transcripts\" && }\r\n {showing === \"Files\" && }\r\n \r\n >\r\n );\r\n}","import React from 'react';\r\nimport Loading from '../Loading';\r\nimport useApi from '../../Hooks/useApi';\r\nimport { Company, PagedCompanies } from '../../types';\r\nimport { Link } from 'react-router-dom';\r\nimport moment from 'moment';\r\nimport Pager from '../Shared/Pager';\r\nimport LetterFilter from '../Shared/LetterFilter';\r\n\r\nexport default function Companies() {\r\n const [loading, setLoading] = React.useState(true);\r\n const [companies, setCompanies] = React.useState>([]);\r\n const [page, setPage] = React.useState(0);\r\n const [totatRecordCount, setTotalRecordCount] = React.useState(0);\r\n const [filter, setFilter] = React.useState(\"\");\r\n const api = useApi();\r\n\r\n const loadCompanies = React.useCallback(async() => {\r\n setLoading(true);\r\n const response = await api.get('api/companies/page', {page, filter});\r\n const pagedCompanies = (await response.json()) as PagedCompanies;\r\n setCompanies(pagedCompanies.companies);\r\n setTotalRecordCount(pagedCompanies.totalRecordCount);\r\n setLoading(false);\r\n },[page, filter, api]);\r\n\r\n React.useEffect(() => {\r\n loadCompanies();\r\n }, [loadCompanies]);\r\n\r\n\r\n const renderLoading = React.useCallback(() => {\r\n if (!loading) {\r\n return null;\r\n }\r\n return \r\n \r\n \r\n | \r\n
\r\n }, [loading]);\r\n\r\n\r\n const renderCompany = React.useCallback((company: Company) => {\r\n const href = `/companies/${company.id}`;\r\n return (\r\n \r\n {company.name} | \r\n {moment.utc(company.createdOn).local().calendar()} | \r\n {moment.utc(company.lastUpdated).local().calendar()} | \r\n {company.phoneNumber} | \r\n {company.emailAddress} | \r\n
\r\n )\r\n },[]);\r\n\r\n const renderEmpty = React.useCallback(() => {\r\n if (companies.length || loading) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n No results\r\n | \r\n
\r\n )\r\n }, [companies,loading]);\r\n\r\n const updateFilter = React.useCallback((value:string) => {\r\n setPage(0);\r\n setFilter(value);\r\n }, [])\r\n\r\n\r\n return (\r\n <>\r\n\r\n \r\n
\r\n
Companies
\r\n \r\n
\r\n Add Company\r\n
\r\n
\r\n\r\n \r\n\r\n \r\n \r\n \r\n Name | \r\n Created On | \r\n Last Updated | \r\n Phone Number | \r\n Email Address | \r\n
\r\n \r\n \r\n {renderLoading()}\r\n {companies.map(renderCompany)}\r\n {renderEmpty()}\r\n \r\n
\r\n >\r\n );\r\n}","import React from 'react';\r\nimport Loading from '../Loading';\r\nimport useApi from '../../Hooks/useApi';\r\nimport { Contact } from '../../types';\r\nimport TextDisplay from '../Shared/TextDisplay';\r\nimport Notes from '../Shared/Notes';\r\nimport Display from '../Shared/Display';\r\nimport DisplayLink from '../Shared/DisplayLink';\r\nimport { Link } from 'react-router-dom';\r\nimport moment from 'moment';\r\nimport TabHeader from '../Shared/TabHeader';\r\nimport AddressDisplay from '../Shared/AddressDisplay';\r\nimport Tab from '../Shared/Tab';\r\nimport TabContent from '../Shared/TabContent';\r\nimport TicketTable from '../Ticket/TicketTable';\r\nimport Timeline from '../Shared/Timeline';\r\nimport { OrganizationContext } from '../../Contexts/OrganizationContext';\r\nimport TranscriptTable from '../Shared/TranscriptTable';\r\nimport FileTable from '../Shared/FileTable';\r\nimport CustomFieldsDisplay from '../Shared/CustomFieldsDisplay';\r\n\r\ninterface Props {\r\n match: any;\r\n}\r\n\r\nexport default function ViewContact(props: Props) {\r\n const api = useApi();\r\n const [contact, setContact] = React.useState({\r\n address: {\r\n addressLine1: \"\",\r\n addressLine2: \"\",\r\n city: \"\",\r\n country: \"\",\r\n state: \"\",\r\n zipCode: \"\"\r\n },\r\n emailAddress: \"\",\r\n name: \"\",\r\n phoneNumber: \"\",\r\n customFields: {\r\n address: {},\r\n company: {},\r\n contact: {},\r\n ticket: {}\r\n }\r\n });\r\n const [showing, setShowing] = React.useState<\"Notes\" | \"Tickets\" | \"Address\" | \"Transcripts\" | \"Files\">(\"Notes\");\r\n const [loading, setLoading] = React.useState(true);\r\n\r\n const loadContact = React.useCallback(async () => {\r\n const response = await api.get(`api/contacts/retrieve/${props.match.params.id}`);\r\n setContact(await response.json());\r\n setLoading(false);\r\n }, [api, props.match.params.id]);\r\n\r\n React.useEffect(() => {\r\n loadContact();\r\n }, [loadContact]);\r\n\r\n if (loading) {\r\n return \r\n }\r\n\r\n const editLink = `/contacts/edit/${contact.id}`;\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
{contact.name}
\r\n \r\n
\r\n Edit Contact\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
Details
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n {org => \r\n org?.velaroSiteId && \r\n }\r\n \r\n \r\n \r\n \r\n \r\n {showing === \"Notes\" && }\r\n {showing === \"Address\" && }\r\n {showing === \"Tickets\" && }\r\n {showing === \"Transcripts\" && }\r\n {showing === \"Files\" && }\r\n \r\n >\r\n );\r\n}","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport ContactTable from './ContactTable';\r\n\r\nexport default function Contacts() {\r\n return (\r\n <>\r\n\r\n \r\n
\r\n
Contacts
\r\n \r\n
\r\n Add Contact\r\n
\r\n
\r\n\r\n \r\n >\r\n );\r\n}","import React from 'react';\r\nimport Loading from '../Loading';\r\nimport useApi from '../../Hooks/useApi';\r\nimport { Ticket, TicketStatus } from '../../types';\r\nimport Notes from '../Shared/Notes';\r\nimport Display from '../Shared/Display';\r\nimport DisplayLink from '../Shared/DisplayLink';\r\nimport { Link } from 'react-router-dom';\r\nimport moment from 'moment';\r\nimport TabHeader from '../Shared/TabHeader';\r\nimport Tab from '../Shared/Tab';\r\nimport TabContent from '../Shared/TabContent';\r\nimport TextAreaDisplay from '../Shared/TextAreaDisplay';\r\nimport SelectDisplay from '../Shared/SelectDisplay';\r\nimport TicketStatusOptions from '../../Assets/TicketStatus';\r\nimport Timeline from '../Shared/Timeline';\r\nimport { OrganizationContext } from '../../Contexts/OrganizationContext';\r\nimport TranscriptTable from '../Shared/TranscriptTable';\r\nimport FileTable from '../Shared/FileTable';\r\nimport CustomFieldsDisplay from '../Shared/CustomFieldsDisplay';\r\n\r\ninterface Props {\r\n match: any;\r\n}\r\n\r\nexport default function ViewTicket(props: Props) {\r\n const api = useApi();\r\n const [ticket, setTicket] = React.useState({\r\n description: '',\r\n status: TicketStatus.Open,\r\n title: '',\r\n customFields: {\r\n address: {},\r\n company: {},\r\n contact: {}, \r\n ticket: {}\r\n }\r\n });\r\n const [showing, setShowing] = React.useState<\"Notes\" | \"Transcripts\" | \"Files\">(\"Notes\");\r\n const [loading, setLoading] = React.useState(true);\r\n\r\n const loadTicket = React.useCallback(async () => {\r\n const response = await api.get(`api/tickets/retrieve/${props.match.params.id}`);\r\n setTicket(await response.json());\r\n setLoading(false);\r\n }, [api, props.match.params.id]);\r\n\r\n React.useEffect(() => {\r\n loadTicket();\r\n }, [loadTicket]);\r\n\r\n if (loading) {\r\n return \r\n }\r\n\r\n const editLink = `/tickets/edit/${ticket.id}`;\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
{ticket.title}
\r\n \r\n
\r\n Edit Ticket\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
Details
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n {org => \r\n org?.velaroSiteId && \r\n }\r\n \r\n \r\n \r\n \r\n {showing === \"Notes\" && }\r\n {showing === \"Transcripts\" && }\r\n {showing === \"Files\" && }\r\n \r\n >\r\n );\r\n}","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport TicketTable from './TicketTable';\r\n\r\nexport default function Tickets() {\r\n return (\r\n <>\r\n\r\n \r\n
\r\n
Tickets
\r\n \r\n
\r\n Add Ticket\r\n
\r\n
\r\n\r\n \r\n >\r\n );\r\n}","import React from 'react';\r\nimport RecentlyUpdateCompanies from './RecentlyUpdatedCompanies';\r\nimport RecentlyUpdatedContacts from './RecentlyUpdatedContacts';\r\nimport useApi from '../../Hooks/useApi';\r\nimport { Dashboard } from '../../types';\r\nimport Loading from '../Loading';\r\nimport Timeline from '../Shared/Timeline';\r\nimport RecentlyUpdatedTickets from './RecentlyUpdatedTickets';\r\n\r\nexport default function Home() {\r\n const api = useApi();\r\n const [loading, setLoading] = React.useState(true);\r\n const [dashboard, setDashboard] = React.useState({\r\n companies: [],\r\n contacts: [],\r\n tickets:[]\r\n });\r\n\r\n const loadDashboard = React.useCallback(async () => {\r\n setLoading(true);\r\n const response = await api.get('api/dashboard');\r\n const dashboard = (await response.json()) as Dashboard;\r\n setDashboard(dashboard);\r\n setLoading(false);\r\n }, [api]);\r\n\r\n React.useEffect(() => {\r\n loadDashboard();\r\n }, [loadDashboard])\r\n\r\n const renderContent = React.useCallback(() => {\r\n if (loading) {\r\n return (\r\n \r\n ;\r\n
\r\n )\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n >\r\n )\r\n }, [loading, dashboard]);\r\n\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
Dashboard
\r\n \r\n
\r\n \r\n {renderContent()}\r\n
\r\n >\r\n )\r\n}","import React from 'react';\r\nimport { BrowserRouter } from \"react-router-dom\";\r\nimport { AuthProvider } from './Providers/AuthProvider';\r\nimport { Routes } from './Routes/Routes';\r\nimport \"./Styles/site.less\"\r\n\r\nexport default function App() {\r\n return (\r\n \r\n \r\n \r\n );\r\n}","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);"],"names":["authService","constructor","token","expires","Date","now","userName","picture","firstName","lastName","loadTokenFromStorage","loadLegacyTokenFromStorage","loadProfileFromStorage","profileJson","sessionStorage","getItem","profile","JSON","parse","item","data","legacyToken","isAuthenticated","this","getTime","loginRedirect","setItem","window","location","pathname","redirectUri","origin","url","encodeURIComponent","replace","logout","logoutCallback","removeItem","retryLogin","temporaryToken","fetchAccessToken","log","response","fetch","method","body","stringify","headers","ok","error","json","URLSearchParams","search","get","err","checkAccessTokenTimeout","delta","frameRemoved","frame","document","createElement","qs","src","style","width","height","border","position","destroy","removeChild","removeEventListener","handleMessage","message","type","refresh","addEventListener","appendChild","setTimeout","checkAccessToken","AuthContext","React","createContext","AuthService","props","Provider","value","children","useContext","className","alt","logoUrl","accessToken","endpoint","$","param","Authorization","post","uploadFile","put","delete","auth","useAuth","useMemo","Api","searchResults","setSearchResults","useState","searching","setSearching","showingSearchResults","setShowingSearchResults","term","setTerm","api","useApi","_","debounce","async","term2","results","useEffect","closeSearchResults","debouncedSearch","useCallback","e","currentTarget","apiMap","Contact","Ticket","Company","renderSearchResults","length","map","key","sr","id","Link","to","recordType","name","ThreeBarsIcon","size","onChange","placeholder","SyncIcon","path","setPath","onClickLink","getClassName","link","onClick","HomeFillIcon","verticalAlign","OrganizationIcon","PeopleIcon","ChecklistIcon","SignOutIcon","Navbar","Sidebar","role","marginTop","UsersContext","users","setUsers","loading","setLoading","load","Loading","OrganizationContext","velaroSiteId","expirationDate","velaroUrl","customFieldDefinition","address","ticket","contact","company","organization","setOrganization","_a","component","rest","Route","render","Component","props2","UsersProvider","OrganizationProvider","Layout","__spreadValues","numberOfPages","Math","ceil","totalRecordCount","pageSize","renderPages","startPage","page","endPage","maxPage","pages","i","push","p","setPage","letter","filter","href","preventDefault","setFilter","label","setValue","showing","setShowing","contacts","setContacts","totatRecordCount","setTotalRecordCount","loadContacts","companyId","paged","renderLoading","background","colSpan","renderContact","moment","utc","createdOn","local","calendar","lastUpdated","phoneNumber","emailAddress","renderEmpty","updateFilter","marginBottom","LetterFilter","Pager","memo","reachedEnd","setReachedEnd","notes","setNotes","content","setContent","getNotes","route","params","contactId","ticketId","skip","loadNotes","noteResponse","n","handleScroll","scrollTop","offsetHeight","scrollHeight","trim","note","renderNote","onScroll","onKeyPress","shiftKey","addNote","allowEmpty","options","selectOption","rows","checked","EventType","EventType2","TicketStatus","TicketStatus2","definitions","useOrganization","setFieldValue","partial","update","customInformation","renderDefinition","definition","fieldValue","TextControl","val","TextAreaControl","SelectControl","CheckboxControl","addressLine1","setAddressLine1","addressLine2","setAddressLine2","city","setCity","state","setState","StateCodes","zipCode","setZipCode","country","setCountry","CustomFieldsEditor","customFields","setCustomFields","ticketStatusKey","Open","Closed","Reopened","Waiting","tickets","setTickets","loadTickets","renderTicket","title","status","fileInput","useRef","files","setFiles","$.param","deleteFile","file","f","x","renderFile","download","uri","TrashIcon","onClickUploadFile","formData","FormData","append","promise","then","result","file2","display","ref","current","click","history","useHistory","setName","setPhoneNumber","setEmailAddress","setId","match","setTitle","loadCompany","req","TabHeader","Tab","TabContent","Notes","ContactTable","AddressEditor","TicketTable","FileTable","disabled","TextDisplay","TextAreaDisplay","SelectDisplay","CheckboxDisplay","CustomFieldsDisplay","items","setItems","getStripColor","eventType","CompanyAdded","CompanyUpdated","ContactAdded","ContactUpdated","TicketAdded","TicketUpdated","renderItem","filteredUsers","userId","displayName","nameReference","NoteAdded","uniqueId","paddingBottom","Consumer","transcripts","setTranscripts","renderTranscript","transcript","transcriptUrl","target","org","useLocation","query","useQuery","header","setHeader","setStatus","description","setDescription","setCompanyId","setContactId","companyOptions","setCompanyOptions","contactOptions","setContactOptions","loadTicket","loadContactOptions","renderTabs","loadCompanyOptions","Promise","all","TicketStatusOptions","loadContact","headerClass","color","renderCompany","Card","companies","Routes","Switch","exact","textAlign","padding","useLayoutEffect","handleLoginCallback","PrivateRoute","EditCompany","setCompany","Display","Timeline","AddressDisplay","TranscriptTable","setCompanies","loadCompanies","pagedCompanies","EditContact","setContact","editLink","DisplayLink","companyName","EditTicket","setTicket","contactName","dashboard","setDashboard","loadDashboard","dashboard2","renderContent","RecentlyUpdateCompanies","RecentlyUpdatedContacts","RecentlyUpdatedTickets","AuthProvider","BrowserRouter","basename","ReactDOM","StrictMode","App","getElementById"],"mappings":"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"}