{"version":3,"sources":["NavPane.js","DeploymentConfiguration.js","BackendClient.js","TenantMigrationStatusHistory.js","TenantMigrationStatus.js","TenantMigrationStatusList.js","App.js","index.js"],"names":["navStyles","root","height","boxSizing","border","overflowY","navLinkGroups","links","name","key","isExpanded","NavPane","props","onLinkClick","bind","Nav","this","selectedKey","styles","groups","ev","item","onLinkClicked","React","Component","window","frontendHostUrl","backendBaseUrl","backendApplicationId","backendApplicationIdUri","backendTokenAuthority","backendTokenScope","msalInstance","PublicClientApplication","auth","clientId","authority","redirectUri","cache","cacheLocation","acquireBackendToken","a","currentAccount","currentAccounts","getAllAccounts","loginPopup","loginResponse","account","accessTokenRequest","scopes","acquireTokenSilent","catch","error","InteractionRequiredAuthError","acquireTokenPopup","backendGet","requestPath","requestParams","accessToken","axios","get","headers","params","post","stackTokens","childrenGap","padding","afs1StatisticsHistoryListColumns","fieldName","minWidth","maxWidth","isResizable","afs2StatisticsHistoryListColumns","compareTimestampDescending","lhs","rhs","timestamp","TenantMigrationStatusHistory","state","statistics","filteredStatistics","showAll","errorMessage","onDismiss","onShowAllToggleChange","statisticsUrl","source","tenant","include_history","then","response","data","sort","recordCount","length","push","i","totalAfs1Agents","agentsCheckedInSinceMigration","agentsSilent30Days","agentsSilent60Days","agentsSilent90Days","agentsSilent120Days","agentsLost","agentsKnown","agentsReportingToAFS2","agentsNotYetReportingToAFS2","agentsInTransition","agentsPoliciesUpToDate","agentsCredentialsUpToDate","unshift","setState","checked","Modal","isOpen","Stack","tokens","maxHeight","horizontal","horizontalAlign","Item","align","Text","variant","IconButton","iconProps","iconName","onClick","Spinner","label","labelPosition","size","SpinnerSize","large","MessageBar","messageBarType","MessageBarType","isMultiline","Toggle","onText","offText","onChange","DetailsList","checkboxVisibility","CheckboxVisibility","hidden","columns","items","stackTokensDialog","stackTokensBlock","migrationStateListColumns","TenantMigrationStatus","migrationStatistics","migrationStatisticsAreStale","fetchingStatistics","statisticsRefreshRetryCount","migrationAnalysis","fetchingAnalysis","showAFS1StatisticsHistory","showAFS2StatisticsHistory","onDismissErrorMessage","onRefreshClicked","currentStatistics","backendPost","setTimeout","getRefreshedStatistics","message","newStatistics","Label","style","width","TextField","readOnly","value","DefaultButton","text","color","migrationStates","PrimaryButton","disabled","migrationTimestamp","Separator","showAFS2Statistics","vertical","showAFS1Statistics","showMigrationStates","clearMessages","requestStatisticsRefresh","getRefreshedAnalysis","stackTokensFilters","tenantListColumns","isSorted","isSortedDescending","ariaLabel","sortList","ascending","slice","b","localeCompare","renderHeaderTooltip","defaultRender","onRenderColumnHeaderTooltip","tooltipHostProps","TooltipHost","renderItemColumn","index","column","tenantName","tenantId","endsWith","Math","floor","TenantMigrationStatusList","activeColumns","sortedTenantList","sortColumnName","sortAscending","selectedTenant","filterText","filterCount","showDetails","onColumnHeaderClick","onFilterTextChanged","onFilterCountChanged","tenantList","forEach","ratioKnownAFS1vsAFS2","afs1TotalAgents","afs2AgentsKnown","ratioAFS2Reporting","afs2AgentsReportingToAFS2","ratioAFS2PolicyUpToDate","afs2AgentsPoliciesUpToDate","clickedColumn","newlySortedTenantList","newValue","filter","toLowerCase","indexOf","isNaN","getFilteredTenantList","constrainMode","ConstrainMode","unconstrained","selectionMode","SelectionMode","single","onItemInvoked","onRenderDetailsHeader","onRenderItemColumn","App","authorizationCheckInProgress","authorizedComponents","activeNavLink","onNavLinkClicked","userRoles","roles","includes","blocked","initializeIcons","ReactDOM","render","Fabric","document","getElementById"],"mappings":"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","file":"static/js/main.2732cd5c.chunk.js","sourcesContent":["import React from 'react';\r\nimport { Nav, INavLink, INavStyles, INavLinkGroup } from 'office-ui-fabric-react/lib/Nav';\r\n\r\nconst navStyles: Partial = {\r\n root: {\r\n height: '100vh',\r\n boxSizing: 'border-box',\r\n border: '1px solid #eee',\r\n overflowY: 'auto',\r\n },\r\n};\r\n\r\nconst navLinkGroups: INavLinkGroup[] = [\r\n {\r\n links: [\r\n {\r\n name: 'Migration',\r\n links: [\r\n {\r\n key: 'Migration_Status',\r\n name: 'Status',\r\n },\r\n ],\r\n isExpanded: true,\r\n },\r\n ],\r\n },\r\n];\r\n\r\nexport class NavPane extends React.Component {\r\n constructor (props) {\r\n super(props);\r\n this.onLinkClick = this.onLinkClick.bind(this);\r\n }\r\n\r\n render () {\r\n return (\r\n \r\n );\r\n }\r\n\r\n onLinkClick(ev?: React.MouseEvent, item?: INavLink) {\r\n if (item && item.key) {\r\n this.props.onLinkClicked(item.key);\r\n }\r\n }\r\n};\r\n\r\n\r\n","export const { frontendHostUrl, backendBaseUrl, backendApplicationId, backendApplicationIdUri, backendTokenAuthority, backendTokenScope } = window['deploymentConfig'];","import { PublicClientApplication, InteractionRequiredAuthError } from \"@azure/msal-browser\";\r\nimport axios from 'axios'\r\n\r\nimport { frontendHostUrl, backendBaseUrl, backendApplicationId, backendApplicationIdUri, backendTokenAuthority, backendTokenScope } from './DeploymentConfiguration'\r\n\r\nconst msalInstance = new PublicClientApplication({\r\n auth: {\r\n clientId: backendApplicationId,\r\n authority: backendTokenAuthority,\r\n redirectUri: frontendHostUrl,\r\n },\r\n cache: {\r\n cacheLocation: 'sessionStorage'\r\n },\r\n});\r\n\r\nasync function acquireBackendToken() {\r\n // Get logged in account\r\n let currentAccount = null;\r\n\r\n const currentAccounts = msalInstance.getAllAccounts();\r\n if (currentAccounts) {\r\n currentAccount = currentAccounts[0];\r\n }\r\n\r\n if (!currentAccount) {\r\n // Not yet logged in; get user to log in\r\n const loginResponse = await msalInstance.loginPopup();\r\n if (loginResponse) {\r\n currentAccount = loginResponse.account;\r\n }\r\n }\r\n\r\n const accessTokenRequest = {\r\n account: currentAccount,\r\n scopes: [`${backendApplicationIdUri}/${backendTokenScope}`],\r\n };\r\n\r\n return msalInstance.acquireTokenSilent(accessTokenRequest).catch(error => {\r\n if (error instanceof InteractionRequiredAuthError) {\r\n return msalInstance.acquireTokenPopup(accessTokenRequest);\r\n } else {\r\n throw error;\r\n }\r\n });\r\n}\r\n\r\nexport async function backendGet(requestPath, requestParams) {\r\n const accessToken = await acquireBackendToken();\r\n return axios.get(`${backendBaseUrl}/${requestPath}`, {\r\n headers: {\r\n 'Authorization' : 'Bearer ' + accessToken.accessToken,\r\n },\r\n params: requestParams\r\n });\r\n}\r\n\r\nexport async function backendPost(requestPath, requestParams) {\r\n const accessToken = await acquireBackendToken();\r\n\r\n return axios.post(`${backendBaseUrl}/${requestPath}`, null, {\r\n headers: {\r\n 'Authorization' : 'Bearer ' + accessToken.accessToken,\r\n },\r\n params: requestParams\r\n })\r\n}\r\n","import React from 'react';\r\nimport { Modal } from 'office-ui-fabric-react/lib/Modal';\r\nimport { Stack } from 'office-ui-fabric-react/lib/Stack';\r\nimport { Text } from 'office-ui-fabric-react/lib/Text';\r\nimport { IconButton } from 'office-ui-fabric-react/lib/Button';\r\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react/lib/Spinner';\r\nimport { MessageBar, MessageBarType } from 'office-ui-fabric-react/lib/MessageBar'\r\nimport { Toggle } from 'office-ui-fabric-react/lib/Toggle';\r\nimport { DetailsList, CheckboxVisibility } from 'office-ui-fabric-react/lib/DetailsList';\r\n\r\nimport { backendGet } from './BackendClient';\r\n\r\nconst stackTokens = {\r\n childrenGap: 15,\r\n padding: 15,\r\n};\r\n\r\nconst afs1StatisticsHistoryListColumns = [\r\n {\r\n key: 'AFS1HistTimestamp',\r\n name: 'Timestamp',\r\n fieldName: 'timestamp',\r\n minWidth: 250,\r\n maxWidth: 300,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS1HistKnown',\r\n name: 'Known',\r\n fieldName: 'totalAfs1Agents',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS1CheckedInSinceMigration',\r\n name: 'Checked in since migration',\r\n fieldName: 'agentsCheckedInSinceMigration',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS1Silent30Days',\r\n name: '30 days silent',\r\n fieldName: 'agentsSilent30Days',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS1Silent60Days',\r\n name: '60 days silent',\r\n fieldName: 'agentsSilent60Days',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS1Silent90Days',\r\n name: '90 days silent',\r\n fieldName: 'agentsSilent90Days',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS1Silent120Days',\r\n name: '120 days silent',\r\n fieldName: 'agentsSilent120Days',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS1Lost',\r\n name: 'Lost',\r\n fieldName: 'agentsLost',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n];\r\n\r\nconst afs2StatisticsHistoryListColumns = [\r\n {\r\n key: 'AFS2HistTimestamp',\r\n name: 'Timestamp',\r\n fieldName: 'timestamp',\r\n minWidth: 250,\r\n maxWidth: 300,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS2HistKnown',\r\n name: 'Known',\r\n fieldName: 'agentsKnown',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS2HistReporting',\r\n name: 'Reporting',\r\n fieldName: 'agentsReportingToAFS2',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS2HistNotYetReporting',\r\n name: 'Not yet reporting',\r\n fieldName: 'agentsNotYetReportingToAFS2',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS2HistInTransition',\r\n name: 'In transition',\r\n fieldName: 'agentsInTransition',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS2HistPoliciesUpToDate',\r\n name: 'Policy up-to-date',\r\n fieldName: 'agentsPoliciesUpToDate',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'AFS2HistCredentialsUpToDate',\r\n name: 'Credentials up-to-date',\r\n fieldName: 'agentsCredentialsUpToDate',\r\n minWidth: 100,\r\n maxWidth: 200,\r\n isResizable: true,\r\n },\r\n];\r\n\r\n// Helper function for sorting the history\r\nfunction compareTimestampDescending(lhs, rhs) {\r\n if (lhs.timestamp < rhs.timestamp) {\r\n return 1;\r\n }\r\n if (lhs.timestamp > rhs.timestamp) {\r\n return -1;\r\n }\r\n return 0;\r\n}\r\n\r\n// Helper function for filtering duplicates\r\nfunction equalValues(lhs, rhs, type) {\r\n if (type === 'afs1') {\r\n return lhs.totalAfs1Agents === rhs.totalAfs1Agents\r\n && lhs.agentsCheckedInSinceMigration === rhs.agentsCheckedInSinceMigration\r\n && lhs.agentsSilent30Days === rhs.agentsSilent30Days\r\n && lhs.agentsSilent60Days === rhs.agentsSilent60Days\r\n && lhs.agentsSilent90Days === rhs.agentsSilent90Days\r\n && lhs.agentsSilent120Days === rhs.agentsSilent120Days\r\n && lhs.agentsLost === rhs.agentsLost;\r\n } else {\r\n return lhs.agentsKnown === rhs.agentsKnown\r\n && lhs.agentsReportingToAFS2 === rhs.agentsReportingToAFS2\r\n && lhs.agentsNotYetReportingToAFS2 === rhs.agentsNotYetReportingToAFS2\r\n && lhs.agentsInTransition === rhs.agentsInTransition\r\n && lhs.agentsPoliciesUpToDate === rhs.agentsPoliciesUpToDate\r\n && lhs.agentsCredentialsUpToDate === rhs.agentsCredentialsUpToDate;\r\n }\r\n}\r\n\r\nexport class TenantMigrationStatusHistory extends React.Component {\r\n constructor (props) {\r\n super(props);\r\n\r\n this.state = {\r\n statistics: null,\r\n filteredStatistics: null,\r\n showAll: false,\r\n errorMessage: null,\r\n };\r\n\r\n this.onDismiss = this.onDismiss.bind(this);\r\n this.onShowAllToggleChange = this.onShowAllToggleChange.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n // Get statistics from AFS1 or AFS2?\r\n let statisticsUrl = 'ops/migration/analyzer/tenant_analysis/get';\r\n if (this.props.source === 'afs1') {\r\n statisticsUrl = 'ops/migration/statistics/get';\r\n }\r\n\r\n backendGet(statisticsUrl, {\r\n tenant: this.props.tenant,\r\n include_history: true // This is actually a value-less parameter, but this version of Axios doesn't support that yet\r\n })\r\n .then(response => {\r\n const statistics = response.data.sort(compareTimestampDescending);\r\n\r\n // Filter out records where there was no change in values wrt the prior record\r\n let filteredStatistics = [];\r\n const recordCount = statistics.length;\r\n if (recordCount > 0)\r\n {\r\n filteredStatistics.push(statistics[recordCount-1]);\r\n for (let i = recordCount - 2; i >= 0; i--) {\r\n if (!equalValues(statistics[i], filteredStatistics[0], this.props.source))\r\n {\r\n filteredStatistics.unshift(statistics[i]);\r\n }\r\n }\r\n }\r\n\r\n this.setState({ statistics: statistics, filteredStatistics: filteredStatistics });\r\n })\r\n .catch(error => {\r\n const errorMessage = \"Error retrieving statistics history\" + (error?.response?.data ? (\": \" + error.response.data) : \"\");\r\n this.setState({ errorMessage: errorMessage });\r\n });\r\n }\r\n\r\n onDismiss () {\r\n this.props.onDismiss();\r\n }\r\n\r\n onShowAllToggleChange(ev, checked) {\r\n this.setState({ showAll: checked });\r\n }\r\n \r\n render () {\r\n const { statistics, filteredStatistics, showAll, errorMessage } = this.state;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Migration statistics history [{(this.props.source === 'afs1') ? 'AFS1' : 'AFS2'}]\r\n \r\n \r\n \r\n \r\n \r\n\r\n {(!statistics && !errorMessage) && }\r\n {(errorMessage) && {errorMessage}}\r\n {(statistics && !errorMessage) &&\r\n
\r\n \r\n \r\n
}\r\n
\r\n \r\n );\r\n }\r\n}","import React from 'react';\r\nimport { Modal } from 'office-ui-fabric-react/lib/Modal';\r\nimport { DefaultButton, PrimaryButton, IconButton } from 'office-ui-fabric-react/lib/Button';\r\nimport { Label } from 'office-ui-fabric-react/lib/Label';\r\nimport { Stack } from 'office-ui-fabric-react/lib/Stack';\r\nimport { Separator } from 'office-ui-fabric-react/lib/Separator';\r\nimport { TextField } from 'office-ui-fabric-react/lib/TextField';\r\nimport { DetailsList, CheckboxVisibility } from 'office-ui-fabric-react/lib/DetailsList';\r\nimport { MessageBar, MessageBarType } from 'office-ui-fabric-react/lib/MessageBar'\r\nimport { Text } from 'office-ui-fabric-react/lib/Text';\r\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react/lib/Spinner';\r\n\r\nimport { backendGet, backendPost } from './BackendClient';\r\nimport { TenantMigrationStatusHistory } from './TenantMigrationStatusHistory';\r\n\r\nconst maxRetryCount = 30;\r\nconst retryIntervalMS = 1000;\r\n\r\nconst stackTokensDialog = {\r\n padding: 15,\r\n};\r\n\r\nconst stackTokens = {\r\n childrenGap: 15,\r\n padding: 5,\r\n};\r\n\r\nconst stackTokensBlock = {\r\n childrenGap: 60,\r\n padding: 5,\r\n};\r\n\r\nconst migrationStateListColumns = [\r\n {\r\n key: 'MigrationStateNameKey',\r\n name: 'Name',\r\n fieldName: 'name',\r\n minWidth: 250,\r\n maxWidth: 300,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'MigrationStateStateKey',\r\n name: 'State',\r\n fieldName: 'state',\r\n minWidth: 100,\r\n maxWidth: 120,\r\n isResizable: true,\r\n },\r\n {\r\n key: 'MigrationStateDetailsKey',\r\n name: 'Details',\r\n fieldName: 'details',\r\n minWidth: 400,\r\n maxWidth: 800,\r\n isResizable: true,\r\n },\r\n];\r\n\r\nexport class TenantMigrationStatus extends React.Component {\r\n constructor (props) {\r\n super(props);\r\n\r\n this.state = {\r\n errorMessage: '',\r\n migrationStatistics: null,\r\n migrationStatisticsAreStale: false,\r\n fetchingStatistics: true,\r\n statisticsRefreshRetryCount: 0,\r\n migrationAnalysis: null,\r\n fetchingAnalysis: true,\r\n showAFS1StatisticsHistory: false,\r\n showAFS2StatisticsHistory: false,\r\n };\r\n\r\n this.onDismiss = this.onDismiss.bind(this);\r\n this.onDismissErrorMessage = this.onDismissErrorMessage.bind(this);\r\n this.onRefreshClicked = this.onRefreshClicked.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n backendGet('ops/migration/statistics/get', {\r\n tenant: this.props.tenant,\r\n })\r\n .then(response => {\r\n this.setState({ fetchingStatistics: false, migrationStatistics: response.data });\r\n })\r\n .catch(error => {\r\n const errorMessage = \"Error retrieving AFS1 statistics\" + (error?.response?.data ? (\": \" + error.response.data) : \"\");\r\n this.setState({ fetchingStatistics: false, errorMessage: errorMessage });\r\n }); \r\n\r\n backendGet('ops/migration/analyzer/tenant_analysis/get', {\r\n tenant: this.props.tenant,\r\n })\r\n .then(response => {\r\n this.setState({ fetchingAnalysis: false, migrationAnalysis: response.data });\r\n })\r\n .catch(error => {\r\n const errorMessage = \"Error retrieving AFS2 statistics\" + (error?.response?.data ? (\": \" + error.response.data) : \"\");\r\n this.setState({ fetchingAnalysis: false, errorMessage: errorMessage });\r\n });\r\n }\r\n\r\n clearMessages () {\r\n this.setState({ errorMessage: '' });\r\n }\r\n\r\n requestStatisticsRefresh() {\r\n this.setState({ fetchingStatistics: true, migrationStatisticsAreStale: true, statisticsRefreshRetryCount: 0 });\r\n\r\n // First get the most recent statistics\r\n backendGet('ops/migration/statistics/get', {\r\n tenant: this.props.tenant,\r\n })\r\n .then(response => {\r\n const currentStatistics = response.data;\r\n\r\n // Check if a migration timestamp is already available (i.e. if statistics have been requested before)\r\n if (currentStatistics) {\r\n this.setState({ migrationStatistics: currentStatistics });\r\n backendPost('ops/migration/statistics/refresh', {\r\n tenant: this.props.tenant\r\n })\r\n .then(response => {\r\n // Refresh request accepted, now schedule result retrieval\r\n setTimeout(this.getRefreshedStatistics.bind(this), retryIntervalMS);\r\n })\r\n .catch(error => {\r\n const message = \"AFS1 statistics refresh request failed\" + (error?.response?.data ? (\": \" + error.response.data) : \"\");\r\n this.setState({ fetchingStatistics: false, errorMessage: message });\r\n });\r\n }\r\n else\r\n {\r\n // Cannot get current statistics (should not occur)\r\n const errorMessage = \"AFS1 statistics refresh request failed, error retrieving current statistics\"\r\n this.setState({ fetchingStatistics: false, errorMessage: errorMessage });\r\n }\r\n })\r\n .catch(error => {\r\n const errorMessage = \"AFS1 statistics refresh request failed, error retrieving current statistics\" + (error?.response?.data ? (\": \" + error.response.data) : \"\");\r\n this.setState({ fetchingStatistics: false, errorMessage: errorMessage });\r\n }); \r\n }\r\n\r\n getRefreshedStatistics() {\r\n // Get statistics\r\n backendGet('ops/migration/statistics/get', {\r\n tenant: this.props.tenant,\r\n })\r\n .then(response => {\r\n const newStatistics = response.data;\r\n\r\n // Determine if the new statistics differ from the ones we retrieved earlier\r\n const currentStatistics = this.state.migrationStatistics;\r\n if (newStatistics != null && (currentStatistics == null || newStatistics.timestamp !== currentStatistics.timestamp)) {\r\n this.setState({ fetchingStatistics: false, migrationStatistics: newStatistics, migrationStatisticsAreStale: false });\r\n }\r\n else {\r\n // We didn't get new statistics, schedule a retry\r\n const { statisticsRefreshRetryCount } = this.state;\r\n if (statisticsRefreshRetryCount < maxRetryCount) {\r\n this.setState({ statisticsRefreshRetryCount : statisticsRefreshRetryCount + 1 });\r\n setTimeout(this.getRefreshedStatistics.bind(this), retryIntervalMS);\r\n }\r\n else {\r\n this.setState({ fetchingStatistics: false, errorMessage: 'Error retrieving AFS1 statistics: no (new) statistics available within timeout interval'});\r\n }\r\n }\r\n })\r\n .catch(error => {\r\n const errorMessage = \"Error retrieving AFS1 statistics\" + (error?.response?.data ? (\": \" + error.response.data) : \"\");\r\n this.setState({ fetchingStatistics: false, errorMessage: errorMessage });\r\n }); \r\n }\r\n\r\n getRefreshedAnalysis() {\r\n this.setState({ fetchingAnalysis: true });\r\n backendGet('ops/migration/analyzer/tenant', {\r\n tenant: this.props.tenant,\r\n })\r\n .then(response => {\r\n this.setState({ fetchingAnalysis: false, migrationAnalysis: response.data });\r\n })\r\n .catch(error => {\r\n const errorMessage = \"Error retrieving AFS2 statistics\" + (error?.response?.data ? (\": \" + error.response.data) : \"\");\r\n this.setState({ migrationAnalysis: null, fetchingAnalysis: false, errorMessage: errorMessage });\r\n });\r\n }\r\n\r\n showAFS1Statistics () {\r\n const { migrationStatistics, migrationStatisticsAreStale } = this.state;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n this.setState({ showAFS1StatisticsHistory: true })}/>\r\n {(migrationStatisticsAreStale) &&\r\n \r\n
\r\n (Warning, stale data! Last update (UTC): {migrationStatistics.timestamp})\r\n
}\r\n
\r\n );\r\n }\r\n\r\n showMigrationStates () {\r\n const { migrationStatistics, migrationStatisticsAreStale } = this.state;\r\n\r\n return (\r\n
\r\n {(migrationStatistics.migrationStates) && \r\n \r\n \r\n {(migrationStatisticsAreStale) &&\r\n \r\n
\r\n (Warning, stale data! Last update (UTC): {migrationStatistics.timestamp})\r\n
}\r\n
}\r\n {(!migrationStatistics.migrationStates) && No migration states available}\r\n
\r\n );\r\n }\r\n\r\n showAFS2Statistics () {\r\n const { migrationAnalysis } = this.state;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n this.setState({ showAFS2StatisticsHistory: true })}/>\r\n
\r\n );\r\n }\r\n\r\n render () {\r\n const { errorMessage, migrationStatistics, fetchingStatistics, migrationAnalysis, fetchingAnalysis, showAFS1StatisticsHistory, showAFS2StatisticsHistory } = this.state;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Tenant migration status\r\n \r\n \r\n \r\n \r\n \r\n
\r\n {(errorMessage !== '') && {errorMessage}}\r\n \r\n \r\n \r\n \r\n \r\n\r\n {(migrationStatistics) &&\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
}\r\n \r\n {(fetchingAnalysis || fetchingStatistics || migrationAnalysis || migrationStatistics) &&\r\n
\r\n
\r\n \r\n \r\n
\r\n Migration status according to AFS2\r\n
\r\n {(fetchingAnalysis) && }\r\n {(!fetchingAnalysis && migrationAnalysis) && this.showAFS2Statistics()}\r\n
\r\n \r\n \r\n
\r\n Migration status according to AFS1\r\n
\r\n {(fetchingStatistics) && }\r\n {(!fetchingStatistics && migrationStatistics) && this.showAFS1Statistics()}\r\n
\r\n
\r\n
\r\n
\r\n Migration states\r\n {(fetchingStatistics) && }\r\n {(!fetchingStatistics && migrationStatistics) && this.showMigrationStates()}\r\n
}\r\n\r\n {(showAFS2StatisticsHistory) && \r\n this.setState({ showAFS2StatisticsHistory: false })}\r\n />}\r\n {(showAFS1StatisticsHistory) && \r\n this.setState({ showAFS1StatisticsHistory: false })}\r\n />}\r\n
\r\n \r\n );\r\n }\r\n\r\n onDismiss () {\r\n this.props.onDismiss();\r\n }\r\n \r\n onDismissErrorMessage () {\r\n this.setState({ errorMessage: '' });\r\n }\r\n \r\n onRefreshClicked () {\r\n this.clearMessages();\r\n this.requestStatisticsRefresh();\r\n this.getRefreshedAnalysis();\r\n }\r\n}","import React from 'react';\r\nimport { Stack } from 'office-ui-fabric-react/lib/Stack';\r\nimport { Text } from 'office-ui-fabric-react/lib/Text';\r\nimport { TextField } from 'office-ui-fabric-react/lib/TextField';\r\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react/lib/Spinner';\r\nimport { MessageBar, MessageBarType } from 'office-ui-fabric-react/lib/MessageBar'\r\nimport { DetailsList, CheckboxVisibility, ConstrainMode, SelectionMode } from 'office-ui-fabric-react/lib/DetailsList';\r\nimport { TooltipHost } from 'office-ui-fabric-react/lib/Tooltip';\r\n\r\nimport { backendGet } from './BackendClient';\r\nimport { TenantMigrationStatus } from './TenantMigrationStatus';\r\n\r\nconst stackTokensDialog = {\r\n childrenGap: 15,\r\n padding: 15,\r\n};\r\n\r\nconst stackTokensFilters = {\r\n childrenGap: 20,\r\n};\r\n\r\nconst tenantListColumns = [\r\n {\r\n key: 'Tenant',\r\n name: 'Tenant',\r\n fieldName: 'tenant',\r\n minWidth: 250,\r\n maxWidth: 300,\r\n isResizable: true,\r\n isSorted: true,\r\n isSortedDescending: false,\r\n },\r\n {\r\n key: 'AFS2Timestamp',\r\n name: 'Last refresh',\r\n fieldName: 'timestamp',\r\n minWidth: 250,\r\n maxWidth: 300,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS2Known',\r\n name: 'AFS2:Known',\r\n fieldName: 'afs2AgentsKnown',\r\n ariaLabel: 'Agents known by AFS2',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS2KnownRatio',\r\n name: 'AFS2:Known vs AFS1',\r\n fieldName: 'ratioKnownAFS1vsAFS2',\r\n ariaLabel: 'Ratio of agents known to AFS2 vs AFS1',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS2Reporting',\r\n name: 'AFS2:Reporting',\r\n fieldName: 'afs2AgentsReportingToAFS2',\r\n ariaLabel: 'Agents reporting to AFS2',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS2ReportingRatio',\r\n name: 'AFS2:Reporting ratio',\r\n fieldName: 'ratioAFS2Reporting',\r\n ariaLabel: 'Agents reporting to AFS2 as a ratio of the total number of known agents',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS2NotYetReporting',\r\n name: 'AFS2:Not yet reporting',\r\n fieldName: 'afs2AgentsNotYetReportingToAFS2',\r\n ariaLabel: 'Agents not yet reporting to AFS2',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS2InTransition',\r\n name: 'AFS2:In transition',\r\n fieldName: 'afs2AgentsInTransition',\r\n ariaLabel: 'Agents in transition (AFS2)',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS2PoliciesUpToDate',\r\n name: 'AFS2:Policy up-to-date',\r\n fieldName: 'afs2AgentsPoliciesUpToDate',\r\n ariaLabel: 'Agents with an up-to-date AFS2 policy',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS2PoliciesUpToDateRatio',\r\n name: 'AFS2:Policy up-to-date ratio',\r\n fieldName: 'ratioAFS2PolicyUpToDate',\r\n ariaLabel: 'Agents with an up-to-date AFS2 policy as a ratio of the total number of known agents',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS2CredentialsUpToDate',\r\n name: 'AFS2:Credentials up-to-date',\r\n fieldName: 'afs2AgentsCredentialsUpToDate',\r\n ariaLabel: 'Agents with up-to-date credentials (AFS2)',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS1Known',\r\n name: 'AFS1:Known',\r\n fieldName: 'afs1TotalAgents',\r\n ariaLabel: 'Agents known by AFS1',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS1CheckedInSinceMigration',\r\n name: 'AFS1:Checked in since migration',\r\n fieldName: 'afs1AgentsCheckedInSinceMigration',\r\n ariaLabel: 'Agents that checked in to AFS1 since the migration',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS1Silent30Days',\r\n name: 'AFS1:30 days silent',\r\n fieldName: 'afs1AgentsSilent30Days',\r\n ariaLabel: 'Agents that have not checked in to AFS1 for 30 days',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS1Silent60Days',\r\n name: 'AFS1:60 days silent',\r\n fieldName: 'afs1AgentsSilent60Days',\r\n ariaLabel: 'Agents that have not checked in to AFS1 for 60 days',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS1Silent90Days',\r\n name: 'AFS1:90 days silent',\r\n fieldName: 'afs1AgentsSilent90Days',\r\n ariaLabel: 'Agents that have not checked in to AFS1 for 90 days',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS1Silent120Days',\r\n name: 'AFS1:120 days silent',\r\n fieldName: 'afs1AgentsSilent120Days',\r\n ariaLabel: 'Agents that have not checked in to AFS1 for 120 days',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n {\r\n key: 'AFS1Lost',\r\n name: 'AFS1:Lost',\r\n fieldName: 'afs1AgentsLost',\r\n ariaLabel: 'Agents that have not checked in to AFS1 for more than 150 days and are considered lost',\r\n minWidth: 75,\r\n maxWidth: 100,\r\n isResizable: true,\r\n isSorted: false,\r\n isSortedDescending: true,\r\n },\r\n];\r\n\r\nfunction sortList (items, key, ascending) {\r\n if (key === 'tenant') {\r\n if (ascending) {\r\n return items.slice().sort((a, b) => (a[key].localeCompare(b[key], 'en', {'sensitivity': 'base'})));\r\n } else {\r\n return items.slice().sort((a, b) => (b[key].localeCompare(a[key], 'en', {'sensitivity': 'base'})));\r\n }\r\n } else {\r\n return items.slice().sort((a, b) => ((ascending ? a[key] > b[key] : a[key] < b[key]) ? 1 : -1));\r\n }\r\n}\r\n\r\nfunction renderHeaderTooltip(props, defaultRender) {\r\n return defaultRender({\r\n ...props,\r\n onRenderColumnHeaderTooltip: (tooltipHostProps) => {\r\n return (\r\n \r\n )\r\n }\r\n });\r\n}\r\n\r\nfunction renderItemColumn(item, index, column) {\r\n if (column.key === 'Tenant') {\r\n const tenantName = item['tenantName'];\r\n const tenantId = item['tenantId'];\r\n if (tenantName) { \r\n return
{tenantName}({tenantId})
;\r\n } else {\r\n return {tenantId};\r\n }\r\n }\r\n else if (column.key.endsWith('Ratio')) {\r\n return {Math.floor(item[column.fieldName] * 100)}%;\r\n } else {\r\n return {item[column.fieldName]};\r\n };\r\n} \r\n\r\nexport class TenantMigrationStatusList extends React.Component {\r\n constructor (props) {\r\n super(props);\r\n\r\n this.state = {\r\n errorMessage: null,\r\n activeColumns: tenantListColumns.slice(),\r\n sortedTenantList: null,\r\n sortColumnName: 'tenant',\r\n sortAscending: true,\r\n selectedTenant: null,\r\n filterText: '',\r\n filterCount: 0,\r\n showDetails: false,\r\n };\r\n\r\n this.onColumnHeaderClick = this.onColumnHeaderClick.bind(this);\r\n this.onFilterTextChanged = this.onFilterTextChanged.bind(this);\r\n this.onFilterCountChanged = this.onFilterCountChanged.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n backendGet('ops/migration/status/get', {})\r\n .then(response => {\r\n const tenantList = response.data;\r\n\r\n // Augment data\r\n tenantList.forEach((tenant) => {\r\n tenant.tenant = tenant.tenantName ? tenant.tenantName + ' (' + tenant.tenantId + ')' : tenant.tenantId;\r\n tenant.ratioKnownAFS1vsAFS2 = (tenant.afs1TotalAgents > 0) ? tenant.afs2AgentsKnown / tenant.afs1TotalAgents : 0;\r\n tenant.ratioAFS2Reporting = (tenant.afs2AgentsKnown > 0) ? tenant.afs2AgentsReportingToAFS2 / tenant.afs2AgentsKnown : 0;\r\n tenant.ratioAFS2PolicyUpToDate = (tenant.afs2AgentsKnown > 0) ? tenant.afs2AgentsPoliciesUpToDate / tenant.afs2AgentsKnown : 0;\r\n }); \r\n\r\n this.setState({ sortedTenantList: sortList(tenantList, this.state.sortColumnName, this.state.sortAscending) });\r\n })\r\n .catch(error => {\r\n const errorMessage = \"Error retrieving tenants\" + (error?.response?.data ? (\": \" + error.response.data) : \"\");\r\n this.setState({ errorMessage: errorMessage });\r\n });\r\n }\r\n\r\n onColumnHeaderClick (ev, clickedColumn) {\r\n const { activeColumns, sortedTenantList } = this.state;\r\n\r\n // Update the column structure tDetermine the new sorting column and/or direction and update the column structure\r\n let sortColumnName = null;\r\n let sortAscending = true;\r\n const columns = activeColumns.slice();\r\n\r\n columns.forEach((column) => {\r\n if (column.key === clickedColumn.key) {\r\n column.isSortedDescending = !column.isSortedDescending;\r\n column.isSorted = true;\r\n sortColumnName = column.fieldName;\r\n sortAscending = !column.isSortedDescending\r\n } else {\r\n column.isSorted = false;\r\n column.isSortedDescending = true;\r\n }\r\n });\r\n\r\n // Sort the data\r\n const newlySortedTenantList = sortList(sortedTenantList, sortColumnName, sortAscending);\r\n\r\n // Update state\r\n this.setState({\r\n activeColumns: columns,\r\n sortedTenantList: newlySortedTenantList,\r\n sortColumnName: sortColumnName,\r\n sortAscending: sortAscending,\r\n });\r\n }\r\n\r\n onFilterTextChanged (ev, newValue) {\r\n this.setState({ filterText: newValue });\r\n }\r\n\r\n onFilterCountChanged (ev, newValue) {\r\n this.setState({ filterCount: newValue });\r\n }\r\n\r\n getFilteredTenantList () {\r\n const { sortedTenantList, filterText, filterCount } = this.state;\r\n return sortedTenantList.filter(i =>\r\n (filterText === '' || i.tenant.toLowerCase().indexOf(filterText) > -1)\r\n && (filterCount === '' || isNaN(filterCount) || i.afs1TotalAgents >= filterCount) \r\n );\r\n }\r\n\r\n render () {\r\n const { sortedTenantList, errorMessage, selectedTenant, filterText, filterCount, activeColumns, showDetails } = this.state;\r\n\r\n return (\r\n \r\n Tenant migration status\r\n {(!sortedTenantList && !errorMessage) && }\r\n {(errorMessage) && {errorMessage}}\r\n {(sortedTenantList && !errorMessage) &&\r\n \r\n \r\n \r\n \r\n \r\n this.setState({ showDetails: true, selectedTenant: item.tenantId })}\r\n onColumnHeaderClick={this.onColumnHeaderClick}\r\n onRenderDetailsHeader={renderHeaderTooltip}\r\n onRenderItemColumn={renderItemColumn}\r\n />\r\n \r\n }\r\n\r\n {(showDetails) && this.setState({ showDetails: false })} />}\r\n \r\n );\r\n }\r\n}","import React from 'react';\r\nimport { Stack } from 'office-ui-fabric-react/lib/Stack';\r\nimport { MessageBar, MessageBarType } from 'office-ui-fabric-react/lib/MessageBar';\r\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react/lib/Spinner';\r\n\r\nimport { NavPane } from './NavPane';\r\nimport { TenantMigrationStatusList } from './TenantMigrationStatusList';\r\n\r\nimport { backendGet } from './BackendClient';\r\n\r\nconst stackTokens = {\r\n childrenGap: 15,\r\n};\r\n\r\nexport class App extends React.Component {\r\n constructor (props) {\r\n super(props);\r\n\r\n this.state = {\r\n authorizationCheckInProgress: true,\r\n authorizedComponents: [],\r\n activeNavLink: 'Migration_Status',\r\n };\r\n \r\n this.onNavLinkClicked = this.onNavLinkClicked.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n // Check the role of the user so the user is only presented options that they are actually permitted to use\r\n backendGet('ops/user/info', {})\r\n .then(response => {\r\n const userRoles = response.data.roles;\r\n let authorizedComponents = [];\r\n if (userRoles.includes('FullAccess') || userRoles.includes('ReadOnlyAccess')){\r\n authorizedComponents.push('TenantMigration');\r\n }\r\n this.setState({ authorizationCheckInProgress: false, authorizedComponents: authorizedComponents });\r\n })\r\n .catch(error => {\r\n this.setState({ authorizationCheckInProgress: false, authorizedComponents: [] });\r\n })\r\n }\r\n\r\n render () {\r\n const { authorizationCheckInProgress, authorizedComponents, activeNavLink } = this.state;\r\n\r\n //FIXME: nav: this is a temporary hack; integrate react-router\r\n return (\r\n
\r\n {(authorizationCheckInProgress) && }\r\n { (authorizedComponents.includes('TenantMigration')) &&\r\n \r\n \r\n {(activeNavLink === 'Migration_Status') && }\r\n \r\n }\r\n { (!authorizationCheckInProgress && !authorizedComponents.includes('TenantMigration')) &&\r\n Unauthorized. You are not authorized to use this application.\r\n }\r\n
\r\n );\r\n }\r\n\r\n onNavLinkClicked(key) {\r\n this.setState({activeNavLink: key});\r\n }\r\n\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { App } from './App';\r\nimport { Fabric } from 'office-ui-fabric-react/lib/Fabric';\r\nimport { initializeIcons } from 'office-ui-fabric-react/lib/Icons';\r\n\r\ninitializeIcons();\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n"],"sourceRoot":""}