{"version":3,"sources":["images/header-logo.png","images/recent-activity-green.png","images/recent-activity-yellow.png","images/recent-activity-red.png","images/recent-activity-gray.png","components/textInput.tsx","globals.ts","api/api-shared.ts","enums/role.ts","api/api-account.ts","api/urls.ts","components/NavButton.tsx","classes/promiseHelper.ts","api/api-auth.ts","pages/page-login.tsx","components/private-route.tsx","styles/TableFormats.tsx","modals/modal-base.tsx","modals/modal-confirmLogout.tsx","enums/statisticIndicatorLevel.ts","components/header.tsx","api/api-user.ts","modals/modal-genericDelete.tsx","dtos/user.ts","api/api-role.ts","api/api-group.ts","api/api-region.ts","api/api-facility.ts","components/labeledInput.tsx","modals/modal-addEditUser.tsx","functions/general.ts","enums/alertLevel.ts","pages/page-notifications.tsx","components/alertBanner.tsx","components/subscriptionBanner.tsx","pages/page-users.tsx","pages/page-accountConfirm.tsx","api/api-asset.ts","dtos/asset.ts","modals/modal-addEditAsset.tsx","pages/page-assets.tsx","dtos/group.ts","modals/modal-addEditGroup.tsx","pages/page-groups.tsx","dtos/region.ts","modals/modal-addEditRegion.tsx","pages/page-regions.tsx","api/api-notifications.ts","api/api-operator.ts","components/timePicker.tsx","components/datePicker.tsx","dtos/facility.ts","modals/modal-addEditFacility.tsx","pages/page-facilities.tsx","components/navCard.tsx","enums/OperatorAccess.ts","pages/page-admin.tsx","dtos/operator.ts","modals/modal-addEditOperator.tsx","pages/page-operators.tsx","pages/page-reports.tsx","dtos/subscription.ts","components/loadingSpinner.tsx","modals/modal-addEditSubscription.tsx","api/api-subscription.ts","pages/page-subscriptions.tsx","api/api-subscriptionAgreement.ts","modals/modal-updateSubscriptionAgreement.tsx","pages/page-subscriptionAgreements.tsx","pages/page-termsAndConditions.tsx","api/api-statistic.ts","components/assetStatisticsPanel.tsx","components/indicatorWithTooltip.tsx","components/assetStatisticRow.tsx","pages/page-home.tsx","App.tsx","serviceWorker.ts","index.tsx","images/header-logo-white.png"],"names":["module","exports","TextInput","props","setFocus","reference","current","focus","state","value","className","this","class","additionalLabelStyle","title","type","inputType","placeholder","String","name","propName","onChange","e","handleChange","parentProp","ref","readOnly","readonly","disabled","React","Globals","GUID_PLACEHOLDER","DATETIME_REGEX","logoutRedirectMessage","buildRequest","requestUrl","method","body","headers","Headers","append","token","getToken","bodyStringified","undefined","JSON","stringify","Request","responseToJson","response","a","async","text","responseString","responseJson","parse","key","valueIsISO","test","input","moment","ISO_8601","isValid","Date","httpRequestAsync","request","history","createBrowserHistory","fetch","get","includes","accountApi","push","window","location","reload","success","redirectMessage","jsonResponse","status","errorResult","data","error","err","detail","message","result","Role","STORAGE","TOKEN_CLAIM_TYPES","BASE_URL","process","REACT_APP_IS_PROXY","NavButtonSize","saveTokenData","localStorage","setItem","JWT_TOKEN","decodedToken","jwt_decode","roles","USER_ROLES","join","SUBSCRIPTIONS_NUM_EXPIRING","NUM_EXPIRING_SUBSCRIPTIONS","SUBSCRIPTIONS_NUM_EXPIRED","NUM_EXPIRED_SUBSCRIPTIONS","SUBSCRIPTION_AGREEMENT_VERSION","ACCEPTED_SUBSCRIPTION_AGREEMENT_VERSION","saveLoginData","authorizedLogin","USER_NAME","user","username","USER_ROLE_ID","roleId","USER_GROUP_ID","groupId","USER_REGION_ID","regionId","USER_FACILITY_ID","facilityId","USER_REPORT_URL","reportURL","getUserName","getItem","getUserRoles","rolesString","split","map","role","getUserGroupId","getUserRegionId","getUserFacilityId","userIsWebAdmin","linq","contains","WebAdmin","userIsAdmin","Admin","userIsRegional","Regional","userIsLocal","Local","logOut","clear","resetPasswordAsync","email","httpResponse","confirmAccountAsync","dto","PromiseHelper","p","promise","t","c","then","x","catch","console","log","alert","loginAsync","login","LoginPage","uNameRef","tokenPromise","focusUserName","handleKeyPress","handleLogin","handleInputChange","targetName","target","val","setState","prevState","disableInputs","errorMessage","userLogin","password","newPromise","isLoggedIn","handleForgotPassword","apiResult","renderLoginButtons","onClick","options","replace","clearPromise","to","pathname","subscriptionError","onKeyPress","src","headerLogo","alt","width","href","rel","PrivateRoutes","children","columnHeaderStyle","textAlign","fontWeight","font","borderRadius","dataStyle","padding","BaseModal","isModalOpen","closeModal","ariaHideApp","isOpen","shouldCloseOnEsc","shouldCloseOnOverlayClick","onRequestClose","base","afterOpen","beforeClose","overlayClassName","ConfirmLogoutModal","handleLogout","logout","handleCancel","tabIndex","NavButton","StatisticIndicatorLevel","icon","iconSelected","path","size","small","alternatePaths","showSelected","sizeClassName","large","pill","activeClassName","exact","isActive","pathMatch","some","require","Header","closeConfirmLogoutModal","logoutModalIsOpen","handleConfirmLogout","getUsersAsync","addUserAsync","editUserAsync","deleteUserAsync","userId","GenericDeleteModal","confirmButtonPressed","bind","itemType","toLowerCase","itemName","deleteItem","itemId","defaultUser","id","firstName","lastName","phoneNumber","roleName","groupName","regionName","facilityName","primaryContact","lastLoginTime","getRolesAsync","getGroupsAsync","addGroupAsync","group","editGroupAsync","deleteGroupAsync","getRegionsAsync","addRegionAsync","region","editRegionAsync","deleteRegionAsync","getFacilitiesAsync","addFacilityAsync","facility","editFacilityAsync","deleteFacilityAsync","LabeledInput","label","AddEditUserModal","inputChange","currentTarget","onInputChange","onRoleChange","firstOrDefault","r","onGroupChange","onRegionChange","onPrimaryContactChange","checked","handleConfirm","addUser","userIsValid","firstIsValid","length","lastIsValid","phoneIsValid","emailIsValid","roleIsValid","webAdminRole","RoleEnum","adminRole","regionalRole","localRole","roleBasedRequirementsAreValid","groups","regions","facilities","nextProps","userRole","autoFocus","g","filter","f","roleApi","groupApi","regionApi","facilityApi","formatDateTime","date","excludeTime","toLocaleDateString","toLocaleTimeString","setMomentToMidnight","set","hour","minute","second","millisecond","AlertLevel","indicatorColor","indicatorLevel","Ok","Warning","Critical","NotificationType","alertIcon","level","Info","faCheckCircle","Warn","faExclamationCircle","Error","faTimesCircle","None","alertStyle","AlertBanner","isVisible","style","SubscriptionBanner","notLink","numExpiring","numExpiringString","parseInt","getNumExpiringSubscriptions","numExpired","numExpiredString","getNumExpiredSubscriptions","numExpiringIsVisible","numExpiredIsVisible","additionalText","UsersPage","userApi","getResult","users","addEditUserAsync","addNew","closeAddModal","closeDeleteModal","handleAdd","addModalIsOpen","userToEdit","handleEdit","handleDelete","deleteModalIsOpen","userToDelete","handlePasswordReset","filterable","defaultFilterMethod","row","matchSorter","showPagination","minRows","columns","accessor","u","headerStyle","TableStyles","minWidth","sortable","Cell","original","faEnvelopeOpen","faPencilAlt","faTrashAlt","AccountConfirmPage","operation","newItemState","errorMsg","passwordConfirmation","agreesToSubscription","params","search","match","RegExp","event","s","withRouter","getAssetsAsync","addAssetAsync","asset","editAssetAsync","deleteAssetAsync","assetId","defaultAsset","serialNumber","macAddress","description","mode","lastOnline","mqttVersion","softwareVersion","alertEmailRecipients","alertsEnabled","bhsSerialNumber","pmChecklistEnabled","recentActivityLevel","startingBEHours","totalFootPedalHours","AddAssetModal","addEditAsset","assetIsValid","nameIsValid","facilityIsValid","serialNumberIsValid","bhsSerialNumberIsValid","emailsAreValid","macAddressIsValid","parseFloat","AssetsPage","assetApi","assets","addEditAssetAsync","addEditErrorMsg","addEditModalIsOpen","assetToEdit","assetToDelete","readOnlyView","toFixed","show","faSignal","color","defaultGroup","createdDate","AddEditGroupModal","addGroup","groupIsValid","GroupsPage","addEditGroupAsync","groupToEdit","groupToDelete","defaultRegion","AddEditRegionModal","addRegion","regionIsValid","RegionsPage","addEditRegionAsync","regionToEdit","regionToDelete","getNotificationsAsync","query","pageNumber","pageSize","getNotificationsCountAsync","getOperatorsAsync","getFilteredOperatorsAsync","addOperatorAsync","operator","editOperatorAsync","softDeleteOperatorAsync","operatorId","TimePicker","isFocused","timePickerChanged","time","controlCssClass","showSecond","inputReadOnly","use12Hours","popupClassName","allowEmpty","showNowButton","setCurrentTime","DatePicker","datePickerChanged","required","onDateChange","focused","onFocusChange","arg","numberOfMonths","hideKeyboardShortcutsPanel","noBorder","block","isOutsideRange","pastDatesSelectable","isDayHighlighted","day","isSame","showTodayButton","setCurrentDate","defaultPageSize","NotificationsPage","getQuery","startDate","toDate","startTime","start","constructDateObject","endDate","endTime","end","active","operatorName","payload","timestamp","lastModified","sortingFields","sortFields","getFilteredNotificationsCountAsync","notificationApi","filteredNotificationsCount","count","dateObject","setHours","getHours","setMinutes","getMinutes","setSeconds","setMilliseconds","notifications","operators","getFullNotifications","fullNotifications","groupJoin","n","selectMany","defaultIfEmpty","assetName","o","orderByDescending","toArray","onStartTimeChange","onStartDateChange","onEndTimeChange","onEndDateChange","filterSelectorStyle","menuListHeight","menuList","styles","height","toString","control","minHeight","margin","add","assetOptions","orderBy","distinct","select","facilityOptions","notificationTypeOptions","Object","keys","isNaN","Number","operatorOptions","op","activeOptions","manual","page","pages","Math","ceil","onPageChange","onPageSizeChange","onSortedChange","newSorted","column","shiftKey","onFilteredChange","newAssetId","newFacilityId","newType","newActive","newBhsSerialNumber","newOperatorName","newPayload","newTimestamp","newLastModified","forEach","col","find","filterMethod","assetOption","Filter","isMulti","isClearable","facilityOption","fa","operatorOption","filterValue","nt","ac","defaultFacility","streetAddress","suiteAddress","city","zipCode","AddEditFacilityModal","addFacility","streetAddressIsValid","cityIsValid","stateIsValid","zipCodeIsValid","FacilitiesPage","addEditFacilityAsync","facilityToEdit","facilityToDelete","NavCard","OperatorAccess","AdminPage","faUser","faSitemap","faGlobeAmericas","faBuilding","faBatteryHalf","faIdCard","faKey","faHandshake","faLock","defaultOperator","pin","accessLevel","AddEditOperatorModal","parseValueAsInt","onAccessLevelChange","addOperator","operatorIsValid","accessIsValid","BhsTechnician","Manager","NoAccess","Operator","pinIsValid","maxLength","operatorAccessValue","OperatorsPage","operatorApi","addEditOperatorAsync","operatorToEdit","operatorToDelete","ReportsPage","reportUrl","defaultSubscription","purchaseOrderNumber","salesOrderNumber","trialSubscription","LoadingSpinner","faCircleNotch","spin","AddEditSubscriptionModal","subscription","subscriptionIsValid","isLoading","addEditSubscription","getSubscriptionsAsync","addSubscriptionAsync","editSubscriptionAsync","deleteSubscriptionAsync","subscriptionId","SubscriptionsPage","subscriptionApi","subscriptions","addEditSubscriptionAsync","closeAddEditModal","subscriptionToEdit","subscriptionToDelete","userCanEdit","currentTimeUtc","utc","subscriptionIsActive","Component","getSubscriptionAgreementsAsync","updateVersionAsync","version","getCurrentVersionAsync","createSubscriptionAgreement","UpdateSubscriptionAgreementModal","updateSubscriptionAgreementVersion","newSubscriptionAgreementVersion","currentSubscriptionAgreementVersion","newVersionIsValid","SubscriptionAgreementsPage","handleUpdate","updateVersionModalIsOpen","closeUpdateModal","subscriptionAgreementsApi","currentVersion","subscriptionAgreements","subscriptionAgreementApi","acceptedDate","TermsAndConditionsPage","handleAgree","previous","apiResponse","agreementUpdated","getAssetStatisticsAsync","getAlarmStatisticsAsync","AssetStatisticsPanel","IndicatorWithTooltip","tooltipText","tooltipId","dateTimeNow","now","fullTooltipId","faSolidCircle","data-tip","data-for","textColor","backgroundColor","disable","AssetStatisticRow","tooltip","assetStatRowDescription","indicatorLevelText","showTooltip","Na","HomePage","fetchData","selectedAssetId","onAssetChanged","alarmStatistics","assetStatistics","statisticApi","assetStatisticDescription","notification","beRecentActivityIcon","beRecentActivityStatus","greenBeStatusIcon","yellowBeStatusIcon","redBeStatusIcon","grayBeStatusIcon","beRecentActivityTooltipText","chartAlarmData","subtract","format","numberOfAlarms","chartLabels","chartValues","chartData","labels","datasets","borderColor","borderWidth","lastFootPedalOperator","lastLoginOperator","lastTiltXOperator","lastTiltYOperator","lastProximitySwitchOperator","lastLoginNotification","lastChecklistNotification","lastProximitySwitchNotification","lastFootPedalNotification","lastTiltYNotification","lastTiltXNotification","tiltXNotificationStatus","tiltYNotificationStatus","oilFilterNotificationStatus","oilPressureNotificationStatus","oilTemperatureNotificationStatus","oilLevelNotificationStatus","proximitySwitchNotificationStatus","checklistNotificationStatus","legend","display","animation","duration","scales","xAxes","scaleLabel","labelString","fontColor","fontSize","yAxes","ticks","beginAtZero","stepSize","App","component","Boolean","hostname","ReactDOM","render","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.720c7be5.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAYAAACN1PRVAAAACXBIWXMAAAsSAAALEgHS3X78AAACTUlEQVRIib1WT0gUURz+ZhQ6FEsKyQQuyByE8rJ7qGAuKiUYdltI6KIRXq3YaySGl8Bw86gU7kXoYNcCD7sdGvoD7RpZtyFYqYEga7DDQrnx+/HetDvOX1v3g8cMM9983/t9/N6bpyACuqllAEwBGAGQ8WFXAZQBFC3DroapBZrppkbic8IkLsh03jLscmwz3dSWANxKYOJFwTLs26FmuqmdBFAKiCspKNJRy7B/yO9Uj0C7jCB0Ss0PXDMRXbuMXEOhy1DwrxlKoZ/9HyjOsqxs7rBS10/PYKx3PIrG+opYR5XDGF1IGVgf2oDz28Fw5RxfQ5BVxYINRKo7xaJ+yPVd5afEGeu5HDW3KTVs0ZLI+tmnPPvcqckD75sNKM4IjKhhHXhn4B7OHB/i+9l0vtWod5wns1OvcXzEC0pAIONdZy1ishoS6z+WbqlONsXm9+fY3H3G9zLWQOim1qDxce9Dww+Pv6w0HtYW+c2rny+Zm3kz6DInti7y8ANpSn0a3WET+fRrGwuf73Jc09oMx0SDqiRQhMQhvHbMqBjhml15fymQRDGu2auY7c/jZjrvtvja11WXc207Fx6hWGeVONsUVfci+5avEsPvznN1MVFVxT8oElSNbASIiBMYEXi7KsZlL9ceuPcb354kMSIUu3Yf7dk9N07Qwh6IYjt/HCiKwlUu7yyivl+Pa1S2DPt+53d9cWYoHJFRQZ5JvMeCWJ2ZAFXLsLOS7t2uRsXZoS1GQs9FR09XvhuxINKsYq3BJhCfmuGAEaFzJ2IAfwHU5BZKDNkavQAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAYAAACN1PRVAAAACXBIWXMAAAsSAAALEgHS3X78AAACA0lEQVRIib1Wv0vDQBh9d4paS1AXERWyClnaoXtVcNXBUSmuTrq5iaOTnVxFXB30D9Bmc3CwS6BrBkUnFZGiSCLf3SVN0za51Nq39Hr33Xvf93K/GFLguVYBQAVAGUChS3QdgA3gnJtOPYmtp5jnWkR+qER0QaJH3HRsbTHPtU4A7GUQiaPKTWc/UcxzrWkAtR52ZQVZusxN5y2Yx2MEgxKC4qlFO0IxZd2ghEJBxSvA0FoMtcRpfwPZaQeVHfZNZWwDuZW0KMHP1D566EtoogQ2ewZ4H/Cf1sRvAopcbdje4IYg7QaW35C9FJNbTUutwhM3LTdE5iL7gDiKiH3M2EoTK/OkFchmDoCxJdme2u0Uoop+nqR9FNfDAYVCfJ+1k+XXZZvIRufbqmOTyrbmDdC8lX3dqo8m77mWLxpzl2EVbfi4kGJU2dc9/Jcdae/inYjynzcRzo/juxGOE0YTU6Hg12NJTkt8vCStGlmQ42Thd0O2v+7luE5laRDfTFUnKs2tyESock1wdWCmwg/spOyDVai+lSbqXN1B6SChKDnZ9/OYRUwcV+e60f77aav9eZ1FCOImV1e5XnVUCQlShZ9XWYRs0hn+qa/eDNV/EqoGb5L4s+BhwBdonZtOMfgTP66WdbeCjpDiCzHU11XXg1gFUlZ6q7QFiqfF0CFEGN6LGMAvmeKythtZu6gAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAYAAACN1PRVAAAACXBIWXMAAAsSAAALEgHS3X78AAACJ0lEQVRIib2Wv0/bQBTHvzaBICGkWzp1gQ1lCgNiTVq1a6Myo2SGAdiyBTaYkg4wN+0/kL0CZ6ZDMhk2WJCQWAwBKSSA0Xu5cxPHPy405COdzrLfve+9d/fOZyAGJ4U0gDyADMDPfpoA6gCqwubnUELFnBQ7L0kRXUh0T9jcDxEo5qRQBrA9goifirCxEynmpCAAWCHpGhVKaVbYcNQ40+dgXEKQfqz+F56YTN24hDxB6Zcx8G8zWJHD/g9KZ11FVnqrq+T6NqY/5+LM2L8h66jxFqHESgZzPy24LQetL4vcR7BsyoINxZgX7DSI6VxvKNloRJc3o4qWnNDMqc3kCkPf+wVm1rfixDJm1A6cLZYxtdT7nNwYXFYSosm8XF1y+sguLAOStL/OBpypaMiZ+XFhILrEp2/cd09q6B7XemNykSvC296l9nTWcINo/yq77cNd/tI9tdj2dlV4lq3vaW5BkE/ln1oiaiLP502093c4XbQmlCZqFCVBKSQb4ulvPS6N8MTu15ZDjSiNnd8/eN2SmyW4d70tTu8UD4VsdAplnTV0jimKbv7PBfeK1tdFjk6Tpin/QbFQdGojQKZ4BCGCj6uqrvXj0Z733K1pD1NUp/ZvcF38wIW9EGdN0RmGwWvGwp22rlBd2DiY/Kkv7wyVdxKqqDuJ/1qgtTNHoClseDXlP66y8u4wFiHpz2Oit6vAg1ga0qy0arAPsqfNMCRETO5GDOAVBZAG1BZpPPUAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAYAAACN1PRVAAAACXBIWXMAAAsSAAALEgHS3X78AAACHElEQVRIib1WLXMqMRS9u61ArkTiwLFV4EgV9v2DnSps3y/orXzqPSRyfwaK4EB1cUgkEgkziDcnzd2m2242MEzPTCabTPac3JObj4gawMwpEWVEpIgo/WZ0QUSaiHJmLnxstWLMDPIXKxIKiL4ysw4WY+a/RPR8gUgV/5j5t1eMmRMiWtTYdSlg6SMzH+S/uEJwKyGyPAu3486JCtb9upGQoK2USrTWcxIbbTIsQv6+ErBTi40v17IMh0Pq9XpNwwx/ZPfR2zVCnU6Hsiyj4/FI0+nU1B48xHbD1qLVahnS79Dv900vxgREl8W+TQsSzBwlTb8mqSswGAyaxFTsS/XxeEztdtt8j0ajL0KYzOFwMPZhXJ0DFml1n30ik2hAliTJp+i63a6pt9utKeTYWod76Z9MJmUULlarFZ1OJxMZyIqiMBGJ8GazMTXaUgT7/Z5ms1nZvvfNBIPn87khx5rAJhRECcBCjAF2u12TjR9i7gyqgI3r9dpEhyIpjj5BnudeIbJno/cOEsBOiGD2koWyVoEoYnsHNQJCLjnsg40XwBxXzfFbLJfL8lsS4wLkd1rrvVIKG9u/uja6KIpMDeHz+RwqpJn5jyTIa+j1r3WQ61WA//0+01rvcO/gEL+GqQF4IphUrz4L3m54UwMFMz9Io3pcPYZuhRAhy1fiR19X5RvEBd4MSinkOTK0MUsdIHueZI2q+LkXMRH9B3nl1Ka1cMQsAAAAAElFTkSuQmCC\"","import * as React from 'react';\n\ninterface Props {\n value: string | number;\n handleChange?: (\n e: React.ChangeEvent,\n parent?: string\n ) => void; // optional if readonly? == true\n propName?: string; // optional if readonly? == true\n title: string;\n parentProp?: string;\n class?: string;\n inputType?: string;\n reference?: any;\n readonly?: boolean;\n disabled?: boolean;\n additionalLabelStyle?: string;\n}\n\ninterface State {\n value: string | number;\n}\n\nclass TextInput extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = { value: props.value };\n }\n\n public setFocus = () => {\n if (this.props.reference) {\n this.props.reference.current.focus();\n }\n };\n\n render() {\n return (\n
\n
\n
\n \n {this.props.title}:\n \n
\n \n this.props.handleChange\n ? this.props.handleChange(\n e,\n this.props.parentProp\n )\n : {}\n }\n ref={this.props.reference}\n readOnly={this.props.readonly}\n disabled={this.props.disabled}\n />\n
\n
\n );\n }\n}\n\nexport default TextInput;\n","export default class Globals {\n public static GUID_PLACEHOLDER = 'a05b275a-ac76-482b-97f3-de20499b91c2';\n public static DATETIME_REGEX = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2})\\:(\\d{2})\\:(\\d{2})/;\n}\n","import { getToken } from './api-account';\nimport { createBrowserHistory } from 'history';\nimport moment from 'moment';\nimport * as accountApi from '../api/api-account';\nimport Globals from '../globals';\nimport { LoginPageRouteState } from '../pages/page-login';\n\nexport interface ErrorResult {\n message: string;\n detail: string;\n}\n\nexport interface ApiResult {\n success: boolean;\n error?: ErrorResult;\n data?: T;\n}\n\nconst logoutRedirectMessage =\n '* You have been logged out because the subscription Terms and Conditions have been updated. Log in and agree to the new Terms and Conditions in order to continue.';\n\nexport const postFormData = (url: string, file: any) => {\n let headers: Headers = new Headers();\n\n const data = new FormData();\n data.append('file', file);\n\n return fetch(url, {\n headers: headers,\n method: 'put',\n body: data\n })\n .then(data => {\n return {\n success: true,\n data: data\n };\n })\n .catch(error => {\n return {\n success: false,\n error: error.message\n };\n });\n};\n\nexport const downloadFile = (url: string): Promise => {\n // Setup authorization:\n let headers = new Headers();\n const token: string = getToken() || '';\n headers.append('Authorization', `Bearer ${token}`);\n\n // Ajax fetch the url with Authorization Header\n return (\n fetch(url, { headers })\n // Convert the 'text/csv' response to a blob\n .then(response => response.blob())\n );\n};\n\nfunction buildRequest(\n requestUrl: string,\n method: string = 'get',\n body?: any\n): Request {\n let headers: Headers = new Headers();\n headers.append('Accept', 'application/json');\n\n const token: string | null = getToken();\n if (token) {\n headers.append('Authorization', `Bearer ${token}`);\n }\n\n let bodyStringified: string | undefined = undefined;\n if (body) {\n bodyStringified = JSON.stringify(body);\n headers.append('Content-Type', 'application/json');\n }\n\n return new Request(requestUrl, {\n method: method,\n body: bodyStringified,\n headers: headers\n });\n}\n\nconst isISO = (input: string | undefined | null) => {\n const inputIsISO =\n !!input && moment(input, moment.ISO_8601, true).isValid();\n\n return inputIsISO;\n};\n\nconst responseToJson = async (response: Response) => {\n var responseString = await response.text();\n\n if (!responseString) {\n return null;\n }\n\n const responseJson = JSON.parse(responseString, (key, value) => {\n if (typeof value === 'string') {\n let valueIsISO = false;\n if (Globals.DATETIME_REGEX.test(value)) {\n valueIsISO = isISO(value);\n }\n\n return valueIsISO ? new Date(value) : value;\n }\n\n return value;\n });\n\n return responseJson;\n};\n\nexport async function httpRequestAsync(\n requestUrl: string,\n method: 'get' | 'post' | 'put' | 'delete' = 'get',\n body?: any\n): Promise> {\n let request = buildRequest(requestUrl, method, body);\n let result: ApiResult;\n const history = createBrowserHistory();\n\n try {\n let response: Response = await fetch(request);\n\n if (\n response.headers\n .get('www-authenticate')\n ?.includes('Bearer error=\"invalid_token\"')\n ) {\n accountApi.logOut();\n history.push('/login');\n window.location.reload();\n return { success: false };\n } else if (\n response.headers\n .get('www-authenticate')\n ?.includes('missing subscription agreement')\n ) {\n accountApi.logOut();\n history.push('/login', {\n redirectMessage: logoutRedirectMessage\n } as LoginPageRouteState);\n window.location.reload();\n // Note: this return statement below is not evaluated because of the page reload,\n // but is necessary to satisfy the method return type\n return { success: false };\n }\n\n let jsonResponse = await responseToJson(response);\n\n // Status 204 is NoContent, so don't try and parse it\n if (\n response.status >= 200 &&\n response.status < 300 &&\n response.status !== 204\n ) {\n return jsonResponse as ApiResult;\n }\n\n var errorResult = (jsonResponse ?? {}) as ErrorResult;\n switch (response.status) {\n case 204:\n // No Content\n return { success: true, data: undefined, error: errorResult };\n case 500:\n case 400:\n // API had an error response or bad request\n return { success: false, data: undefined, error: errorResult };\n case 401: {\n // Unauthorized\n let err: ErrorResult = {\n detail:\n errorResult.detail ??\n `You must log in to access '${requestUrl}'`,\n message: errorResult.message ?? 'NotAuthorized'\n };\n return { success: false, data: undefined, error: err };\n }\n case 403: {\n // Unauthorized\n let err: ErrorResult = {\n detail:\n errorResult.detail ??\n `User does not have permissions to access '${requestUrl}'`,\n message: errorResult.message ?? 'Not Authorized'\n };\n result = { success: false, data: undefined, error: err };\n return result;\n }\n case 404: {\n // URL Not found\n let err: ErrorResult = {\n detail:\n errorResult.detail ??\n `URL '${requestUrl}' not found on API controller`,\n message: errorResult.message ?? 'Not Found'\n };\n return { success: false, data: undefined, error: err };\n }\n case 405: {\n // Not Allowed (i.e. Tried to POST a GET route)\n let err: ErrorResult = {\n detail:\n errorResult.detail ??\n `Not allowed to '${method}' URL '${requestUrl}'`,\n message: errorResult.message ?? 'Not Allowed'\n };\n return { success: false, data: undefined, error: err };\n }\n default:\n let err: ErrorResult = {\n detail:\n errorResult.detail ?? 'Unhandled http result status',\n message: errorResult.message ?? 'API Fetch failed'\n };\n return { success: false, data: undefined, error: err };\n }\n } catch (exception) {\n let details =\n 'General exception caught in api-shared.ts. Things to check: API URL, API is running, Requested API route...';\n let err: ErrorResult = { detail: details, message: exception };\n return { success: false, data: undefined, error: err };\n }\n}\n","export enum Role {\n WebAdmin = 'WebAdmin',\n Admin = 'Admin',\n Regional = 'Regional',\n Local = 'Local'\n}\n","import * as linq from 'linq';\nimport { httpRequestAsync, ApiResult } from './api-shared';\nimport jwt_decode from 'jwt-decode';\nimport { BASE_URL, AUTH_URL } from './urls';\nimport { Role } from '../enums/role';\nimport { ConfirmAccount } from '../dtos/confirmAccount';\nimport { AuthorizedLogin } from '../dtos/authorizedLogin';\n\nexport enum STORAGE {\n USER_NAME = 'bhs-user-name',\n USER_ROLES = 'bhs-user-roles',\n USER_ROLE_ID = 'bhs-user-role-id',\n USER_GROUP_ID = 'bhs-user-group-id',\n USER_REGION_ID = 'bhs-user-region-id',\n USER_FACILITY_ID = 'bhs-user-facility-id',\n USER_REPORT_URL = 'bhs-user-report-url',\n JWT_TOKEN = 'bhs-user-token',\n SUBSCRIPTIONS_NUM_EXPIRING = 'subscriptions-num-expiring',\n SUBSCRIPTIONS_NUM_EXPIRED = 'subscriptions-num-expired',\n SUBSCRIPTION_AGREEMENT_VERSION = 'subscription-agreement-version'\n}\n\nexport enum TOKEN_CLAIM_TYPES {\n ACCEPTED_SUBSCRIPTION_AGREEMENT_VERSION = 'AcceptedSubscriptionAgreementVersion',\n NUM_EXPIRING_SUBSCRIPTIONS = 'NumExpiringSubscriptions',\n NUM_EXPIRED_SUBSCRIPTIONS = 'NumExpiredSubscriptions'\n}\n\nexport const saveTokenData = (token: string) => {\n localStorage.setItem(STORAGE.JWT_TOKEN, token);\n\n let decodedToken: any = jwt_decode(token);\n // TODO: eventually put back logic based on this claim; put in workaround\n // below to get things temporarily going\n // let roles: string[] | string =\n // decodedToken[\n // 'http://schemas.microsoft.com/ws/2008/06/identity/claims/role'\n // ];\n\n let roles: string[] | string = decodedToken['role'];\n\n if (typeof roles === 'string') {\n localStorage.setItem(STORAGE.USER_ROLES, roles);\n } else {\n try {\n // If the user only has 1 role, this will fail, so catch it below\n localStorage.setItem(STORAGE.USER_ROLES, roles.join(', '));\n } catch (error) {}\n }\n\n localStorage.setItem(\n STORAGE.SUBSCRIPTIONS_NUM_EXPIRING,\n decodedToken[TOKEN_CLAIM_TYPES.NUM_EXPIRING_SUBSCRIPTIONS]\n );\n localStorage.setItem(\n STORAGE.SUBSCRIPTIONS_NUM_EXPIRED,\n decodedToken[TOKEN_CLAIM_TYPES.NUM_EXPIRED_SUBSCRIPTIONS]\n );\n localStorage.setItem(\n STORAGE.SUBSCRIPTION_AGREEMENT_VERSION,\n decodedToken[\n TOKEN_CLAIM_TYPES.ACCEPTED_SUBSCRIPTION_AGREEMENT_VERSION\n ] ?? ''\n );\n};\n\n// Save current user data ////////////////////////////////////////\nexport const saveLoginData = (authorizedLogin: AuthorizedLogin) => {\n localStorage.setItem(STORAGE.USER_NAME, authorizedLogin.user.username);\n localStorage.setItem(STORAGE.USER_ROLE_ID, authorizedLogin.user.roleId);\n localStorage.setItem(STORAGE.USER_GROUP_ID, authorizedLogin.user.groupId);\n localStorage.setItem(\n STORAGE.USER_REGION_ID,\n authorizedLogin.user.regionId ? authorizedLogin.user.regionId : ''\n );\n localStorage.setItem(\n STORAGE.USER_FACILITY_ID,\n authorizedLogin.user.facilityId ? authorizedLogin.user.facilityId : ''\n );\n localStorage.setItem(\n STORAGE.USER_REPORT_URL,\n authorizedLogin.user.reportURL\n );\n saveTokenData(authorizedLogin.token);\n};\n\n// Get current user data ////////////////////////////////////////\nexport const getUserName = (): string => {\n let user = localStorage.getItem(STORAGE.USER_NAME) || '';\n return user;\n};\n\nexport const getUserRoles = (): Role[] => {\n const rolesString: string | null = localStorage.getItem(STORAGE.USER_ROLES);\n\n if (rolesString) {\n let rolesStringArray: string[] = rolesString.split(', ');\n // Note: conversion from string to enum (below) only works when string and enum\n // name are the same and of the same capitalization\n let roles: Role[] = rolesStringArray.map(role => Role[role]);\n\n return roles;\n } else {\n return [];\n }\n};\n\nexport const getUserRoleId = (): string => {\n let roleId = localStorage.getItem(STORAGE.USER_ROLE_ID) || '';\n return roleId;\n};\n\nexport const getUserGroupId = (): string => {\n let groupId = localStorage.getItem(STORAGE.USER_GROUP_ID) || '';\n return groupId;\n};\n\nexport const getUserRegionId = (): string => {\n let regionId = localStorage.getItem(STORAGE.USER_REGION_ID) || '';\n return regionId;\n};\n\nexport const getUserFacilityId = (): string => {\n let facilityId = localStorage.getItem(STORAGE.USER_FACILITY_ID) || '';\n return facilityId;\n};\n\nexport const getUserReportUrl = (): string => {\n let reportUrl = localStorage.getItem(STORAGE.USER_REPORT_URL) || '';\n return reportUrl;\n};\n\nexport const getUserSubscriptionAgreementVersion = () => {\n // If the user has agreed to the current subscription agreement version,\n // this returns that version. Otherwise, it returns empty string\n return localStorage.getItem(STORAGE.SUBSCRIPTION_AGREEMENT_VERSION) || '';\n};\n\nexport const userIsWebAdmin = (): boolean => {\n return linq.from(getUserRoles()).contains(Role.WebAdmin);\n};\n\nexport const userIsAdmin = (): boolean => {\n return linq.from(getUserRoles()).contains(Role.Admin);\n};\n\nexport const userIsRegional = (): boolean => {\n return linq.from(getUserRoles()).contains(Role.Regional);\n};\n\nexport const userIsLocal = (): boolean => {\n return linq.from(getUserRoles()).contains(Role.Local);\n};\n\nexport const hasAdminRole = (): boolean => {\n let roles = localStorage.getItem(STORAGE.USER_ROLES) || '';\n if (roles.indexOf('admin') !== -1) {\n return true;\n } else {\n return false;\n }\n};\n\nexport const isLoggedIn = () => {\n return getUserName() ? true : false;\n};\n\nexport const getToken = () => {\n return localStorage.getItem(STORAGE.JWT_TOKEN);\n};\n\nexport const getNumExpiringSubscriptions = (): number => {\n const numExpiringString =\n localStorage.getItem(STORAGE.SUBSCRIPTIONS_NUM_EXPIRING) || '';\n const numExpiring = parseInt(numExpiringString, 10);\n\n return numExpiring;\n};\n\nexport const getNumExpiredSubscriptions = (): number => {\n const numExpiredString =\n localStorage.getItem(STORAGE.SUBSCRIPTIONS_NUM_EXPIRED) || '';\n const numExpired = parseInt(numExpiredString, 10);\n\n return numExpired;\n};\n\n// Additional account functions ////////////////////////////////////////\nexport const logOut = () => {\n localStorage.clear();\n};\n\n// TODO: change to use httpRequestAsync\nexport const resetPasswordAsync = async (\n email: string\n): Promise> => {\n const httpResponse: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${AUTH_URL}/forgottenPassword?email=${email}`,\n 'post'\n );\n\n return httpResponse;\n};\n\nexport const confirmAccountAsync = async (\n dto: ConfirmAccount\n): Promise> => {\n let httpResponse: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${AUTH_URL}/confirm`,\n 'post',\n dto\n );\n\n if (httpResponse.success && httpResponse.data) {\n saveLoginData(httpResponse.data);\n }\n\n return httpResponse;\n};\n","export const BASE_URL: string =\n process.env.REACT_APP_IS_PROXY === 'true'\n ? 'https://localhost:5001/api'\n : '/api';\nexport const AUTH_URL: string = 'auth';\nexport const USER_URL: string = 'user';\nexport const ROLE_URL: string = 'role';\nexport const GROUP_URL: string = 'group';\nexport const REGION_URL: string = 'region';\nexport const FACILITY_URL: string = 'facility';\nexport const ASSET_URL: string = 'asset';\nexport const OPERATOR_URL: string = 'operator';\nexport const NOTIFICATION_URL: string = 'notification';\nexport const SOFT_DELETE_URL: string = 'softdelete';\nexport const FILTER_URL: string = 'filter';\nexport const SUBSCRIPTION_URL: string = 'subscription';\nexport const SUBSCRIPTION_AGREEMENT_URL: string = 'subscriptionagreement';\nexport const STATISTIC_URL: string = 'statistic';\n","import * as React from 'react';\nimport '../styles/NavButton.css';\nimport { NavLink, match } from 'react-router-dom';\nimport { Location } from 'history';\n\nexport enum NavButtonSize {\n small,\n large,\n pill\n}\n\nexport interface Props {\n text: string;\n icon?: any;\n iconSelected?: any;\n path: string;\n alternatePaths?: string[];\n size?: NavButtonSize;\n className?: string;\n showSelected?: boolean;\n}\n\nfunction NavButton({\n text,\n icon,\n iconSelected,\n path,\n size = NavButtonSize.small,\n alternatePaths,\n className,\n showSelected = true\n}: Props) {\n const checkAlternatePath = (\n pathMatch: match<{}>,\n location: Location\n ): boolean => {\n if (\n pathMatch ||\n (alternatePaths !== undefined &&\n alternatePaths.some(p => p === location.pathname))\n ) {\n return true;\n }\n return false;\n };\n\n let sizeClassName = 'small';\n\n switch (size) {\n case NavButtonSize.large:\n sizeClassName = 'large';\n break;\n case NavButtonSize.pill:\n sizeClassName = 'pill';\n break;\n case NavButtonSize.small:\n default:\n sizeClassName = 'small';\n }\n\n return (\n \n \n {icon && (\n \n )}\n {iconSelected && (\n \n )}\n {text}\n \n {showSelected &&
 
}\n \n );\n}\n\nexport default NavButton;\n","export class PromiseHelper {\n private p: Promise | undefined;\n\n public newPromise(\n promise: Promise,\n t: (result: any) => any,\n c?: (error: any) => any\n ) {\n this.p = promise;\n this.p\n .then(x => {\n if (this.p) {\n this.p = undefined;\n t(x);\n }\n })\n .catch(x => {\n console.log(\n `PromiseHelper caught error ${x.message}, ${x.detail}`\n );\n if (this.p) {\n this.p = undefined;\n if (c) {\n c(x);\n } else {\n alert('Unhandled error occurred in promiseHelper');\n }\n }\n });\n }\n\n public clearPromise() {\n this.p = undefined;\n }\n}\n","import { AUTH_URL, BASE_URL } from './urls';\nimport { Login } from '../dtos/login';\nimport { httpRequestAsync } from './api-shared';\nimport { saveLoginData } from './api-account';\nimport { AuthorizedLogin } from '../dtos/authorizedLogin';\n\nexport const loginAsync = async (login: Login): Promise => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${AUTH_URL}/login`,\n 'post',\n login\n );\n\n if (httpResponse.success && httpResponse.data) {\n let authorizedLogin = httpResponse.data as AuthorizedLogin;\n saveLoginData(authorizedLogin);\n return authorizedLogin;\n } else {\n console.log(`Error Logging In: ${httpResponse.error!.message}`);\n throw httpResponse.error;\n }\n};\n","import * as React from 'react';\nimport { Redirect, RouteComponentProps, StaticContext } from 'react-router';\nimport '../styles/Login.css';\nimport headerLogo from '../images/header-logo-white.png';\nimport TextInput from '../components/textInput';\nimport {\n resetPasswordAsync,\n getUserSubscriptionAgreementVersion\n} from '../api/api-account';\nimport { PromiseHelper } from '../classes/promiseHelper';\nimport { Token } from '../dtos/token';\nimport { Login } from '../dtos/login';\nimport { loginAsync } from '../api/api-auth';\nimport { createBrowserHistory } from 'history';\n\ninterface State {\n username: string;\n password: string;\n isLoggedIn: boolean;\n options: string[];\n disableInputs: boolean;\n errorMessage: string | null;\n}\nexport interface LoginPageRouteState {\n redirectMessage?: string;\n}\n\nexport interface Props\n extends RouteComponentProps<\n {},\n StaticContext,\n LoginPageRouteState | undefined\n > {}\n\nexport default class LoginPage extends React.Component {\n uNameRef: any;\n tokenPromise: PromiseHelper = new PromiseHelper();\n\n constructor(props: Props) {\n super(props);\n this.state = {\n username: '',\n password: '',\n isLoggedIn: false,\n options: [],\n disableInputs: false,\n errorMessage: null\n };\n\n this.uNameRef = React.createRef();\n // this clears the state passed to this page\n // so if a user reloads the page, any state that was passed in will be gone\n var history = createBrowserHistory();\n history.replace('/login');\n }\n\n componentWillUnmount() {\n this.tokenPromise.clearPromise();\n }\n\n componentDidMount() {\n this.focusUserName();\n }\n\n focusUserName = () => {\n this.uNameRef.current.focus();\n };\n\n handleKeyPress = (e: any) => {\n if (e.key === 'Enter') {\n this.handleLogin();\n }\n };\n\n handleInputChange = (e: React.ChangeEvent) => {\n let targetName = e.target.name;\n let val: string = e.target.value;\n\n this.setState(prevState => ({\n ...prevState,\n [targetName]: val\n }));\n };\n\n handleLogin = () => {\n this.setState({ disableInputs: true, errorMessage: null });\n\n let username = this.state.username;\n let password = this.state.password;\n\n let userLogin: Login = { username, password };\n this.tokenPromise.newPromise(\n loginAsync(userLogin),\n t => {\n this.setState({\n isLoggedIn: true,\n disableInputs: false\n });\n },\n error => {\n this.setState({\n disableInputs: false,\n errorMessage: error!.message || 'Login failed'\n });\n this.focusUserName();\n }\n );\n };\n\n handleForgotPassword = async () => {\n this.setState({ disableInputs: true });\n const apiResult = await resetPasswordAsync(this.state.username);\n this.setState({ disableInputs: false });\n\n if (apiResult.success) {\n alert(`Password reset link sent to ${this.state.username}`);\n } else {\n let errorResult = apiResult.error;\n alert(\n `Failed to send password reset link: ${errorResult?.message}`\n );\n }\n };\n\n renderLoginButtons = () => {\n return (\n
\n \n Login\n \n\n \n Forgot Password\n \n
\n );\n };\n\n render() {\n if (this.state.isLoggedIn) {\n if (getUserSubscriptionAgreementVersion()) {\n return ;\n } else {\n return ;\n }\n } else {\n const subscriptionError =\n this.state.errorMessage === 'User has no active subscriptions';\n\n return (\n
\n
\n
\n
\n \n
\n\n \n \n \n {this.state.errorMessage &&\n (subscriptionError ? (\n
\n
\n
\n \n No active subscriptions are\n associated with this user\n account.
\n Please contact{' '}\n \n BHS Support\n {' '}\n or visit the{' '}\n \n Contact Us\n {' '}\n page.\n
\n
\n
\n
\n ) : (\n
\n \n
\n ))}\n {this.renderLoginButtons()}\n {this.props.location.state?.redirectMessage && (\n
\n {this.props.location.state?.redirectMessage}\n
\n )}\n
\n
\n
\n );\n }\n }\n}\n","import * as React from 'react';\nimport { Redirect } from 'react-router';\nimport { isLoggedIn } from '../api/api-account';\n\ninterface State {}\n\nexport interface Props {}\n\nclass PrivateRoutes extends React.Component {\n render() {\n if (isLoggedIn()) {\n return this.props.children;\n } else {\n return ;\n }\n }\n}\n\nexport default PrivateRoutes;\n","export const columnHeaderStyle = {\n textAlign: 'left',\n fontWeight: 'bold',\n font: '18px',\n borderRadius: '2px'\n};\n\nexport const columnSubHeaderStyle = {\n textAlign: 'left',\n fontWeight: 'normal'\n};\n\nexport const dataStyle = {\n textAlign: 'left',\n padding: '3px'\n};\n","import * as React from 'react';\nimport '../styles/Modal.css';\nimport ReactModal from 'react-modal';\n\ninterface BaseModalProps {\n isModalOpen: boolean;\n closeModal: () => void;\n children?: any;\n}\n\nexport const BaseModal = ({\n isModalOpen,\n closeModal,\n children\n}: BaseModalProps) => (\n
\n \n {children}\n \n
\n);\n","import * as React from 'react';\nimport '../styles/Modal.css';\nimport * as accountApi from '../api/api-account';\nimport { BaseModal } from './modal-base';\n\ninterface State {}\n\nexport interface Props {\n isModalOpen: boolean;\n closeModal: () => void;\n logout: () => void;\n}\n\nexport class ConfirmLogoutModal extends React.Component {\n render() {\n return (\n \n
\n \n
\n
\n \n Yes\n \n
\n
\n \n Cancel\n \n
\n
\n
\n \n );\n }\n private handleLogout = () => {\n accountApi.logOut();\n this.props.logout();\n this.props.closeModal();\n };\n\n private handleCancel = () => {\n this.props.closeModal();\n };\n}\n","export enum StatisticIndicatorLevel {\n None,\n Ok,\n Warning,\n Critical,\n Na\n}\n","import * as React from 'react';\nimport { ConfirmLogoutModal } from '../modals/modal-confirmLogout';\nimport { Redirect } from 'react-router';\nimport '../styles/Headers.css';\nimport NavButton, { NavButtonSize } from './NavButton';\nimport { getUserName } from '../api/api-account';\nconst headerLogo = require('../images/header-logo-white.png');\n\nexport interface Props {}\n\ninterface State {\n logoutModalIsOpen: boolean;\n logout: Boolean;\n}\n\nexport class Header extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n logoutModalIsOpen: false,\n logout: false\n };\n }\n\n render() {\n if (this.state.logout) {\n return (\n \n );\n } else {\n return (\n
\n \n
\n \n \n \n \n
\n
\n
\n Logged in as:
\n {getUserName()}
\n
\n \n Logout\n \n \n
\n
\n );\n }\n }\n\n private logout = () => {\n this.setState({\n logout: true\n });\n };\n\n private closeConfirmLogoutModal = () => {\n this.setState({\n logoutModalIsOpen: false\n });\n };\n\n private handleConfirmLogout = () => {\n this.setState({\n logoutModalIsOpen: true\n });\n };\n}\n","import { httpRequestAsync } from './api-shared';\nimport { BASE_URL, USER_URL } from './urls';\nimport { User } from '../dtos/user';\n\nexport const getUsersAsync = async () => {\n let httpResponse = await httpRequestAsync(`${BASE_URL}/${USER_URL}`, 'get');\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as User[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const addUserAsync = async (user: User) => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${USER_URL}`,\n 'post',\n user\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as User[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const editUserAsync = async (user: User) => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${USER_URL}`,\n 'put',\n user\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as User[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\nexport const deleteUserAsync = async (userId: string): Promise => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${USER_URL}/${userId}`,\n 'delete'\n );\n\n if (!httpResponse.success) {\n console.log(\n 'Error Deleting User ' +\n userId +\n ', cause: ' +\n httpResponse.error!.message\n );\n }\n\n return httpResponse.success;\n};\n","import * as React from 'react';\nimport '../styles/Modal.css';\nimport { BaseModal } from './modal-base';\n\ninterface State {}\n\nexport interface Props {\n isModalOpen: boolean;\n itemType: string;\n itemName: string;\n itemId: string;\n deleteItem: (id: string) => void;\n closeModal: () => void;\n}\n\nexport class GenericDeleteModal extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {};\n\n this.confirmButtonPressed = this.confirmButtonPressed.bind(this);\n }\n\n render() {\n return (\n \n
\n \n
\n
\n {`Are you sure you want to delete ${this.props.itemType.toLowerCase()}${\n this.props.itemName ? ' ' + this.props.itemName : ''\n }?`}\n
\n
\n
\n \n Confirm\n \n
\n
\n \n Cancel\n \n
\n
\n
\n \n );\n }\n\n private confirmButtonPressed() {\n this.props.deleteItem(this.props.itemId);\n this.props.closeModal();\n }\n}\n","import Globals from '../globals';\n\nexport interface User {\n id: string;\n username: string;\n firstName: string;\n lastName: string;\n email: string;\n phoneNumber: string;\n roleId: string;\n roleName: string;\n groupId: string;\n groupName: string;\n regionId: string | null;\n regionName: string;\n facilityId: string | null;\n facilityName: string;\n reportURL: string;\n primaryContact: boolean;\n lastLoginTime: Date | null;\n}\n\nexport const defaultUser: User = {\n id: Globals.GUID_PLACEHOLDER,\n username: '',\n firstName: '',\n lastName: '',\n email: '',\n phoneNumber: '',\n roleId: '',\n roleName: '',\n groupId: '',\n groupName: '',\n regionId: null,\n regionName: '',\n facilityId: null,\n facilityName: '',\n reportURL: '',\n primaryContact: false,\n lastLoginTime: null\n};\n","import { httpRequestAsync } from './api-shared';\nimport { BASE_URL, ROLE_URL } from './urls';\nimport { Role } from '../dtos/role';\n\nexport const getRolesAsync = async () => {\n let httpResponse = await httpRequestAsync(`${BASE_URL}/${ROLE_URL}`, 'get');\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Role[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n","import { httpRequestAsync } from './api-shared';\nimport { BASE_URL, GROUP_URL } from './urls';\nimport { Group } from '../dtos/group';\n\nexport const getGroupsAsync = async () => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${GROUP_URL}`,\n 'get'\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Group[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const addGroupAsync = async (group: Group) => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${GROUP_URL}`,\n 'post',\n group\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Group[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const editGroupAsync = async (group: Group) => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${GROUP_URL}`,\n 'put',\n group\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Group[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const deleteGroupAsync = async (groupId: string): Promise => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${GROUP_URL}/${groupId}`,\n 'delete'\n );\n\n if (!httpResponse.success) {\n console.log(\n 'Error Deleting User ' +\n groupId +\n ', cause: ' +\n httpResponse.error!.message\n );\n }\n\n return httpResponse.success;\n};\n","import { httpRequestAsync } from './api-shared';\nimport { BASE_URL, REGION_URL } from './urls';\nimport { Region } from '../dtos/region';\n\nexport const getRegionsAsync = async () => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${REGION_URL}`,\n 'get'\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Region[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const addRegionAsync = async (region: Region) => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${REGION_URL}`,\n 'post',\n region\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Region[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const editRegionAsync = async (region: Region) => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${REGION_URL}`,\n 'put',\n region\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Region[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const deleteRegionAsync = async (regionId: string): Promise => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${REGION_URL}/${regionId}`,\n 'delete'\n );\n\n if (!httpResponse.success) {\n console.log(\n 'Error Deleting Region ' +\n regionId +\n ', cause: ' +\n httpResponse.error!.message\n );\n }\n\n return httpResponse.success;\n};\n","import { httpRequestAsync } from './api-shared';\nimport { BASE_URL, FACILITY_URL } from './urls';\nimport { Facility } from '../dtos/facility';\n\nexport const getFacilitiesAsync = async () => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${FACILITY_URL}`,\n 'get'\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Facility[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const addFacilityAsync = async (facility: Facility) => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${FACILITY_URL}`,\n 'post',\n facility\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Facility[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const editFacilityAsync = async (facility: Facility) => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${FACILITY_URL}`,\n 'put',\n facility\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Facility[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const deleteFacilityAsync = async (\n facilityId: string\n): Promise => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${FACILITY_URL}/${facilityId}`,\n 'delete'\n );\n\n if (!httpResponse.success) {\n console.log(\n 'Error Deleting Facility ' +\n facilityId +\n ', cause: ' +\n httpResponse.error!.message\n );\n }\n\n return httpResponse.success;\n};\n","import * as React from 'react';\n\nexport interface LabeledInputProps {\n label: string;\n children?: React.ReactNode;\n}\n\nexport const LabeledInput = ({ label, children }: LabeledInputProps) => (\n
\n
{label}
\n
{children}
\n
\n);\n","import * as linq from 'linq';\nimport * as React from 'react';\nimport '../styles/Modal.css';\nimport { Role } from '../dtos/role';\nimport { Group } from '../dtos/group';\nimport { Region } from '../dtos/region';\nimport { Facility } from '../dtos/facility';\nimport { User, defaultUser } from '../dtos/user';\nimport * as roleApi from '../api/api-role';\nimport * as groupApi from '../api/api-group';\nimport * as regionApi from '../api/api-region';\nimport * as facilityApi from '../api/api-facility';\nimport { Role as RoleEnum } from '../enums/role';\nimport {\n userIsAdmin,\n getUserGroupId,\n userIsRegional,\n userIsLocal,\n getUserRegionId,\n getUserFacilityId,\n getUserRoleId\n} from '../api/api-account';\nimport { BaseModal } from './modal-base';\nimport { LabeledInput } from '../components/labeledInput';\n\ninterface State {\n user: User;\n roles: Role[];\n groups: Group[];\n regions: Region[];\n facilities: Facility[];\n}\n\nexport interface Props {\n user: User | null;\n isModalOpen: boolean;\n closeModal: () => void;\n addUser: (user: User, addNew: boolean) => void;\n}\n\nexport class AddEditUserModal extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n user: { ...defaultUser },\n roles: [],\n groups: [],\n regions: [],\n facilities: []\n };\n }\n\n componentDidMount() {\n this.getRolesAsync();\n this.getGroupsAsync();\n this.getRegionsAsync();\n this.getFacilitiesAsync();\n }\n\n componentWillReceiveProps(nextProps: Props) {\n if (!this.props.isModalOpen && nextProps.isModalOpen) {\n let user: User;\n\n if (nextProps.user) {\n user = { ...nextProps.user };\n } else {\n user = { ...defaultUser };\n\n if (userIsAdmin() || userIsRegional() || userIsLocal()) {\n user.groupId = getUserGroupId();\n }\n\n if (userIsRegional() || userIsLocal()) {\n user.regionId = getUserRegionId();\n }\n\n if (userIsLocal()) {\n user.facilityId = getUserFacilityId();\n user.roleId = getUserRoleId();\n\n let userRole = linq\n .from(this.state.roles)\n .firstOrDefault(r => r.id === user.roleId);\n user.roleName = userRole ? userRole.name : '';\n }\n }\n\n this.setState({\n user: user\n });\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 \n \n \n {this.state.roles.map(r => (\n \n ))}\n \n \n \n \n \n {this.state.groups.map(g => (\n \n ))}\n \n \n \n \n \n {this.state.regions\n .filter(\n r => r.groupId === this.state.user.groupId\n )\n .map(r => (\n \n ))}\n \n \n \n \n \n {this.state.facilities\n .filter(\n f => f.regionId === this.state.user.regionId\n )\n .map(f => (\n \n ))}\n \n \n \n \n \n
\n
\n \n Confirm\n \n
\n
\n \n Cancel\n \n
\n
\n
\n \n );\n }\n\n private async getRolesAsync() {\n let result = await roleApi.getRolesAsync();\n\n if (result) {\n this.setState({\n roles: result\n });\n } else {\n console.log('Error caught in modal-AddUser.getRolesAsync().');\n alert('Error getting Roles.');\n }\n }\n\n private async getGroupsAsync() {\n let result = await groupApi.getGroupsAsync();\n\n if (result) {\n this.setState({\n groups: result\n });\n } else {\n console.log('Error caught in modal-AddUser.getGroupsAsync().');\n alert('Error getting Groups.');\n }\n }\n\n private async getRegionsAsync() {\n let result = await regionApi.getRegionsAsync();\n\n if (result !== null && result !== undefined) {\n this.setState({\n regions: result\n });\n } else {\n console.log('Error caught in modal-AddUser.getRegionsAsync().');\n alert('Error getting Regions.');\n }\n }\n\n private async getFacilitiesAsync() {\n let result = await facilityApi.getFacilitiesAsync();\n\n if (result) {\n this.setState({\n facilities: result\n });\n } else {\n console.log('Error caught in modal-AddUser.getFacilitiesAsync().');\n alert('Error getting Facilities.');\n }\n }\n\n private inputChange = (\n e:\n | React.SyntheticEvent\n | React.SyntheticEvent\n ) => {\n let user = { ...this.state.user };\n\n user[e.currentTarget.name] = e.currentTarget.value;\n\n return user;\n };\n\n private onInputChange = (\n e:\n | React.SyntheticEvent\n | React.SyntheticEvent\n ) => {\n let user = this.inputChange(e);\n\n this.setState({\n user: user\n });\n };\n\n private onRoleChange = (e: React.SyntheticEvent) => {\n let user = this.inputChange(e);\n\n let role = linq\n .from(this.state.roles)\n .firstOrDefault(r => r.id === user.roleId);\n\n user.roleName = role ? role.name : '';\n\n this.setState({\n user: user\n });\n };\n\n private onGroupChange = (e: React.SyntheticEvent) => {\n let user = this.inputChange(e);\n\n user.regionId = null;\n user.facilityId = null;\n\n this.setState({\n user: user\n });\n };\n\n private onRegionChange = (e: React.SyntheticEvent) => {\n let user = this.inputChange(e);\n\n user.facilityId = null;\n\n this.setState({\n user: user\n });\n };\n\n private onPrimaryContactChange = (\n e: React.SyntheticEvent\n ) => {\n this.setState({\n user: {\n ...this.state.user,\n primaryContact: e.currentTarget.checked\n }\n });\n };\n\n private handleConfirm = () => {\n this.props.addUser(this.state.user, this.props.user === null);\n\n this.props.closeModal();\n };\n\n private handleCancel = () => {\n this.props.closeModal();\n };\n\n private userIsValid = () => {\n let firstIsValid = this.state.user.firstName.length > 0;\n let lastIsValid = this.state.user.lastName.length > 0;\n /* eslint-disable no-useless-escape */\n\n let phoneRegex = /^[\\+]?[(]?[0-9]{3}[)]?[-\\s\\.]?[0-9]{3}[-\\s\\.]?[0-9]{4,6}$/;\n let phoneIsValid = phoneRegex.test(this.state.user.phoneNumber);\n\n let emailRegex = /^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$/;\n let emailIsValid = emailRegex.test(this.state.user.email);\n /* eslint-enable no-useless-escape */\n\n let roleIsValid = this.state.user.roleId.length > 0;\n\n // Get string names of each role\n let webAdminRole: string = RoleEnum[RoleEnum.WebAdmin];\n let adminRole: string = RoleEnum[RoleEnum.Admin];\n let regionalRole: string = RoleEnum[RoleEnum.Regional];\n let localRole: string = RoleEnum[RoleEnum.Local];\n\n // Check that role-based required fields are all satisfied\n let roleBasedRequirementsAreValid = false;\n if (!roleIsValid) {\n roleBasedRequirementsAreValid = false;\n } else {\n if (this.state.user.roleName === webAdminRole) {\n // TODO: Temporary requirement. Eventually want to make this non-required, but that will require changing\n // requirements on the back end, because currently the api expects a non-null role\n roleBasedRequirementsAreValid =\n this.state.user.groupId.length > 0;\n } else if (this.state.user.roleName === adminRole) {\n roleBasedRequirementsAreValid =\n this.state.user.groupId.length > 0;\n } else if (this.state.user.roleName === regionalRole) {\n roleBasedRequirementsAreValid =\n this.state.user.groupId.length > 0 &&\n this.state.user.regionId !== null;\n } else if (this.state.user.roleName === localRole) {\n roleBasedRequirementsAreValid =\n this.state.user.groupId.length > 0 &&\n this.state.user.regionId !== null &&\n this.state.user.facilityId !== null;\n }\n }\n\n return (\n firstIsValid &&\n lastIsValid &&\n phoneIsValid &&\n emailIsValid &&\n roleIsValid &&\n roleBasedRequirementsAreValid\n );\n };\n}\n","import { Moment } from 'moment';\nimport { StatisticIndicatorLevel } from '../enums/statisticIndicatorLevel';\n\nexport function stringArrayToString(\n stringArray: string[],\n separator: string\n): string {\n if (stringArray.length === 0) {\n return 'None';\n } else if (stringArray.length === 1) {\n return stringArray[0];\n } else {\n let returnString = stringArray[0];\n\n for (let i = 1; i < stringArray.length; i++) {\n returnString += separator + stringArray[i];\n }\n\n return returnString;\n }\n}\n\nexport function formatDateTime(date: Date, excludeTime?: boolean): string {\n const dateTimeString =\n new Date(date).toLocaleDateString() +\n (excludeTime ? '' : ' ' + new Date(date).toLocaleTimeString());\n\n return dateTimeString;\n}\n\nexport function stringIsNullOrEmpty(value: string): boolean {\n return value === null || value === undefined || value === '';\n}\n\nexport function setMomentToMidnight(moment: Moment): Moment {\n return moment.set({ hour: 0, minute: 0, second: 0, millisecond: 0 });\n}\n\nexport const indicatorColor = (\n indicatorLevel: StatisticIndicatorLevel | null | undefined\n): string | undefined => {\n switch (indicatorLevel) {\n case StatisticIndicatorLevel.Ok:\n return '#22c618';\n case StatisticIndicatorLevel.Warning:\n return '#fee12b';\n case StatisticIndicatorLevel.Critical:\n return '#f02a00';\n default:\n return '#808080';\n }\n};\n","export enum AlertLevel {\n None = 0,\n Info = 1,\n Warn = 2,\n Error = 3\n}\n","import * as React from 'react';\nimport 'react-table/react-table.css';\nimport * as TableStyles from '../styles/TableFormats';\nimport { Header } from '../components/header';\nimport ReactTable from 'react-table';\nimport matchSorter from 'match-sorter';\nimport * as notificationApi from '../api/api-notifications';\nimport * as assetApi from '../api/api-asset';\nimport { Notification, FullNotification } from '../dtos/notification';\nimport { Asset } from '../dtos/asset';\nimport { Operator } from '../dtos/operator';\nimport { Facility } from '../dtos/facility';\nimport { getOperatorsAsync } from '../api/api-operator';\nimport { getFacilitiesAsync } from '../api/api-facility';\nimport * as linq from 'linq';\nimport { formatDateTime } from '../functions/general';\nimport TimePicker from '../components/timePicker';\nimport moment from 'moment';\nimport DatePicker from '../components/datePicker';\nimport { ApiResult } from '../api/api-shared';\nimport { default as Select } from 'react-select';\nimport SubscriptionBanner from '../components/subscriptionBanner';\nimport { Query } from '../dtos/query';\nimport { NotificationsCount } from '../dtos/notificationsCount';\n\ninterface State {\n notifications: Notification[];\n assets: Asset[];\n operators: Operator[];\n facilities: Facility[];\n startTime: moment.Moment | undefined;\n endTime: moment.Moment | undefined;\n startDate: moment.Moment | undefined;\n endDate: moment.Moment | undefined;\n type: string | null;\n active: boolean | null;\n groupId: string | null;\n regionId: string | null;\n facilityId: string | null;\n assetId: string | null;\n pageNumber: number;\n pageSize: number;\n filteredNotificationsCount: number;\n bhsSerialNumber: string | null;\n operatorName: string | null;\n payload: string | null;\n timestamp: string | null;\n lastModified: string | null;\n sortFields: { id: string; desc: boolean }[];\n}\n\nexport interface Props {}\n\nexport enum NotificationType {\n PlcVersion = 1000,\n LoginRequest,\n LogoutRequest,\n FilterPressureInfo,\n AlarmOverride = 2000,\n ChecklistBypass,\n ChecklistComplete,\n AlarmClear = 2500,\n Estop = 3000,\n Shock,\n TiltX,\n TiltY,\n OilPressure,\n OilTemperature,\n BatteryLow,\n FootPedal,\n MessageAck,\n ChangeOilFilterNow,\n OilLevel,\n ChangeOilFilterSoon = 4000,\n ProximitySwitch,\n Checklist = 11000,\n ChecklistWarning = 11001,\n LoginAuth = 11003,\n LoginDeny,\n SubscriptionActive,\n SubscriptionWarning,\n SubscriptionEnded\n}\n\nconst defaultPageSize = 20;\n\nexport class NotificationsPage extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n notifications: [],\n assets: [],\n operators: [],\n facilities: [],\n startTime: moment().add(-5, 'days'), // Default filtering window on page load is past 5 days\n endTime: moment(),\n startDate: moment().add(-5, 'days'), // Default filtering window on page load is past 5 days\n endDate: moment(),\n type: null,\n active: null,\n groupId: null,\n regionId: null,\n facilityId: null,\n assetId: null,\n pageNumber: 0,\n pageSize: defaultPageSize,\n filteredNotificationsCount: 0,\n bhsSerialNumber: null,\n operatorName: null,\n payload: null,\n timestamp: null,\n lastModified: null,\n sortFields: []\n };\n }\n\n componentDidMount() {\n this.getAssetsAsync();\n this.getOperatorsAsync();\n this.getFacilitiesAsync();\n this.getNotificationsAsync(this.getQuery());\n this.getFilteredNotificationsCountAsync(this.getQuery());\n }\n\n render() {\n let fullNotifications = this.getFullNotifications();\n const assetOptions = linq\n .from(this.state.assets)\n .orderBy(a => a.name)\n .distinct(a => a.name)\n .select(a => {\n return { value: a.id, label: a.name };\n })\n .toArray();\n\n const facilityOptions = linq\n .from(this.state.facilities)\n .orderBy(f => f.name)\n .distinct(f => f.name)\n .select(f => {\n return { value: f.id, label: f.name };\n })\n .toArray();\n\n const notificationTypeOptions = Object.keys(NotificationType)\n .filter(key => !isNaN(Number(key)))\n .map(key => {\n let notificationTypeValue = Number(key);\n\n let notificationTypeLabel = NotificationType[key];\n\n return {\n value: notificationTypeValue,\n label: notificationTypeLabel\n };\n });\n\n const operatorOptions = linq\n .from(this.state.operators)\n .orderBy(op => op.name)\n .distinct(op => op.name)\n .select(op => {\n return { value: op.id, label: op.name };\n })\n .toArray();\n\n const activeOptions = [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' }\n ];\n\n return (\n <>\n
\n
\n
Notifications
\n
\n\n \n\n
\n \n
\n \n \n
\n
\n \n \n
\n \n
\n \n \n
\n
\n \n \n
\n {\n this.getNotificationsAsync(this.getQuery());\n this.getFilteredNotificationsCountAsync(\n this.getQuery()\n );\n }}\n type=\"button\"\n >\n Get Notifications\n \n
\n\n
\n \n this.state.pageSize\n ? Math.ceil(\n this.state.filteredNotificationsCount /\n this.state.pageSize\n )\n : 1\n }\n onPageChange={pageNumber => {\n this.setState(\n {\n pageNumber: pageNumber\n },\n () =>\n this.getNotificationsAsync(this.getQuery())\n );\n }}\n onPageSizeChange={(pageSize, pageNumber) => {\n this.setState(\n {\n pageSize: pageSize,\n pageNumber: pageNumber\n },\n () =>\n this.getNotificationsAsync(this.getQuery())\n );\n }}\n onSortedChange={(newSorted, column, shiftKey) => {\n this.setState(\n { sortFields: newSorted, pageNumber: 0 },\n () => {\n let query = this.getQuery();\n this.getNotificationsAsync(query);\n this.getFilteredNotificationsCountAsync(\n query\n );\n }\n );\n }}\n onFilteredChange={(column, value) => {\n let newAssetId = null;\n let newFacilityId = null;\n let newType = null;\n let newActive = null;\n let newBhsSerialNumber = null;\n let newOperatorName = null;\n let newPayload = null;\n let newTimestamp = null;\n let newLastModified = null;\n\n column.forEach(col => {\n if (col.id === 'Model') {\n newAssetId = col.value;\n } else if (col.id === 'facility') {\n newFacilityId = col.value;\n } else if (\n col.id === 'type' &&\n col.value !== -1\n ) {\n newType = col.value;\n } else if (col.id === 'active') {\n newActive = col.value;\n } else if (col.id === 'bhsSerialNumber') {\n newBhsSerialNumber = col.value;\n } else if (col.id === 'operator') {\n newOperatorName = operatorOptions.find(op => op.value === col.value)?.label;\n } else if (col.id === 'value') {\n newPayload = col.value;\n } else if (col.id === 'timestamp') {\n newTimestamp = col.value;\n } else if (col.id === 'lastModified') {\n newLastModified = col.value;\n }\n });\n this.setState(\n {\n assetId: newAssetId,\n facilityId: newFacilityId,\n active: newActive,\n type: newType,\n bhsSerialNumber: newBhsSerialNumber,\n operatorName: newOperatorName,\n payload: newPayload,\n timestamp: newTimestamp,\n lastModified: newLastModified,\n pageNumber: 0\n },\n () => {\n let query = this.getQuery();\n this.getNotificationsAsync(query);\n this.getFilteredNotificationsCountAsync(\n query\n );\n }\n );\n }}\n showPagination={\n this.state.filteredNotificationsCount >\n this.state.pageSize\n }\n filterable={true}\n defaultFilterMethod={(filter, row) =>\n matchSorter([row[filter.id]], filter.value)\n .length !== 0\n }\n minRows={10}\n columns={[\n {\n Header: 'Model',\n id: 'Model',\n accessor: n => n.assetName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200,\n filterMethod: (\n filter: { id: React.ReactText; value: any },\n row: { [x: string]: any }\n ) => {\n let assetOption = linq\n .from(assetOptions)\n .firstOrDefault(\n a => a.value === filter.value\n );\n\n return (\n row[filter.id] ===\n (assetOption ? assetOption.label : '')\n );\n },\n Filter: ({ filter, onChange }) => {\n return (\n \n op.value ===\n filter.value\n )\n : undefined\n }\n isMulti={false}\n styles={this.filterSelectorStyle(\n 210\n )}\n onChange={(e: any) =>\n onChange(e ? e.value : '')\n }\n placeholder={'Select a model'}\n isClearable={true}\n />\n );\n }\n },\n {\n Header: 'BHS Serial Number',\n id: 'bhsSerialNumber',\n accessor: n => n.bhsSerialNumber,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Facility',\n id: 'facility',\n accessor: n => n.facilityName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200,\n filterMethod: (\n filter: { id: React.ReactText; value: any },\n row: { [x: string]: any }\n ) => {\n let facilityOption = linq\n .from(facilityOptions)\n .firstOrDefault(\n f => f.value === filter.value\n );\n\n return (\n row[filter.id] ===\n (facilityOption\n ? facilityOption.label\n : '')\n );\n },\n Filter: ({ filter, onChange }) => (\n \n fa.value ===\n filter.value\n )\n : undefined\n }\n onChange={(e: any) =>\n onChange(e ? e.value : '')\n }\n placeholder={'Select a facility'}\n isClearable={true}\n />\n )\n },\n {\n Header: 'Operator',\n id: 'operator',\n accessor: n => n.operatorName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200,\n filterMethod: (\n filter: { id: React.ReactText; value: any },\n row: { [x: string]: any }\n ) => {\n let operatorOption = linq\n .from(operatorOptions)\n .firstOrDefault(\n op => op.value === filter.value\n );\n\n return (\n row[filter.id] ===\n (operatorOption\n ? operatorOption.label\n : '')\n );\n },\n Filter: ({ filter, onChange }) => (\n \n op.value ===\n filter.value\n )\n : undefined\n }\n onChange={(e: any) =>\n onChange(e ? e.value : '')\n }\n placeholder={'Select an operator'}\n isClearable={true}\n />\n )\n },\n {\n Header: 'Type',\n id: 'type',\n accessor: n => NotificationType[n.type],\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200,\n filterMethod: (\n filter: { id: React.ReactText; value: any },\n row: { [x: string]: any }\n ) => {\n let filterValue =\n NotificationType[filter.value];\n\n return (\n row[filter.id] === filterValue ||\n parseInt(filter.value, 10) === -1\n );\n },\n // Single Select (React-Select)\n Filter: ({ filter, onChange }) => (\n \n nt.value ===\n filter.value\n )\n : undefined\n }\n onChange={(e: any) =>\n onChange(e ? e.value : -1)\n }\n placeholder={'Select a type'}\n isClearable={true}\n />\n )\n },\n {\n Header: 'Value',\n id: 'value',\n accessor: n => n.payload,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 80\n },\n {\n Header: 'Active',\n id: 'active',\n accessor: n => (n.active ? 'Yes' : 'No'),\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100,\n filterMethod: (\n filter: { id: React.ReactText; value: any },\n row: { [x: string]: any }\n ) => {\n return (\n row[filter.id] ===\n (filter.value ? 'Yes' : 'No')\n );\n },\n Filter: ({ filter, onChange }) => (\n \n ac.value ===\n filter.value\n )\n : undefined\n }\n onChange={(e: any) =>\n onChange(e ? e.value : '')\n }\n placeholder={'Select'}\n isClearable={true}\n />\n )\n },\n {\n Header: 'Timestamp',\n id: 'timestamp',\n accessor: n => formatDateTime(n.timestamp),\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Last Modified',\n id: 'lastModified',\n accessor: n => formatDateTime(n.lastModified),\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n }\n ]}\n className=\"-highlight\"\n />\n
\n \n );\n }\n\n private getQuery = () => {\n let startDate =\n this.state.startDate === undefined\n ? null\n : this.state.startDate.toDate();\n let startTime =\n this.state.startTime === undefined\n ? null\n : this.state.startTime.toDate();\n let start =\n startDate && startTime\n ? this.constructDateObject(startDate, startTime)\n : null;\n\n let endDate =\n this.state.endDate === undefined\n ? null\n : this.state.endDate.toDate();\n let endTime =\n this.state.endTime === undefined\n ? null\n : this.state.endTime.toDate();\n let end =\n endDate && endTime\n ? this.constructDateObject(endDate, endTime)\n : null;\n\n let query = {\n start: start,\n end: end,\n type: this.state.type,\n active: this.state.active,\n groupId: this.state.groupId,\n regionId: this.state.regionId,\n facilityId: this.state.facilityId,\n assetId: this.state.assetId,\n bhsSerialNumber: this.state.bhsSerialNumber,\n operatorName: this.state.operatorName,\n payload: this.state.payload,\n timestamp: this.state.timestamp,\n lastModified: this.state.lastModified,\n sortingFields: this.state.sortFields\n };\n\n return query;\n };\n\n private getFilteredNotificationsCountAsync = async (query: Query) => {\n let getResult: ApiResult = await notificationApi.getNotificationsCountAsync(\n query\n );\n\n if (getResult.success) {\n this.setState({\n filteredNotificationsCount: getResult.data!.count\n });\n } else {\n console.log(\n 'Error caught in page-notifications.getFilteredNotificationsCountAsync().'\n );\n alert('Error getting filtered notifications count.');\n }\n };\n\n private constructDateObject = (date: Date, time: Date) => {\n let dateObject = date;\n\n dateObject.setHours(time.getHours());\n dateObject.setMinutes(time.getMinutes());\n dateObject.setSeconds(0);\n dateObject.setMilliseconds(0);\n\n return dateObject;\n };\n\n private getNotificationsAsync = async (query: Query) => {\n let getResult: ApiResult = await notificationApi.getNotificationsAsync(\n query,\n this.state.pageNumber,\n this.state.pageSize\n );\n if (getResult.success) {\n this.setState({\n notifications: getResult.data!\n });\n } else {\n console.log(\n 'Error caught in page-notifications.getNotificationsAsync().'\n );\n alert('Error getting notifications.');\n }\n };\n\n private getAssetsAsync = async () => {\n let getResult = await assetApi.getAssetsAsync();\n if (getResult) {\n this.setState({\n ...this.state,\n assets: getResult\n });\n } else {\n console.log('Error caught in page-notifications.getAssetsAsync().');\n alert('Error getting assets.');\n }\n };\n\n private getOperatorsAsync = async () => {\n let getResult = await getOperatorsAsync();\n\n if (getResult) {\n this.setState({\n ...this.state,\n operators: getResult\n });\n } else {\n console.log(\n 'Error caught in page-notifications.getOperatorsAsync().'\n );\n alert('Error getting operators.');\n }\n };\n\n private getFacilitiesAsync = async () => {\n let getResult = await getFacilitiesAsync();\n\n if (getResult) {\n this.setState({\n ...this.state,\n facilities: getResult\n });\n } else {\n console.log(\n 'Error caught in page-notifications.getFacilitiesAsync().'\n );\n alert('Error getting facilities.');\n }\n };\n\n private getFullNotifications = () => {\n var {\n notifications,\n assets,\n operators,\n facilities,\n sortFields\n } = this.state;\n var fullNotifications = linq\n .from(notifications)\n .groupJoin(\n assets,\n n => n.assetId,\n a => a.id,\n (n, a) => ({ n, a })\n )\n .selectMany(\n p => p.a.defaultIfEmpty(),\n (p, a) => ({\n ...p.n,\n assetName: a ? a.name : '',\n bhsSerialNumber: a ? a.bhsSerialNumber : ''\n })\n )\n .groupJoin(\n operators,\n n => n.operatorId,\n o => o.id,\n (n, o) => ({ n, o })\n )\n .selectMany(\n p => p.o.defaultIfEmpty(),\n (p, o) => ({\n ...p.n,\n operatorName: o ? o.name : '',\n facilityId: o ? o.facilityId : ''\n })\n )\n .groupJoin(\n facilities,\n n => n.facilityId,\n f => f.id,\n (n, f) => ({ n, f })\n )\n .selectMany(\n p => p.f.defaultIfEmpty(),\n (p, f) =>\n ({\n ...p.n,\n facilityName: f ? f.name : ''\n } as FullNotification)\n );\n if (sortFields.length === 0) {\n fullNotifications = fullNotifications.orderByDescending(\n n => n.timestamp\n );\n }\n return fullNotifications.toArray();\n };\n\n private onStartTimeChange = (value: moment.Moment | undefined) => {\n this.setState({\n startTime: value\n });\n };\n\n private onStartDateChange = (value: moment.Moment | undefined) => {\n this.setState({\n startDate: value\n });\n };\n\n private onEndTimeChange = (value: moment.Moment | undefined) => {\n this.setState({\n endTime: value\n });\n };\n\n private onEndDateChange = (value: moment.Moment | undefined) => {\n this.setState({\n endDate: value\n });\n };\n\n private filterSelectorStyle = (menuListHeight: number | undefined) => {\n return {\n // Note: for other style keys you could care about/modify, see https://react-select.com/styles\n menuList: (styles: any) => ({\n ...styles,\n height: menuListHeight\n ? menuListHeight.toString() + 'px'\n : 'auto'\n }),\n control: (styles: any) => ({\n ...styles,\n // Note: just setting height to make the component less tall is not enough;\n // There is also a min-height which needs to be overwritten if trying to reduce the height of the component\n // (see the second comment on this answer: https://stackoverflow.com/a/50223725)\n height: '30px',\n minHeight: '6px',\n padding: '0px',\n margin: '0px'\n })\n };\n };\n}\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faCheckCircle,\n faTimesCircle,\n faExclamationCircle\n} from '@fortawesome/free-solid-svg-icons';\nimport { AlertLevel } from '../enums/alertLevel';\nimport '../styles/alertBanner.css';\nimport { NavLink } from 'react-router-dom';\n\nexport interface AlertBannerProps {\n isVisible: boolean;\n message: string;\n level: AlertLevel;\n path?: string;\n}\n\nconst AlertBanner = ({ isVisible, message, level, path }: AlertBannerProps) => {\n const style = alertStyle(level);\n const icon = alertIcon(level);\n\n if (!isVisible) {\n return null;\n }\n\n if (path) {\n return (\n \n
\n {icon}\n
{message}
\n
\n
\n );\n } else {\n return (\n
\n {icon}\n
{message}
\n
\n );\n }\n};\n\nconst alertIcon = (level: AlertLevel) => {\n switch (level) {\n case AlertLevel.Info:\n return ;\n case AlertLevel.Warn:\n return ;\n case AlertLevel.Error:\n return ;\n case AlertLevel.None:\n return null;\n default:\n throw new Error(\"Didn't handle all alert levels.\");\n }\n};\n\nconst alertStyle = (level: AlertLevel): string => {\n switch (level) {\n case AlertLevel.Info:\n return 'info';\n case AlertLevel.Warn:\n return 'warn';\n case AlertLevel.Error:\n return 'error';\n case AlertLevel.None:\n return '';\n default:\n throw new Error('Alert level not found.');\n }\n};\n\nexport default AlertBanner;\n","import React from 'react';\nimport AlertBanner from './alertBanner';\nimport { AlertLevel } from '../enums/alertLevel';\nimport {\n getNumExpiringSubscriptions,\n getNumExpiredSubscriptions,\n userIsWebAdmin\n} from '../api/api-account';\n\nexport interface SubscriptionBannerProps {\n notLink?: boolean;\n className?: string;\n}\n\nconst SubscriptionBanner = ({\n notLink,\n className\n}: SubscriptionBannerProps) => {\n const numExpiring = getNumExpiringSubscriptions();\n const numExpired = getNumExpiredSubscriptions();\n\n const numExpiringIsVisible = numExpiring > 0;\n const numExpiredIsVisible = numExpired > 0;\n const bannerIsVisible =\n !userIsWebAdmin() && (numExpiringIsVisible || numExpiredIsVisible);\n\n const path = notLink ? undefined : '/settings/subscriptions';\n const additionalText = notLink ? '' : 'Click to view subscriptions.';\n\n return bannerIsVisible ? (\n
\n \n \n
\n ) : null;\n};\n\nexport default SubscriptionBanner;\n","import * as React from 'react';\nimport 'react-table/react-table.css';\nimport * as TableStyles from '../styles/TableFormats';\nimport { Header } from '../components/header';\nimport ReactTable from 'react-table';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faPencilAlt,\n faTrashAlt,\n faEnvelopeOpen\n} from '@fortawesome/free-solid-svg-icons';\nimport matchSorter from 'match-sorter';\nimport * as userApi from '../api/api-user';\nimport { User } from '../dtos/user';\nimport { GenericDeleteModal } from '../modals/modal-genericDelete';\nimport { AddEditUserModal } from '../modals/modal-addEditUser';\nimport {\n getUserName,\n userIsWebAdmin,\n resetPasswordAsync\n} from '../api/api-account';\nimport { formatDateTime } from '../functions/general';\nimport SubscriptionBanner from '../components/subscriptionBanner';\n\ninterface State {\n users: User[];\n addModalIsOpen: boolean;\n userToEdit: User | null;\n deleteModalIsOpen: boolean;\n userToDelete: User | null;\n}\n\nexport interface Props {}\n\nexport class UsersPage extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n users: [],\n addModalIsOpen: false,\n userToEdit: null,\n deleteModalIsOpen: false,\n userToDelete: null\n };\n }\n\n componentDidMount() {\n this.getUsersAsync();\n }\n\n render() {\n return (\n <>\n
\n
\n
Users
\n
\n
\n \n + Add User\n \n \n
\n
\n
\n
\n \n \n matchSorter([row[filter.id]], filter.value)\n .length !== 0\n }\n showPagination={this.state.users.length > 20}\n minRows={10}\n columns={[\n {\n Header: 'First Name',\n id: 'firstName',\n accessor: u => u.firstName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 175\n },\n {\n Header: 'Last Name',\n id: 'lastName',\n accessor: u => u.lastName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 175\n },\n {\n Header: 'Phone',\n id: 'phoneNumber',\n accessor: u => u.phoneNumber,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 120\n },\n {\n Header: 'Email',\n id: 'email',\n accessor: u => u.email,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100\n },\n {\n Header: 'Report Url',\n id: 'reportURL',\n accessor: u => u.reportURL,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 120\n },\n {\n Header: 'Role',\n id: 'role',\n accessor: u => u.roleName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100\n },\n {\n Header: 'Group',\n id: 'group',\n accessor: u => u.groupName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100\n },\n {\n Header: 'Region',\n id: 'region',\n accessor: u => u.regionName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100\n },\n {\n Header: 'Facility',\n id: 'facility',\n accessor: u => u.facilityName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100\n },\n {\n Header: 'Primary Contact',\n id: 'primaryContact',\n accessor: u =>\n u.primaryContact ? 'Yes' : 'No',\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 135\n },\n {\n Header: 'Last Login Time',\n id: 'lastLoginTime',\n accessor: u =>\n u.lastLoginTime\n ? formatDateTime(u.lastLoginTime)\n : '',\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 175\n },\n {\n Header: '',\n width: 112,\n sortable: false,\n filterable: false,\n Cell: row => {\n let user = row.original as User;\n return (\n
\n \n this.handlePasswordReset(\n user.email\n )\n }\n >\n \n \n \n this.handleEdit(user)\n }\n >\n \n \n {userIsWebAdmin() &&\n getUserName() !==\n user.username && (\n \n this.handleDelete(\n user\n )\n }\n >\n \n \n )}\n
\n );\n }\n }\n ]}\n className=\"-highlight\"\n />\n
\n \n \n );\n }\n\n private getUsersAsync = async () => {\n let getResult = await userApi.getUsersAsync();\n\n if (getResult) {\n this.setState({\n ...this.state,\n users: getResult\n });\n } else {\n console.log('Error caught in page-users.getUsersAsync().');\n alert('Error getting Users.');\n }\n };\n\n private addEditUserAsync = async (user: User, addNew: boolean) => {\n if (addNew) {\n let addResult = await userApi.addUserAsync(user);\n\n if (addResult) {\n this.getUsersAsync();\n } else {\n console.log('Error caught in page-users.addEditUserAsync().');\n alert('Error adding user');\n }\n } else {\n let editResult = await userApi.editUserAsync(user);\n\n if (editResult) {\n this.getUsersAsync();\n } else {\n console.log('Error caught in page-users.addEditUserAsync().');\n alert('Error editing user');\n }\n }\n\n this.closeAddModal();\n };\n\n private deleteUserAsync = async (userId: string) => {\n let deleteSuccess = await userApi.deleteUserAsync(userId);\n\n if (deleteSuccess) {\n this.getUsersAsync();\n } else {\n console.log('Error caught in page-users.deleteUserAsync().');\n alert('Error deleting user');\n }\n\n this.closeDeleteModal();\n };\n\n private handleAdd = () => {\n this.setState({\n addModalIsOpen: true,\n userToEdit: null\n });\n };\n\n private handleEdit = (user: User) => {\n this.setState({\n addModalIsOpen: true,\n userToEdit: user\n });\n };\n\n private handleDelete = (user: User) => {\n this.setState({\n deleteModalIsOpen: true,\n userToDelete: user\n });\n };\n\n private closeAddModal = () => {\n this.setState({\n addModalIsOpen: false\n });\n };\n\n private closeDeleteModal = () => {\n this.setState({\n deleteModalIsOpen: false\n });\n };\n\n private handlePasswordReset = async (username: string) => {\n const apiResult = await resetPasswordAsync(username);\n\n if (apiResult.success) {\n alert(`Password reset link sent to ${username}`);\n } else {\n let errorResult = apiResult.error;\n alert(\n `Failed to send password reset link: ${errorResult?.message}`\n );\n }\n };\n}\n","import * as React from 'react';\nimport { withRouter, RouteComponentProps, Redirect } from 'react-router-dom';\nimport headerLogo from '../images/header-logo.png';\nimport '../styles/Login.css';\nimport { confirmAccountAsync } from '../api/api-account';\nimport TextInput from '../components/textInput';\nimport { ConfirmAccount } from '../dtos/confirmAccount';\nimport { AuthorizedLogin } from '../dtos/authorizedLogin';\nimport { ApiResult } from '../api/api-shared';\n\ninterface State {\n email: string;\n password: string;\n passwordConfirmation: string;\n agreesToSubscription: boolean;\n isLoggedIn: boolean;\n disableInputs: boolean;\n errorMsg: string;\n}\n\nexport interface Props extends RouteComponentProps<{}> {}\n\n// This component is linked in the email sent to new users and to reset passwords\n// The email will build the url to include the user's email and token\nclass AccountConfirmPage extends React.Component {\n email: string = '';\n token: string = '';\n\n constructor(props: Props) {\n super(props);\n this.state = {\n email: '',\n password: '',\n passwordConfirmation: '',\n agreesToSubscription: false,\n isLoggedIn: false,\n disableInputs: false,\n errorMsg: ''\n };\n }\n\n componentWillMount() {\n // Get email and token from url\n const params = this.props.location.search;\n let e = params.match(new RegExp('email=(.*)&'));\n let t = params.match(new RegExp('token=(.*)'));\n\n if (e && t) {\n this.email = e[1];\n this.token = t[1];\n }\n }\n\n componentDidMount() {\n // Set email to that contained in url\n this.setState({ email: this.email });\n }\n\n render() {\n if (this.state.isLoggedIn) {\n return ;\n } else {\n return (\n
\n
\n
\n
\n \n
\n \n \n this.onInputChange(\n s =>\n (s.email =\n event.currentTarget.value)\n )\n }\n disabled={this.state.disableInputs}\n inputType=\"email\"\n class=\"col-lg-12 col-md-12 mb-5\"\n additionalLabelStyle=\"wide\"\n />\n \n this.onInputChange(\n s =>\n (s.password =\n event.currentTarget.value)\n )\n }\n inputType=\"password\"\n disabled={this.state.disableInputs}\n class=\"col-lg-12 col-md-12 mb-3\"\n additionalLabelStyle=\"wide\"\n />\n \n this.onInputChange(\n s =>\n (s.passwordConfirmation =\n event.currentTarget.value)\n )\n }\n inputType=\"password\"\n disabled={this.state.disableInputs}\n class=\"col-lg-12 col-md-12 mb-5\"\n additionalLabelStyle=\"wide\"\n />\n
\n \n
    \n
  • Be a minimum of 6 characters
  • \n
  • \n Contain at least one uppercase character\n (e.g. A-Z)\n
  • \n
  • \n Contain at least one lowercase character\n (e.g. a-z)\n
  • \n
  • \n Contain at least one digit (e.g. 0-9)\n
  • \n
  • \n Contain at least one non-alphanumeric\n character (e.g. !@#$%)\n
  • \n
\n
\n
\n \n this.onInputChange(\n s =>\n (s.agreesToSubscription =\n event.currentTarget.checked)\n )\n }\n />\n
\n I agree to the{' '}\n \n subscription agreement\n \n
\n
\n \n
\n \n Confirm\n \n
\n
\n
\n
\n );\n }\n }\n\n private onInputChange = (operation: (state: State) => void) => {\n const newItemState = { ...this.state };\n operation(newItemState);\n this.setState({ ...newItemState });\n };\n\n private handleKeyPress = (e: any) => {\n if (e.key === 'Enter') {\n this.handleConfirm();\n }\n };\n\n private handleConfirm = () => {\n this.setState({ disableInputs: true, errorMsg: '' });\n\n this.confirmAccountAsync(\n this.state.email,\n this.state.password,\n this.state.passwordConfirmation,\n this.state.agreesToSubscription\n );\n };\n\n private confirmAccountAsync = async (\n email: string,\n password: string,\n passwordConfirmation: string,\n agreesToSubscription: boolean\n ) => {\n let dto: ConfirmAccount = {\n email: email,\n token: this.token,\n password: password,\n passwordConfirmation: passwordConfirmation,\n agreesToSubscription: agreesToSubscription\n };\n\n let apiResult: ApiResult = await confirmAccountAsync(\n dto\n );\n\n if (apiResult.success) {\n this.setState({\n isLoggedIn: true,\n disableInputs: false\n });\n } else {\n this.setState({\n isLoggedIn: false,\n disableInputs: false,\n errorMsg: apiResult.error\n ? apiResult.error.message\n : 'No error detail available.'\n });\n }\n };\n}\n\nexport default withRouter(AccountConfirmPage);\n","import { httpRequestAsync, ApiResult } from './api-shared';\nimport { BASE_URL, ASSET_URL } from './urls';\nimport { Asset } from '../dtos/asset';\n\nexport const getAssetsAsync = async () => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${ASSET_URL}`,\n 'get'\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Asset[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const addAssetAsync = async (\n asset: Asset\n): Promise> => {\n let apiResult: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${ASSET_URL}`,\n 'post',\n asset\n );\n\n return apiResult;\n};\n\nexport const editAssetAsync = async (\n asset: Asset\n): Promise> => {\n let apiResult: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${ASSET_URL}`,\n 'put',\n asset\n );\n\n return apiResult;\n};\n\nexport const deleteAssetAsync = async (assetId: string): Promise => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${ASSET_URL}/${assetId}`,\n 'delete'\n );\n\n if (!httpResponse.success) {\n console.log(\n 'Error Deleting Asset ' +\n assetId +\n ', cause: ' +\n httpResponse.error!.message\n );\n }\n\n return httpResponse.success;\n};\n","import Globals from '../globals';\nimport { StatisticIndicatorLevel } from '../enums/statisticIndicatorLevel';\n\nexport interface Asset {\n id: string;\n facilityId: string;\n facilityName: string;\n regionName: string;\n groupName: string;\n name: string;\n serialNumber: string;\n macAddress: string;\n description: string;\n mode: number;\n lastOnline: Date | null;\n mqttVersion: number;\n softwareVersion: string;\n alertEmailRecipients: string;\n alertsEnabled: boolean;\n bhsSerialNumber: string;\n pmChecklistEnabled: boolean;\n recentActivityLevel: StatisticIndicatorLevel;\n startingBEHours: number;\n totalFootPedalHours: number;\n}\n\nexport const defaultAsset: Asset = {\n id: Globals.GUID_PLACEHOLDER,\n facilityId: '',\n facilityName: '',\n regionName: '',\n groupName: '',\n name: '',\n serialNumber: '',\n macAddress: '',\n description: '',\n mode: 0,\n lastOnline: null,\n mqttVersion: 0,\n softwareVersion: '',\n alertEmailRecipients: '',\n alertsEnabled: false,\n bhsSerialNumber: '',\n pmChecklistEnabled: false,\n recentActivityLevel: StatisticIndicatorLevel.None,\n startingBEHours: 0,\n totalFootPedalHours: 0\n};\n","import * as React from 'react';\nimport '../styles/Modal.css';\nimport { Asset, defaultAsset } from '../dtos/asset';\nimport { Facility } from '../dtos/facility';\nimport * as facilityApi from '../api/api-facility';\nimport {\n userIsWebAdmin,\n getUserFacilityId,\n userIsLocal\n} from '../api/api-account';\nimport { BaseModal } from './modal-base';\nimport { LabeledInput } from '../components/labeledInput';\n\ninterface State {\n asset: Asset;\n facilities: Facility[];\n}\n\nexport interface Props {\n asset: Asset | null;\n isModalOpen: boolean;\n errorMsg: string;\n closeModal: () => void;\n addEditAsset: (asset: Asset, addNew: boolean) => void;\n}\n\nexport class AddAssetModal extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n asset: { ...defaultAsset },\n facilities: []\n };\n }\n\n componentDidMount() {\n this.getFacilitiesAsync();\n }\n\n componentWillReceiveProps(nextProps: Props) {\n if (!this.props.isModalOpen && nextProps.isModalOpen) {\n let asset: Asset;\n\n if (nextProps.asset) {\n asset = { ...nextProps.asset };\n } else {\n asset = { ...defaultAsset };\n }\n\n if (userIsLocal()) {\n asset.facilityId = getUserFacilityId();\n }\n\n this.setState({\n asset: asset\n });\n }\n }\n\n render() {\n return (\n \n
\n \n
\n \n \n this.onInputChange(\n a => (a.name = event.currentTarget.value)\n )\n }\n tabIndex={1}\n autoFocus={true}\n disabled={\n !userIsWebAdmin() && this.props.asset !== null\n }\n />\n \n \n \n this.onInputChange(\n a =>\n (a.bhsSerialNumber =\n event.currentTarget.value)\n )\n }\n disabled={\n !userIsWebAdmin() && this.props.asset !== null\n }\n tabIndex={2}\n />\n \n \n \n this.onInputChange(\n a =>\n (a.serialNumber =\n event.currentTarget.value)\n )\n }\n disabled={\n !userIsWebAdmin() && this.props.asset !== null\n }\n tabIndex={3}\n />\n \n \n \n this.onInputChange(\n a =>\n (a.description =\n event.currentTarget.value)\n )\n }\n tabIndex={4}\n disabled={\n !userIsWebAdmin() && this.props.asset !== null\n }\n />\n \n \n \n this.onInputChange(\n a =>\n (a.facilityId =\n event.currentTarget.value)\n )\n }\n disabled={\n !userIsWebAdmin() && this.props.asset !== null\n }\n tabIndex={5}\n >\n \n {this.state.facilities.map(f => (\n \n ))}\n \n \n \n \n this.onInputChange(\n a =>\n (a.macAddress =\n event.currentTarget.value)\n )\n }\n disabled={\n !userIsWebAdmin() && this.props.asset !== null\n }\n tabIndex={6}\n />\n \n
\n \n
    \n
  • Be exactly 12 characters
  • \n
  • \n Only contain alphanumeric characters (A-F, 0-9)\n
  • \n
\n
\n \n \n this.onInputChange(\n a =>\n (a.alertEmailRecipients =\n event.currentTarget.value)\n )\n }\n tabIndex={7}\n />\n \n {userIsWebAdmin() && (\n \n \n this.onInputChange(\n a =>\n (a.alertsEnabled =\n event.currentTarget.checked)\n )\n }\n tabIndex={8}\n />\n \n )}\n \n \n this.onInputChange(\n a =>\n (a.pmChecklistEnabled =\n event.currentTarget.checked)\n )\n }\n tabIndex={9}\n />\n \n \n \n this.onInputChange(\n a =>\n (a.startingBEHours = parseFloat(\n event.currentTarget.value\n ))\n )\n }\n disabled={\n !userIsWebAdmin() && this.props.asset !== null\n }\n tabIndex={10}\n />\n \n \n
\n
\n \n Confirm\n \n
\n
\n \n Cancel\n \n
\n
\n
\n \n );\n }\n\n private async getFacilitiesAsync() {\n let result = await facilityApi.getFacilitiesAsync();\n\n if (result) {\n this.setState({\n facilities: result\n });\n } else {\n console.log(\n 'Error caught in modal-addEditAsset.getFacilitiesAsync().'\n );\n alert('Error getting Facilities.');\n }\n }\n\n private onInputChange = (operation: (asset: Asset) => void) => {\n const newItemState = { ...this.state.asset };\n operation(newItemState);\n this.setState({ asset: newItemState });\n };\n\n private handleConfirm = () => {\n this.props.addEditAsset(this.state.asset, this.props.asset === null);\n };\n\n private handleCancel = () => {\n this.props.closeModal();\n };\n\n private assetIsValid = () => {\n let nameIsValid = this.state.asset.name.length > 0;\n let facilityIsValid = this.state.asset.facilityId.length > 0;\n let serialNumberIsValid = this.state.asset.serialNumber.length > 0;\n\n let bhsSerialNumberIsValid =\n this.state.asset.bhsSerialNumber.length > 0;\n\n let emailsRegex = /^[\\W]*([\\w+\\-.%]+@[\\w\\-.]+\\.[A-Za-z]{2,4}[\\W]*,{1}[\\W]*)*([\\w+\\-.%]+@[\\w\\-.]+\\.[A-Za-z]{2,4})[\\W]*$/;\n let emailsAreValid =\n this.state.asset.alertEmailRecipients.length > 0\n ? emailsRegex.test(this.state.asset.alertEmailRecipients)\n : true;\n\n let macAddressRegex = /\\b[a-fA-F0-9]{12}\\b/;\n\n let macAddressIsValid = macAddressRegex.test(\n this.state.asset.macAddress\n );\n\n return (\n nameIsValid &&\n facilityIsValid &&\n serialNumberIsValid &&\n bhsSerialNumberIsValid &&\n macAddressIsValid &&\n emailsAreValid\n );\n };\n}\n","import * as React from 'react';\nimport ReactTable from 'react-table';\nimport 'react-table/react-table.css';\nimport { Header } from '../components/header';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faPencilAlt,\n faTrashAlt,\n faSignal\n} from '@fortawesome/free-solid-svg-icons';\nimport matchSorter from 'match-sorter';\nimport { Asset } from '../dtos/asset';\nimport * as assetApi from '../api/api-asset';\nimport { AddAssetModal } from '../modals/modal-addEditAsset';\nimport '../styles/Headers.css';\nimport '../styles/Tables.css';\nimport * as TableStyles from '../styles/TableFormats';\nimport { userIsWebAdmin } from '../api/api-account';\nimport { GenericDeleteModal } from '../modals/modal-genericDelete';\nimport { ApiResult } from '../api/api-shared';\nimport { formatDateTime, indicatorColor } from '../functions/general';\nimport SubscriptionBanner from '../components/subscriptionBanner';\n\ninterface State {\n assets: Asset[];\n addEditModalIsOpen: boolean;\n addEditErrorMsg: string;\n assetToEdit: Asset | null;\n deleteModalIsOpen: boolean;\n assetToDelete: Asset | null;\n}\n\nexport interface Props {\n readOnlyView: boolean;\n}\n\nexport class AssetsPage extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n assets: [],\n addEditModalIsOpen: false,\n addEditErrorMsg: '',\n assetToEdit: null,\n deleteModalIsOpen: false,\n assetToDelete: null\n };\n }\n\n componentDidMount() {\n this.getAssetsAsync();\n }\n\n render() {\n return !this.props.readOnlyView || userIsWebAdmin() ? (\n <>\n
\n
\n
\n {this.props.readOnlyView ? 'Web Admin' : 'Assets'}\n
\n
\n
\n {userIsWebAdmin() && !this.props.readOnlyView && (\n \n + Add Asset\n \n )}\n \n
\n
\n
\n\n
\n \n \n matchSorter([row[filter.id]], filter.value)\n .length !== 0\n }\n showPagination={this.state.assets.length > 20}\n minRows={10}\n columns={[\n {\n Header: 'Model',\n id: 'model',\n accessor: a => a.name,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 120\n },\n {\n Header: 'BHS Serial Number',\n id: 'bhsSerialNumber',\n accessor: a => a.bhsSerialNumber,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 150\n },\n {\n Header: 'Description',\n id: 'description',\n accessor: a => a.description,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 150\n },\n {\n Header: 'Facility',\n id: 'facility',\n accessor: a => a.facilityName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 150\n },\n {\n Header: 'Region',\n id: 'region',\n accessor: a => a.regionName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100\n },\n {\n Header: 'Group',\n id: 'group',\n accessor: a => a.groupName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100\n },\n {\n Header: 'Total Foot Pedal Hours',\n id: 'totalFootPedalHours',\n accessor: a => a.totalFootPedalHours.toFixed(1),\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100,\n show: this.props.readOnlyView,\n filterable: false\n },\n {\n Header: 'BE Recent Activity',\n id: 'beRecentActivity',\n accessor: a => a.lastOnline,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100,\n show: this.props.readOnlyView,\n filterable: false,\n Cell: row => {\n let recentActivityLevel =\n row.original.recentActivityLevel;\n\n return (\n \n );\n }\n },\n {\n Header: 'Last Online',\n id: 'lastOnline',\n accessor: a =>\n a.lastOnline\n ? formatDateTime(a.lastOnline)\n : '',\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 150,\n show: !this.props.readOnlyView\n },\n {\n Header: 'MAC Address',\n id: 'macAddress',\n accessor: a => a.macAddress,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 150,\n show: !this.props.readOnlyView\n },\n {\n Header: 'Mode',\n id: 'mode',\n accessor: a => a.mode,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 50,\n show: !this.props.readOnlyView\n },\n {\n Header: 'Software V.',\n id: 'softwareVersion',\n accessor: a => a.softwareVersion,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100,\n show: !this.props.readOnlyView\n },\n {\n Header: 'MQTT V.',\n id: 'mqttVersion',\n accessor: a => a.mqttVersion,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 75,\n show: !this.props.readOnlyView\n },\n {\n Header: 'Alerts Enabled',\n id: 'alertsEnabled',\n accessor: a => (a.alertsEnabled ? 'Yes' : 'No'),\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100,\n show: !this.props.readOnlyView\n },\n {\n Header: '',\n width: 112,\n sortable: false,\n filterable: false,\n show: !this.props.readOnlyView,\n Cell: row => {\n let asset = row.original as Asset;\n return (\n
\n \n this.handleEdit(asset)\n }\n >\n \n \n {userIsWebAdmin() && (\n \n this.handleDelete(asset)\n }\n >\n \n \n )}\n
\n );\n }\n }\n ]}\n className=\"-highlight\"\n />\n
\n \n \n ) : (\n <>\n
\n
\n
Web Admin
\n
\n \n );\n }\n\n private getAssetsAsync = async () => {\n let getResult = await assetApi.getAssetsAsync();\n\n if (getResult) {\n this.setState({\n ...this.state,\n assets: getResult\n });\n } else {\n console.log('Error caught in page-assets.getAssetsAsync().');\n alert('Error getting assets.');\n }\n };\n\n // TODO: potential improvements:\n // 1) rather than call getAssetsAsync on success, just take the returned asset\n // data and adjust what is already loaded with the new asset/updated asset\n // 2) modify other addEdit methods in other apis to follow this pattern\n private addEditAssetAsync = async (asset: Asset, addNew: boolean) => {\n let apiResult: ApiResult = {\n success: true,\n data: undefined,\n error: undefined\n };\n\n if (addNew) {\n apiResult = await assetApi.addAssetAsync(asset);\n } else {\n apiResult = await assetApi.editAssetAsync(asset);\n }\n\n if (apiResult.success) {\n this.getAssetsAsync();\n this.closeAddModal();\n } else {\n let errorResult = apiResult.error;\n this.setState({\n addEditErrorMsg: errorResult\n ? errorResult.message\n : 'No error detail available.'\n });\n }\n };\n\n private deleteAssetAsync = async (assetId: string) => {\n let deleteSuccess = await assetApi.deleteAssetAsync(assetId);\n\n if (deleteSuccess) {\n this.getAssetsAsync();\n } else {\n console.log('Error caught in page-assets.deleteAssetAsync().');\n alert('Error deleting asset');\n }\n\n this.closeDeleteModal();\n };\n\n private handleAdd = () => {\n this.setState({\n addEditModalIsOpen: true,\n assetToEdit: null\n });\n };\n\n private handleEdit = (asset: Asset) => {\n this.setState({\n addEditModalIsOpen: true,\n assetToEdit: asset\n });\n };\n\n private handleDelete = (asset: Asset) => {\n this.setState({\n deleteModalIsOpen: true,\n assetToDelete: asset\n });\n };\n\n private closeAddModal = () => {\n this.setState({\n addEditModalIsOpen: false,\n addEditErrorMsg: ''\n });\n };\n\n private closeDeleteModal = () => {\n this.setState({\n deleteModalIsOpen: false\n });\n };\n}\n","import Globals from '../globals';\n\nexport interface Group {\n id: string;\n name: string;\n createdDate: Date;\n}\n\nexport const defaultGroup: Group = {\n id: Globals.GUID_PLACEHOLDER,\n name: '',\n createdDate: new Date()\n};\n","import * as React from 'react';\nimport '../styles/Modal.css';\nimport { Group, defaultGroup } from '../dtos/group';\nimport { BaseModal } from './modal-base';\nimport { LabeledInput } from '../components/labeledInput';\n\ninterface State {\n group: Group;\n}\n\nexport interface Props {\n group: Group | null;\n isModalOpen: boolean;\n closeModal: () => void;\n addGroup: (group: Group, addNew: boolean) => void;\n}\n\nexport class AddEditGroupModal extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n group: { ...defaultGroup }\n };\n }\n\n componentDidMount() {}\n\n componentWillReceiveProps(nextProps: Props) {\n if (!this.props.isModalOpen && nextProps.isModalOpen) {\n let group: Group;\n\n if (nextProps.group) {\n group = { ...nextProps.group };\n } else {\n group = { ...defaultGroup };\n }\n this.setState({\n group: group\n });\n }\n }\n\n render() {\n return (\n \n
\n \n
\n \n \n \n
\n
\n \n Confirm\n \n
\n
\n \n Cancel\n \n
\n
\n
\n \n );\n }\n\n private inputChange = (\n e:\n | React.SyntheticEvent\n | React.SyntheticEvent\n ) => {\n let group = { ...this.state.group };\n\n if (e.currentTarget.type === 'checkbox') {\n group[e.currentTarget.name] = (e as React.SyntheticEvent<\n HTMLInputElement\n >).currentTarget.checked;\n } else {\n group[e.currentTarget.name] = e.currentTarget.value;\n }\n\n return group;\n };\n\n private onInputChange = (\n e:\n | React.SyntheticEvent\n | React.SyntheticEvent\n ) => {\n let group = this.inputChange(e);\n\n this.setState({\n group: group\n });\n };\n\n private handleConfirm = () => {\n this.props.addGroup(this.state.group, this.props.group === null);\n\n this.props.closeModal();\n };\n\n private handleCancel = () => {\n this.props.closeModal();\n };\n\n private groupIsValid = () => {\n let nameIsValid = this.state.group.name.length > 0;\n\n return nameIsValid;\n };\n}\n","import * as React from 'react';\nimport 'react-table/react-table.css';\nimport * as TableStyles from '../styles/TableFormats';\nimport { Header } from '../components/header';\nimport ReactTable from 'react-table';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faPencilAlt, faTrashAlt } from '@fortawesome/free-solid-svg-icons';\nimport matchSorter from 'match-sorter';\nimport * as groupApi from '../api/api-group';\nimport { GenericDeleteModal } from '../modals/modal-genericDelete';\nimport { AddEditGroupModal } from '../modals/modal-addEditGroup';\nimport { userIsWebAdmin } from '../api/api-account';\nimport { Group } from '../dtos/group';\nimport { formatDateTime } from '../functions/general';\nimport SubscriptionBanner from '../components/subscriptionBanner';\n\ninterface State {\n groups: Group[];\n addModalIsOpen: boolean;\n groupToEdit: Group | null;\n deleteModalIsOpen: boolean;\n groupToDelete: Group | null;\n}\n\nexport interface Props {}\n\nexport class GroupsPage extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n groups: [],\n addModalIsOpen: false,\n groupToEdit: null,\n deleteModalIsOpen: false,\n groupToDelete: null\n };\n }\n\n componentDidMount() {\n this.getGroupsAsync();\n }\n\n render() {\n return userIsWebAdmin() ? (\n <>\n
\n
\n
Groups
\n
\n
\n \n + Add Group\n \n \n
\n
\n
\n
\n \n \n matchSorter([row[filter.id]], filter.value)\n .length !== 0\n }\n showPagination={this.state.groups.length > 20}\n minRows={10}\n columns={[\n {\n Header: 'Name',\n id: 'name',\n accessor: g => g.name,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Created Date',\n id: 'Created',\n accessor: g => formatDateTime(g.createdDate),\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: '',\n width: 112,\n sortable: false,\n filterable: false,\n Cell: row => {\n let group = row.original as Group;\n return (\n
\n \n this.handleEdit(group)\n }\n >\n \n \n \n this.handleDelete(group)\n }\n >\n \n \n
\n );\n }\n }\n ]}\n className=\"-highlight\"\n />\n
\n \n \n ) : (\n <>\n
\n
\n
Groups
\n
\n \n );\n }\n\n private getGroupsAsync = async () => {\n let getResult = await groupApi.getGroupsAsync();\n\n if (getResult) {\n this.setState({\n ...this.state,\n groups: getResult\n });\n } else {\n console.log('Error caught in page-groups.getGroupsAsync().');\n alert('Error getting groups.');\n }\n };\n\n private addEditGroupAsync = async (group: Group, addNew: boolean) => {\n if (addNew) {\n let addResult = await groupApi.addGroupAsync(group);\n\n if (addResult) {\n this.getGroupsAsync();\n } else {\n console.log('Error caught in page-groups.addEditGroupAsync().');\n alert('Error adding group');\n }\n } else {\n let editResult = await groupApi.editGroupAsync(group);\n\n if (editResult) {\n this.getGroupsAsync();\n } else {\n console.log('Error caught in page-assets.addEditGroupAsync().');\n alert('Error editing asset');\n }\n }\n\n this.closeAddModal();\n };\n\n private deleteGroupAsync = async (groupId: string) => {\n let deleteSuccess = await groupApi.deleteGroupAsync(groupId);\n\n if (deleteSuccess) {\n this.getGroupsAsync();\n } else {\n console.log('Error caught in page-groups.deleteGroupAsync().');\n alert('Error deleting group');\n }\n\n this.closeDeleteModal();\n };\n\n private handleAdd = () => {\n this.setState({\n addModalIsOpen: true,\n groupToEdit: null\n });\n };\n\n private handleEdit = (group: Group) => {\n this.setState({\n addModalIsOpen: true,\n groupToEdit: group\n });\n };\n\n private handleDelete = (group: Group) => {\n this.setState({\n deleteModalIsOpen: true,\n groupToDelete: group\n });\n };\n\n private closeAddModal = () => {\n this.setState({\n addModalIsOpen: false\n });\n };\n\n private closeDeleteModal = () => {\n this.setState({\n deleteModalIsOpen: false\n });\n };\n}\n","import Globals from '../globals';\n\nexport interface Region {\n id: string;\n groupId: string;\n groupName: string;\n name: string;\n description: string;\n}\n\nexport const defaultRegion: Region = {\n id: Globals.GUID_PLACEHOLDER,\n groupId: '',\n groupName: '',\n name: '',\n description: ''\n};\n","import * as React from 'react';\nimport '../styles/Modal.css';\nimport { Role } from '../dtos/role';\nimport { Group } from '../dtos/group';\nimport { Region, defaultRegion } from '../dtos/region';\nimport * as groupApi from '../api/api-group';\nimport * as regionApi from '../api/api-region';\nimport { userIsWebAdmin, getUserGroupId } from '../api/api-account';\nimport { BaseModal } from './modal-base';\nimport { LabeledInput } from '../components/labeledInput';\n\ninterface State {\n region: Region;\n roles: Role[];\n groups: Group[];\n regions: Region[];\n}\n\nexport interface Props {\n region: Region | null;\n isModalOpen: boolean;\n closeModal: () => void;\n addRegion: (region: Region, addNew: boolean) => void;\n}\n\nexport class AddEditRegionModal extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n region: { ...defaultRegion },\n roles: [],\n groups: [],\n regions: []\n };\n }\n\n componentDidMount() {\n this.getGroupsAsync();\n this.getRegionsAsync();\n }\n\n componentWillReceiveProps(nextProps: Props) {\n if (!this.props.isModalOpen && nextProps.isModalOpen) {\n let region: Region;\n\n if (nextProps.region) {\n region = { ...nextProps.region };\n } else {\n region = { ...defaultRegion };\n }\n\n if (!userIsWebAdmin()) {\n region.groupId = getUserGroupId();\n }\n\n this.setState({\n region: region\n });\n }\n }\n\n render() {\n return (\n \n
\n \n
\n \n \n \n \n \n \n {this.state.groups.map(g => (\n \n ))}\n \n \n \n \n \n
\n
\n \n Confirm\n \n
\n
\n \n Cancel\n \n
\n
\n
\n \n );\n }\n\n private async getGroupsAsync() {\n let result = await groupApi.getGroupsAsync();\n\n if (result) {\n this.setState({\n groups: result\n });\n } else {\n console.log(\n 'Error caught in modal-AddEditRegion.getGroupsAsync().'\n );\n alert('Error getting groups.');\n }\n }\n\n private async getRegionsAsync() {\n let result = await regionApi.getRegionsAsync();\n\n if (result !== null && result !== undefined) {\n this.setState({\n regions: result\n });\n } else {\n console.log(\n 'Error caught in modal-AddEditRegion.getRegionsAsync().'\n );\n alert('Error getting regions.');\n }\n }\n\n private inputChange = (\n e:\n | React.SyntheticEvent\n | React.SyntheticEvent\n ) => {\n let region = { ...this.state.region };\n\n region[e.currentTarget.name] = e.currentTarget.value;\n\n return region;\n };\n\n private onInputChange = (\n e:\n | React.SyntheticEvent\n | React.SyntheticEvent\n ) => {\n let region = this.inputChange(e);\n\n this.setState({\n region: region\n });\n };\n\n private onGroupChange = (e: React.SyntheticEvent) => {\n let region = this.inputChange(e);\n\n this.setState({\n region: region\n });\n };\n\n private handleConfirm = () => {\n this.props.addRegion(this.state.region, this.props.region === null);\n\n this.props.closeModal();\n };\n\n private handleCancel = () => {\n this.props.closeModal();\n };\n\n private regionIsValid = () => {\n let firstIsValid = this.state.region.name;\n let groupIsValid = this.state.region.groupId.length > 0;\n\n return firstIsValid && groupIsValid;\n };\n}\n","import * as React from 'react';\nimport 'react-table/react-table.css';\nimport * as TableStyles from '../styles/TableFormats';\nimport { Header } from '../components/header';\nimport ReactTable from 'react-table';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faPencilAlt, faTrashAlt } from '@fortawesome/free-solid-svg-icons';\nimport matchSorter from 'match-sorter';\nimport * as regionApi from '../api/api-region';\nimport { Region } from '../dtos/region';\nimport { GenericDeleteModal } from '../modals/modal-genericDelete';\nimport { AddEditRegionModal } from '../modals/modal-addEditRegion';\nimport { userIsWebAdmin, userIsAdmin } from '../api/api-account';\nimport SubscriptionBanner from '../components/subscriptionBanner';\n\ninterface State {\n regions: Region[];\n addModalIsOpen: boolean;\n deleteModalIsOpen: boolean;\n regionToDelete: Region | null;\n regionToEdit: Region | null;\n}\n\nexport interface Props {}\n\nexport class RegionsPage extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n regions: [],\n addModalIsOpen: false,\n deleteModalIsOpen: false,\n regionToDelete: null,\n regionToEdit: null\n };\n }\n\n componentDidMount() {\n this.getRegionsAsync();\n }\n\n render() {\n return userIsWebAdmin() || userIsAdmin() ? (\n <>\n
\n
\n
Regions
\n
\n
\n {userIsWebAdmin() && (\n \n + Add Region\n \n )}\n \n
\n
\n
\n
\n \n \n matchSorter([row[filter.id]], filter.value)\n .length !== 0\n }\n showPagination={this.state.regions.length > 20}\n minRows={10}\n columns={[\n {\n Header: 'Name',\n id: 'name',\n accessor: g => g.name,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Group',\n id: 'groupName',\n accessor: g => g.groupName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Description',\n id: 'description',\n accessor: g => g.description,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: '',\n width: 112,\n sortable: false,\n filterable: false,\n Cell: row => {\n let region = row.original as Region;\n return (\n
\n {userIsWebAdmin() && (\n \n this.handleEdit(region)\n }\n >\n \n \n )}\n {userIsWebAdmin() && (\n \n this.handleDelete(\n region\n )\n }\n >\n \n \n )}\n
\n );\n }\n }\n ]}\n className=\"-highlight\"\n />\n
\n \n \n ) : (\n <>\n
\n
\n
Regions
\n
\n \n );\n }\n\n private getRegionsAsync = async () => {\n let getResult = await regionApi.getRegionsAsync();\n\n if (getResult) {\n this.setState({\n ...this.state,\n regions: getResult\n });\n } else {\n console.log('Error caught in page-regions.getRegionsAsync().');\n alert('Error getting regions.');\n }\n };\n\n private addEditRegionAsync = async (region: Region, addNew: boolean) => {\n if (addNew) {\n let addResult = await regionApi.addRegionAsync(region);\n\n if (addResult) {\n this.getRegionsAsync();\n } else {\n console.log(\n 'Error caught in page-regions.addEditRegionAsync().'\n );\n alert('Error adding region');\n }\n } else {\n let editResult = await regionApi.editRegionAsync(region);\n\n if (editResult) {\n this.getRegionsAsync();\n } else {\n console.log(\n 'Error caught in page-assets.addEditRegionAsync().'\n );\n alert('Error editing region');\n }\n }\n\n this.closeAddModal();\n };\n\n private deleteRegionAsync = async (regionId: string) => {\n let deleteSuccess = await regionApi.deleteRegionAsync(regionId);\n\n if (deleteSuccess) {\n this.getRegionsAsync();\n } else {\n console.log('Error caught in page-regions.deleteRegionAsync().');\n alert('Error deleting region');\n }\n\n this.closeDeleteModal();\n };\n\n private handleAdd = () => {\n this.setState({\n addModalIsOpen: true,\n regionToEdit: null\n });\n };\n\n private handleEdit = (region: Region) => {\n this.setState({\n addModalIsOpen: true,\n regionToEdit: region\n });\n };\n\n private handleDelete = (region: Region) => {\n this.setState({\n deleteModalIsOpen: true,\n regionToDelete: region\n });\n };\n\n private closeAddModal = () => {\n this.setState({\n addModalIsOpen: false\n });\n };\n\n private closeDeleteModal = () => {\n this.setState({\n deleteModalIsOpen: false\n });\n };\n}\n","import { httpRequestAsync, ApiResult } from './api-shared';\nimport { BASE_URL, NOTIFICATION_URL } from './urls';\nimport { Notification } from '../dtos/notification';\nimport { NotificationsCount } from '../dtos/notificationsCount';\nimport { Query } from '../dtos/query';\n\nexport const getNotificationsAsync = async (\n query: Query,\n pageNumber: number | null,\n pageSize: number | null\n): Promise> => {\n let apiResult: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${NOTIFICATION_URL}?pageNumber=${pageNumber}&pageSize=${pageSize}`,\n 'post',\n query\n );\n\n return apiResult;\n};\n\nexport const getNotificationsCountAsync = async (\n query: Query\n): Promise> => {\n let apiResult: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${NOTIFICATION_URL}/count`,\n 'post',\n query\n );\n\n return apiResult;\n};\n","import { httpRequestAsync, ApiResult } from './api-shared';\nimport { BASE_URL, OPERATOR_URL, SOFT_DELETE_URL, FILTER_URL } from './urls';\nimport { Operator } from '../dtos/operator';\n\nexport const getOperatorsAsync = async () => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${OPERATOR_URL}`,\n 'get'\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Operator[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const getFilteredOperatorsAsync = async () => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${OPERATOR_URL}/${FILTER_URL}`,\n 'get'\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Operator[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const addOperatorAsync = async (\n operator: Operator\n): Promise> => {\n let apiResult: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${OPERATOR_URL}`,\n 'post',\n operator\n );\n\n return apiResult;\n};\n\nexport const editOperatorAsync = async (\n operator: Operator\n): Promise> => {\n let apiResult: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${OPERATOR_URL}`,\n 'put',\n operator\n );\n\n return apiResult;\n};\n\nexport const deleteOperatorAsync = async (\n operatorId: string\n): Promise => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${OPERATOR_URL}/${operatorId}`,\n 'delete'\n );\n\n if (!httpResponse.success) {\n console.log(\n 'Error Deleting Operator ' +\n operatorId +\n ', cause: ' +\n httpResponse.error!.message\n );\n }\n\n return httpResponse.success;\n};\n\nexport const softDeleteOperatorAsync = async (\n operatorId: string\n): Promise => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${OPERATOR_URL}/${SOFT_DELETE_URL}/${operatorId}`,\n 'delete'\n );\n\n if (!httpResponse.success) {\n console.log(\n 'Error Deleting Operator ' +\n operatorId +\n ', cause: ' +\n httpResponse.error!.message\n );\n }\n\n return httpResponse.success;\n};\n","import * as React from 'react';\nimport 'rc-time-picker/assets/index.css';\nimport RcTimePicker from 'rc-time-picker';\nimport '../styles/TimePicker.css';\nimport moment from 'moment';\n\ninterface Props {\n name: string;\n placeholder?: string;\n value?: moment.Moment;\n controlCssClass?: string;\n onChange: (newValue?: moment.Moment) => void;\n allowEmpty?: boolean;\n showNowButton: boolean;\n}\n\ninterface State {}\n\nclass TimePicker extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n isFocused: false\n };\n\n this.timePickerChanged = this.timePickerChanged.bind(this);\n }\n\n render() {\n let time: moment.Moment | undefined =\n this.props.value && this.props.value.isValid()\n ? this.props.value\n : undefined;\n\n return (\n
\n \n \n
\n {this.props.showNowButton && (\n
\n this.setCurrentTime()}\n type=\"button\"\n >\n Now\n \n
\n )}\n
\n );\n }\n\n private timePickerChanged(date: moment.Moment | null) {\n this.props.onChange(date === null ? undefined : date);\n }\n\n private setCurrentTime() {\n this.props.onChange(moment());\n }\n}\n\nexport default TimePicker;\n","import * as React from 'react';\n// NOTE: react-dates/initialize and react-dates/lib/css/_datepicker.css must be imported before react-dates\nimport 'react-dates/initialize';\nimport 'react-dates/lib/css/_datepicker.css';\nimport { SingleDatePicker } from 'react-dates';\nimport '../styles/DatePicker.css';\nimport moment from 'moment';\nimport { setMomentToMidnight } from '../functions/general';\n\ninterface Props {\n id: string;\n placeholder?: string;\n required?: boolean;\n value?: moment.Moment;\n controlCssClass?: string;\n onChange: (newValue?: moment.Moment) => void;\n pastDatesSelectable?: boolean;\n showTodayButton: boolean;\n disabled?: boolean;\n}\n\ninterface State {\n isFocused: boolean;\n}\n\nclass DatePicker extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n isFocused: false\n };\n\n this.datePickerChanged = this.datePickerChanged.bind(this);\n }\n\n render() {\n let date: moment.Moment | null =\n this.props.value && this.props.value.isValid()\n ? this.props.value\n : null;\n\n return (\n
\n \n \n this.setState({\n isFocused:\n arg.focused === null ? false : arg.focused\n })\n }\n numberOfMonths={1}\n hideKeyboardShortcutsPanel={true}\n noBorder={true}\n block={true}\n readOnly={true}\n isOutsideRange={\n this.props.pastDatesSelectable === true\n ? () => false\n : undefined\n }\n isDayHighlighted={(day: moment.Moment) =>\n day.isSame(moment(), 'd')\n }\n disabled={this.props.disabled}\n />\n
\n {this.props.showTodayButton && (\n
\n this.setCurrentDate()}\n type=\"button\"\n >\n Today\n \n
\n )}\n
\n );\n }\n\n private datePickerChanged(date: moment.Moment | null) {\n this.props.onChange(date === null ? undefined : date);\n }\n\n private setCurrentDate() {\n this.props.onChange(setMomentToMidnight(moment()));\n }\n}\n\nexport default DatePicker;\n","import Globals from \"../globals\";\n\nexport interface Facility {\n id: string;\n regionId: string;\n regionName: string;\n name: string;\n streetAddress: string;\n suiteAddress: string;\n city: string;\n state: string;\n zipCode: string;\n}\n\nexport const defaultFacility: Facility = {\n id: Globals.GUID_PLACEHOLDER,\n name: '',\n regionId: '',\n regionName: '',\n streetAddress: '',\n suiteAddress: '',\n city: '',\n state: '',\n zipCode: ''\n};\n\n","import * as React from 'react';\nimport '../styles/Modal.css';\nimport { Region } from '../dtos/region';\nimport { Facility, defaultFacility } from '../dtos/facility';\nimport * as regionApi from '../api/api-region';\nimport { getUserRegionId, userIsRegional } from '../api/api-account';\nimport { BaseModal } from './modal-base';\nimport { LabeledInput } from '../components/labeledInput';\n\ninterface State {\n facility: Facility;\n regions: Region[];\n}\n\nexport interface Props {\n facility: Facility | null;\n isModalOpen: boolean;\n closeModal: () => void;\n addFacility: (facility: Facility, addNew: boolean) => void;\n}\n\nexport class AddEditFacilityModal extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n facility: {\n ...defaultFacility\n },\n regions: []\n };\n }\n\n componentDidMount() {\n this.getRegionsAsync();\n }\n\n componentWillReceiveProps(nextProps: Props) {\n if (!this.props.isModalOpen && nextProps.isModalOpen) {\n let facility: Facility;\n\n if (nextProps.facility) {\n facility = { ...nextProps.facility };\n } else {\n facility = { ...defaultFacility };\n }\n\n if (userIsRegional()) {\n facility.regionId = getUserRegionId();\n }\n\n this.setState({\n facility: facility\n });\n }\n }\n\n render() {\n return (\n \n
\n \n
\n \n \n this.onInputChange(\n f =>\n (f.name = event.currentTarget.value)\n )\n }\n tabIndex={1}\n autoFocus={true}\n />\n \n\n \n \n this.onInputChange(\n f =>\n (f.streetAddress = event.currentTarget.value)\n )\n }\n tabIndex={2}\n />\n \n \n \n this.onInputChange(\n f =>\n (f.suiteAddress = event.currentTarget.value)\n )\n }\n tabIndex={3}\n />\n \n \n \n this.onInputChange(\n f =>\n (f.city = event.currentTarget.value)\n )\n }\n tabIndex={4}\n />\n \n \n \n this.onInputChange(\n f =>\n (f.state = event.currentTarget.value)\n )\n }\n tabIndex={5}\n />\n \n \n \n this.onInputChange(\n f =>\n (f.zipCode = event.currentTarget.value)\n )\n }\n tabIndex={6}\n />\n \n \n \n this.onInputChange(\n f =>\n (f.regionId = event.currentTarget.value)\n )\n }\n tabIndex={7}\n disabled={\n this.props.facility !== null || userIsRegional()\n }\n >\n \n {this.state.regions.map(r => (\n \n ))}\n \n \n
\n
\n \n Confirm\n \n
\n
\n \n Cancel\n \n
\n
\n
\n \n );\n }\n\n private async getRegionsAsync() {\n let result = await regionApi.getRegionsAsync();\n\n if (result !== null && result !== undefined) {\n this.setState({\n regions: result\n });\n } else {\n console.log('Error caught in modal-AddFacility.getRegionsAsync().');\n alert('Error getting Regions.');\n }\n }\n\n private onInputChange = (operation: (facility: Facility) => void) => {\n const newItemState = { ...this.state.facility };\n operation(newItemState);\n this.setState({ facility: newItemState });\n };\n\n private handleConfirm = () => {\n this.props.addFacility(\n this.state.facility,\n this.props.facility === null\n );\n\n this.props.closeModal();\n };\n\n private handleCancel = () => {\n this.props.closeModal();\n };\n\n private facilityIsValid = () => {\n let nameIsValid = this.state.facility.name.length > 0;\n let regionIsValid =\n this.state.facility.regionId &&\n this.state.facility.regionId.length > 0;\n let streetAddressIsValid =\n this.state.facility.streetAddress &&\n this.state.facility.streetAddress.length > 0;\n let cityIsValid =\n this.state.facility.city && this.state.facility.city.length > 0;\n let stateIsValid =\n this.state.facility.state && this.state.facility.state.length > 0;\n let zipCodeIsValid =\n this.state.facility.zipCode &&\n this.state.facility.zipCode.length > 0;\n\n return (\n nameIsValid &&\n regionIsValid &&\n streetAddressIsValid &&\n cityIsValid &&\n stateIsValid &&\n zipCodeIsValid\n );\n };\n}\n","import * as React from 'react';\nimport 'react-table/react-table.css';\nimport * as TableStyles from '../styles/TableFormats';\nimport { Header } from '../components/header';\nimport ReactTable from 'react-table';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faPencilAlt, faTrashAlt } from '@fortawesome/free-solid-svg-icons';\nimport matchSorter from 'match-sorter';\nimport * as facilityApi from '../api/api-facility';\nimport { Facility } from '../dtos/facility';\nimport { GenericDeleteModal } from '../modals/modal-genericDelete';\nimport { AddEditFacilityModal } from '../modals/modal-addEditFacility';\nimport {\n userIsWebAdmin,\n userIsAdmin,\n userIsRegional\n} from '../api/api-account';\nimport SubscriptionBanner from '../components/subscriptionBanner';\n\ninterface State {\n facilities: Facility[];\n addModalIsOpen: boolean;\n facilityToEdit: Facility | null;\n deleteModalIsOpen: boolean;\n facilityToDelete: Facility | null;\n}\n\nexport interface Props {}\n\nexport class FacilitiesPage extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n facilities: [],\n addModalIsOpen: false,\n facilityToEdit: null,\n deleteModalIsOpen: false,\n facilityToDelete: null\n };\n }\n\n componentDidMount() {\n this.getFacilitiesAsync();\n }\n\n render() {\n return userIsWebAdmin() || userIsAdmin() || userIsRegional() ? (\n <>\n
\n
\n
Facilities
\n
\n
\n \n + Add Facility\n \n \n
\n
\n
\n
\n \n \n matchSorter([row[filter.id]], filter.value)\n .length !== 0\n }\n showPagination={this.state.facilities.length > 20}\n minRows={10}\n columns={[\n {\n Header: 'Name',\n id: 'name',\n accessor: f => f.name,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Street',\n id: 'street',\n accessor: f => f.streetAddress,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Suite',\n id: 'suite',\n accessor: f => f.suiteAddress,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'City',\n id: 'city',\n accessor: f => f.city,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'State',\n id: 'state',\n accessor: f => f.state,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Zip Code',\n id: 'zipCode',\n accessor: f => f.zipCode,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Region',\n id: 'region',\n accessor: f => f.regionName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100\n },\n {\n Header: '',\n width: 112,\n sortable: false,\n filterable: false,\n Cell: row => {\n let facility = row.original as Facility;\n return (\n
\n \n this.handleEdit(facility)\n }\n >\n \n \n \n this.handleDelete(facility)\n }\n >\n \n \n
\n );\n }\n }\n ]}\n className=\"-highlight\"\n />\n
\n \n \n ) : (\n <>\n
\n
\n
Facilities
\n
\n \n );\n }\n\n private getFacilitiesAsync = async () => {\n let getResult = await facilityApi.getFacilitiesAsync();\n\n if (getResult) {\n this.setState({\n ...this.state,\n facilities: getResult\n });\n } else {\n console.log(\n 'Error caught in page-facilities.getfacilitiesAsync().'\n );\n alert('Error getting facilities.');\n }\n };\n\n private addEditFacilityAsync = async (\n facility: Facility,\n addNew: boolean\n ) => {\n if (addNew) {\n let addResult = await facilityApi.addFacilityAsync(facility);\n\n if (addResult) {\n this.getFacilitiesAsync();\n } else {\n console.log(\n 'Error caught in page-facilities.addEditFacilityAsync().'\n );\n alert('Error adding facility');\n }\n } else {\n let editResult = await facilityApi.editFacilityAsync(facility);\n\n if (editResult) {\n this.getFacilitiesAsync();\n } else {\n console.log(\n 'Error caught in page-facilities.addEditFacilityAsync().'\n );\n alert('Error editing facility');\n }\n }\n\n this.closeAddModal();\n };\n\n private deleteFacilityAsync = async (facilityId: string) => {\n let deleteSuccess = await facilityApi.deleteFacilityAsync(facilityId);\n\n if (deleteSuccess) {\n this.getFacilitiesAsync();\n } else {\n console.log(\n 'Error caught in page-facilities.deleteFacilityAsync().'\n );\n alert('Error deleting facility');\n }\n\n this.closeDeleteModal();\n };\n\n private handleAdd = () => {\n this.setState({\n addModalIsOpen: true,\n facilityToEdit: null\n });\n };\n\n private handleEdit = (facility: Facility) => {\n this.setState({\n addModalIsOpen: true,\n facilityToEdit: facility\n });\n };\n\n private handleDelete = (facility: Facility) => {\n this.setState({\n deleteModalIsOpen: true,\n facilityToDelete: facility\n });\n };\n\n private closeAddModal = () => {\n this.setState({\n addModalIsOpen: false\n });\n };\n\n private closeDeleteModal = () => {\n this.setState({\n deleteModalIsOpen: false\n });\n };\n}\n","import * as React from 'react';\nimport '../styles/NavButton.css';\nimport { NavLink } from 'react-router-dom';\nimport '../styles/Card.css';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nexport interface Props {\n text: string;\n icon?: IconDefinition;\n path: string;\n}\n\nfunction NavCard({ text, icon, path }: Props) {\n return (\n \n
\n
{text}
\n
\n {icon && }\n
\n
\n
\n );\n}\n\nexport default NavCard;\n","export enum OperatorAccess {\n NoAccess = 0,\n Operator = 1000,\n Manager = 5000,\n BhsTechnician = 10000\n}\n","import * as React from 'react';\nimport '../styles/Headers.css';\nimport NavCard from '../components/navCard';\nimport { Header } from '../components/header';\nimport {\n userIsWebAdmin,\n userIsAdmin,\n userIsRegional\n} from '../api/api-account';\nimport {\n faIdCard,\n faUser,\n faSitemap,\n faBuilding,\n faGlobeAmericas,\n faBatteryHalf,\n faKey,\n faHandshake,\n faLock\n} from '@fortawesome/free-solid-svg-icons';\nimport SubscriptionBanner from '../components/subscriptionBanner';\n\nexport interface Props {}\n\ninterface State {}\n\nexport class AdminPage extends React.Component {\n render() {\n return (\n <>\n
\n
\n
Settings
\n
\n
\n \n
\n \n {userIsWebAdmin() && (\n \n )}\n {(userIsWebAdmin() || userIsAdmin()) && (\n \n )}\n {(userIsWebAdmin() ||\n userIsAdmin() ||\n userIsRegional()) && (\n \n )}\n \n \n \n {userIsWebAdmin() && (\n \n )}\n {userIsWebAdmin() && (\n \n )}\n
\n
\n \n );\n }\n}\n","import Globals from '../globals';\n\nexport interface Operator {\n id: string;\n facilityId: string;\n facilityName: string;\n name: string;\n pin: string;\n accessLevel: number;\n}\n\nexport const defaultOperator: Operator = {\n id: Globals.GUID_PLACEHOLDER,\n facilityId: '',\n facilityName: '',\n name: '',\n pin: '',\n accessLevel: -1\n};\n","import * as React from 'react';\nimport '../styles/Modal.css';\nimport { Facility } from '../dtos/facility';\nimport * as facilityApi from '../api/api-facility';\nimport { Operator, defaultOperator } from '../dtos/operator';\nimport { OperatorAccess } from '../enums/OperatorAccess';\nimport {\n userIsLocal,\n getUserFacilityId,\n userIsWebAdmin\n} from '../api/api-account';\nimport { BaseModal } from './modal-base';\nimport { LabeledInput } from '../components/labeledInput';\n\ninterface State {\n operator: Operator;\n facilities: Facility[];\n}\n\nexport interface Props {\n operator: Operator | null;\n isModalOpen: boolean;\n errorMsg: string;\n closeModal: () => void;\n addOperator: (operator: Operator, addNew: boolean) => void;\n}\n\nexport class AddEditOperatorModal extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n operator: { ...defaultOperator },\n facilities: []\n };\n }\n\n componentDidMount() {\n this.getFacilitiesAsync();\n }\n\n componentWillReceiveProps(nextProps: Props) {\n if (!this.props.isModalOpen && nextProps.isModalOpen) {\n let operator: Operator;\n\n if (nextProps.operator) {\n operator = { ...nextProps.operator };\n } else {\n operator = { ...defaultOperator };\n }\n\n if (userIsLocal()) {\n operator.facilityId = getUserFacilityId();\n }\n\n this.setState({\n operator: operator\n });\n }\n }\n\n render() {\n return (\n \n
\n \n
\n \n \n \n \n \n \n {this.state.facilities.map(f => (\n \n ))}\n \n \n \n \n \n
\n \n
    \n
  • Be a minimum of 1 character
  • \n
  • Be a maximum of 8 characters
  • \n
  • Only contain numeric digits (e.g. 0-9)
  • \n
\n
\n \n \n \n {Object.keys(OperatorAccess)\n // Remove the option to select BhsTechnician\n // if the logged in user is not a WebAdmin\n .filter(key =>\n userIsWebAdmin()\n ? key\n : Number(key) !==\n OperatorAccess.BhsTechnician\n )\n .filter(key => !isNaN(Number(key)))\n .map(key => {\n let operatorAccessValue = Number(key);\n return (\n \n {OperatorAccess[key]}\n \n );\n })}\n \n \n \n
\n
\n \n Confirm\n \n
\n
\n \n Cancel\n \n
\n
\n
\n \n );\n }\n\n private async getFacilitiesAsync() {\n let result = await facilityApi.getFacilitiesAsync();\n\n if (result) {\n this.setState({\n facilities: result\n });\n } else {\n console.log('Error caught in modal-AddUser.getFacilitiesAsync().');\n alert('Error getting Facilities.');\n }\n }\n\n private inputChange = (\n e:\n | React.SyntheticEvent\n | React.SyntheticEvent,\n parseValueAsInt: boolean = false\n ) => {\n let operator = { ...this.state.operator };\n let value = parseValueAsInt\n ? parseInt(e.currentTarget.value, 10)\n : e.currentTarget.value;\n\n operator[e.currentTarget.name] = value;\n\n return operator;\n };\n\n private onInputChange = (\n e:\n | React.SyntheticEvent\n | React.SyntheticEvent\n ) => {\n let operator = this.inputChange(e);\n\n this.setState({\n operator: operator\n });\n };\n\n private onAccessLevelChange = (\n e: React.SyntheticEvent\n ) => {\n let operator = this.inputChange(e, true);\n\n this.setState({\n operator: operator\n });\n };\n\n private handleConfirm = () => {\n this.props.addOperator(\n this.state.operator,\n this.props.operator === null\n );\n };\n\n private handleCancel = () => {\n this.props.closeModal();\n };\n\n private operatorIsValid = () => {\n let nameIsValid = this.state.operator.name.length > 0;\n let facilityIsValid = this.state.operator.facilityId.length > 0;\n let accessIsValid =\n this.state.operator.accessLevel === OperatorAccess.BhsTechnician ||\n this.state.operator.accessLevel === OperatorAccess.Manager ||\n this.state.operator.accessLevel === OperatorAccess.NoAccess ||\n this.state.operator.accessLevel === OperatorAccess.Operator;\n\n let pinRegex = /^\\d{1,8}$/;\n let pinIsValid = pinRegex.test(this.state.operator.pin);\n\n return nameIsValid && facilityIsValid && pinIsValid && accessIsValid;\n };\n}\n","import * as React from 'react';\nimport 'react-table/react-table.css';\nimport * as TableStyles from '../styles/TableFormats';\nimport { Header } from '../components/header';\nimport ReactTable from 'react-table';\nimport matchSorter from 'match-sorter';\nimport * as operatorApi from '../api/api-operator';\nimport { Operator } from '../dtos/operator';\nimport { GenericDeleteModal } from '../modals/modal-genericDelete';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faTrashAlt, faPencilAlt } from '@fortawesome/free-solid-svg-icons';\nimport { AddEditOperatorModal } from '../modals/modal-addEditOperator';\nimport { OperatorAccess } from '../enums/OperatorAccess';\nimport { ApiResult } from '../api/api-shared';\nimport SubscriptionBanner from '../components/subscriptionBanner';\n\ninterface State {\n operators: Operator[];\n addModalIsOpen: boolean;\n addEditErrorMsg: string;\n operatorToEdit: Operator | null;\n deleteModalIsOpen: boolean;\n operatorToDelete: Operator | null;\n}\n\nexport interface Props {}\n\nexport class OperatorsPage extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n operators: [],\n addModalIsOpen: false,\n addEditErrorMsg: '',\n operatorToEdit: null,\n deleteModalIsOpen: false,\n operatorToDelete: null\n };\n }\n\n componentDidMount() {\n this.getFilteredOperatorsAsync();\n }\n\n render() {\n return (\n <>\n
\n
\n
Operators
\n
\n
\n \n + Add Operator\n \n \n
\n
\n
\n
\n \n \n matchSorter([row[filter.id]], filter.value)\n .length !== 0\n }\n showPagination={this.state.operators.length > 20}\n minRows={10}\n columns={[\n {\n Header: 'Name',\n id: 'name',\n accessor: o => o.name,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Facility',\n id: 'facility',\n accessor: o => o.facilityName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Pin',\n id: 'pin',\n accessor: o => o.pin,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: 'Access Level',\n id: 'accessLevel',\n accessor: o => OperatorAccess[o.accessLevel],\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 200\n },\n {\n Header: '',\n width: 112,\n sortable: false,\n filterable: false,\n Cell: row => {\n let operator = row.original as Operator;\n return (\n
\n \n this.handleEdit(operator)\n }\n >\n \n \n \n this.handleDelete(operator)\n }\n >\n \n \n
\n );\n }\n }\n ]}\n className=\"-highlight\"\n />\n
\n \n \n );\n }\n\n private getFilteredOperatorsAsync = async () => {\n let getResult = await operatorApi.getFilteredOperatorsAsync();\n\n if (getResult) {\n this.setState({\n ...this.state,\n operators: getResult\n });\n } else {\n console.log('Error caught in page-operators.getOperatorsAsync().');\n alert('Error getting operators.');\n }\n };\n\n private addEditOperatorAsync = async (\n operator: Operator,\n addNew: boolean\n ) => {\n let apiResult: ApiResult = {\n success: true,\n data: undefined,\n error: undefined\n };\n\n if (addNew) {\n apiResult = await operatorApi.addOperatorAsync(operator);\n } else {\n apiResult = await operatorApi.editOperatorAsync(operator);\n }\n\n if (apiResult.success) {\n this.getFilteredOperatorsAsync();\n this.closeAddModal();\n } else {\n let errorResult = apiResult.error;\n this.setState({\n addEditErrorMsg: errorResult\n ? errorResult.message\n : 'No error detail available.'\n });\n }\n };\n\n private softDeleteOperatorAsync = async (operatorId: string) => {\n let deleteSuccess = await operatorApi.softDeleteOperatorAsync(\n operatorId\n );\n\n if (deleteSuccess) {\n this.getFilteredOperatorsAsync();\n } else {\n console.log(\n 'Error caught in page-operators.deleteOperatorsAsync().'\n );\n alert('Error deleting operator');\n }\n\n this.closeDeleteModal();\n };\n\n private handleAdd = () => {\n this.setState({\n addModalIsOpen: true,\n operatorToEdit: null\n });\n };\n\n private handleEdit = (operator: Operator) => {\n this.setState({\n addModalIsOpen: true,\n operatorToEdit: operator\n });\n };\n\n private handleDelete = (operator: Operator) => {\n this.setState({\n deleteModalIsOpen: true,\n operatorToDelete: operator\n });\n };\n\n private closeAddModal = () => {\n this.setState({\n addModalIsOpen: false,\n addEditErrorMsg: ''\n });\n };\n\n private closeDeleteModal = () => {\n this.setState({\n deleteModalIsOpen: false\n });\n };\n}\n","import * as React from 'react';\nimport 'react-table/react-table.css';\nimport { Header } from '../components/header';\nimport { getUserReportUrl } from '../api/api-account';\nimport { stringIsNullOrEmpty } from '../functions/general';\nimport SubscriptionBanner from '../components/subscriptionBanner';\n\ninterface State {}\n\nexport interface Props {}\n\nexport class ReportsPage extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {};\n }\n\n componentDidMount() {}\n\n render() {\n let reportUrl = getUserReportUrl();\n\n return (\n <>\n
\n
\n
Reports
\n
\n
\n \n {stringIsNullOrEmpty(reportUrl) ? (\n
\n \n
\n ) : (\n
\n \n
\n )}\n
\n \n );\n }\n}\n","import Globals from '../globals';\n\nexport interface Subscription {\n id: string;\n assetId: string;\n assetName: string;\n facilityId: string;\n facilityName: string;\n groupId: string;\n groupName: string;\n regionId: string;\n regionName: string;\n serialNumber: string;\n purchaseOrderNumber: string;\n salesOrderNumber: string;\n trialSubscription: boolean;\n startDate: Date | null;\n endDate: Date | null;\n}\n\nexport const defaultSubscription: Subscription = {\n id: Globals.GUID_PLACEHOLDER,\n assetId: '',\n assetName: '',\n facilityId: '',\n facilityName: '',\n groupId: '',\n groupName: '',\n regionId: '',\n regionName: '',\n serialNumber: '',\n purchaseOrderNumber: '',\n salesOrderNumber: '',\n trialSubscription: false,\n startDate: null,\n endDate: null\n};\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faCircleNotch } from '@fortawesome/free-solid-svg-icons';\n\nconst LoadingSpinner = () => {\n return (\n \n );\n};\n\nexport default LoadingSpinner;\n","import * as React from 'react';\nimport '../styles/Modal.css';\nimport { Group } from '../dtos/group';\nimport { Region } from '../dtos/region';\nimport * as groupApi from '../api/api-group';\nimport * as regionApi from '../api/api-region';\nimport * as assetApi from '../api/api-asset';\nimport * as facilityApi from '../api/api-facility';\nimport { BaseModal } from './modal-base';\nimport { LabeledInput } from '../components/labeledInput';\nimport { Subscription, defaultSubscription } from '../dtos/subscription';\nimport { Asset } from '../dtos/asset';\nimport { Facility } from '../dtos/facility';\nimport DatePicker from '../components/datePicker';\nimport moment from 'moment';\nimport { setMomentToMidnight } from '../functions/general';\nimport LoadingSpinner from '../components/loadingSpinner';\n\ninterface State {\n subscription: Subscription;\n assets: Asset[];\n facilities: Facility[];\n groups: Group[];\n regions: Region[];\n isLoading: boolean;\n}\n\ninterface Props {\n subscription: Subscription | null;\n isModalOpen: boolean;\n errorMsg: string | null;\n closeModal: () => void;\n addEditSubscription: (subscription: Subscription, addNew: boolean) => void;\n}\n\nexport class AddEditSubscriptionModal extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n subscription: { ...defaultSubscription },\n assets: [],\n facilities: [],\n regions: [],\n groups: [],\n isLoading: false\n };\n }\n\n componentDidMount() {\n this.getGroupsAsync();\n this.getRegionsAsync();\n this.getAssetsAsync();\n this.getFacilitiesAsync();\n }\n\n componentWillReceiveProps(nextProps: Props) {\n if (!this.props.isModalOpen && nextProps.isModalOpen) {\n let subscription: Subscription;\n\n if (nextProps.subscription) {\n subscription = { ...nextProps.subscription };\n } else {\n subscription = { ...defaultSubscription };\n }\n\n this.setState({\n ...this.state,\n subscription: subscription\n });\n }\n }\n\n private getGroupsAsync = async () => {\n let result = await groupApi.getGroupsAsync();\n\n if (result) {\n this.setState({\n groups: result\n });\n } else {\n console.log(\n 'Error caught in modal-AddEditSubscriptions.getGroupsAsync().'\n );\n alert('Error getting groups.');\n }\n };\n\n private getRegionsAsync = async () => {\n let result = await regionApi.getRegionsAsync();\n\n if (result !== null && result !== undefined) {\n this.setState({\n regions: result\n });\n } else {\n console.log(\n 'Error caught in modal-AddEditSubscriptions.getRegionsAsync().'\n );\n alert('Error getting regions.');\n }\n };\n\n private getAssetsAsync = async () => {\n let result = await assetApi.getAssetsAsync();\n\n if (result !== null && result !== undefined) {\n this.setState({\n assets: result\n });\n } else {\n console.log(\n 'Error caught in modal-AddEditSubscriptions.getAssetsAsync().'\n );\n alert('Error getting assets.');\n }\n };\n\n private getFacilitiesAsync = async () => {\n let result = await facilityApi.getFacilitiesAsync();\n\n if (result !== null && result !== undefined) {\n this.setState({\n facilities: result\n });\n } else {\n console.log(\n 'Error caught in modal-AddEditSubscriptions.getFacilitiesAsync().'\n );\n alert('Error getting facilities.');\n }\n };\n\n private get subscriptionIsValid() {\n const { subscription } = this.state;\n\n return (\n subscription.startDate &&\n subscription.endDate &&\n subscription.startDate <= subscription.endDate &&\n subscription.groupId &&\n subscription.regionId &&\n subscription.facilityId &&\n subscription.assetId &&\n (subscription.trialSubscription ||\n (subscription.purchaseOrderNumber &&\n subscription.salesOrderNumber))\n );\n }\n\n private onInputChange = (\n operation: (subscription: Subscription) => void\n ) => {\n const newItemState = { ...this.state.subscription };\n operation(newItemState);\n this.setState({ subscription: newItemState });\n };\n\n private handleConfirm = async () => {\n if (this.subscriptionIsValid) {\n this.setState({ isLoading: true });\n\n await this.props.addEditSubscription(\n this.state.subscription,\n this.props.subscription === null\n );\n\n this.setState({ isLoading: false });\n }\n };\n\n private handleCancel = () => {\n this.props.closeModal();\n };\n\n render() {\n return (\n \n
\n \n
\n \n \n this.onInputChange(\n s =>\n (s.startDate = event\n ? setMomentToMidnight(\n event\n ).toDate()\n : null)\n )\n }\n showTodayButton={!this.props.subscription}\n pastDatesSelectable={true}\n disabled={!!this.props.subscription}\n />\n \n \n \n this.onInputChange(\n s =>\n (s.endDate = event\n ? setMomentToMidnight(\n event\n ).toDate()\n : null)\n )\n }\n showTodayButton={!this.props.subscription}\n pastDatesSelectable={true}\n disabled={!!this.props.subscription}\n />\n \n \n \n this.onInputChange(\n f => (\n (f.groupId = event.currentTarget.value),\n (f.regionId = ''),\n (f.facilityId = ''),\n (f.assetId = '')\n )\n )\n }\n disabled={!!this.props.subscription}\n >\n \n {this.state.groups.map(g => (\n \n ))}\n \n \n \n \n this.onInputChange(\n f => (\n (f.regionId =\n event.currentTarget.value),\n (f.facilityId = ''),\n (f.assetId = '')\n )\n )\n }\n disabled={\n !this.state.subscription.groupId ||\n !!this.props.subscription\n }\n >\n \n {this.state.regions\n .filter(\n r =>\n r.groupId ===\n this.state.subscription.groupId\n )\n .map(r => (\n \n ))}\n \n \n \n \n this.onInputChange(\n f => (\n (f.facilityId =\n event.currentTarget.value),\n (f.assetId = '')\n )\n )\n }\n disabled={\n !this.state.subscription.regionId ||\n !!this.props.subscription\n }\n >\n \n {this.state.facilities\n .filter(\n f =>\n f.regionId ===\n this.state.subscription.regionId\n )\n .map(f => (\n \n ))}\n \n \n \n \n this.onInputChange(\n f => (f.assetId = event.currentTarget.value)\n )\n }\n disabled={\n !this.state.subscription.facilityId ||\n !!this.props.subscription\n }\n >\n \n {this.state.assets\n .filter(\n a =>\n a.facilityId ===\n this.state.subscription.facilityId\n )\n .map(a => (\n \n ))}\n \n \n \n \n this.onInputChange(\n f =>\n (f.purchaseOrderNumber =\n event.currentTarget.value)\n )\n }\n />\n \n \n \n this.onInputChange(\n f =>\n (f.salesOrderNumber =\n event.currentTarget.value)\n )\n }\n />\n \n \n \n this.onInputChange(\n s =>\n (s.trialSubscription =\n event.currentTarget.checked)\n )\n }\n />\n \n {this.props.errorMsg && (\n \n )}\n\n {this.state.isLoading && (\n
\n \n
\n )}\n\n
\n
\n \n Confirm\n \n
\n
\n \n Cancel\n \n
\n
\n
\n \n );\n }\n}\n","import { httpRequestAsync, ApiResult } from './api-shared';\nimport { BASE_URL, SUBSCRIPTION_URL } from './urls';\nimport { Subscription } from '../dtos/subscription';\n\nexport const getSubscriptionsAsync = async () => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${SUBSCRIPTION_URL}`\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as Subscription[];\n } else {\n console.log(httpResponse.error!.message);\n return [];\n }\n};\n\nexport const addSubscriptionAsync = async (\n subscription: Subscription\n): Promise> => {\n let apiResult: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${SUBSCRIPTION_URL}`,\n 'post',\n subscription\n );\n\n return apiResult;\n};\n\nexport const editSubscriptionAsync = async (\n subscription: Subscription\n): Promise> => {\n let apiResult: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${SUBSCRIPTION_URL}`,\n 'put',\n subscription\n );\n\n return apiResult;\n};\n\nexport const deleteSubscriptionAsync = async (\n subscriptionId: string\n): Promise => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${SUBSCRIPTION_URL}/${subscriptionId}`,\n 'delete'\n );\n\n if (!httpResponse.success) {\n console.log(\n 'Error Deleting Subscription ' +\n subscriptionId +\n ', cause: ' +\n httpResponse.error!.message\n );\n }\n\n return httpResponse.success;\n};\n","import React from 'react';\nimport { Subscription } from '../dtos/subscription';\nimport { Header } from '../components/header';\nimport { userIsWebAdmin } from '../api/api-account';\nimport { AddEditSubscriptionModal } from '../modals/modal-addEditSubscription';\nimport ReactTable from 'react-table';\nimport matchSorter from 'match-sorter';\nimport { formatDateTime } from '../functions/general';\nimport * as TableStyles from '../styles/TableFormats';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faPencilAlt, faTrashAlt } from '@fortawesome/free-solid-svg-icons';\nimport { GenericDeleteModal } from '../modals/modal-genericDelete';\nimport * as subscriptionApi from '../api/api-subscription';\nimport SubscriptionBanner from '../components/subscriptionBanner';\nimport moment from 'moment';\n\ninterface State {\n subscriptions: Subscription[];\n addEditModalIsOpen: boolean;\n addEditErrorMsg: string | null;\n subscriptionToEdit: Subscription | null;\n deleteModalIsOpen: boolean;\n subscriptionToDelete: Subscription | null;\n userCanEdit: boolean;\n}\n\nexport interface Props {}\n\nexport class SubscriptionsPage extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n subscriptions: [],\n addEditModalIsOpen: false,\n addEditErrorMsg: null,\n subscriptionToEdit: null,\n deleteModalIsOpen: false,\n subscriptionToDelete: null,\n userCanEdit: userIsWebAdmin()\n };\n }\n\n componentDidMount() {\n this.getSubscriptionsAsync();\n }\n\n private getSubscriptionsAsync = async () => {\n var getResult = await subscriptionApi.getSubscriptionsAsync();\n\n if (getResult) {\n this.setState({\n ...this.state,\n subscriptions: getResult\n });\n } else {\n console.log(\n 'Error caught in page-subscriptions.getSubscriptionsAsync().'\n );\n alert('Error getting subscriptions.');\n }\n };\n\n private addEditSubscriptionAsync = async (\n subscription: Subscription,\n addNew: boolean\n ) => {\n this.setState({ addEditErrorMsg: null });\n\n var response = addNew\n ? await subscriptionApi.addSubscriptionAsync(subscription)\n : await subscriptionApi.editSubscriptionAsync(subscription);\n\n if (response.success) {\n await this.getSubscriptionsAsync();\n this.closeAddEditModal();\n } else {\n this.setState({\n addEditErrorMsg: response.error\n ? response.error.message\n : 'No error detail available.'\n });\n }\n };\n\n private deleteSubscriptionAsync = async (id: string) => {\n var deleteSuccess = await subscriptionApi.deleteSubscriptionAsync(id);\n\n if (deleteSuccess) {\n await this.getSubscriptionsAsync();\n } else {\n console.log(\n 'Error caught in page-subscriptions.deleteSubscriptionAsync().'\n );\n alert('Error deleting subscription');\n }\n\n this.closeDeleteModal();\n };\n\n private handleAdd = () => {\n this.setState({\n ...this.state,\n addEditModalIsOpen: true,\n subscriptionToEdit: null\n });\n };\n\n private handleEdit = (subscription: Subscription) => {\n this.setState({\n ...this.state,\n addEditModalIsOpen: true,\n subscriptionToEdit: subscription\n });\n };\n\n private handleDelete = (subscription: Subscription) => {\n this.setState({\n deleteModalIsOpen: true,\n subscriptionToDelete: subscription\n });\n };\n\n private closeAddEditModal = () => {\n this.setState({\n ...this.state,\n addEditModalIsOpen: false,\n addEditErrorMsg: null\n });\n };\n\n private closeDeleteModal = () => {\n this.setState({\n ...this.state,\n deleteModalIsOpen: false\n });\n };\n\n private subscriptionIsActive(subscription: Subscription) {\n let currentTimeUtc = moment.utc().toDate();\n\n return subscription.endDate &&\n subscription.startDate &&\n subscription.endDate > currentTimeUtc &&\n subscription.startDate < currentTimeUtc\n ? 'Yes'\n : 'No';\n }\n\n render() {\n return (\n <>\n
\n
\n
Subscriptions
\n
\n
\n {this.state.userCanEdit && (\n \n + Add Subscription\n \n )}\n \n
\n
\n
\n
\n \n \n matchSorter([row[filter.id]], filter.value)\n .length !== 0\n }\n showPagination={this.state.subscriptions.length > 20}\n minRows={10}\n columns={[\n {\n Header: 'Start Date',\n id: 'startDate',\n accessor: s =>\n s.startDate\n ? formatDateTime(s.startDate, true)\n : 'No Start Date',\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 120\n },\n {\n Header: 'End Date',\n id: 'endDate',\n accessor: s =>\n s.endDate\n ? formatDateTime(s.endDate, true)\n : 'No End Date',\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 150\n },\n {\n Header: 'Group Name',\n id: 'groupName',\n accessor: s => s.groupName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 150\n },\n {\n Header: 'Region Name',\n id: 'regionName',\n accessor: s => s.regionName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100\n },\n {\n Header: 'Facility Name',\n id: 'facilityName',\n accessor: s => s.facilityName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 150\n },\n {\n Header: 'Asset Model',\n id: 'assetModel',\n accessor: s => s.assetName,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100\n },\n {\n Header: 'Serial Number',\n id: 'status',\n accessor: s => s.serialNumber,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 130\n },\n {\n Header: 'Active',\n id: 'active',\n accessor: s => this.subscriptionIsActive(s),\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 100\n },\n {\n Header: '',\n width: 112,\n sortable: false,\n filterable: false,\n show: this.state.userCanEdit,\n Cell: row => {\n let subscription = row.original as Subscription;\n return (\n
\n \n this.handleEdit(\n subscription\n )\n }\n >\n \n \n \n this.handleDelete(\n subscription\n )\n }\n >\n \n \n
\n );\n }\n }\n ]}\n className=\"-highlight\"\n />\n
\n \n \n );\n }\n}\n","import { httpRequestAsync } from './api-shared';\nimport { BASE_URL, SUBSCRIPTION_AGREEMENT_URL } from './urls';\nimport { SubscriptionAgreement } from '../dtos/subscriptionAgreement';\n\nexport const getSubscriptionAgreementsAsync = async () => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${SUBSCRIPTION_AGREEMENT_URL}`,\n 'get'\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as SubscriptionAgreement[];\n } else {\n console.log(\n httpResponse.error?.message ??\n 'Unknown error occurred while fetching subscription agreements.'\n );\n throw httpResponse.error;\n }\n};\n\nexport const updateVersionAsync = async (version: string) => {\n var httpResponse = await httpRequestAsync(\n `${BASE_URL}/${SUBSCRIPTION_AGREEMENT_URL}`,\n 'put',\n version\n );\n\n if (!httpResponse.success) {\n console.log(\n httpResponse.error?.message ??\n 'Unknown error occurred while updating subscription agreement version.'\n );\n }\n\n return httpResponse;\n};\n\nexport const getCurrentVersionAsync = async () => {\n let httpResponse = await httpRequestAsync(\n `${BASE_URL}/${SUBSCRIPTION_AGREEMENT_URL}/currentversion`,\n 'get'\n );\n\n if (httpResponse.success && httpResponse.data) {\n return httpResponse.data as string;\n } else {\n console.log('Error fetching current subscription agreement version.');\n throw httpResponse.error;\n }\n};\n\nexport const createSubscriptionAgreement = async () =>\n httpRequestAsync(`${BASE_URL}/${SUBSCRIPTION_AGREEMENT_URL}`, 'post');\n","import * as React from 'react';\nimport '../styles/Modal.css';\nimport { BaseModal } from './modal-base';\nimport { LabeledInput } from '../components/labeledInput';\nimport { ApiResult } from '../api/api-shared';\n\ninterface State {\n newSubscriptionAgreementVersion: string;\n}\n\ninterface Props {\n isModalOpen: boolean;\n currentSubscriptionAgreementVersion: string;\n updateSubscriptionAgreementVersion: (\n version: string\n ) => Promise>;\n closeModal: () => void;\n errorMsg: string;\n}\n\nexport class UpdateSubscriptionAgreementModal extends React.Component<\n Props,\n State\n> {\n constructor(props: Props) {\n super(props);\n this.state = {\n newSubscriptionAgreementVersion: ''\n };\n }\n\n private handleConfirm = async () => {\n var response = await this.props.updateSubscriptionAgreementVersion(\n this.state.newSubscriptionAgreementVersion\n );\n\n // if the emails fail to send, but the version is updated,\n // we still want to reset the subscription agreement version\n if (response.success || response.data) {\n this.setState({\n newSubscriptionAgreementVersion: ''\n });\n }\n };\n\n private handleCancel = () => {\n this.setState({\n newSubscriptionAgreementVersion: ''\n });\n this.props.closeModal();\n };\n\n private get newVersionIsValid() {\n return !!this.state.newSubscriptionAgreementVersion;\n }\n\n render() {\n return (\n \n
\n \n
\n \n
\n {this.props.currentSubscriptionAgreementVersion}\n
\n
\n \n \n this.setState({\n newSubscriptionAgreementVersion:\n event.currentTarget.value\n })\n }\n />\n \n {this.props.errorMsg && (\n \n )}\n\n
\n
\n \n Confirm\n \n
\n
\n \n Cancel\n \n
\n
\n
\n \n );\n }\n}\n","import * as React from 'react';\nimport { SubscriptionAgreement } from '../dtos/subscriptionAgreement';\nimport { userIsWebAdmin } from '../api/api-account';\nimport { Header } from '../components/header';\nimport ReactTable from 'react-table';\nimport matchSorter from 'match-sorter';\nimport * as TableStyles from '../styles/TableFormats';\nimport * as subscriptionAgreementApi from '../api/api-subscriptionAgreement';\nimport { formatDateTime } from '../functions/general';\nimport { UpdateSubscriptionAgreementModal } from '../modals/modal-updateSubscriptionAgreement';\nimport * as subscriptionAgreementsApi from '../api/api-subscriptionAgreement';\nimport SubscriptionBanner from '../components/subscriptionBanner';\n\ninterface State {\n subscriptionAgreements: SubscriptionAgreement[];\n updateVersionModalIsOpen: boolean;\n currentVersion: string;\n errorMsg: string;\n}\n\nexport interface Props {}\n\nexport class SubscriptionAgreementsPage extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n subscriptionAgreements: [],\n updateVersionModalIsOpen: false,\n currentVersion: '',\n errorMsg: ''\n };\n }\n\n componentDidMount() {\n if (userIsWebAdmin()) {\n this.getSubscriptionAgreementsAsync();\n this.getCurrentVersionAsync();\n }\n }\n\n private handleUpdate = () => {\n this.setState({\n updateVersionModalIsOpen: true\n });\n };\n\n private closeUpdateModal = () => {\n this.setState({\n updateVersionModalIsOpen: false,\n errorMsg: ''\n });\n };\n\n private async getSubscriptionAgreementsAsync() {\n var response = await subscriptionAgreementApi.getSubscriptionAgreementsAsync();\n\n if (response) {\n this.setState({\n ...this.state,\n subscriptionAgreements: response\n });\n } else {\n console.log(\n 'Error caught in page-subscriptionAgreement.getAllSubscriptionAgreementsAsync()'\n );\n alert('Error getting subscription agreements');\n }\n }\n\n private getCurrentVersionAsync = async () => {\n const currentVersion = await subscriptionAgreementsApi.getCurrentVersionAsync();\n\n if (currentVersion) {\n this.setState({\n ...this.state,\n currentVersion: currentVersion\n });\n } else {\n console.log(\n 'Error caught in page-subscriptionAgreement.getCurrentVersionAsync()'\n );\n alert('Error getting subscription agreement version');\n }\n };\n\n private updateVersionAsync = async (version: string) => {\n this.setState({\n errorMsg: ''\n });\n var response = await subscriptionAgreementsApi.updateVersionAsync(\n version\n );\n\n if (response.success && response.data) {\n this.setState({\n currentVersion: response.data as string\n });\n this.closeUpdateModal();\n } else {\n this.setState({\n errorMsg:\n response.error?.message ??\n 'Unknown error occurred while updating subscription agreement version',\n // Still need to update the subscription agreement version here, because there is a case\n // in which the agreement is updated but the notification emails fail to send. We want to\n // notify the user that something went wrong but still update the version in the UI\n currentVersion: response.data\n ? (response.data as string)\n : this.state.currentVersion\n });\n }\n return response;\n };\n\n render() {\n return userIsWebAdmin() ? (\n <>\n
\n
\n
\n Subscription Agreements\n
\n
\n
\n
\n
{`Current version: ${this.state.currentVersion}`}
\n {userIsWebAdmin() && (\n \n Update Version\n \n )}\n
\n \n
\n
\n
\n
\n \n \n matchSorter([row[filter.id]], filter.value)\n .length !== 0\n }\n showPagination={\n this.state.subscriptionAgreements.length > 20\n }\n minRows={10}\n columns={[\n {\n Header: 'User',\n id: 'username',\n accessor: a => a.username,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 120\n },\n {\n Header: 'Accepted Date',\n id: 'acceptedDate',\n accessor: a => formatDateTime(a.acceptedDate),\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 150\n },\n {\n Header: 'Version',\n id: 'version',\n accessor: a => a.version,\n headerStyle: TableStyles.columnHeaderStyle,\n style: TableStyles.dataStyle,\n minWidth: 150\n }\n ]}\n className=\"-highlight\"\n />\n
\n \n ) : (\n <>\n
\n
\n
\n Subscription Agreements\n
\n
\n \n );\n }\n}\n","import * as React from 'react';\nimport '../styles/Login.css';\nimport headerLogo from '../images/header-logo-white.png';\nimport { Redirect } from 'react-router';\nimport { createSubscriptionAgreement } from '../api/api-subscriptionAgreement';\nimport { saveTokenData } from '../api/api-account';\n\ninterface State {\n agreesToSubscription: boolean;\n agreementUpdated: boolean;\n}\n\nexport interface Props {}\n\nexport default class TermsAndConditionsPage extends React.Component<\n Props,\n State\n> {\n constructor(props: Props) {\n super(props);\n this.state = {\n agreesToSubscription: false,\n agreementUpdated: false\n };\n }\n\n handleAgree = async () => {\n this.setState(previous => ({\n agreesToSubscription: !previous.agreesToSubscription\n }));\n };\n\n handleConfirm = async () => {\n const apiResponse = await createSubscriptionAgreement();\n\n if (apiResponse.success) {\n saveTokenData(apiResponse.data as string);\n this.setState({\n agreementUpdated: true\n });\n } else {\n window.alert(\n `Failed to agree to subscription agreement: ${apiResponse.error?.message}`\n );\n }\n };\n\n render() {\n return this.state.agreementUpdated ? (\n \n ) : (\n
\n
\n
\n
\n \n
\n\n \n\n
\n
\n this.handleAgree()}\n />\n
\n
\n I have read and agree to the{' '}\n \n terms and conditions.\n \n
\n
\n
\n this.handleConfirm()}\n >\n Continue\n \n
\n
\n
\n
\n );\n }\n}\n","import { httpRequestAsync, ApiResult } from './api-shared';\nimport { BASE_URL, STATISTIC_URL } from './urls';\nimport { AlarmStatistic } from '../dtos/alarmStatistic';\nimport { AssetStatistic } from '../dtos/assetStatistic';\n\nexport const getAssetStatisticsAsync = async (\n assetId: string\n): Promise> => {\n let apiResult: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${STATISTIC_URL}/asset/${assetId}`,\n 'get'\n );\n\n return apiResult;\n};\n\nexport const getAlarmStatisticsAsync = async (\n assetId: string\n): Promise> => {\n let apiResult: ApiResult = await httpRequestAsync(\n `${BASE_URL}/${STATISTIC_URL}/alarm/${assetId}`,\n 'get'\n );\n\n return apiResult;\n};\n","import * as React from 'react';\n\ninterface AssetStatisticPanelProps {\n title: string;\n children: React.ReactNode;\n}\n\nexport const AssetStatisticsPanel = ({\n title,\n children\n}: AssetStatisticPanelProps) => (\n
\n
{title}
\n
{children}
\n
\n);\n","import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport ReactTooltip from 'react-tooltip';\nimport { faCircle as faSolidCircle } from '@fortawesome/free-solid-svg-icons';\nimport { StatisticIndicatorLevel } from '../enums/statisticIndicatorLevel';\nimport { indicatorColor } from '../functions/general';\n\nexport interface IndicatorWithTooltipProps {\n indicatorLevel: StatisticIndicatorLevel | undefined | null;\n tooltipText: string | undefined;\n tooltipId: string;\n}\n\nconst IndicatorWithTooltip = ({\n indicatorLevel,\n tooltipText,\n tooltipId\n}: IndicatorWithTooltipProps) => {\n const dateTimeNow = Date.now();\n const fullTooltipId = `tooltip-${tooltipId}-${dateTimeNow}`;\n\n return (\n <>\n \n \n {tooltipText}\n \n \n );\n};\n\nexport default IndicatorWithTooltip;\n","import { StatisticIndicatorLevel } from '../enums/statisticIndicatorLevel';\nimport React from 'react';\nimport IndicatorWithTooltip from './indicatorWithTooltip';\n\ninterface AssetStatisticRowProps {\n name: string;\n description?: string;\n indicatorLevel?: StatisticIndicatorLevel | null;\n tooltip?: string;\n}\n\nexport class AssetStatisticRow extends React.Component<\n AssetStatisticRowProps,\n {}\n> {\n render() {\n const { name, description, indicatorLevel, tooltip } = this.props;\n const assetStatRowDescription = description\n ? description\n : indicatorLevelText(indicatorLevel);\n const showTooltip = indicatorLevel && (indicatorLevel === StatisticIndicatorLevel.Critical || indicatorLevel === StatisticIndicatorLevel.Warning);\n return (\n
\n {`${name}: `}\n \n {assetStatRowDescription}\n \n\n {(indicatorLevel === 0 || indicatorLevel) && (\n \n \n \n )}\n
\n );\n }\n}\n\nconst indicatorLevelText = (\n indicatorLevel: StatisticIndicatorLevel | undefined | null\n) => {\n switch (indicatorLevel) {\n case StatisticIndicatorLevel.Ok:\n return 'Ok';\n case StatisticIndicatorLevel.Warning:\n return 'Warning';\n case StatisticIndicatorLevel.Critical:\n return 'Active Alarm';\n case StatisticIndicatorLevel.Na:\n return \"N/A\";\n case StatisticIndicatorLevel.None:\n default:\n return 'No Information';\n }\n};\n","import * as React from 'react';\nimport * as linq from 'linq';\nimport moment from 'moment';\nimport '../styles/Headers.css';\nimport { Header } from '../components/header';\nimport SubscriptionBanner from '../components/subscriptionBanner';\nimport { Asset } from '../dtos/asset';\nimport { AssetStatistic } from '../dtos/assetStatistic';\nimport { AlarmStatistic } from '../dtos/alarmStatistic';\nimport * as assetApi from '../api/api-asset';\nimport * as statisticApi from '../api/api-statistic';\nimport { Bar } from 'react-chartjs-2';\nimport '../styles/Home.css';\nimport { AssetStatisticsPanel } from '../components/assetStatisticsPanel';\nimport { Operator } from '../dtos/operator';\nimport { Notification } from '../dtos/notification';\nimport { StatisticIndicatorLevel } from '../enums/statisticIndicatorLevel';\nimport greenBeStatusIcon from '../images/recent-activity-green.png';\nimport yellowBeStatusIcon from '../images/recent-activity-yellow.png';\nimport redBeStatusIcon from '../images/recent-activity-red.png';\nimport grayBeStatusIcon from '../images/recent-activity-gray.png';\nimport { formatDateTime, indicatorColor } from '../functions/general';\nimport ReactTooltip from 'react-tooltip';\nimport { AssetStatisticRow } from '../components/assetStatisticRow';\n\ninterface State {\n assets: Asset[];\n selectedAssetId: string | null;\n assetStatistics: AssetStatistic | null;\n alarmStatistics: AlarmStatistic[];\n}\n\nexport interface Props {}\n\nexport class HomePage extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n assets: [],\n selectedAssetId: null,\n assetStatistics: null,\n alarmStatistics: []\n };\n }\n\n componentDidMount() {\n this.fetchData();\n }\n\n private fetchData = async () => {\n await this.getAssetsAsync();\n if (this.state.selectedAssetId) {\n await this.getAssetStatisticsAsync(this.state.selectedAssetId);\n await this.getAlarmStatisticsAsync(this.state.selectedAssetId);\n }\n };\n\n private getAssetsAsync = async () => {\n let getResult = await assetApi.getAssetsAsync();\n\n if (getResult && getResult.length) {\n this.setState({\n assets: getResult\n });\n } else {\n console.log('Error caught in page-home.getAssetsAsync().');\n alert('Error getting assets.');\n }\n };\n\n private onAssetChanged = async (\n e: React.SyntheticEvent\n ) => {\n let selectedAssetId = e.currentTarget.value;\n this.setState({ selectedAssetId: selectedAssetId });\n\n if (!!selectedAssetId) {\n this.getAssetStatisticsAsync(selectedAssetId);\n this.getAlarmStatisticsAsync(selectedAssetId);\n } else {\n this.setState({ alarmStatistics: [], assetStatistics: null });\n }\n };\n\n private getAssetStatisticsAsync = async (assetId: string) => {\n let apiResult = await statisticApi.getAssetStatisticsAsync(\n assetId ?? ''\n );\n\n if (apiResult.success) {\n this.setState({ assetStatistics: apiResult.data ?? null });\n } else {\n this.setState({ assetStatistics: null });\n }\n };\n\n private getAlarmStatisticsAsync = async (assetId: string) => {\n let apiResult = await statisticApi.getAlarmStatisticsAsync(\n assetId ?? ''\n );\n\n if (apiResult.success) {\n this.setState({ alarmStatistics: apiResult.data ?? [] });\n } else {\n this.setState({ alarmStatistics: [] });\n }\n };\n\n private assetStatisticDescription = (\n operator: Operator | null,\n notification: Notification | null\n ) => {\n var operatorName = operator?.name;\n var time = notification?.timestamp;\n\n if (!(operatorName || time)) {\n return 'No Information';\n }\n\n // Return a description of the format: \"[operator], [date] [time]\"\"\n return `${operatorName || ''}${operatorName && time ? ', ' : ''}${\n time ? formatDateTime(time) : ''\n }`;\n };\n\n private beRecentActivityIcon = () => {\n switch (this.state.assetStatistics?.beRecentActivityStatus) {\n case StatisticIndicatorLevel.Ok:\n return \"green\";\n case StatisticIndicatorLevel.Warning:\n return \"yellow\";\n case StatisticIndicatorLevel.Critical:\n case StatisticIndicatorLevel.None:\n return \"red\";\n default:\n return \"gray\";\n }\n };\n\n private beRecentActivityTooltipText = () => {\n switch (this.state.assetStatistics?.beRecentActivityStatus) {\n case StatisticIndicatorLevel.Ok:\n return 'Active within the past 22 hours';\n case StatisticIndicatorLevel.Warning:\n return 'Active within the past 22-24 hours';\n case StatisticIndicatorLevel.Critical:\n case StatisticIndicatorLevel.None:\n return 'Not active within the past 24 hours';\n default:\n return undefined;\n }\n };\n\n render() {\n // Generate alarm data for the chart, in which labels for the past\n // week (i.e. 7 days) are created and associated with the alarm statistics data\n // by date\n const chartAlarmData = linq\n .range(0, 7)\n .orderByDescending(a => a)\n .select(n => {\n const date = moment().subtract(n, 'days');\n return {\n label: date.format('MM/DD'),\n value:\n this.state.alarmStatistics?.find(\n a => moment.utc(a.date).date() === date.date()\n )?.numberOfAlarms ?? 0\n };\n });\n\n // Construct chart data objects\n const chartLabels = linq\n .from(chartAlarmData)\n .select(a => a.label)\n .toArray();\n\n const chartValues = linq\n .from(chartAlarmData)\n .select(a => a.value)\n .toArray();\n\n const chartData = {\n labels: chartLabels ?? [],\n datasets: [\n {\n label: 'Total Alarms Per Day',\n backgroundColor: 'rgb(60, 91, 132)',\n borderColor: 'rgb(60, 91, 132)',\n borderWidth: 1,\n data: chartValues ?? []\n }\n ]\n };\n\n const {\n lastFootPedalOperator = null,\n lastLoginOperator = null,\n lastTiltXOperator = null,\n lastTiltYOperator = null,\n lastProximitySwitchOperator = null,\n lastLoginNotification = null,\n lastChecklistNotification = null,\n lastProximitySwitchNotification = null,\n lastFootPedalNotification = null,\n lastTiltYNotification = null,\n lastTiltXNotification = null,\n tiltXNotificationStatus = StatisticIndicatorLevel.None,\n tiltYNotificationStatus = StatisticIndicatorLevel.None,\n oilFilterNotificationStatus = StatisticIndicatorLevel.None,\n oilPressureNotificationStatus = StatisticIndicatorLevel.None,\n oilTemperatureNotificationStatus = StatisticIndicatorLevel.None,\n oilLevelNotificationStatus = StatisticIndicatorLevel.None,\n proximitySwitchNotificationStatus = StatisticIndicatorLevel.None,\n checklistNotificationStatus = StatisticIndicatorLevel.None,\n totalFootPedalHours = null\n } = this.state.assetStatistics || {};\n\n return (\n <>\n
\n
\n
Home
\n
\n
\n \n
\n
\n
\n
\n

Asset Dashboard

\n
\n
\n
\n
\n
\n
\n Asset\n \n \n {this.state.assets.map(a => (\n \n ))}\n \n
\n
\n BE Recent Activity\n
\n {this.beRecentActivityIcon()}\n
\n \n {this.beRecentActivityTooltipText()}\n \n
\n
\n\n
\n \n <>\n \n \n \n \n \n \n \n <>\n \n \n \n \n \n \n \n <>\n \n \n \n \n \n \n
\n
\n
\n \n \n
\n
\n
\n
\n \n );\n }\n}\n","import React from 'react';\nimport { Router, Route, Switch } from 'react-router-dom';\nimport { createBrowserHistory } from 'history';\nimport LoginPage from './pages/page-login';\nimport PrivateRoutes from './components/private-route';\nimport './styles/App.css';\nimport { UsersPage } from './pages/page-users';\nimport AccountConfirmPage from './pages/page-accountConfirm';\nimport { AssetsPage } from './pages/page-assets';\nimport { GroupsPage } from './pages/page-groups';\nimport { RegionsPage } from './pages/page-regions';\nimport { NotificationsPage } from './pages/page-notifications';\nimport { FacilitiesPage } from './pages/page-facilities';\nimport { AdminPage } from './pages/page-admin';\nimport { OperatorsPage } from './pages/page-operators';\nimport { ReportsPage } from './pages/page-reports';\nimport { SubscriptionsPage } from './pages/page-subscriptions';\nimport { SubscriptionAgreementsPage } from './pages/page-subscriptionAgreements';\nimport TermsAndConditionsPage from './pages/page-termsAndConditions';\nimport { HomePage } from './pages/page-home';\n\nexport default class App extends React.Component {\n public render() {\n return (\n \n \n \n \n\n \n \n }\n />\n \n \n \n \n (\n \n )}\n />\n \n \n \n \n \n (\n \n )}\n />\n \n \n \n \n \n \n \n );\n }\n}\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","module.exports = __webpack_public_path__ + \"static/media/header-logo-white.fc55e884.png\";"],"sourceRoot":""}