{"version":3,"sources":["components/NavMenu.tsx","components/Footer.tsx","components/Layout.tsx","itemstorage.ts","constants.ts","components/Loading.tsx","components/Alert.tsx","views/ProductInfo.tsx","settings/Images.ts","services/SharePointService.ts","services/TenantService.ts","services/PrerequisitesService.ts","services/ValidationService.ts","views/ProductForm.tsx","settings/Report/ReportSettings.ts","components/Report/widgets/ScoreCard.tsx","components/Report/fields/Header.tsx","components/Report/fields/Wrapper.tsx","components/Report/controls/NavPills.tsx","components/Report/widgets/TenancyStats.tsx","components/Report/widgets/PieChartCard.tsx","components/Report/controls/Pagination.tsx","services/Utils.ts","components/Report/widgets/TableCard.tsx","components/Report/widgets/Spinner.tsx","components/Report/widgets/CounterCard.tsx","views/Report/Tabs/OverviewTab.tsx","components/Report/widgets/LineChartCard.tsx","views/Report/Tabs/TeamsTab.tsx","views/Report/Tabs/ChannelsTab.tsx","views/Report/Tabs/AppsTab.tsx","components/Report/widgets/ReRunButton.tsx","views/Report/TenancyReport.tsx","views/FormComplete.tsx","services/ProductService.ts","services/SettingsService.ts","services/ReportService.ts","auth/AuthUtil.ts","auth/AuthProvider.ts","App.tsx","registerServiceWorker.js","index.tsx"],"names":["NavMenu","props","toggleNavbar","bind","state","collapsed","userAccount","undefined","this","authProvider","account","getAccount","setState","displayName","name","email","userName","className","href","alt","src","type","data-toggle","aria-expanded","aria-label","target","id","aria-haspopup","aria-labelledby","renderAccountButton","Component","Footer","rel","React","Layout","children","ItemStorage","key","value","sessionStorage","setItem","JSON","stringify","getItem","parse","removeItem","clear","Constants","productInfo","uniqueId","site","page","Loading","Alert","role","message","data-dismiss","aria-hidden","ProductInfo","loading","clearStorageItem","params","QueryString","location","search","product","uid","productService","getProductInfo","scopes","permissions","length","filter","x","requiresConsent","forEach","item","push","scope","setStorageItem","history","console","log","window","renderInfo","errors","map","error","i","contents","perm","description","prerequisites","pre","features","feature","label","productInfoInstallButtonText","onClick","formatted","split","section","uniqid","logo","renderProductLogo","tagLine","renderInstallButton","headerImage","renderProductDescription","renderProductFeatures","renderProductPrerequisites","renderProductRequirements","productImages","renderCarousel","supportLink","renderErrors","data-ride","image","data-target","data-slide-to","title","data-slide","_imageRestrictions","SharePointService","tenantName","rootSPUrl","tokenScope","acquireToken","accessTokenResult","fetch","method","headers","Headers","accessToken","response","ok","json","result","corporateCatalogUrl","d","CorporateCatalogUrl","TenantService","domains","verifiedDomains","indexOf","PrerequisitesService","getTenantName","checkAppCatalogExists","isValid","errorMessage","ValidationService","validators","val","a","siteCollectionFormat","data","dataPath","parentData","parentDataProperty","rootData","validator","ProductForm","_tenantName","fileReader","uploadField","extraErrors","onChange","onInstall","SiteCollectionInput","SiteLogoPicker","fileChosen","siteLogoLoader","chooseFile","FileReader","addEventListener","getStorageItem","ensureLogin","prerequisitesService","validate","validationSchema","init","prerequisitesValidationResult","tenant","renderBody","schema","objectSchema","uiSchema","widgets","CheckboxWidget","CustomCheckbox","TextWidget","CustomStringInput","CustomTwitterInput","CustomColourPicker","CheckboxesWidget","CustomCheckboxGroup","CustomSlider","formData","onSubmit","customFormats","transformErrors","showErrorList","goBack","ev","fieldId","__errors","productFormInstallButtonText","formObj","submittedData","properties","siteLogo","base64Image","siteUrl","siteurl","encodeURI","getApiAccessToken","install","format","disabled","readonly","autofocus","options","enumOptions","enumDisabled","_onChange","option","checked","all","selected","at","slice","concat","sort","b","selectValue","v","deselectValue","index","itemDisabled","autoFocus","rawErrors","required","currentValue","event","readOnly","min","minimum","max","maximum","placeholder","toLowerCase","opt","idx","multiple","acceptOptions","accept","toString","ref","field","click","parentEvent","filecontrol","currentTarget","files","chosenFile","readAsDataURL","prevState","imgData","Promise","res","rej","Image","onload","width","height","evt","total","pushError","imageSizeValid","h","w","ReportSettings","reportId","listItemLimit","reflektUrl","productPageUrl","orphanedTeams","duplicateTeams","teamsWithGuests","externalApps","ReportStrings","headerTitle","headerDescription","scoreCard","scoreLabel","good","bad","reflektBlurb","overview","blurb","teamsCounter","guestsCounter","storageCounter","duplicateCounter","totalGuestsCounter","appsCounter","orphanedTeamsList","allTeamsList","visibilityChart","teams","allTeams","documentsCounter","foldersCounter","teamsList","teamsGrowthChart","channels","channelsCounter","growthChart","apps","appsList","ScoreCard","scorePieChart","score","renderScore","renderBlurb","renderChart","renderFooter","getTextColour","getIcon","y","r","background","dataSource","xName","yName","radius","innerRadius","palettes","Header","healthScore","Wrapper","NavPills","renderPills","currentTab","pillClicked","notificationCount","icon","TenancyStats","renderItems","stats","stat","PieChartCard","pieRef","colour","badgeText","text","lines","ellipsis","buttons","moreText","lessText","renderBadge","chartOptions","legendSettings","visible","enableSmartLabels","enableAnimation","tooltip","enable","services","AccumulationLegend","PieSeries","AccumulationDataLabel","AccumulationTooltip","dataLabel","badgeColour","Pagination","renderPageSelectors","pageCount","currentPage","onPageChange","pageSelectors","pages","getPages","totalPages","isFirst","isLast","j","Utilities","ReviveDateTime","exec","Date","bytesValue","toFixed","TableCard","grid","onTitleClick","dataBound","subtitle","items","renderTable","renderPagination","renderNoItems","renderPlaceholder","resizeable","allowResizing","g","Resize","renderTableColumns","columnInfo","column","template","teamId","webUrl","spaceUsed","convertToStorageSizeString","hasPrivateChannels","enablePaging","autoFitColumns","Spinner","CounterCard","renderValue","OverviewTab","visibilityChartData","position","formatVisibilityChartData","prevProps","reportData","totalTeams","getCounterColour","getCounterIcon","totalDuplicateTeams","totalExternalApps","totalGuestTeams","totalGuests","totalStorageUsed","renderTeamsList","onTeamClick","headerText","clipMode","results","totalPrivateTeams","totalPublicTeams","LineChartCard","primaryXAxis","primaryYAxis","ColumnSeries","Tooltip","LineSeries","DateTime","Category","renderChartSeries","seriesInfo","series","TeamsTab","tabClicked","tabIndex","activeView","creationChartData","valueType","labelFormat","shared","predictionData","formatCreationChartData","formatPredictionChartData","orphanedOverviewInfo","creationData","renderSectionToggles","renderContent","renderOrphanedSection","renderAllTeamsSection","pieChartData","totalDocuments","totalFolders","creationPeriod","rowCount","teamsTablePageChange","replaceAll","renderOrphanedCountBadge","orphanedTeamCount","month","year","monthNames","getMonths","today","getFullYear","getMonth","countIndex","findIndex","storedValues","period","toISOString","count","totalTeamsCreated","ChannelsTab","channelsInfo","totalChannelsCount","monthlyCreationReport","totalChannelsCreated","visibilityReport","privateChannelsCount","sharedChannelsCount","standardChannelsCount","AppsTab","sampleTableItems","url","teamsWithExternalApps","uniqueExternalAppsCount","topExternalAppAggregate","ReRunButton","onReRunClick","open","TenancyReport","pillIndex","activeTab","paging","teamsWithExtApps","fetchTabData","teamsTabAllTablePageChange","pageNumber","getTeams","appsTabTeamTablePageChange","getAppsTabData","onPrintClick","alert","tabs","settings","teamCreationChartPeriod","channelCreationChartPeriod","topExtAppsLimit","fromStorage","reportid","setStorageItemAsString","getStorageItemAsString","getApiScope","replace","loadInitialData","scrollTo","top","renderHeader","renderReport","renderTenancyStats","renderAbout","renderTab","overviewInfo","growthPrediction","getOverviewTabData","getTeamsTabData","getChannelsTabData","reportService","getOrphanedOverviewData","orphanedOverviewData","getTeamsCreated","teamsGrowth","getGrowthPrediction","getAllTeams","getChannelsSummary","getExternalAppsSummary","summary","getExtAppsTeams","getTeamsWithExternalApps","getOverviewData","getOrphanedTeams","totalChannels","calculateHealthScore","Math","ceil","ProductFormComplete","ProductService","acccessToken","siteParam","pageParam","body","SettingsService","ReportService","pageSize","months","isIE","ua","navigator","userAgent","msie","msie11","GRAPH_SCOPES","OPENID","PROFILE","USER_READ","AuthProvider","authSettings","msalApp","apiScope","clientId","baseUrl","protocol","host","UserAgentApplication","auth","authority","instance","validateAuthority","postLogoutRedirectUri","navigateToLoginRequestUrl","cache","cacheLocation","storeAuthStateInCookie","handleRedirectCallback","authScopes","loginRedirect","loginPopup","acquireTokenSilent","authResponse","settingsService","App","getAuthSettings","exact","path","component","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","controller","catch","document","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","render","basename","URL","process","origin","status","get","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.37890bed.chunk.js","sourcesContent":["import React, { Component } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport './NavMenu.css';\r\nimport AuthProvider from \"../auth/AuthProvider\";\r\n\r\ninterface IUserAccount {\r\n displayName: string;\r\n email: string;\r\n}\r\n\r\ninterface INavMenuProps {\r\n authProvider?: AuthProvider;\r\n}\r\n\r\ninterface INavMenuState {\r\n collapsed: boolean;\r\n userAccount?: IUserAccount;\r\n}\r\n\r\nexport class NavMenu extends Component {\r\n static displayName = NavMenu.name;\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.toggleNavbar = this.toggleNavbar.bind(this);\r\n this.state = {\r\n collapsed: true,\r\n userAccount: undefined,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n }\r\n\r\n componentDidUpdate() {\r\n if(this.props.authProvider && this.state.userAccount == undefined) {\r\n const account = this.props.authProvider.getAccount();\r\n if(account) {\r\n this.setState({\r\n ...this.state,\r\n userAccount: {\r\n displayName: account.name,\r\n email: account.userName\r\n }\r\n });\r\n }\r\n }\r\n }\r\n \r\n toggleNavbar() {\r\n this.setState({\r\n collapsed: !this.state.collapsed\r\n });\r\n }\r\n\r\n\r\n render() {\r\n return ();\r\n }\r\n\r\n private renderAccountButton():React.ReactFragment{\r\n return (
  • \r\n \r\n account_circle {this.state.userAccount ? this.state.userAccount.displayName : Not signed in }\r\n
    \r\n
    \r\n
    \r\n {this.state.userAccount ? \r\n (<>Signed in as: {`${this.state.userAccount.displayName} (${this.state.userAccount.email})`})\r\n : (Not signed in)\r\n }\r\n
    \r\n
    \r\n
  • );\r\n }\r\n\r\n}\r\n","import * as React from 'react';\r\n\r\nexport interface FooterProps {\r\n}\r\n\r\nexport interface FooterState {\r\n}\r\n\r\nexport default class Footer extends React.Component {\r\n constructor(props: FooterProps) {\r\n super(props);\r\n\r\n this.state = {\r\n };\r\n }\r\n\r\n public render() {\r\n return (\r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { NavMenu } from './NavMenu';\r\nimport Footer from './Footer';\r\nimport AuthProvider from '../auth/AuthProvider';\r\n\r\ninterface ILayoutProps {\r\n authProvider?: AuthProvider;\r\n}\r\n\r\nexport class Layout extends Component {\r\n static displayName = Layout.name;\r\n\r\n render() {\r\n return (\r\n
    \r\n \r\n {this.props.children}\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","\r\nexport class ItemStorage {\r\n public static setStorageItem(key: string, value: any) {\r\n sessionStorage.setItem(key, JSON.stringify(value));\r\n }\r\n\r\n public static setStorageItemAsString(key: string, value: any) {\r\n sessionStorage.setItem(key, value);\r\n }\r\n\r\n public static getStorageItem(key: string): any {\r\n var value = sessionStorage.getItem(key);\r\n if(value) {\r\n return JSON.parse(value);\r\n }\r\n }\r\n\r\n public static getStorageItemAsString(key: string): any {\r\n var value = sessionStorage.getItem(key);\r\n return value;\r\n }\r\n\r\n public static clearStorageItem(key: string) {\r\n sessionStorage.removeItem(key);\r\n }\r\n\r\n public static clear() {\r\n sessionStorage.clear();\r\n }\r\n}","\r\nexport class Constants {\r\n public static productInfo: string = \"ProductInfo\";\r\n public static uniqueId: string = \"uid\";\r\n public static site: string = \"site\";\r\n public static page: string = \"pageUrl\";\r\n}","import * as React from 'react';\r\nimport './Loading.css';\r\n\r\nexport interface LoadingProps {\r\n}\r\n\r\nexport interface LoadingState {\r\n}\r\n\r\nexport default class Loading extends React.Component {\r\n constructor(props: LoadingProps) {\r\n super(props);\r\n\r\n this.state = {\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \"Konsolute\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\n\r\nexport interface AlertProps {\r\n message:string;\r\n}\r\n\r\nexport interface AlertState {\r\n}\r\n\r\nexport default class Alert extends React.Component {\r\n constructor(props: AlertProps) {\r\n super(props);\r\n\r\n this.state = {\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n Something went wrong. {this.props.message}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport * as QueryString from \"query-string\";\r\nimport uniqid from 'uniqid';\r\n\r\nimport { IProductService } from \"../services/IProductService\";\r\nimport { IProductInfo } from \"../models/ProductInfo\";\r\n\r\nimport { ItemStorage } from \"../itemstorage\";\r\nimport { Constants } from \"../constants\";\r\n\r\nimport Loading from '../components/Loading';\r\nimport Alert from '../components/Alert';\r\n\r\ninterface IBaseProps extends RouteComponentProps<{}> {\r\n productService: IProductService;\r\n}\r\n\r\ninterface IProductInfoState {\r\n loading: boolean;\r\n productInfo?: IProductInfo;\r\n errors?: string[];\r\n}\r\n\r\nexport class ProductInfo extends Component {\r\n constructor(props: IBaseProps) {\r\n super(props);\r\n\r\n this.state = {\r\n loading: true\r\n };\r\n }\r\n\r\n async componentDidMount() {\r\n // clear previous values\r\n ItemStorage.clearStorageItem(Constants.productInfo);\r\n ItemStorage.clearStorageItem(Constants.uniqueId);\r\n ItemStorage.clearStorageItem(Constants.page);\r\n ItemStorage.clearStorageItem(Constants.site);\r\n\r\n const params = QueryString.parse(this.props.location.search);\r\n if (params.product && params.uid) {\r\n try {\r\n var productInfo = await this.props.productService.getProductInfo(params.product as string);\r\n var scopes: string[] = [];\r\n\r\n if (productInfo.permissions && productInfo.permissions.length > 0)\r\n productInfo.permissions.filter(x => x.requiresConsent).forEach((item) => {\r\n scopes.push(item.scope);\r\n });\r\n\r\n ItemStorage.setStorageItem(Constants.productInfo, productInfo);\r\n ItemStorage.setStorageItem(Constants.uniqueId, params.uid);\r\n\r\n // set the page in storage for reference it later\r\n if (params.page) {\r\n ItemStorage.setStorageItem(Constants.page, params.page);\r\n }\r\n\r\n if (params.site) {\r\n // if site parameter is present, then redirect directly to the form\r\n ItemStorage.setStorageItem(Constants.site, params.site);\r\n\r\n this.props.history.push(\"/form\");\r\n }\r\n\r\n this.setState({\r\n loading: false,\r\n productInfo: productInfo\r\n });\r\n }\r\n catch (err) {\r\n console.log(err);\r\n }\r\n } else {\r\n console.log('Product not specified, redirecting to products page...');\r\n window.location.href = 'https://www.konsolute.com/products';\r\n }\r\n }\r\n\r\n public render() {\r\n return <>\r\n {\r\n this.state.loading ?\r\n : this.renderInfo()\r\n }\r\n ;\r\n }\r\n\r\n private renderErrors(): React.ReactNode | void {\r\n if (this.state.errors && (this.state.errors.length > 0)) {\r\n return this.state.errors.map((error, i) => {\r\n return ;\r\n });\r\n }\r\n }\r\n\r\n private renderProductRequirements(): React.ReactNode | void {\r\n const { productInfo } = this.state;\r\n if (productInfo && productInfo.permissions && (productInfo.permissions.length > 0)) {\r\n let contents = (
    \r\n
      \r\n {productInfo.permissions.map((perm, i) => {\r\n return (
    • \r\n
      {perm.displayName}
      \r\n

      {perm.description}

      \r\n
    • );\r\n })}\r\n
    \r\n
    );\r\n return (
    \r\n
    \r\n

    Permission Requirements

    \r\n
    \r\n {contents}\r\n
    \r\n
    );\r\n }\r\n\r\n }\r\n\r\n private renderProductPrerequisites(): React.ReactNode | void {\r\n const { productInfo } = this.state;\r\n if (productInfo && productInfo.prerequisites && (productInfo.prerequisites.length > 0)) {\r\n let contents = (
    \r\n
      \r\n {productInfo.prerequisites.map((pre, i) => {\r\n return (
    • \r\n
      {pre.displayName}
      \r\n
    • );\r\n })}\r\n
    \r\n
    );\r\n return (
    \r\n

    Prerequisites

    \r\n
    \r\n {contents}\r\n
    \r\n
    );\r\n }\r\n }\r\n\r\n private renderProductFeatures(): React.ReactNode | void {\r\n if (this.state.productInfo && this.state.productInfo.features)\r\n return (this.state.productInfo.features.map((feature, i) => {\r\n return (
    \r\n
    \r\n stars\r\n
    \r\n
    \r\n
    {feature.name}
    \r\n

    {feature.description}

    \r\n
    \r\n
    );\r\n }));\r\n }\r\n\r\n private renderInstallButton(): React.ReactElement {\r\n let label: string = \"Install to tenancy\";\r\n const { productInfo } = this.state;\r\n\r\n if (productInfo && productInfo.productInfoInstallButtonText) {\r\n label = productInfo.productInfoInstallButtonText;\r\n }\r\n return \r\n }\r\n\r\n private renderProductDescription(): React.ReactFragment | void {\r\n const { productInfo } = this.state;\r\n\r\n if (productInfo && productInfo.description) {\r\n let formatted = productInfo.description.split('\\n');\r\n\r\n return (<>\r\n

    Product Description

    \r\n
    \r\n { formatted.map((section, i) =>

    {section}

    ) }\r\n
    \r\n );\r\n }\r\n }\r\n\r\n private renderProductLogo(): React.ReactFragment | void {\r\n const { productInfo } = this.state;\r\n\r\n if (productInfo && productInfo.logo) {\r\n return (
    \r\n
    \r\n \"Product\r\n
    \r\n
    );\r\n }\r\n }\r\n\r\n private renderInfo(): React.ReactFragment {\r\n return (<>\r\n
    \r\n
    \r\n
    \r\n
    \r\n {this.renderProductLogo()}\r\n
    \r\n
    \r\n

    {this.state.productInfo?.displayName}

    \r\n

    {this.state.productInfo?.tagLine}

    \r\n
    \r\n {this.renderInstallButton()}\r\n
    \r\n
    \r\n
    \r\n
    \"A
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {this.renderProductDescription()}\r\n {this.renderProductFeatures()}\r\n\r\n
    \r\n
    \r\n {this.renderProductPrerequisites()}\r\n {this.renderProductRequirements()}\r\n
    \r\n
    \r\n {((this.state.productInfo) && this.state.productInfo?.productImages.length > 0) && this.renderCarousel()}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    Additional support is available via our Support Portal

    \r\n \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    Our other products

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \"Auto\r\n \r\n
    \r\n
    \r\n
    TAG CONTENT
    \r\n

    \r\n Auto Classifier\r\n

    \r\n

    \r\n Auto Classifier’s hyper-intuitive cognitive capabilities intelligently extracts keywords by understanding the semantic context of your content and eliminates the effort required for end-users to add metadata manually to their content therefore, allowing your workforce to focus at the task in hand\r\n View More \r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \"Onboard\r\n \r\n
    \r\n
    \r\n
    \r\n NEW EMPLOYEES\r\n
    \r\n

    \r\n Onboard\r\n

    \r\n

    \r\n Onboard is a revolutionary new hire onboarding platform built for organisations consuming Microsoft 365. Onboard allows you to define your organisation’s onboarding experience and further refine this by allowing hiring managers and departments to create specific onboarding experiences.\r\n View More \r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \"Virtual\r\n \r\n
    \r\n
    \r\n
    \r\n Training\r\n
    \r\n

    \r\n Virtual Academy\r\n

    \r\n

    \r\n Virtual Academy is a Learning Management System (LMS) which is user friendly with the idea of making training and informing your organisation about Microsoft 365 products easy and accessible, tailoring to all your organisation’s needs, to give you the best possible training experience when educating your workforce.\r\n View More \r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n {this.renderErrors()}\r\n );\r\n }\r\n\r\n\r\n\r\n private renderCarousel(): React.ReactFragment {\r\n\r\n return (
    \r\n
      \r\n {\r\n this.state.productInfo?.productImages.map((image, i) => {\r\n if (i === 0) {\r\n return (
    1. );\r\n } else {\r\n return (
    2. );\r\n }\r\n /*return (
      \r\n {`${this.state.productInfo?.name}\r\n
      );*/\r\n })\r\n }\r\n
    \r\n
    \r\n {\r\n this.state.productInfo?.productImages.map((image, i) => {\r\n if (i === 0) {\r\n return (
    \r\n {`${this.state.productInfo?.name}\r\n
    );\r\n } else {\r\n return (
    \r\n {`${this.state.productInfo?.name}\r\n
    );\r\n }\r\n })\r\n }\r\n
    \r\n \r\n \r\n Previous\r\n \r\n \r\n \r\n Next\r\n \r\n
    );\r\n }\r\n\r\n}","export const _imageRestrictions = {\r\n minWidth: 64,\r\n minHeight: 64,\r\n maxKb: 1024\r\n}","import AuthProvider from \"../auth/AuthProvider\";\r\n\r\nexport class SharePointService {\r\n \r\n public static async checkAppCatalogExists(authProvider: AuthProvider, tenantName: string) : Promise {\r\n const account = authProvider.getAccount();\r\n if(account == null) {\r\n return false;\r\n }\r\n\r\n const rootSPUrl: string = `https://${tenantName}.sharepoint.com`;\r\n const tokenScope = `${rootSPUrl}/.default`;\r\n var accessTokenResult = await authProvider.acquireToken({\r\n scopes: [\r\n tokenScope\r\n ]});\r\n\r\n const response = await fetch(`${rootSPUrl}/_api/SP_TenantSettings_Current`, {\r\n method: 'GET',\r\n headers: new Headers({\r\n 'Authorization': `Bearer ${accessTokenResult.accessToken}`,\r\n \"accept\": \"application/json;odata=verbose\"\r\n })\r\n });\r\n\r\n if(response.ok) {\r\n const result = await response.json();\r\n const corporateCatalogUrl = result.d.CorporateCatalogUrl;\r\n return corporateCatalogUrl != undefined && corporateCatalogUrl != null && corporateCatalogUrl != \"\";\r\n }\r\n\r\n return false;\r\n }\r\n}","import AuthProvider from \"../auth/AuthProvider\";\r\n\r\nexport class TenantService {\r\n private static tenantName: string = \"\";\r\n private static scope: string = \"https://graph.microsoft.com/User.Read\";\r\n public static async getTenantName(authProvider: AuthProvider) : Promise {\r\n if(this.tenantName != \"\") {\r\n return this.tenantName;\r\n }\r\n\r\n const accessTokenResult = await authProvider.acquireToken({\r\n scopes: [\r\n this.scope\r\n ]\r\n });\r\n\r\n const response = await fetch(\"https://graph.microsoft.com/v1.0/organization?$select=verifiedDomains\", {\r\n method: 'GET',\r\n headers: new Headers({\r\n 'Authorization': `Bearer ${accessTokenResult.accessToken}`\r\n })\r\n });\r\n\r\n if(response.ok) {\r\n const result = await response.json();\r\n if(result.value.length == 0) {\r\n return \"\";\r\n }\r\n\r\n const domains = result.value[0].verifiedDomains.filter((x: any) => x.name.indexOf(\".onmicrosoft.com\") > -1);\r\n if(domains.length > 0) {\r\n this.tenantName = domains[0].name.split('.')[0];\r\n return this.tenantName;\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n return \"\";\r\n }\r\n}","\r\nimport { IProductPrerequisite } from \"../models/ProductInfo\";\r\nimport AuthProvider from \"../auth/AuthProvider\";\r\nimport { SharePointService } from \"./SharePointService\";\r\nimport { TenantService } from \"./TenantService\";\r\n\r\nexport class PrerequisitesService {\r\n private authProvider: AuthProvider;\r\n private prerequisites: IProductPrerequisite[];\r\n constructor(authProvider: AuthProvider, prerequisites: IProductPrerequisite[]) {\r\n this.authProvider = authProvider;\r\n this.prerequisites = prerequisites;\r\n }\r\n\r\n public async validate(): Promise {\r\n const tenantName = await TenantService.getTenantName(this.authProvider);\r\n let result: IPrerequisitesValidationResult[] = [];\r\n for(let i=0;i {\r\n validators.forEach(async val => {\r\n switch(val) {\r\n case \"sitecollection\":\r\n const tenantName = await TenantService.getTenantName(authProvider);\r\n this.siteCollectionFormat = `https:\\/\\/${tenantName}.sharepoint.com\\/sites\\/`;\r\n break;\r\n }\r\n });\r\n }\r\n\r\n public static validate(\r\n data: any,\r\n dataPath?: string,\r\n parentData?: object | Array,\r\n parentDataProperty?: string | number,\r\n rootData?: object | Array): boolean {\r\n return true;\r\n }\r\n\r\n public static validator(validator: string) : string {\r\n switch(validator) {\r\n case \"sitecollection\":\r\n return `^(${ValidationService.siteCollectionFormat}){1}[a-zA-Z0-9\\-]+$`;\r\n default:\r\n return ``;\r\n }\r\n }\r\n}\r\n\r\nfunction siteCollectionValidator(this: any, \r\n schema: any,\r\n data?: string,\r\n parentSchema?: object | Array,\r\n parentDataProperty?: string | number,\r\n rootData?: object | Array): boolean {\r\n if(data) {\r\n let regex = new RegExp(`^(${ValidationService.siteCollectionFormat}){1}[a-zA-Z0-9\\-]+$`);\r\n const isValid = regex.test(data);\r\n if(!isValid) {\r\n this.errors = [\r\n {\r\n data: data,\r\n dataPath: \"siteurl\",\r\n keyword: \"sitecollection\",\r\n message: \"Should match sharepoint online url\",\r\n params: {\r\n keyword: \"sitecollection\"\r\n },\r\n parentSchema: parentSchema,\r\n schema: schema\r\n }\r\n ];\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n return false;\r\n}","import React, { Component } from 'react';\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport AuthProvider from \"../auth/AuthProvider\";\r\nimport { IProductService } from '../services/IProductService';\r\nimport { IProductInfo } from '../models/ProductInfo';\r\nimport { ItemStorage } from '../itemstorage';\r\nimport { Constants } from '../constants';\r\nimport { _imageRestrictions } from '../settings/Images';\r\nimport { PrerequisitesService, IPrerequisitesValidationResult } from \"../services/PrerequisitesService\";\r\n\r\nimport Loading from '../components/Loading';\r\nimport Alert from '../components/Alert';\r\n\r\nimport { ValidationService } from \"../services/ValidationService\";\r\n\r\nimport Form, { UiSchema, Widget, WidgetProps, IChangeEvent, FieldProps, AjvError, ISubmitEvent, Field } from \"@rjsf/core\";\r\nimport { JSONSchema7 } from 'json-schema';\r\nimport { TenantService } from '../services/TenantService';\r\n\r\ninterface IBaseProps extends RouteComponentProps<{}> {\r\n authProvider: AuthProvider;\r\n productService: IProductService;\r\n}\r\n\r\ninterface IProductFormState {\r\n loading: boolean;\r\n productInfo?: IProductInfo;\r\n data?: any;\r\n errors?: any;\r\n base64Image?: string;\r\n validationSchema?: { [fieldName: string]: string };\r\n prerequisitesValidationResult?: IPrerequisitesValidationResult[];\r\n tenant?: string;\r\n extraErrors: {\r\n [key: string]: { __errors: string[] }\r\n };\r\n}\r\n\r\nexport class ProductForm extends Component {\r\n\r\n _tenantName: string = \"\";\r\n private fileReader: FileReader;\r\n private uploadField: HTMLInputElement | null;\r\n\r\n constructor(props: IBaseProps) {\r\n super(props);\r\n\r\n this.state = {\r\n loading: true,\r\n extraErrors: {}\r\n };\r\n\r\n this.onChange = this.onChange.bind(this);\r\n this.onInstall = this.onInstall.bind(this);\r\n this.SiteCollectionInput = this.SiteCollectionInput.bind(this);\r\n this.SiteLogoPicker = this.SiteLogoPicker.bind(this);\r\n this.fileChosen = this.fileChosen.bind(this);\r\n this.siteLogoLoader = this.siteLogoLoader.bind(this);\r\n this.chooseFile = this.chooseFile.bind(this);\r\n\r\n this.fileReader = new FileReader();\r\n this.fileReader.addEventListener(\"loadend\", this.siteLogoLoader);\r\n this.uploadField = null;\r\n\r\n }\r\n\r\n async componentDidMount() {\r\n var productInfo = ItemStorage.getStorageItem(Constants.productInfo) as IProductInfo;\r\n\r\n var scopes: string[] = [];\r\n\r\n productInfo.permissions.filter(x => x.requiresConsent).forEach((item) => {\r\n scopes.push(item.scope);\r\n });\r\n\r\n this.props.authProvider.ensureLogin(scopes);\r\n\r\n if (productInfo) {\r\n\r\n const prerequisitesService = new PrerequisitesService(this.props.authProvider, productInfo.prerequisites);\r\n const result = await prerequisitesService.validate();\r\n\r\n let validationSchema: { [fieldName: string]: string } = {};\r\n\r\n if (productInfo.validators) {\r\n await ValidationService.init(this.props.authProvider, productInfo.validators);\r\n productInfo.validators.forEach((val) => {\r\n validationSchema[val] = ValidationService.validator(val);\r\n });\r\n }\r\n\r\n const tenantName: string = await TenantService.getTenantName(this.props.authProvider);\r\n\r\n this.setState({\r\n loading: false,\r\n productInfo: productInfo,\r\n data: {},\r\n validationSchema: validationSchema,\r\n prerequisitesValidationResult: result,\r\n tenant: tenantName\r\n });\r\n } else {\r\n console.log('Product not specified, redirecting to products page...');\r\n window.location.href = 'https://www.konsolute.com/products';\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n return <>\r\n {\r\n this.state.loading ?\r\n :\r\n this.renderBody()\r\n }\r\n\r\n ;\r\n }\r\n\r\n private renderBody(): React.ReactFragment {\r\n\r\n const schema: JSONSchema7 = this.state.productInfo?.objectSchema || {};\r\n\r\n const uiSchema: UiSchema = this.state.productInfo?.uiSchema || {};\r\n\r\n const widgets = {\r\n CheckboxWidget: this.CustomCheckbox,\r\n TextWidget: this.CustomStringInput,\r\n \"twitter\": this.CustomTwitterInput,\r\n \"siteCollectionUrl\": this.SiteCollectionInput,\r\n \"colourPicker\": this.CustomColourPicker,\r\n \"logoPicker\": this.SiteLogoPicker,\r\n CheckboxesWidget: this.CustomCheckboxGroup,\r\n \"customSlider\": this.CustomSlider\r\n };\r\n\r\n return (<>\r\n
    \r\n
    \r\n {this.renderProductLogo()}\r\n
    \r\n
    \r\n
    \r\n

    Okay, let's install: {this.state.productInfo?.displayName}

    \r\n

    We'll need some information from you to get this up and running.

    \r\n

    arrow_circle_down

    \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.state.prerequisitesValidationResult?.filter(x => !x.isValid).length == 0 ?\r\n <>\r\n

    We're nearly there!

    \r\n

    Before we begin to install the selected app, we need to capture some additional information. Please ensure that all mandatory fields completed.

    \r\n\r\n \r\n\r\n
    \r\n
    \r\n \r\n {this.renderInstallButton()}\r\n

    By clicking on 'Install' you agree to the terms set out in the Terms of Usage

    \r\n
    \r\n
    \r\n \r\n :\r\n <>\r\n

    Prerequisites not met

    \r\n {\r\n this.state.prerequisitesValidationResult?.map((result, i) => {\r\n return

    {result.errorMessage}

    \r\n })\r\n }\r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \"Preview\"\r\n {/*
    \r\n

    Preview

    \r\n
    */}\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n {\r\n (this.state.errors && (this.state.errors.length > 0)) &&\r\n this.state.errors.map((error: any, i: number) => {\r\n return ;\r\n })\r\n }\r\n );\r\n }\r\n\r\n private onChange(ev: IChangeEvent): void {\r\n this.setState({\r\n ...this.state,\r\n data: ev.formData\r\n });\r\n }\r\n\r\n private pushError(message: string, fieldId: string) {\r\n let errors = this.state.extraErrors;\r\n this.setState({\r\n extraErrors: {\r\n ...errors,\r\n [fieldId]: {\r\n __errors: [message]\r\n }\r\n }\r\n });\r\n }\r\n\r\n private renderProductLogo(): React.ReactFragment | void {\r\n const { productInfo } = this.state;\r\n\r\n if (productInfo && productInfo.logo) {\r\n return (
    \r\n
    \r\n \"Product\r\n
    \r\n
    );\r\n }\r\n }\r\n\r\n private renderInstallButton():React.ReactElement{\r\n let label:string = \"Install\";\r\n const { productInfo } = this.state;\r\n\r\n if(productInfo && productInfo.productFormInstallButtonText){\r\n label = productInfo.productFormInstallButtonText;\r\n }\r\n return \r\n }\r\n\r\n private async onInstall(formObj: any) {\r\n if (this.state.productInfo) {\r\n if (!formObj.errors || (formObj.errors && formObj.errors.length == 0)) {\r\n\r\n var uniqueId = ItemStorage.getStorageItem(Constants.uniqueId) as string;\r\n this.setState({\r\n ...this.state,\r\n loading: true\r\n });\r\n\r\n let submittedData: any = this.state.data;\r\n\r\n //Add in base64image\r\n if (this.state.productInfo && this.state.productInfo.objectSchema.properties && this.state.productInfo.objectSchema.properties.siteLogo) {\r\n if (this.state.base64Image && (this.state.base64Image.length > 0)) {\r\n submittedData.siteLogo = this.state.base64Image;\r\n } else {\r\n submittedData.siteLogo = \"\";\r\n }\r\n }\r\n\r\n //Prepend site collection\r\n const { siteUrl, siteurl } = formObj.formData;\r\n if (siteUrl) {\r\n submittedData.siteUrl = encodeURI(`https:\\/\\/${this.state.tenant}.sharepoint.com\\/sites\\/${siteUrl}`);\r\n } else if (siteurl) {\r\n submittedData.siteurl = encodeURI(`https:\\/\\/${this.state.tenant}.sharepoint.com\\/sites\\/${siteurl}`);\r\n }\r\n\r\n var site = ItemStorage.getStorageItem(Constants.site) as string;\r\n var page = ItemStorage.getStorageItem(Constants.page) as string;\r\n try {\r\n var accessToken = await this.props.authProvider.getApiAccessToken();\r\n await this.props.productService.install(\r\n this.state.productInfo?.name,\r\n uniqueId,\r\n submittedData,\r\n accessToken,\r\n site,\r\n page);\r\n this.setState({\r\n ...this.state,\r\n loading: false\r\n });\r\n\r\n this.props.history.push('/complete');\r\n } catch (err) {\r\n console.log(err);\r\n this.setState({\r\n ...this.state,\r\n loading: false,\r\n errors: [\r\n err\r\n ]\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private transformErrors(errors: AjvError[]) {\r\n return errors.map(error => {\r\n if (error.name === \"format\") {\r\n if (error.params.format && (error.params.format == \"sitecollection\")) {\r\n error.message = `Please ensure your site collection URL begins with: '${this.state.tenant}'`;\r\n }\r\n }\r\n return error;\r\n });\r\n }\r\n\r\n /* Custom react-jsonschema-form widgets and fields - TODO put into components*/\r\n\r\n private CustomCheckboxGroup(props: WidgetProps) {\r\n const selectValue = (value: any, selected: any, all: any) => {\r\n const at = all.indexOf(value);\r\n const updated = selected.slice(0, at).concat(value, selected.slice(at));\r\n\r\n // As inserting values at predefined index positions doesn't work with empty\r\n // arrays, we need to reorder the updated selection to match the initial order\r\n return updated.sort((a: any, b: any) => all.indexOf(a) > all.indexOf(b));\r\n };\r\n\r\n const deselectValue = (value: any, selected: any) => {\r\n return selected.filter((v: any) => v !== value);\r\n };\r\n\r\n const { id, value, onChange, disabled, readonly, autofocus, options} = props;\r\n const { enumOptions, enumDisabled, } = options;\r\n const _onChange = (option: any) => ({ target: { checked }}: React.ChangeEvent) => {\r\n const all = (enumOptions as any).map(({ value }: any) => value);\r\n\r\n if (checked) {\r\n onChange(selectValue(option.value, value, all));\r\n } else {\r\n onChange(deselectValue(option.value, value));\r\n }\r\n };\r\n\r\n return (enumOptions as any).map((option: any, index: number) => {\r\n\r\n const checked = value.indexOf(option.value) !== -1;\r\n const itemDisabled = enumDisabled && (enumDisabled as any).indexOf(option.value) != -1;\r\n const checkbox = (\r\n
    \r\n \r\n
    \r\n );\r\n return checkbox;\r\n });\r\n }\r\n\r\n private CustomCheckbox(props: WidgetProps) {\r\n const { id, value, onChange, onClick, disabled, label, rawErrors, readonly, required, autofocus, schema, uiSchema } = props;\r\n let currentValue: boolean = false;\r\n if (value !== undefined) {\r\n currentValue = value;\r\n }\r\n return (
    \r\n \r\n {/* {(schema && schema.description) && {schema.description}}\r\n {(uiSchema && uiSchema['ui:description']) && {uiSchema['ui:description']}} */}\r\n {/* {rawErrors && {rawErrors.map((err,i) => {err})}} */}\r\n
    );\r\n }\r\n\r\n private CustomSlider(props: WidgetProps) {\r\n const { id, value, onChange, onClick, disabled, label, rawErrors, readonly, required, autofocus, schema, uiSchema, className } = props;\r\n let description: string = \"Please adjust the Tone slider\";\r\n if (value) {\r\n switch (value) {\r\n case 1: description = \"Very informal\"; break;\r\n case 2: description = \"Informal\"; break;\r\n case 3: description = \"Semi-formal\"; break;\r\n case 4: description = \"Formal\"; break;\r\n case 5: description = \"Very formal\"; break;\r\n default: description = \"Please adjust the Tone slider\";\r\n }\r\n }\r\n return (
    \r\n onChange(event.target.value)} />\r\n {description}\r\n
    );\r\n }\r\n\r\n private CustomStringInput(props: WidgetProps) {\r\n const { id, value, onChange, onClick, label, rawErrors, disabled, placeholder, readonly, required, autofocus, schema, uiSchema } = props;\r\n let currentValue: string = \"\";\r\n if (value && (value.length > 0)) {\r\n currentValue = value;\r\n }\r\n return (
    \r\n onChange(event.target.value)} onClick={onClick} disabled={disabled} placeholder={placeholder} readOnly={readonly} required={required} autoFocus={autofocus} />\r\n {/* {(schema && schema.description) && {schema.description}}\r\n {(uiSchema && uiSchema['ui:description']) && {uiSchema['ui:description']}} */}\r\n {/* {rawErrors && {rawErrors.map((err,i) => {err})}} */}\r\n
    );\r\n }\r\n\r\n private CustomTwitterInput(props: WidgetProps) {\r\n const { id, value, onChange, onClick, rawErrors, disabled, placeholder, readonly, required, autofocus, schema, uiSchema } = props;\r\n let currentValue: string = \"\";\r\n if (value && (value.length > 0)) {\r\n currentValue = value;\r\n }\r\n return (
    \r\n
    \r\n \r\n alternate_email\r\n \r\n
    \r\n onChange(event.target.value)} onClick={onClick} disabled={disabled} placeholder={placeholder} readOnly={readonly} required={required} autoFocus={autofocus} />\r\n {/* {(schema && schema.description) && {schema.description}}\r\n {(uiSchema && uiSchema['ui:description']) && {uiSchema['ui:description']}} */}\r\n {/* {rawErrors && {rawErrors.map((err,i) => {err})}} */}\r\n
    );\r\n }\r\n\r\n private SiteCollectionInput(props: WidgetProps) {\r\n const { id, value, onChange, onClick, rawErrors, disabled, placeholder, readonly, required, autofocus, schema, uiSchema } = props;\r\n let currentValue: string = \"\";\r\n if (value && (value.length > 0)) {\r\n currentValue = value;\r\n }\r\n return (
    \r\n
    \r\n \r\n {`https:\\/\\/${this.state.tenant}.sharepoint.com\\/sites\\/`}\r\n \r\n
    \r\n onChange(event.target.value)} onClick={onClick} disabled={disabled} placeholder={placeholder} readOnly={readonly} required={required} autoFocus={autofocus} />\r\n {/* {(schema && schema.description) && {schema.description}}\r\n {(uiSchema && uiSchema['ui:description']) && {uiSchema['ui:description']}} */}\r\n {/* {rawErrors && {rawErrors.map((err,i) => {err})}} */}\r\n
    );\r\n }\r\n\r\n private CustomColourPicker(props: WidgetProps) {\r\n const { id, value, onChange, onClick, rawErrors, disabled, placeholder, readonly, required, autofocus, schema, uiSchema } = props;\r\n const options: any = props.options.enumOptions;\r\n return (
    \r\n \r\n {/* {(schema && schema.description) && {schema.description}}\r\n {(uiSchema && uiSchema['ui:description']) && {uiSchema['ui:description']}} */}\r\n {/* {rawErrors && {rawErrors.map((err,i) => {err})}} */}\r\n
    );\r\n }\r\n\r\n private SiteLogoPicker(props: WidgetProps) {\r\n const { id, value, onChange, onClick, disabled, label, multiple, placeholder, readonly, required, autofocus, rawErrors, options } = props;\r\n const acceptOptions: string = options.accept?.toString() ?? `*`;\r\n let currentValue: string = \"\";\r\n if (value && (value.length > 0)) {\r\n currentValue = value;\r\n }\r\n return (
    \r\n { this.uploadField = field }} onClick={onClick} onChange={(event) => this.fileChosen(event, required, id, onChange)} multiple={multiple} accept={acceptOptions} disabled={disabled} placeholder={placeholder} readOnly={readonly} required={required} autoFocus={autofocus} />\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n {/* {(schema && schema.description) && {schema.description}}\r\n {(uiSchema && uiSchema['ui:description']) && {uiSchema['ui:description']}} \r\n {rawErrors && {rawErrors.map((err, i) => {err})}} */}\r\n
    );\r\n }\r\n\r\n private chooseFile(): void {\r\n if (this.uploadField) {\r\n this.uploadField.click();\r\n }\r\n }\r\n\r\n private fileChosen(ev: React.FormEvent, required: boolean, fieldId: string, parentEvent: any): void {\r\n const filecontrol = ev.currentTarget;\r\n if (filecontrol.files && (filecontrol.files.length > 0)) {\r\n var chosenFile = filecontrol.files[0];\r\n this.fileReader.readAsDataURL(chosenFile);\r\n this.setState(prevState => ({\r\n ...prevState,\r\n data: {\r\n ...prevState.data,\r\n siteLogo: chosenFile.name\r\n }\r\n }));\r\n } else {\r\n //Reset field\r\n this.setState(prevState => ({\r\n ...prevState,\r\n data: {\r\n ...prevState.data,\r\n siteLogo: \"\",\r\n },\r\n base64Image: \"\",\r\n extraErrors: {\r\n ...prevState.extraErrors,\r\n [fieldId]: { __errors: [(required ? \"Please upload a site logo\" : \"\")] }\r\n }\r\n }));\r\n }\r\n parentEvent(ev);\r\n }\r\n\r\n private imageSizeValid(imgData: string): Promise {\r\n return new Promise((res, rej) => {\r\n let image = new Image();\r\n image.onload = (ev) => {\r\n if (image.width <= _imageRestrictions.minWidth || image.height <= _imageRestrictions.minHeight)\r\n res(false);\r\n else\r\n res(true);\r\n }\r\n image.src = imgData;\r\n });\r\n }\r\n\r\n private async siteLogoLoader(evt: ProgressEvent): Promise {\r\n var fieldId: string = \"siteLogo\";\r\n var result = this.fileReader.result as string;\r\n // the total length is in bytes.\r\n // if it's any bigger, ignore it.\r\n if (evt.total / 1024 > _imageRestrictions.maxKb) {\r\n //SendAlertNotification.Notification(`Logo file size is too big (${_imageRestrictions.maxKb}k or less).`);\r\n this.pushError(`Logo file size is too big (${_imageRestrictions.maxKb}k or less).`, fieldId);\r\n return;\r\n }\r\n\r\n let validSize = await this.imageSizeValid(result);\r\n\r\n if (!validSize) {\r\n var h = _imageRestrictions.minHeight;\r\n var w = _imageRestrictions.minWidth;\r\n this.pushError(`Logo dimensions must be at least ${w}x${h}.`, fieldId);\r\n return;\r\n }\r\n\r\n this.setState(prevState => ({\r\n ...prevState,\r\n base64Image: result,\r\n extraErrors: {\r\n ...prevState.extraErrors,\r\n [fieldId]: {\r\n __errors: []\r\n }\r\n }\r\n }));\r\n }\r\n\r\n\r\n}","export const ReportSettings = {\r\n constants: {\r\n reportId: 'reportId', \r\n listItemLimit: 10,\r\n reflektUrl: 'https://www.konsolute.com/products/reflekt',\r\n productPageUrl: '/?product=reporting&uid=1234',\r\n },\r\n scoreWeightings: { //Out of 1 (100%)\r\n orphanedTeams: 0.12,\r\n duplicateTeams: 0.15,\r\n teamsWithGuests: 0.35,\r\n externalApps: 0.28\r\n }\r\n}\r\n\r\nexport const ReportStrings = {\r\n headerTitle: 'Teams Health Check Report ',\r\n headerDescription: 'The results are in! We\\'re excited to share the output of the analysis that we have run against your tenancy. To give you\\'re an overview, we\\'ve analysed your Microsoft Teams, Channels, associated Apps and the storage. ',\r\n scoreCard: {\r\n scoreLabel: 'Your health score',\r\n good: 'Congratulations! Based upon a benchmark, the analysis indicates that you\\'re doing great.',\r\n ok: 'Based upon a benchmark, the analysis indicates that there is room for improvement. The report provides you with an overview of what these metrics mean and how you could improve your score.',\r\n bad: 'Based upon a benchmark, the analysis indicates that perhaps you may need to look into things. The report provides you with an overview of what these metrics mean and how you could improve your score.',\r\n reflektBlurb: 'Konsolute Reflekt can help you govern, manage and automate your Microsoft 365 platform'\r\n },\r\n overview: {\r\n blurb: 'Here you\\'ll find an overview of our findings. We\\'ve categorised and highlighted the results.',\r\n teamsCounter: {\r\n title: 'Number of teams',\r\n description: 'Indicates the total number of Teams that your organisation has created. It\\'s important to ensure that you manage your Teams lifecycle to reduce site sprawl.',\r\n },\r\n guestsCounter: {\r\n title: 'Teams with guests',\r\n description: 'Indicates the total number of Teams who have invited Guest (external to your organisation). Inviting guests\\' users into Teams is a fantastic way to collaborate. However, a lack of governance can lead to sensitive information being exposed to users external to your organisation.',\r\n },\r\n storageCounter: {\r\n title: 'Total storage used',\r\n description: 'Indicates the total storage utilised by your Teams. Teams is a fantastic way to easily collaborate with your colleagues and contains a wealth of information. Are you making use of this data? Does your data comply to regulatory and compliance guidelines?',\r\n },\r\n duplicateCounter: {\r\n title: 'Duplicate teams',\r\n description: 'Indicates the total number of duplicate Teams within your organisation which share the same name. Discoverability of Teams is incredibly important to ensure that users are aware of other projects / teams within your organisation.',\r\n },\r\n totalGuestsCounter: {\r\n title: 'Total guests',\r\n description: 'Indicates the total number of Teams who have invited Guest (external to your organisation). Inviting guests\\' users into Teams is a fantastic way to collaborate. However, a lack of governance can lead to sensitive information being exposed to users external to your organisation.',\r\n },\r\n appsCounter: {\r\n title: 'Total apps',\r\n description: 'Indicates the number of third-party (i.e. non-Microsoft) apps that are being used across your Microsoft Teams. Apps are a great way to streamlines processes within Teams and collaborate with your favourite third-party applications. However, without the necessary diligence your organisational data might be stored externally and may be in breach of your organisational guidelines.',\r\n },\r\n orphanedTeamsList: {\r\n title: 'Orphaned teams',\r\n description: 'Teams sometimes suffer from loneliness too. This list shows you all the Teams without Owners. It\\'s important that your Team has a purpose in life and has at least an Owner who is responsible for managing / governing the Team. If you\\'re not using, let\\'s archive it.',\r\n },\r\n allTeamsList: {\r\n title: 'All teams',\r\n description: 'Here you\\'ll find a detailed view of the Teams analysis. You\\'ll see all your Teams and the associated information such as when it was created'\r\n },\r\n visibilityChart: {\r\n title: 'Teams by Visibility',\r\n description: 'This shows you your Teams by their visibility. Teams enables users to specify the visibility (Public or Private) and most often end-users don\\'t quite understand the differences between the two. Private teams can lead to information being siloed away from the wider organisation. Information is one of the biggest assets to any organisation. Are your Private teams too private? On the flip side, Public Teams enable users to freely join/leave, collaborate with colleagues and discovery information. Sometime, Public Teams can pose issues, when sensitive information is visible across the organisation.',\r\n },\r\n },\r\n teams: {\r\n title: '',\r\n blurb: '',\r\n allTeams: {\r\n title: 'All Teams',\r\n teamsCounter: {\r\n title: 'Total number of teams',\r\n description: 'Indicates the total number of Teams that your organisation has created. It\\'s important to ensure that you manage your Teams lifecycle to reduce site sprawl.'\r\n },\r\n storageCounter: {\r\n title: 'Storage consumed',\r\n description: 'Indicates the total storage utilised by your Teams. Teams is a fantastic way to easily collaborate with your colleagues and contains a wealth of information. Are you making use of this data? Does your data comply to regulatory and compliance guidelines?'\r\n },\r\n documentsCounter: {\r\n title: 'Documents held',\r\n description: 'Indicates the total number of documents across your Microsoft Teams. How are you managing your documents? Are you making the most of your organisational data? Does your data adhere to regulatory and compliance guidelines?'\r\n },\r\n foldersCounter: {\r\n title: 'Folders used',\r\n description: 'Indicates the total number of folders across your Teams. Folders provide a mechanism of structuring information so that it can be easily found. An excessive use of folders can pose issues when finding / search for information.'\r\n },\r\n teamsList: {\r\n title: 'All teams',\r\n description: 'Here you\\'ll find a detailed view of the Teams analysis. You\\'ll see all your Teams and the associated information such as number of numbers of owner, members, and guests to mention a few.'\r\n },\r\n teamsGrowthChart: {\r\n title: 'Teams growth',\r\n description: 'The chart shows your Teams growth over the last {months} months. Based upon your data we\\'ve calculated your projected growth for the next {months} months.'\r\n }\r\n },\r\n orphanedTeams: {\r\n title: 'Orphaned Team Highlights',\r\n teamsCounter: {\r\n title: 'Orphaned Teams',\r\n description: 'Indicates the total number of orphaned Teams. Used Orphaned Teams should be archived in accordance your organisational retention guidelines. If the Team is being actively being used, at least 1 owner should be specified.'\r\n },\r\n storageCounter: {\r\n title: 'Storage consumed',\r\n description: 'Indicates the total storage utilised by the orphaned Teams.'\r\n },\r\n documentsCounter: {\r\n title: 'Documents held',\r\n description: 'Indicates the total number of documents held within the orphaned Teams.'\r\n },\r\n foldersCounter: {\r\n title: 'Folders used',\r\n description: 'Indicates the total number of folders held within the orphaned Teams.'\r\n },\r\n teamsList: {\r\n title: 'All orphaned teams',\r\n description: 'This list shows you all the orphaned Teams without Owners. It\\'s important that your Team has a purpose in life and has at least an Owner who is responsible for managing / governing the Team. If you\\'re not using, let\\'s archive it.'\r\n },\r\n visibilityChart: {\r\n title: 'Orphaned teams by visibility',\r\n description: 'This shows you your orphaned Teams by their visibility.',\r\n },\r\n }\r\n },\r\n channels: {\r\n title: 'Channels Overview',\r\n blurb: '',\r\n channelsCounter: {\r\n title: 'Number of channels',\r\n description: ' Indicates the number of the Channels across all your Teams. Channels provide a great way to structure and organise your Teams. Channels can exist as Private or Standard Channels. A large number of Channels or lack of governance can lead to siloed pockets of information.'\r\n },\r\n visibilityChart: {\r\n title: 'Channels by visibility',\r\n description: 'The chart displays the percentage split between Private and Standard Channels. Private Channels were introduced by Microsoft to enable users to manage permissions. A large proportion of Private Channels can be a reason for concern. Should the Channel by created as Private? Should the Channel be a Microsoft Teams? Is the membership of the Channel the same as the parent Team?'\r\n },\r\n growthChart: {\r\n title: 'Channels growth',\r\n description: 'The chart shows your Channel growth over the last {months} months. Based upon your data we\\'ve calculated your projected growth for the next {months} months.'\r\n },\r\n },\r\n apps: {\r\n title: 'Installed Team apps information',\r\n blurb: '',\r\n appsCounter: {\r\n title: 'Third-party apps',\r\n description: 'Indicates the number of third-party (i.e. non-Microsoft) apps that are being used across your Microsoft Teams. Apps are a great way to streamlines processes within Teams and collaborate with your favourite third-party applications. However, without the necessary diligence your organisational data might be stored externally and may be in breach of your organisational guidelines.',\r\n },\r\n appsList: {\r\n title: 'Popular third-party apps',\r\n description: 'You\\'ll find the most popular third-party apps installed across your Microsoft Teams.',\r\n },\r\n teamsList: {\r\n title: 'Teams with third-party apps',\r\n description: 'You\\'ll find a list of your Teams which have third-party apps installed.',\r\n },\r\n }\r\n}","import { AccumulationChartComponent, AccumulationSeriesCollectionDirective, AccumulationSeriesDirective } from '@syncfusion/ej2-react-charts';\r\nimport * as React from 'react';\r\nimport { ReportSettings, ReportStrings } from '../../../settings/Report/ReportSettings';\r\n\r\nexport interface IScoreSectionProps {\r\n title: string;\r\n description?: string;\r\n score: number;\r\n}\r\n\r\nexport default class ScoreCard extends React.Component {\r\n scorePieChart = React.createRef();\r\n\r\n public render() {\r\n const { score, title, description } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    {title}

    \r\n {description &&
    {description}
    }\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    {ReportStrings.scoreCard.scoreLabel}

    \r\n {this.renderScore(score)}\r\n {this.renderBlurb(score)}\r\n
    \r\n
    \r\n {this.renderChart(score)}\r\n
    \r\n
    \r\n
    \r\n {this.renderFooter()}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderScore(score: number): React.ReactElement {\r\n return

    {score}% {this.getIcon(score)}

    \r\n }\r\n\r\n private renderChart(score: number): React.ReactElement {\r\n\r\n const delta = 100 - score;\r\n\r\n const data = [\r\n { x: 'Compliant', y: score, r: '90%' }, { x: 'Issues', y: delta, r: '50%' },\r\n ];\r\n\r\n return
    \r\n \r\n \r\n \r\n \r\n \r\n
    ;\r\n }\r\n\r\n private renderBlurb(score: number): React.ReactElement {\r\n if (score > 70) {\r\n return

    {ReportStrings.scoreCard.good}

    ;\r\n } else if (score > 40) {\r\n return

    {ReportStrings.scoreCard.ok}

    ;\r\n } else {\r\n return

    {ReportStrings.scoreCard.bad}

    ;\r\n }\r\n }\r\n\r\n private getIcon(score: number): React.ReactElement {\r\n if (score > 70) {\r\n return thumb_up_off_alt;\r\n } else if (score > 40) {\r\n return thumbs_up_down;\r\n } else {\r\n return thumb_down_off_alt;\r\n }\r\n }\r\n\r\n private getTextColour(score: number): string {\r\n if (score > 70) {\r\n return \"text-success\";\r\n } else if (score > 40) {\r\n return \"text-warning\";\r\n } else {\r\n return \"text-danger\";\r\n }\r\n }\r\n\r\n private renderFooter(): React.ReactElement {\r\n return (
    \r\n
    \r\n

    \r\n {ReportStrings.scoreCard.reflektBlurb} \r\n \r\n See how\r\n \r\n

    \r\n
    \r\n
    );\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport ScoreCard from '../widgets/ScoreCard';\r\n\r\nexport interface IHeaderProps {\r\n title: string;\r\n description?: string;\r\n healthScore:number;\r\n}\r\n\r\nexport default class Header extends React.Component {\r\n\r\n public render() {\r\n const { title, description } = this.props;\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","import * as React from 'react';\r\n\r\nexport interface IWrapperProps {\r\n}\r\n\r\nexport default class Wrapper extends React.Component {\r\n constructor(props: IWrapperProps) {\r\n super(props);\r\n\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n {this.props.children}\r\n
    \r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport IPillOption from '../../../models/Report/IPillOptions';\r\n\r\nexport interface IPillProps {\r\n options: IPillOption[];\r\n pillClicked(index: number): void;\r\n currentTab: number;\r\n}\r\n\r\nexport interface IPillState {\r\n}\r\n\r\nexport default class NavPills extends React.Component {\r\n constructor(props: IPillProps) {\r\n super(props);\r\n\r\n this.state = {\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n
      \r\n {this.renderPills()}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderPills(): React.ReactElement[] {\r\n const { options, currentTab, pillClicked } = this.props;\r\n\r\n return options.map((option, index) =>
  • \r\n pillClicked(index)} role=\"tab\" data-toggle=\"tab\">\r\n {(option.notificationCount && (option.notificationCount > 0)) && {option.notificationCount}}\r\n {option.icon}\r\n {option.title}\r\n \r\n
  • \r\n );\r\n }\r\n\r\n}\r\n","import * as React from 'react';\r\nimport IStatsItem from '../../../models/Report/IStatsItem';\r\n\r\nexport interface IStatProps {\r\n stats: IStatsItem[];\r\n}\r\n\r\nexport default class TenancyStats extends React.Component {\r\n public render() {\r\n return (\r\n
    \r\n

    This report is based on the following information in your tenancy:

    \r\n
      \r\n {this.renderItems()}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderItems(): React.ReactElement[] | React.ReactElement {\r\n const { stats } = this.props;\r\n if (stats.length > 0) {\r\n return stats.map((stat,i) =>
  • {stat.value} {stat.name}
  • );\r\n } else {\r\n return (No stats);\r\n }\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { AccumulationChartComponent, AccumulationDataLabel, AccumulationLegend, AccumulationSeriesCollectionDirective, AccumulationSeriesDirective, AccumulationTooltip, Category, ChartComponent, ColumnSeries, Inject, LineSeries, PieSeries, SeriesCollectionDirective, SeriesDirective, Tooltip } from '@syncfusion/ej2-react-charts';\r\nimport { PieChartData } from '../../../models/Report/IChart';\r\nimport ClampLines from 'react-clamp-lines';\r\nimport uniqid from 'uniqid';\r\n\r\nexport interface ChartProps {\r\n title: string;\r\n description?: string;\r\n chartOptions: PieChartData;\r\n colour?: \"success\" | \"warning\" | \"danger\" | \"primary\" | \"info\" | \"rose\";\r\n badgeText?: string;\r\n badgeColour?: \"success\" | \"warning\" | \"danger\" | \"primary\" | \"info\" | \"rose\";\r\n}\r\n\r\nexport default class PieChartCard extends React.Component {\r\n pieRef = React.createRef();\r\n\r\n constructor(props: ChartProps) {\r\n super(props);\r\n }\r\n\r\n public render() {\r\n const { title, colour, badgeText, description } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n

    {title}

    \r\n {description &&
    \r\n \r\n
    }\r\n
    \r\n
    \r\n {this.renderChart()}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {badgeText && this.renderBadge()}\r\n {this.props.children}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderChart(): React.ReactElement {\r\n const { chartOptions } = this.props;\r\n if (chartOptions.data && (chartOptions.data.length > 0)) {\r\n return
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    ;\r\n } else {\r\n return

    (No data available)

    \r\n }\r\n }\r\n\r\n private renderBadge(): React.ReactElement {\r\n const { badgeText, badgeColour } = this.props;\r\n return ();\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport uniqid from 'uniqid';\r\n\r\nexport interface IPaginationProps {\r\n pageCount: number;\r\n currentPage: number;\r\n onPageChange?(pageNumber: number): void;\r\n}\r\n\r\nexport interface IPaginationState {\r\n}\r\n\r\nexport default class Pagination extends React.Component {\r\n constructor(props: IPaginationProps) {\r\n super(props);\r\n\r\n this.state = {\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n {this.renderPageSelectors()}\r\n\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderPageSelectors(): React.ReactElement {\r\n const { pageCount, currentPage, onPageChange } = this.props;\r\n let pageSelectors: React.ReactElement[] = [];\r\n const pages = this.getPages(currentPage, pageCount);\r\n for (let i = 0; i < pages.length; i++) {\r\n const page = pages[i];\r\n pageSelectors.push(
  • { onPageChange && onPageChange(page) }}>\r\n {page}(current)\r\n
  • );\r\n }\r\n\r\n return
      \r\n
    • { onPageChange && onPageChange(currentPage - 1) }}>\r\n Previous\r\n
    • \r\n {pageSelectors}\r\n
    • = pageCount) ? 'disabled' : ''}`} onClick={() => { onPageChange && onPageChange(currentPage + 1) }}>\r\n Next\r\n
    • \r\n
    ;\r\n }\r\n\r\n private getPages(currentPage: number, totalPages: number) {\r\n const pagesToDisplay: number = 3;\r\n let pages: number[] = [];\r\n\r\n let isFirst = currentPage == 1;\r\n let isLast = currentPage == totalPages;\r\n\r\n if (isFirst && isLast) {\r\n pages.push(currentPage);\r\n } else if (isFirst) {\r\n pages.push(currentPage);\r\n for (let i = currentPage + 1, j = 1; i <= totalPages; i++, j++) {\r\n if (i <= totalPages && j != pagesToDisplay) {\r\n pages.push(i);\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n } else if (isLast) {\r\n for (let i = currentPage - 1, j = 1; i >= 1; i--, j++) {\r\n if (i >= 1 && j != pagesToDisplay) {\r\n pages.push(i);\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n pages.push(currentPage);\r\n } else {\r\n pages.push(currentPage - 1);\r\n pages.push(currentPage);\r\n pages.push(currentPage + 1);\r\n }\r\n\r\n return pages.sort((a,b) => a-b);\r\n }\r\n}\r\n","export default class Utilities {\r\n public static Deserialize(data: string): any {\r\n return JSON.parse(data, Utilities.ReviveDateTime);\r\n }\r\n\r\n private static ReviveDateTime(key: any, value: any): any {\r\n if (typeof value === 'string') {\r\n let a = /\\/Date\\((\\d*)\\)\\//.exec(value);\r\n if (a) {\r\n return new Date(+a[1]);\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n public static convertToStorageSizeString(bytesValue?: number): string {\r\n let bytesPerMB = 1048576;\r\n if (bytesValue) {\r\n let value = (bytesValue / bytesPerMB);\r\n if(value > 1000){\r\n //convert to gigabytes\r\n return `${(value/1000).toFixed(2)} GB`;\r\n }\r\n return `${value.toFixed(2)} MB`;\r\n }\r\n return \"0\";\r\n }\r\n\r\n public static getMonths(): string[] {\r\n return [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December'\r\n ];\r\n }\r\n}","import { ColumnDirective, ColumnsDirective, GridComponent, Inject, ColumnModel, Resize, Grid } from '@syncfusion/ej2-react-grids';\r\nimport Pagination from '../controls/Pagination';\r\nimport * as React from 'react';\r\nimport ClampLines from 'react-clamp-lines';\r\nimport uniqid from 'uniqid';\r\nimport Utilities from '../../../services/Utils';\r\nimport { ITeam } from '../../../models/Report/ITeam';\r\nexport interface ITableProps {\r\n id: string;\r\n colour?: \"success\" | \"warning\" | \"danger\" | \"primary\" | \"info\" | \"rose\";\r\n title: string;\r\n description?: string;\r\n items?: any[];\r\n onTitleClick?(teamId: string): void;\r\n columnInfo: ColumnModel[];\r\n resizeable?: boolean;\r\n enablePaging: boolean;\r\n totalPages?: number;\r\n currentPage?: number;\r\n onPageChange?(pageNumber: number): void;\r\n}\r\n\r\nexport interface ITableState {\r\n}\r\n\r\nexport default class TableCard extends React.Component {\r\n public grid: Grid | null = null;\r\n\r\n constructor(props: ITableProps) {\r\n super(props);\r\n\r\n this.state = {\r\n };\r\n\r\n this.onTitleClick = this.onTitleClick.bind(this);\r\n this.dataBound = this.dataBound.bind(this);\r\n }\r\n\r\n public render() {\r\n const { title, description: subtitle, colour } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n

    {title}

    \r\n {subtitle &&
    \r\n \r\n
    }\r\n
    \r\n
    \r\n {this.renderBody()}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderBody(): React.ReactElement {\r\n const { items, children } = this.props;\r\n\r\n if (items) {\r\n if (items.length > 0) {\r\n return <>\r\n {this.renderTable()}\r\n {children}\r\n {this.renderPagination()}\r\n \r\n } else {\r\n return this.renderNoItems();\r\n }\r\n } else {\r\n return this.renderPlaceholder();\r\n }\r\n }\r\n\r\n private renderTable(): React.ReactElement {\r\n const { items, resizeable } = this.props;\r\n return
    \r\n
    \r\n this.grid = g} id={this.props.id}>\r\n {resizeable && }\r\n {this.renderTableColumns()}\r\n \r\n
    \r\n
    ;\r\n }\r\n\r\n private renderTableColumns(): React.ReactElement {\r\n const { columnInfo } = this.props;\r\n return (\r\n {columnInfo.map((column, i) => {\r\n if(column.field === 'displayName'){\r\n //Render team title as a link to the team\r\n return {\r\n const { teamId, displayName, webUrl} = props;\r\n return \r\n {displayName}\r\n ;\r\n }}/>\r\n }\r\n\r\n if(column.field === 'spaceUsed'){\r\n //Format byte count\r\n return {\r\n const { spaceUsed } = props;\r\n return {Utilities.convertToStorageSizeString(spaceUsed)};\r\n }}/>\r\n }\r\n\r\n if(column.field === 'hasPrivateChannels'){\r\n //Format byte count\r\n return {\r\n const { hasPrivateChannels } = props;\r\n if(hasPrivateChannels){\r\n return Yes\r\n }else{\r\n return No\r\n }\r\n }}/>\r\n }\r\n\r\n return \r\n })}\r\n );\r\n }\r\n\r\n private renderPlaceholder(): React.ReactElement {\r\n return
    \r\n

    \r\n

    No data available.

    \r\n
    \r\n }\r\n\r\n private renderNoItems(): React.ReactElement {\r\n return
    \r\n

    \r\n

    Nothing to show here.

    \r\n
    \r\n }\r\n\r\n private renderPagination(): React.ReactElement {\r\n if (this.props.enablePaging && this.props.totalPages && this.props.currentPage) {\r\n return ();\r\n }\r\n else {\r\n return <>\r\n }\r\n }\r\n\r\n private onTitleClick(id: string) {\r\n if (this.props.onTitleClick) {\r\n this.props.onTitleClick(id);\r\n }\r\n }\r\n\r\n private dataBound() {\r\n if (this.grid && this.props.resizeable) {\r\n this.grid.autoFitColumns(['displayName']);\r\n }\r\n }\r\n}\r\n","import * as React from 'react';\r\n\r\nexport default function Spinner(){\r\n return ;\r\n}","import * as React from 'react';\r\nimport Spinner from './Spinner';\r\n\r\nexport interface ICounterProps {\r\n colour?: \"success\" | \"warning\" | \"danger\" | \"primary\" | \"info\" | \"rose\";\r\n title: string;\r\n value?: string | number;\r\n icon?: string;\r\n loading?:boolean;\r\n}\r\n\r\nexport interface ICounterState {\r\n}\r\n\r\nexport default class CounterCard extends React.Component {\r\n constructor(props: ICounterProps) {\r\n super(props);\r\n\r\n this.state = {\r\n }\r\n }\r\n\r\n public render() {\r\n const { title, colour, icon } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n {icon &&
    \r\n {icon}\r\n
    }\r\n

    {title}

    \r\n

    {this.renderValue()}

    \r\n
    \r\n
    \r\n {this.props.children}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderValue(){\r\n const {loading, value } = this.props;\r\n if(loading){\r\n return ;\r\n }\r\n\r\n if(value){ \r\n return value;\r\n }else{\r\n if(typeof(value) == 'number'){\r\n return 0;\r\n }else{\r\n return 'N/A';\r\n }\r\n }\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport PieChartCard from '../../../components/Report/widgets/PieChartCard';\r\nimport TableCard from '../../../components/Report/widgets/TableCard';\r\nimport CounterCard from '../../../components/Report/widgets/CounterCard';\r\nimport ITableItem from '../../../models/Report/ITableItem';\r\nimport { IOrphanedTeam } from '../../../models/Report/ITeam';\r\nimport { IOverviewReport, ITeamsReport } from '../../../models/Report/ITabModels';\r\nimport { PieChartData } from '../../../models/Report/IChart';\r\nimport Utilities from '../../../services/Utils';\r\nimport { ReportStrings } from '../../../settings/Report/ReportSettings';\r\nimport ClampLines from 'react-clamp-lines';\r\nimport uniqid from 'uniqid';\r\n\r\nexport interface IOverviewProps {\r\n reportData?: IOverviewReport;\r\n orphanedTeams: IOrphanedTeam[];\r\n allTeams?: ITeamsReport;\r\n onTeamClick(teamId: string): void;\r\n loading?: boolean;\r\n onPageChange(pageNumber: number): void;\r\n}\r\n\r\nexport interface IOverviewState {\r\n visibilityChartData: PieChartData;\r\n}\r\n\r\nexport default class OverviewTab extends React.PureComponent {\r\n\r\n constructor(props: IOverviewProps) {\r\n super(props);\r\n\r\n this.state = {\r\n visibilityChartData: {\r\n dataLabel: { visible: true, position: 'Outside', name: 'x' },\r\n data: []\r\n }\r\n }\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.formatVisibilityChartData();\r\n }\r\n\r\n public componentDidUpdate(prevProps: IOverviewProps) {\r\n if (prevProps.reportData !== this.props.reportData) {\r\n this.formatVisibilityChartData();\r\n }\r\n }\r\n\r\n public render() {\r\n const { visibilityChartData: visibilityChartData } = this.state;\r\n const { loading, reportData } = this.props;\r\n\r\n return
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n {this.getCounterIcon(reportData?.totalTeams)}\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n {this.getCounterIcon(reportData?.totalDuplicateTeams)}\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n {this.getCounterIcon(reportData?.totalExternalApps)}\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n {this.getCounterIcon(reportData?.totalGuestTeams)}\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n {this.getCounterIcon(reportData?.totalGuests)}\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n {this.getCounterIcon(reportData?.totalStorageUsed)}\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {this.renderTeamsList()}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    ;\r\n }\r\n\r\n private renderTeamsList(): React.ReactElement {\r\n const { orphanedTeams, allTeams } = this.props;\r\n if (orphanedTeams.length > 0) {\r\n //Rendered orphaned teams, if any\r\n return \r\n } else {\r\n //Render all teams\r\n return \r\n }\r\n }\r\n\r\n private getCounterIcon(value?: number): string {\r\n if (value && (value > 0)) {\r\n return \"privacy_tip\";\r\n }\r\n return \"verified_user\";\r\n }\r\n\r\n private getCounterColour(value?: number): \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\" {\r\n return \"warning\";\r\n }\r\n\r\n private formatVisibilityChartData(): void {\r\n const { reportData } = this.props;\r\n let formatted: any[] = [];\r\n if (reportData) {\r\n if (reportData.totalPrivateTeams)\r\n formatted.push({ x: 'Private Teams', y: reportData.totalPrivateTeams, r: '90%' });\r\n if (reportData.totalPublicTeams)\r\n formatted.push({ x: 'Public Teams', y: reportData.totalPublicTeams, r: '90%' });\r\n }\r\n this.setState({\r\n ...this.state,\r\n visibilityChartData: {\r\n ...this.state.visibilityChartData,\r\n data: formatted\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\n","import { Category, ChartComponent, ColumnSeries, DateTime, Inject, LineSeries, SeriesCollectionDirective, SeriesDirective, SeriesModel, Tooltip } from '@syncfusion/ej2-react-charts';\r\nimport * as React from 'react';\r\nimport { LineChartOptions } from '../../../models/Report/IChart';\r\nimport ClampLines from 'react-clamp-lines';\r\nimport uniqid from 'uniqid';\r\n\r\nexport interface ChartProps {\r\n title: string;\r\n description?: string;\r\n chartOptions: LineChartOptions;\r\n colour?: \"success\" | \"warning\" | \"danger\" | \"primary\" | \"info\" | \"rose\";\r\n badgeText?: string;\r\n badgeColour?: \"success\" | \"warning\" | \"danger\" | \"primary\" | \"info\" | \"rose\";\r\n seriesInfo: SeriesModel[];\r\n}\r\n\r\nexport default class LineChartCard extends React.Component {\r\n public render() {\r\n const { title, chartOptions, colour, badgeText, description } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n \r\n {this.renderChartSeries()}\r\n \r\n
    \r\n
    \r\n {badgeText && this.renderBadge()}\r\n

    {title}

    \r\n {description &&
    \r\n \r\n
    }\r\n
    \r\n
    \r\n {this.props.children}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderChartSeries(): React.ReactElement {\r\n const { seriesInfo } = this.props;\r\n return ( \r\n {seriesInfo.map((series,i) => {\r\n return \r\n })}\r\n );\r\n }\r\n\r\n private renderBadge(): React.ReactElement {\r\n const { badgeText, badgeColour } = this.props;\r\n return ();\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport LineChartCard from '../../../components/Report/widgets/LineChartCard';\r\nimport PieChartCard from '../../../components/Report/widgets/PieChartCard';\r\nimport TableCard from '../../../components/Report/widgets/TableCard';\r\nimport CounterCard from '../../../components/Report/widgets/CounterCard';\r\nimport { LineChartOptions, PieChartData } from '../../../models/Report/IChart';\r\nimport { IOrphanedTeam } from '../../../models/Report/ITeam';\r\nimport { IOrphanedOverview, IOverviewReport, ITeamsCreatedSummary, ITeamsReport } from '../../../models/Report/ITabModels';\r\nimport Utilities from '../../../services/Utils';\r\nimport { ReportStrings } from '../../../settings/Report/ReportSettings';\r\nimport ClampLines from 'react-clamp-lines';\r\nimport uniqid from 'uniqid';\r\n\r\nexport interface ITeamsTabProps {\r\n onTeamClick(teamId: string): void;\r\n allTeams?: ITeamsReport;\r\n orphanedOverviewInfo?: IOrphanedOverview;\r\n reportData?: IOverviewReport;\r\n orphanedTeams: IOrphanedTeam[];\r\n creationData?: ITeamsCreatedSummary[];\r\n predictionData?: ITeamsCreatedSummary[];\r\n onTeamClick(teamId: string): void;\r\n loading?: boolean;\r\n creationPeriod: number;\r\n teamsTablePageChange(pageNumber: number): void;\r\n}\r\n\r\nexport interface ICreationChart extends LineChartOptions {\r\n data: {\r\n period: string;\r\n count: number;\r\n }[];\r\n}\r\n\r\nexport interface ITeamsTabState {\r\n visibilityChartData: PieChartData;\r\n creationChartData: ICreationChart;\r\n predictionData: ICreationChart;\r\n activeView: number;\r\n}\r\n\r\nexport default class TeamsTab extends React.PureComponent {\r\n\r\n constructor(props: ITeamsTabProps) {\r\n super(props);\r\n\r\n this.state = {\r\n creationChartData: {\r\n primaryXAxis: { valueType: 'DateTime', labelFormat: 'MMM y', title: 'Teams created by month' },\r\n legendSettings: { visible: true },\r\n tooltip: { enable: true, shared: false },\r\n data: []\r\n },\r\n predictionData: {\r\n primaryXAxis: { valueType: 'DateTime', labelFormat: 'MMM y', title: 'Teams created by month' },\r\n legendSettings: { visible: true },\r\n tooltip: { enable: true, shared: false },\r\n data: []\r\n },\r\n visibilityChartData: {\r\n dataLabel: { visible: true, position: 'Outside', name: 'x' },\r\n data: []\r\n },\r\n activeView: 0\r\n }\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.formatVisibilityChartData();\r\n this.formatCreationChartData();\r\n this.formatPredictionChartData();\r\n }\r\n\r\n public componentDidUpdate(prevProps: ITeamsTabProps) {\r\n if (prevProps.orphanedOverviewInfo !== this.props.orphanedOverviewInfo) {\r\n this.formatVisibilityChartData();\r\n }\r\n\r\n if (prevProps.creationData !== this.props.creationData) {\r\n this.formatCreationChartData();\r\n this.formatPredictionChartData();\r\n }\r\n }\r\n\r\n\r\n public render() {\r\n return
    \r\n {this.renderSectionToggles()}\r\n {this.renderContent()}\r\n
    ;\r\n }\r\n\r\n private renderContent(): React.ReactElement {\r\n const { activeView } = this.state;\r\n switch (activeView) {\r\n case 1: return this.renderOrphanedSection();\r\n default: return this.renderAllTeamsSection();\r\n }\r\n }\r\n\r\n private renderOrphanedSection(): React.ReactElement {\r\n const { visibilityChartData: pieChartData } = this.state;\r\n const { orphanedOverviewInfo, orphanedTeams } = this.props;\r\n return <>\r\n

    {ReportStrings.teams.orphanedTeams.title}

    \r\n
    \r\n
    \r\n \r\n
    \r\n privacy_tip\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n privacy_tip\r\n \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n privacy_tip\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n privacy_tip\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 private renderAllTeamsSection(): React.ReactElement {\r\n const { creationChartData, predictionData } = this.state;\r\n const { allTeams, creationPeriod, reportData } = this.props;\r\n\r\n return
    \r\n

    {ReportStrings.teams.allTeams.title}

    \r\n
    \r\n
    \r\n \r\n
    \r\n privacy_tip\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n privacy_tip\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n privacy_tip\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n privacy_tip\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 private renderSectionToggles(): React.ReactElement {\r\n const { activeView } = this.state;\r\n return
    \r\n
    \r\n
      \r\n
    • \r\n
      this.tabClicked(0)}>\r\n All Teams\r\n
      \r\n
    • \r\n
    • \r\n
      this.tabClicked(1)}>\r\n Orphaned Teams {this.renderOrphanedCountBadge()}\r\n
      \r\n
    • \r\n
    \r\n
    \r\n
    ;\r\n }\r\n\r\n private renderOrphanedCountBadge(): React.ReactElement | void {\r\n let orphanedTeamCount = this.props.orphanedTeams.length;\r\n if (orphanedTeamCount > 0)\r\n return {orphanedTeamCount}\r\n }\r\n\r\n private formatVisibilityChartData(): void {\r\n const { orphanedOverviewInfo } = this.props;\r\n let formatted: any[] = [];\r\n if (orphanedOverviewInfo) {\r\n if (orphanedOverviewInfo.totalPrivateTeams)\r\n formatted.push({ x: 'Private Teams', y: orphanedOverviewInfo.totalPrivateTeams, r: '90%' });\r\n if (orphanedOverviewInfo.totalPublicTeams)\r\n formatted.push({ x: 'Public Teams', y: orphanedOverviewInfo.totalPublicTeams, r: '90%' });\r\n }\r\n this.setState({\r\n visibilityChartData: {\r\n ...this.state.visibilityChartData,\r\n data: formatted\r\n }\r\n });\r\n }\r\n\r\n // private renderCreationChangeDescription(): React.ReactElement {\r\n // const data = this.state.creationChartData.data;\r\n // let content = (Not enough data for analysis).\r\n // if (data.length > 1) {\r\n // const lastMonthCount = data[data.length - 2].count;\r\n // const thisMonthCount = data[data.length - 1].count;\r\n // if (thisMonthCount == lastMonthCount) {\r\n // content = No change in creations compared to last month.;\r\n // } else if (thisMonthCount > lastMonthCount) {\r\n // const change: number = ((thisMonthCount - lastMonthCount) / lastMonthCount * 100);\r\n // content = {isFinite(change) && `${change}%`} increase in creations compared to last month.;\r\n // } else {\r\n // const change: number = ((lastMonthCount - thisMonthCount) / lastMonthCount * 100);\r\n // content = {isFinite(change) && `${change}%`} decrease in creations compared to last month.;\r\n // }\r\n // }\r\n\r\n // return

    {content}

    ;\r\n // }\r\n\r\n private formatCreationChartData(): void {\r\n //Loop through each of the previous months and get count\r\n const { creationData, creationPeriod } = this.props;\r\n let formatted: any[] = [];\r\n\r\n const monthNames = Utilities.getMonths();\r\n let today = new Date();\r\n let d: Date, month: string, year: number;\r\n\r\n for (let i = creationPeriod; i >= 0; i--) {\r\n\r\n d = new Date(today.getFullYear(), today.getMonth() - i, 1);\r\n month = monthNames[d.getMonth()];\r\n year = d.getFullYear();\r\n\r\n if (creationData && (creationData.length > 0)) {\r\n let countIndex = creationData.findIndex(i => ((i.month == month) && (i.year == year)));\r\n if (countIndex !== -1) {\r\n let storedValues = creationData[countIndex];\r\n formatted.push({\r\n period: `${d.toISOString()}`,\r\n count: storedValues.totalTeamsCreated\r\n });\r\n } else {\r\n formatted.push({\r\n period: `${d.toISOString()}`,\r\n count: 0\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.setState({\r\n creationChartData: {\r\n ...this.state.creationChartData,\r\n data: formatted\r\n }\r\n });\r\n }\r\n\r\n private formatPredictionChartData(): void {\r\n //Loop through each of the previous months and get count\r\n const { predictionData, creationPeriod } = this.props;\r\n let formatted: any[] = [];\r\n\r\n const monthNames = Utilities.getMonths();\r\n let today = new Date();\r\n let d: Date, month: string, year: number;\r\n\r\n for (let i = creationPeriod; i >= 0; i--) {\r\n\r\n d = new Date(today.getFullYear(), today.getMonth() - i, 1);\r\n month = monthNames[d.getMonth()];\r\n year = d.getFullYear();\r\n\r\n if (predictionData && (predictionData.length > 0)) { \r\n let countIndex = predictionData.findIndex(i => ((i.month == month) && (i.year == year)));\r\n if (countIndex !== -1) {\r\n let storedValues = predictionData[countIndex];\r\n formatted.push({\r\n period: `${d.toISOString()}`,\r\n count: storedValues.totalTeamsCreated\r\n });\r\n } else {\r\n formatted.push({\r\n period: `${d.toISOString()}`,\r\n count: 0\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.setState({\r\n predictionData: {\r\n ...this.state.predictionData,\r\n data: formatted\r\n }\r\n });\r\n }\r\n\r\n\r\n private tabClicked = (tabIndex: number): void => {\r\n this.setState({\r\n activeView: tabIndex\r\n });\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport LineChartCard from '../../../components/Report/widgets/LineChartCard';\r\nimport PieChartCard from '../../../components/Report/widgets/PieChartCard';\r\nimport CounterCard from '../../../components/Report/widgets/CounterCard';\r\nimport { IChannelsReport } from '../../../models/Report/ITabModels';\r\nimport { LineChartOptions, PieChartData } from '../../../models/Report/IChart';\r\nimport Utilities from '../../../services/Utils';\r\nimport { ReportStrings } from '../../../settings/Report/ReportSettings';\r\nimport ClampLines from 'react-clamp-lines';\r\nimport uniqid from 'uniqid';\r\n\r\nexport interface IChannelsTabProps {\r\n onTeamClick(teamId: string): void;\r\n channelsInfo?: IChannelsReport;\r\n loading: boolean;\r\n creationPeriod: number;\r\n}\r\n\r\nexport interface IChannelsTabState {\r\n visibilityChartData: PieChartData;\r\n creationChartData: ICreationChart;\r\n}\r\n\r\nexport interface ICreationChart extends LineChartOptions {\r\n data: {\r\n period: string;\r\n count: number;\r\n }[];\r\n}\r\n\r\nexport default class ChannelsTab extends React.Component {\r\n constructor(props: IChannelsTabProps) {\r\n super(props);\r\n\r\n this.state = {\r\n creationChartData: {\r\n primaryXAxis: { valueType: 'DateTime', labelFormat: 'MMM y', title: 'Channels created by month' },\r\n legendSettings: { visible: true },\r\n tooltip: { enable: true, shared: false },\r\n data: []\r\n },\r\n visibilityChartData: {\r\n dataLabel: { visible: true, position: 'Outside', name: 'x' },\r\n data: []\r\n },\r\n }\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.formatVisibilityChartData();\r\n this.formatCreationChartData();\r\n }\r\n\r\n public componentDidUpdate(prevProps: IChannelsTabProps) {\r\n if (prevProps.channelsInfo !== this.props.channelsInfo) {\r\n this.formatVisibilityChartData();\r\n this.formatCreationChartData();\r\n }\r\n\r\n if (prevProps.creationPeriod !== this.props.creationPeriod) {\r\n this.formatCreationChartData();\r\n }\r\n }\r\n\r\n public render() {\r\n const { visibilityChartData, creationChartData } = this.state;\r\n const { creationPeriod, channelsInfo } = this.props;\r\n return (\r\n
    \r\n

    {ReportStrings.channels.title}

    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n privacy_tip\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 // private renderCreationChangeDescription(): React.ReactElement {\r\n // const data = this.state.creationChartData.data;\r\n // let content = (Not enough data for analysis).\r\n // if (data.length > 1) {\r\n // const lastMonthCount = data[data.length - 2].count;\r\n // const thisMonthCount = data[data.length - 1].count;\r\n // if (thisMonthCount === lastMonthCount) {\r\n // content = No change in creations compared to last month.;\r\n // } else if (thisMonthCount > lastMonthCount) {\r\n // const change: number = ((thisMonthCount - lastMonthCount) / lastMonthCount * 100);\r\n // content = {isFinite(change) && `${change}%`} increase in creations compared to last month.;\r\n // } else {\r\n // const change: number = ((lastMonthCount - thisMonthCount) / lastMonthCount * 100);\r\n // content = {isFinite(change) && `${change}%`} decrease in creations compared to last month.;\r\n // }\r\n // }\r\n\r\n // return

    {content}

    ;\r\n // }\r\n\r\n private formatCreationChartData(): void {\r\n //Loop through each of the previous months and get count\r\n const { channelsInfo, creationPeriod } = this.props;\r\n let formatted: any[] = [];\r\n\r\n const monthNames = Utilities.getMonths();\r\n let today = new Date();\r\n let d: Date;\r\n\r\n for (let i = creationPeriod; i >= 0; i--) {\r\n d = new Date(today.getFullYear(), today.getMonth() - i, 1);\r\n let month = monthNames[d.getMonth()];\r\n let year = d.getFullYear();\r\n\r\n if (channelsInfo && channelsInfo.monthlyCreationReport && (channelsInfo.monthlyCreationReport.length > 0)) {\r\n let countIndex = channelsInfo.monthlyCreationReport.findIndex(i => ((i.month === month) && (i.year === year)));\r\n if (countIndex !== -1) {\r\n let storedValues = channelsInfo.monthlyCreationReport[countIndex];\r\n formatted.push({\r\n period: `${d.toISOString()}`,\r\n count: storedValues.totalChannelsCreated\r\n });\r\n } else {\r\n formatted.push({\r\n period: `${d.toISOString()}`,\r\n count: 0\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.setState({\r\n creationChartData: {\r\n ...this.state.creationChartData,\r\n data: formatted\r\n }\r\n });\r\n }\r\n\r\n private formatVisibilityChartData(): void {\r\n const { channelsInfo } = this.props;\r\n let formatted: any[] = [];\r\n if (channelsInfo && channelsInfo.visibilityReport) {\r\n formatted.push({ x: 'Private Channels', y: channelsInfo.visibilityReport.privateChannelsCount, r: '90%' });\r\n formatted.push({ x: 'Shared Channels', y: channelsInfo.visibilityReport.sharedChannelsCount, r: '90%' });\r\n formatted.push({ x: 'Standard Channels', y: channelsInfo.visibilityReport.standardChannelsCount, r: '90%' });\r\n }\r\n this.setState({\r\n visibilityChartData: {\r\n ...this.state.visibilityChartData,\r\n data: formatted\r\n }\r\n });\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport CounterCard from '../../../components/Report/widgets/CounterCard';\r\nimport TableCard from '../../../components/Report/widgets/TableCard';\r\nimport ITableItem from '../../../models/Report/ITableItem';\r\nimport { IExternalAppsSummary, ITeamsReport } from '../../../models/Report/ITabModels';\r\nimport { ReportStrings } from '../../../settings/Report/ReportSettings';\r\nimport ClampLines from 'react-clamp-lines';\r\nimport uniqid from 'uniqid';\r\n\r\nexport interface IAppsTabProps {\r\n topExtAppsLimit: number;\r\n onTeamClick(teamId: string): void;\r\n loading: boolean;\r\n externalApps?: IExternalAppsSummary;\r\n teamsWithExternalApps?: ITeamsReport;\r\n teamsTablePageChange(pageNumber: number): void;\r\n}\r\n\r\nexport interface IAppsTabState {\r\n sampleTableItems: ITableItem[];\r\n}\r\n\r\nexport default class AppsTab extends React.PureComponent {\r\n constructor(props: IAppsTabProps) {\r\n super(props);\r\n\r\n this.state = {\r\n sampleTableItems: [{\r\n column: 'Name',\r\n displayName: 'Team One',\r\n url: 'https://www.example.com'\r\n }],\r\n };\r\n }\r\n\r\n public render() {\r\n const { externalApps, teamsWithExternalApps, teamsTablePageChange } = this.props;\r\n return (\r\n
    \r\n

    {ReportStrings.apps.title}

    \r\n
    \r\n
    \r\n \r\n
    \r\n privacy_tip\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { ReportSettings } from '../../../settings/Report/ReportSettings';\r\n\r\nexport interface ReRunProps {\r\n}\r\n\r\nexport default class ReRunButton extends React.Component {\r\n constructor(props: ReRunProps) {\r\n super(props);\r\n\r\n this.state = {\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n \r\n private onReRunClick = (): void => {\r\n window.open(ReportSettings.constants.productPageUrl,'_blank');\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport AuthProvider from '../../auth/AuthProvider';\r\nimport Loading from '../../components/Loading';\r\nimport Alert from '../../components/Alert';\r\nimport { ReportSettings, ReportStrings } from '../../settings/Report/ReportSettings';\r\nimport Header from '../../components/Report/fields/Header';\r\nimport Wrapper from '../../components/Report/fields/Wrapper';\r\nimport NavPills from '../../components/Report/controls/NavPills';\r\nimport IPillOption from '../../models/Report/IPillOptions';\r\nimport TenancyStats from '../../components/Report/widgets/TenancyStats';\r\nimport IStatsItem from '../../models/Report/IStatsItem';\r\nimport OverviewTab from './Tabs/OverviewTab';\r\nimport TeamsTab from './Tabs/TeamsTab';\r\nimport ChannelsTab from './Tabs/ChannelsTab';\r\nimport AppsTab from './Tabs/AppsTab';\r\nimport * as QueryString from \"query-string\";\r\nimport { IReportService } from '../../services/IReportService';\r\nimport { IChannelsReport, IExternalAppsSummary, IOrphanedOverview, IOverviewReport, ITeamsCreatedSummary, ITeamsReport } from '../../models/Report/ITabModels';\r\nimport { IOrphanedTeam } from '../../models/Report/ITeam';\r\nimport { ItemStorage } from '../../itemstorage';\r\nimport ReRunButton from '../../components/Report/widgets/ReRunButton';\r\n\r\nexport interface IReportProps extends RouteComponentProps<{}> {\r\n authProvider: AuthProvider;\r\n reportService: IReportService;\r\n}\r\n\r\nexport interface IReportState {\r\n loading: boolean;\r\n errors?: string[];\r\n tabs: IPillOption[];\r\n data: {\r\n stats: IStatsItem[];\r\n orphanedTeams: IOrphanedTeam[];\r\n overviewInfo?: IOverviewReport;\r\n allTeams?: ITeamsReport;\r\n orphanedOverviewInfo?: IOrphanedOverview;\r\n creationData?: ITeamsCreatedSummary[];\r\n growthPrediction?: ITeamsCreatedSummary[];\r\n channelsInfo?: IChannelsReport;\r\n externalApps?: IExternalAppsSummary;\r\n teamsWithExternalApps?: ITeamsReport;\r\n healthScore: number;\r\n };\r\n paging: {\r\n teamsWithExtApps: number;\r\n allTeams: number;\r\n };\r\n settings: {\r\n teamCreationChartPeriod: number;\r\n channelCreationChartPeriod: number;\r\n topExtAppsLimit: number;\r\n };\r\n activeTab: number;\r\n reportId: string;\r\n // showTeamInfo: boolean;\r\n // selectedTeamId: string;\r\n}\r\n\r\nexport default class TenancyReport extends React.Component {\r\n\r\n\r\n constructor(props: IReportProps) {\r\n super(props);\r\n\r\n this.state = {\r\n loading: true,\r\n // showTeamInfo: false,\r\n reportId: \"\",\r\n tabs: [\r\n {\r\n icon: `preview`,\r\n title: `Overview`\r\n },\r\n {\r\n icon: `groups`,\r\n title: `Teams`\r\n },\r\n {\r\n icon: `fact_check`,\r\n title: `Channels`\r\n },\r\n {\r\n icon: `dashboard_customize`,\r\n title: `Apps`\r\n }\r\n ],\r\n data: {\r\n stats: [{\r\n name: `Teams`,\r\n value: 0\r\n }, {\r\n name: `Team Channels`,\r\n value: 0\r\n }, {\r\n name: `Total Documents`,\r\n value: 0\r\n }, {\r\n name: `Total Folders`,\r\n value: 0\r\n }],\r\n orphanedTeams: [],\r\n healthScore: 100\r\n },\r\n paging: {\r\n teamsWithExtApps: 1,\r\n allTeams: 1\r\n },\r\n settings: {\r\n teamCreationChartPeriod: 12,\r\n channelCreationChartPeriod: 12,\r\n topExtAppsLimit: 10\r\n },\r\n activeTab: 0,\r\n };\r\n }\r\n\r\n public async componentDidMount() {\r\n const params = QueryString.parse(this.props.location.search);\r\n let reportId = undefined;\r\n let fromStorage = false;\r\n if (params.reportid) {\r\n ItemStorage.setStorageItemAsString(ReportSettings.constants.reportId, params.reportid);\r\n reportId = ItemStorage.getStorageItemAsString(ReportSettings.constants.reportId);\r\n } else {\r\n reportId = ItemStorage.getStorageItemAsString(ReportSettings.constants.reportId);\r\n ItemStorage.clearStorageItem(ReportSettings.constants.reportId);\r\n fromStorage = true;\r\n }\r\n\r\n if (reportId) {\r\n this.props.authProvider.ensureLogin(this.props.authProvider.getApiScope());\r\n if (fromStorage) {\r\n window.location.href = `${window.location.href.replace(\"#\", \"\")}?reportid=${reportId}`;\r\n }\r\n\r\n await this.loadInitialData(reportId);\r\n this.setState({ loading: false }); //TODO Remove this\r\n window.scrollTo({ top: 0 });\r\n } else {\r\n console.log('Report ID not specified, redirecting to products page...');\r\n window.location.href = ReportSettings.constants.productPageUrl;\r\n }\r\n }\r\n\r\n\r\n public render() {\r\n if (this.state.loading) {\r\n return ;\r\n } else {\r\n return this.renderBody();\r\n }\r\n }\r\n\r\n private renderBody(): React.ReactElement {\r\n return <>\r\n {this.renderHeader()}\r\n \r\n
    \r\n {this.renderReport()}\r\n
    \r\n {this.renderTenancyStats()}\r\n
    \r\n
    \r\n {this.renderErrors()}\r\n \r\n {/* */}\r\n \r\n }\r\n\r\n private renderHeader(): React.ReactElement {\r\n return \r\n }\r\n\r\n private renderReport(): React.ReactElement {\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 {this.renderAbout()}\r\n {this.renderTab()}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderTenancyStats(): React.ReactElement {\r\n return (
    \r\n
    \r\n \r\n
    \r\n
    );\r\n }\r\n\r\n private renderTab(): React.ReactElement {\r\n switch (this.state.activeTab) {\r\n case 0: return ;\r\n case 1: return ;\r\n case 2: return ;\r\n case 3: return ;\r\n default: return

    (No tab content)

    ;\r\n }\r\n }\r\n\r\n private renderAbout(): React.ReactElement {\r\n let blurb: string = \"\";\r\n switch (this.state.activeTab) {\r\n case 0: blurb = ReportStrings.overview.blurb; break;\r\n case 1: blurb = ReportStrings.teams.blurb; break;\r\n case 2: blurb = ReportStrings.channels.blurb; break;\r\n case 3: blurb = ReportStrings.apps.blurb; break;\r\n default: blurb = \"(No tab selected)\";\r\n }\r\n\r\n return
    {blurb}
    ;\r\n }\r\n\r\n private pillClicked = (pillIndex: number): void => {\r\n //Reset paging\r\n if (this.state.activeTab !== pillIndex) {\r\n this.setState({\r\n ...this.state,\r\n activeTab: pillIndex,\r\n paging: {\r\n ...this.state.paging,\r\n allTeams: 1,\r\n teamsWithExtApps: 1\r\n }\r\n });\r\n\r\n this.fetchTabData(pillIndex);\r\n }\r\n }\r\n\r\n private fetchTabData(pillIndex: number): void {\r\n //TODO\r\n switch (pillIndex) {\r\n case 0: this.getOverviewTabData(); break;\r\n case 1: this.getTeamsTabData(); break;\r\n case 2: this.getChannelsTabData(); break;\r\n case 3: this.getAppsTabData(); break;\r\n default: break;\r\n }\r\n }\r\n\r\n private renderErrors(): React.ReactNode | void {\r\n if (this.state.errors && (this.state.errors.length > 0)) {\r\n return this.state.errors.map((error, i) => {\r\n return ;\r\n });\r\n }\r\n }\r\n\r\n private async loadInitialData(reportId: string): Promise {\r\n this.setState({\r\n reportId: reportId\r\n }, async () => {\r\n await this.getOverviewTabData();\r\n });\r\n }\r\n\r\n private async getTeamsTabData(): Promise {\r\n const { reportId, settings } = this.state;\r\n try {\r\n let accessToken = await this.props.authProvider.getApiAccessToken();\r\n let orphanedOverviewData = await this.props.reportService.getOrphanedOverviewData(reportId, accessToken);\r\n let teamsGrowth = await this.props.reportService.getTeamsCreated(reportId, settings.teamCreationChartPeriod, accessToken);\r\n let growthPrediction = await this.props.reportService.getGrowthPrediction(reportId, 12, accessToken);\r\n\r\n await this.getTeams();\r\n this.setState({\r\n loading: false,\r\n data: {\r\n ...this.state.data,\r\n orphanedOverviewInfo: orphanedOverviewData,\r\n creationData: teamsGrowth,\r\n growthPrediction: growthPrediction\r\n }\r\n });\r\n\r\n } catch (err) {\r\n console.log(`Could not get teams tab data: ${err}`);\r\n }\r\n }\r\n\r\n private async getTeams(): Promise {\r\n const { reportId, paging } = this.state;\r\n try {\r\n let accessToken = await this.props.authProvider.getApiAccessToken();\r\n let allTeams = await this.props.reportService.getAllTeams(reportId, accessToken, paging.allTeams, ReportSettings.constants.listItemLimit);\r\n this.setState({\r\n loading: false,\r\n data: {\r\n ...this.state.data,\r\n allTeams: allTeams\r\n }\r\n });\r\n } catch (err) {\r\n console.log(`Could not get get Teams data: ${err}`);\r\n }\r\n\r\n }\r\n\r\n private async getChannelsTabData(): Promise {\r\n const { reportId, settings } = this.state;\r\n try {\r\n let accessToken = await this.props.authProvider.getApiAccessToken();\r\n let data = await this.props.reportService.getChannelsSummary(reportId, settings.channelCreationChartPeriod, accessToken);\r\n this.setState({\r\n loading: false,\r\n data: {\r\n ...this.state.data,\r\n channelsInfo: data\r\n }\r\n });\r\n } catch (err) {\r\n console.log(`Could not get channels tab data: ${err}`);\r\n }\r\n }\r\n\r\n private async getAppsTabData(): Promise {\r\n const { reportId, settings } = this.state;\r\n try {\r\n let accessToken = await this.props.authProvider.getApiAccessToken();\r\n let summary = await this.props.reportService.getExternalAppsSummary(reportId, settings.topExtAppsLimit, accessToken); //TODO: Top\r\n await this.getExtAppsTeams();\r\n this.setState({\r\n loading: false,\r\n data: {\r\n ...this.state.data,\r\n externalApps: summary,\r\n }\r\n });\r\n } catch (err) {\r\n console.log(`Could not get apps tab data: ${err}`);\r\n }\r\n }\r\n\r\n private async getExtAppsTeams(): Promise {\r\n const { reportId, paging } = this.state;\r\n try {\r\n let accessToken = await this.props.authProvider.getApiAccessToken();\r\n let teams = await this.props.reportService.getTeamsWithExternalApps(reportId, accessToken, paging.teamsWithExtApps, ReportSettings.constants.listItemLimit);\r\n this.setState({\r\n loading: false,\r\n data: {\r\n ...this.state.data,\r\n teamsWithExternalApps: teams,\r\n }\r\n });\r\n } catch (err) {\r\n console.log(`Could not get teams with third-party apps data: ${err}`);\r\n }\r\n }\r\n\r\n private async getOverviewTabData(): Promise {\r\n const { reportId } = this.state;\r\n try {\r\n let accessToken = await this.props.authProvider.getApiAccessToken();\r\n let overviewInfo = await this.props.reportService.getOverviewData(reportId, accessToken);\r\n let orphanedTeams = await this.props.reportService.getOrphanedTeams(reportId, accessToken);\r\n await this.getExtAppsTeams();\r\n\r\n if (orphanedTeams.length === 0) {\r\n //Get all teams if there are no orphaned teams\r\n this.getTeamsTabData();\r\n }\r\n\r\n this.setState({\r\n ...this.state,\r\n loading: false,\r\n data: {\r\n ...this.state.data,\r\n overviewInfo: overviewInfo,\r\n stats: [{\r\n name: `Teams`,\r\n value: overviewInfo.totalTeams\r\n }, {\r\n name: `Team Channels`,\r\n value: overviewInfo.totalChannels\r\n }, {\r\n name: `Total Documents`,\r\n value: overviewInfo.totalDocuments\r\n }, {\r\n name: `Total Folders`,\r\n value: overviewInfo.totalFolders\r\n }],\r\n orphanedTeams: orphanedTeams\r\n }\r\n }, () => {\r\n this.calculateHealthScore();\r\n });\r\n } catch (err) {\r\n console.log(`Could not get overview tab data: ${err}`);\r\n }\r\n }\r\n\r\n private calculateHealthScore(): void {\r\n let score: number = 100;\r\n let totalTeams: number = this.state.data.overviewInfo ? this.state.data.overviewInfo.totalTeams : 0;\r\n\r\n if (totalTeams) {\r\n //Orphaned teams score\r\n let totalOrphanedTeams: number = this.state.data.orphanedTeams.length;\r\n score -= ((totalOrphanedTeams / totalTeams) * 100) * ReportSettings.scoreWeightings.orphanedTeams;\r\n\r\n //Duplicate teams score\r\n let totalDuplicateTeams: number = this.state.data.overviewInfo ? this.state.data.overviewInfo.totalDuplicateTeams : 0;\r\n score -= ((totalDuplicateTeams / totalTeams) * 100) * ReportSettings.scoreWeightings.duplicateTeams;\r\n\r\n //Teams with guests score\r\n let teamsWithGuests: number = this.state.data.overviewInfo ? this.state.data.overviewInfo.totalGuestTeams : 0;\r\n score -= ((teamsWithGuests / totalTeams) * 100) * ReportSettings.scoreWeightings.teamsWithGuests;\r\n\r\n //Teams with external apps\r\n let totalExternalApps: number = this.state.data.teamsWithExternalApps ? this.state.data.teamsWithExternalApps.rowCount : 0;\r\n score -= ((totalExternalApps / totalTeams) * 100) * ReportSettings.scoreWeightings.externalApps;\r\n\r\n }\r\n\r\n this.setState({\r\n ...this.state,\r\n data: {\r\n ...this.state.data,\r\n healthScore: Math.ceil(score)\r\n }\r\n });\r\n }\r\n\r\n private teamsTabAllTablePageChange = (pageNumber: number): void => {\r\n if (this.state.data.allTeams) {\r\n if ((pageNumber > 0) && (pageNumber <= this.state.data.allTeams?.pageCount))\r\n this.setState({\r\n ...this.state,\r\n paging: {\r\n ...this.state.paging,\r\n allTeams: pageNumber\r\n }\r\n }, () => {\r\n this.getTeams();\r\n });\r\n }\r\n }\r\n\r\n private appsTabTeamTablePageChange = (pageNumber: number): void => {\r\n if (this.state.data.teamsWithExternalApps) {\r\n let pageCount = this.state.data.teamsWithExternalApps ? this.state.data.teamsWithExternalApps.pageCount : 1;\r\n console.log(pageCount);\r\n if ((pageNumber > 0) && (pageNumber <= pageCount)){\r\n this.setState({\r\n ...this.state,\r\n paging: {\r\n ...this.state.paging,\r\n teamsWithExtApps: pageNumber\r\n }\r\n }, () => {\r\n this.getAppsTabData();\r\n });\r\n } \r\n }\r\n }\r\n\r\n private onTeamClick = (teamId: string): void => {\r\n //TODO Go to team\r\n }\r\n\r\n // private onBackClick = (): void => {\r\n // this.setState({\r\n // // showTeamInfo: false\r\n // });\r\n // }\r\n\r\n private onPrintClick = (): void => {\r\n alert('Print feature coming soon!');\r\n }\r\n\r\n}\r\n","import * as React from 'react';\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport AuthProvider from \"../auth/AuthProvider\";\r\nimport { IProductService } from '../services/IProductService';\r\nimport { IProductInfo } from '../models/ProductInfo';\r\nimport { ItemStorage } from '../itemstorage';\r\nimport { Constants } from '../constants';\r\nimport Loading from '../components/Loading';\r\nimport Alert from '../components/Alert';\r\n\r\nexport interface FormProps extends RouteComponentProps<{}> {\r\n authProvider: AuthProvider;\r\n}\r\n\r\nexport interface FormState {\r\n loading: boolean;\r\n productInfo?: IProductInfo;\r\n errors?: string[];\r\n}\r\n\r\nexport default class ProductFormComplete extends React.Component {\r\n constructor(props: FormProps) {\r\n super(props);\r\n\r\n this.state = {\r\n loading: true\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n window.scrollTo(0, 0);\r\n var productInfo = ItemStorage.getStorageItem(Constants.productInfo) as IProductInfo;\r\n var scopes: string[] = [];\r\n\r\n productInfo.permissions.filter(x => x.requiresConsent).forEach((item) => {\r\n scopes.push(item.scope);\r\n });\r\n\r\n this.props.authProvider.ensureLogin(scopes);\r\n if (productInfo) {\r\n this.setState({\r\n loading: false,\r\n productInfo: productInfo\r\n });\r\n } else {\r\n console.log('Product not specified, redirecting to products page...');\r\n window.location.href = 'https://www.konsolute.com/products';\r\n }\r\n }\r\n\r\n public render() {\r\n return <>\r\n {\r\n this.state.loading ?\r\n :\r\n this.renderBody()\r\n }\r\n\r\n ;\r\n }\r\n\r\n private renderBody(): React.ReactFragment {\r\n return (<>\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n

    {this.state.productInfo?.displayName} is now being requested

    \r\n

    You'll get an email notification (to your submitted email) when your product is ready

    \r\n Try another product\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {this.renderErrors()}\r\n );\r\n }\r\n\r\n private renderErrors(): React.ReactNode | void {\r\n if (this.state.errors && (this.state.errors.length > 0)) {\r\n return this.state.errors.map((error, i) => {\r\n return ;\r\n });\r\n }\r\n }\r\n\r\n}\r\n","import { IProductInfo } from \"../models/ProductInfo\";\r\nimport { IProductService } from \"./IProductService\";\r\n\r\nexport class ProductService implements IProductService {\r\n async getProductInfo(product: string): Promise {\r\n var url = `/api/product/info/${product}`;\r\n var response = await fetch(url);\r\n return await response.json() as IProductInfo;\r\n }\r\n\r\n async install(product: string, uniqueId: string, data: any, acccessToken: string, site?: string, page?: string): Promise {\r\n let siteParam = '';\r\n if (site) {\r\n siteParam = `?site=${site}`;\r\n }\r\n\r\n let pageParam = '';\r\n if(page) {\r\n pageParam = siteParam != '' ? `&page=${page}` : `?page=${page}`\r\n }\r\n\r\n var url = `/api/product/install/${product}/${uniqueId}${siteParam}${pageParam}`;\r\n var body = JSON.stringify(data);\r\n\r\n const options = {\r\n method: \"POST\",\r\n headers: {\r\n 'Authorization': `bearer ${acccessToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n body: body\r\n };\r\n\r\n var response = await fetch(url, options);\r\n return await response.json();\r\n }\r\n}","import { ISettingsService } from \"./ISettingsService\";\r\nimport { IAuthSettings } from \"../models/IAuthSettings\";\r\n\r\nexport class SettingsService implements ISettingsService {\r\n public async getAuthSettings(): Promise {\r\n var url = `/api/settings`;\r\n var response = await fetch(url);\r\n\r\n return await response.json() as IAuthSettings;\r\n }\r\n}","import { ITeamsCreatedSummary, IOrphanedOverview, IOverviewReport, ITeamsReport, IExternalAppsSummary, IChannelsReport } from \"../models/Report/ITabModels\";\r\nimport { IOrphanedTeam } from \"../models/Report/ITeam\";\r\nimport { IReportService } from \"./IReportService\";\r\n\r\nexport class ReportService implements IReportService {\r\n async getOverviewData(reportId: string, accessToken: string): Promise {\r\n var url = `/api/report/teams/${reportId}/overview`;\r\n const options = {\r\n method: \"GET\",\r\n headers: {\r\n 'Authorization': `bearer ${accessToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n };\r\n\r\n var response = await fetch(url, options);\r\n return await response.json() as IOverviewReport;\r\n }\r\n\r\n async getOrphanedTeams(reportId: string, accessToken: string): Promise {\r\n var url = `/api/report/teams/${reportId}/orphaned`;\r\n const options = {\r\n method: \"GET\",\r\n headers: {\r\n 'Authorization': `bearer ${accessToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n };\r\n\r\n var response = await fetch(url, options);\r\n let res = await response.json() as IOrphanedTeam[];\r\n return res;\r\n }\r\n\r\n async getAllTeams(reportId: string, accessToken: string, page: number, pageSize: number): Promise {\r\n var url = `/api/report/teams/${reportId}?page=${page}&pageSize=${pageSize}`;\r\n const options = {\r\n method: \"GET\",\r\n headers: {\r\n 'Authorization': `bearer ${accessToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n };\r\n\r\n var response = await fetch(url, options);\r\n return await response.json() as ITeamsReport;\r\n }\r\n\r\n async getOrphanedOverviewData(reportId: string, accessToken: string): Promise {\r\n var url = `/api/report/teams/${reportId}/orphaned/overview`;\r\n const options = {\r\n method: \"GET\",\r\n headers: {\r\n 'Authorization': `bearer ${accessToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n };\r\n\r\n var response = await fetch(url, options);\r\n return await response.json() as IOrphanedOverview;\r\n }\r\n\r\n async getTeamsCreated(reportId: string, months: number, accessToken: string): Promise {\r\n var url = `/api/report/teams/${reportId}/monthly/${months}`;\r\n const options = {\r\n method: \"GET\",\r\n headers: {\r\n 'Authorization': `bearer ${accessToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n };\r\n\r\n var response = await fetch(url, options);\r\n return await response.json() as ITeamsCreatedSummary[];\r\n }\r\n\r\n async getGrowthPrediction(reportId: string, months: number, accessToken: string): Promise {\r\n var url = `/api/report/teams/${reportId}/growthprediction?months=${months}`;\r\n const options = {\r\n method: \"GET\",\r\n headers: {\r\n 'Authorization': `bearer ${accessToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n };\r\n\r\n var response = await fetch(url, options);\r\n return await response.json() as ITeamsCreatedSummary[];\r\n }\r\n\r\n async getExternalAppsSummary(reportId: string, top: number, accessToken: string): Promise {\r\n var url = `/api/report/teams/${reportId}/externalapps/summary?topAppsCount=${top}`;\r\n const options = {\r\n method: \"GET\",\r\n headers: {\r\n 'Authorization': `bearer ${accessToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n };\r\n\r\n var response = await fetch(url, options);\r\n return await response.json() as IExternalAppsSummary;\r\n }\r\n\r\n async getTeamsWithExternalApps(reportId: string, accessToken: string, page: number, pageSize: number): Promise {\r\n var url = `/api/report/teams/${reportId}/externalapps/teams?page=${page}&pageSize=${pageSize}`;\r\n const options = {\r\n method: \"GET\",\r\n headers: {\r\n 'Authorization': `bearer ${accessToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n };\r\n\r\n var response = await fetch(url, options);\r\n return await response.json() as ITeamsReport;\r\n }\r\n\r\n async getChannelsSummary(reportId: string, months: number, accessToken: string): Promise {\r\n var url = `/api/report/teams/${reportId}/channels/summary?months=${months}`;\r\n const options = {\r\n method: \"GET\",\r\n headers: {\r\n 'Authorization': `bearer ${accessToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n };\r\n\r\n var response = await fetch(url, options);\r\n return await response.json() as IChannelsReport;\r\n }\r\n}","\r\nexport const requiresInteraction = (errorMessage: any) => {\r\n if (!errorMessage || !errorMessage.length) {\r\n return false;\r\n }\r\n\r\n return (\r\n errorMessage.indexOf(\"consent_required\") > -1 ||\r\n errorMessage.indexOf(\"interaction_required\") > -1 ||\r\n errorMessage.indexOf(\"login_required\") > -1\r\n );\r\n};\r\n\r\nexport const isIE = () => {\r\n const ua = window.navigator.userAgent;\r\n const msie = ua.indexOf(\"MSIE \") > -1;\r\n const msie11 = ua.indexOf(\"Trident/\") > -1;\r\n\r\n // If you as a developer are testing using Edge InPrivate mode, please add \"isEdge\" to the if check\r\n // const isEdge = ua.indexOf(\"Edge/\") > -1;\r\n\r\n return msie || msie11;\r\n};\r\n\r\nexport const GRAPH_SCOPES = {\r\n OPENID: \"openid\",\r\n PROFILE: \"profile\",\r\n USER_READ: \"User.Read\"\r\n};\r\n\r\nexport const GRAPH_REQUESTS = {\r\n LOGIN: {\r\n scopes: [\r\n GRAPH_SCOPES.OPENID,\r\n GRAPH_SCOPES.PROFILE,\r\n GRAPH_SCOPES.USER_READ\r\n ]\r\n },\r\n API: {\r\n scopes: [\r\n GRAPH_SCOPES.OPENID\r\n ]\r\n }\r\n};","import { isIE, GRAPH_SCOPES } from \"./AuthUtil\";\r\n\r\nimport { UserAgentApplication, AuthResponse, AuthenticationParameters } from \"msal\";\r\nimport { IAuthSettings } from \"../models/IAuthSettings\";\r\n\r\n//const useRedirectFlow = true;\r\n\r\nexport default class AuthProvider {\r\n private msalApp: UserAgentApplication;\r\n private apiScope: any;\r\n constructor(authSettings: IAuthSettings) {\r\n \r\n this.apiScope = {\r\n scopes: [\r\n `api://${authSettings.clientId}/user_impersonation`\r\n ]};\r\n\r\n var baseUrl = `${window.location.protocol} + \"//\" + ${window.location.host}`;\r\n this.msalApp = new UserAgentApplication({\r\n auth: {\r\n clientId: authSettings.clientId,\r\n authority: `${authSettings.instance}common/`,\r\n validateAuthority: false,\r\n postLogoutRedirectUri: `${baseUrl}${authSettings.postLogoutRedirectUri}`,\r\n navigateToLoginRequestUrl: false\r\n },\r\n cache: {\r\n cacheLocation: \"sessionStorage\",\r\n storeAuthStateInCookie: isIE()\r\n }\r\n });\r\n\r\n this.msalApp.handleRedirectCallback((error: any) => {\r\n if (error) {\r\n const errorMessage = error.errorMessage ? error.errorMessage : \"Unable to acquire access token.\";\r\n console.log(errorMessage);\r\n }\r\n });\r\n }\r\n\r\n ensureLogin(scopes: string[]) {\r\n const account = this.msalApp.getAccount();\r\n\r\n if(!account) {\r\n let authScopes: AuthenticationParameters = {\r\n scopes: [\r\n GRAPH_SCOPES.OPENID,\r\n GRAPH_SCOPES.PROFILE,\r\n GRAPH_SCOPES.USER_READ,\r\n ...scopes\r\n ]\r\n };\r\n\r\n return this.msalApp.loginRedirect(authScopes);\r\n }\r\n }\r\n\r\n async ensureLoginPopup(scopes: string[]) {\r\n const account = this.msalApp.getAccount();\r\n \r\n if(!account) {\r\n let authScopes: AuthenticationParameters = {\r\n scopes: [\r\n GRAPH_SCOPES.OPENID,\r\n GRAPH_SCOPES.PROFILE,\r\n GRAPH_SCOPES.USER_READ,\r\n ...scopes\r\n ]\r\n };\r\n\r\n //return this.msalApp.loginRedirect(authScopes);\r\n return await this.msalApp.loginPopup(authScopes);\r\n }\r\n }\r\n\r\n //ensureLogin(scopes: any) {\r\n // const account = this.msalApp.getAccount();\r\n // if (!account) {\r\n // return this.msalApp.loginRedirect(GRAPH_REQUESTS.LOGIN);\r\n // }\r\n //}\r\n\r\n async acquireToken(scopes: any): Promise {\r\n return await this.msalApp.acquireTokenSilent(scopes);\r\n // return msalApp.acquireTokenSilent(scopes).catch((error: any) => {\r\n // // Call acquireTokenPopup (popup window) in case of acquireTokenSilent failure\r\n // // due to consent or interaction required ONLY\r\n // if (requiresInteraction(error.errorCode)) {\r\n // return useRedirectFlow\r\n // ? msalApp.acquireTokenRedirect(scopes)\r\n // : msalApp.acquireTokenPopup(scopes);\r\n // } else {\r\n // console.error('Non-interactive error:', error.errorCode)\r\n // }\r\n // });\r\n }\r\n\r\n async getApiAccessToken(): Promise {\r\n var authResponse = await this.acquireToken(this.apiScope);\r\n return authResponse.accessToken;\r\n }\r\n\r\n getAccount() {\r\n return this.msalApp.getAccount();\r\n }\r\n\r\n getApiScope(){\r\n return this.apiScope.scopes;\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { Route, Redirect } from 'react-router';\r\nimport { Layout } from './components/Layout';\r\n\r\nimport './custom.css'\r\nimport { ProductInfo } from './views/ProductInfo';\r\nimport { ProductForm } from './views/ProductForm';\r\nimport TenancyReport from './views/Report/TenancyReport';\r\nimport ProductFormComplete from './views/FormComplete';\r\nimport { IProductService } from \"./services/IProductService\";\r\nimport { ProductService } from \"./services/ProductService\";\r\nimport { ISettingsService } from \"./services/ISettingsService\";\r\nimport { SettingsService } from \"./services/SettingsService\";\r\nimport { IReportService } from \"./services/IReportService\";\r\nimport { ReportService } from \"./services/ReportService\";\r\nimport AuthProvider from './auth/AuthProvider';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport Loading from './components/Loading';\r\n\r\nvar productService: IProductService = new ProductService();\r\nvar settingsService: ISettingsService = new SettingsService();\r\nvar reportService: IReportService = new ReportService();\r\n\r\ninterface IAppState {\r\n loading: boolean;\r\n authProvider?: AuthProvider;\r\n}\r\n\r\nexport default class App extends Component<{}, IAppState> {\r\n static displayName = App.name;\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n loading: true\r\n };\r\n }\r\n\r\n async componentDidMount() {\r\n var authSettings = await settingsService.getAuthSettings();\r\n this.setState({\r\n loading: false,\r\n authProvider: new AuthProvider(authSettings)\r\n });\r\n }\r\n\r\n public render() {\r\n return \r\n {\r\n this.state.loading ?\r\n :\r\n <>\r\n } />\r\n } />\r\n } />\r\n } />\r\n }\r\n ;\r\n }\r\n}\r\n","// 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 React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport App from './App';\r\nimport registerServiceWorker from './registerServiceWorker';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href') as string;\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n rootElement);\r\n\r\nregisterServiceWorker();\r\n\r\n"],"sourceRoot":""}