{"version":3,"sources":["util/config.js","util/auth.js","components/About.js","components/Logout.js","store/NavMenu.js","components/NavMenu.js","components/Layout.js","util/helpers.js","components/Search.js","components/ButtonRow.js","components/FailuresTable.js","util/dataAccess.js","store/Failures.js","components/Failures.js","components/DaySummariesTable.js","store/DaySummaries.js","components/DaySummaries.js","registerServiceWorker.js","index.js","store/configureStore.js","App.js"],"names":["setIsConfigLoaded","isConfigLoaded","window","sessionStorage","setItem","getIdentityServerBaseUrl","getItem","getConfigFile","a","fetch","response","json","setConfigItems","config","identityServerBaseUrl","loadConfig","then","generateRandomState","array","Uint8Array","crypto","getRandomValues","validChars","map","x","charCodeAt","length","String","fromCharCode","apply","getAuthParamsFromUrl","homePageUrl","getHomePageUrl","qsParams","qs","parse","location","href","state","accessToken","access_token","idToken","getAuthParams","setAuthParams","authParams","setHomePageUrl","ensureLoggedIn","replace","encodeURIComponent","history","replaceState","ensureLoggedOut","removeItem","isLoggedIn","About","className","target","rel","Component","connect","Logout","logOut","title","onClick","class","name","initialState","actionCreators","dispatch","type","reducer","action","NavMenu","props","toggle","bind","isOpen","this","setState","light","tag","Link","to","style","fontFamily","color","src","alt","navbar","navMenu","bindActionCreators","children","getQueryStringParams","moment","applicationId","fromDate","toDate","hasAllSearchCriteria","searchCriteria","startDate","endDate","getShortIsoDateString","date","formatNumber","n","slice","getFullYear","getMonth","getDate","getSortableDateTimeString","dateString","Date","toISOString","substr","sleep","ms","Promise","resolve","setTimeout","Search","drpFocussedInput","setSearchCriteria","setDrpFocussedInput","getData","isLoading","htmlFor","id","placeholder","value","onChange","e","minimumNights","endDateId","startDateId","endDatePlaceholderText","isOutsideRange","startDatePlaceholderText","focusedInput","onFocusChange","onDatesChange","range","disabled","ButtonRow","results","downloadResults","copyQueryUrlToClipboard","FailuresTable","failures","expandedVerdicts","expandVerdicts","rowNumber","scope","failure","key","timestamp","ctcId","verdicts","v","judgment","join","previousSession","includes","colSpan","JSON","stringify","get","uri","headers","getFailures","isQueryExecuting","baseApiUrl","process","isQueryStillExecuting","queryExecutionId","text","responseText","navigator","permissions","query","result","baseUrl","protocol","concat","host","pathname","clipboard","writeText","hiddenAnchor","document","createElement","encodeURI","download","click","filter","ev","Failures","sc","qsObj","search","ignoreQueryPrefix","DaySummariesTable","daySummaries","daySummary","communicating","notCommunicating","goodFailures","toFixed","badFailures","neutralFailures","getDaySummaries","csv","forEach","DaySummaries","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","console","log","catch","error","getElementsByTagName","getAttribute","createHashHistory","hashType","store","reducers","middleware","thunk","routerMiddleware","enhancers","rootReducer","combineReducers","routing","routerReducer","createStore","compose","applyMiddleware","configureStore","initialReduxState","rootElement","getElementById","ReactDOM","render","Layout","Route","exact","path","component","URL","origin","addEventListener","status","indexOf","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.e3889e83.chunk.js","sourcesContent":["const isConfigLoaded = () => window.sessionStorage.getItem('isConfigLoaded') !== null;\r\n\r\nconst setIsConfigLoaded = isConfigLoaded => window.sessionStorage.setItem('isConfigLoaded', isConfigLoaded);\r\n\r\nconst getIdentityServerBaseUrl = () => window.sessionStorage.getItem('identityServerBaseUrl');\r\n\r\nconst setIdentityServerBaseUrl = identityServerBaseUrl => window.sessionStorage.setItem('identityServerBaseUrl', identityServerBaseUrl);\r\n\r\nconst getConfigFile = async () => { \r\n const response = await fetch('config.json');\r\n return await response.json();\r\n}\r\n\r\nconst setConfigItems = async config => {\r\n setIdentityServerBaseUrl(config.identityServerBaseUrl);\r\n setIsConfigLoaded(true);\r\n}\r\n\r\nconst loadConfig = async () => { \r\n return getConfigFile().then(setConfigItems);\r\n}\r\n\r\nexport { isConfigLoaded, loadConfig, getIdentityServerBaseUrl }","import qs from 'qs';\r\nimport { isConfigLoaded, loadConfig, getIdentityServerBaseUrl } from './config';\r\n\r\nconst generateRandomState = () => {\r\n let array = new Uint8Array(20);\r\n window.crypto.getRandomValues(array);\r\n const validChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n array = array.map(x => validChars.charCodeAt(x % validChars.length));\r\n return String.fromCharCode.apply(null, array);\r\n}\r\n\r\nconst getAuthParamsFromUrl = () => {\r\n var homePageUrl = getHomePageUrl();\r\n var qsParams = qs.parse(window.location.href)\r\n if ('state' in qsParams && \r\n 'access_token' in qsParams &&\r\n `${homePageUrl}#id_token` in qsParams) {\r\n return {\r\n state: qsParams.state,\r\n accessToken: qsParams.access_token,\r\n idToken: qsParams[`${homePageUrl}#id_token`]\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nconst getAuthParams = () => {\r\n const state = window.sessionStorage.getItem('state');\r\n const idToken = window.sessionStorage.getItem('idToken');\r\n const accessToken = window.sessionStorage.getItem('accessToken');\r\n\r\n if (state == null || idToken == null || accessToken == null) return null;\r\n return {\r\n state: state,\r\n idToken: idToken,\r\n accessToken: accessToken \r\n }\r\n}\r\n\r\nconst setAuthParams = authParams => {\r\n window.sessionStorage.setItem('state', authParams.state);\r\n window.sessionStorage.setItem('idToken', authParams.idToken);\r\n window.sessionStorage.setItem('accessToken', authParams.accessToken); \r\n}\r\n\r\nconst deleteAuthParams = () => {\r\n window.sessionStorage.removeItem('state');\r\n window.sessionStorage.removeItem('idToken');\r\n window.sessionStorage.removeItem('accessToken');\r\n}\r\n\r\nconst getHomePageUrl = () => {\r\n return window.sessionStorage.getItem('homePageUrl');\r\n}\r\n\r\nconst setHomePageUrl = homePageUrl => {\r\n window.sessionStorage.setItem('homePageUrl', homePageUrl);\r\n}\r\n\r\nconst deleteHomePageUrl = () => {\r\n return window.sessionStorage.removeItem('homePageUrl');\r\n}\r\n\r\nconst ensureLoggedIn = async () => {\r\n var authParams = getAuthParams();\r\n if (authParams === null) {\r\n authParams = getAuthParamsFromUrl();\r\n if (authParams === null) {\r\n if (!isConfigLoaded()) await loadConfig();\r\n const homePageUrl = window.location.href;\r\n setHomePageUrl(homePageUrl)\r\n window.location.replace(`${getIdentityServerBaseUrl()}authorize?client_id=citytouch-perfmon&response_type=id_token%20token&scope=read%20openid%20email&nonce=123456&state=${generateRandomState()}&redirect_uri=${encodeURIComponent(homePageUrl)}`); \r\n } else { \r\n setAuthParams(authParams);\r\n window.history.replaceState('', '', getHomePageUrl());\r\n }\r\n }\r\n}\r\n\r\nconst ensureLoggedOut = () => {\r\n const authParams = getAuthParams();\r\n const homePageUrl = getHomePageUrl();\r\n \r\n deleteAuthParams();\r\n deleteHomePageUrl()\r\n\r\n // Redirect back to the home page before logging-out to ensure redirection works (IS quirk)\r\n if (window.location.href != homePageUrl)\r\n window.history.replaceState('', '', homePageUrl);\r\n\r\n window.location.replace(`${getIdentityServerBaseUrl()}endsession?id_token_hint=${authParams.idToken}&post_logout_redirect_uri=${homePageUrl}`);\r\n}\r\n\r\nconst isLoggedIn = () => {\r\n return getAuthParams() === null ? false : true;\r\n}\r\n\r\nconst getAccessToken = () => {\r\n return window.sessionStorage.getItem('accessToken');\r\n}\r\n\r\nexport { ensureLoggedIn, ensureLoggedOut, isLoggedIn, getAccessToken }","import { connect } from \"react-redux\";\r\nimport React, { Component } from \"react\";\r\nimport { isLoggedIn } from \"../util/auth\";\r\n\r\nclass About extends Component {\r\n render() {\r\n return (\r\n isLoggedIn() && (\r\n
\r\n

About

\r\n

Copyright © 2019 Signify GmbH. All rights reserved.

\r\n

\r\n This Website contains software licensed under open source licenses.\r\n Click on{\" \"}\r\n \r\n Open Source Licenses\r\n {\" \"}\r\n to view the view the acknowledgments and licenses of this software.\r\n

\r\n
\r\n )\r\n );\r\n }\r\n}\r\n\r\nexport default connect()(About);\r\n","import React from 'react'\r\nimport PropTypes from 'prop-types'\r\n\r\nconst Logout = ({ logOut }) => ( \r\n logOut()}>\r\n \r\n \r\n)\r\n\r\nLogout.propTypes = {\r\n logOut: PropTypes.func.isRequired\r\n}\r\n\r\nexport default Logout","import { ensureLoggedOut } from '../util/auth';\r\n\r\nconst LOG_OUT = 'LOG_OUT';\r\n\r\nconst initialState = {};\r\n\r\nexport const actionCreators = {\r\n logOut: () => dispatch => {\r\n ensureLoggedOut();\r\n dispatch({ type: LOG_OUT });\r\n }\r\n};\r\n\r\nexport const reducer = (state, action) => {\r\n state = state || initialState;\r\n switch (action.type) {\r\n case LOG_OUT:\r\n return state;\r\n default:\r\n return state;\r\n }\r\n};","import Logout from './Logout';\r\nimport { connect } from 'react-redux';\r\nimport { Link } from 'react-router-dom';\r\nimport React, { Component } from 'react';\r\nimport { bindActionCreators } from 'redux';\r\nimport { actionCreators } from '../store/NavMenu';\r\nimport { Collapse, Container, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from 'reactstrap';\r\n\r\nclass NavMenu extends Component {\r\n constructor (props) {\r\n super(props);\r\n\r\n this.toggle = this.toggle.bind(this);\r\n this.state = {\r\n isOpen: false\r\n };\r\n }\r\n\r\n toggle () {\r\n this.setState({\r\n isOpen: !this.state.isOpen\r\n });\r\n }\r\n\r\n render () {\r\n return (\r\n
\r\n \r\n \r\n \r\n \"Signify\r\n CTC Performance Monitor\r\n \r\n \r\n \r\n
    \r\n \r\n Day Summaries\r\n \r\n \r\n Failures\r\n \r\n \r\n About\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n state => state.navMenu,\r\n dispatch => bindActionCreators(actionCreators, dispatch)\r\n)(NavMenu);\r\n","import React from 'react';\r\nimport { Container } from 'reactstrap';\r\nimport NavMenu from './NavMenu';\r\n\r\nexport default props => (\r\n
\r\n \r\n \r\n {props.children}\r\n \r\n
\r\n);\r\n","export const getQueryStringParams = (qsParams, moment) => {\r\n return {\r\n applicationId: 'applicationId' in qsParams ? qsParams.applicationId : '',\r\n fromDate: 'fromDate' in qsParams ? moment(qsParams.fromDate) : null,\r\n toDate: 'toDate' in qsParams ? moment(qsParams.toDate) : null\r\n }\r\n};\r\n\r\nexport const hasAllSearchCriteria = searchCriteria => {\r\n return (\r\n searchCriteria.applicationId == null ||\r\n searchCriteria.applicationId === '' ||\r\n searchCriteria.startDate == null ||\r\n searchCriteria.endDate == null)\r\n ? false\r\n : true;\r\n}\r\n\r\nexport const getShortIsoDateString = date => {\r\n const formatNumber = n => (\"0\" + n).slice(-2);\r\n return `${date.getFullYear()}-${formatNumber(date.getMonth() + 1)}-${formatNumber(date.getDate())}`;\r\n}\r\n\r\nexport const getSortableDateTimeString = dateString => {\r\n return new Date(dateString).toISOString().replace(\"T\", \" \").substr(0,19);\r\n}\r\n\r\nexport const getSortableDateString = dateString => {\r\n return new Date(dateString).toISOString().substr(0, 10);\r\n}\r\n\r\nexport const sleep = async ms => {\r\n return new Promise(resolve => {\r\n setTimeout(resolve, ms);\r\n });\r\n}","import React from 'react'\r\nimport PropTypes from 'prop-types'\r\nimport { DateRangePicker } from 'react-dates'\r\nimport { hasAllSearchCriteria } from '../util/helpers';\r\n\r\nconst Search = ({ searchCriteria, drpFocussedInput, setSearchCriteria, setDrpFocussedInput, getData, isLoading }) => ( \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n setSearchCriteria(e.target.value, searchCriteria.startDate, searchCriteria.endDate)} />\r\n
\r\n
\r\n \r\n
\r\n
\r\n false}\r\n startDatePlaceholderText=\"From\"\r\n focusedInput={drpFocussedInput}\r\n endDate={searchCriteria.endDate}\r\n startDate={searchCriteria.startDate}\r\n onFocusChange={drpFocussedInput => setDrpFocussedInput(drpFocussedInput)}\r\n onDatesChange={range => setSearchCriteria(searchCriteria.applicationId, range.startDate, range.endDate)}\r\n />\r\n
\r\n
 
\r\n
\r\n getData(searchCriteria)}\r\n disabled={!hasAllSearchCriteria(searchCriteria) || isLoading}\r\n >Search\r\n
\r\n
\r\n
\r\n
\r\n)\r\n\r\nSearch.propTypes = {\r\n isLoading: PropTypes.bool,\r\n searchCriteria: PropTypes.object,\r\n drpFocussedInput: PropTypes.string,\r\n getData: PropTypes.func.isRequired,\r\n setSearchCriteria: PropTypes.func.isRequired, \r\n setDrpFocussedInput: PropTypes.func.isRequired, \r\n}\r\n\r\nexport default Search","import React from 'react'\r\nimport PropTypes from 'prop-types'\r\n\r\nconst ButtonRow = ({ results, searchCriteria, downloadResults, copyQueryUrlToClipboard }) => (\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n)\r\n\r\nButtonRow.propTypes = {\r\n results: PropTypes.array,\r\n searchCriteria: PropTypes.object,\r\n downloadResults: PropTypes.func.isRequired,\r\n copyQueryUrlToClipboard: PropTypes.func.isRequired\r\n}\r\n\r\nexport default ButtonRow","import React from 'react'\r\nimport PropTypes from 'prop-types'\r\nimport { getSortableDateTimeString } from '../util/helpers';\r\n\r\n\r\nconst FailuresTable = ({ failures, expandedVerdicts, expandVerdicts }) => {\r\n var rowNumber = 0;\r\n return \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n failures.map(failure => { \r\n var n = rowNumber++;\r\n return [\r\n expandVerdicts(n)} >\r\n \r\n \r\n \r\n \r\n \r\n ,\r\n expandedVerdicts.includes(n) &&\r\n \r\n \r\n \r\n ]\r\n })\r\n }\r\n \r\n
Timestamp (UTC)CTC IDApplication IDJudgmentsPrevious Session (UTC)
{getSortableDateTimeString(failure.timestamp)}{failure.ctcId}{failure.applicationId}{(failure.verdicts && (failure.verdicts.map(v => v.judgment).join(', ')))}{getSortableDateTimeString(failure.previousSession)}
\r\n
{JSON.stringify({ \"verdicts\": failure.verdicts, \"state\": failure.state }, null, 3)}
\r\n
\r\n}\r\n\r\nFailuresTable.propTypes = {\r\n failures: PropTypes.array,\r\n}\r\n\r\nexport default FailuresTable","import { getAccessToken } from './auth';\r\n\r\nexport const get = uri => {\r\n return fetch(uri, {\r\n headers: {\r\n 'authorization': getAccessToken()\r\n }\r\n });\r\n}","import { get } from \"../util/dataAccess\";\r\nimport { getShortIsoDateString, sleep } from \"../util/helpers\";\r\n\r\nconst GET_FAILURES = \"F_GET_FAILURES\";\r\nconst SET_FAILURES = \"F_SET_FAILURES\";\r\nconst COPY_QUERY_URL = \"F_COPY_QUERY_URL\";\r\nconst EXPAND_VERDICTS = \"F_EXPAND_VERDICTS\";\r\nconst DOWNLOAD_RESULTS = \"F_DOWNLOAD_RESULTS\";\r\nconst SET_SEARCH_CRITERIA = \"F_SET_SEARCH_CRITERIA\";\r\nconst SET_DRP_FOCUSSED_INPUT = \"F_SET_FOCUSSED_INPUT\";\r\n\r\nconst initialState = {\r\n searchCriteria: {\r\n applicationId: \"\",\r\n startDate: null,\r\n endDate: null,\r\n },\r\n drpFocussedInput: null,\r\n isLoading: false,\r\n failures: [],\r\n expandedVerdicts: [],\r\n};\r\n\r\nexport const actionCreators = {\r\n setDrpFocussedInput: (drpFocussedInput) => ({\r\n type: SET_DRP_FOCUSSED_INPUT,\r\n drpFocussedInput,\r\n }),\r\n\r\n setSearchCriteria: (applicationId, startDate, endDate) => ({\r\n type: SET_SEARCH_CRITERIA,\r\n applicationId,\r\n startDate,\r\n endDate,\r\n }),\r\n\r\n getFailures: (searchCriteria) => async (dispatch) => {\r\n var isQueryExecuting = true;\r\n var baseApiUrl = process.env.REACT_APP_BASE_API_URL;\r\n const isQueryStillExecuting = async (queryExecutionId) => {\r\n const response = await get(\r\n `${baseApiUrl}api/Failures/IsQueryStillExecuting?queryExecutionId=${queryExecutionId}`\r\n );\r\n const responseText = await response.text();\r\n isQueryExecuting = responseText === \"true\";\r\n };\r\n\r\n dispatch({ type: GET_FAILURES });\r\n\r\n var response = await get(\r\n `${baseApiUrl}api/Failures/InitiateQuery?applicationId=${\r\n searchCriteria.applicationId\r\n }&fromDate=${getShortIsoDateString(\r\n new Date(searchCriteria.startDate)\r\n )}&toDate=${getShortIsoDateString(new Date(searchCriteria.endDate))}`\r\n );\r\n const queryExecutionId = await response.text();\r\n\r\n while (isQueryExecuting) {\r\n await isQueryStillExecuting(queryExecutionId);\r\n await sleep(1000);\r\n }\r\n\r\n response = await get(\r\n `${baseApiUrl}api/Failures/FetchResults?queryExecutionId=${queryExecutionId}`\r\n );\r\n const failures = await response.json();\r\n\r\n dispatch({ type: SET_FAILURES, failures });\r\n },\r\n\r\n expandVerdicts: (rowNumber) => ({ type: EXPAND_VERDICTS, rowNumber }),\r\n\r\n copyQueryUrlToClipboard: (searchCriteria) => (dispatch) => {\r\n navigator.permissions.query({ name: \"clipboard-write\" }).then((result) => {\r\n if (result.state === \"granted\" || result.state === \"prompt\") {\r\n const baseUrl = window.location.protocol.concat(\r\n \"//\",\r\n window.location.host,\r\n window.location.pathname\r\n );\r\n navigator.clipboard.writeText(\r\n baseUrl.concat(\r\n \"?applicationId=\",\r\n searchCriteria.applicationId,\r\n \"&fromDate=\",\r\n getShortIsoDateString(new Date(searchCriteria.startDate)),\r\n \"&toDate=\",\r\n getShortIsoDateString(new Date(searchCriteria.endDate))\r\n )\r\n );\r\n }\r\n });\r\n\r\n dispatch({ type: COPY_QUERY_URL });\r\n },\r\n\r\n downloadResults: (failures, searchCriteria) => (dispatch) => {\r\n var hiddenAnchor = document.createElement(\"a\");\r\n hiddenAnchor.href =\r\n \"data:text/json;charset=utf-8,\" +\r\n encodeURI(JSON.stringify(failures, null, 3));\r\n hiddenAnchor.target = \"_blank\";\r\n hiddenAnchor.download = `Failures-${\r\n searchCriteria.applicationId\r\n }-${getShortIsoDateString(\r\n new Date(searchCriteria.startDate)\r\n )}-to-${getShortIsoDateString(new Date(searchCriteria.endDate))}.json`;\r\n hiddenAnchor.click();\r\n\r\n dispatch({ type: DOWNLOAD_RESULTS });\r\n },\r\n};\r\n\r\nexport const reducer = (state, action) => {\r\n state = state || initialState;\r\n switch (action.type) {\r\n case SET_DRP_FOCUSSED_INPUT:\r\n return {\r\n ...state,\r\n drpFocussedInput: action.drpFocussedInput,\r\n };\r\n case SET_SEARCH_CRITERIA:\r\n return {\r\n ...state,\r\n searchCriteria: {\r\n applicationId: action.applicationId,\r\n startDate: action.startDate,\r\n endDate: action.endDate,\r\n },\r\n failures: [],\r\n };\r\n case GET_FAILURES:\r\n return {\r\n ...state,\r\n isLoading: true,\r\n failures: [],\r\n };\r\n case SET_FAILURES:\r\n return {\r\n ...state,\r\n isLoading: false,\r\n failures: action.failures,\r\n };\r\n case EXPAND_VERDICTS:\r\n if (state.expandedVerdicts.includes(action.rowNumber))\r\n return {\r\n ...state,\r\n expandedVerdicts: state.expandedVerdicts.filter(\r\n (ev) => ev !== action.rowNumber\r\n ),\r\n };\r\n else\r\n return {\r\n ...state,\r\n expandedVerdicts: state.expandedVerdicts.concat([action.rowNumber]),\r\n };\r\n case COPY_QUERY_URL:\r\n return state;\r\n case DOWNLOAD_RESULTS:\r\n return state;\r\n default:\r\n return state;\r\n }\r\n};\r\n","import qs from 'qs';\r\nimport moment from 'moment';\r\nimport Search from '../components/Search';\r\nimport ButtonRow from '../components/ButtonRow';\r\nimport FailuresTable from '../components/FailuresTable';\r\n\r\nimport { connect } from 'react-redux';\r\nimport React, { Component } from 'react';\r\nimport { bindActionCreators } from 'redux';\r\nimport { isLoggedIn } from '../util/auth';\r\nimport { actionCreators } from '../store/Failures';\r\nimport { getQueryStringParams } from '../util/helpers';\r\n\r\nclass Failures extends Component {\r\n componentDidMount() {\r\n if (this.props.location.searchCriteria) {\r\n var sc = this.props.location.searchCriteria;\r\n this.props.setSearchCriteria(\r\n sc.applicationId,\r\n sc.startDate,\r\n sc.endDate);\r\n return;\r\n }\r\n\r\n var qsObj = qs.parse(this.props.location.search, { ignoreQueryPrefix: true })\r\n var qsParams = getQueryStringParams(qsObj, moment);\r\n\r\n if (qsParams.applicationId === '' || qsParams.startDate === null || qsParams.endDate === null) return;\r\n this.props.setSearchCriteria(qsParams.applicationId, qsParams.fromDate, qsParams.toDate);\r\n }\r\n\r\n render() {\r\n return (\r\n isLoggedIn() &&\r\n
\r\n

Failures

\r\n\r\n \r\n\r\n {\r\n this.props.isLoading &&\r\n
\r\n
\r\n
\r\n }\r\n\r\n {\r\n this.props.failures.length > 0 &&\r\n \r\n }\r\n\r\n {\r\n this.props.failures.length > 0 &&\r\n \r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n state => state.failures,\r\n dispatch => bindActionCreators(actionCreators, dispatch)\r\n)(Failures);","import React from 'react';\r\nimport moment from 'moment';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\nimport { getSortableDateString } from '../util/helpers';\r\n\r\nconst DaySummariesTable = ({ daySummaries, searchCriteria }) => {\r\n var rowNumber = 0;\r\n return \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n daySummaries.map(daySummary => {\r\n var n = rowNumber++;\r\n return \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n })\r\n }\r\n \r\n
Date (UTC)CommunicatingNot CommunicatingExternal IssuesInternal IssuesUnknown\r\n
{getSortableDateString(daySummary.date)}{daySummary.communicating}{daySummary.notCommunicating}{daySummary.goodFailures.toFixed(2)}%{daySummary.badFailures.toFixed(2)}%{daySummary.neutralFailures.toFixed(2)}%\r\n \r\n
\r\n}\r\n\r\nDaySummariesTable.propTypes = {\r\n daySummaries: PropTypes.array,\r\n searchCriteria: PropTypes.object\r\n}\r\n\r\nexport default DaySummariesTable","import { get } from \"../util/dataAccess\";\r\nimport { getShortIsoDateString, sleep } from \"../util/helpers\";\r\n\r\nconst COPY_QUERY_URL = \"DS_COPY_QUERY_URL\";\r\nconst DOWNLOAD_RESULTS = \"DS_DOWNLOAD_RESULTS\";\r\nconst GET_DAY_SUMMARIES = \"DS_GET_DAY_SUMMARIES\";\r\nconst SET_DAY_SUMMARIES = \"DS_SET_DAY_SUMMARIES\";\r\nconst SET_SEARCH_CRITERIA = \"DS_SET_SEARCH_CRITERIA\";\r\nconst SET_DRP_FOCUSSED_INPUT = \"DS_SET_FOCUSSED_INPUT\";\r\n\r\nconst initialState = {\r\n searchCriteria: {\r\n applicationId: \"\",\r\n startDate: null,\r\n endDate: null,\r\n },\r\n drpFocussedInput: null,\r\n isLoading: false,\r\n daySummaries: [],\r\n};\r\n\r\nexport const actionCreators = {\r\n setDrpFocussedInput: (drpFocussedInput) => ({\r\n type: SET_DRP_FOCUSSED_INPUT,\r\n drpFocussedInput,\r\n }),\r\n\r\n setSearchCriteria: (applicationId, startDate, endDate) => ({\r\n type: SET_SEARCH_CRITERIA,\r\n applicationId,\r\n startDate,\r\n endDate,\r\n }),\r\n\r\n getDaySummaries: (searchCriteria) => async (dispatch) => {\r\n var isQueryExecuting = true;\r\n var baseApiUrl = process.env.REACT_APP_BASE_API_URL;\r\n const isQueryStillExecuting = async (queryExecutionId) => {\r\n const response = await get(\r\n `${baseApiUrl}api/DaySummaries/IsQueryStillExecuting?queryExecutionId=${queryExecutionId}`\r\n );\r\n const responseText = await response.text();\r\n isQueryExecuting = responseText === \"true\";\r\n };\r\n\r\n dispatch({ type: GET_DAY_SUMMARIES });\r\n\r\n var response = await get(\r\n `${baseApiUrl}api/DaySummaries/InitiateQuery?applicationId=${\r\n searchCriteria.applicationId\r\n }&fromDate=${getShortIsoDateString(\r\n new Date(searchCriteria.startDate)\r\n )}&toDate=${getShortIsoDateString(new Date(searchCriteria.endDate))}`\r\n );\r\n const queryExecutionId = await response.text();\r\n\r\n while (isQueryExecuting) {\r\n await isQueryStillExecuting(queryExecutionId);\r\n await sleep(1000);\r\n }\r\n\r\n response = await get(\r\n `${baseApiUrl}api/DaySummaries/FetchResults?queryExecutionId=${queryExecutionId}`\r\n );\r\n const daySummaries = await response.json();\r\n\r\n dispatch({ type: SET_DAY_SUMMARIES, daySummaries });\r\n },\r\n\r\n copyQueryUrlToClipboard: (searchCriteria) => (dispatch) => {\r\n navigator.permissions.query({ name: \"clipboard-write\" }).then((result) => {\r\n if (result.state === \"granted\" || result.state === \"prompt\") {\r\n const baseUrl = window.location.protocol.concat(\r\n \"//\",\r\n window.location.host,\r\n window.location.pathname\r\n );\r\n navigator.clipboard.writeText(\r\n baseUrl.concat(\r\n \"?applicationId=\",\r\n searchCriteria.applicationId,\r\n \"&fromDate=\",\r\n getShortIsoDateString(new Date(searchCriteria.startDate)),\r\n \"&toDate=\",\r\n getShortIsoDateString(new Date(searchCriteria.endDate))\r\n )\r\n );\r\n }\r\n });\r\n\r\n dispatch({ type: COPY_QUERY_URL });\r\n },\r\n\r\n downloadResults: (daySummaries, searchCriteria) => (dispatch) => {\r\n var csv =\r\n \"Date,Communicating,Not Communicating,External Issues,Internal Issues,Unknown\\n\";\r\n daySummaries.forEach((daySummary) => {\r\n csv += `${getShortIsoDateString(new Date(daySummary.date))},`;\r\n csv += `${daySummary.communicating},`;\r\n csv += `${daySummary.notCommunicating},`;\r\n csv += `${daySummary.goodFailures.toFixed(2)},`;\r\n csv += `${daySummary.badFailures.toFixed(2)},`;\r\n csv += `${daySummary.neutralFailures.toFixed(2)}\\n`;\r\n });\r\n\r\n var hiddenAnchor = document.createElement(\"a\");\r\n hiddenAnchor.href = \"data:text/csv;charset=utf-8,\" + encodeURI(csv);\r\n hiddenAnchor.target = \"_blank\";\r\n hiddenAnchor.download = `DaySummaries-${\r\n searchCriteria.applicationId\r\n }-${getShortIsoDateString(\r\n new Date(searchCriteria.startDate)\r\n )}-to-${getShortIsoDateString(new Date(searchCriteria.endDate))}.csv`;\r\n hiddenAnchor.click();\r\n\r\n dispatch({ type: DOWNLOAD_RESULTS });\r\n },\r\n};\r\n\r\nexport const reducer = (state, action) => {\r\n state = state || initialState;\r\n switch (action.type) {\r\n case SET_DRP_FOCUSSED_INPUT:\r\n return {\r\n ...state,\r\n drpFocussedInput: action.drpFocussedInput,\r\n };\r\n case SET_SEARCH_CRITERIA:\r\n return {\r\n ...state,\r\n searchCriteria: {\r\n applicationId: action.applicationId,\r\n startDate: action.startDate,\r\n endDate: action.endDate,\r\n },\r\n daySummaries: [],\r\n };\r\n case GET_DAY_SUMMARIES:\r\n return {\r\n ...state,\r\n isLoading: true,\r\n daySummaries: [],\r\n };\r\n case SET_DAY_SUMMARIES:\r\n return {\r\n ...state,\r\n isLoading: false,\r\n daySummaries: action.daySummaries,\r\n };\r\n case COPY_QUERY_URL:\r\n return state;\r\n case DOWNLOAD_RESULTS:\r\n return state;\r\n default:\r\n return state;\r\n }\r\n};\r\n","import qs from 'qs';\r\nimport moment from 'moment';\r\nimport Search from '../components/Search';\r\nimport ButtonRow from '../components/ButtonRow';\r\nimport DaySummariesTable from '../components/DaySummariesTable';\r\n\r\nimport { connect } from 'react-redux';\r\nimport React, { Component } from 'react';\r\nimport { bindActionCreators } from 'redux';\r\nimport { isLoggedIn } from '../util/auth';\r\nimport { actionCreators } from '../store/DaySummaries';\r\nimport { getQueryStringParams } from '../util/helpers';\r\n\r\nclass DaySummaries extends Component {\r\n componentDidMount() {\r\n var qsObj = qs.parse(this.props.location.search, { ignoreQueryPrefix: true })\r\n var qsParams = getQueryStringParams(qsObj, moment);\r\n\r\n if (qsParams.applicationId === '' || qsParams.startDate === null || qsParams.endDate === null) return;\r\n this.props.setSearchCriteria(qsParams.applicationId, qsParams.fromDate, qsParams.toDate);\r\n }\r\n\r\n render() { \r\n return (\r\n isLoggedIn() &&\r\n
\r\n

Day Summaries

\r\n\r\n \r\n {\r\n this.props.isLoading &&\r\n
\r\n
\r\n
\r\n }\r\n\r\n {\r\n this.props.daySummaries.length > 0 &&\r\n \r\n }\r\n\r\n {\r\n this.props.daySummaries.length > 0 &&\r\n \r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n state => state.daySummaries,\r\n dispatch => bindActionCreators(actionCreators, dispatch)\r\n)(DaySummaries);","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register() {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import App from \"./App\";\r\nimport React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport configureStore from \"./store/configureStore\";\r\nimport registerServiceWorker from \"./registerServiceWorker\";\r\n\r\nimport { Provider } from \"react-redux\";\r\nimport { ensureLoggedIn } from \"./util/auth\";\r\nimport { createHashHistory } from \"history\";\r\nimport { ConnectedRouter } from \"react-router-redux\";\r\n\r\nensureLoggedIn();\r\n\r\n// Create browser history to use in the Redux store\r\nconst baseUrl = document.getElementsByTagName(\"base\")[0].getAttribute(\"href\");\r\nconst history = createHashHistory({\r\n hashType: \"slash\",\r\n});\r\n\r\n// Get the application-wide store instance, prepopulating with state from the server where available.\r\nconst initialState = window.initialReduxState;\r\nconst store = configureStore(history, initialState);\r\n\r\nconst rootElement = document.getElementById(\"root\");\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n ,\r\n rootElement\r\n);\r\n\r\nregisterServiceWorker();\r\n","import thunk from 'redux-thunk';\r\nimport { routerReducer, routerMiddleware } from 'react-router-redux';\r\nimport { applyMiddleware, combineReducers, compose, createStore } from 'redux';\r\n\r\nimport * as NavMenu from './NavMenu';\r\nimport * as Failures from './Failures';\r\nimport * as DaySummaries from './DaySummaries';\r\n\r\nexport default function configureStore (history, initialState) {\r\n const reducers = {\r\n navMenu: NavMenu.reducer, \r\n failures: Failures.reducer,\r\n daySummaries: DaySummaries.reducer\r\n };\r\n\r\n const middleware = [\r\n thunk,\r\n routerMiddleware(history)\r\n ];\r\n\r\n // In development, use the browser's Redux dev tools extension if installed\r\n const enhancers = [];\r\n const isDevelopment = process.env.NODE_ENV === 'development';\r\n if (isDevelopment && typeof window !== 'undefined' && window.devToolsExtension) {\r\n enhancers.push(window.devToolsExtension());\r\n }\r\n\r\n const rootReducer = combineReducers({\r\n ...reducers,\r\n routing: routerReducer\r\n });\r\n\r\n return createStore(\r\n rootReducer,\r\n initialState,\r\n compose(applyMiddleware(...middleware), ...enhancers)\r\n );\r\n}\r\n","import React from 'react';\r\nimport { Route } from 'react-router';\r\nimport About from './components/About';\r\nimport Layout from './components/Layout';\r\nimport Failures from './components/Failures';\r\nimport DaySummaries from './components/DaySummaries';\r\nimport 'react-dates/initialize'\r\nimport 'react-dates/lib/css/_datepicker.css'\r\nimport 'bootstrap/dist/css/bootstrap.css';\r\nimport './css/PerfMon.css';\r\n\r\nexport default () => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n"],"sourceRoot":""}